TP : conditions et premières fonctions#
Exercice
Que fait le code suivant (les trois cellules) ?
int a, b;
a = 5;
b = 10;
int c;
if ( a < b ) {
c = b;
} else {
c = a;
}
c
10
type: int
BEGIN SOLUTION
Le code stocke dans la variable c le maximum de a et b (ici, b, soit donc 10).
END SOLUTION
Écrivez un code similaire tel qu'une nouvelle variable
dprenne la valeur minimale entrebeta.
/// BEGIN SOLUTION
int d;
if ( a > b ) {
d = b;
} else {
d = a;
}
/// END SOLUTION
d
5
type: int
/// BEGIN HIDDEN TESTS
CHECK( d == 5 )
/// END HIDDEN TESTS
Exécutez les cellules suivantes.
Vous remarquerez que l'on a réutilisé le même code mais en lui donnant un nom et en précisant le type de ses entrées et sorties. C'est ce qu'on appelle une fonction (nous reviendrons sur cette notion en cours). Ici la fonction
maxrenvoie en sortie un typeint(ce qui est précisé par le premier mot) et prend deux variablesinten entrée (ce qui est précisé dans la parenthèse).
int max(int a, int b) {
if ( a < b ) {
return b;
} else {
return a;
}
}
max(5, 10)
10
type: int
max(6, -2)
6
type: int
max(-3, -4)
-3
type: int
max(5, max(-3, 8))
8
type: int
Exercice
Dans cet exercice, vous allez utiliser la fonction max pour calculer le maximum de
deux nombres, trois nombres et quatre nombres.
int n1 = -2;
int n2 = 6;
int n3 = 0;
int n4 = 7;
Calculez le max de n1 et n2 (en utilisant la fonction
max)
/// BEGIN SOLUTION
max(n1, n2)
/// END SOLUTION
6
type: int
Calculez le max de n1, n2 et n3.
Indication: utilisez plusieurs fois la fonction comme dans le dernier exemple de l'exercice précédent.
/// BEGIN SOLUTION
max(n1, max(n2, n3))
/// END SOLUTION
6
type: int
Calculez le max de n1, n2, n3 et n4 (toujours en utilisant la fonction
max)
/// BEGIN SOLUTION
max(n1, max(n2, max(n3, n4)))
/// END SOLUTION
7
type: int
Changez les valeurs de n1, n2, n3 et n4 ci-dessus, re-exécutez les cellules et vérifiez les résultats.
♣ Écrivez une fonction
max4prenant quatre entiers et calculant leur max
/// BEGIN SOLUTION
int max4(int a, int b, int c, int d) {
return max(a, max(b, max(c, d)));
}
/// END SOLUTION
♣ Utilisez votre fonction
max4pour calculer le max de n1, n2, n3 et n4.
/// BEGIN SOLUTION
max4(n1, n2, n3, n4)
/// END SOLUTION
7
type: int
Attention: une fonction -- une cellule
L'interpréteur C++ que nous utilisons (Cling dans Jupyter) est à l'heure actuelle
plus restrictif que nécessaire: lorsque l'on souhaite définir une fonction, il est
impératif que la définition de cette fonction apparaisse seule dans sa cellule. En
particulier on ne peux pas définir deux fonctions dans une même cellule, ni faire
précéder ou suivre la définition d'une fonction par des instructions.
Exercice
Complétez la fonction min ci-dessous. Si vous en avez besoin, vous pouvez consulter
l'exemple de la fonction max plus haut et l'adapter.
int min(int a, int b) {
/// BEGIN SOLUTION
if ( a < b ) {
return a;
} else {
return b;
}
/// END SOLUTION
}
Essayez-la sur l'exemple suivant:
min(2,3)
2
type: int
Essayez-la sur un exemple de votre choix:
/// BEGIN SOLUTION
min(6, 0)
/// END SOLUTION
0
type: int
Vérifiez que tous les tests qui suivent ont bien la valeur true:
min(5, 10) == 5
true
type: bool
min(6, -2) == -2
true
type: bool
min(-3, -4) == -4
true
type: bool
min(5, min(-3, 8)) == -3
true
type: bool
La cellule suivante contient des tests automatisés; nous reviendrons dessus plus en détails par la suite; pour le moment, vous pouvez juste exécuter la cellule et vérifier qu'il n'y a pas de message d'erreur.
CHECK( min(5, 10) == 5 );
CHECK( min(6, -2) == -2 );
CHECK( min(2, 2) == 2 );
Exercice
Complétez la fonction abs ci-dessous qui calcule la valeur absolue d'un nombre:
double abs(double a) {
/// BEGIN SOLUTION
if ( a < 0 ) {
return -a;
} else {
return a;
}
/// END SOLUTION
}
Utilisez cette fonction pour calculer la valeur absolue de -2.5 et vérifiez le
résultat:
/// BEGIN SOLUTION
abs(-2.5)
/// END SOLUTION
2.5000000
type: double
Vérifiez que les tests qui suivent ont bien la valeur true:
abs(-5.1) == 5.1
true
type: bool
abs(2.3) == 2.3
true
type: bool
abs(-3.4) == 3.4
true
type: bool
Vérifiez que les tests automatisés ci-dessous ne produisent pas de message d'erreur:
CHECK( abs( 0.0) == 0.0 );
CHECK( abs( 2.3) == 2.3 );
CHECK( abs(-3.4) == 3.4 );
Exercice
Complétez la fonction ci-dessous qui calcule et renvoie le périmètre d'un cercle. Vous
remarquez que la constante pi n'est pas passée en paramètre car c'est une variable de
calcul interne à la fonction (une variable locale), et non une entrée de cette
fonction.
double perimetre(double r) {
double pi = 3.1416;
/// BEGIN SOLUTION
return 2 * pi * r;
/// END SOLUTION
}
perimetre(2) // environ 12.56
12.566400
type: double
perimetre(3) // environ 18.85
18.849600
type: double
Calculez le périmètre d'un disque de rayon 5 et vérifiez de tête le résultat
/// BEGIN SOLUTION
perimetre(5)
/// END SOLUTION
31.416000
type: double
Vérifiez que les tests automatisés ci-dessous ne produisent pas de message d'erreur:
CHECK( std::abs(perimetre( 10) - 62.83) < 0.1 );
CHECK( std::abs(perimetre(100) - 628.3) < 0.1 );
Exercice
Sur le même modèle, écrivez une fonction aire qui renvoie l'aire d'un cercle dont on
donne le rayon. Testez-la.
/// BEGIN SOLUTION
double aire(double r) {
double pi = 3.1416;
return pi * r * r;
}
/// END SOLUTION
/// BEGIN SOLUTION
aire(3)
/// END SOLUTION
28.274400
type: double
/// BEGIN SOLUTION
aire(4.9)
/// END SOLUTION
75.429816
type: double
CHECK( std::abs(aire( 10) - 314.16) < 0.1 );
CHECK( std::abs(aire(100) - 31416 ) < 0.1 );
Bravo, vous avez fini l'exercice «Jupyter: affectations, conditionnelles, fonctions» du TP.
Retournez sur l'énoncé du TP pour consulter la suite des instructions.