Errata de Introduction à la programmation 1. Algorithmes et ANSI/ISO C++ Par Michel Michaud 1998, Loze-Dion éditeur inc. --------------------------------------------------------------------------- Dernière mise à jour : 4 mai 1999 Les seules erreurs techniques importantes proviennent de mon interprétation erronée de la norme C++ pour certains éléments du chapitre 9. La norme n'étant pas claire (et je pense même qu'elle est carrément incorrecte), j'avais déduit mon interprétation de Visual C++. Donc en fait, tout ce que je disais dans le livre était fonctionnel avec Visual C++ (et probablement plusieurs autres compilateurs). Cependant pour être plus général et plus formel, il faudrait faire les corrections suivantes : P.207 Ajouter cette phrase à la note de bas de page : «La norme ne garantit pas que sync() fonctionne toujours, mais c'est la seule fonction prévue pour faire cette opération.» P.217 Changer la description de eof() par : «(end of file) est vraie si on a atteint la fin du fichier; on a fail en plus si c'est à la suite d'une lecture non réussie.» Puis au bas de la page changer la dernière phrase par (la partie modifiée est entre []) : «Un test sur eof peut sembler similaire à ce que nous faisions dans les algorithmes, mais [eof peut devenir vraie après la dernière lecture correcte ou après la première lecture non réussie. De plus, à cause d'erreurs dans le fichier] il» P.218 Le deuxième paragraphe devrait être : «[On testera donc] fail() après une opération... puis on [pourra déterminer] la raison plus exacte... après l'ouverture [d'un] fichier, on peut [simplement] tester fail()... après une lecture, on préférera tester [fail()] et identifier ensuite...» L'exemple doit donc être corrigé : ... /***/ if (f.fail()) break; /***/ ... P.219, 221, 223, 224 (2x), 271 Le return dans les fonctions Lire devraient renvoyer !fichier.fail() plutôt que fichier.good(). Par exemple, à la page 219 : bool Lire(istream& p_ficPieces, ... { ... return !p_ficPieces.fail(); } Il y a évidemment quelques autres petites nuances à apporter au texte en relation avec ces corrections, mais elles ne sont pas fondamentales. -------------- Le reste de cet errata ne contient que des erreurs simples : celles dont la correction peut aider la compréhension ont été notées par des numéros de page précédés par **. Certaines erreurs ont été corrigées dans les réimpressions du livre. Il est donc possible que les erreurs qui suivent ne s'appliquent pas à votre exemplaire. Format : numéro de page texte du livre correction --------------------------------------------------------------------------- 1 amènent amène 4 Boîtes grises (Elles devraient contenir le mot PROGRAMME) **4 prix, quantité, prix total nom, salaire net 13 oubliées oubliés 37 semblent semble 39 NbHeures nbHeures **48 plus de 5 articles. 5 articles ou plus. 52 coût supplémentaire par minutes. Ce coût supplémentaire par kilomètre. Ce 53 TARIF_DE_SOIR_NUIT_JOUR_PAR_KM TARIF_DE_SOIR_NUIT_PAR_KM 56 heure (plusieurs fois) heureDépart 56 Cet algorithme ne rentrait pas... (La mise en page ne correspond pas, la coupure devrait être avant : «Calcul du coût» à la page 55) 59 évalués évaluées 59 fait faits 62 QUAND ventes < 100 QUAND totalDesVentes < 100 72 FALSE FINSI 81 autres que O et N invalides (autres que O et N) 82 ECRITURE ÉCRITURE 84 noÉlèves noÉlève 85 SENTINELLE_ÂGE : : Âge indiquant SENTINELLE_ÂGE : -1 : Âge indiquant 91 ÉCRIRE totalDesNotes/nbÉlèves (Il faudrait normalement précéder par SI nbÉlèves > 0) 92 PROBLME PROBLÈME 93 vraie dans que la vraie que dans la 94 valeur total valeur totale 94 Dans la section VARIABLE Ajouter : ancienCode : caractère : Catégorie en cours de traitement **95 LOGIQUE LOGIQUE cptItems <- 0 : Utiles seulement s'il totalParCatégorie <- 0 : n'y a aucune donnée... 96 ancienCode = code ancienCode <- code (symbole d'affectation) 97 série de nombre série de nombres **97 SI nb < plusGrand (deux fois) SI nb > plusGrand 99 possède un fichier contenant les possède les 101 détails détail 102 Date : date de création Création : date de création, etc. 104 null NUL 106 instruction3 (première fois) instruction2 109 ligne où il se trouve ligne où elle se trouve 118 variable appelé cout variable appelée cout 129 somme+= nbImpair somme+= nbImpair; 131 somme+= nbImpair (deux fois) somme+= nbImpair; 131 intructions... instructions... 132 intructions... instructions... 138 MOD MODULO 138 Écrire l'algorithme. Faire l'algorithme : y compris faire la trace. 142 passent inaperçu passent inaperçues 152 au dessus au-dessus 154 ) ageMinimum= âge; ) ageMinimum= age; 155 qu'un série qu'une série 158 deviennent simple deviennent simples 161 ObtenirNbBarreau ObtenirNbBarreaux 162 nbBarreaux (plusieurs fois) nbBarreauxDésirés (pour correspondre au deuxième commentaire de la page 163) 165 p_emploi : réel p_emploi : texte 168 Notons...avoir initialisés. (Première phrase du deuxième paragraphe) Notons qu'en principe, il ne faut pas utiliser la valeur des paramètres de sortie (p_s) avant de leur avoir affecté une valeur dans le module. **169 QUAND note < (deux fois) QUAND p_note < 173 CalculerDéductions CalculerDeductions 173 Note de bas de page 25 Ajouter : Par ailleurs, plusieurs programmeurs ajoutent un return 0; explicite à la fin de la fonction main. 175 fonctions appelés fonctions appelées 176 for (;;) for(;;) 179 nbDeJoursDuMois (plusieurs fois) nbJoursDuMois 184 RENVOYER FAUX (faire suivre de) FINSI 184 les réduction accordées les réductions accordées 185 0700 à 1700 0700 à 1659 197 ObtientCatégorieFilm ObtenirCatégorieFilm **219 return ficPieces.good(); return p_ficPieces.good(); **219 si le numéro de film n'existe pas, on si le numéro de film existe déjà, on 226 ObtenirCategorie ObtenirCategorieFilm 231 désirant loué un film désirant louer un film **242 LIRE ficLocations (noFilm, titre, catégorie, durée) LIRE ficLocations (noFilm, noAbonné, dateLocation, prixLocation) **243 LIRE ficLocations (noFilm, titre, catégorie, durée) LIRE ficLocations (noFilm, noAbonné, dateLocation, prixLocation) **244 SI tabLocations[I] > tabLocations[INDICEFilmPlusLoué] noFilmPlusLoué <- i SI tabLocations[i] > tabLocations[indiceFilmPlusLoué] indiceFilmPlusLoué <- i **249 << " %\n"; (dans AfficherResultatSur20) << " /20\n"; **250 << " %\n"; (dans les deux AfficherResultatSur20) << " /20\n"; 252 nombre de location d'un film nombre de locations d'un film **253 for (int i= 1; i <= NB_MAX_FILM; ++i) for (int i= 1; i < NB_MAX_FILMS; ++i) 261 g_tabFilmsExistant g_tabFilmsExistants 272 #include "Video.cpp" #include "Video.h" 274 #include "Video.cpp" #include "Video.h" 276 fichier .mdp dans Visual C++ fichier .dsp dans Visual C++ 281 qui vaut 32767 sou Visual C++ qui vaut 32767 sous Visual C++ 281 int& p_s_min int& p_s_minute 281 Ajouter la section suivante : #include Ce fichier contient les fonctions d'entrée-sortie du langage C (dont nous n'avons pas besoin car nous utilisons les streams) ainsi que quelques fonctions générales de manipulation de fichiers. En voici deux, parfois nécessaires dans les exercices de ce livre (en particulier dans l'exercice I-4) : int rename(const char nomDuFichier[], const char nouveauNom[]); Change le nom externe du fichier. int remove(const char nomDuFichier[]); Détruit le fichier. Dans les deux cas, il faut qu'aucun fichier ouvert dans le programme ne corresponde à ces fichiers sur disque. Les fonctions renvoient 0 si l'opération demandée a été réussie.