Correction de l`examen de Programmation I
Transcription
Correction de l`examen de Programmation I
Correction de l’examen de Programmation I Sciences et Technologies du Vivant, Semestre 1 Mercredi 19 décembre 2012 Question 1 – Compréhension de code Le programme affiche : A) push 2 push 5 2 2 B) pop 5 5 C) push 5 push 6 pop 6 pop 5 -1 D) push 1 push 2 pop 2 pop 1 3 push 3 E) push 1 push 2 pop 2 pop 1 push 3 push 3 pop 3 pop 3 oui F) push 1 1 push 2 pop 2 pop 1 push 3 push 3 3 push 1 pop 1 pop 3 push 0 Question 2 – Compréhension de code (2) . . . 2 + 3 + 4 × 5 = 25 points Le programme affiche : 1 A) B) C) D) E) F) Attention! Le chkt Le chat chat La chet Question 3 – Mini-éditeur de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 points Voici le programme complet. Seule une partie des fonctions était demandée à l’examen. // Pour compiler ce programme sous Linux ou Mac, tapez: // g++ editeur.cpp -lcurses -o editeur // dans une fenetre Terminal #include <iostream> #include <string> using namespace std; struct Editeur { string texte; int cur; }; //////////////////////////////////////////////////////////////////////////////// // Vous n’aviez pas a ecrire ces fonctions pour l’examen. // Elles sont donnees ici pour que le programme soit utilisable #include <curses.h> void init_fenetre_texte() { initscr(); cbreak(); keypad(stdscr, TRUE); noecho(); curs_set(0); } void fin_fenetre_texte() { endwin(); } int attend_touche(void) { return getch(); } void affiche_char(char c) { addch(c); } Page 2 void fin_ligne() { addch(’\n’); } //////////////////////////////////////////////////////////////////////////////// Editeur cree_editeur() { Editeur e; e.texte = ""; e.cur = 0; return e; } void insere_caractere(Editeur & e, int pos, char car) { string texte2(e.texte.length()+1, ’*’); for(unsigned int i(0); i < pos; ++i) { texte2[i] = e.texte[i]; } texte2[pos] = car; for(unsigned int i(pos); i < e.texte.length(); ++i) { texte2[i+1] = e.texte[i]; } e.texte = texte2; } void supprime_caractere(Editeur & e, int pos) { string texte2(e.texte.length()-1, ’*’); for(unsigned int i(0); i < pos; ++i) { texte2[i] = e.texte[i]; } for(unsigned int i(pos+1); i < e.texte.length(); ++i) { texte2[i-1] = e.texte[i]; } e.texte = texte2; } // La fonction affiche que vous deviez ecrire: void affiche_cout(Editeur & e, int nb_colonnes) { for(unsigned int i(0); i < e.texte.length(); ++i) { if (i == e.cur) { cout << "*"; } else { cout << e.texte[i]; } if (i % nb_colonnes == 0 and i > 0) { fin_ligne(); Page 3 } } } // Ceci N’est PAS la fonction affiche que vous deviez ecrire: void affiche(Editeur & e, int nb_colonnes) { for(unsigned int i(0); i < e.texte.length(); ++i) { if (i == e.cur) { affiche_char(’*’); } else { affiche_char(e.texte[i]); } if (i % nb_colonnes == 0 and i > 0) { fin_ligne(); } } if (e.cur >= e.texte.length()) { if (e.cur % nb_colonnes == 0 and e.cur > 0) { fin_ligne(); } affiche_char(’*’); } } void deplace_curseur_vers_la_gauche(Editeur & e) { if (e.cur > 0) { e.cur = e.cur - 1; } } void deplace_curseur_vers_la_droite(Editeur & e) { if (e.cur < e.texte.length()) { e.cur = e.cur + 1; } } void insere_caractere_curseur(Editeur & e, char car) { insere_caractere(e, e.cur, car); deplace_curseur_vers_la_droite(e); } void supprime_caractere_curseur(Editeur & e) { if (e.cur > 0) { deplace_curseur_vers_la_gauche(e); supprime_caractere(e, e.cur); } Page 4 } int cherche(Editeur & e, string & ch) { for(int i(e.cur); i < e.texte.length() - ch.length() + 1; ++i) { int j(0); bool ok(true); while(ok and j < ch.length()) { ok = e.texte[i+j] == ch[j]; j++; } if (ok) { return i; } } return -1; } void remplace(Editeur & e, string & ch, string & new_ch) { int r = cherche(e, ch); if (r >= 0) { for(unsigned int i(0); i < ch.length(); ++i) { supprime_caractere(e, r); } for(unsigned int i(0); i < new_ch.length(); ++i) { insere_caractere(e, r + i, new_ch[i]); } } } int main() { Editeur e = cree_editeur(); init_fenetre_texte(); int last; bool cont = true; do { clear(); affiche(e, 80); refresh(); int c = attend_touche(); cout << c << endl; if (c == KEY_LEFT) { deplace_curseur_vers_la_gauche(e); } else if (c == KEY_RIGHT) { deplace_curseur_vers_la_droite(e); } else if (c == 265) { clear(); Page 5 fin_fenetre_texte(); string ch, new_ch; system("clear"); cout << "Entrez la chaine a remplacer et la nouvelle chaine: "; cin >> ch >> new_ch; remplace(e, ch, new_ch); init_fenetre_texte(); } else if (c == 127) { // Delete (sur Mac) supprime_caractere_curseur(e); } else if (c == 10) { // Return cont = false; } else { insere_caractere_curseur(e, char(c)); last = c; } } while (cont); fin_fenetre_texte(); return 0; } Page 6