Построить результат сглаживания заданной вещественной матрицы - C (СИ)
Формулировка задачи:
Соседями элемента Aij в матрице назовём элементы Akl с i-1<k<i+1 , j-1<l <j+1 , (k,l) неравно (i,j) . Операция сглаживания матрицы даёт новую матрицу того же размера, каждый элемент которой получается как среднее арифметической имеющихся соседей соответствующего элемента исходной матрицы. Построить результат сглаживания заданной вещественной матрицы размером 10 на 10. также должны быть подпрограммы ввода и вывода, я тут набросал)заранее спасибо
#include <stdio.h>
#include <stdlib.h>
#include <locale>
void main()
{
setlocale(LC_ALL,"Russian");
int i,j,k,l;
int const n=10;
float A[n][n];
printf("Введите элементы матрицы размером 10х10:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%f",&A[i][j]);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
...
system("pause");
}Решение задачи: «Построить результат сглаживания заданной вещественной матрицы»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void vvod(double *, int );
void vyvod(double *, int ) ;
void solve(double *, double *, int );
double sr(double *, int , int, int );
int main(void)
{
const int n = 10;
double matr[n][n];
double rezm[n][n];
double *pa=&matr[0][0]; // указатель на первый элемент массива, т.е. !!!адрес массива!!!
// в Си/С++ нет принципиальной разницы между одномерным и двумерным массивом,
// двумерный - это одномерный, в котором строки двумерного хранятся псоледовательно - 0,1...n-1
// тогда для доступа к элемиенту используем a[i*число_элементов_в_строке+j], при обработке
// массива по строкам и a[i+j*число_элементов_в_столбце]
double *pb=&rezm[0][0];
vvod(pa,n);
vyvod(pa,n);
solve(pa,pb, n);
vyvod(pb, n);
return EXIT_SUCCESS; // return 0, если не было ошибок
}
void vvod(double *a, int n)
{
int i = 0, j = 0;
srand(time(NULL));
for (i = 0; i < n; ++i)
for (j = 0; j < n; ++j) {
a[i*n+j] = (double) (rand() % 10);
// a[i][j] приведение к типу double
}
}
void vyvod(double *a, int n)
{
int i = 0, j = 0;
printf("\n");
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
printf("%4.2lf ", a[i*n+j]);
// печатаем в формате 4 символа два после запятой
}
printf("\n");
}
}
void solve(double *a, double *b, int n)
{
int i = 0, j = 0;
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
b[i*n+j]=sr(a, i, j, n); // счмиаем ср. арифм. соседей
}
}
}
;
double sr(double *a, int i, int j, int n)
{
int k = 0, l = 0;
double sum = 0.0;
int count = 0;
for (k = i - 1; k <= i + 1; ++k) {
for (l = j - 1; l <= j + 1; ++l) {
if (k<0||k==n||l<0||l==n) continue; // отсеваем недопустимые значения, или так ||(k==i&&l==j)
sum += a[k*n+l]; // сумма
count++; // ср. арифм.
}
}
return (sum-a[i*n+j])/(--count); // как вариант, а здесь sum/count;
// уменбшаем сумму на (i,j) элемнт, уменьшаем на 1 число слагаемых и потом делим
}
Объяснение кода листинга программы
Код решает задачу сглаживания вещественной матрицы. Список действий:
- В функции
vvodинициализируются случайные значения для матрицыmatrс помощью функцииrand(). - В функции
vvodвыводится начальное значение матрицыmatr. - В функции
solveпроисходит сглаживание матрицыmatrс помощью функцииsrи сохранение результата в матрицуrezm. - В функции
vvodвыводится окончательное значение матрицыrezm. - В функции
mainвызываются функцииvvod,solve,vvodдля ввода, сглаживания и вывода матрицы соответственно. - В функции
mainвозвращается значениеEXIT_SUCCESS, указывающее на отсутствие ошибок. - В функции
solveпроисходит проход по всем элементам матрицыaс помощью цикловfor. - В функции
solveдля каждого элемента матрицыaпроисходит вычисление среднего значения его соседей с помощью функцииsr. - В функции
srпроисходит проход по всем допустимым соседям элементаa[i][j]с помощью вложенных цикловfor. - В функции
srсуммируются значения соседей элементаa[i][j]с помощью переменнойsum. - В функции
srувеличивается счетчик числа соседейcount. - В функции
srвозвращается среднее значение суммы соседей элементаa[i][j]. - В функции
mainуказывается размерность матрицыnконстантойconst int n = 10. - В функции
mainматрицаmatrинициализируется с помощью оператораdouble matr[n][n] = {};. - В функции
mainадрес первого элемента матрицыmatrсохраняется в указательpa. - В функции
mainадрес первого элемента матрицыrezmсохраняется в указательpb. - В функции
mainвызывается функцияvvodс указателем на матрицуmatrи её размерностьюn. - В функции
mainвызывается функцияsolveс указателями на матрицыaиrezmи их размерностьюn. - В функции
mainвызывается функцияvvodс указателем на матрицуrezmи её размерностьюn. - В функции
mainвозвращается значениеEXIT_SUCCESS, указывающее на отсутствие ошибок.