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;