Série 5 - Moodle
Transcription
Série 5 - Moodle
Série 5 - correction Exercice 1 (niveau 1): Formatted output with printf a)10523 b)25 c)3.141590 d)25 e)10523 f)1052325 g)1052325 h)000010523 i)25 j)3.14salut! k)3.14salut! l)3.14salut! m)03.14 n)03.14 o)3.1415 Exercice 2 (niveau 1): Input verification with scanf • • The warning occurs because scanf expects you to provide it with the address of the variables that you want to put value into. Therefore, you must precede n with an ampersand: scanf("%d",&n). Entering an invalid input to the program may cause various problems. In this case, the execution of the program would continue with the variable n unchanged (still 0 after the scanf). To avoid this behavior we must verify the validity of the input by using the return value of the scanf function. It returns the number of the items it could successfully read. Below, you can find the updated code which avoids the unexpected behavior. #include<stdio.h> #include<stdlib.h> intmain(void) { inti,n; intsum=0; intnew_number=0; printf("Enterhowmanynumbersyouwanttosum:\n"); if(scanf("%d",&n)!=1) { printf("Invalidinput!Youmustenteraninteger.Exiting...\n"); returnEXIT_FAILURE; } for(i=0;i!=n;++i) { } printf("Enternumber%d:\n",i+1); if(scanf("%d",&new_number)!=1) { printf("Invalidinput!Youmustenteraninteger.Exiting...\n"); returnEXIT_FAILURE; } sum+=new_number; } printf("Thesumofthenumbersis%d",sum); returnEXIT_SUCCESS; Exercice 4 (niveau 2): code ASCII d'un caractère Programme qui affiche la code ASCII d’un caractère lu au clavier #include<stdio.h> #include<stdlib.h> intmain(void) { printf("%d\n",getchar()); returnEXIT_SUCCESS; } on peut faire tourner le programme precedent ou écrire le suivant Il s'agit de la valeur du code ASCII du caractère. #include<stdio.h> #include<stdlib.h> intmain(void) { printf("'A'=%d'B'=%d'C'=%d\n",'A','B','C'); printf("'a'=%d'b'=%d'c'=%d\n",'a','b','c'); printf("'0'=%d'2'=%d'3'=%d\n",'0','2','3'); printf("'?'=%d''=%d\n",'?',''); returnEXIT_SUCCESS; } Le résultat est : 'A' = 65 'B' = 66 '0' = 48 '2' = 50 '?' = 63 ' ' = 60 Type et valeur des expressions : 'C' = 67 '3' = 51 Type char et valeur 'F' Type char et valeur 'g' Type int et valeur 5 Exercice 5 (niveau 1): codage d’un message secret Le programme va travailler sur le contenu du buffer d’entrée. Il n’y pas besoin de tableau (vu au chap 7 plus tard). On utilisera la redirection des entrées sorties pour travailler avec des fichiers tests. Pseudocode (traduit la donnée sous une forme structurée en restant en langage naturel) : Lire la quantité de décalage en garantissant l’intervalle autorisé Boucle_Faire Lire un caractère Si le caractère lu est l’espace Afficher un espace Sinon si le caractère lu est le passage à la ligne Afficher un passage à la ligne Sinon Afficher le caractère décalé Tant que le caractère lu est différent du passage à la ligne Code avec des instructions de contrôle simples: #include<stdio.h> #include<stdlib.h> intmain(void) { intcompte=0,decalage=0,echec=0; charcar_lu; //lecturedudécalage do { echec=0; printf("quantitédedécalage[-4,4]:\n"); compte=scanf("%d",&decalage); if(compte==1) { if(decalage<-4)echec=1; if(decalage>4)echec=1; } elseechec=1; }while(echec==1); while(getchar()!='\n');//videlebufferd’entrée //codage do { car_lu=getchar(); if(car_lu=='') printf("%c",car_lu); elseif(car_lu=='\n') printf("%c",car_lu); else printf("%c",car_lu+decalage); }while(car_lu!='\n'); returnEXIT_SUCCESS; } Exercice 6 (niveau 1): Redirection des entrées-sorties Ré-utiliser les exemples donnés en remplaçant prog par le nom de votre exécutable Exercice 7 (niveau 1): détection de passage à la ligne et de fin des entrées À compléter en donnant le code qui teste si la valeur renvoyé par scanf vaut EOF, ou en faisant des tests sur getchar. Dans ce second cas il faut mémoriser le caractère lu pour le tester vis-à-vis des 3 cas \n , \r et EOF. Exercice 8 (niveau 2): chemin dans une grille 2D On pourrait se passer du tableau à 2 indices en détectant le point d’indice de ligne le plus faible et en partant de ce point vers l’autre point. Cette alternative, bien que possible, est plus complexe à implémenter. Utiliser un tableau est bien plus pratique. Nous préférons utiliser un tableau à 2 indices également pour se familiariser avec cet outil. Pour le problème posé, on utilise un tableau de int à 2 indices pour représenter la grille NxN. Chaque case est identifiée par un indice de ligne et un indice de colonne entre 0 et N-1. Le tableau permet de mémoriser un entier EMPTY pour les cases vides, un entier START / END pour les points de départ et d’arrivée, et un entier PATH pour les points de passage. On utilise aussi 2 petits tableaux à un indice pour représenter les points. Pseudocode : Lecture de N et des coordonnées des 2 points Initialisation du tableau Remplissage du chemin dans le tableau Affiche la grille, ligne par ligne. #include<stdlib.h> #include<math.h> #include<stdio.h> #defineN10 #defineLIGNE0 #defineCOLONNE1 #defineEMPTY0 #definePATH1 #defineSTART2 #defineEND3 intmain(void) { intchemin[N][N]; intp1[2],p2[2]; inti,j,incr; printf("ligne1col1ligne2col2:"); scanf("%d%d%d%d",&p1[LIGNE],&p1[COLONNE], &p2[LIGNE],&p2[COLONNE]); for(i=0;i<N;i++) for(j=0;j<N;j++) chemin[i][j]=EMPTY; chemin[p1[LIGNE]][p1[COLONNE]]=START; chemin[p2[LIGNE]][p2[COLONNE]]=END; if(p1[COLONNE]!=p2[COLONNE]) { } incr=p1[COLONNE]<p2[COLONNE]?1:-1; for(i=p1[COLONNE]+incr;i!=p2[COLONNE]+incr;i+=incr) chemin[p1[LIGNE]][i]=PATH; } if(p1[LIGNE]!=p2[LIGNE]) { incr=p1[LIGNE]<p2[LIGNE]?1:-1; for(i=p1[LIGNE]+incr;i!=p2[LIGNE];i+=incr) chemin[i][p2[COLONNE]]=PATH; } for(i=0;i<N;i++) { for(j=0;j<N;j++) { switch(chemin[i][j]) { caseEMPTY: printf("O"); break; casePATH: printf("X"); break; caseSTART: printf("S"); break; caseEND: printf("E"); break; } } printf("\n"); } returnEXIT_SUCCESS;