Vous êtes sur la page 1sur 7

Génie informatique initiation - UE GEP2004L - Examen partiel du 25/10/2022

Durée : 1 heure

Nom Prénom N° étudiant

IMPORTANT :
Si l’indentation de vos programmes est mauvaise, vous aurez une pénalité de -2 points sur la
note finale.

A-Algorithme (~ 20%)
Programmer en C l’algorithme suivant permettant de savoir si un mot est un palindrome. Un mot est
un palindrome s’il peut se lire indifféremment de gauche à droite ou de droite à gauche.

Algorithme : Palindrome
Variables :
mot { chaîne de caractères contenant au maximum 50 caractères }
t, i, ctrl, valid { entiers }
flag { booléen }
Début
Afficher “Saisissez un mot : ”
Saisir mot
flag ← vrai
lg ← longueur(mot)

Pour i ← 0, 1, …, lg/2
Si mot[i] est différent de mot[lg-1-i]
flag ← faux
sortir
Fin Pour

Si flag = faux
Afficher “Le mot saisi n’est pas un palindrome”
Sinon
Afficher “Le mot saisi est un palindrome”
Fin

B-Connaissances théoriques (~ 15%)


1. Par quelle ligne doit-on remplacer la ligne
int main()
afin de permettre au programme (et donc à la fonction main) de prendre des arguments en
entrée.
2. Expliquez la différence entre ‘Z’ et “Z”. Faire un dessin qui explique cette différence en
mémoire.
3. Quelle(s) ligne(s) de code du langage C permet(tent) de vider le tampon du clavier ?

C-Programmation (~ 40%)
Il est demandé d’écrire un programme en langage C qui répond au cahier de charges suivant :

● Le programme doit permettre à l’utilisateur de saisir 4 valeurs entières comprises entre 0 et


10.

1
● Le programme affiche un histogramme sous la forme de barres horizontales des 4 valeurs
saisies en signalant les valeurs qui excèdent 10, comme dans l’exemple ci-dessous.
● Enfin, le programme calcul et affiche la valeur minimum et la moyenne des valeurs saisies.

Exemple :
Saisissez 4 valeurs : 4 3 13 5
====
===
========== * WARNING *
=====
min = 3 , moyenne = 6.250000

D-Debug (~ 25%)
Le programme reporté ci-dessous permet à l’utilisateur de saisir deux vecteurs de 3 éléments chacun,
puis calcule et affiche leur produit vectoriel. Si le produit vectoriel est le vecteur nul, le programme
signale que les vecteurs sont colinéaires.

Exemples d’exécution :
$ ./prodvec
Saisissez a (3 elements) : 1 0 0
Saisissez b (3 elements) : 0 1 0
a x b = (0.000000 0.000000 1.000000)

$ ./prodvec
Saissez a (3 elements) : 1 2 3
Saissez b (3 elements) : 2 4 6
a et b sont colineaires

01 : /* prodvec.c */
02 :
03 : #include <stdio.h>
04 :
05 : //#define N 3
06 :
07 : int main()
08 : {
09 : float a[N], b[N], c[N];
10 :
11 : printf("Saisissez a (%i elements) : ", N);
12 : for(i=0 ; i<N ; ++i) scanf("%f", &a[i]);
13 : printf("Saisissez b (%i elements) : ", N);
14 : for(i=0 ; i<N ; ++i) scanf("%f", &b[i]);
15 :
16 : c[0] = a[1]*b[2] - b[1]*a[2];

2
17 : c[1] = a[2]*b[0] - b[2]*a[0];
18 : c[2] = a[0]*b[1] - b[0]*a[1];
19 :
20 : if(c[0]==0.0 & c[1]==0.0 & c[2]==0.0);
21 : {
22 : printf("a et b sont colineaires\n")
23 : }
24 : else
25 : {
26 : printf("a x b = (%i %i %i)\n", c[1], c[2], c[3]);
27 : }
28 : return EXIT_SUCCESS;
29 : }

Malheureusement le programme est bogué, et lors de la compilation nous obtenons les messages
reportés ci-dessous. Trouver et corriger les erreurs dans le programme (répondre directement sur
la feuille).

$ gcc -W -Wall -std=c99 prodvec.c -o prodvec


debug_prodvec.c:9:11: error: use of undeclared identifier 'N'
float a[N], b[N], c[N];
^
debug_prodvec.c:9:17: error: use of undeclared identifier 'N'
float a[N], b[N], c[N];
^
debug_prodvec.c:9:23: error: use of undeclared identifier 'N'
float a[N], b[N], c[N];
^
debug_prodvec.c:11:40: error: use of undeclared identifier 'N'
printf("Saissez a (%i elements) : ", N);
^
debug_prodvec.c:12:7: error: use of undeclared identifier 'i'
for(i=0 ; i<N ; ++i) scanf("%f", &a[i]);
^
debug_prodvec.c:12:13: error: use of undeclared identifier 'i'
for(i=0 ; i<N ; ++i) scanf("%f", &a[i]);
^
debug_prodvec.c:12:15: error: use of undeclared identifier 'N'
for(i=0 ; i<N ; ++i) scanf("%f", &a[i]);
^
debug_prodvec.c:12:21: error: use of undeclared identifier 'i'
for(i=0 ; i<N ; ++i) scanf("%f", &a[i]);
^
debug_prodvec.c:12:39: error: use of undeclared identifier 'i'
for(i=0 ; i<N ; ++i) scanf("%f", &a[i]);
^
debug_prodvec.c:13:40: error: use of undeclared identifier 'N'
printf("Saissez b (%i elements) : ", N);
^

3
debug_prodvec.c:14:7: error: use of undeclared identifier 'i'
for(i=0 ; i<N ; ++i) scanf("%f", &b[i]);
^
debug_prodvec.c:14:13: error: use of undeclared identifier 'i'
for(i=0 ; i<N ; ++i) scanf("%f", &b[i]);
^
debug_prodvec.c:14:15: error: use of undeclared identifier 'N'
for(i=0 ; i<N ; ++i) scanf("%f", &b[i]);
^
debug_prodvec.c:14:21: error: use of undeclared identifier 'i'
for(i=0 ; i<N ; ++i) scanf("%f", &b[i]);
^
debug_prodvec.c:14:37: error: use of undeclared identifier 'b'
for(i=0 ; i<N ; ++i) scanf("%f", &b[i]);
^
debug_prodvec.c:14:39: error: use of undeclared identifier 'i'
for(i=0 ; i<N ; ++i) scanf("%f", &b[i]);
^
debug_prodvec.c:16:3: error: use of undeclared identifier 'c'
c[0] = a[1]*b[2] - b[1]*a[2];
^
debug_prodvec.c:16:15: error: use of undeclared identifier 'b'
c[0] = a[1]*b[2] - b[1]*a[2];
^
debug_prodvec.c:16:22: error: use of undeclared identifier 'b'
c[0] = a[1]*b[2] - b[1]*a[2];
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.

4
Correction
A-Algorithme
01 : /* palindrome.c */
02 :
03 : #include <stdio.h>
04 : #include <string.h>
05 :
06 : #define TAILLE 50
07 :
08 : int main()
09 : {
10 : char mot[TAILLE];
11 : int lg, flag=1;
12 : printf("Saisissez un mot : ");
13 : scanf("%s", mot);
14 :
15 : lg = strlen(mot);
16 : for(int i=0 ; i<lg/2 ; i++)
17 : {
18 : if(mot[i]!=mot[lg-i-1])
19 : {
20 : flag = 0;
21 : break;
22 : }
23 : }
24 :
25 : if(flag==0)
26 : printf("Le mot saissi n\'est pas un palindrome\n");
27 : else
28 : printf("Le mot saissi est un palindrome\n");
29 :
30 : return 0;

B-Connaissances théoriques

Voir CM

C-Programmation
01 : /* afficheur.c */
02 :
03 : #include <stdio.h>
04 :
05 : #define TAILLE 4

5
06 : #define VAL_LIMITE 10
07 :
08 : int main()
09 : {
10 : int val[TAILLE], vmax, vmin;
11 : float vmoy=0.0;
12 : int i, j, v, flag;
13 :
14 : printf("Saisissez %i valeurs : ", TAILLE);
15 : for(i=0 ; i<TAILLE ; ++i) scanf("%i", &val[i]);
16 : vmax = val[0] ; vmin = val[0];
17 : for(i=0 ; i<TAILLE ; ++i)
18 : {
19 : v = val[i];
20 : if(v > 10) { flag = 1 ; v = 10.0; } else flag = 0;
21 : for(j=0 ; j<v ; ++j) putchar('=');
22 : for(j=v ; j<10 ; ++j) putchar(' ');
23 : if(flag) printf(" * WARNING *\n") ; else printf("\n");
24 : if(val[i] < vmin) vmin = val[i];
25 : if(vmax < val[i]) vmax = val[i];
26 : vmoy += val[i];
27 : }
28 : vmoy = vmoy / TAILLE;
29 : printf("min = %i , max = %i , moyenne = %f\n", vmin, vmax, vmoy);
30 :
31 : return 0;
32 : }

D-Debug
01 : /* debug_prodvec.c */
02 :
03 : #include <stdio.h>
04 : #include <stdlib.h> //pour EXIT_SUCCESS ou bien changer EXIT_SUCCESS en 0
05 : #define N 3 //il faut décommenter cette ligne bug 1
06 :
07 : int main()
08 : {
09 : float a[N], b[N], c[N];
10 : int i; //la variable i n'était pas déclarée bug 2
11 : printf("Saissez a (%i elements) : ", N);
12 : for(i=0 ; i<N ; ++i) scanf("%f", &a[i]);
13 : printf("Saissez b (%i elements) : ", N);
14 : for(i=0 ; i<N ; ++i) scanf("%f", &b[i]);
15 :
16 : c[0] = a[1]*b[2] - b[1]*a[2];
17 : c[1] = a[2]*b[0] - b[2]*a[0];
18 : c[2] = a[0]*b[1] - b[0]*a[1];
19 :
20 : if(c[0]==0.0 && c[1]==0.0 && c[2]==0.0) //&→&&, pas de ; bugs 3, 4

6
21 : {
22 : printf("a et b sont colinéaires\n"); //manque le ; final bug 5
23 : }
24 : else
25 : {
26 : printf("a x b = (%f %f %f)\n", c[0], c[1], c[2]); //les indices doivent
être 0, 1, 2 bugs 6, 7
27 : }
28 : return EXIT_SUCCESS; //nécessite stdlib.h ou bien remplacer par 0 bug 8
(bonus)
29 : }

Vous aimerez peut-être aussi