Построить результат сглаживания заданной вещественной матрицы - 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 число слагаемых и потом делим
}

Объяснение кода листинга программы

Код решает задачу сглаживания вещественной матрицы. Список действий:

  1. В функции vvod инициализируются случайные значения для матрицы matr с помощью функции rand().
  2. В функции vvod выводится начальное значение матрицы matr.
  3. В функции solve происходит сглаживание матрицы matr с помощью функции sr и сохранение результата в матрицу rezm.
  4. В функции vvod выводится окончательное значение матрицы rezm.
  5. В функции main вызываются функции vvod, solve, vvod для ввода, сглаживания и вывода матрицы соответственно.
  6. В функции main возвращается значение EXIT_SUCCESS, указывающее на отсутствие ошибок.
  7. В функции solve происходит проход по всем элементам матрицы a с помощью циклов for.
  8. В функции solve для каждого элемента матрицы a происходит вычисление среднего значения его соседей с помощью функции sr.
  9. В функции sr происходит проход по всем допустимым соседям элемента a[i][j] с помощью вложенных циклов for.
  10. В функции sr суммируются значения соседей элемента a[i][j] с помощью переменной sum.
  11. В функции sr увеличивается счетчик числа соседей count.
  12. В функции sr возвращается среднее значение суммы соседей элемента a[i][j].
  13. В функции main указывается размерность матрицы n константой const int n = 10.
  14. В функции main матрица matr инициализируется с помощью оператора double matr[n][n] = {};.
  15. В функции main адрес первого элемента матрицы matr сохраняется в указатель pa.
  16. В функции main адрес первого элемента матрицы rezm сохраняется в указатель pb.
  17. В функции main вызывается функция vvod с указателем на матрицу matr и её размерностью n.
  18. В функции main вызывается функция solve с указателями на матрицы a и rezm и их размерностью n.
  19. В функции main вызывается функция vvod с указателем на матрицу rezm и её размерностью n.
  20. В функции main возвращается значение EXIT_SUCCESS, указывающее на отсутствие ошибок.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.375 из 5
Похожие ответы