GM3 Nathalie Chaignaud
Algorithmes et Structures de Données Mardi 23 Novembre 2010
Durée 2H – Cours et TD NON autorisés
1. Fonctions récursives et pile (4 pts)
Ecrire un algorithme qui vérifie qu’un texte contenant des caractères standards est syntaxiquement correct du point de vue des parenthèses. Les parenthèses sont de trois types (, [ et { et leurs parenthèses fermantes correspondantes sont respectivement ), ] et }. La correction syntaxique implique qu’à chaque parenthèse ouvrante corresponde, plus loin dans le texte, une parenthèse fermante du même type. Le texte compris entre ces deux parenthèses doit également être correct au point de vue des parenthèses (une parenthèse ouverte doit y être refermée).
Algorithme:
p.InitPile pour i de 0 à N-1
si (c[i] est une prarenthèse ouvrante) p.empiler(c[i]) sinon si (c[i] est une paranthèse fermante) { si (p.estVide() ) stop “erreur: il manque une parenthèse ouvrante”
si (p.sommet() est du même type que c[i]) p.dépiler
sinon stop “erreur: la parenthèse fermante n’est pas du bon type”
}
si (p.estVide) affiche“syntaxe parenthèses OK”
sinon affiche “il manque une parenthèse fermante
Reprenons l’exemple du vérificateur syntaxique de parenthèse et implémentons-le à l’aide d’une procédure récursive :
Données c:tableau de N caractères qui contient le texte procédure vérifieParenthèse( p: caractère) {
répéter incrémenter i
jusqu’à ce que (i > N)
∨ (c[i] est une parenthèse)
si i > N - 1 stop “erreur: il manque au moins une parenthèse fermante”
sinon
si (c[i] est une parenthèse ouvrante) vérifieParenthèse(c[i])
sinon si (c[i] n’est pas du même type que p) stop “erreur: la parenthèse fermante n’est pas du bon type”
}
3. Sudoku (6 pts)
Le Sudoku est un jeu de stratégie d'origine japonaise dont le nom veut dire "Un seul chiffre doit être inscrit". Il est composé d’une grille comportant n2 lignes et n2 colonnes et n2 blocs (en général, n=3). Une grille est valide ssi :
• chaque colonne de la grille contient TOUS les nombres de 1 à n2
• chaque ligne de la grille contient TOUS les nombres de 1 à n2
• chacun des n2 blocs de n*n contient également TOUS les nombres de 1 à n2
GM3 Nathalie Chaignaud
Exemple pour n=3
Pour vérifier la validité d’une grille, il faut tenir à jour un tableau de booléens de type tab-bool permettant de savoir si une valeur (comprise entre 1 et n2) est présente dans la ligne, colonne ou bloc.
Const n = 3
Type tab-bool = tableau[1.. n*n] de booléens
3.1. Ecrire en pseudo-langage la fonction vérifie-ligne(l:entier):booléen. 3.2. Ecrire en pseudo-langage la fonction vérifie-colonne(c:entier):booléen. 3.3. Ecrire en pseudo-langage la fonction vérifie-bloc(i,j:entier):booléen. 3.4. Ecrire en pseudo-langage la fonction vérifie-sudoku():booléen.
4. Fichier texte (6 pts)
On souhaite traduire certains mots d’un texte à partir d’un lexique. Ce lexique est stocké dans un fichier texte dont chaque ligne est formatée comme suit : mot = traduction. Le texte à traduire est lui aussi sauvegardé dans un fichier texte. On créera un nouveau fichier texte qui sera la « traduction » du premier.
Exemple :
Soit le fichier de mots suivant :
si = if alors = then écrire = writeln lire = readln début = begin fin = end
programme = program entier = integer
Fichier texte donné Fichier texte créé (traduction)
programme prog var a : entier début
écrire(‘entrez un entier :’) lire(a)
si a > 2
alors écrire(‘a est supérieur à 2’) fin
program prog var a : integer begin
writeln(‘entrez un entier :’) readln(a)
if a > 2
then writeln(‘a est supérieur à 2’) end
4.1. Quelle structure de donnée doit-on utiliser pour stocker le fichier de mots en mémoire principale ? Décrire son type.
4.2. On veut écrire la procédure charger-tableau qui permet de stocker le fichier de mots en mémoire principale. Expliquer en français le principe. Ecrire en pseudo-langage cette procédure
.
4.3. Expliquer en français le principe de la traduction. Ecrire en pseudo-langage la procédure traduit-texte qui permet de créer le fichier texte de traduction à partir du fichier texte donné.
5 3 4 | 6 7 8 | 9 1 2 6 7 2 | 1 9 5 | 3 4 8 1 9 8 | 3 4 2 | 5 6 7 8 5 9 | 7 6 1 | 4 2 3 4 2 6 | 8 5 3 | 7 9 1 7 1 3 | 9 2 4 | 8 5 6 9 6 1 | 5 3 7 | 2 8 4 2 8 7 | 4 1 9 | 6 3 5 3 4 5 | 2 8 6 | 1 7 9