Mike M.00
Я думаю, что могу помочь, но, пожалуйста, имейте в виду, что всякий раз, когда вы правильно программируете, у вас есть 2 основные аудитории: компьютер и люди, которые будут пытаться понять ваш код и поддерживать его в будущем. В этом отношении самая большая проблема заключается в том, что вам нужно сделать отступ в вашем коде, чтобы люди могли понять, что вы хотели этим сказать.
С точки зрения компьютера, самая большая проблема заключается в том, что компьютер не знает, насколько велик массив "x", когда вы передаете его в процедуру " sparse ()".
Давайте рассмотрим, как компьютер обрабатывает память для массива. В компьютере память линейна, что означает, что память на самом деле представляет собой только один длинный список чисел, причем каждое число имеет место в списке, называемом его адресом. Чтобы представить двумерный массив, компилятор помещает первую строку в первую часть памяти, вторую строку в следующую часть и т. д.. Это означает, например, массив размером 2 на 3 или использование кода
myArray[2][3]
будет иметь две строки по 3 значения в каждой. Допустим, первая строка массива содержит значения 1, 2 и 3, а вторая строка-значения 4, 5 и 6. В этом случае память внутри компьютера будет выглядеть следующим образом: 1, 2, 3, 4, 5, 6.
Когда мы пишем такое выражение, как
int sample = myArray[1][2];
компилятор должен вычислить правильный адрес памяти из заданных координат, используя свои знания о размере массива. В этом случае компилятор знает, что каждая строка имеет длину 3, поэтому доступ к ячейке памяти осуществляется следующим образом: 1 * 3 + 2, или 5-я ячейка памяти в памяти для массива. (Не забывайте, что массивы основаны на нуле, то есть первая строка-это строка с нулевым номером.) Таким образом, в этом примере "образец" будет установлен на 5.
Теперь мы подходим к основной проблеме, с точки зрения компьютера, в вашем коде: поскольку вы не сказали компилятору в своем определении 'sparse ()', насколько велик массив, компилятор не может знать, какую математику он должен сделать, чтобы вычислить адреса каждого элемента массива.
Одно простое исправление, которое не рекомендуется, состоит в том, чтобы сообщить компилятору, насколько велик массив при передаче его в 'sparse ()', в обоих местах. Это не рекомендуется, так как при передаче массивов в функцию значения копируются, что в данном случае является пустой тратой времени. В некоторых системах также существует ограничение на то, сколько данных может быть передано в рутину.
Если это просто быстрая тестовая программа, и ее не нужно будет поддерживать в будущем, самое простое решение-сделать массив " x "глобальным, поместив его вне строки" main ()", а затем вообще не передавая его в процедуру " sparse ()".
Есть и другие проблемы с вашим кодом, например, кажется, что sp [] [], который вы определяете с 200 строками по 200 столбцов, никогда не будет иметь больше, чем первые 3 столбца, используемых. А с точки зрения удобочитаемости мое личное правило-никогда не использовать однобуквенные переменные, потому что их трудно понять, каково их значение.
Во всяком случае, я надеюсь, что моя болтовня будет поучительной, хотя я оставил вам многое для продолжения отладки. Ниже приведена версия вашего кода, с отступом для удобства чтения, с "x", сделанным глобальным, чтобы " sparse()" мог его использовать.
#include <stdio.h>
#include <conio.h>
int x[100][100];
void main()
{
int r,c,i,j;
void sparse(int r,int c);
printf("Enter the no of rows :");
scanf("%d",&r);
printf("Enter the no of columns :");
scanf("%d",&c);
for(i=0;i<r;i++)>
{
for(j=0;j<c;j++)>
{
scanf("%d",&x[i][j]);
}
}
sparse(r,c);
getch();
}
void sparse(int r,int c)
{
int sp[200][200];
int m,n,k=1;
for(m=0;m<r;m++)>
{
for(n=0;n<c;n++)>
{
if(x[m][n]!=0)
{
sp[k][0]=m+1;
sp[k][1]=n+1;
sp[k][2]=x[m][n];
k++;
}
}
}
sp[0][0]=r;
sp[0][1]=c;
sp[0][2]=k-1;
printf("The sparse matrix is :\n");
for(m=0;m<k;m++)>
{
for(n=0;n<3;n++)
{
printf("%d\t",sp[m][n]);
}
}
}