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