Université Hassan II Année universitaire 2020-
ENSET MOHAMMEDIA 2021
Département Génie Electrique
GECSI 1 / SEER 1
Mme. OUHMIDA
Examen
Algorithmique et Programmation C
Durée : 3h
Partie I : Algorithmique
Questions de cours : Répondez par vrai ou faux : (2.5 pts)
1. La correction ne fait pas partie des problèmes fondamentaux de l’algorithme. [Faux]
2. Le fait de trouver une tâche pour laquelle il n’y a pas d’algorithme ne cause aucun
problème. [Faux]
3. L’algorithme réalise le programme en séquence ou en parallèle. [Faux]
4. L’opération Lire en algorithmique permet d’afficher un résultat. [Faux]
5. L’instruction Tantque permet de répéter un traitement jusqu’à ce que la condition soit
satisfaite. [Faux]
Exercice (2pts)
On donne un nombre réel X et un nombre entier N positif.
Ecrire un algorithme permettant de calculer la somme suivante :
N
X
S=∑ +X×i
i=0 i!
Algorithme CalculSomme
Variable X, Somme : réel
Variable N, i, fact, F : entier
Début
Ecrire ("Entrée le nombre X :")
Lire (X)
Ecrire ("Entrée le nombre d’itération N :")
Lire (N)
Somme 0
F1
Pour i 0 à N faire
Pour fact 1 a i faire
F F * fact
FinPour
Somme = Somme + (X/F) + X*i
FinPour
Ecrire ("La somme :" Somme)
Fin
Partie II : Programmation en Langage C
Questions de cours :
Question 1 : Choisir la(les) bonne(s) réponse(s) (1 pt)
1. Si le nombre d’itérations est connu, il est conseillé d’utiliser :
1) while …
2) do … while
3) for …
2. Soit un tableau int T[10] ; pour accéder à la troisième case du tableau T, on utilise :
1) T[3] 3) T{2}
2) T[2] 4) T(3)
Question 2 (Répondre par vrai/faux avec justification pour chaque réponse fausse)
(3.75)
1. Le passage d’arguments dans le langage C se fait :
a. Pour les constantes par valeur et pour les variables par adresse. [Faux]
Justification : possible de faire passage par valeur ou par adresse pour les deux
b. Pour les pointeurs et les tableaux par adresse, pour les variables et les constantes
par valeur. [Faux]
Justification : le passage des tableaux fait par adresse ou valeur
c. Quel que soit le type d’arguments à la fonction appelée, le passage est par valeur.
[Faux]
Justification : En peur faire un passage par adresse pour les fonction
2. En langage C, nous trouvons ces types de variable :
a. Caractère [Vrai]
Justification : ……………………………………………………………………………….
b. Booléen [Faux]
Justification : le langage C pas de type Boolean
c. Entier [Vrai]
Justification : ……………………………………………………………………………….
d. Virgule flottante [Vrai]
Justification : ……………………………………………………………………………….
3. Les instructions itératives suivantes permettent de faire des boucles, en langage
C:
a. for (instruction; instruction; instruction) instruction [Faux]
Justification : for(instructions; expression; instructions) instruction
b. while (expression) instruction [Vrai]
Justification : ………………………………………………………………………….........
c. for (expression ; expression ; expression) instruction [Faux]
Justification : for(instructions; expression; instructions) instruction
d. do instruction while (expression) [Vrai]
Justification :
…………………………………………………………………………...............
4. Ce que retourne une fonction en langage C :
a. Doit être d’un type cohérent avec le type de la fonction. [Vrai]
Justification :
…………………………………………………………………………………...
b. Peut retourner une structure. [Vrai]
Justification :
…………………………………………………………………………………...
c. Peut retourner le contenu d’un tableau. [Faux]
Justification : On peur pas retourner un tableau a la langage C
d. Ne peut retourner qu’un résultat à la fois. [Vrai]
Justification :
…………………………………………………………………………………...
Question 3 : Corriger les instructions suivantes : (2 pts)
Float a, b ; c, ; float a, b, c;
int âge ; int age,
w=20 ; w=20,
y=10 y=10;
int i=2 int i=2;
do do{
+i+; i++;
Printf (le suivant est : %f \n,i); printf ("le suivant est : %d \n ",i);
}while (i<2) }while (i<2);
printf (fin); printf ("fin ");
Question 4 : Evaluer les expressions suivantes sachant que (3 pts)
a=10 b=3 c= -2 d=2 x=10 y=8
(a) (5*X) + 2 * ((3*B) + 4) (d) A %= D++
(b) A += (X+5) (e) A = X * (B<C) + Y *! (B<C)
(c) A *= C + (X-D) (f) !(X-D+C) || D
Notez, à chaque fois, la valeur rendue comme résultat de l'expression et
les valeurs des variables dont le contenu a changé
(a (5*X) + 2 * ((3*B) + ->76 /
) 4)
(b A += (X+5) ->25 A = 25
)
(c A *= C + (X-D) ->60 A = 60
)
(d A = X * (B<C) + Y *! ->8 A=8
) (B<C)
(e A != (C *= (-D)) ->1 C=4
)
(f !(X-D+C) || D ->1 /
)
Exercice 1 (1.5 pts)
Ecrire un programme permettant de calculer la valeur médiane de trois variables réelles.
Exemple : 2 8 6 la valeur médiane est 6.
1. En utilisant des structures if imbriqués
#include <stdio.h>
int main() {
float a,b,c,k;
printf("Entree le 1 ere variable: ");
scanf("%f",&a);
printf("Entree le 2eme variable: ");
scanf("%f",&b);
printf("Entree le 3eme variable: ");
scanf("%f",&c);
if (a<b) {
if (b<c) printf("la valeur mediane est: %f",b);
else {
if (a<c) printf("la valeur mediane est: %f",c);
else printf("la valeur mediane est: %f",a);
}
} else {
if (c<b) printf("la valeur mediane est: %f",b);
else {
if (c>a) printf("la valeur mediane est: %f",a);
else printf("la valeur mediane est: %f",c);
}
}
return 0;
}
2. En utilisant l’opérateur conditionnel
#include <stdio.h>
int main() {
float a,b,c,k;
printf("Entree le 1 ere variable: ");
scanf("%f",&a);
printf("Entree le 2eme variable: ");
scanf("%f",&b);
printf("Entree le 3eme variable: ");
scanf("%f",&c);
k = (b<a) ? (b<c) ? (c<a) ? c : a : b : (a<c) ? (c<b) ? c : b : a;
printf("la valeur mediane est: %f",k);
return 0;
}
Exercice 2 (1.25 pts)
Ecrire un programme, en utilisant la boucle while, qui permet de trouver les nombres pairs de
1 à n et de calculer la somme de ses nombres. Le n est saisi par l’utilisateur.
#include <stdio.h>
int main() {
int n, k, somme = 0;
printf("Entree un nombre: ");
scanf("%d",&n);
while (k <= n) {
if(k%2 == 0 && k != 0){
printf("nombres pairs : %d \n",k);
somme += k;
}
k++;
}
printf("la somme des nombres pairs : %d \n",somme);
return 0;
}
Exercice 3 (3.5 pts)
1. Ecrire la structure permettant de présenter un nombre complexe.
typedef struct
{
double Re;
double Im;
}complexe;
2. Ecrire les fonctions suivantes :
double real_part(complex z)
double imag_part(complex z)
complex multiplication(complex z1, complex z2)
En utilisant le passage par adresse
double real_part(complex *z){
return z->Re;
}
double imag_part(complex *z){
return z->Im;
}
complex multiplication(complex *z1, complex *z2){
complex z3;
[Link] = z1->Re * z2->Re + z1->Im * z2->Im;
[Link] = z1->Re * z2->Im + z1->Im * z2->Re;
return z3;
}
En utilisant le passage par valeur
double real_part(complex z){
return [Link];
}
double imag_part(complex z){
return [Link];
}
complex multiplication(complex z1, complex z2){
complex z3;
[Link] = [Link] * [Link] + [Link] * [Link];
[Link] = [Link] * [Link] + [Link] * [Link];
return z3;
}
Exercice 4 (1.5)
Ecrire le programme C qui permet de lire et d’afficher un tableau de réels de taille N
En ordre croissant
En ordre décroissant
En ajoutant une case N+1ème qui affiche la somme de toutes les valeurs du tableau
#include <stdio.h>
#include <stdbool.h>
const int T_max = 100;
void afficher_tableau(float T[], int D) {
printf(" {");
for(int i=0; i<D; i++) {
if (i!=(D-1)) printf("%.1f, ",T[i]);
else printf("%.1f}\n\n",T[i]);
}}
void ordre_croiss(float T[], int D) {
float V;
for(int i=0; i<D; i++) {
for(int j=i+1; j<D; j++) {
if (T[j] < T[i]) {V = T[i]; T[i] = T[j]; T[j] = V;}
}
}}
void ordre_decroiss(float T[], int D) {
float V;
for(int i=0; i<D; i++) {
for(int j=i+1; j<D; j++) {
if (T[j] > T[i]) {V = T[i]; T[i] = T[j]; T[j] = V;}
}}}
float somme_tab(float T[], int D){
float somme = 0;
for(int i=0; i<D; i++) {
somme += T[i];
}
return somme;
}
int main() {
float T[T_max];
int D;
printf("Enree le dimension du tableau: ");
scanf("%d",&D);
//entree les valeurs de tableau
for(int i=0; i<D; i++) {
printf("Enree la #%d valeur: ",(i+1));
scanf("%f",&T[i]);
}
//Afichage du tableau
printf("Le tableau entree est :");
afficher_tableau(T, D);
// Le tableau on ordre croissant
printf("Le tableau on ordre croissant :");
ordre_croiss(T, D);
afficher_tableau(T, D);
// Le tableau on ordre decroissant
printf("Le tableau on ordre decroissant :");
ordre_decroiss(T, D);
afficher_tableau(T, D);
// Le tableau avec la somme
printf("Le tableau avec la somme :");
T[D] = somme_tab(T, D);
afficher_tableau(T, D+1);
return 0;
}
Bonne chance !