Rattrapage d`algorithmique/C Exercice 1 : sudoku

Transcription

Rattrapage d`algorithmique/C Exercice 1 : sudoku
Algorithmique et Langage C
I NFORMATIQUE
Année 2011-2012
—–
Rattrapage d’algorithmique/C
Seuls documents autorisés : poly de cours et C dans la poche
Durée de l’épreuve : 2 heures
Licence MIAGe
S720006
Université de Nantes
2005/2006
Consignes générales :
– Si le protoype d’une fonction n’est pas imposé, vous êtes libre de coder la fonction comme vous l’entendez, et donc d’utiliser le prototype qui vous semble le plus aproprié. En revanche, si le prototype
est donné par l’énoncé, vous devez l’utiliser.
– Vous avez le droit de réutiliser toute fonction déjà codée dans un des exercices de l’examen.
– Les trois exercices sont indépendants. Dans
un: 1h30
même exercice, vous pouvez supposer connu le résulDurée
tats d’une question à laquelle vous ne savez pas répondre, afin de traiter les questions suivantes.
– Afin d’assurer l’impartialité entre tous, aucune question ne peut être posée pendant toute la durée de
Leun
barème
à titre indicatif
l’épreuve. Si vous avez
doute est
sur donné
une question,
signalezuniquement.
le sur la copie et répondez en conséquence.
Les copies de transparents du cours, le polycopié de L. Granvilliers et les notes manuscrites
personnelles sont les seuls documents autorisés.
Examen
Langage C
Exercice 1 : sudoku
ExerciceLe
1 sudoku
(6 pts.) est un puzzle utilisant une grille carrée composée de 9 régions ; chaque région est elle-même
composée de 9 cases. On part d’une grille partiellement remplie et on doit la compléter en respectant les
Le sudoku est un puzzle utilisant une grille carrée composée de 9 régions ; chaque région est elle-même composée
trois règles suivantes :
de 9 cases. On part d’une grille partiellement remplie et on doit la compléter en respectant les trois règles suivantes :
– chaque colonne doit contenir les 9 chiffres de 1 à 9 ;
– Chaque colonne doit contenir les 9 chiffres de 1 à 9
– chaque ligne doit contenir les 9 chiffres de 1 à 9 ;
– Chaque ligne doit contenir les 9 chiffres de 1 à 9
– Chaque région doit contenir les 9 chiffres de 1 à 9.
– Chaque région doit contenir les 9 chiffres de 1 à 9
Région
1
4 5 8
7
5
6 3
2
4
4 9
2 1 6
5
1 2 3 4 5 8 6 7 9
5 8 6 3 9 7 2 1 4
4 9 7 2 1 6 3 5 8
3
3
9
6
2
0 1 2
6
1
4 5
2
5
9
3 8
4 7
1
3 4 5
6 7 8
8 2 5
8 3
5
5
1
7
1
5
4
8
4
2
5
1
5
9
7
6
7
8
3
2
3
4
9
9
8
7
1
4
6
3
8
5
2
1
6
3
7 6 1 8 2 5 4 9 3
7
8 3 9 6 4 1 5 2 7
1. Définir un type structuré digits FtIGURE
pour représenter
un de
tableau
de 9 entiers susceptible de contenir une
1 – Une grille
Sudoku
ligne, une colonne, ou une région ;
2. Écrire la fonction contient les 9 chiffres() prenant en entrée un digits t et retournant 1 si le
1. Définir un type structuré digits_t pour représenter un tableau de 9 entiers susceptible de contenir
tableau correspondant contient tous les chiffres de 1 à 9 une seule fois ;
une ligne, une colonne, ou une région.
3. Écrire les fonctions extraire ligne(), extraire colonne() et extraire region() prenant
2. Écrire la fonction int contient_les_9_chiffres(digits_t tab) qui retourne 1 si le
en entrée une grille de sudoku sous la forme d’un tableau d’entiers à 2 dimensions et un entier n compris
tableau digits_t tab correspondant contient tous les chiffres de 1 à 9 une seule fois.
entre 0 et 8, et retournant la n-ième ligne, la n-ième colonne, ou la n-ième région ;
3. Écrire les fonctions int* extraire_ligne(int **grille, int n), int* extraire_colonne(int
4. Écrire la fonction sudoku fini()
prenant en entrée une grille de sudoku et retournant 1 si elle est corint n) et int* extraire_region(int **grille, int n) prenant en
**grille,
rectement
complétée.
entrée une grille de sudoku sous la forme d’un tableau d’entiers à 2 dimensions et un entier n compris
entre 0 et 8, et retournant la n-ième ligne, la n-ième colonne, ou la n-ième région.
Exercice4.2 Écrire
(5 pts.)
la fonction int sudoku_fini() prenant en entrée une grille de sudoku et retournant 1 si
elle est
complétée.
1. Indiquez
les correctement
erreurs se trouvant
dans le programme ci-dessous et corrigez-les :
1. #include "stdlib.h"
2.
3. typedef struct {
4.
cellule suiv;
5.
int val;
6. } cellule;
8. void creer_cellule(cellule *c, int v) {
9.
c=(cellule*)malloc(sizeof(cellule*));
10. }
11.
12. int main(void) {
13.
cellule *c;
Examen d’algorithmique/C
2
Exercice 2 : pointeurs
On considère les deux fonctions C suivantes.
int f (int a, int b, int *q, int *r) {
if ((a < 0) || (b <= 0)) { return 0; }
*q = 0;
while (a >= b) { a = a - b; *q = *q+1; }
*r = a;
return 1;
}
int main(void) {
int x = 13, y = 3, q, r, v; w
v = f(x, y, &q, &r);
printf(00 %d, %d, %d, %d\n00 , x, y, q, r) ;
return(0);
}
1. Qu’imprime l’appel à printf dans le main ? (Justifier rigoureusement).
2. Que calcule la fonction f ?
3. Pourquoi la fonction f utilise des pramètres qui sont des pointeurs ? A quoi sert sa valeur de retour ?
Exercice 3 : figures à 3 dimensions
On veut représenter des figures à 3 dimensions dans l’espace. Pour celà, on a besoin de définir la notion
de « point » dans l’espace à 3 dimensions. Chaque point sera décrit par ses 3 coordonnées x, y et z, pas
nécessairement entières. Ensuite, nous avons besoin de définir la notion de « figure à 3 dimensions », qui
sera décrite notamment par un tableau contenant les points formant la figure à représenter. Par exemple,
dans le cas du cube, il est clair qu’il faudra 6 points, donc 6 cases dans ce tableau.
1. Écrivez le type point qui représente correctement un point en 3 dimensions.
2. Écrivez le type figure3d qui représente correctement une figure complète à 3 dimensions. Cette
structure contiendra, en plus des données (les points eux-mêmes), le nombre de points que constituent
la figure ainsi que le nombre de points utilisés. Le but de ce dernier champ est de pouvoir toujours
savoir le numéro de la case qui suit le dernier point ajouté. Par exemple, si l’on a créé une figure3d
de 10 points et que l’on n’a rempli que les coordonnées de 3 points à cette figure, ce champ vaudra 3.
3. Écrivez la fonction : figure3d CreeFigure(int nbPoints) qui renvoie une figure de nbPoints
correctement initialisée. Les coordonnées x, y, et z de tous les points seront placées à la valeur 0, et
le nombre de points utilisés sera placé à la valeur 0.
Votre programme doit pouvoir gérer un nombre quelconque de points. Attention à bien gérer le cas
où figure3d ne pourrait pas être créée.
4. Écrivez la fonction : figure3d AjoutPoint1(float x, float y, float z, figure3d
f) qui met le point constitué des coordonnées x, y et z à la place indiquée par le champ « nombre de
points utilisés », puis ajoutera 1 à ce champ.
5. Réécrivez la fonction d’ajout, alors appelée AjoutPoint2 , qui, au lieu de renvoyer la figure3d,
ne renverra rien. Dans ces conditions, justifiez pourquoi on est obligé de passer par adresse la figure3d
à la fonction.
6. Écrivez une fonction qui calcule la distance entre deux points : float Distance(point P1,
point P2).
7. Écrivez la fonction : figure3d ConcatenerFigures(figure3d f1, figure3d f2)
qui renvoie une figure qui serait la concaténation de deux figures.
8. Écrivez la fonction : figure3d Tri(figure3d f, point p) qui trie les points de la figure
par ordre croissant de distance par rapport au point p passé en paramètre. Vous choisirez la méthode
qui vous plait le mieux.
Examen d’algorithmique/C
3
9. Écrivez unefonction void SaveFigure(char* Nom, figure f ) qui sauvegarde dans un
fichier texte les points qui composent la figure f. Chaque point devra être sur une ligne du fichier
texte, et sur chaque ligne on doit voir dans l’ordre les valeurs de x, y et z séparées par une tabulation.
10. En réutilisant toutes les fonctions déjà écrites, écrivez une fonction main qui crée une figure contenant un cube de côté 10 et une pyramide de hauteur 5, placée juste au dessus du cube. Faites ensuite
concaténer les deux figures au programme, et faites lui trier les points dans l’ordre croissant par
rapport au point (−5, 0, 0) sur la figure concaténée. Enfin, le programme sauvera dans un fichier
« MAISON.TXT » la figure résultante.