20 Février 2017 - Introduction à la programmation - Pr.
Randon-Furling - Groupe TP3
Nom et Prénom :
Corrigé Contrôle continu 1
Hicham Janati
1 Bases du langage C (12 pts)
1. Un programme C ne nécessite pas forcément une fonction main.
A. Vrai B. Faux ( Sauf pour les programmes système, utilisés dans construction de l’OS )
2. Après la compilation, le rôle d’un est d’exécuter le code écrit en langage machine (binaire) :
A. éditeur B. ordinateur C. RAM D. processeur
3. Liez chaque(s) expression(s) / symbole(s) à sa signification en complétant le tableau :
1. a == b
(a) on ajoute à a la valeur de b
2. ; 1 h
(b) désigne la fin d’une fonction
3. main 2 k
(c) reste de la division de a par b 3 g
4. if...else if...else
(d) la division de a par b 4 f
5. a != b 5 e
(e) évalue la différence de a et b
6. return 6 b
(f) raisonnement par condition
7. a%b 7 c
(g) fonction principale d’un programme C 8 d
8. a/b
(h) évalue l’égalité de a et b 9 j
9. a=b 10 i
(i) boucle
10. for 11 i
(j) affecte la valeur de b à a
11. while 12 a
(k) fin d’une instruction
12. a += b
Nous supposons que les bouts de code des questions 4 à 7 fonctionnent sans erreurs à la compi-
lation.
4. Quel est la sortie du programme suivant :
1 # include < stdlib .h >
2 # include < stdio .h >
3 int main (){
4 float a ;
5 a = 1;
6 printf ( " % f " ,a );
7 return 0;
8 }
A. 1 B. 0 C. On ne peut pas savoir
5. Quel est la sortie du programme suivant :
1 # include < stdlib .h >
2 # include < stdio .h >
3 int main (){
4 float a ;
5 scanf ( " % f " ,& a );
6 printf ( " % f " ,a );
7 return 0;
8 }
A. 1 B. 0 C. On ne peut pas savoir. ça dépend de ce qu’a saisit l’utilisateur
6. Quel est la sortie du programme suivant :
1 # include < stdlib .h >
2 # include < stdio .h >
3 int main (){
4 float a = 1;
5 scanf ( " % f " ,& a );
6 a = -5;
7 \\ a = 10;
8 printf ( " % f " ,a );
9 return 0;
10 }
A. -5 ( La ligne 7 est ignorée, il s’agit d’un commentaire) B. 10 C. 1 D. On ne peut pas savoir
7. Quel est la sortie du programme suivant :
1 # include < stdlib .h >
2 # include < stdio .h >
3 int Main (){
4 float a = -1;
5 if ( a != -1){
6 a = a + 2;
7
8 else {
9 a == a + 1;
10 }
11 printf ( " % f " ,a )
12 return 0;
13 }
A. 0 B. -1 C. 1
8. On se rend compte que le code de la question 7 ne compile pas, cherchez l’éventuelle(s) erreur(s)
en indiquant la ligne correspondante et l’erreur commise : 4. Main écrit avec un M Maj. 7. Il faut
fermer l’accolade du if. 9. Un seul = pour affecter ! 11. point-virgule.
Page 2
9. Complétez le code suivant de sorte que le programme affiche la valeur absolue d’un nombre saisi
par l’utilisateur.
1 # include < stdlib .h >
2 # include < stdio .h >
3 int main (){
4
5 float x , abs ;
6 printf ( " Saisissez un nombre x :\ n " );
7 scanf ( " % f " ,& x );
8
9 if (x <0) abs = -x ;
10 else abs = x ;
11
12 printf ( " | x | = % f \ n " , abs );
13 return 0;
14 }
2 Exercice (12 pts)
Contexte
Autour d’un géant gâteau d’anniversaire, vous fêtez en famille les 8 ans de votre petite sœur qui se demande
en quel jour de la semaine est-elle née :
— Le père : c’était un Samedi ou un Dimanche je crois.
— La mère : Non ce n’est pas possible. Je me souviens avoir passé la nuit du Dimanche à la clinique.
— Le père : Si c’était en cours de semaine, je m’en serais rappelé.
— Vous : Stop ! Donnez moi 20 minutes je vous trouve la solution !
Le but de cet exercice est de retrouver le jour de la semaine correspondant à une date (annee, mois, jour).
Le problème sera abordé en plusieurs étapes. Les questions sont en chaı̂ne mais peuvent être traitées utilisant les
résultats intermédiaires.
1. (2pts) Une année est dite bissextile si elle est soit : (1) multiple de 4 sans être multiple de 100, ou bien (2)
multiple de 400. Écrire une fonction Bissextile qui prend un int an en argument, et renvoie 1 si
l’année est bissextile et 0 sinon. Exemple : Bissextile(2017) et Bissextile(2100) valent 0, Bissextile(2016)
et Bissextile(2400) valent 1
1 int Bissextile ( int an )
2 {
3 if ((( an % 4 == 0) && ( an %100!=0)) || ( a %400 == 0))
4 // si ( an multiple de 4 ET pas multiple de 100) OU ( multiple de 400):
5 return 1;
6 else
7 return 0;
8 }
Page 3
2. (3pts) Étant donnée une année an>1990, écrire une fonction JoursAvant qui prend un int an en
argument et renvoie le nombre de jours qui se sont écoulés entre le 1 Janvier 1990 et le 1er
Janvier de an. Indication : Vous aurez besoin de la fonction Bissextile.
1 int JoursAvant ( int an ){
2 int i , res =0;
3 // pour chaque ann é e i depuis 1990:
4 for ( i =1990; i < an ; i ++){
5 if ( Bissextile ( i ) == 1) res += 366;
6 else res += 365;
7 }
8 return res ;
9 }
3. (3pts) Nous allons noter les mois de l’année par des entiers entre 0 et 11. Étant donnés une année an et un mois
mois. Écrire une fonction JoursApres qui prend les deux ints en arguments et renvoie le nombre
de jours qui se sont écoulés de l’année en cours i.e entre le 1 Janvier ann et le 1er du mois / an.
1 int JoursApres ( int an , int mois ){
2 int i , res = 0;
3 // pour chaque mois i :
4 for ( i =0; i < mois ; i ++){
5 // si c ’ est fevrier :
6 if ( i ==1){
7 res += 28;
8 // Si l ’ ann é e est bissextile , F é vrier fait 29
9 if ( Bissextile ( an ) == 1) res += 1;
10 }
11 /* si i fait partie des mois qui font 30 (3 ,5 ,8 ,10) , soit pair et
12 sup é rieur à 7 ou impaires et inf é rieurs à 6. 1 n ’ est pas concern é à
13 cause du else if : si i == 1 , on ne rentre pas ici de toute mani è re
14 car ce cas a é t é trait é avant . */
15 else if ( (( i %2==0 && i >7) || ( i %2!=0 && i <6))) res += 30;
16 else res += 31;
17 }
18 return res ;
19 }
4. (1pt) En utilisant 2 et 3 Écrire une fonction JoursTotal qui prend en paramètres le triplet d’entiers
an, mois, jour et renvoie le nombre de jours total s’étant écoulés entre le 1er Janvier 1990 et la
date donnée par le triplet.
1 int JoursTotal ( int an , int mois , int jour ){
2 // Il suffit de sommer le tout !
3 return JoursAvant ( an ) + JoursApres ( an , mois ) + jour ;
4 }
5. (1pts) Sachant que le 1er Janvier 1990 était un Lundi, écrire la fonction main qui demande à l’utilisateur
de saisir le triplet (an, mois, jour) et affiche à l’écran le numéro du jour de la semaine (de 0 à 6,
0 étant le Lundi).
1 # include < stdio .h >
2 int main (){
3 int an , mois , jour , nbr ;
4 printf ( " Saisir l ’ ann ée , le mois et le jour : " );
5 scanf ( " %d ,% d ,% d " , an , mois , jour );
6 nbr = JoursTotal ( an , mois , jour );
7
8 // On affiche ce nombre :
Page 4
9 printf ( " Le nombre total de jour est : % d \ n " , nbr );
10
11 // On d é termine le jour :
12 printf ( " Ce jour é tait : % d \ n " , nbr %7);
13
14 return 0;
15 }
6. (1pts) Quel jour de la semaine était le 25 Mars 2004 ? (Donnez le nombre de jour renvoyé par la fonction
JoursTotal également). Indication : Attention, n’oubliez pas que l’on commence toujours à 0, à la saisie, prenez
en considération le fait que le 1er Février correspond t au mois 1, jour 0.
On obtient 4 : Jeudi ! 5197 jours.
Page 5