Построить результат сглаживания заданной вещественной матрицы - 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
, указывающее на отсутствие ошибок.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д