Program_Exam Flashcards

1
Q

Rappeler la syntaxe de la boucle do …while
en C++.

A

do {
bloc d’instructions;
} while ( condition )

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Rappeler la sémantique de la boucle do …while

A

Répéter le bloc d’instructions tant que la condition est vraie :

  1. Exécution du bloc d’instruction
  2. Évaluation de la condition
  3. Si sa valeur est true recommencer en 1
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Complétez la fonction suivante:
/** Renvoie la somme des diviseurs de n
* @param n: un entier
* @return: un entier: la somme des diviseurs de n **/

A

int sommeDiviseurs(int n) {
int somme = 0;
for ( int i = 1; i <= n; i++ ) {
if( n % i == 0 ) {
somme += i;
}
}
return somme; }

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Que signifie ( n % i == 0 ) ?

A

i divise n, n congrus a 0 modulo i

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Implantez une fonction initialise prenant un entier taille en paramètre et renvoyant un tableau de booléens de la taille donnée, dont les deux premières valeurs sont false et les suivantes sont true :

A

vector<bool> initialise(int taille) {
vector<bool> résultat = vector<bool>(taille);
for ( int i = 0; i < taille; i++ ) {
résultat[i] = i >= 2;
return résultat;
}</bool></bool></bool>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Écrivez un fragment de programme C++ qui ouvre un fichier toto.txt en lecture :

A

ifstream fichier;
fichier. (“toto.txt”);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Écrivez le code pour afficher un message d’erreur si l’ouverture du fichier a échoué (♣ ou mieux, déclencher une exception !)

A

if ( not fichier ) {
throw runtime_error(“Le fichier n’a pas pu être ouvert”);
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

On suppose que toto.txt ne contient que des entiers, séparés par des espaces. Écrivez le code pour compter le nombre d’entiers dans le fichier. Bien fermer le fichier.

A

int i, compteur;
while ( fichier&raquo_space; i ) {
compteur ++;
}
fichier.close();

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Donnez la définition de flux entrant.

A

Un flux entrant est un dispositif où l’on peut lire des données, successivement l’une après l’autre.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Spécifiez (par une documentation) une fonction puissanceNaive qui prend en entrée deux entiers positifs x et n et qui calcule x^n.

A

/** Fonction puissanceNaive
* @param x un nombre entier
* @param n un nombre entier positif @return n-ième puissance x^n de x
**/

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Implanter une fonction puissanceNaive qui prend en entrée deux entiers positifs x et n et qui calcule x^n.

A

int puissanceNaive( int x, int n ) {
int y = 1;
for ( int k = 1; k <= n; k++ ) {
y = y * x;
}
return y;
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Écrivez le code d’une fonction affiche qui prend un tableau de mots en paramètres et affiche ces mots séparés par des espaces.

A

void affiche(vector<string> t ) {
for (int i = 0; i < l.size(); i++) {
if ( i > 0 )
cout << " ";
cout << t[ i ];
}
}</string>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

La fonction nnMotsLongueurEtalon prend en paramètres nomFichier, le nom d’un fichier contenant des mots de différentes longueurs, n, un entier et etalon, un mot. On note k la longueur de ce mot. La fonction construit un tableau carré de taille n par n initialisé avec les n × n premiers mots de longueur k trouvés dans le fichier ; si le fichier ne contient pas assez de mots de longueur k, alors la fin du tableau est initialisée avec le mot etalon. Enfin, la fonction renvoie ce tableau.
Partie I : Écrivez l’entête de la fonction

A

vector<vector<string>> nnMotsLongueurEtalon( string nomFichier, int n, string e)</string>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

La fonction nnMotsLongueurEtalon prend en paramètres nomFichier, le nom d’un fichier contenant des mots de différentes longueurs, n, un entier et etalon, un mot. On note k la longueur de ce mot. La fonction construit un tableau carré de taille n par n initialisé avec les n × n premiers mots de longueur k trouvés dans le fichier ; si le fichier ne contient pas assez de mots de longueur k, alors la fin du tableau est initialisée avec le mot etalon. Enfin, la fonction renvoie ce tableau.

vector<vector<string>> nnMotsLongueurEtalon( string nomFichier, int n, string e)</string>

Partie II : Écrivez l’ordre de lecture de la fonction

A

ifstream flux; // déclaration du flux
flux.open(nomFichier) ; // ouverture du fichier
string mot; // declaration

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

La fonction nnMotsLongueurEtalon prend en paramètres nomFichier, le nom d’un fichier contenant des mots de différentes longueurs, n, un entier et etalon, un mot. On note k la longueur de ce mot. La fonction construit un tableau carré de taille n par n initialisé avec les n × n premiers mots de longueur k trouvés dans le fichier ; si le fichier ne contient pas assez de mots de longueur k, alors la fin du tableau est initialisée avec le mot etalon. Enfin, la fonction renvoie ce tableau.

vector<vector<string>> nnMotsLongueurEtalon( string nomFichier, int n, string e)
ifstream flux; // déclaration du flux
flux.open(nomFichier) ; // ouverture du fichier
string mot; // declaration</string>

Partie III : Écrivez les étapes de creation du tableau de strings t

A

vector<vector<string>> t;
// allocation
t = vector<vector<string>>(n); // allocation</string></string>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

La fonction nnMotsLongueurEtalon prend en paramètres nomFichier, le nom d’un fichier contenant des mots de différentes longueurs, n, un entier et etalon, un mot. On note k la longueur de ce mot. La fonction construit un tableau carré de taille n par n initialisé avec les n × n premiers mots de longueur k trouvés dans le fichier ; si le fichier ne contient pas assez de mots de longueur k, alors la fin du tableau est initialisée avec le mot etalon. Enfin, la fonction renvoie ce tableau.

vector<vector<string>> nnMotsLongueurEtalon( string nomFichier, int n, string e)
ifstream flux; // déclaration du flux
flux.open(nomFichier) ; // ouverture du fichier
string mot; // declaration
vector<vector<string>> t;
// allocation
t = vector<vector<string>>(n); // allocation</string></string></string>

Partie IV : Écrivez les étapes de creation des sous-tableaux de strings n

A

for (int numLigne = 0; numLigne < n; numLigne++) {
// allocation des sous-tableaux
t[numLigne] = vector<string>(n);
// initialisation</string>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

La fonction nnMotsLongueurEtalon prend en paramètres nomFichier, le nom d’un fichier contenant des mots de différentes longueurs, n, un entier et etalon, un mot. On note k la longueur de ce mot. La fonction construit un tableau carré de taille n par n initialisé avec les n × n premiers mots de longueur k trouvés dans le fichier ; si le fichier ne contient pas assez de mots de longueur k, alors la fin du tableau est initialisée avec le mot etalon. Enfin, la fonction renvoie ce tableau.

vector<vector<string>> nnMotsLongueurEtalon( string nomFichier, int n, string e)
ifstream flux; // déclaration du flux
flux.open(nomFichier) ; // ouverture du fichier
string mot; // declaration
vector<vector<string>> t;
// allocation
t = vector<vector<string>>(n); // allocation
for (int numLigne = 0; numLigne < n; numLigne++) {
// allocation des sous-tableaux
t[numLigne] = vector<string>(n);
// initialisation</string></string></string></string>

Partie V : Finir le programme

A

for ( int j = 0; j < n; j++ ) {
while ( ( flux&raquo_space; mot ) and ( mot.size() != etalon.size() ) );
if ( flux )
t[numLigne][j] = mot;
else
t[numLigne][j] = etalon;
flux.close(); // fermeture du fichier
return t; }

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Implantez une fonction elementsDeBloc qui prend en paramètres une grille de Sudoku, ainsi que les indices de la ligne et de la colonne d’un bloc de 3x3 (0, 1 ou 2), et qui renvoie les entiers non-nuls contenus dans ce bloc.

/** Renvoie les valeurs non-nulles d’un bloc d’indice * ligne et colonne
* @param grille une grille de sudoku
* @param indice de la ligne du bloc (entre 0 et 2)
* @param indice de la colonne du bloc (entre 0 et 2)
* @return un tableau d’entier
**/

A

vector<int> elementsDeBloc(Grille g, int ligne, int
colonne) {</int>

vector<int> res;
int element;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
element = g[ligne * 3 + i][colonne * 3 + j];
if (element != 0) {
res.push_back(element); }
}
}
return res;
}</int>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Pour chaque bogue, identifiez le numéro de la ligne fautive, décrivez le problème et proposez une correction.

Grille resolutionNaiveBoguee(Grille grille) {
bool aChange = false;
while ( aChange ) {
aChange = false;
for (int ligne = 0; ligne < 9; ligne++) {
for (int colonne = 0; colonne > 9; colonne++) {
if ( grille[ligne][colonne] = 0 ) {
vector<int> vals =
valeursPossibles(grille, ligne, colonne);
if ( vals.size() == 0 ) {
return grilleVide();
if ( vals.size() == 1 ) {
grille[ligne][colonne] == vals[0];
aChange = true;
} }
} }
}
return grille;
}</int>

A

Ligne 2 : on n’entre jamais dans la boucle ;
Correction: bool aChange = true;

Ligne 6 : inégalité inversée ;
Correction: colonne < 9

Ligne 7 : affectation au lieu d’un test d’égalité
Correction: if (grille[ligne][colonne] == 0)

Ligne 14 : test d’égalité au lieu d’affectation ;
Correction:grille[ligne][colonne] = vals[0];

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

On souhaite implanter une bibliothèque bla, utilisée par un programme programme.cpp.
Lister les fichiers requis pour la bibliothèque :

A

— bla.h : fichier d’entête
— bla.cpp : bibliothèque
— bla-test.cpp : fichier de test

21
Q

Indiquer le rôle de chacun des extraits de code ci-dessous et le ou les fichiers le contenant :

/** Calcule …
**/

A

Rôle : documentation de la bibliothèque, fichier(s) : bla.h

22
Q

Indiquer le rôle de chacun des extraits de code ci-dessous et le ou les fichiers le contenant :

int bla(int a, int b);

A

Rôle : entêtes de la bibliothèque, fichier(s) : bla.h

23
Q

Indiquer le rôle de chacun des extraits de code ci-dessous et le ou les fichiers le contenant :

int bla ( int a, int b ) {
return a + b;
}

A

Rôle : implémentation de la bibliothèque, fichier(s) : bla.cpp

24
Q

Indiquer le rôle de chacun des extraits de code ci-dessous et le ou les fichiers le contenant :

CHECK ( bla (1, 2) == 3 );

A

Rôle : tests de la bibliothèque, fichier(s) : bla-test.cpp

25
Q

include “bla.h”

Indiquer le rôle de chacun des extraits de code ci-dessous et le ou les fichiers le contenant :

A

Rôle : inclusion d’entête, fichier(s) : bla.cpp, bla-test.cpp, programme.cpp

26
Q

Indiquer le rôle de chacun des extraits de code ci-dessous et le ou les fichiers le contenant :

int c = bla(3, 4);

A

Rôle : utilisation de la bibliothèque, fichier(s) : programme.cpp

27
Q

Donner les commandes pour compiler la bibliothèque bla et le programme séparément puis les lier entre eux :

A

g++ -c bla.cpp
g++ -c programme.cpp
g++ bla.o programme.o -o programme

28
Q

Indications : On rappelle que pour tous entiers a et b, le reste de la division euclidienne de a par b est donné en C++ par a%b. Ce reste est nul si et seulement si a est divisible par b.

/** Calcul le plus grand commun diviseur de deux entiers * @param x: un entier
* @param y: un entier
* @return le pgcd de x et y
**/

Écrire le programme

A

int pgcd(int x, int y) {
int m = min(x, y);
int diviseur;
for (int d = 0; d <= m; d++) {
if (x % d == 0 and y % d == 0) {
diviseur = d;
} }
return diviseur; }

29
Q

Écrire une fonction qui utilise cette récursion pour calculer le pgcd:

/** Calcul le plus grand commun diviseur de deux entiers de façon recursive * @param x: un entier
* @param y: un entier
* @return le pgcd de x et y
**/

A

int pgcdRecursif(int x, int y) {
if (x == y) {
return x;
} else if (x > y) {
return pgcdRecursif(x - y, y);
} else {
return pgcdRecursif(x, y - x);

}}

30
Q

On considère la fonction mystère suivante, avec un exemple d’appel :

void mystere(string nomFichier) {
ifstream fichier;
fichier.open(nomFichier);
string t;
int n;
while ( fichier&raquo_space; t and fichier&raquo_space; n ) {
cout &laquo_space;t &laquo_space;” “ &laquo_space;2 * n &laquo_space;endl;
}
fichier.close();
}

mystere("truc.txt");

Le fichier truc.txt contient les premières lignes suivantes :

Henry 4
Messi 2
Ronaldo 3
Xavi 2

Expliquez ce que fait la fonction mystere. Précisez le format que doit avoir le fichier. Choisissez des noms plus informatifs pour cette fonction et ses variables, et écrivez sa documentation.

A

/** affiche les notes contenues dans un fichier après les avoir
* multipliées par deux.
* Format: chaque ligne doit être de la forme “<nom> <note>"
* @param nomFichier le nom du fichier
**/
void afficheNotes(string nomFichier) {
ifstream fichier;
fichier.open(nomFichier);
string nom;
int noteSur10;
while ( fichier >> nom and fichier >> noteSur10 ) {
cout << nom << " " << 2 * noteSur10 << endl;
}
fichier.close();
}</note></nom>

31
Q

void mystere(string nomFichier) {
ifstream fichier;
fichier.open(nomFichier);
string t;
int n;
while ( fichier&raquo_space; t and fichier&raquo_space; n ) {
cout &laquo_space;t &laquo_space;” “ &laquo_space;2 * n &laquo_space;endl;
}

mystere(“truc.txt”);

Le fichier truc.txt contient les premières lignes suivantes :

Henry 4
Messi 2
Ronaldo 3
Xavi 2

Changez la fonction pour que chaque ligne de la sortie soit de la forme :

Nom: Alfred, note sur 10: 7, note sur 20: 14

A

Il suffit de remplacer l’instruction de la boucle while par :

  cout << "Nom: " << nom << ", note sur 10: " <<   noteSur10
                         << ", note sur 20: " << 2 * noteSur10 << endl;
32
Q

Implanter cette fonction :

/** calcule la moyenne des notes contenues dans un fichier texte
* Format: chaque ligne du fichier est de la forme “<nom> <note>"
* @param nomFichier le nom du fichier
* @return la moyenne des notes, arrondie à sa partie entière
**/
int moyenne(string nomFichier);</note></nom>

A

int moyenne(string nomFichier) {
ifstream fichier;
fichier.open(nomFichier);
string temp;
int note;
int somme = 0;
int nb = 0;
while ( fichier&raquo_space; temp and fichier&raquo_space; note ) {
somme += note;
nb += 1;
}
fichier.close();
return somme / nb;
}

33
Q

Implanter cette fonction :

/** lit les notes contenues dans un fichier et en fait un tableau
* Format: chaque ligne du fichier est de la forme “<nom> <note>"
* @param nomFichier le nom du fichier
* @return un tableau contenant les notes
**/
vector<int> lit_notes(string nomFichier);</int></note></nom>

A

vector<int> lit_notes(string nomFichier) {
ifstream fichier;
fichier.open(nomFichier);
vector<int> notes;
string temp;
int note;
while ( fichier >> temp and fichier >> note ) {
notes.push_back(note);
}
fichier.close();
return notes;
}</int></int>

34
Q
A
35
Q

Compilation en C++

Soit le programme puissance-quatre.
Écrivez le sous la forme de programme souce.

A

puissance-quatre.cpp

36
Q

Compilation en C++

Soit le programme puissance-quatre.cpp

Compilez le programme

A

g++ puissance-quatre.cpp -o puissance-quatre

37
Q

Compilation en C++

Soit le programme puissance-quatre.cpp

Éxecutez le programme

A

./puissance-quatre

38
Q

Compilation en C++

Soit le programme puissance-quatre.cpp

Écrivez la fabrication de l’assembleur

A

g++ -S puissance-quatre.cpp

39
Q

Écrivez la syntaxe de l’écriture dans une chaîne de caractères.

A

ostringstream flux;
flux &laquo_space;variable1;
flux &laquo_space;variable2;
string s = flux.str();

40
Q

Implantez la fonction suivante :

/** compte le nombre de mots d’un fichier texte
* @param nomFichier le nom du fichier
* @return le nombre de mots contenus dans le fichier
**/
int word_count(string nomFichier);

A

int word_count(string nomFichier) {
ifstream fichier;
fichier.open(nomFichier);
int nbr = 0;
string temp;
while ( fichier&raquo_space; temp ) {
nbr += 1;
}
fichier.close();
return nbr;
}

41
Q

Implantez la fonction suivante :

/** compte le nombre de lignes d’un fichier texte
* @param nomFichier le nom du fichier
* @return le nombre de lignes contenues dans le fichier
**/
int line_count(string nomFichier);

A

int line_count(string nomFichier) {
ifstream fichier;
fichier.open(nomFichier);
string ligne;
int compteur = 0;
while ( getline(fichier, ligne) ) {
compteur += 1;
}
fichier.close();
return compteur;
}

42
Q

Implantez la fonction suivante :

/** affiche (sur la sortie standard) le contenu d’un fichier texte
* @param nomFichier le nom du fichier
**/
void cat(string nomFichier);

A

void cat(string nomFichier) {
ifstream fichier;
fichier.open(nomFichier);
string ligne;
while ( getline(fichier,ligne) ) {
cout &laquo_space;ligne &laquo_space;endl;
}
fichier.close();
}

43
Q

Implantez la fonction suivante :

/** copie le contenu d’un fichier texte dans un autre
* @param source le nom du fichier source
* @param destination le nom du fichier destination
**/
void copy(string source, string destination);

Indication : la bibliothèque standard fournit la fonction suivante :

/** lit une ligne d’un flux et la stocke dans une chaîne de caractères
* @param f un flux entrant
* @param s une chaîne de caractères
* @return le flux entrant
**/
istream getline(istream &f, string &s);

A

void copy(string source, string destination) {
ifstream fichierSource;
fichierSource.open(source);
ofstream fichierDestination;
fichierDestination.open(destination);
string ligne;
while ( getline(fichierSource, ligne) ) {
fichierDestination &laquo_space;ligne &laquo_space;endl;
}
fichierSource.close();
fichierDestination.close();
}

44
Q

Devinez ce que fait la fonction mystereEpais suivante et écrire un test :

int mystereEpais(string zut) {
ifstream bla;
bla.open(zut);
int foo = 0;
char y;
while ( bla&raquo_space; y ) {
foo++;
}
bla.close();
return foo;
}

A

La fonction renvoie le nombre de caractères du fichier en entrée (sans compter les espaces et retours à la ligne : ils sont considérés comme de simples délimiteurs).

Exemple de test :

CHECK( mystereEpais("truc.txt") == 65 );
45
Q

Implantez la fonction suivante :

Renvoyer le nombre de lignes de t. (tableau)

A

/** renvoie le nombre de lignes du tableau
*@param t tableau de caractères à deux dimensions
*@return l’entier correspondant à son nombre de lignes
**/
int nombreDeLignes (vector<vector<char>> t) {
return t.size();
}</char>

46
Q

Implantez la fonction suivante :

Renvoyer le nombre de colonnes de t (tableau supposé rectangulaire).

A

/** renvoie le nombre de colonnes du tableau
* supposé rectangulaire
*@param t tableau de caractères rectangulaire à deux dimensions
*@return l’entier correspondant à son nombre de colonnes
*/
int nombreDeColonnes (vector<vector<char>> t) {
if (t.size()==0) return 0;
return t[0].size();
}</char>

47
Q

Implantez la fonction suivante :

afficher les éléments de la ligne d’indice l
de t.

A

/** affiche, en ligne, les éléments de la ligne d’indice l
*@param t tableau de caractères à deux dimensions
*@param l entier l’indice de la ligne à afficher
**/
void afficheLigne(vector<vector<char>> t, int l) {
cout << "ligne d'indice " << l << " : " << endl;
for (int colonne = 0; colonne < t[l].size() ; colonne++) {
cout << t[l][colonne] << " ";
}
cout << endl;
}</char>

48
Q
A