Université Galatasaray Faculté d’ingénierie et de technologie Algorithmique & p

Université Galatasaray Faculté d’ingénierie et de technologie Algorithmique & programmation en langage C Damien Berthet & Vincent Labatut Corrigés de travaux pratiques Supports de cours – Volume 3 Période 2005-2014 Damien Berthet & Vincent Labatut 2005-2014 © Damien Berthet & Vincent Labatut 2005-2014 Ce document est sous licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International. Pour accéder à une copie de cette licence, merci de vous rendre à l'adresse suivante : http://creativecommons.org/licenses/by-nc-sa/4.0/ Galatasaray Universitesi Mühendislik ve Teknoloji Fakültesi Çırağan Cad. No:36 Ortaköy 34349, İstanbul version 1 Turquie 24/07/2014 Sommaire 01 ENTRÉES-SORTIES 02 TYPES SIMPLES 03 VARIABLES & OPÉRATEURS 04 INSTRUCTIONS DE CONTRÔLE 05 CRIBLE D'ÉRATHOSTÈNE 06 CHAÎNES DE CARACTÈRES 07 TABLEAUX MULTIDIMENSIONNELS 08 DIAGRAMMES TEXTUELS 09 INTRODUCTION À LA SDL 10 MODIFICATION DES COULEURS 11 PASSAGE DE PARAMÈTRES 12 ALGORITHME DE BRESENHAM 13 HISTOGRAMME DES COULEURS 14 PROPRIÉTÉS ARITHMÉTIQUES 15 ALGORITHMES POUR L'ARITHMÉTIQUE 16 BIBLIOTHÈQUE CHAÎNE 17 DÉCOMPOSITION D'UNE PERMUTATION 18 NOMBRES BINAIRES 19 ALGORITHME DE JOHNSON 20 MANIPULATION DE DATES 21 CARRÉS LATINS 22 REPRÉSENTATION D'UNE PROMOTION 23 PARTITION D'UN ENTIER 24 ROTATION D'UN CARRÉ 25 ZOOM D'UNE IMAGE 26 AUTOMATES FINIS 27 CHAMPIONNAT DE FOOTBALL 28 FLOUTAGE D'UNE IMAGE 29 FLOUS AVANCÉS 30 GESTION D'UN LEXIQUE 31 ALLOCATION DYNAMIQUE 32 GÉNÉRATEUR PSEUDO-ALÉATOIRE 33 NOMBRES HEXADÉCIMAUX 34 AGENDA TÉLÉPHONIQUE 35 FICHIERS ET ARGUMENTS DE PROGRAMME 36 DIAPORAMA 37 STOCK D'UNE LIBRAIRIE 38 AUTOMATES CELLULAIRES 39 FONCTIONS RÉCURSIVES 40 APPROXIMATIONS NUMÉRIQUES 41 FIGURES FRACTALES 42 LISTES CHAÎNÉES 43 DISQUES & GUIRLANDES 44 LISTES DE CARACTÈRES 45 TAPIS DE SIERPIŃSKI 46 SUITE DE SYRACUSE 47 ENVELOPPE D'UN NUAGE DE POINTS 48 MARCHES DE GRAHAM & JARVIS 49 ANALYSE D'EXPRESSIONS 50 CONVERSION D'EXPRESSIONS 51 DÉTECTION DE PALINDROMES 52 TOURS DE HANOÏ 53 REMPLISSAGE DE FORMES 54 PARCOURS D'UN LABYRINTHE 55 GÉNÉRATION D'UN LABYRINTHE 56 TRI PAR DÉNOMBREMENT 57 TRI COCKTAIL 58 REPRÉSENTATION DES TRIS 59 TRIS SUR LISTES 60 REPRÉSENTATION DE L'ADN 61 NOMBRES DE GRANDE TAILLE 62 TABLE DE SYMBOLES 63 PLUS LONGUE SOUS-SÉQUENCE COMMUNE 64 ARBRES BINAIRES Supports de cours vol.3 – Période 2005-2014 Corrigés de travaux pratiques Ce recueil est le troisième volume d’une série de trois documents, comprenant également le support de cours (volume 1) et un recueil de sujets de travaux pratiques (volume 2). Ils ont été écrits pour différents enseignements d’algorithmique et de programmation en langage C donnés à la Faculté d’ingénierie de l’Université Galatasaray (Istanbul, Turquie), entre 2005 et 2014. Ce troisième et dernier volume contient les corrigés des 64 sujets de travaux pratiques (TP) et d’examen regroupés dans le deuxième volume. Malgré tout le soin apporté à la rédaction de ces corrigés, il est probable que des erreurs s’y soient glissées. Merci de nous contacter afin de nous indiquer tout problème détecté dans ce document. Il faut également remarquer qu’il s’agit de TP donnés dans le cadre d’un cours d’introduction, aussi les notions abordées le sont parfois de façon simplifiée et/ou incomplète. Les conventions utilisées dans ces corrigés sont les mêmes que pour les sujets. Veuillez donc vous référer au deuxième volume pour en connaitre le détail. À noter que la description des outils utilisés, de leur installation et de leur configuration est également traitée dans le deuxième volume. Damien Berthet & Vincent Labatut le 19 juillet 2014 Correction TP 01 Algorithmique et programmation 1/2 Université Galatasaray Faculté d’ingénierie et de technologie – Génie informatique Algorithmique et programmation Damien Berthet & Vincent Labatut Correction TP 01 entrées-sorties 3 Entrées/sorties non-formatées Exercice 1 int main() { char c; c=getchar(); putchar(c); putchar('\n'); return EXIT_SUCCESS; } Exercice 2 int main() { char c1,c2; c1=getchar(); // on saisit le premier caractère getchar(); // on consomme le retour chariot restant dans le buffer c2=getchar(); // on saisit le second caractère putchar(c1); // on affiche le premier caractère putchar('\n'); // on va à la ligne putchar(c2); // on affiche le second caractère putchar('\n'); // on va à la ligne return EXIT_SUCCESS; } Au premier appel de getchar, on saisit deux caractères :  le caractère entré par l’utilisateur  le caractère de fin de ligne '\n' La fonction getchar n’utilise que le premier caractère, le second reste dans le buffer. Au deuxième appel de getchar, la fonction trouve le caractère '\n' dans le tampon, et l’utilise sans attendre que l’utilisateur entre un caractère via le clavier. Il faut un troisième appel de getchar pour que l’utilisateur puisse saisir son second caractère. Il est important de ne pas oublier de vider le tampon quand on utilise des entrées/sorties bufférisées. Il existe deux méthodes :  consommer les caractères présents dans le tampon, par exemple avec un ou plusieurs getchar.  utiliser la fonction fflush(stdin), qui permet parfois de vider le tampon. Parfois seulement, car le comportement de cette commande n’est pas défini (dans la norme) pour les flux d’entrée, donc on ne peut pas être certain de vider effectivement le tampon. 4 Sorties formatées Exercice 3 int main() { double x1=1.2345; double x2=123.45; entrées-sorties Correction TP 01 Algorithmique et programmation 2/2 double x3=0.000012345; double x4=1e-10; double x5=-123.4568e15; printf("%%f:%f\t%%e:%e\n",x1,x1); printf("%%f:%f\t%%e:%e\n",x2,x2); printf("%%f:%f\t%%e:%e\n",x3,x3); printf("%%f:%f\t%%e:%e\n",x4,x4); printf("%%f:%f\t%%e:%e\n",x5,x5) return EXIT_SUCCESS; } Exercice 4 int main() { float x1=12.34567f; float x2=1.234567; float x3=1234567; float x4=123456.7; float x5=0.1234567; float x6=1234.567; printf("%15.2f\t%15.2f\n",x1,x2); printf("%15.2f\t%15.2f\n",x3,x4); printf("%15.2f\t%15.2f\n",x5,x6); return EXIT_SUCCESS; } Exercice 5 int main() { printf("%%d:%d \n",1234.5678f); printf("%%f:%f \n",1234.5678f); printf("%%e:%e \n",1234.5678f); return EXIT_SUCCESS; } On observe qu’il est possible d’afficher un réel en tant qu’entier (le contraire est également vrai), sans que le compilateur ne relève d’erreur, et sans provoquer de bug : il n’y a donc ni erreur de compilation, ni erreur d’exécution. 5 Entrées formatées Exercice 6 int main() { int x; printf("entrez un entier : "); scanf("%d",&x); printf("le triple de %d est : %d\n",x,3*x); return EXIT_SUCCESS; } Exercice 7 int main() { int h,m,s; printf("entrez l'heure (hh:mm:ss) : "); scanf("%d:%d:%d",&h,&m,&s); printf("%2d heures\n",h); printf("%2d minutes\n",m); printf("%2d secondes\n",s); return EXIT_SUCCESS; } Correction TP 02 Algorithmique et programmation 1/3 Université Galatasaray Faculté d’ingénierie et de technologie – Génie informatique Algorithmique et programmation Damien Berthet & Vincent Labatut Correction TP 02 types simples 1 Caractères Exercice 1 int main() { unsigned char c; // on saisit le caractère printf("Entrez un caractere : "); c=getchar(); // on affiche les informations demandées printf("Le code ASCII de '%c' est %d\n",c,c); printf("Le caractere suivant dans la table ASCII est '%c'\n",c+1); return EXIT_SUCCESS; } Il faut bien faire attention à utiliser une variable de type unsigned char, car les codes ASCII sont compris entre et , et le type char (signé) est limité à des valeurs comprises entre et , ce qui pose problème lors de l’affichage du code ASCII. Ainsi, pour le caractère ü, on obtient au lieu de . Exercice 2 int main() { unsigned char c; int c; printf("Entrez le code ASCII : "); scanf("%d",&c); printf("Le caractere correspondant au code ASCII %d est '%c'\n",c,c); return EXIT_SUCCESS; } 2 Entiers Exercice 3 int main() { int v1 = 12 ; int v2 = 4294967284; printf("entiers naturels : 12=%x et 4294967284=%x\n",v1,v2); printf("entiers relatifs : 12=%u et 4294967284=%u\n",v1,v2); printf("entiers relatifs : 12=%d et 4294967284=%d\n",v1,v2); return EXIT_SUCCESS; } L’affichage au format hexadécimal donne la décomposition en base des entiers et , c'est-à-dire :  ( )  ( ) . types simples Correction TP 02 Algorithmique et programmation 2/3 On en déduit que ces nombres sont codés par les suites de bits suivantes :  12 : 0000 0000 0000 0000 0000 0000 0000 1100  4294967284 : 1111 1111 1111 1111 1111 1111 1111 0011 Lorsqu’on réalise l’affichage en tant qu’entiers non-signés, les valeurs affichés sont les valeurs binaires des suites de bits, soit les valeurs attendues et Par contre, l’affichage en tant qu’entiers signés donne et . C’est normal, puisque les octets codants sont interprétés comme la valeur en complément à de 1111 1111 1111 1111 1111 1111 1111 0011, qui est bien car . Exercice 4 int main() { printf("valeur +4 : decimal=%2d octal:%11o hexadecimal=%8X\n",4,4,4); printf("valeur -4 : decimal=%d octal:%o hexadecimal=%X\n",-4,-4,-4); return EXIT_SUCCESS; } Les affichages de la valeur positive sont normaux. Pour la valeur négative, on obtient des valeurs aberrantes en octal et en hexadécimal, ce qui est normal puisque ces format permettent d’afficher seulement des valeurs non-signées. Ainsi, en hexadécimal on obtient ( ) , soit ( ) . Ce nombre est le complément à deux de ( ) , qui correspond bien à la valeur ( ) : on a bien une représentation du nombre négatif en complément à . Exercice 5 int main() { short x,y; printf("Entrez la valeur de x : "); scanf("%hd",&x); printf("Entrez la valeur de y : "); scanf("%hd",&y); printf("x+y=%hd\n",x+y); return EXIT_SUCCESS; } Pour les calculs proposés, on obtient des valeurs aberrantes, pour cause de dépassement de la capacité du type short. Dans le premier cas, on obtient un résultat supérieur à , qui est considéré comme un nombre négatif en raison du codage utilisé pour représenter les entiers signés (complément à deux). Dans le second cas, on obtient un résultat inférieur à , qui est considéré comme un positif pour la même raison. 3 Réels Exercice 6 La constante 0.1f est uploads/s3/ algorithmique-amp-programmation-en-langage-c-vol-3-corriges.pdf

  • 17
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager