Cours C++ GIREF

Devoir 1.

Exercice 0.

Écrire une fonction qui trouve le minimum d'un vecteur d'entiers.  Voici la signature de la fonction:

int trouveMinimum (int pVect[], int pDimension);

Exercice 1.

Écrire une fonction qui trouve le minimum d'une matrice d'entiers.  Quel est le problème d'une telle fonction?  Comment pourrions-nous le résoudre ?  Penser à une solution...

Exercice 2.

Écrire le petit programme suivant et observer ce qui se passe à l'exécution (pointeur.cc)

#include <iostream>

int main()
{

  double lY = 6.67;
  double lZ = 7.8;
  double *lPtr = 0;

  cout << "&lY: " << &lY << " &lZ: " << &lZ << " lPtr:" << lPtr << endl << endl;

  cout << "lPtr = &lY" << endl;

  lPtr = &lY;

  cout << "lY: " << lY  << " lZ: " << lZ  << " *lPtr: " << *lPtr << endl;
  cout << "&lY: " << &lY << " &lZ: " << &lZ << " lPtr:" << lPtr << endl<< endl;

  cout << "*lPtr = 5.45" << endl;

  *lPtr = 5.45;
  cout << "lY: " << lY  << " lZ: " << lZ  << " *lPtr: " << *lPtr << endl<< endl;

  cout << "lPtr = &lZ" << endl;

  lPtr = &lZ;
  cout << "&lY: " << &lY << " &lZ: " << &lZ << " lPtr:" << lPtr << endl<< endl;

  cout << "*lPtr = 3.1415" << endl;

  *lPtr = 3.1415;
  cout << "lY: " << lY  << " lZ: " << lZ  << " *lPtr: " << *lPtr << endl << endl;

  cout << "lZ = 999" << endl;

  lZ = 999;
  cout << "lY: " << lY  << " lZ: " << lZ  << " *lPtr: " << *lPtr << endl;
 

  return 0;

}

Exécuter le programme dans ddd en mettant un Breakpoint au 1er cout.  On peut imprimer l'adresse d'une variable en faisant un Display ..Other et en entrant le nom de la variable précédée d'un & (le même opérateur que l'on utilise pour prendre l'adresse d'une variable dans le code).

Exercice 3.

Écrire une structure pour représenter l'heure que vous appellerez Heure.  L'heure doit se décomposer en secondes, minutes et heure.  Ensuite, écrire 2 fonctions : une qui va imprimer l'heure à l'écran et l'autre qui va vérifier la validité de l'heure.

void afficheHeure(const Heure& pHeure);

bool heureEstValide(const Heure& pHeure);

On peut voir que l'utilisateur de la classe peut assigner n'importe quelle valeur à la structure.  Dans ce contexte, la structure pourrait alors contenir des valeurs tout à fait absurdes... (ex. : aHeure = 32, aMinute = -13, aSeconde = 897652).  Comment remédier à cela ?

Exercice 4.

Reprendre l'exercice 3, mais en faisant une classe plutôt qu'une structure.

 a) Mettre les attributs dans la partie privée de la classe.
 b) Écrire un constructeur qui assigne 0 à tous les attributs.
 c) Écrire une méthode publique qui assigne l'heure :

  void asgnHeure(int pHeure, int pMinute, int pSeconde);

 d) Ajouter une vérification à la méthode créée au point c).  Si l'heure passée en argument est invalide, ne pas l'assigner!
 e) Penser à ce qui suit:  que devrais-je faire au point d) en cas d'heure invalide? (arrêter le programme, afficher une erreur, retourner une erreur, etc.).  Quelle est la meilleure solution selon vous?

Exercice 5

Écrire une classe qui se nommera Complexe pour faire des calculs avec des nombres complexes.  Les complexes ont une partie réelle et imaginaire.  Utiliser des doubles pour représenter ces 2 parties, dans la section privée (private:) de la classe.

 a) Écrire un constructeur qui initialise à 0 les 2 parties.

 b) Écrire une méthode publique qui assignera la partie réelle et imaginaire de la classe.

 c) Écrire une méthode publique qui additionnera 2 nombres complexes.

 d) Écrire une méthode publique qui affichera le nombre sous la forme suivante:

  partieReelle + partieImaginaire * i