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
  • Écrivez un code similaire tel qu’une nouvelle variable d prenne la valeur minimale entre b et a.

// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE
d
  • 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 max renvoie en sortie un type int (ce qui est précisé par le premier mot) et prend deux variables int en 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)
max(6, -2)
max(-3, -4)
max(5, max(-3, 8))

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)

// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE
  • 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.

// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE
  • Calculez le max de n1, n2, n3 et n4 (toujours en utilisant la fonction max)

// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE
  • 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 max4 prenant quatre entiers et calculant leur max

// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE
  • ♣ Utilisez votre fonction max4 pour calculer le max de n1, n2, n3 et n4.

// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

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) {
    // REMPLACEZ CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE
    throw std::runtime_error("À faire");
}

Essayez-la sur l’exemple suivant:

min(2,3)

Essayez-la sur un exemple de votre choix:

// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

Vérifiez que tous les tests qui suivent ont bien la valeur true:

min(5, 10) == 5
min(6, -2) == -2
min(-3, -4) == -4
min(5, min(-3, 8)) == -3

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) {
    // REMPLACEZ CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE
    throw std::runtime_error("À faire");
}

Utilisez cette fonction pour calculer la valeur absolue de -2.5 et vérifiez le résultat:

// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

Vérifiez que les tests qui suivent ont bien la valeur true:

abs(-5.1) == 5.1
abs(2.3) == 2.3
abs(-3.4) == 3.4

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.1415;
    // REMPLACEZ CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE
    throw std::runtime_error("À faire");
}
perimetre(2) // environ 12.56
perimetre(3) // environ 18.85

Calculez le périmètre d’un disque de rayon 5 et vérifiez de tête le résultat

// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

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.

// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE
// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE
// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE
CHECK( std::abs(aire( 10) - 314.15) < 0.1 );
CHECK( std::abs(aire(100) - 31415 ) < 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.