3heures - sans document Exercice 1 (4 points) Les fonctions suivantes comportent une erreur car des lignes ont été permutées. On vous demande d’indiquer juste les numéros des lignes à permuter pour corriger l’erreur. a) 1. Int chercheCaracter(char *chaine, char caract){ 2. int i, n; 3. n=0 ; 4. i = 0 ; 5. if (chaine[i] == caract ){ 6. while( chaine[i]!=’\0’ ){ 7. n++; } 8. i++; } 9. return n ; }
Il faut échanger les lignes 5 et 6 (2points)
b)
1. int * creerTableau(int n){
2. int *T, i ; 3. if(T==NULL) { 4. exit(0); } 5. T = (int*)malloc(n*sizeof(int)) ; 6. for(i=0 ; i<n ; i++){ 7. T[i] = i ; 8. } 9. return T ; }
Déplacer la ligne 5 entre les lignes 2 et 3 (2 points)
Exercice 2 (8 points) On vous demande de simuler l’exécution des fonctions suivantes en utilisant les valeurs données dans chaque cas: a) z=9, z=17, en déduire ce que la fonctionA fait. (3points) int fonctionA(int z){ int i,n; i=1; n=0; Z=9 Je rentre dans la boucle while(i<=z/2 and n<2){ I=1 , z%i=0, n=1 if( z%i==0) { I=2 I=3, z%i=0, n=2 : je quitte la boucle n=n+1; } i=i+1; N= 2 return 1* ----------- } Z=17 if (n==2) { I=1, z%i=0, n=1 I=2 return 1 ; } I=3 else { .. I=8 n=1, je quitte la boucle return 0; } N=1 return 0 } La simulation fait 2 points
La fonctionA retourne 1 si Z est premier et 0 sinon (1point)
b) m=2, n=2 (2,5points) int fact(int m, int n){ Fact(2,2) = fact(1,fact(2,1)) int f; Fact(2,1) = fact(1,2)=2x2=4 if (m==1){ Fact(1,fact(2,1)) = fact(1,4)=4*2=8 f=n*2; } else{ La simulation fait 2,5 points if (n==1){ f=fact(m-1,2); } else { f = fact(m-1,fact(m,m-1)); } } return f ; } c) r=2, n=4, en déduire ce que fait la fonction mpcist (2,5 points)
float mpcist (float r, int n){
Mpcist(2,4)= mpcist(2,3)*2 if (n=0){ =mpcist(2,2)*2*2 =mpcist(2,1)*2*2*2 return 1;} =mpcist(2,0)*2*2*2*2 =2*2*2*2 else{ La Simulation fait 1,5point return mpcist(r,n-1)*r - } La fonctions calcule r puissance n Ce que fait la fonction (1 point) } Exercice 3 (8 points) a) Écrire un programme qui utilise l’allocation de mémoire pour définir un tableau de n entiers et le remplit avec une liste d’entiers relatifs. Le programme doit permettre à l’utilisateur de saisir le nombre d’entiers à lire. Le programme affichera ensuite la somme des entiers positifs et le nombre d’entiers nuls contenus dans le tableau. (4 points) #include<stdlib.h> #include<stdio.h> int main(){ int n, i nbp, nbnul; int *tab printf(‘’Veuillez entrer le nombre d’entiers à saisir\n’’); scanf(“%d”,&n); tab = (int *) malloc(n*sizeof(int)); //Arrêt du programme en d’échec d’allocation if(tab ==NULL){ printf(“Echec Allocation mémoire\n”); exit(0); } //Saisie des entiers par l’utilisateur for(i=0 ; i<n ; i++){ printf(“entrer le %e entier”,i+1); scanf(“%d ”, tab+i) }
//et calcul des sommes positif et le nombre de zéros
nbp=0, nbnul=0; for(i=0 ; i<n ; i++){ if (*(tab+i) >0){ nbp= nbp+1; } else { if(*(tab+i) ==0){ nbnul = nbnul+1 ; } } printf(“ La somme des positifs = %d\n La somme des zéros est %d\n”nbp,nbnul); return 0; }
b) On demande de construire un algorithme (en langage c ou en pseudo code ) qui lit
3 nombres réels représentant les cotés d’un triangle puis affiche le type du triangle. Un triangle peut être de type équilatérale (3 côtés égaux), isocèle(2 côtés égaux), isocèle rectangle, rectangle ou quelconque. (4 points) Variable a, b, c : entier afficher(‘’ veuillez entrez les 3 côtés du triangle Lire(a,b,c) si (a=b et b=c) alors afficher’(‘’le triangle est équilatérale’’) sinon {cas des triangles non équilaterale} si (a=b ou a=c ou b=c ) alors aficher(‘’le triangle isocèle) si (b*b=a*a+c*c ou si a*a = b*b + c*c ou c*c =a*a+b*b) alors afficher(‘’ et rectangle’’) sinon {cas des triangles non isocèle} si (b*b=a*a+c*c ou si a*a = b*b + c*c ou c*c =a*a+b*b) alors afficher(‘’le triangle est rectangle’’) sinon afficher(‘’Le triangle est quelconque)