Vous êtes sur la page 1sur 4

UFR-ST /MPCI avril 2023

Contrôle d’algorithmique et programmation


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)

Vous aimerez peut-être aussi