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.