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.