Académique Documents
Professionnel Documents
Culture Documents
TABLEAUX
Correction TP
04 12 2006
#include <stdio.h>
main()
{
/* Dclarations */
int A[50]; /* tableau donn
int VAL;
/* valeur insrer
int N;
/* dimension
int I;
/* indice courant
*/
*/
*/
*/
04 12 2006
IA);
(max.50) : ");
B dans l'ordre croissant :\n");
IB);
B */
04 12 2006
a) La recherche squentielle
#include <stdio.h>
main()
{
/* Dclarations */
int A[50]; /* tableau donn */
int VAL; /* valeur rechercher */
int POS; /* position de la valeur */
int N; /* dimension
*/
int I; /* indice courant */
/* Saisie des donnes */
printf("Dimension du tableau (max.50) : ");
scanf("%d", &N );
for (I=0; I<N; I++)
{
printf("Element %d : ", I);
scanf("%d", &A[I]);
}
printf("Element a rechercher : ");
scanf("%d", &VAL );
Correction TP
04 12 2006
/* Affichage du tableau */
printf("Tableau donne : \n");
for (I=0; I<N; I++)
printf("%d ", A[I]);
printf("\n");
/* Recherche de la position de la valeur */
POS = -1;
for (I=0 ; (I<N)&&(POS==-1) ; I++)
if (A[I]==VAL)
POS=I;
/* Edition du rsultat */
if (POS==-1)
printf("La valeur recherchee ne se trouve pas "
"dans le tableau.\n");
else
printf("La premiere valeur %d se trouve a la
position %d. \n",
VAL, POS);
return 0;
}
#include <stdio.h>
main()
{
/* Dclarations */
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 */
/* Saisie des donnes */
printf("Dimension du tableau (max.50) : ");
scanf("%d", &N );
for (I=0; I<N; I++)
{
printf("Elment %d : ", I);
scanf("%d", &A[I]);
}
printf("Elment rechercher : ");
scanf("%d", &VAL );
/* Affichage du tableau */
printf("Tableau donn : \n");
for (I=0; I<N; I++)
printf("%d ", A[I]);
printf("\n");
/* Initialisation des limites du domaine de recherche */
INF=0;
SUP=N-1;
/* Recherche de la position de la valeur */
POS=-1;
while ((INF<=SUP) && (POS==-1))
{
MIL=(SUP+INF)/2;
if (VAL < A[MIL])
SUP=MIL-1;
else if (VAL > A[MIL])
INF=MIL+1;
else
Correction TP
04 12 2006
POS=MIL;
/* Edition du rsultat */
if (POS==-1)
printf("La valeur recherche ne se trouve pas "
"dans le tableau.\n");
else
printf("La valeur %d se trouve la position %d. \n",
VAL, POS);
return 0;
Ce type de recherche impose un nombre de tests compris entre 1 (si l'lment recherch est en
1re position) et N (si l'lment recherch est en dernire position), pour une moyenne de
(1+2+...+N)/N = [(1+N)N/2]/N = (1+N)/2 tests.
Lorsque l'information contenue dans le tableau n'est pas trie ou trie suivant un critre qu'il
n'est pas possible d'exploiter, cette recherche est la seule possible mais si le tableau est tri sur
un critre exploitable, nous allons pouvoir diminuer notablement le nombre d'oprations
effectuer par une recherche dichotomique.
Lors de la recherche dichotomique, on limine la moiti des lments du tableau chaque excution de la
boucle. Ainsi, la recherche se termine beaucoup plus rapidement.
Nous pouvons constater qu' la premire tape, nous devions prendre le milieu d'un tableau de
N lments, l'tape suivante le milieu d'un tableau de N/2 lments, puis de N/4 lments, ...
Dans le plus mauvais des cas, la recherche s'arrte quand le nombre d'lments est rduit 1 et
donc quand N/2k<=1 ou quand N<=2k c'est--dire quand k est le plus petit entier>=log 2N.
Rappel :
Dfinition
Un nombre X lev une puissance n donne un rsultat Y : y = xn.
La puissance n reprsente le logarithme de Y en base X.
Exemples
103 = 1000, 24 = 16.
Le logarithme de 1000 en base 10 est 3.
Le logarithme de 16 en base 2 est 4.
log 2 2n = n
La recherche dichotomique devient extrmement avantageuse pour la recherche dans de grands tableaux
(tris) : L'avantage de la recherche dichotomique par rapport la recherche squentielle monte alors
exponentiellement avec la grandeur du tableau trier.
Exemple:
04 12 2006
- le pire des cas pour la recherche dichotomique peut entraner 20 excutions de la boucle.
Correction TP
04 12 2006
#include <stdio.h>
main()
{
/* Dclarations */
int A[50]; /* tableau donn */
int N;
/* dimension
*/
int I;
/* rang partir duquel A n'est pas tri */
int J;
/* indice courant
*/
int TEMP; /* pour la permutation */
int PMAX; /* indique la position de l'lment */
/* maximal droite de A[I]
*/
/* Saisie des donnes */
printf("Dimension du tableau (max.50) : ");
scanf("%d", &N );
for (J=0; J<N; J++)
{
printf("Element %d : ", J);
scanf("%d", &A[J]);
}
/* Affichage du tableau */
printf("Tableau donne :\n");
for (J=0; J<N; J++)
printf("%d ", A[J]);
printf("\n");
/* Tri du tableau par slection directe du maximum. */
for (I=0; I<N-1; I++)
{
/* Recherche du maximum droite de A[I] */
PMAX=I;
for (J=I+1; J<N; J++)
if (A[J]>A[PMAX]) PMAX=J;
/* Echange de A[I] avec le maximum */
TEMP=A[I];
A[I]=A[PMAX];
Correction TP
04 12 2006
A[PMAX]=TEMP;
/* Edition du rsultat */
printf("Tableau trie :\n");
for (J=0; J<N; J++)
printf("%d ", A[J]);
printf("\n");
return 0;
Tableaux 2 dimensions
Exo 6 :
Mise zro de la diagonale principale d'une matrice
Ecrire un programme qui met zro les lments de la diagonale principale d'une matrice carre A donne.
#include <stdio.h>
main()
{
/* Dclarations */
int A[50][50]; /* matrice carre */
int N;
/* dimension de la matrice carre */
int I, J;
/* indices courants */
/* Saisie des donnes */
printf("Dimension de la matrice carree (max.50) : ");
scanf("%d", &N);
for (I=0; I<N; I++)
for (J=0; J<N; J++)
{
printf("Element[%d][%d] : ",I,J);
scanf("%d", &A[I][J]);
}
/* Affichage de la matrice */
printf("Matrice donnee :\n");
for (I=0; I<N; I++)
{
for (J=0; J<N; J++)
printf("%7d", A[I][J]);
printf("\n");
}
/* Mise zro de la diagonale principale */
for (I=0; I<N; I++)
A[I][I]=0;
/* Edition du rsultat */
printf("Matrice resultat :\n");
for (I=0; I<N; I++)
{
for (J=0; J<N; J++)
printf("%7d", A[I][J]);
printf("\n");
}
return 0;
}
Correction TP
04 12 2006
uij =
/1
|
\0
si i = j
si i j
#include <stdio.h>
main()
{
/* Dclarations */
int U[50][50]; /* matrice unitaire */
int N;
/* dimension de la matrice unitaire */
int I, J;
/* indices courants */
/* Saisie des donnes */
printf("Dimension de la matrice carree (max.50) : ");
scanf("%d", &N);
/* Construction de la matrice carre unitaire */
for (I=0; I<N; I++)
for (J=0; J<N; J++)
if (I==J)
U[I][J]=1;
else
U[I][J]=0;
/* Edition du rsultat */
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'opration:
if (I==J)
U[I][J]=1;
else
U[I][J]=0;
peut tre simplifie par:
U[I][J] = (I==J);
Correction TP
04 12 2006
10
/
\
t | a b c d |
| e f g h |
| i j k l |
\
/
/
|
|
|
|
\
a
b
c
d
e
f
g
h
i
j
k
l
\
|
|
|
|
/
a)- La matrice transpose sera mmorise dans une deuxime matrice B qui sera ensuite affiche.
#include <stdio.h>
main()
{/* Dclarations */
int A[50][50]; /* matrice initiale */
int B[50][50]; /* matrice rsultat */
int N, M;
/* dimensions des matrices */
int I, J;
/* indices courants */
/* Saisie des donnes */
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("Element[%d][%d] : ",I,J);
scanf("%d", &A[I][J]);
}
/* Affichage de la matrice */
printf("Matrice donnee :\n");
for (I=0; I<N; I++)
{
for (J=0; J<M; J++)
printf("%7d", A[I][J]);
printf("\n");
}
/* Affectation de la matrice transpose B */
for (I=0; I<N; I++)
for (J=0; J<M; J++)
B[J][I]=A[I][J];
/* Edition du rsultat */
/* Attention: maintenant le rle de N et M est invers. */
printf("Matrice resultat :\n");
for (I=0; I<M; I++)
{
for (J=0; J<N; J++)
printf("%7d", B[I][J]);
printf("\n");
}
return 0;
}
Correction TP
04 12 2006
11
Correction TP
04 12 2006
12
/
\
| X*a X*b X*c X*d |
| X*e X*f X*g X*h |
| X*i X*j X*k X*l |
\
/
a) Le rsultat de la multiplication sera mmoris dans une deuxime matrice A qui sera ensuite affiche.
b) Les lments de la matrice A seront multiplis par X.
a)-Le rsultat de la multiplication sera mmoris dans une deuxime matrice A qui sera ensuite affiche.
#include <stdio.h>
main()
{
float A[50][50];
float B[50][50];
int N, M;
int I, J;
float X;
/* Dclarations */
/* matrice donne */
/* matrice rsultat */
/* dimensions des matrices */
/* indices courants */
/* multiplicateur */
/* Saisie des donnes */
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("Element[%d][%d] : ",I,J);
scanf("%f", &A[I][J]);
}
printf("Multiplicateur X : ");
scanf("%f", &X );
/* Affichage de la matrice */
printf("Matrice donnee :\n");
for (I=0; I<N; I++)
{ for (J=0; J<M; J++)
printf("%10.2f", A[I][J]);
printf("\n");
}
/* Affectation du rsultat 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 rsultat */
printf("Matrice resultat :\n");
for (I=0; I<N; I++)
{ for (J=0; J<M; J++)
printf("%10.2f", B[I][J]);
printf("\n");
}
return 0;
}
Correction TP
04 12 2006
13
/* Dclarations */
/* matrice donne */
/* dimensions de la matrice */
/* indices courants */
/* multiplicateur */
Correction TP
04 12 2006
14
/
\
| a+a' b+b' c+c' d+d' |
| e+e' f+f' g+g' h+h' |
| i+i' j+j' k+k' l+l' |
\
/
a) Le rsultat de l'addition sera mmoris dans une troisime matrice C qui sera ensuite affiche.
b) La matrice B est ajoute A.
a) Le rsultat de l'addition sera mmoris dans une troisime matrice C qui sera ensuite affiche.
#include <stdio.h>
main()
{
/* Dclarations */
int A[50][50]; /* matrice donne */
int B[50][50]; /* matrice donne */
int C[50][50]; /* matrice rsultat */
int N, M; /* dimensions des matrices */
int I, J; /* indices courants */
/* Saisie des donnes */
printf("Nombre de lignes (max.50) : ");
scanf("%d", &N );
printf("Nombre de colonnes (max.50) : ");
scanf("%d", &M );
printf("*** Matrice A ***\n");
for (I=0; I<N; I++)
for (J=0; J<M; J++)
{
printf("Element[%d][%d] : ",I,J);
scanf("%d", &A[I][J]);
}
printf("*** Matrice B ***\n");
for (I=0; I<N; I++)
for (J=0; J<M; J++)
{
printf("Element[%d][%d] : ",I,J);
scanf("%d", &B[I][J]);
}
/* Affichage des matrices */
Correction TP
04 12 2006
15
04 12 2006
16
Correction TP
04 12 2006
17
La multiplication de deux matrices se fait en multipliant les composantes des deux matrices lignes par
colonnes:
Rappel:
/
|
|
|
|
\
a
e
h
k
b
f
i
l
c
g
j
m
\
|
|
|
|
/
/
\
| p q |
| r s |
| t u |
\
/
/
|
|
|
|
\
a*p
e*p
h*p
k*p
+
+
+
+
b*r
f*r
i*r
l*r
+
+
+
+
c*t
g*t
j*t
m*t
a*q
e*q
h*q
k*q
+
+
+
+
b*s
f*s
i*s
l*s
+
+
+
+
c*u
g*u
j*u
m*u
\
|
|
|
|
/
04 12 2006