Exercices en C
Exercices en C
Exercices en C
Exercice 5.3
Ecrivez un programme qui lit trois valeurs entières (A, B et C) au clavier et qui
affiche la plus grande des trois valeurs, en utilisant:
#include <stdio.h>
main()
{
int A, B, C;
int MAX;
printf("Introduisez trois nombres entiers :");
scanf("%i %i %i", &A, &B, &C);
if (A>B)
MAX=A;
else
MAX=B;
if (C>MAX)
MAX=C;
printf("La valeur maximale est %i\n", MAX);
return 0;
}
int A, B, C;
printf("Introduisez trois nombres entiers :");
scanf("%i %i %i", &A, &B, &C);
printf("La valeur maximale est ");
if (A>B && A>C)
printf("%i\n",A);
else if (B>C)
printf("%i\n",B);
else
printf("%i\n",C);
int A, B, C;
int MAX;
printf("Introduisez trois nombres entiers :");
scanf("%i %i %i", &A, &B, &C);
MAX = (A>B) ? A : B;
MAX = (MAX>C) ? MAX : C;
printf("La valeur maximale est %i\n", MAX);
Exercice 5.4
Ecrivez un programme qui lit trois valeurs entières (A, B et C) au clavier. Triez les
valeurs A, B et C par échanges successifs de manière à obtenir :
#include <stdio.h>
main()
{
/* Tri par ordre décroissant de trois entiers
en échangeant les valeurs
*/
int A, B, C, AIDE;
printf("Introduisez trois nombres entiers :");
scanf("%i %i %i", &A, &B, &C);
printf("Avant le tri : \tA = %i\tB = %i\tC = %i\n", A, B, C);
/* Valeur maximale -> A */
if (A<B)
{
AIDE = A;
A = B;
B = AIDE;
}
if (A<C)
{
AIDE = A;
A = C;
C = AIDE;
}
/* trier B et C */
if (B<C)
{
AIDE = B;
B = C;
C = AIDE;
}
printf("Après le tri : \tA = %i\tB = %i\tC = %i\n", A, B, C);
return 0;
}
Exercice 5.5
Ecrivez un programme qui lit deux valeurs entières (A et B) au clavier et qui affiche
le signe du produit de A et B sans faire la multiplication.
#include <stdio.h>
main()
{
/* Afficher le signe du produit de deux entiers sans
faire la multiplication
*/
int A, B;
printf("Introduisez deux nombres entiers :");
scanf("%i %i", &A, &B);
if ((A>0 && B>0) || (A<0 && B<0))
printf("Le signe du produit %i * %i est positif\n", A, B);
else if ((A<0 && B>0) || (A>0 && B<0))
printf("Le signe du produit %i * %i est négatif\n", A, B);
else
printf("Le produit %i * %i est zéro\n", A, B);
return 0;
}
Exercice 5.6
Ecrivez un programme qui lit deux valeurs entières (A et B) au clavier et qui affiche
le signe de la somme de A et B sans faire l'addition. Utilisez la fonction fabs de la
bibliothèque <math>.
#include <stdio.h>
#include <math.h>
main()
{
/* Afficher le signe de la somme de deux entiers sans
faire l'addition
*/
int A, B;
printf("Introduisez deux nombres entiers :");
scanf("%i %i", &A, &B);
if ((A>0 && B>0) || (A<0 && B>0 && fabs(A)<fabs(B))
|| (A>0 && B<0 && fabs(A)>fabs(B)))
printf("Le signe de la somme %i + %i est positif\n",A,B);
else if ((A<0 && B<0) || (A<0 && B>0 && fabs(A)>fabs(B))
|| (A>0 && B<0 && fabs(A)<fabs(B)))
printf("Le signe de la somme %i + %i est négatif\n",A,B);
else
printf("La somme %i + %i est zéro\n", A, B);
return 0;
}
Exercice 5.7
Ecrivez un programme qui calcule les solutions réelles d'une équation du second
degré ax2+bx+c = 0 en discutant la formule:
Utilisez une variable d'aide D pour la valeur du discriminant b2-4ac et décidez à l'aide
de D, si l'équation a une, deux ou aucune solution réelle. Utilisez des variables du
type int pour A, B et C.
Considérez aussi les cas où l'utilisateur entre des valeurs nulles pour A; pour A et B;
pour A, B et C. Affichez les résultats et les messages nécessaires sur l'écran.
#include <stdio.h>
#include <math.h>
main()
{
/* Calcul des solutions réelles d'une équation du second degré */
int A, B, C;
double D; /* Discriminant */
printf("Calcul des solutions réelles d'une équation du second \n");
printf("degré de la forme ax^2 + bx + c = 0 \n\n");
printf("Introduisez les valeurs pour a, b, et c : ");
scanf("%i %i %i", &A, &B, &C);
Exercice 6.1
Ecrivez un programme qui lit N nombres entiers au clavier et qui affiche leur somme,
leur produit et leur moyenne. Choisissez un type approprié pour les valeurs à afficher.
Le nombre N est à entrer au clavier. Résolvez ce problème,
a) en utilisant while,
b) en utilisant do - while,
c) en utilisant for.
#include <stdio.h>
main()
{
int N; /* nombre de données */
int NOMB; /* nombre courant */
int I; /* compteur */
long SOM; /* la somme des nombres entrés */
double PROD; /* le produit des nombres entrés */
SOM=0;
PROD=1;
I=1;
while(I<=N)
{
printf("%d. nombre : ", I);
scanf("%d", &NOMB);
SOM += NOMB;
PROD *= NOMB;
I++;
}
Exercice 6.2
Répétez l'introduction du nombre N jusqu'à ce que N ait une valeur entre 1 et 15.
par
do
{
printf("Nombre de données : ");
scanf("%d", &N);
}
while(N<1 || N>15);
Exercice 6.3
#include <stdio.h>
main()
{
int NUM; /* numérateur de la division entière */
int DEN; /* dénominateur de la division entière */
int DIV; /* résultat de la division entière */
int RES; /* reste de la division entière */
RES=NUM;
DIV=0;
while(RES>=DEN)
{
RES-=DEN;
DIV++;
}
/* ou mieux encore : */
/*
for (RES=NUM, DIV=0 ; RES>=DEN ; DIV++)
RES-=DEN;
*/
printf(" %d divisé par %d est %d reste %d\n", NUM, DEN, DIV, RES);
return 0;
}
Exercice 6.4
a) Utilisez while,
b) Utilisez for.
Solution combinée :
(Essayez l'une ou l'autre des solutions en déplaçant les marques des commentaires !)
#include <stdio.h>
main()
{
int N; /* La donnée */
int I; /* Le compteur */
double FACT; /* La factorielle N! - Type double à */
/* cause de la grandeur du résultat. */
do
{
printf("Entrez un entier naturel : ");
scanf("%d", &N);
}
while (N<0);
/* a */
/* Pour N=0, le résultat sera automatiquement 0!=1 */
I=1;
FACT=1;
while (I<=N)
{
FACT*=I;
I++;
}
/* b */
/* Pour N=0, le résultat sera automatiquement 0!=1 */
/*
for (FACT=1.0, I=1 ; I<=N ; I++)
FACT*=I;
*/
Exercice 6.5
#include <stdio.h>
main()
{
int X, N; /* Les données */
int I; /* Le compteur */
double RESU; /* Type double à cause de la */
/* grandeur du résultat. */
do
{
printf("Entrez l'entier naturel X : ");
scanf("%d", &X);
}
while (X<0);
do
{
printf("Entrez l'exposant N : ");
scanf("%d", &N);
}
while (N<0);
#include <stdio.h>
main()
{
int N; /* nombre de termes à calculer */
int I; /* compteur pour la boucle */
float SOM; /* Type float à cause de la précision du résultat. */
do
{
printf ("Nombre de termes: ");
scanf ("%d", &N);
}
while (N<1);
for (SOM=0.0, I=1 ; I<=N ; I++)
SOM += (float)1/I;
printf("La somme des %d premiers termes est %f \n", N, SOM);
return 0;
}
Exercice 6.7
Calculez la somme, le produit et la moyenne d'une suite de chiffres non nuls entrés au
clavier, sachant que la suite est terminée par zéro. Retenez seulement les chiffres (0, 1
... 9) lors de l'entrée des données et effectuez un signal sonore si les données sortent
de ce domaine.
#include <stdio.h>
main()
{
int X; /* Le chiffre courant */
int N=0; /* Le compteur des données */
int SOM=0; /* La somme actuelle */
long PROD=1; /* Le produit actuel - Type long à */
/* cause de la grandeur du résultat. */
*/
do
{
/* Saisie des données (pour perfectionnistes) */
printf("Entrez le %d%s chiffre : ", (N+1), (N)?"e":"er");
scanf("%d", &X);
if (X<0||X>9)
printf("\a");
else if (X)
{
N++;
SOM+=X;
PROD*=X;
}
else if (!X && N>0)
{/* Seulement si au moins un chiffre a été accepté */
printf("La somme des chiffres est %d \n", SOM);
printf("Le produit des chiffres est %ld\n", PROD);
printf("La moyenne des chiffres est %f \n", (float)SOM/N);
}
}
while (X);
return 0;
}
Exercice 6.8
Calculez le nombre lu à rebours d'un nombre positif entré au clavier en supposant que
le fichier d'entrée standard contient une suite de chiffres non nuls, terminée par zéro
(Contrôlez s'il s'agit vraiment de chiffres). Exemple: Entrée: 1 2 3 4 0 Affichage:
4321
#include <stdio.h>
main()
{
int X; /* Le chiffre courant */
int N=0; /* Le compteur des décimales */
long VALD=1; /* Valeur de la position décimale courante */
long NOMB=0; /* Le nombre résultat */
do
{
printf("Entrez le %d%s chiffre : ", (N+1), (N)?"e":"er");
scanf("%d", &X);
if (X<0||X>9)
printf("\a");
else if (X)
{
NOMB += VALD*X;
N++;
VALD *= 10;
}
else
printf("La valeur du nombre renversé est %ld\n", NOMB);
}
while (X);
return 0;
}
Remarque :
En remplaçant la ligne
NOMB += VALD*X;
par
on n'a plus besoin de la variable VALD. Il faut cependant inclure les fonctions de la
bibliothèque <math>. D'autre part, le calcul de 10N serait alors répété à chaque
exécution de la boucle.
Finalement, cette variante est plus lente et plus volumineuse que la première.
Exercice 6.9
Calculez le nombre lu à rebours d'un nombre positif entré au clavier en supposant que
le fichier d'entrée standard contient le nombre à inverser. Exemple: Entrée: 1234
Affichage: 4321
#include <stdio.h>
main()
{
int NOMB; /* Le nombre à inverser */
int NINV; /* Le nombre inversé */
/* Attention: en utilisant le type int, il est impossible */
/* d'inverser correctement des nombres comme 10033 ... */
do
{
printf("Entrez un nombre positif (<10000) : ", NOMB);
scanf("%d", &NOMB);
}
while (NOMB<0 || NOMB>9999);
NINV=0;
while(NOMB>0)
{
NINV *= 10;
NINV += NOMB%10;
NOMB /= 10;
}
/* Autre possibilité : */
/* for (NINV=0 ; NOMB>0 ; NOMB/=10)
NINV = NINV*10 + NOMB%10;
*/
Exercice 6.10
Calculez pour une valeur X donnée du type float la valeur numérique d'un polynôme
de degré n:
Utilisez le schéma de Horner qui évite les opérations d'exponentiation lors du calcul:
#include <stdio.h>
main()
{
int N; /* degré du polynôme */
float X; /* argument */
float A; /* coefficients successifs du polynôme */
float P; /* coefficient courant du terme Horner */
Exercice 6.11
do
{
printf("Entrer l'entier A (non nul) : ");
scanf("%d", &A);
}
while(!A);
do
{
printf("Entrer l'entier B (non nul) : ");
scanf("%d", &B);
}
while(!B);
Exercice 6.12
Calculez le N-ième terme UN de la suite de FIBONACCI qui est donnée par la relation
de récurrence:
- le type int
- le type long
- le type double
#include <stdio.h>
main()
{
int U1, U2, UN; /* pour parcourir la suite */
int N; /* rang du terme demandé */
int I; /* compteur pour la boucle */
do
{
printf("Rang du terme demandé : ");
scanf("%d", &N);
}
while(N<1);
Exercice 6.13
b) Assurez-vous lors de l'introduction des données que la valeur pour A est un réel
positif et que J est un entier naturel positif, plus petit que 50.
do
{
printf("Entrer le réel positif A : ");
scanf("%lf", &A);
}
while(A<0);
do
{
printf("Entrer le degré de l'approximation : ");
scanf("%d", &N);
}
while(N<=0 || N>=50);
Exercice 6.14
Nombre de lignes : 8
*
***
*****
*******
*********
***********
*************
***************
#include <stdio.h>
main()
{
int LIG; /* nombre de lignes */
int L; /* compteur des lignes */
int ESP; /* nombre d'espaces */
int I; /* compteur des caractères */
do
{
printf("Nombres de lignes : ");
scanf("%d", &LIG);
}
while (LIG<1 || LIG>20);
Exercice 6.15
X*Y I 0 1 2 3 4 5 6 7 8 9 10
--------------------------------------------------
0 I 0 0 0 0 0 0 0 0 0 0 0
1 I 0 1 2 3 4 5 6 7 8 9 10
2 I 0 2 4 6 8 10 12 14 16 18 20
3 I 0 3 6 9 12 15 18 21 24 27 30
4 I 0 4 8 12 16 20 24 28 32 36 40
5 I 0 5 10 15 20 25 30 35 40 45 50
6 I 0 6 12 18 24 30 36 42 48 54 60
7 I 0 7 14 21 28 35 42 49 56 63 70
8 I 0 8 16 24 32 40 48 56 64 72 80
9 I 0 9 18 27 36 45 54 63 72 81 90
10 I 0 10 20 30 40 50 60 70 80 90 100
#include <stdio.h>
main()
{
const int MAX = 10; /* nombre de lignes et de colonnes */
int I; /* compteur des lignes */
int J; /* compteur des colonnes */
/* Affichage de l'en-tête */
printf(" X*Y I");
for (J=0 ; J<=MAX ; J++)
printf("%4d", J);
printf("\n");
printf("------");
for (J=0 ; J<=MAX ; J++)
printf("----");
printf("\n");
/* Affichage du tableau */
for (I=0 ; I<=MAX ; I++)
{
printf("%3d I", I);
for (J=0 ; J<=MAX ; J++)
printf("%4d", I*J);
printf("\n");
}
return 0;
}
Exercice 7.1
Ecrire 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.
#include <stdio.h>
main()
{
/* Déclarations */
int T[50]; /* tableau donné */
int N; /* dimension */
int I; /* indice courant */
long SOM; /* somme des éléments - type long à cause */
/* de la grandeur prévisible du résultat. */
Exercice 7.2
Ecrire 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.
Effacer ensuite toutes les occurrences de la valeur 0 dans le tableau T et tasser les
éléments restants. Afficher le tableau résultant.
#include <stdio.h>
main()
{
/* Déclarations */
int T[50]; /* tableau donné */
int N; /* dimension */
int I,J; /* indices courants */
Exercice 7.3
Ecrire 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.
Idée: Echanger les éléments du tableau à l'aide de deux indices qui parcourent le
tableau en commençant respectivement au début et à la fin du tableau et qui se
rencontrent en son milieu.
#include <stdio.h>
main()
{
/* Déclarations */
int T[50]; /* tableau donné */
int N; /* dimension */
int I,J; /* indices courants */
int AIDE; /* pour l'échange */
Exercice 7.4
Ecrire 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.
Copiez ensuite toutes les composantes strictement positives dans un deuxième tableau
TPOS et toutes les valeurs strictement négatives dans un troisième tableau TNEG.
Afficher les tableaux TPOS et TNEG.
Lors du travail avec les tableaux à deux dimensions, nous utiliserons deux indices
(p.ex: I et J), et la structure for, souvent imbriquée, pour parcourir les lignes et les
colonnes des tableaux.
#include <stdio.h>
main()
{
/* Déclarations */
/* Les tableaux et leurs dimensions */
int T[50], TPOS[50], TNEG[50];
int N, NPOS, NNEG;
int I; /* indice courant */
Exercice 7.5
Ecrire 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.
#include <stdio.h>
main()
{
/* Déclarations */
int T[50][50]; /* tableau donné */
int L, C; /* dimensions */
int I, J; /* indices courants */
long SOM; /* somme des éléments - type long à cause */
/* de la grandeur prévisible du résultat. */
Exercice 7.6
Ecrire 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 chaque
ligne et de chaque colonne en n'utilisant qu'une variable d'aide pour la somme.
#include <stdio.h>
main()
{
/* Déclarations */
int T[50][50]; /* tableau donné */
int L, C; /* dimensions */
int I, J; /* indices courants */
long SOM; /* somme des éléments - type long à cause */
/* de la grandeur prévisible des résultats. */
Exercice 7.7
Exemple:
/ \
| a b c d | / \
| e f g h | ==> | a b c d e f g h i j k l |
| i j k l | \ /
\ /
#include <stdio.h>
main()
{
/* Déclarations */
int M[10][10]; /* tableau à 2 dimensions */
int V[100]; /* tableau à 1 dimension */
int L, C; /* dimensions */
int I, J; /* indices courants */
Exemple:
/ \ / \
| 3 2 -4 | * | 2 -3 5 | = 3*2+2*(-3)+(-4)*5 = -20
\ / \ /
#include <stdio.h>
main()
{
/* Déclarations */
int U[50], V[50]; /* tableaux donnés */
int N; /* dimension */
int I; /* indice courant */
long PS; /* produit scalaire */
/* Saisie des données */
printf("Dimension des tableaux (max.50) : ");
scanf("%d", &N );
printf("** Premier tableau **\n");
for (I=0; I<N; I++)
{
printf("Elément %d : ", I);
scanf("%d", &U[I]);
}
printf("** Deuxième tableau **\n");
for (I=0; I<N; I++)
{
printf("Elément %d : ", I);
scanf("%d", &V[I]);
}
/* Calcul du produit scalaire */
for (PS=0, I=0; I<N; I++)
PS += (long)U[I]*V[I];
/* Edition du résultat */
printf("Produit scalaire : %ld\n", PS);
return 0;
}
Calculer pour une valeur X donnée du type float la valeur numérique d'un polynôme
de degré n:
Solution combinée:
#include <stdio.h>
#include <math.h>
main()
{
float A[20];/* tableau des coefficients de P */
int I; /* indice courant */
int N; /* degré du polynôme */
float X; /* argument */
float P; /* résultat */
/* b) Calcul de Horner */
/* commencer le calcul avec le dernier coefficient...*/
for (P=0.0, I=0 ; I<=N ; I++)
P = P*X + A[N-I];
/* Edition du résultat */
printf("Valeur du polynôme pour X = %.2f : %.2f\n", X, P);
return 0;
}
Ecrire un programme qui détermine la plus grande et la plus petite valeur dans un
tableau d'entiers A. Afficher ensuite la valeur et la position du maximum et du
minimum. Si le tableau contient plusieurs maxima ou minima, le programme retiendra
la position du premier maximum ou minimum rencontré.
#include <stdio.h>
main()
{
/* Déclarations */
int A[50]; /* tableau donné */
int N; /* dimension */
int I; /* indice courant */
int MIN; /* position du minimum */
int MAX; /* position du maximum */
/* Saisie des données */
printf("Dimension du tableau (max.50) : ");
scanf("%d", &N );
for (I=0; I<N; I++)
{
printf("Elément %d : ", I);
scanf("%d", &A[I]);
}
/* Affichage du tableau */
printf("Tableau donné :\n");
for (I=0; I<N; I++)
printf("%d ", A[I]);
printf("\n");
/* Recherche du maximum et du minimum */
MIN=0;
MAX=0;
for (I=0; I<N; I++)
{
if(A[I]>A[MAX]) MAX=I;
if(A[I]<A[MIN]) MIN=I;
}
/* Edition du résultat */
printf("Position du minimum : %d\n", MIN);
printf("Position du maximum : %d\n", MAX);
printf("Valeur du minimum : %d\n", A[MIN]);
printf("Valeur du maximum : %d\n", A[MAX]);
return 0;
}
Un tableau A de dimension N+1 contient N valeurs entières triées par ordre croissant;
la (N+1)ième valeur est indéfinie. Insérer une valeur VAL donnée au clavier dans le
tableau A de manière à obtenir un tableau de N+1 valeurs triées.
#include <stdio.h>
main()
{
/* Déclarations */
int A[50]; /* tableau donné */
int VAL; /* valeur à insérer */
int N; /* dimension */
int I; /* indice courant */
Problème: Rechercher dans un tableau d'entiers A une valeur VAL entrée au clavier.
Afficher la position de VAL si elle se trouve dans le tableau, sinon afficher un
message correspondant. La valeur POS qui est utilisée pour mémoriser la position de
la valeur dans le tableau, aura la valeur -1 aussi longtemps que VAL n'a pas été
trouvée.
a) La recherche séquentielle
#include <stdio.h>
main()
{
/* Déclarations */
int A[50]; /* tableau donné */
int VAL; /* valeur à rechercher */
int POS; /* position de la valeur */
int N; /* dimension */
int I; /* indice courant */
#include <stdio.h>
main()
{
/* Déclarations */
int A[50]; /* tableau donné */
int VAL; /* valeur à rechercher */
int POS; /* position de la valeur */
int N; /* dimension */
int I; /* indice courant */
int INF, MIL, SUP; /* limites du champ de recherche */
/* Edition du résultat */
if (POS==-1)
printf("La valeur recherchée ne se trouve pas "
"dans le tableau.\n");
else
printf("La valeur %d se trouve à la position %d. \n",
VAL, POS);
return 0;
}
Dans le pire des cas d'une recherche séquentielle, il faut traverser tout le tableau avant
de trouver la valeur ou avant d'être sûr qu'une valeur ne se trouve pas dans le tableau.
Exemple:
- le pire des cas pour la recherche séquentielle peut entraîner 1024 exécutions de la
boucle.
- le pire des cas pour la recherche séquentielle peut entraîner 1 048 576 exécutions de
la boucle.
Méthode: Utiliser trois indices IA, IB et IFUS. Comparer A[IA] et B[IB]; remplacer
FUS[IFUS] par le plus petit des deux éléments; avancer dans le tableau FUS et dans
le tableau qui a contribué son élément. Lorsque l'un des deux tableaux A ou B est
épuisé, il suffit de recopier les éléments restants de l'autre tableau dans le tableau FUS
#include <stdio.h>
main()
{
/* Déclarations */
/* Les tableaux et leurs dimensions */
int A[50], B[50], FUS[100];
int N, M;
int IA, IB, IFUS; /* indices courants */
/* Edition du résultat */
printf("Tableau FUS :\n");
for (IFUS=0; IFUS<N+M; IFUS++)
printf("%d ", FUS[IFUS]);
printf("\n");
return 0;
}
Exemple:
#include <stdio.h>
main()
{
/* Déclarations */
int A[50]; /* tableau donné */
int N; /* dimension */
int I; /* rang à partir duquel A n'est pas trié */
int J; /* indice courant */
int AIDE; /* pour la permutation */
int PMAX; /* indique la position de l'élément */
/* maximal à droite de A[I] */
/* Edition du résultat */
printf("Tableau trié :\n");
for (J=0; J<N; J++)
printf("%d ", A[J]);
printf("\n");
return 0;
}
Exercice 7.15 Tri par propagation (bubble sort)
Exemple:
#include <stdio.h>
main()
{
/* Déclarations */
int A[50]; /* tableau donné */
int N; /* dimension */
int I; /* rang à partir duquel A est trié */
int J; /* indice courant */
int AIDE; /* pour la permutation */
int FIN; /* position où la dernière permutation a eu lieu. */
/* permet de ne pas trier un sous-ensemble déjà trié. */
/* Edition du résultat */
printf("Tableau trié :\n");
for (J=0; J<N; J++)
printf("%d ", A[J]);
printf("\n");
return 0;
}
Ecrire un programme qui lit les points de N élèves d'une classe dans un devoir et les
mémorise dans un tableau POINTS de dimension N.
* Rechercher et afficher:
- la note maximale,
- la note minimale,
* A partir des POINTS des élèves, établir un tableau NOTES de dimension 7 qui est
composé de la façon suivante:
...
Exemple:
6 > #######
5 > ####### #######
4 > ####### ####### #######
3 > ####### ####### ####### #######
2 > ####### ####### ####### ####### #######
1 > ####### ####### ####### ####### #######
+-------+-------+-------+-------+-------+-------+-------+
I 0 - 9 I 10-19 I 20-29 I 30-39 I 40-49 I 50-59 I 60 I
#include <stdio.h>
main()
{
int POINTS[50]; /* tableau des points */
int NOTES[7]; /* tableau des notes */
int N; /* nombre d'élèves */
int I, IN; /* compteurs d'aide */
int SOM; /* somme des points */
int MAX, MIN; /* maximum, minimum de points */
int MAXN; /* nombre de lignes du graphique */
Ecrire un programme qui met à zéro les éléments de la diagonale principale d'une
matrice carrée A donnée.
#include <stdio.h>
main()
{
/* Déclarations */
int A[50][50]; /* matrice carrée */
int N; /* dimension de la matrice carrée */
int I, J; /* indices courants */
/* Edition du résultat */
printf("Matrice résultat :\n");
for (I=0; I<N; I++)
{
for (J=0; J<N; J++)
printf("%7d", A[I][J]);
printf("\n");
}
return 0;
}
/ 1 si i=j
uij = |
\ 0 si ij
#include <stdio.h>
main()
{
/* Déclarations */
int U[50][50]; /* matrice unitaire */
int N; /* dimension de la matrice unitaire */
int I, J; /* indices courants */
/* Edition du résultat */
printf("Matrice unitaire de dimension %d :\n", N);
for (I=0; I<N; I++)
{
for (J=0; J<N; J++)
printf("%7d", U[I][J]);
printf("\n");
}
return 0;
}
Remarque:
L'opération:
if (I==J)
U[I][J]=1;
else
U[I][J]=0;
U[I][J] = (I==J);
a) La matrice transposée sera mémorisée dans une deuxième matrice B qui sera
ensuite affichée.
Rappel:
/ \ / \
tA = t | a b c d | = | a e i |
| e f g h | | b f j |
| i j k l | | c g k |
\ / | d h l |
\ /
a) La matrice transposée sera mémorisée dans une deuxième matrice B qui sera
ensuite affichée.
#include <stdio.h>
main()
{
/* Déclarations */
int A[50][50]; /* matrice initiale */
int B[50][50]; /* matrice résultat */
int N, M; /* dimensions des matrices */
int I, J; /* indices courants */
#include <stdio.h>
main()
{
/* Déclarations */
int A[50][50]; /* matrice donnée */
int N, M; /* dimensions de la matrice */
int I, J; /* indices courants */
int AIDE; /* pour la permutation */
int DMAX; /* la plus grande des deux dimensions */
Rappel:
/ \ / \
| a b c d | | X*a X*b X*c X*d |
X * | e f g h | = | X*e X*f X*g X*h |
| i j k l | | X*i X*j X*k X*l |
\ / \ /
a) Le résultat de la multiplication sera mémorisé dans une deuxième matrice A qui
sera ensuite affichée.
#include <stdio.h>
main()
{
/* Déclarations */
float A[50][50]; /* matrice donnée */
float B[50][50]; /* matrice résultat */
int N, M; /* dimensions des matrices */
int I, J; /* indices courants */
float X; /* multiplicateur */
/* Saisie des données */
printf("Nombre de lignes (max.50) : ");
scanf("%d", &N );
printf("Nombre de colonnes (max.50) : ");
scanf("%d", &M );
for (I=0; I<N; I++)
for (J=0; J<M; J++)
{
printf("Elément[%d][%d] : ",I,J);
scanf("%f", &A[I][J]);
}
printf("Multiplicateur X : ");
scanf("%f", &X );
/* Affichage de la matrice */
printf("Matrice donnée :\n");
for (I=0; I<N; I++)
{
for (J=0; J<M; J++)
printf("%10.2f", A[I][J]);
printf("\n");
}
/* Affectation du résultat de la multiplication à B */
for (I=0; I<N; I++)
for (J=0; J<M; J++)
B[I][J] = X*A[I][J];
/* Edition du résultat */
printf("Matrice résultat :\n");
for (I=0; I<N; I++)
{
for (J=0; J<M; J++)
printf("%10.2f", B[I][J]);
printf("\n");
}
return 0;
}
#include <stdio.h>
main()
{
/* Déclarations */
float A[50][50]; /* matrice donnée */
int N, M; /* dimensions de la matrice */
int I, J; /* indices courants */
float X; /* multiplicateur */
Rappel:
/ \ / \ / \
| a b c d | | a' b' c' d' | | a+a' b+b' c+c' d+d' |
| e f g h | + | e' f' g' h' | = | e+e' f+f' g+g' h+h' |
| i j k l | | i' j' k' l' | | i+i' j+j' k+k' l+l' |
\ / \ / \ /
a) Le résultat de l'addition sera mémorisé dans une troisième matrice C qui sera
ensuite affichée.
a) Le résultat de l'addition sera mémorisé dans une troisième matrice C qui sera
ensuite affichée.
#include <stdio.h>
main()
{
/* Déclarations */
int A[50][50]; /* matrice donnée */
int B[50][50]; /* matrice donnée */
int C[50][50]; /* matrice résultat */
int N, M; /* dimensions des matrices */
int I, J; /* indices courants */
#include <stdio.h>
main()
{
/* Déclarations */
int A[50][50]; /* matrice donnée et résultat */
int B[50][50]; /* matrice donnée */
int N, M; /* dimensions des matrices */
int I, J; /* indices courants */
Rappel:
/ \ / \ /
\
| a b c | | p q | | a*p + b*r + c*t a*q + b*s +
c*u |
| e f g | * | r s | = | e*p + f*r + g*t e*q + f*s +
g*u |
| h i j | | t u | | h*p + i*r + j*t h*q + i*s +
j*u |
| k l m | \ / | k*p + l*r + m*t k*q + l*s +
m*u |
\ / \
/
Ecrire un programme qui effectue la multiplication de deux matrices A et B. Le
résultat de la multiplication sera mémorisé dans une troisième matrice C qui sera
ensuite affichée.
#include <stdio.h>
main()
{
/* Déclarations */
int A[50][50]; /* matrice donnée */
int B[50][50]; /* matrice donnée */
int C[50][50]; /* matrice résultat */
int N, M, P; /* dimensions des matrices */
int I, J, K; /* indices courants */
n=0 1
n=1 1 1
n=2 1 2 1
n=3 1 3 3 1
n=4 1 4 6 4 1
n=5 1 5 10 10 5 1
n=6 1 6 15 20 15 6 1
Méthode:
- Calculer les valeurs entre les éléments initialisés de gauche à droite en utilisant la
relation:
#include <stdio.h>
main()
{
/* Déclarations */
int P[14][14]; /* matrice résultat */
int N; /* degré du triangle */
int I, J; /* indices courants */
/* Saisie des données */
do {
printf("Entrez le degré N du triangle (max.13) : ");
scanf("%d", &N);
} while (N>13||N<0);
/* Construction des lignes 0 à N du triangle: */
/* Calcul des composantes du triangle jusqu'à */
/* la diagonale principale. */
for (I=0; I<=N; I++)
{
P[I][I]=1;
P[I][0]=1;
for (J=1; J<I; J++)
P[I][J] = P[I-1][J] + P[I-1][J-1];
}
/* Edition du résultat */
printf("Triangle de Pascal de degré %d :\n", N);
for (I=0; I<=N; I++)
{
printf(" N=%2d", I);
for (J=0; J<=I; J++)
if (P[I][J])
printf("%5d", P[I][J]);
printf("\n");
}
return 0;
}
Rechercher dans une matrice donnée A les éléments qui sont à la fois un maximum
sur leur ligne et un minimum sur leur colonne. Ces éléments sont appelés des points-
cols. Afficher les positions et les valeurs de tous les points-cols trouvés.
/ \ / \ / \ / \
| 1 8 3 4 0 | | 4 5 8 9 | | 3 5 6 7 7 | | 1 2 3 |
| | | 3 8 9 3 | | 4 2 2 8 9 | | 4 5 6 |
| 6 7 2 7 0 | | 3 4 9 3 | | 6 3 2 9 7 | | 7 8 9 |
\ / \ / \ / \ /
Méthode: Etablir deux matrices d'aide MAX et MIN de même dimensions que A,
telles que:
/ 1 si A[i,j] est un maximum
MAX[i,j] = | sur la ligne i
\ 0 sinon
#include <stdio.h>
main()
{
/* Déclarations */
int A[50][50]; /* matrice donnée */
int MAX[50][50];/* matrice indiquant les maxima des lignes */
int MIN[50][50];/* matrice indiquant les minima des colonnes */
int N, M; /* dimensions des matrices */
int I, J; /* indices courants */
int AIDE; /* pour la détection des extréma */
int C; /* compteur des points-cols */
/* Edition du résultat */
/* Les composantes qui sont marquées comme extréma */
/* dans MAX et dans MIN sont des points-cols. */
printf("Points - cols :\n");
for (C=0, I=0; I<N; I++)
for (J=0; J<M; J++)
if (MAX[I][J]&&MIN[I][J])
{
C++;
printf("L'élément %d\test un maximum "
"sur la ligne %d\n"
" \t et un minimum "
"sur la colonne %d\n", A[I][J], I, J);
}
if (C==0)
printf("Le tableau ne contient pas de points-cols.\n");
return 0;
}
Exercice 8.11
Ecrire un programme qui lit 10 mots et les mémorise dans un tableau de chaînes de
caractères. Trier les 10 mots lexicographiquement en utilisant les fonctions strcmp et
strcpy. Afficher le tableau trié. Utilisez la méthode de tri par sélection directe (voir
Exercice 7.14).
#include <stdio.h>
#include <string.h>
main()
{
/* Déclarations */
char MOT[10][50]; /* tableau de 10 mots à trier */
char AIDE[50]; /* chaîne d'aide pour la permutation */
int I; /* rang à partir duquel MOT n'est pas trié */
int J; /* indice courant */
int PMOT; /* indique la position du prochain mot */
/* dans la suite lexicographique. */
/* Edition du résultat */
printf("Tableau trié lexicographiquement :\n");
for (J=0; J<10; J++)
puts(MOT[J]); /* ou : printf("%s\n",MOT[J]); */
printf("\n");
return 0;
}
Exercice 8.12
Ecrire un programme qui lit un nombre entre 1 et 7 et qui affiche le nom du jour de la
semaine correspondant:
"lundi"
pour 1
"mardi"
pour 2
...
...
"dimanche"
pour 7
#include <stdio.h>
main()
{
/* Déclarations */
int N; /* nombre entré */
char JOUR[8][9] = {"\aErreur!", "lundi", "mardi", "mercredi",
"jeudi", "vendredi", "samedi","dimanche"};
/* Saisie du nombre */
printf("Entrez un nombre entre 1 et 7 : ");
scanf("%d", &N);
/* Affichage du résultat - pour perfectionnistes */
if (N>0 && N<8)
printf("Le %de%c jour de la semaine est %s.\n",
N, (N==1)?'r':' ', JOUR[N]);
else
puts(JOUR[0]);
return 0;
}
Exercice 8.13
Ecrire un programme qui lit 5 mots, séparés par des espaces et qui les affiche ensuite
dans une ligne, mais dans l'ordre inverse. Les mots sont mémorisés dans un tableau de
chaînes de caractères.
Exemple
#include <stdio.h>
main()
{
/* Déclarations */
char MOT[5][50]; /* tableau pour les 5 mots */
int I; /* indice courant */
/* Saisie des mots */
printf("Entrez 5 mots, séparés par des espaces :\n");
/* Après le retour à la ligne, scanf lit */
/* les 5 données à la fois. */
for (I=0; I<5; I++)
scanf("%s", MOT[I]);
/* Affichage du résultat */
for (I=4; I>=0; I--)
printf("%s ", MOT[I]);
printf("\n");
return 0;
}
Exercice 8.14
Refaire l'exercice 8.8 (Conjugaison des verbes réguliers en "er") en utilisant deux
tableaux de chaînes de caractères:
Sauf indication contraire, les exercices suivants sont à résoudre sans utiliser les
fonctions spéciales des bibliothèques <string>, <stdlib> ou <ctype>. Ils servent à
comprendre et à suivre le raisonnement de ces fonctions.
#include <stdio.h>
#include <string.h>
main()
{
/* Déclarations */
/* Sujets et terminaisons */
char SUJ[6][5] = {"je","tu","il","nous","vous","ils"};
char TERM[6][5] = {"e","es","e","ons","ez","ent"};
char VERB[20]; /* chaîne contenant le verbe */
int L; /* longueur de la chaîne */
int I; /* indice courant */
Sauf indication contraire, les exercices suivants sont à résoudre sans utiliser les
fonctions spéciales des bibliothèques <string>, <stdlib> ou <ctype>. Ils servent à
comprendre et à suivre le raisonnement de ces fonctions.
Exercice 8.15
Ecrire un programme qui lit deux chaînes de caractères, et qui indique leur précédence
lexicographique dans le code de caractères de la machine (ici: code ASCII). Testez
votre programme à l'aide des exemples du chapitre 8.5.
#include <stdio.h>
main()
{
/* Déclarations */
char CH1[50], CH2[50]; /* chaînes à comparer */
int I; /* indice courant */
Ecrire un programme qui lit une chaîne de caractères CH et qui convertit toutes les
majuscules dans des minuscules et vice-versa.
#include <stdio.h>
main()
{
/* Déclarations */
char CH[100]; /* chaîne à convertir */
int I; /* indice courant */
/* Saisie de la chaîne */
printf("Entrez la chaîne à convertir : ");
gets(CH);
/* Conversion de la chaîne */
for (I=0; CH[I]; I++)
{
if (CH[I]>='A' && CH[I]<='Z')
CH[I] = CH[I]-'A'+'a';
else if (CH[I]>='a' && CH[I]<='z')
CH[I] = CH[I]-'a'+'A';
}
/* Affichage de la chaîne convertie */
printf("Chaîne convertie : %s\n", CH);
return 0;
}
Exercice 8.17
Ecrire une procédure qui lit une chaîne de caractères et l'interprète comme un entier
positif dans la base décimale. Pour la conversion, utiliser les fonctions de <ctype> et
la précédence alphabétique des caractères de '0' à '9'. Mémoriser le résultat dans une
variable du type long. La conversion s'arrête à la rencontre du premier caractère qui
ne représente pas de chiffre décimal. Utiliser un indicateur logique OK qui précise si
la chaîne représente correctement une valeur entière et positive.
#include <stdio.h>
#include <ctype.h>
main()
{
/* Déclarations */
char CH[100]; /* chaîne numérique à convertir */
long N; /* résultat numérique */
int I; /* indice courant */
int OK; /* indicateur logique précisant si la */
/* chaîne a été convertie avec succès */
/* Saisie de la chaîne */
printf("Entrez un nombre entier et positif : ");
gets(CH);
/* Conversion de la chaîne */
OK=1;
N=0;
for (I=0; OK && CH[I]; I++)
if (isdigit(CH[I]))
N = N*10 + (CH[I]-'0');
else
OK=0;
Exercice 8.18
Ecrire une procédure qui lit une chaîne de caractères et l'interprète comme un entier
positif dans la base hexadécimale. Pour la conversion, utiliser les fonctions de
<ctype> et la précédence alphabétique des caractères. La conversion ignore les
caractères qui ne représentent pas de chiffre hexadécimal et s'arrête à la fin de la
chaîne de caractères. Le résultat sera mémorisé dans une variable du type long et
affiché dans les bases hexadécimale et décimale.
#include <stdio.h>
#include <ctype.h>
main()
{
/* Déclarations */
char CH[100]; /* chaîne numérique à convertir */
long N; /* résultat numérique */
int I; /* indice courant */
int OK; /* indicateur logique précisant si la */
/* chaîne a été convertie avec succès */
/* Saisie de la chaîne */
printf("Entrez un nombre hexadécimal entier et positif : ");
gets(CH);
/* Conversion de la chaîne */
OK=1;
N=0;
for (I=0; OK && CH[I]; I++)
if (isxdigit(CH[I]))
{
CH[I] = toupper(CH[I]);
if (isdigit(CH[I]))
N = N*16 + (CH[I]-'0');
else
N = N*16 + 10 + (CH[I]-'A');
}
else
OK=0;
En se basant sur l'exercice 8.17, écrire un programme qui lit une chaîne de caractères
et l'interprète comme un nombre rationnel positif ou négatif introduit en notation
décimale. Mémoriser le résultat dans une variable du type double. Si le nombre a été
introduit correctement, la valeur du résultat sera affichée, sinon le programme
affichera un message d'erreur.
Méthode:
Utiliser une variable SIG pour mémoriser le signe de la valeur. Convertir tous les
caractères numériques (avant et derrière le point décimal) en une valeur entière N.
Compter les décimales (c.-à-d.: les positions derrière le point décimal) à l'aide d'une
variable DEC et calculer la valeur rationnelle comme suit:
/* Saisie de la chaîne */
printf("Entrez un nombre rationnel : ");
gets(CH);
/* Conversion de la chaîne : */
/* Initialisation des variables */
OK=1;
N=0.0;
I=0;
SIG=1;
/* Traitement du signe */
if (CH[I]=='-') SIG=-1;
if (CH[I]=='-' || CH[I]=='+')
I++;
/* Positions devant le point décimal */
for ( ; isdigit(CH[I]); I++)
N = N*10.0 + (CH[I]-'0');
/* Traitement du point décimal */
if (CH[I]=='.')
I++;
else if (CH[I])
OK=0;
Exercice 8.20
En se basant sur l'exercice 8.19, écrire un programme qui lit une chaîne de caractères
et l'interprète comme un nombre rationnel positif ou négatif introduit en notation
exponentielle. Mémoriser le résultat dans une variable du type double. Si le nombre a
été introduit correctement, la valeur du résultat sera affichée, sinon le programme
affichera un message d'erreur.
Méthode:
Utiliser une variable SIGE pour mémoriser le signe de l'exposant. Utiliser une
variable EXP pour la valeur de l'exposant. Calculer la valeur de l'exposant à l'aide de
SIGE, DEC et EXP. Calculer ensuite la valeur exacte de N à l'aide d'une formule
analogue à celle de l'exercice ci-dessus.
/* Saisie de la chaîne */
printf("Entrez un nombre rationnel : ");
gets(CH);
/* Conversion de la chaîne */
/* Initialisation des variables */
OK=1;
N=0.0;
I=0;
SIG=1;
SIGE=1;
/* Traitement du signe */
if (CH[I]=='-') SIG=-1;
if (CH[I]=='-' || CH[I]=='+') I++;
/* Positions devant le point décimal */
for ( ; isdigit(CH[I]); I++)
N = N*10.0 + (CH[I]-'0');
/* Traitement du point décimal */
if (CH[I]=='.')
I++;
/* Traitement et comptage des décimales */
for (DEC=0; isdigit(CH[I]); I++, DEC++)
N = N*10.0 + (CH[I]-'0');
/* Traitement de la marque exponentielle */
if (CH[I]=='e'||CH[I]=='E')
I++;
else if (CH[I])
OK=0;
/* Traitement du signe de l'exposant */
if (CH[I]=='-') SIGE=-1;
if (CH[I]=='-' || CH[I]=='+') I++;
/* Traitement de la valeur de l'exposant */
for (EXP=0; isdigit(CH[I]); I++)
EXP = EXP*10 + (CH[I]-'0');
if (CH[I]) OK=0;
/* Calcul de l'exposant à partir du signe */
/* SIGE, de la valeur de l'exposant EXP et */
/* du nombre de positions rationnelles DEC */
EXP = SIGE*EXP - DEC;
/* Calcul de la valeur à partir du signe et */
/* de l'exposant. */
N = SIG*N*pow(10,EXP);
Exercice 8.21
Exercice 8.22
/* Affichage du résultat */
printf("Chaîne résultat : \"%s\"\n", SUJ);
return 0;
}
Exercice 8.23
Ecrire un programme qui remplace toutes les occurrences d'une chaîne de caractères
CH1 par la chaîne CH2 dans une chaîne de caractères SUJ. Utiliser une chaîne de
sauvegarde FIN pendant le remplacement.
/* Affichage du résultat */
printf("Chaîne résultat : \"%s\"\n", SUJ);
return 0;
}
Ecrire un programme profitant des fonctions définies dans les exercices précédents
pour tester la fonction TRI_SHELL.
#include <stdio.h>
main()
{
/* Prototypes des fonctions appelées */
void TRI_SHELL(int *T, int N);
void LIRE_TAB (int *TAB, int *N, int NMAX);
void ECRIRE_TAB (int *TAB, int N);
/* Variables locales */
int T[100]; /* Tableau d'entiers */
int DIM; /* Dimension du tableau */
/* Traitements */
LIRE_TAB (T, &DIM, 100);
printf("Tableau donné : \n");
ECRIRE_TAB (T, DIM);
TRI_SHELL(T, DIM);
printf("Tableau trié : \n");
ECRIRE_TAB (T, DIM);
return 0;
}
void TRI_SHELL(int *T, int N)
{
/* Trie un tableau T d'ordre N par la méthode de Shell */
/* Prototypes des fonctions appelées */
void PERMUTER(int *A, int *B);
/* Variables locales */
int SAUT, M, K;
int TERMINE;
/* Traitements */
SAUT = N;
while (SAUT>1)
{
SAUT /= 2;
do
{
TERMINE=1;
for (M=0; M<N-SAUT; M++) /* Attention aux indices! */
{
K=M+SAUT;
if (*(T+M) > *(T+K))
{
PERMUTER(T+M,T+K);
TERMINE=0;
}
}
}
while(!TERMINE); /* Attention: utiliser la négation de */
} /* la condition employée en lang algorithmique */
}
Exercice 10.18
#include <stdio.h>
main()
{
/* Prototypes des fonctions appelées */
int MAX1 (int *TAB, int N);
int MAX2 (int *TAB, int N);
int *MAX3(int *TAB, int N);
void LIRE_TAB (int *TAB, int *N, int NMAX);
void ECRIRE_TAB (int *TAB, int N);
/* Variables locales */
int T[100]; /* Tableau d'entiers */
int DIM; /* Dimension du tableau */
/* Traitements */
LIRE_TAB (T, &DIM, 100);
printf("Tableau donné : \n");
ECRIRE_TAB (T, DIM);
printf("MAX1 : %d \n", MAX1(T,DIM) );
printf("MAX2 : %d \n", T[MAX2(T,DIM)] );
printf("MAX3 : %d \n", *MAX3(T,DIM) );
return 0;
}
#include <stdio.h>
main()
{
/* Prototypes des fonctions appelées */
void TRI_SELECTION(int *T, int N);
void LIRE_TAB (int *TAB, int *N, int NMAX);
void ECRIRE_TAB (int *TAB, int N);
/* Variables locales */
int T[100]; /* Tableau d'entiers */
int DIM; /* Dimension du tableau */
/* Traitements */
LIRE_TAB (T, &DIM, 100);
printf("Tableau donné : \n");
ECRIRE_TAB (T, DIM);
TRI_SELECTION(T, DIM);
printf("Tableau trié : \n");
ECRIRE_TAB (T, DIM);
return 0;
}
Exercice 10.20
Ecrire la fonction INSERER qui place un élément X à l'intérieur d'un tableau qui
contient N éléments triés par ordre croissant, de façon à obtenir un tableau à N+1
éléments triés par ordre croissant. La dimension du tableau est incrémentée dans la
fonction INSERER.
Ecrire un programme profitant des fonctions définies plus haut pour tester la fonction
INSERER
#include <stdio.h>
main()
{
/* Prototypes des fonctions appelées */
void INSERER(int X, int *T, int *N);
void LIRE_TAB (int *TAB, int *N, int NMAX);
void ECRIRE_TAB (int *TAB, int N);
/* Variables locales */
int T[100]; /* Tableau d'entiers */
int DIM; /* Dimension du tableau */
int A; /* Nombre à insérer */
/* Traitements */
LIRE_TAB (T, &DIM, 100);
printf("Tableau donné : \n");
ECRIRE_TAB (T, DIM);
printf("Introduire le nombre à insérer : ");
scanf("%d", &A);
INSERER(A, T, &DIM);
printf("Tableau résultat : \n");
ECRIRE_TAB (T, DIM);
return 0;
}
Ecrire la fonction TRI_INSERTION qui utilise la fonction INSERER pour trier par
ordre croissant les éléments d'un tableau à N éléments.
Méthode: Trier le tableau de gauche à droite en insérant à chaque fois l'élément I+1
dans le tableau (déjà trié) des I premiers éléments.
#include <stdio.h>
main()
{
/* Prototypes des fonctions appelées */
void TRI_INSERTION(int *T, int N);
void LIRE_TAB (int *TAB, int *N, int NMAX);
void ECRIRE_TAB (int *TAB, int N);
/* Variables locales */
int T[100]; /* Tableau d'entiers */
int DIM; /* Dimension du tableau */
/* Traitements */
LIRE_TAB (T, &DIM, 100);
printf("Tableau donné : \n");
ECRIRE_TAB (T, DIM);
TRI_INSERTION(T, DIM);
printf("Tableau trié : \n");
ECRIRE_TAB (T, DIM);
return 0;
}
void TRI_INSERTION(int *T, int N)
{
void INSERER(int X, int *T, int *N);
/* Variables locales */
int I; /* indice courant */
/* Tri de T par insertion */
I=1;
while (I<N)
INSERER(*(T+I), T, &I);
}
Exercice 10.22
Ecrire la fonction TRI_BULLE qui trie un tableau de N éléments entiers par ordre
croissant en appliquant la méthode de la bulle (tri par propagation - voir exercice
7.15). Employer la fonction RANGER de l'exercice ci-dessus.
#include <stdio.h>
main()
{
/* Prototypes des fonctions appelées */
void LIRE_TAB (int *TAB, int *N, int NMAX);
void TRI_BULLE(int *T, int N);
void ECRIRE_TAB (int *TAB, int N);
/* Variables locales */
int T[100]; /* Tableau d'entiers */
int DIM; /* Dimension du tableau */
/* Traitements */
LIRE_TAB (T, &DIM, 100);
printf("Tableau donné : \n");
ECRIRE_TAB (T, DIM);
TRI_BULLE(T, DIM);
printf("Tableau trié : \n");
ECRIRE_TAB (T, DIM);
return 0;
}
Ecrire la fonction FUSION qui construit un tableau FUS trié par ordre croissant avec
les éléments de deux tableaux A et B triés par ordre croissant. Pour deux tableaux de
dimensions N et M, le tableau FUS aura la dimension N+M. (Méthode: voir exercice
7.13)
Ecrire un programme qui teste la fonction FUSION à l'aide de deux tableaux lus au
clavier et triés à l'aide de TRI_BULLE.
#include <stdio.h>
main()
{
/* Prototypes des fonctions appelées */
void FUSION(int *A, int *B, int *FUS, int N, int M);
void TRI_BULLE(int *T, int N);
void LIRE_TAB (int *TAB, int *N, int NMAX);
void ECRIRE_TAB (int *TAB, int N);
/* Variables locales */
/* Les tableaux et leurs dimensions */
int A[100], B[100], FUS[200];
int N, M;
/* Traitements */
printf("*** Tableau A ***\n");
LIRE_TAB (A, &N, 100);
printf("*** Tableau B ***\n");
LIRE_TAB (B, &M, 100);
TRI_BULLE(A, N);
printf("Tableau A trié : \n");
ECRIRE_TAB (A, N);
TRI_BULLE(B, M);
printf("Tableau B trié : \n");
ECRIRE_TAB (B, M);
FUSION(A,B,FUS,N,M);
printf("Tableau FUS : \n");
ECRIRE_TAB (FUS, N+M);
return 0;
}
a) Ecrire la fonction LIRE_DIM à quatre paramètres L, LMAX, C, CMAX qui lit les
dimensions L et C d'une matrice à deux dimensions. Les dimensions L et C doivent
être inférieures à LMAX respectivement CMAX.
void LIRE_DIM (int *L, int LMAX, int *C, int CMAX)
{
/* Saisie des dimensions de la matrice */
do
{
printf("Nombre de lignes de la matrice (max.%d) : ",LMAX);
scanf("%d", L);
}
while (*L<0 || *L>LMAX);
do
{
printf("Nombre de colonnes de la matrice (max.%d) : ",CMAX);
scanf("%d", C);
}
while (*C<0 || *C>CMAX);
}
Exercice 10.38
Exercice 10.39
#include <stdio.h>
main()
{
/* Prototypes des fonctions appelées */
long SOMME_MATRICE (int *MAT, int L, int C, int CMAX);
void LIRE_DIM (int *L, int LMAX, int *C, int CMAX);
void LIRE_MATRICE (int *MAT, int L, int C, int CMAX);
void ECRIRE_MATRICE (int *MAT, int L, int C, int CMAX);
/* Variables locales */
int M[30][30]; /* Matrice d'entiers */
int L, C; /* Dimensions de la matrice */
/* Traitements */
LIRE_DIM (&L, 30, &C, 30);
LIRE_MATRICE ( (int*)M, L,C,30);
printf("Matrice donnée : \n");
ECRIRE_MATRICE ( (int*)M, L,C,30);
printf("Somme des éléments de la matrice : %ld\n",
SOMME_MATRICE( (int*)M, L,C,30));
return 0;
}
void LIRE_DIM (int *L, int LMAX, int *C, int CMAX)
{
. . .
}
Exercice 10.40
Choisir les paramètres nécessaires et écrire un petit programme qui teste la fonction
ADDITION_MATRICE.
#include <stdio.h>
main()
{
/* Prototypes des fonctions appelées */
void ADDITION_MATRICE (int *MAT1, int *MAT2, int L, int C, int
CMAX);
void LIRE_DIM (int *L, int LMAX, int *C, int CMAX);
void LIRE_MATRICE (int *MAT, int L, int C, int CMAX);
void ECRIRE_MATRICE (int *MAT, int L, int C, int CMAX);
/* Variables locales */
/* Les matrices et leurs dimensions */
int M1[30][30], M2[30][30];
int L, C;
/* Traitements */
LIRE_DIM (&L,30,&C,30);
printf("*** Matrice 1 ***\n");
LIRE_MATRICE ((int*)M1,L,C,30 );
printf("*** Matrice 2 ***\n");
LIRE_MATRICE ((int*)M2,L,C,30 );
printf("Matrice donnée 1 : \n");
ECRIRE_MATRICE ((int*)M1,L,C,30);
printf("Matrice donnée 2 : \n");
ECRIRE_MATRICE ((int*)M2,L,C,30);
ADDITION_MATRICE( (int*)M1 , (int*)M2 ,L,C,30);
printf("Matrice résultat : \n");
ECRIRE_MATRICE ((int*)M1,L,C,30);
return 0;
}
void ADDITION_MATRICE (int *MAT1, int *MAT2, int L, int C, int CMAX)
{
/* Variables locales */
int I,J;
/* Ajouter les éléments de MAT2 à MAT1 */
for (I=0; I<L; I++)
for (J=0; J<C; J++)
*(MAT1+I*CMAX+J) += *(MAT2+I*CMAX+J);
}
void LIRE_DIM (int *L, int LMAX, int *C, int CMAX)
{
. . .
}
Exercice 10.41
Choisir les paramètres nécessaires et écrire un petit programme qui teste la fonction
MULTI_MATRICE.
#include <stdio.h>
main()
{
/* Prototypes des fonctions appelées */
void MULTI_MATRICE(int X, int *MAT, int L, int C, int CMAX);
void LIRE_DIM (int *L, int LMAX, int *C, int CMAX);
void LIRE_MATRICE (int *MAT, int L, int C, int CMAX);
void ECRIRE_MATRICE (int *MAT, int L, int C, int CMAX);
/* Variables locales */
int M[30][30]; /* Matrice d'entiers */
int L, C; /* Dimensions de la matrice */
int X;
/* Traitements */
LIRE_DIM (&L,30,&C,30);
LIRE_MATRICE ((int*)M,L,C,30 );
printf("Introduire le multiplicateur (entier) : ");
scanf("%d", &X);
printf("Matrice donnée : \n");
ECRIRE_MATRICE ((int*)M,L,C,30);
MULTI_MATRICE (X,(int*)M,L,C,30);
printf("Matrice résultat : \n");
ECRIRE_MATRICE ((int*)M,L,C,30);
return 0;
}
void LIRE_DIM (int *L, int LMAX, int *C, int CMAX)
{
. . .
}
Exercice 10.42
#include <stdio.h>
main()
{
/* Prototypes des fonctions appelées */
int TRANSPO_MATRICE (int *MAT, int *L, int LMAX, int *C, int CMAX);
void LIRE_DIM (int *L, int LMAX, int *C, int CMAX);
void LIRE_MATRICE (int *MAT, int L, int C, int CMAX);
void ECRIRE_MATRICE (int *MAT, int L, int C, int CMAX);
/* Variables locales */
int M[30][30]; /* Matrice d'entiers */
int L, C; /* Dimensions de la matrice */
/* Traitements */
LIRE_DIM (&L,30,&C,30);
LIRE_MATRICE ((int*)M,L,C,30 );
printf("Matrice donnée : \n");
ECRIRE_MATRICE ((int*)M,L,C,30);
if (TRANSPO_MATRICE ((int*)M,&L,30,&C,30))
{
printf("Matrice transposée : \n");
ECRIRE_MATRICE ((int*)M,L,C,30);
}
else
printf("\aLa matrice n'a pas pu être transposée\n");
return 0;
}
int TRANSPO_MATRICE (int *MAT, int *L, int LMAX, int *C, int CMAX)
{
/* Prototypes des fonctions appelées */
void PERMUTER(int *A, int *B);
/* Variables locales */
int I,J;
int DMAX; /* la plus grande des deux dimensions */
/* Transposition de la matrice */
if (*L>CMAX || *C>LMAX)
return 0;
else
{
DMAX = (*L>*C) ? *L : *C;
for (I=0; I<DMAX; I++)
for (J=0; J<I; J++)
PERMUTER (MAT+I*CMAX+J, MAT+J*CMAX+I);
PERMUTER(L,C); /* échanger les dimensions */
return 1;
}
}
void LIRE_DIM (int *L, int LMAX, int *C, int CMAX)
{
. . .
}
Exercice 10.43
Supposez que les dimensions maximales des trois matrices soient toutes égales à 30
lignes et 30 colonnes. Ecrire un petit programme qui teste la fonction
MULTI_2_MATRICES. (Méthode de calcul: voir exercice 7.22.)
#include <stdio.h>
main()
{
/* Prototypes des fonctions appelées */
void MULTI_2_MATRICES (int *MAT1, int *MAT2, int *MAT3,
int N, int M, int P, int CMAX);
void LIRE_DIM (int *L, int LMAX, int *C, int CMAX);
void LIRE_MATRICE (int *MAT, int L, int C, int CMAX);
void ECRIRE_MATRICE (int *MAT, int L, int C, int CMAX);
/* Variables locales */
/* Les matrices et leurs dimensions */
int M1[30][30], M2[30][30], M3[30][30];
int N, M, P;
int DUMMY; /* pour la lecture de la première dimension de */
/* MAT2 à l'aide de LIRE_DIM. */
/* Traitements */
printf("*** Matrice 1 ***\n");
LIRE_DIM (&N,30,&M,30);
LIRE_MATRICE ((int*)M1,N,M,30 );
printf("*** Matrice 2 ***\n");
LIRE_DIM (&DUMMY,30,&P,30);
LIRE_MATRICE ((int*)M2,M,P,30 );
printf("Matrice donnée 1 : \n");
ECRIRE_MATRICE ((int*)M1,N,M,30);
printf("Matrice donnée 2 : \n");
ECRIRE_MATRICE ((int*)M2,M,P,30);
MULTI_2_MATRICES ((int*)M1 , (int*)M2 , (int*)M3 , N,M,P,30);
printf("Matrice résultat : \n");
ECRIRE_MATRICE ((int*)M3,N,P,30);
return 0;
}
void LIRE_DIM (int *L, int LMAX, int *C, int CMAX)
{
. . .
}