Subject: [IFT1166] A propos du TP1 Date: Tue, 15 Feb 2000 12:19:48 -0500 Bonjour, J'ai trouve ce matin dans mon mailbox, plusieurs emails d'etudiants demandant de l'aide afin de debuguer avec eux leur programme de tp1. Je vous demanderai de voir cela avec vos demonstrateurs demain soir lors de la demo, apres l'examen, si vous n'avez toujours pas solutionne vos bugs d'ici la. La date de remise, quant a elle est maintenue pour demain soir minuit (Mercredi 16 Fev) avec penalite de 2 points par jour de retard. Pour rappel, voir le paragraphe 7, de l'enonce du tp1, pour la procedure de remise. A propos du debugage, une suggestion serait de mettre des cout au niveau des appels/sorties de fonctions. Des que vous avez mis la main sur la fonction qui causerait probleme, vous affichez avec des cout les donnees utilisees dans cette fonction ainsi de suite. La "segmentation fault", est provoquee par une lecture/ecriture dans une zone memoire inaccessible. Donc il faudrait faire attention a la maniere avec laquelle vous manipuler les pointeurs, s'assurer par exemple, que le pointeur utilise, pointe sur une zone memoire qui existe. 2 exemples ... ----------------- char* p; char* s="cuicuic"; strcpy(p,s); // p n'a pas ete alloue => Segmentation fault (core dumped) --------------- char* p = new char[10]; delete p; delete p; // un second appel => Segmentation fault (core dumped) --------------- Mohamed Lokbani. ------------------------------------------------------------------------- Objet: [IFT1166] TP1 Q/R -8- Date: Sat, 12 Feb 2000 11:11:07 -0500 Bonjour, Pour info, le prochain email pour les questions/reponses tp1 .... Lundi soir. Mohamed Lokbani. --------------------------------------------------- Question -1- >>#include >>char Tab[10000]; >>int main() >> { >> for(int i=0;i<10000;i++) >> if(Tab[i]=='<')&&(Tab[i+2]=='>') >> if(Tab[i+1]=='U') >> case 'U' : Majusclue/*?// je ne sais pas ce qu'il faut >> ecrire pour faire une instruction >> ayant pour tache d'ecrire ce qui suit en majuscule*/ >> else >> if (Tab[i+1]=='/') >> cout<<"il n'y'a pas de balise."<> voila ou je suis >> si vous pouvez me aidez . Pour mettre les caracteres en minuscule: voir la fonction : tolower Pour mettre les caracteres en majuscule: voir la fonction : toupper comment les utiliser .... voir un bon livre de C, sinon une description sommaire est donnee en tapant sur ta console linux la commande: man tolower ou man toupper une suggestion sur le style .... - avant de coder, tu dois deja organiser sur un papier a part, toutes les taches demandees. - apres, tu dois reperer, les taches communes, pour eviter de sur utiliser les if/else afin de structurer ton code en petites fonctions "courtes". - tu peux essayer chaque fonctions a part pour essayer si elle fonctionne bien. - par la suite tu commences a construire le tout. ainsi ca evitera de mettre tout ton code dans la fonction main! --------------------------------------------------- Question -2- >> Pourquoi dois je sortir avec un message d'erreur si la balise >> bonjour salut est bien balancé. Pourquoi ne pouvous nous pas >> considérer le comme fesant parti integrante de la balise ??? >> moi, j'aurais cru que... >> bonjour salut >> sur cette exemple on doit sortir avec un message d'erreur car maintenant, >> la balise est pas bien balancé. Ne doit on pas considérer une balise mal >> balansé quand il y a une balise ouvrante et l'autre fermante comme mon >> exemple et comme l'exemple 4.2??? je ne sais pas quelle methode tu as (vas) utilise pour coder ton tp. Pour eviter les problemes, tu sors avec un message d'erreur si tu trouves que les balises ne sont pas bien balancees. i.e. une ouvrante, une fermante, et aucune des autres balises (ouvrantes ou fermantes) ne doit se trouver entre les deux. --------------------------------------------------- question -3- >>Une autre question également, si la balise commence par une balise >>fermante... ex bla bla bla >>doit on la considerer comme rien ou comme une balise mal balancé? avant doit y avoir s'il n'en y avait pas une => erreur! --------------------------------------------------- question -4- >>est-ce que nous avons de la documentation (ou une >>référence) sur l'utilisation et la création du fichier d'en-tete, >>ainsi que son utilisation avec le fichier .cpp. dans un fichier d'entete (*.h), on met les declarations de fonctions. dans un fichier *.cpp, on met les definitions de fonctions. pour avoir une idee d'un *.h ouvres le fichier: data.h je vous ai fourni un data.o qui est obtenu apres compilation du fichier data.cpp ---------------------------------------------- // exemple de fichier entete.h #include // fonction pour swapper deux entiers void swap(int&, int&); // fin fichier d'entete ----------------------------------------------- // exemple fichier entete.cpp #include "entete.h" void swap(int& x, int& y) { int temp = x; x = y; y = temp; } // normalement on devrait avoir un autre fichier *.cpp qui devra // contenir l'interface, je passe sur ca pour l'instant. // vous allez faire cela en tp2. int main(){ int x=30,y=40; swap(x,y); cout << "apres swap! x: " << x << " y: " << y << endl; return 0; } --------------------------------------------------- question -5- >>Ou puis-je trouver de l'information sur l'utilite >>des fonctions de , en particulier strtok et >>et strcmp ? un livre de C, voir a la bibliotheque Math/Info UdM. Deitel & Deitel (comment programmer en C++) par exemple, sinon Delannoy (programmer en langage C). --------------------------------------------------- question -6- >>Si on a une balise intercalee, est-ce qu'on traite quand meme >>le texte, ou on genere une erreur du type de la question 2)b) >>ci-dessous ? ex: balise intercalee tu sors avec une erreur. --------------------------------------------------- question -7- >>Si on a une mauvaise balise fermante, est-ce que l'erreur generee >>doit faire quitter le programme ?(comme quand le balisage n'est pas >>bien balance) ex: test >>Est-ce qu'on doit ou on ne doit pas utiliser de classe, >>en particulier une classe string, car vous mentionnez une classe >>canonique ? la classe string du C++ est une classe canonique. Pour l'utiliser, il faudra inclure le fichier d'entete voir la demo #03 --------------------------------------------------- question -8- >>s'il vous plait,voulez vous restaurer le lien de >>l'ennoncé du tp2 sur l'interpretation des tags. ????? si tu pensais au lien du tp1, il est tjr accessible. --------------------------------------------------- ------------------------------------------------------------------------------ Objet: [IFT1166] TP1 Q/R -7- Date: Wed, 09 Feb 2000 12:55:32 -0500 Bonjour, >>Je voudrais utiliser la fonction strupr() qui convertit une chaine en >>majuscule, mais je n'arrive pas à compiler ; j'ai les messages d'erreur >>suivants : >>implicit declaration of function `int strupr(...)' >>undefined reference to `strupr' l'erreur signifie que le compilateur n'arrive pas a mettre la main dans aucun des *.h (fichier entete) sur la declaration de 'strupr', de ce fait, il suppose que la fonction va retourner un entier .... puis quand il arrive pour paqueter tout le programme, la il lui faut vraiment trouver cette fonction 'strupr', or il ne la trouve toujours pas, du coup erreur .... >>Comment je dois faire ? pourquoi il ne la trouve pas? 'strupr', est une fonction connue uniquement sous dos/windows, elle ne fait pas partie de la norme Ansi-C ni Ansi-C++. Donc affaire classee, oublies cette fonction, tu dois chercher une autre fonction pour convertir une chaine en majuscule. en C++ (y compris C), il n'existe pas de fonctions qui permettent de faire cela d'un coup, i.e. toute la chaine. Tu es oblige de traiter caractere par caractere, avec la fonction toupper (declaree dans le fichier pour C++, pour le C). pour savoir si une fonction donnee existe, et du coup avoir sa description, sur le systeme d'exploitation (Linux, une variante de Unix), faites ce qui suit: man nom_de_la_fonction exemple: man toupper Mohamed Lokbani. ------------------------------------------------------------------------------ Objet: [IFT1166] TP1 Q/R -6- Date: Tue, 08 Feb 2000 11:31:31 -0500 Bonjour, >>Mais dans le tp1 nous devons utiliser la fonction >>void load_data (char expression[]); >>pour que cette fonction soit fonctionnel est ce que la seul chose a faire >>1- est de placer le include #include oui. >>2- puis d'appeler la fonction par exemple: load_data (tableau[10000]) oui, quoi que .... ton passage d'argument pose des problemes.... Regardes mes notes de cours pages 62-63, comment je passe un tableau dans une fonction. >>... ma deuxieme question est pour le filtre de >>la methode que j'utilise [.....] >>Je voulais savoir si il existe une fonction C++ >>qui permet de comparer 2 mot et de donner comme resultat >>lequel des 2 mots est le premier dans l'ordre alphabethique. >>Ou si on doit faire cette fonction nous meme. si tes mots ont le type char* utilises la fonction "strcmp" si tes mots ont le type string (uniquement en C++) regardes la fonction compare de la classe string. voir le livre Delannoy (chapitre 22). >>Et si vous conseillez une autre methode pour ce filtre. je passe sur la question, a toi de voir .... >>... et ma 3e questions >>Est ce qu'il est possible d'afficher la ligne numero 3 au complet >>d'un tableau declarer : tableau[20][20] si c'est le tableau est char, oui: char tableau[20][20]; cout << tab[2]; va afficher le contenu de la 3e ligne (comptes a partir de 0) assures toi d'avoir un \0 un caractere de fin de chaine ds ta ligne, pour eviter de recolter lors de l'affichage des caracteres bizaroides. Mohamed Lokbani. --------------------------------------------------------------------- Objet: [IFT1166] TP1 Q/R -5- Date: Fri, 04 Feb 2000 17:11:18 -0500 Bonjour, >> Losrque le filtre rencontre du texte entre les balises et et que >> ce texte contient des symboles qui ne sont pas alpha-numériques >> (ponctuation, tab, espaces blancs multiple) quel traitement doit être >> apporté à ces caractères? --------------------------- 3. Balises [....] trie la liste des mots du texte qui suit dans ordre croissant alphabétique. Cet effet durera jusqu'à la balise fermante . La liste contient une série de mots, tous en minuscules, séparés par des blancs. Il peut y avoir un espace blanc avant le premier mot et après le dernier mot. Vous pouvez utiliser l'algorithme de tri de votre choix. --------------------------- le texte contient un seul caractere non alphanumerique: l'espace blanc. Pour ce dernier: - il peut y avoir un blanc au debut de la serie de mots. bonjour bonsoir salut - il peut y avoir un blanc a la fin de la serie de mots. bonjour bonsoir salut - il peut y avoir un blanc au debut et a la fin de la serie de mots. bonjour bonsoir salut - il peut y avoir un (doit y avoir au moins un, pour separer les mots), ou plusieurs espaces blancs pour separer les mots ds la serie. bonjour bonsoir salut tu n'es pas oblige de preserver le nombre d'espace apres tri, ce qu'il faut c'est juste afficher le resultat du tri (voir l'exemple du 4.2), tu separes les mots par un espace blanc. Tu ne peux pas donc avoir l'exemple que tu as mentionne dans ton email: >> bonjour, allo:comment 123 /abc <ét>? par contre tu peux avoir ce cas: bonjour salut mais ce cas rentre dans la categorie 4.2 "Contraintes sur le texte à filtrer", i.e. le texte balise n'est pas bien balance, tu sors avec un message d'erreur (voir 4.2). Mohamed Lokbani. --------------------------------------------------------------------- Objet: [IFT1166] TP1 Q/R -4- Date: Mon, 31 Jan 2000 16:04:46 -0500 Bonjour, question 1: >>Qu'est-ce qu'une classe canonique?? en plus des membres prives, une classe canonique contient au moins ce qui suit: - un constructeur (regulier, donc pas par defaut) - un constructeur de recopie - surdefinition de l'operateur d'affectation (=) - destructeur Dans le cours, nous n'avons pas encore aborde les 3 derniers points. Le destructeur et probablement le constructeur de recopie seront expliques la prochaine seance. La surdefintion des operateurs la seance d'apres. Dans certains cas, nous avons besoin de definir une classe canonique dans d'autres cas, nous pouvons nous contenter de ce que le C++ nous offre par defaut. Quels sont ces cas et les criteres de choix, nous aborderons ces points prochainement. Pour cela que j'ai prefere mettre un sorte d'avertissement pour que les etudiants ne partent pas faire le tp avec les notions de classes, apprises jusqu'a la en cours. question 2: >>La balise qui inverse, inverse-t-elle les mots ou toute la phrase? >>ex: do re mi fa sol >>resulte en: od er im af los >>ou ?: los af im er od toute la phrase, pour ton exemple: ex: do re mi fa sol tu obtiens la 2nd configuration >>ou ?: los af im er od Mohamed Lokbani --------------------------------------------------------------------- Objet: [IFT1166] TP1 Q/R -3- Date: Fri, 28 Jan 2000 17:08:59 -0500 Bonjour, >>est-ce-qu'on peut avoir un texte: < une pomme > et une banane la reponse est oui. Tant que: < n'est pas suivi par un TAG (u, l, etc.) puis > ou bien < n'est pas suivi par un / puis TAG (u, l, etc.) puis > Dans les autres configurations: un < ou > dans une expression, est au meme niveau qu'un caractere non tagge, ou un chiffre. tu peux avoir aussi dans ton expression des chiffres: 124 bananes tu obtiens : 124 BANANES etc. >>Donc il faut le tranformer : < UNE POMME > ET UNE BANANE exact. Mohamed Lokbani. ------------------------------------------------------------------ Objet:[IFT1166] TP1 Q/R -2- Date:Wed, 26 Jan 2000 21:32:20 -0500 Bonjour, >>En ce qui concerne le TP1 (du cours IFT1166), une question: >>Si j'ai le texte a l'entree " en maj , est-ce que la sortie sera (en >>faisant attention aux espaces) " EN MAJ "? >>C'est-a-dire un espace au debut, l'espace compris final et le caractere \0. s'il y avait un (ou plusieurs) espaces blancs au debut et un (ou plusiers) espace blanc a la fin, la sortie doit preserver ces espaces blancs. Donc pour l'exemple que tu as donne, la reponse est oui (tu dois faire attention aux espaces). Mohamed Lokbani. ---------------------------------------------------------------- Objet: [IFT1166] Mise a jour TP1 & Q/R Date: Tue, 25 Jan 2000 12:55:44 -0500 Bonjour, ci-joint les reponses aux questions que j'ai recu a propos du TP1. La premiere question signale une erreur dans le sujet. J'ai introduit les modifications necessaires dans l'enonce du TP1. Ces questions/reponses ont ete archivees sur la page web du TP1. Mohamed Lokbani. question -1- ------------- >>Il est dit que la balise u transforme en majuscule (uppercase) et que l >>transforme en lowercase. Pourquoi est ce que dans la premiere ligne de >>l'exemple, EN MINUSCULE donne comme resultat en minuscule au lie de >>l'inverse ?? La meme remarque s'applique pour la 2e ligne. oups! ah oui t'as raison! je vais corriger cela. l'explication est bonne, l'exemple quant a lui, est errone! met en majuscule met en minuscule question -2- ------------- >>J'ai aussi une question quant au point d'évaluation dan sla rubrique >>"Efficience": vous parlez d'espace mémoire utilisée. Est-ce que nous >>déclarons tout bonnement un tableau de 9 999 charactere (+ le \0), ou si >>nous essayons de compter le nombre de caracteres du texte pour créer un >>"tableau dynamique" ? Si j'ai bien compris ta seconde proposition: tu ne peux pas la faire, car il te faut declarer un tableau ayant une taille donnee. Tu vas passer ce tableau a load_data qui se chargera de le remplir. Si l'espace memoire du tableau passe en argument n'a pas ete alloue (ou declare ayant une taille donnee tab[10000] par ex.) la fonction load_data va generer une erreur. Donc tu dois declarer "tout bonnement" ton tableau tab[10000] comme mentionne en 4.1.1 Pour obtenir la taille reelle du tableau, utilises strlen sur ton tableau, cette fonction retourne le nbre de caracteres qu'il y a dans ton tableau. L'efficience est plutot liee a la maniere avec laquelle vous allez coder votre programme. Peut-etre, pour une raison ou une autre, qd tu vas coder ton programme, tu sera ramene a allouer un tableau, puis a la fin du programme tu ne vas pas le desallouer. Un autre cas, tu dois faire un tri. Le choix de l'algorithme etant libre (vous pouvez prendre l'algorithme de votre choix), il te faut quand meme savoir comment le connecter de maniere efficace au probleme pose. question -3- ------------- >>dans l'énoncé du TP1, on dit que l'on doit créer un filtre "à la UNIX". >>Donc, le programme va prendre en argument de la ligne de commande le nom du >>fichier a "processer". Si il n'y a pas d'argument donné, le programme émet >>un message d'erreur avec la syntaxe correcte du programme. Ma question: >>est-ce que notre programme doit pouvoir recevoir plus d'un fichier à la >>ligne de commande ?? Compte tenu de la fonction qui écrit dans un fichier de >>sortie au nom unique (et surtout qui overwrite), je serais tenté de dire >>non, mais dans ce cas ce n'est pas vraiment un filtre "à la UNIX" ! >>ex: filtre file1 file2 file3 desole pour cette confusion ; le programme ne doit recevoir aucun fichier (aucun argument). je suis d'accord avec toi, ce n'est pas vraiment (a 100%) un filtre a la UNIX. Il manque la gestion des arguments en E/S, que j'ai retiree pour les raisons que j'ai mentionnees lors des echanges d'emails que nous avions eu a propos de la demo #1. J'ai remplace cela par des fonctions E/S, load_data joue le role de l'entree et write_data joue le role de la sortie. L'idee de filtrage (noyau du module de filtrage) reste la meme que celle utilisee sous UNIX.