Program_Exam Flashcards
Rappeler la syntaxe de la boucle do …while
en C++.
do {
bloc d’instructions;
} while ( condition )
Rappeler la sémantique de la boucle do …while
Répéter le bloc d’instructions tant que la condition est vraie :
- Exécution du bloc d’instruction
- Évaluation de la condition
- Si sa valeur est true recommencer en 1
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 **/
int sommeDiviseurs(int n) {
int somme = 0;
for ( int i = 1; i <= n; i++ ) {
if( n % i == 0 ) {
somme += i;
}
}
return somme; }
Que signifie ( n % i == 0 ) ?
i divise n, n congrus a 0 modulo i
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 :
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>
Écrivez un fragment de programme C++ qui ouvre un fichier toto.txt en lecture :
ifstream fichier;
fichier. (“toto.txt”);
Écrivez le code pour afficher un message d’erreur si l’ouverture du fichier a échoué (♣ ou mieux, déclencher une exception !)
if ( not fichier ) {
throw runtime_error(“Le fichier n’a pas pu être ouvert”);
}
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.
int i, compteur;
while ( fichier»_space; i ) {
compteur ++;
}
fichier.close();
Donnez la définition de flux entrant.
Un flux entrant est un dispositif où l’on peut lire des données, successivement l’une après l’autre.
Spécifiez (par une documentation) une fonction puissanceNaive qui prend en entrée deux entiers positifs x et n et qui calcule x^n.
/** Fonction puissanceNaive
* @param x un nombre entier
* @param n un nombre entier positif @return n-ième puissance x^n de x
**/
Implanter une fonction puissanceNaive qui prend en entrée deux entiers positifs x et n et qui calcule x^n.
int puissanceNaive( int x, int n ) {
int y = 1;
for ( int k = 1; k <= n; k++ ) {
y = y * x;
}
return y;
}
É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.
void affiche(vector<string> t ) {
for (int i = 0; i < l.size(); i++) {
if ( i > 0 )
cout << " ";
cout << t[ i ];
}
}</string>
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
vector<vector<string>> nnMotsLongueurEtalon( string nomFichier, int n, string e)</string>
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
ifstream flux; // déclaration du flux
flux.open(nomFichier) ; // ouverture du fichier
string mot; // declaration
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
vector<vector<string>> t;
// allocation
t = vector<vector<string>>(n); // allocation</string></string>
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
for (int numLigne = 0; numLigne < n; numLigne++) {
// allocation des sous-tableaux
t[numLigne] = vector<string>(n);
// initialisation</string>
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
for ( int j = 0; j < n; j++ ) {
while ( ( flux»_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; }
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
**/
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>
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>
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];