Ошибка в коде — обработка матриц - 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 завершается. Таким образом, данный код реализует сортировку матрицы по возрастанию.