Tableaux | Exercices 11-14
Enoncé exercice 11
Ecrire un programme C qui lit un tableau d’entiers puis affiche une des plus longues séquences croissantes qu’il contient.
Correction exercice 11
Une idée pour résoudre cet exercice sera de parcourir le tableau t à l’aide d’une boucle for de compteur i. Et pour chaque position i, on va chercher la plus longue séquence croissante qui y commence. Et on va actualiser en parallèle la plus longue séquence retrouvée en conservant en même temps sa position de départ et sa longueur.
Pour trouver la plus longue séquence croissante qui commence à i, on va utiliser une boucle while pour parcourir le tableau t à partir de l’indice i+1 en incrémentant un compteur j chaque fois que le nouvel élément atteint est supérieur à celui qui le précède, en veillant aussi à ne pas déborder du tableau t (lignes 15-17).
La sortie de cette boucle veut dire, soit que l’élément t[j] ne constitue pas une séquence croissante avec les éléments t[i],…,t[j-1], ou que j a atteint la valeur n. Dans les deux cas, t[i],…,t[j-1] est la plus langue séquence croissante qui commence par i. On calcule alors sa longueur l, et on la compare avec lmax qui est la longueur max trouvée jusqu’à ce stade.
Dans le cas où l est supérieur à lmax, on actualise ce dernier et on garde la position de départ i dans imax pour pouvoir repérer cette séquence lors de l’affichage (lignes 19-23). Il est très important de ne pas oublier d’initialiser lmax par 0 avant l’entrée dans la boucle for (ligne 12).
La séquence à afficher est de longueur lmax, et commence à la position imax. Donc, il faudra afficher tous les entiers entre les deux indices imax et imax+lmax-1 les deux inclus (lignes 26-27).
Solution exercice 11
#include<stdio.h>
#include<stdlib.h>
int main()
{
int t[100];
int i,j,l,lmax,imax,n;
printf("Entrez le nombre d'elements: ");
scanf("%d",&n);
printf("Entrez les elements du tableau;\n");
for(i=0;i<n;i++)
scanf("%d",&t[i]);
lmax=0;
for(i=0;i<n;i++)
{
j=i+1;
while(j<n && t[j-1]<=t[j])
j++;
l=j-i;
if(l>lmax)
{
lmax=l;
imax=i;
}
}
printf("Une des plus longues sequences est:\n");
for(i=imax;i<imax+lmax;i++)
printf("%d ",t[i]);
printf("\n");
system("pause");
return 0;
}
Enoncé exercice 12
Ecrire un programme C qui lit un tableau d’entiers, puis un entier m et déplace les m premiers éléments du tableau vers la fin de celui-ci.
Exemple : déplacement des trois premiers éléments d’un tableau.

Correction exercice 12
La démarche qui sera adopté pour cet exercice consiste à utiliser un tableau auxiliaire aux dans lequel on va stocker les m premiers éléments du tableau t (lignes 14-15). Une fois ces entiers sont conservés, on pourra alors décaler chacun des autres éléments, en les mettant dans le début du tableau t.
Pour faire ceci, on va utiliser une boucle for de compteur i allant de m jusqu’à la fin du tableau. Pour ne pas trop compliquer les choses en essayant de trouver une relation entre l’ancienne et la nouvelle position d’un entier à l’indice i, on va utiliser un autre compteur j commençant à 0 et s’incrémentant en parallèle avec i (ligne 16). De cette façon, un entier t[i] sera déplacé vers la case d’indice j (ligne 17).
Pour replacer les m entiers de nouveau dans t, on va parcourir le tableau aux avec une boucle de compteur i pour mettre à chaque fois l’entier aux[i] dans la position j du tableau t (lignes 18-19). Le compteur j est incrémenté par cette boucle for, mais il n’a pas été réinitialisé. Et ce, pour pouvoir continuer dans la position où elle s’est arrêté la boucle for précédente.
Solution exercice 12
#include<stdio.h>
#include<stdlib.h>
int main()
{
int t[100],aux[100];
int i,j,m,n;
printf("Entrez le nombre d'elements: ");
scanf("%d",&n);
printf("Entrez les elements du tableau:\n");
for(i=0;i<n;i++)
scanf("%d",&t[i]);
printf("Entrez le nombre d'elements a deplacer: ");
scanf("%d",&m);
for(i=0;i<m;i++)
aux[i]=t[i];
for(i=m,j=0;i<n;i++,j++)
t[j]=t[i];
for(i=0;i<m;i++,j++)
t[j]=aux[i];
for(i=0;i<n;i++)
printf("%d ",t[i]);
printf("\n");
system("pause");
return 0;
}
Enoncé exercice 13
Ecrire un programme C qui effectue la demi-vectorisation d’une matrice carrée.
La demi-vectorisation (vech : half vectorization) d’une matrice carrée est une opération qui donne un vecteur constitué des éléments du triangle inférieur, comme montré sur l’exemple suivant :

Correction exercice 13
Pour lire une matrice carrée M, une seule dimension n suffira. Puisqu’elle a autant de lignes que de colonnes. Et sa lecture se fera comme d’habitude avec deux boucles for imbriquées de compteurs différents (lignes 8-13).
Le résultat de la demi-vectorisation de la matrice M, sera stocké dans un tableau à une dimension appelé vech. Afin de le construire, il faudra parcourir les éléments de la partie triangulaire inférieure de la matrice M. Pour faire ceci, il est essentiel de remarquer qu’en suivant ces éléments, on est en train de parcourir la matrice M, colonne par colonne et non pas ligne par ligne comme il en est l’habitude. Ceci va affecter l’ordre des deux boucles for (lignes 15-16).
La deuxième remarque à faire, est qu’on est pas obligé de parcourir une colonne en totalité, mais seulement à partir de l’élément de la diagonale et en allant vers le bas. Et on sait que les éléments de la diagonale sont caractérisé par le fait que leur indice de ligne est le même que celui de colonne.
En résumé, une colonne j sera parcourue par une boucle for de compteur i allant de j à n-1.
Pour remplir vech par les éléments parcourus, on va utiliser un troisième compteur k commençant à 0 (ligne 14), et s’incrémentant (ligne 16) après chaque opération de remplissage, c’est-à-dire avec l’incrémentation de i (ligne 17).
On termine le programme en affichant le tableau vech construit (lignes 18-19).
Solution exercice 13
#include<stdio.h>
#include<stdlib.h>
int main()
{
int M[15][15];
int vech[200];
int i,j,k,n;
printf("Entrez la taille de la matrice carre: ");
scanf("%d",&n);
printf("Entrez les elements de la matrice:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&M[i][j]);
k=0;
for(j=0;j<n;j++)
for(i=j;i<n;i++,k++)
vech[k]=M[i][j];
for(i=0;i<k;i++)
printf("|%3d |\n",vech[i]);
system("pause");
return 0;
}
Enoncé exercice 14
Ecrire un programme C qui lit deux matrices de mêmes dimensions, et réalise leur produit de Hadamard.
Ce produit est obtenu en multipliant les coefficients qui occupent les mêmes positions, comme montré sur l’exemple suivant :

Correction exercice 14
Le programme va commencer par la lecture du nombre de lignes et celui de colonnes vers les deux variables entières n et m (lignes 7-8). Après, on lira séparément les coefficients des deux matrices vers les deux tableaux à deux dimensions A et B (lignes 9-16).
Le produit de Hadamard de ces deux matrices, sera affiché directement sans le stocker dans une troisième matrice. Pour faire ceci, il suffira d’utiliser deux boucles for imbriquées pour parcourir les lignes et les colonnes des deux matrices (lignes 18 et 20). Et pour chaque couple d’indices (i,j) on va afficher la composante (i,j) du produit, qui sera calculée tout simplement en multipliant A[i][j] par B[i][j] (ligne 21).
Pour assurer la mise en forme de la matrice affichée, il est conseillé d’afficher chaque coefficient sur un nombre fixe d’espaces (ici sur 4 espaces %4d). En plus, il faudra passer à une nouvelle ligne chaque fois qu’une ligne entière est affichée (ligne 22).
Solution exercice 14
#include<stdio.h>
#include<stdlib.h>
int main()
{
int A[15][15],B[15][15];
int i,j,n,m;
printf("Entrez le nombre de lignes et de colonnes:\n");
scanf("%d%d",&n,&m);
printf("Entrez les elements de la la matrice A:\n");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&A[i][j]);
printf("Entrez les elements de la la matrice B:\n");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&B[i][j]);
printf("Le produit da Hadamard de A et B est:\n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%4d",A[i][j]*B[i][j]);
printf("\n");
}
system("pause");
return 0;
}