IFT1166 --- Automne 1999 --- Demo03 --- 28 Septembre 1999

 

IFT1166 -- Démonstration # 3

 

Contenu

- reprise des exercices de la démonstration -2-

- des questions sur le TP01?

- quelques astuces de programmation.

- les fonctions surdéfinies.

- les classes, constructeurs & destructeurs.

 

Exercice 1

Soit le programme suivant:

------------------------------------------------------

#include <iostream.h>

void affiche_table(char **T, int nb) {

for (int i =0; i<nb; i++) {

cout << "elt " << i+1 << " = " << T[i] << endl;

}

}

int main() {

char *(T[]) = {"bonjour","merci", "a la prochaine"};

affiche_table(T,3);

strcpy(T[0],"titi");

affiche_table(T,3);

return 0; // tout va bien

}

------------------------------------------------------

a) Ce programme est-il syntaxiquement correct (cad peut-il être compilé) ? Dans la négative, corrigez-le.

Essayez de trouver la réponse sans vous aider de votre compilateur !

b) Ce programme contient une erreur importante de programmation que le compilateur ne peut détecter.

Trouvez-la !

 

Exercice 2

Le programme suivant contient plusieurs erreurs (de conception), identifiez-les puis corrigez-les.

------------------------------------------------------

#include <iostream.h> // pour cout

#include <iomanip.h> // pour setw, etc

#include <stdlib.h> // pour le free

struct item {

char *chaine;

int info;

};

void AfficheTable(item *T, int nb) {

static int appel = 1;

cout << "Affichage " << appel++ << endl;

// illustration de quelques manipulateurs de iostream (inclure iomanip.h)

for (int i=0; i<nb; i++)

cout << " Elt " << setiosflags(ios::right) << setw(2) << (i+1) << ": " << setiosflags(ios::left) <<

setw(10) << setfill(' ') << T[i].chaine << " " << T[i].info << endl;

// la meme en C: (il faudrait alors inclure stdio.h)

// printf(" Elt %2d : %-10s %d\n",i+1,(T[i].chaine)? T[i].chaine:"null",T[i].info);

}

int main() {

struct item T[5] = {{"Camus",1},{"Rilke",2},{"Le Clezio", 3}}; // struct est ici facultatif en C++

AfficheTable(T,5);

cout << T[4].chaine << endl;

strcpy(T[1].chaine,"Dostoievski");

AfficheTable(T,2);

T[3] = T[1];

AfficheTable(T,4);

free(T[1].chaine);

free(T[3].chaine);

AfficheTable(T,4);

return 0; // tout va bien

}

------------------------------------------------------

Exercice 3

 

Écrire la définition de la fonction "affiche", du programme suivant, en respectant les différents types de ses arguments. Utilisez pour cela les notions de fonctions surdéfinies.

 

int main() {

affiche (3); // affiche un entier

affiche ('X'); // affiche un caractère

affiche (1.0); // affiche un double

affiche ("Bonjour, tout le Monde!", 7); // affiche les 7 premiers caractères d'une chaîne

return 0;

}

Donnez aussi le résultat de l'exécution de ce programme.

 

Exercice 4

 

Reprendre l'exercice 3 de la demo02, mais le réécrire avec les classes.

Un Rappel,

vous avez la classe "date" ayant:

- 3 membres privés (des entiers): jour, mois, annee

et les méthodes publiques suivantes:

- un constructeur par défaut qui se contente d'imprimer:

"le constructeur par defaut a ete appele"

- un constructeur qui:

initialise les 3 membres prives (jour, mois, annee),

affiche en sortie "le constructeur avec initialisation de paramètres, a ete appele",

appel la méthode "affiche_date".

- un destructeur qui:

affiche en sortie: "le destructeur a ete appele"

et appel la méthode "affiche_date"

- la fonction "affiche_date": qui affiche en sortie les 3 membres privés de la classe.

 

Dans la fonction main, vous avez ce qui suit:

 

 

int main () {

date fetes[2];

date NouvelAn(1,1,2000);

date Travail(4,9,2000);

fetes[0] = NouvelAn;

fetes[1] = Travail;

return 0;

}

 

 

complétez le programme, et examinez les résultats obtenus en sortie.