Ошибка в коде — обработка матриц - 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;
- }
- }
- }
- }
- }
Объяснение кода листинга программы
В представленном коде реализуется сортировка матрицы целых чисел по возрастанию. Список действий, которые выполняются в коде:
- Входные данные: матрица a, её размерность rx, ry, количество строк m, количество столбцов n.
- Переменные i, j, temp, pr используются для хранения индексов и временного значения.
- Выполняется двойной цикл for для прохода по всем элементам матрицы.
- Внутренний цикл j выполняется для прохода по всем столбцам матрицы.
- Внутренний цикл pr выполняется для прохода по всем элементам текущего столбца, начиная с первого элемента и до элемента, следующего за последним элементом матрицы (т.к. в цикле for переменная j итерируется от 0 до m-1, то при вычислении a+i*rx+pr+1 мы выходим за пределы матрицы, если текущий столбец имеет размерность меньше, чем rx).
- Если текущий элемент матрицы a[i][j] меньше следующего элемента a[i][j+1], то выполняется сортировка элементов текущего столбца.
- Для сортировки используется временная переменная temp, которая хранит значение элемента a[i][j].
- Значение a[i][j] заменяется на значение a[i][j+1].
- Значение a[i][j+1] заменяется на значение temp.
- Цикл pr завершается.
- Цикл j завершается.
- Цикл i завершается. Таким образом, данный код реализует сортировку матрицы по возрастанию.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д