Académique Documents
Professionnel Documents
Culture Documents
Durée : 1 heure
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
C-Programmation (~ 40%)
Il est demandé d’écrire un programme en langage C qui répond au cahier de charges suivant :
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).
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 : }