0% ont trouvé ce document utile (0 vote)
83 vues16 pages

Corrig e Des Exercices de Programmation en C S Erie N 1 Et S Erie N 2

Ce document présente une série d'exercices de programmation en langage C pour l'année universitaire 2024/2025 à l'Université Sultan Moulay Slimane. Les exercices incluent des tâches telles que l'affichage de nombres en hexadécimal, la permutation de nombres, le tri de nombres, la résolution d'équations du second degré, le calcul de sommes, et la création d'une calculatrice simple. Chaque exercice est accompagné d'un énoncé, d'une solution en code, et d'explications détaillées sur le fonctionnement du programme.

Transféré par

hamzaerazer84
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
83 vues16 pages

Corrig e Des Exercices de Programmation en C S Erie N 1 Et S Erie N 2

Ce document présente une série d'exercices de programmation en langage C pour l'année universitaire 2024/2025 à l'Université Sultan Moulay Slimane. Les exercices incluent des tâches telles que l'affichage de nombres en hexadécimal, la permutation de nombres, le tri de nombres, la résolution d'équations du second degré, le calcul de sommes, et la création d'une calculatrice simple. Chaque exercice est accompagné d'un énoncé, d'une solution en code, et d'explications détaillées sur le fonctionnement du programme.

Transféré par

hamzaerazer84
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Corrigé des Exercices de Programmation en C

Série N°1 et Série N°2


Université Sultan Moulay Slimane
École Supérieure de Technologie, Béni Mellal

Année universitaire : 2024/2025

Série N°1 Langage C


Exercice 1 : Afficher un nombre en hexadécimal
Énoncé : Écrire un programme en langage C qui demande à l’utilisateur un nombre
entier n et l’affiche en format hexadécimal.
Solution :
1 /* Programme pour convertir un nombre entier en h e x a d c i m a l */
2 # include < stdio .h >
3

4 int main () {
5 int n ;
6 printf ( " Entrez un nombre entier : " ) ;
7 scanf ( " % d " , & n ) ; // Lecture du nombre entier
8 printf ( " Le nombre % d en h e x a d c i m a l est : 0 x % X \ n " , n , n ) ;
// Affichage en h e x a d c i m a l
9 return 0;
10 }

Explication :
— On inclut la bibliothèque stdio.h pour utiliser printf et scanf.
— On déclare une variable n de type int pour stocker le nombre saisi.
— scanf lit l’entrée utilisateur et printf affiche le nombre en hexadécimal avec le
format %X.
— Le 0x est ajouté pour indiquer que le nombre est en hexadécimal.

Exercice 2 : Permutation de trois nombres


Énoncé : Donner un programme en langage C qui lit deux entiers entrés au clavier et
fait leur permutation. Puis qui lit trois entiers a, b et c et fait leur permutation circulaire
et affiche les nombres permutés.

1
Solution :
1 /* Programme pour permuter deux et trois nombres */
2 # include < stdio .h >
3

4 int main () {
5 int a , b , c , temp ;
6

7 // Permutation de deux nombres


8 printf ( " Entrez deux entiers a et b : " ) ;
9 scanf ( " % d % d " , &a , & b ) ;
10 printf ( " Avant permutation : a = %d , b = % d \ n " , a , b ) ;
11 temp = a ; // Sauvegarde de a
12 a = b; // a prend la valeur de b
13 b = temp ; // b prend l ’ ancienne valeur de a
14 printf ( " A p r s permutation : a = %d , b = % d \ n " , a , b ) ;
15

16 // Permutation circulaire de trois nombres


17 printf ( " Entrez trois entiers a , b et c : " ) ;
18 scanf ( " % d % d % d " , &a , &b , & c ) ;
19 printf ( " Avant permutation : a = %d , b = %d , c = % d \ n " , a , b ,
c);
20 temp = a ; // Sauvegarde de a
21 a = b; // a prend la valeur de b
22 b = c; // b prend la valeur de c
23 c = temp ; // c prend l ’ ancienne valeur de a
24 printf ( " A p r s permutation circulaire : a = %d , b = %d , c =
%d\n", a, b, c);
25

26 return 0;
27 }

Explication :
— Pour permuter deux nombres, on utilise une variable temporaire temp pour sau-
vegarder une valeur avant de l’écraser.
— Pour la permutation circulaire de trois nombres (a → b, b → c, c → a), on utilise
aussi une variable temporaire.
— Les printf affichent les valeurs avant et après permutation pour vérifier le résultat.

Exercice 3 : Trier trois nombres


Énoncé : Écrire un programme en langage C qui lit trois nombres différents x, y et
z quels qu’ils soient, et trie ces nombres dans l’ordre croissant.
Solution :
1 /* Programme pour trier trois nombres dans l ’ ordre croissant */
2 # include < stdio .h >
3

4 int main () {
5 int x , y , z , temp ;
6 printf ( " Entrez trois nombres x , y et z : " ) ;

2
7 scanf ( " % d % d % d " , &x , &y , & z ) ;
8

9 // Tri par comparaison et permutation


10 if ( x > y ) { // Si x > y , on permute
11 temp = x ;
12 x = y;
13 y = temp ;
14 }
15 if ( y > z ) { // Si y > z , on permute
16 temp = y ;
17 y = z;
18 z = temp ;
19 }
20 if ( x > y ) { // On v r i f i e nouveau x et y a p r s la
permutation p r c d e n t e
21 temp = x ;
22 x = y;
23 y = temp ;
24 }
25

26 printf ( " Les nombres t r i s dans l ’ ordre croissant : %d , %d ,


%d\n", x, y, z);
27 return 0;
28 }

Explication :
— On utilise une méthode de tri par comparaison et permutation (semblable au tri
à bulles pour trois nombres).
— On compare d’abord x et y, puis y et z, et enfin x et y à nouveau pour s’assurer
que les nombres sont bien triés.
— À la fin, x ≤ y ≤ z.

Exercice 4 : Résolution d’une équation du second degré


Énoncé : Écrire un programme en langage C qui résout une équation de second degré
de la forme ax2 + bx + c = 0. Il demande à l’utilisateur les coefficients a, b et c et donne
les solutions possibles.
Solution :
1 /* Programme pour r s o u d r e une quation du second d e g r */
2 # include < stdio .h >
3 # include < math .h >
4

5 int main () {
6 float a , b , c , delta , x1 , x2 ;
7

8 printf ( " Entrez les coefficients a , b et c de l ’ quation


ax ^2 + bx + c = 0 : " ) ;
9 scanf ( " % f % f % f " , &a , &b , & c ) ;
10

3
11 if ( a == 0) { // Cas o ce n ’ est pas une quation du
second d e g r
12 if ( b == 0) {
13 if ( c == 0) {
14 printf ( " quation i n d t e r m i n e ( toute solution
est possible ) \ n " ) ;
15 } else {
16 printf ( " Pas de solution \ n " ) ;
17 }
18 } else {
19 printf ( " quation du premier d e g r , solution : x =
% f \ n " , -c / b ) ;
20 }
21 } else {
22 delta = b * b - 4 * a * c ; // Calcul du discriminant
23 if ( delta > 0) { // Deux solutions r e l l e s distinctes
24 x1 = ( - b + sqrt ( delta ) ) / (2 * a ) ;
25 x2 = ( - b - sqrt ( delta ) ) / (2 * a ) ;
26 printf ( " Deux solutions r e l l e s : x1 = %f , x2 =
% f \ n " , x1 , x2 ) ;
27 } else if ( delta == 0) { // Une solution double
28 x1 = -b / (2 * a ) ;
29 printf ( " Une solution double : x = % f \ n " , x1 ) ;
30 } else { // Pas de solution r e l l e
31 printf ( " Pas de solution r e l l e \ n " ) ;
32 }
33 }
34

35 return 0;
36 }

Explication :
— On inclut math.h pour utiliser sqrt (racine carrée).
— On calcule le discriminant ∆ = b2 − 4ac.
— Si a = 0, ce n’est pas une équation du second degré, on traite les cas particuliers.
— Sinon, selon la valeur de ∆, on détermine le nombre de solutions :
— ∆ > 0 : deux solutions réelles distinctes.
— ∆ = 0 : une solution double.
— ∆ < 0 : pas de solution réelle.

Exercice 5 : Calcul d’une somme


Énoncé : Écrire un programme en langage C qui demande à l’utilisateur un nombre
entier n et calcule et affiche la somme suivante : S = 1 + 22 + 32 + 42 + . . . + n2 .
Solution :
1 /* Programme pour calculer la somme des c a r r s de 1 n */
2 # include < stdio .h >
3

4 int main () {
5 int n , i ;

4
6 long long somme = 0; // Utilisation de long long pour
viter un d p a s s e m e n t
7

8 printf ( " Entrez un nombre entier n : " ) ;


9 scanf ( " % d " , & n ) ;
10

11 for ( i = 1; i <= n ; i ++) {


12 somme += i * i ; // Ajout de i ^2 la somme
13 }
14

15 printf ( " La somme des c a r r s de 1 % d est : % lld \ n " , n ,


somme ) ;
16 return 0;
17 }

Explication :
— On utilise une boucle for pour parcourir les nombres de 1 à n.
— À chaque itération, on ajoute i2 à la somme.
— On utilise long long pour la somme afin d’éviter un dépassement si n est grand.

Exercice 6 : Saisie et affichage d’un caractère en ASCII


Énoncé : Écrire un programme en C qui demande à l’utilisateur de saisir un caractère
au clavier puis affiche son code ASCII.
Solution :
1 /* Programme pour afficher le code ASCII d ’ un c a r a c t r e */
2 # include < stdio .h >
3

4 int main () {
5 char c ;
6 printf ( " Entrez un c a r a c t r e : " ) ;
7 scanf ( " % c " , & c ) ; // Espace avant % c pour ignorer les
espaces ou retours la ligne
8 printf ( " Le code ASCII de ’% c ’ est : % d \ n " , c , c ) ; //
Affichage du code ASCII
9 return 0;
10 }

Explication :
— On déclare une variable c de type char pour stocker le caractère.
— On utilise scanf pour lire le caractère et printf pour afficher son code ASCII.
— En C, un char est stocké comme un entier (son code ASCII), donc on peut l’afficher
directement avec %d.

Exercice 7 : Saisie et affichage d’un caractère en majuscule


Énoncé : Écrivez un programme en C qui saisit un caractère minuscule et qui l’affiche
en majuscule.
Solution :

5
1 /* Programme pour convertir un c a r a c t r e minuscule en majuscule
*/
2 # include < stdio .h >
3

4 int main () {
5 char c ;
6 printf ( " Entrez un c a r a c t r e minuscule : " ) ;
7 scanf ( " % c " , & c ) ;
8

9 if ( c >= ’a ’ && c <= ’z ’) { // V r i f i c a t i o n si c ’ est une


lettre minuscule
10 c = c - 32; // Conversion en majuscule ( d i f f r e n c e
ASCII entre minuscules et majuscules )
11 printf ( " Le c a r a c t r e en majuscule est : % c \ n " , c ) ;
12 } else {
13 printf ( " Le c a r a c t r e saisi n ’ est pas une lettre
minuscule .\ n " ) ;
14 }
15

16 return 0;
17 }

Explication :
— On vérifie si le caractère saisi est une lettre minuscule (entre ’a’ et ’z’).
— La différence entre une lettre minuscule et sa majuscule dans la table ASCII est
de 32 (par exemple, ’a’ = 97, ’A’ = 65).
— On soustrait 32 pour convertir en majuscule.
— Si le caractère n’est pas une lettre minuscule, on affiche un message d’erreur.

Exercice 8 : Calculatrice simple


Énoncé : Écrire un programme en C réalisant une calculatrice en demandant à l’uti-
lisateur de saisir deux valeurs a et b, de type int, séparées par un opérateur op de type
char, en vérifiant qu’il s’agit de l’une des valeurs suivantes : +, -, *, /. Puis affiche le
résultat de l’opération : aopb.
Solution :
1 /* Programme pour une calculatrice simple */
2 # include < stdio .h >
3

4 int main () {
5 int a , b ;
6 char op ;
7

8 printf ( " Entrez deux nombres entiers a et b , suivis d ’ un


o p r a t e u r (+ , -, * , /) : " ) ;
9 scanf ( " % d % d % c " , &a , &b , & op ) ;
10

11 switch ( op ) {
12 case ’+ ’:
13 printf ( " % d + % d = % d \ n " , a , b , a + b ) ;

6
14 break ;
15 case ’ - ’:
16 printf ( " % d - % d = % d \ n " , a , b , a - b ) ;
17 break ;
18 case ’* ’:
19 printf ( " % d * % d = % d \ n " , a , b , a * b ) ;
20 break ;
21 case ’/ ’:
22 if ( b != 0) {
23 printf ( " % d / % d = % d \ n " , a , b , a / b ) ;
24 } else {
25 printf ( " Erreur : Division par z r o !\ n " ) ;
26 }
27 break ;
28 default :
29 printf ( " O p r a t e u r invalide !\ n " ) ;
30 }
31

32 return 0;
33 }

Explication :
— On lit deux entiers a et b et un opérateur op.
— On utilise une structure switch pour gérer les différents opérateurs.
— Pour la division, on vérifie que b n’est pas zéro pour éviter une erreur.
— Si l’opérateur n’est pas valide, on affiche un message d’erreur.

Exercice 9 : Vérification des parenthèses


Énoncé : Écrire un programme saisissant une expression arithmétique avec pa-
renthèses, de parenthèses. Dire à l’utilisateur si l’expression ne contient pas de faute
de parenthèses.
Solution :
1 /* Programme pour v r i f i e r les p a r e n t h s e s dans une expression
*/
2 # include < stdio .h >
3 # include < string .h >
4

5 int main () {
6 char expression [100];
7 int i , count = 0;
8

9 printf ( " Entrez une expression a r i t h m t i q u e : " ) ;


10 scanf ( " % s " , expression ) ;
11

12 for ( i = 0; i < strlen ( expression ) ; i ++) {


13 if ( expression [ i ] == ’( ’) {
14 count ++; // I n c r m e n t a t i o n pour une p a r e n t h s e
ouvrante
15 } else if ( expression [ i ] == ’) ’) {

7
16 count - -; // D c r m e n t a t i o n pour une p a r e n t h s e
fermante
17 }
18 if ( count < 0) { // Si on a une p a r e n t h s e fermante
avant une ouvrante
19 break ;
20 }
21 }
22

23 if ( count == 0) {
24 printf ( " L ’ expression est correcte ( p a r e n t h s e s bien
f o r m e s ) .\ n " ) ;
25 } else {
26 printf ( " L ’ expression contient une erreur de
p a r e n t h s e s .\ n " ) ;
27 }
28

29 return 0;
30 }

Explication :
— On lit une chaı̂ne de caractères représentant l’expression.
— On utilise un compteur count pour suivre le nombre de parenthèses ouvrantes non
fermées.
— Si count devient négatif, cela signifie qu’on a une parenthèse fermante avant une
ouvrante, donc une erreur.
— À la fin, si count est 0, les parenthèses sont bien formées.

Série N°2 Langage C


Exercice 1 : Plus grand et plus petit élément d’un tableau
Énoncé : Écrire un programme en C qui introduit dix nombres entiers dans un
tableau. Chercher le plus grand élément et sa position ensuite le plus petit élément et sa
position, de ce tableau.
Solution :
1 /* Programme pour trouver le plus grand et le plus petit
lment d ’ un tableau */
2 # include < stdio .h >
3

4 int main () {
5 int tableau [10] , i ;
6 int max , min , pos_max , pos_min ;
7

8 // Saisie des lments du tableau


9 printf ( " Entrez 10 nombres entiers :\ n " ) ;
10 for ( i = 0; i < 10; i ++) {
11 printf ( " lment % d : " , i + 1) ;
12 scanf ( " % d " , & tableau [ i ]) ;
13 }

8
14

15 // Initialisation avec le premier lment


16 max = tableau [0];
17 min = tableau [0];
18 pos_max = 0;
19 pos_min = 0;
20

21 // Recherche du maximum et du minimum


22 for ( i = 1; i < 10; i ++) {
23 if ( tableau [ i ] > max ) {
24 max = tableau [ i ];
25 pos_max = i ;
26 }
27 if ( tableau [ i ] < min ) {
28 min = tableau [ i ];
29 pos_min = i ;
30 }
31 }
32

33 printf ( " Le plus grand lment est % d la position % d \ n " ,


max , pos_max ) ;
34 printf ( " Le plus petit lment est % d la position % d \ n " ,
min , pos_min ) ;
35

36 return 0;
37 }

Explication :
— On déclare un tableau de 10 entiers et on le remplit avec les valeurs saisies par
l’utilisateur.
— On initialise max et min avec le premier élément du tableau.
— On parcourt le tableau pour trouver le maximum et le minimum, en mettant à
jour leurs positions.
— On affiche les résultats.

Exercice 2 : Tri d’un tableau dans l’ordre inverse


Énoncé : Écrire un programme qui lit la dimension N d’un tableau T du type int
(dimension maximale : 50 composantes), remplit le tableau par des valeurs entrées au
clavier et affiche le tableau. Ranger ensuite les éléments du tableau T dans l’ordre inverse
sans utiliser de tableau d’aide. Afficher le tableau résultant.
Solution :
1 /* Programme pour trier un tableau dans l ’ ordre inverse */
2 # include < stdio .h >
3

4 int main () {
5 int T [50] , N , i , temp ;
6

7 // Saisie de la dimension
8 printf ( " Entrez la dimension du tableau ( max 50) : " ) ;

9
9 scanf ( " % d " , & N ) ;
10 if ( N > 50 || N <= 0) {
11 printf ( " Dimension invalide !\ n " ) ;
12 return 1;
13 }
14

15 // Saisie des lments


16 printf ( " Entrez les % d lments du tableau :\ n " , N ) ;
17 for ( i = 0; i < N ; i ++) {
18 printf ( " lment % d : " , i + 1) ;
19 scanf ( " % d " , & T [ i ]) ;
20 }
21

22 // Affichage du tableau initial


23 printf ( " Tableau initial : " ) ;
24 for ( i = 0; i < N ; i ++) {
25 printf ( " % d " , T [ i ]) ;
26 }
27 printf ( " \ n " ) ;
28

29 // Inversion du tableau
30 for ( i = 0; i < N / 2; i ++) {
31 temp = T [ i ];
32 T [ i ] = T [ N - 1 - i ];
33 T [ N - 1 - i ] = temp ;
34 }
35

36 // Affichage du tableau i n v e r s
37 printf ( " Tableau i n v e r s : " ) ;
38 for ( i = 0; i < N ; i ++) {
39 printf ( " % d " , T [ i ]) ;
40 }
41 printf ( " \ n " ) ;
42

43 return 0;
44 }

Explication :
— On lit la dimension N et on vérifie qu’elle est valide.
— On remplit le tableau avec les valeurs saisies.
— Pour inverser le tableau, on parcourt la moitié du tableau et on permute les
éléments symétriques (T[i] avec T[N-1-i]).
— On affiche le tableau avant et après l’inversion.

Exercice 3 : Somme des éléments d’un tableau 2D


Énoncé : Écrire un programme qui lit les dimensions L et C d’un tableau T à deux
dimensions du type int (dimensions maximales : 50 lignes et 50 colonnes). Remplir le
tableau par des valeurs entrées au clavier et afficher le tableau ainsi que la somme de tous
ses éléments.
Solution :

10
1 /* Programme pour calculer la somme des lments d ’ un tableau
2 D */
2 # include < stdio .h >
3

4 int main () {
5 int T [50][50] , L , C , i , j ;
6 long long somme = 0; // Utilisation de long long pour
viter un d p a s s e m e n t
7

8 // Saisie des dimensions


9 printf ( " Entrez le nombre de lignes ( max 50) : " ) ;
10 scanf ( " % d " , & L ) ;
11 printf ( " Entrez le nombre de colonnes ( max 50) : " ) ;
12 scanf ( " % d " , & C ) ;
13 if ( L > 50 || C > 50 || L <= 0 || C <= 0) {
14 printf ( " Dimensions invalides !\ n " ) ;
15 return 1;
16 }
17

18 // Saisie des lments


19 printf ( " Entrez les lments du tableau :\ n " ) ;
20 for ( i = 0; i < L ; i ++) {
21 for ( j = 0; j < C ; j ++) {
22 printf ( " T [% d ][% d ] = " , i , j ) ;
23 scanf ( " % d " , & T [ i ][ j ]) ;
24 somme += T [ i ][ j ]; // Ajout la somme
25 }
26 }
27

28 // Affichage du tableau
29 printf ( " Tableau saisi :\ n " ) ;
30 for ( i = 0; i < L ; i ++) {
31 for ( j = 0; j < C ; j ++) {
32 printf ( " % d " , T [ i ][ j ]) ;
33 }
34 printf ( " \ n " ) ;
35 }
36

37 printf ( " La somme de tous les lments est : % lld \ n " ,


somme ) ;
38 return 0;
39 }

Explication :
— On lit les dimensions L et C et on vérifie qu’elles sont valides.
— On remplit le tableau 2D avec les valeurs saisies, en ajoutant chaque élément à la
somme.
— On affiche le tableau et la somme totale.
— On utilise long long pour la somme afin d’éviter un dépassement.

11
Exercice 4 : Zéro sur la diagonale principale
Énoncé : Écrire un programme qui met à zéro les éléments de la diagonale principale
d’une matrice carrée A donnée.
Solution :
1 /* Programme pour mettre z r o la diagonale principale d ’ une
matrice */
2 # include < stdio .h >
3

4 int main () {
5 int A [50][50] , N , i , j ;
6

7 // Saisie de la dimension
8 printf ( " Entrez la dimension de la matrice c a r r e ( max 50) :
");
9 scanf ( " % d " , & N ) ;
10 if ( N > 50 || N <= 0) {
11 printf ( " Dimension invalide !\ n " ) ;
12 return 1;
13 }
14

15 // Saisie des lments


16 printf ( " Entrez les lments de la matrice :\ n " ) ;
17 for ( i = 0; i < N ; i ++) {
18 for ( j = 0; j < N ; j ++) {
19 printf ( " A [% d ][% d ] = " , i , j ) ;
20 scanf ( " % d " , & A [ i ][ j ]) ;
21 }
22 }
23

24 // Affichage de la matrice initiale


25 printf ( " Matrice initiale :\ n " ) ;
26 for ( i = 0; i < N ; i ++) {
27 for ( j = 0; j < N ; j ++) {
28 printf ( " % d " , A [ i ][ j ]) ;
29 }
30 printf ( " \ n " ) ;
31 }
32

33 // Mise z r o de la diagonale principale


34 for ( i = 0; i < N ; i ++) {
35 A [ i ][ i ] = 0; // Les lments de la diagonale
principale sont ceux o i == j
36 }
37

38 // Affichage de la matrice m o d i f i e
39 printf ( " Matrice a p r s mise z r o de la diagonale
principale :\ n " ) ;
40 for ( i = 0; i < N ; i ++) {
41 for ( j = 0; j < N ; j ++) {
42 printf ( " % d " , A [ i ][ j ]) ;

12
43 }
44 printf ( " \ n " ) ;
45 }
46

47 return 0;
48 }

Explication :
— On lit la dimension N d’une matrice carrée et on remplit la matrice.
— La diagonale principale est constituée des éléments où l’indice de ligne est égal à
l’indice de colonne (A[i][i]).
— On met ces éléments à zéro et on affiche la matrice avant et après modification.

Exercice 5 : Factoriel avec récursivité


Énoncé : Écrire un programme qui calcule le factoriel de n en utilisant une fonction
récursive.
Solution :
1 /* Programme pour calculer le factoriel avec une fonction
r c u r s i v e */
2 # include < stdio .h >
3

4 // Fonction r c u r s i v e pour calculer le factoriel


5 unsigned long long factoriel ( int n ) {
6 if ( n == 0 || n == 1) { // Cas de base
7 return 1;
8 }
9 return n * factoriel ( n - 1) ; // Appel r c u r s i f
10 }
11

12 int main () {
13 int n ;
14 printf ( " Entrez un nombre entier n pour calculer son
factoriel : " ) ;
15 scanf ( " % d " , & n ) ;
16

17 if ( n < 0) {
18 printf ( " Le factoriel n ’ est pas d f i n i pour les nombres
n g a t i f s .\ n " ) ;
19 } else {
20 printf ( " Le factoriel de % d est : % llu \ n " , n ,
factoriel ( n ) ) ;
21 }
22

23 return 0;
24 }

Explication :
— On définit une fonction récursive factoriel qui calcule n!.
— Le cas de base est n = 0 ou n = 1, où 0! = 1 et 1! = 1.
— Sinon, on utilise la formule n! = n × (n − 1)!.

13
— On utilise unsigned long long pour gérer de grands nombres.
— On vérifie que n n’est pas négatif.

Exercice 6 : Calcul d’un terme d’une suite récursive


Énoncé : Écrire un programme qui calcule le terme n de la suite suivante en utilisant
une fonction récursive : S0 = 0, S1 = −9, Sn = Sn−1 − 9 × Sn−2 pour n > 1.
Solution :
1 /* Programme pour calculer un terme d ’ une suite r c u r s i v e */
2 # include < stdio .h >
3

4 // Fonction r c u r s i v e pour calculer Sn


5 long long calculer_S ( int n ) {
6 if ( n == 0) return 0; // Cas de base S0
7 if ( n == 1) return -9; // Cas de base S1
8 return calculer_S ( n - 1) - 9 * calculer_S ( n - 2) ; // Formule
r cursive
9 }
10

11 int main () {
12 int n ;
13 printf ( " Entrez l ’ indice n pour calculer Sn : " ) ;
14 scanf ( " % d " , & n ) ;
15

16 if ( n < 0) {
17 printf ( " L ’ indice doit tre positif ou nul .\ n " ) ;
18 } else {
19 printf ( " S % d = % lld \ n " , n , calculer_S ( n ) ) ;
20 }
21

22 return 0;
23 }

Explication :
— On définit une fonction récursive calculer S pour calculer Sn .
— Les cas de base sont S0 = 0 et S1 = −9.
— Pour n > 1, on utilise la formule Sn = Sn−1 − 9 × Sn−2 .
— On utilise long long pour gérer de grands nombres.
— On vérifie que n n’est pas négatif.

Exercice 7 : Structure avec char et int


Énoncé : Créez un type structure st contenant un char appelé c et un int appelé i.
Créez deux variables x et y contenant un char appelé c et les valeurs (’a’ ; 1) et (’b’ ; 2).
Affichez-les valeurs x et y de type st. Affichez-les valeurs de tous les champs de ces deux
variables.
Solution :
1 /* Programme pour utiliser une structure avec char et int */
2 # include < stdio .h >

14
3

4 // D f i n i t i o n de la structure
5 struct st {
6 char c ;
7 int i ;
8 };
9

10 int main () {
11 // D c l a r a t i o n et initialisation des variables x et y
12 struct st x = { ’a ’ , 1};
13 struct st y = { ’b ’ , 2};
14

15 // Affichage des valeurs


16 printf ( " Valeurs de x : c = %c , i = % d \ n " , x .c , x . i ) ;
17 printf ( " Valeurs de y : c = %c , i = % d \ n " , y .c , y . i ) ;
18

19 return 0;
20 }

Explication :
— On définit une structure st avec un char c et un int i.
— On crée deux variables x et y de type st et on les initialise.
— On affiche les champs c et i de chaque variable.

Exercice 8 : Ajout d’éléments à la fin d’un tableau


Énoncé : Écrire un programme qui lit deux tableaux d’entiers A et B et leurs di-
mensions N et M au clavier et qui ajoute les éléments de B à la fin de A. Utiliser deux
pointeurs P A et P B pour le transfert et afficher le tableau résultant A.
Solution :
1 /* Programme pour ajouter les lments de B la fin de A */
2 # include < stdio .h >
3

4 int main () {
5 int A [100] , B [50] , N , M , i ;
6 int * PA , * PB ;
7

8 // Saisie des dimensions


9 printf ( " Entrez la dimension de A ( max 50) : " ) ;
10 scanf ( " % d " , & N ) ;
11 printf ( " Entrez la dimension de B ( max 50) : " ) ;
12 scanf ( " % d " , & M ) ;
13 if ( N + M > 100 || N <= 0 || M <= 0) {
14 printf ( " Dimensions invalides !\ n " ) ;
15 return 1;
16 }
17

18 // Saisie des lments de A


19 printf ( " Entrez les % d lments de A :\ n " , N ) ;
20 for ( i = 0; i < N ; i ++) {
21 printf ( " A [% d ] = " , i ) ;

15
22 scanf ( " % d " , & A [ i ]) ;
23 }
24

25 // Saisie des lments de B


26 printf ( " Entrez les % d lments de B :\ n " , M ) ;
27 for ( i = 0; i < M ; i ++) {
28 printf ( " B [% d ] = " , i ) ;
29 scanf ( " % d " , & B [ i ]) ;
30 }
31

32 // Utilisation des pointeurs pour ajouter B la fin de A


33 PA = A + N ; // Pointeur PA pointe vers la fin de A
34 PB = B ; // Pointeur PB pointe vers le d b u t de B
35 for ( i = 0; i < M ; i ++) {
36 * PA = * PB ; // Copie de l ’ lment de B dans A
37 PA ++; // Avance le pointeur PA
38 PB ++; // Avance le pointeur PB
39 }
40

41 // Affichage du tableau A r s u l t a n t
42 printf ( " Tableau A a p r s ajout de B : " ) ;
43 for ( i = 0; i < N + M ; i ++) {
44 printf ( " % d " , A [ i ]) ;
45 }
46 printf ( " \ n " ) ;
47

48 return 0;
49 }

Explication :
— On lit les dimensions N et M et on remplit les tableaux A et B.
— On utilise deux pointeurs PA et PB :
— PA pointe vers la fin de A (position N ).
— PB pointe vers le début de B.
— On copie les éléments de B à la fin de A en incrémentant les pointeurs.
— On affiche le tableau A résultant, qui contient maintenant N + M éléments.

16

Vous aimerez peut-être aussi