//--- TP 5 Corrigé ---
#pragma hdrstop
#include <time>
#include <iostream>
#include <iomanip>
using namespace std;
//--- variables --- int M [20][20], P[20][20];
int n,p;
//---- fonctions --- void saisir();
void remplirmatrice();
void affichermatrice(int m[][20]);
void lisserlignes(int m[][20]);
void lissercolonnes(int m[][20]);
//---- corps du programme ---
#pragma argsused
int main(int argc, char* argv[]) {
srand(time(NULL));
saisir();
remplirmatrice();
cout << "Matrice originale :" << endl;
affichermatrice(M);
lisserlignes(M);
cout << endl << "Matrice lissee par lignes :" << endl;
affichermatrice(M);
lissercolonnes(M);
cout << endl << "Matrice lissee par colonnes :" << endl;
affichermatrice(M);
cout << endl << "Changement d'ordre des lissages, matrice originale :" << endl;
affichermatrice(P);
lissercolonnes(P);
cout << endl << "Matrice lissee par colonnes :" << endl;
affichermatrice(P);
lisserlignes(P);
cout << endl << "Matrice lissee par lignes :" << endl;
affichermatrice(P);
cin.sync();
cin.get();
return 0;
}
// dans tout ce qui suit dans les répétitives for et les éléments // de matrices i est un numéro de ligne et j un numéro de colonne // m[i][j] : élément de la ième ligne et de la jème colonne
// --- description des fonctions --- void saisir()
{
cout << "Saisir n (5<=n<=20) :";
cin >> n;
cout << "Saisir p (1<=p<=" << (int)n/2 << ") :";
cin >> p;
}
void remplirmatrice() {
for (int i=1 ; i<=n ; i++)// pour toutes les lignes {
for (int j=1 ; j<=n ; j++)// pour toutes les colonnes { m[i][j]=rand()%256;
// %256 est un "modulo" 256 donc un entier de 0 à 255 p[i][j]=m[i][j];
} }
}
void affichermatrice(int m[][20]) {
for (int i=1 ; i<=n ; i++)// pour toutes les lignes {
for (int j=1 ; j<=n ; j++)// pour toutes les colonnes cout << setw(4) << (int)m[i][j];
cout << endl;
}
cout << endl;
}
void lisserlignes(int m[][20]) {
for (int i=1 ; i<=n ; i++)// pour toutes les lignes // pour les colonnes possibles
for (int j=p+1 ; j<=n-p ; j++) {
int s=0;
for (int k=j-p ; k<=j+p ; k++) s+=m[i][k];
m[i][j]=(int)s/(2*p+1) ; }
}
void lissercolonnes(int m[][20]) {
for (int j=1 ; j<=n ; j++)// pour toutes les colonnes // pour les lignes possibles
for (int i=p+1 ; i<=n-p ; i++) {
int s=0;
for (int k=j-p ; k<=j+p ; k++) s+=m[k][j];
m[i][j]=s/(2*p+1);
} }
//--- FIN SOURCE ---
--->
Bien regarder les indices lorsqu'on "lisse" une ligne ou une colonne : pour une ligne, par exemple
colonnes :
j – p...j – 1 j j + 1...j
+ p ligne i
la moyenne :
(m[i] [j-p]+ m[i] [j-p+1]+ … + m[i] [j-1]+ m[i]
[j]+ m[i][j+1]+ … + m[i] [j+p-1] + m[i] [j+p]) / (2p+1)
remplace m[i]
[j]et on a à additionner les
m[i][
k] pour z=j–p à j+p.Pour le lissage de chaque colonne j, le problème est analogue pour les limites des indices i de lignes.
Faire les répétitives imbriquées dans l'ordre normal.
élément m[i][j] à transformer