Académique Documents
Professionnel Documents
Culture Documents
UEO12 TD1
Question n°1 :
Énoncé
dim tab
∑ i1 ×tab [ i ]
i=0
Pour réaliser cette exercice, on suppose que le tableau tab est déclaré de la
façon suivante :
int tab[5]={3,4,8,0,2};
Correction
Nous avons ici à calculer pour chaque valeur de i l'expression (i+1)*tab[i]. Nous
sommes donc ici en présence d'une instruction que nous devons répéter un
nombre connu et fini de fois. Il est donc préférable d'utiliser une boucle for.
int main(void)
{
int tab[5]={3,4,8,0,2};
int i, somme;
//Initialisation de la somme
somme=0;
//Calcul de la somme
for(i=0;i<5;i++)
somme = somme + (i+1)*tab[i];
//Affichage à la fin du calcul
printf(« La somme pondérée est :%d\n »,somme);
}
Question n°2 :
Énoncé
Soit une image en niveau de gris de 10 pixels par 10 pixels. Cette image est
représentée en machine par une matrice de 10 X 10 de unsigned char. La
valeur de chaque pixel est comprise entre 0 (noir) et 255 (blanc).
Exemple :
Dans cet exercice, nous n'avons à réaliser que de l'affichage. Cependant, cet
affichage diffère suivant que la valeur de la case à afficher dépasse ou non un
certain seuil. Il faudra donc prendre en compte cette condition lorsque nous
allons construire le code.
int main(void)
{
unsigned char ima[10][10];
int i,j;
//On suppose que la matrice est remplie
//Seuillage
//Pour chaque ligne
for(i=0; i<10; i++)
{
//Pour chaque valeur de la ligne
for(j=0;j<10;j++)
//On réalise l'affichage du seuillage
if((int)(ima[i][j]) > 120)
printf(« X »);
else
printf(« . »);
//A la fin de chaque ligne, retour à la ligne
printf(« \n »);
}
}
Énoncé
Correction
Pour résoudre ce problème, attachons nous tout d'abord à savoir quelles sont
les diagonales principales et secondaire d'une matrice.
Colonnes (j)
0 1 2 3
Lignes (i)
0 2 4 0 9
1 3 1 5 7
2 8 5 2 6
3 9 2 3 4
Avec :
– les indices de ligne et de colonne
– la diagonale principale
– la première diagonale secondaire
– la seconde diagonale secondaire
On obtient ainsi:
– pour la diagonale principale, i=j et i va de 0 à taille_mat -1 (ici 3)
– pour la première diagonale secondaire, j=i+1 et i va de 0 à taille_mat -2 (ici
2)
– pour la seconde diagonale secondaire, j=i-1 et i va de 1 à taille_mat – 1.
Donc au final, notre calcul de somme sur l'une des diagonales peut être
ramené à un calcul de somme sur un tableau à 1 dimension. Pour le calcul de
la somme, ne pas oublier d'initialiser la variable qui contiendra la somme des
valeurs.
Nous aboutissons donc à la proposition de correction suivante :
int main(void)
{
//On se propose de travailler sur une matrice d'entiers
//de 10 cases par 10 cases.
int mat[10][10];
//On peut ne déclarer qu'une variable contenant la somme car
//le calcul des sommes n'est pas simultané.
int i,somme=0;
//On suppose que la matrice est remplie
//Calcul et affichage de la somme des éléments de la
//diagonale principale
//Pour chaque élément de la diagonale principale
for(i=0; i<10; i++)
//Dans ce cas le numéro de ligne et de colonne sont égaux
somme = somme + mat[i][i];
//Affichage
printf(« La somme des éléments de la diagonale principale est
: %d \n »,somme);
//Calcul et affichage des éléments de la première diagonale
//secondaire
//<!> Attention, penser à réinitialiser somme <!>
somme=0;
//Pour chaque élément de la première diagonale secondaire
for(i=0; i<9; i++)
//Dans ce cas j=i+1
somme = somme + mat[i][i+1];
//Affichage
printf(« La somme des éléments de la première diagonale
secondaire est : %d \n »,somme);
}
Énoncé
Soit un tableau 2D de double que l'on suppose rempli.
Correction
Ici, il faut réaliser deux actions dans le même traitement :
– pour chaque ligne calculer la somme des éléments composant cette ligne
– par un jeu de comparaisons, indiquer l'indice de la ligne pour laquelle la
somme des éléments est maximale.
Tout d'abord, pour réaliser la somme, nous allons utiliser une boucle (nombre
d'instruction connu et fini => for) qui nous permettra de parcourir chaque
élément contenu sur une ligne et de les additionner.
Une fois cette somme obtenue pour une ligne donnée, nous devons trouver le
moyen de comparer cette somme aux sommes obtenues pour les lignes
précédentes. Nous allons pour ce faire utiliser deux variables :
– la première, un double que nous appellerons lmax contiendra la valeur
maximale parmi les sommes rencontrées
– la seconde, un int, que nous appellerons i_max contiendra l'indice de la
ligne pour laquelle la valeur maximale a été rencontrée.
Au début de notre code, nous allons arbitrairement fixer max à la somme des
éléments de la première ligne afin de pouvoir réaliser la comparaison avec les
autres. Donner une valeur arbitraire au départ pour le max (0 ou autre) pourrait
se révéler être préjudiciable au bon fonctionnement du programme, vu que
nous n'avons aucune information sur les données qui ont été saisies dans la
matrice.
int main(void)
{
//On se propose de travailler sur une matrice de double
//de 10 cases par 10 cases.
double mat[10][10];
int i,j,i_max;
double somme, lmax;
//On suppose que la matrice est remplie
//Pour chaque ligne de la matrice
for(i=0;i<10;i++)
{
somme = 0;
//Calculer la somme correspondante
for(j=0;j<10;j++)
somme = somme + mat[i][j];
//Si cette somme est la plus élevée ou si c'est celle de
//la première ligne
if( (somme > lmax) || (i==0))
{
i_max=i;
lmax=somme;
}
}
//Affichage final
printf(« La ligne %d de la matice est la ligne pour laquelle
la somme des éléments est maximale (somme=
%0.2lf) \n »,i_max,lmax);
}
UEO12 TD2
Énoncé
Réaliser un programme permettant d'effectuer un tri par sélection sur un
tableau 1D d'entiers, que l'on considérera rempli.
Correction
Au cours de cette correction nous allons tout d'abord voir l'algorithme
permettant de réaliser le tri par sélection puis un exemple d'application de cet
algorithme sur un tableau de 4 entiers.
Tout d'abord, voyons en quoi consiste ce tri. Comme tout tri, il permet
d'organiser le tableau d'entier par ordre de valeur croissant. La méthode
employé consiste à « repousser » les valeurs les plus élevées vers la fin du
tableau.
L'algorithme peut être schématisé de la sorte :
1) Trouver l'indice de la case possédant la valeur maximale parmi les cases
non triées
2) Permuter cette case avec la dernière case non triée du tableau
3) Répéter cette opération tant qu'il reste des cases à trier.
Indices 0 1 2 3
Valeurs 10 2 1 8