Ошибка в коде — обработка матриц - C (СИ)

Узнай цену своей работы

Формулировка задачи:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

void printArray(int *a,int rx, int ry, int m, int n)
{
    int i, j;
    for(i=0; i<m; i++)
    {
    for(j=0; j<n; j++)
    printf("%3d ", *(a + i*rx + j));
    printf("\n");
    }
}
void sort(int *a,int rx,int ry, int m, int n)
{
    int i, j, temp, pr;
    for(i=0; i<n; i++)
    for(j=0; j<m; j++)
    {
        do
        {
        pr=1;
        if(*(a+i*rx+j)<*(a+i*rx+j+1))
            {
                temp=*(a+i*rx+j);
                *(a+i*rx+j)=*(a+i*rx+j+1);
                *(a+i*rx+j+1)=temp;
                pr=0;
            }
        }
        while(!pr);
    }
}
int uslArray(int *a,int rx,int ry, int m, int n)
{
    int i,j,u=0;
    for(i=0; i<m; i++)
    for(j=0; j<n; j++)
    if((*(a + i*rx + j))<j) u++;
    return u;
}
 
void main ()
{
    int n,m,b,i,j;
    int a[100][100];
    clrscr();
    begin:
    printf("vvedite kolicestvo strok=");
    scanf("%d", &m); //m strok
    printf("\nvvedite kolicestvo stolbcov=");
    scanf("%d", &n); //n stolbcov
    if ((m<1)||(n<1)||(n>100)||(m>100))
    {
    printf("nepravil`nyi vvod\n");
    goto begin;
    }
    scanb:
    printf("vvedite konec diapazona generacii chisel:");
    scanf("%d",&b);
    if(b<1)
    {
        printf("ne udovletvoryaet usloviyu!\n");
        goto scanb;
    }
    for(i=0; i<m; i++)
    for(j=0; j<n; j++)
    a[i][j] = random(b)+1;
    printArray(*a,100,100,m,n);
    printf("\n usloviyu udovletvoryaet %d elementov", uslArray(&a[0][0],100,100,m,n));
    sort(&a[0][0],100,100,m,n);
    printf("\n\n");
    printArray(&a[0][0],100,100,m,n);
    printf("\n usloviyu udovletvoryaet %d elementov", uslArray(&a[0][0],100,100,m,n));
    getch();
}

Решение задачи: «Ошибка в коде — обработка матриц»

textual
Листинг программы
void sort(int *a,int rx,int ry, int m, int n)
{
   int i, j, temp, pr;
 
   for(i=0; i<n; i++)
   {
      for(j=0; j<m; j++)
      {
         for (pr = 0; pr < m - j -1; pr++)
         {
            if(*(a+i*rx+pr)<*(a+i*rx+pr+1))
            {
               temp=*(a+i*rx+pr);
               *(a+i*rx+pr)=*(a+i*rx+pr+1);
               *(a+i*rx+pr+1)=temp;
            }
         }
      }
   }
}

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

В представленном коде реализуется сортировка матрицы целых чисел по возрастанию. Список действий, которые выполняются в коде:

  1. Входные данные: матрица a, её размерность rx, ry, количество строк m, количество столбцов n.
  2. Переменные i, j, temp, pr используются для хранения индексов и временного значения.
  3. Выполняется двойной цикл for для прохода по всем элементам матрицы.
  4. Внутренний цикл j выполняется для прохода по всем столбцам матрицы.
  5. Внутренний цикл pr выполняется для прохода по всем элементам текущего столбца, начиная с первого элемента и до элемента, следующего за последним элементом матрицы (т.к. в цикле for переменная j итерируется от 0 до m-1, то при вычислении a+i*rx+pr+1 мы выходим за пределы матрицы, если текущий столбец имеет размерность меньше, чем rx).
  6. Если текущий элемент матрицы a[i][j] меньше следующего элемента a[i][j+1], то выполняется сортировка элементов текущего столбца.
  7. Для сортировки используется временная переменная temp, которая хранит значение элемента a[i][j].
  8. Значение a[i][j] заменяется на значение a[i][j+1].
  9. Значение a[i][j+1] заменяется на значение temp.
  10. Цикл pr завершается.
  11. Цикл j завершается.
  12. Цикл i завершается. Таким образом, данный код реализует сортировку матрицы по возрастанию.

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


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

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

12   голосов , оценка 3.667 из 5