TP: Premières fonctions

Exercice 1 : renvoyer versus afficher

Exécutez les cellules suivantes qui définissent deux fonctions.

#include <iostream>
using namespace std;
/** Une fonction qui calcule la valeur absolue
 * @param a, un entier
 * @return la valeur absolue de a
 **/
int abs(int a) {
    if (a > 0) {
        return a;
    } else {
        return -a;
    }
}
/** Une fonction qui affiche la valeur absolue
 * @param a, un entier
 **/
void afficheAbs(int a) {
    if (a > 0) {
        cout << a << endl;
    } else {
        cout << -a << endl;
    }
}

Observez les appels suivants; y a-t-il une différence entre abs et afficheAbs?

VOTRE RÉPONSE ICI

abs(-3)
abs(-3);
afficheAbs(-3)
afficheAbs(-3);

Essayez de deviner le résultat des appels suivants puis exécutez pour vérifier:

abs(-5) + abs(3)
afficheAbs(-5) + afficheAbs(3)

La seconde cellule vous donne une erreur, comprenez-vous pourquoi ?

VOTRE RÉPONSE ICI

Exercice: une fonction utilisant une fonction

Complétez la fonction ci-dessous dont on donne la documentation.

Vous devez utiliser un appel à l’une des deux fonctions précédentes, afficheAbs ou abs; laquelle faut-il choisir? Pourquoi?

/** Distance de deux points sur une droite
 * @param a un entier: la coordonnée du premier point
 * @param b un entier: la coordonnée du deuxième point
 * @return la valeur absolue de la différence entre a et b
 **/
int distance(int a, int b) {
    // VOTRE CODE ICI
}

Vérifiez son fonctionnement sur l’exemple ci-dessous et les tests qui le suivent. Comme d’habitude, ces tests doivent tous valoir true, si ce n’est pas le cas il y a une erreur dans le code de votre fonction.

distance(5,3)
distance(5,3) == 2
distance(-4,2) == 6
distance(2,-5) == 7

Exercice (à la maison)

Mêmes consignes que pour l’exercice précédent:

/** somme des valeurs absolues (aussi appelée norme L1)
 * @param a un entier
 * @param b un entier
 * @return la somme des valeurs absolues de a et b
 **/
int sommeAbs(int a, int b) {
    // VOTRE CODE ICI
}
sommeAbs(5,-3)
sommeAbs(5,-3)  == 8
sommeAbs(-4,-2) == 6
sommeAbs(2,5) == 7

Exercice: tests automatiques

Essayez les exemples suivants qui illustrent l’utilisation de l’infrastructure vue en cours pour automatiser les tests. Si vous avez une erreur du type no member named 'cerr', vous avez probablement redémarré le noyau en oubliant d’exécuter la première cellule de cette fiche contenant #include <iostream>. Astuce : À chaque fois que vous redémarrez le noyau, allez ensuite dans Cellule -> Exécuter toutes les précédentes. Cela exécute toutes les cellules qui sont avant celle où vous vous trouvez. Vous éviterez ainsi de perdre du temps à chercher où sont les cellules qu’il faut ré-exécuter.

CHECK ( 1 < 2 );
CHECK ( 1 > 2 );

On remarque que si la condition en paramètre de CHECK est vraie, il n’y a aucun affichage. Par contre si la condition est fausse, un message d’erreur indiquant la condition fausse est affiché.

Avec CHECK, les tests de la fonction distance se mettent sous la forme:

CHECK ( distance(5,3)  == 2 );
CHECK ( distance(-4,2) == 6 );
CHECK ( distance(2,-5) == 7 );

Exécutez ces tests. Leur exécution ne devrait rien afficher.

Exercice: suivre la documentation et les tests

Implantez la fonction nombreSecondes dont la documentation est donnée ci-dessous:

/** Renvoie en secondes la durée décrite en jours, heures, minutes, secondes
 * @param j un entier représentant le nombre de jours
 * @param h un entier représentant le nombre d heures
 * @param m un entier représentant le nombre de minutes
 * @param s un entier représentant le nombre de secondes
 * @return la durée totale en secondes
**/
// VOTRE CODE ICI

Vérifiez son fonctionnement sur les exemples et tests ci-dessous:

nombreSecondes(1,1,1,1)
CHECK( nombreSecondes(0,0,0,1)  == 1      );
CHECK( nombreSecondes(0,0,1,0)  == 60     );
CHECK( nombreSecondes(0,1,0,0)  == 3600   );
CHECK( nombreSecondes(1,0,0,0)  == 86400  );
CHECK( nombreSecondes(3,2,5,25) == 266725 );

Bilan

Dans cette feuille, vous vous êtes familiarisés avec les fonctions: distinction entre afficher et renvoyer, fonction appelant des fonctions, documentation, tests, tests automatiques. Vous avez maintenant le bagage requis pour la suite du TP où vous implanterez la fonction exponentielle.