Choisissez votre style : style 1,    style 2,    sans commentaire,    impression,    ancien.

Correction
Les fonctions (2)

Exercice 1 Exercice 2 Exercice 3 Exercice 4 Exercice 5 Exercice 6 Exercice 7

Exercice 1 : Surcharge de fonction (niveau 1)

Exercice n°13 (pages 31 et 212) de l'ouvrage C++ par la pratique.

En C++, une fonction est identifiée par son nom et par les types de ses paramètres. On peut en effet imaginer que certaines fonctions se comportent différemment selon le type de paramètre transmis : on n'inverse par exemple pas une matrice de la même manière que l'on inverse un nombre réel.

Dans cet exercice par contre, le contenu de la fonction n'est pas modifié car on échange toujours 2 objets de la même façon. Ce qui change par contre ici, c'est le type des paramètres et de la variable intermédiaire.

void echange(double& a, double& b)
{
  double copie(a);
  a=b;
  b=copie;
}
 
void echange(char& a, char& b)
{
  char copie(a);
  a=b;
  b=copie;
}
 
[avancé !] Notez que le langage C++ offre une possibilité de faire ce genre de surcharges plus facilement : définir des fonctions indépendamment du type de leurs arguments. Ce sont les templates, que nous verrons au second semestre.

C'est un peu comme si on écrivait la fonction générique :

void echange(<type>& a, <type>& b)
{
  <type> copie(a);
  a = b;
  b = copie;
}
 

justement sans avoir à préciser le type.

La façon correct de l'écrire en C++ est :

template<typename Type>
void echange(Type& a, Type& b)
{
  Type copie(a);
  a = b;
  b = copie;
}
 
[avancé !] [C+++11] Notez par ailleurs que depuis la version 2011, le langage C++ offre une possibilité de faire cela de façon plus efficace, en évitant les copies lorsque cela est approprié, en utilisant la «sémantique de déplacement» («move semantics»). Ceci est une optimisation avancée ; à n'utiliser que si vous savez exactement ce que vous faites :
template<typename Type>
void echange(Type& a, Type& b)
{
  Type tmp(std::move(a)); // Cela rend a invalide (mais peu importe ici puisqu'on l'écrase à la ligne suivante)
  a = std::move(b);       // Cela rend b invalide (mais peu importe ici puisqu'on l'écrase à la ligne suivante)
  b = std::move(tmp);     // Cela rend tmp invalide (mais peu importe ici puisqu'on ne l'utilise plus)
}
 

Exercice 2 : factorielle

Exercice n°32 (pages 81 et 251) de l'ouvrage C++ par la pratique.
  • Pour la fonction factorielleIterative(), il s'agit d'une simple boucle for. Il faut simplement veiller aux bonnes conditions initiales :