Entera
Гость
|
|
« : 09-01-2008 00:16 » |
|
В С нужно из файла вызвать матрицу. В этой матрицы найти все ненулевые элементы и написать все значения и индексы этих значений Вот код..ток в нем что то не так...посмотрите!!! #include<stdio.h> #include<alloc.h> matrica(int **a, int *b, int *c, int m, int n, int i, int j, int *k) { for(i=0;i<m;i++) for(j=0;j<n;j++) if(a[i][j]!=0) { b[*k]=a[i][j]; c[*k]=(i*n)+j; (*k)++; } } main() { int **a, *b, *c, m, n, i, j, k; FILE *in; if((in=fopen("1.txt","r"))==NULL) { printf("\n net faila"); exit(1); } fscanf(in, "%d%d",&m,&n); k=m*n/2; a=(int**)malloc(m*sizeof(int*)); for(i=0;i<m;i++) a[i]=(int*)malloc(n*sizeof(int)); b=(int*)malloc(k*sizeof(int)); c=(int*)malloc(k*sizeof(int)); for(i=0;i<m;i++) for(j=0;j<n;j++) fscanf(in,"%d",&a[i][j]); matrica(a,b,c,m,n,i,j,&k); { printf("\n OTVET \n"); printf("Element Indeks"); for(i=0;i<k;i++) printf("\n %d %d",b[i],c[i]); } }
|
|
« Последнее редактирование: 09-01-2008 07:41 от Алексей1153++ »
|
Записан
|
|
|
|
Aveic
Постоялец
Offline
Пол:
Yellow
|
|
« Ответ #1 : 09-01-2008 06:28 » |
|
Что сразу бросается в глаза: функции не возвращают значений, void не написан Во-первых неправильно создается матрица: a=(int**)malloc(m*sizeof(int*)); for(i=0;i<m;i++) a[i]=(int*)malloc(n*sizeof(int));
Что естественно, означает что и обращение к элементам матрицы тоже неверно в функции matrica(...) Вместо надо видимо писать Потом несуразица какая-то с использованием переменной k. Почему она равна m*n/2 ? Потом еще много ошибок, о которых уже впадлу писать, особенно вроде последнего printf когда в %d подставляется указатель в общем могу предложить следующий вариант: struct element { int val,x,y; };
int matrixf(int** matrix,element* elems,int m,int n) { int k=0; for(int i=0;i<m;++i) for(int j=0;j<n;++j) if(matrix[i][j]!=0) { element el={matrix[i][j],i,j}; elems[k++]=el; } return k; }
int main() { int** v,m,n; FILE* in; in=fopen("1.txt","r"); if(in==NULL) { printf("\n net faila \n"); exit(1); } fscanf(in,"%d%d",&m,&n); v=(int**)malloc(m*sizeof(int*)); int i=0,j=0; for(;i<m;++i) v[i]=(int*)malloc(n*sizeof(int)); for(i=0;i<m;++i) for(;i<n;++j) fscanf(in,"%d",&v[i][j]); int k=m*n; element* els=(element*)malloc(k*sizeof(element)); k=matrixf(v,els,m,n); printf("\n OTVET :) \n"); for(i=0;i<k;++i) printf("Element {%d,%d} with value=%d\n",els[i].x,els[i].y,els[i].val); printf("\n END \n"); return 0; }
|
|
« Последнее редактирование: 09-01-2008 06:35 от Aveic »
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #2 : 09-01-2008 06:53 » |
|
с ним много чего не так. кое-что поправил. Посмотри. сравни. спрашивай. Пока писал уже меня опередили. Два примера лучше чем один struct mindex { int x; int y; int * value; };
void matrica(int **a, mindex *b, int m, int n) { for(int i=0; i < m; ++i) for(int j=0; j < n; j++) if(a[i][j]!=0) { b->value = &a[i][j]; b->x = i; b->y = j; ++b; } }
int _tmain(int argc, _TCHAR* argv[]) { FILE *in; if((in=fopen("1.txt","r")) == NULL) { printf("\n net faila"); exit(1); }
int m, n; fscanf(in, "%d%d",&m,&n);
int ** a = (int**)malloc(m*sizeof(int*));
for(int i=0; i<m; ++i) a[i]=(int*)malloc(n * sizeof(int));
mindex * b = (mindex*)malloc(m * n * sizeof(struct mindex)); memset(b, 0, m * n * sizeof(struct mindex));
for(int i = 0; i < m; ++i) for(int j = 0; j < n ; ++j) fscanf(in,"%d",&a[i][j]);
matrica(a, b, m, n);
printf("\n OTVET \n"); printf("Element Indeks"); mindex * b_pos = b; for(int i=0; i < m*n && b_pos->value != NULL; ++i, ++b_pos) { printf("\n Value=%d x=%d y=%d", *b_pos->value, b_pos->x, b_pos->y); }
return 0; }
|
|
|
Записан
|
Странно всё это....
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #3 : 09-01-2008 12:15 » |
|
Во-первых неправильно создается матрица: a=(int**)malloc(m*sizeof(int*)); for(i=0;i<m;i++) a[i]=(int*)malloc(n*sizeof(int));
А что тут неправильно?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #4 : 09-01-2008 12:17 » |
|
LogRus, а кто память чистить будет? Непедагогично.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Антон (LogRus)
|
|
« Ответ #5 : 09-01-2008 12:41 » |
|
dimka, Но могу сказать, что в данном случае не критично, т.к. всё равно при выходе прибьются.
|
|
|
Записан
|
Странно всё это....
|
|
|
Aveic
Постоялец
Offline
Пол:
Yellow
|
|
« Ответ #6 : 09-01-2008 12:41 » |
|
dimka, я написал правильный вариант, на тот момент у него было неправильно написано. Автор исправил сообщение. Было написано a=(int*)malloc(n*sizeof(int)). Он уже много чего исправил. LogRus, а кто память чистить будет? Непедагогично. Да очистку мы забыли , но все равно для такой программы это не приведет к особым проблемам.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #7 : 09-01-2008 15:16 » |
|
LogRus, Aveic, вот потому я и говорю "Непедагогично." В этой программе проблем не будет, но приучать к хорошему, светлому, вечному надо сразу.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Aveic
Постоялец
Offline
Пол:
Yellow
|
|
« Ответ #8 : 09-01-2008 19:50 » |
|
Согласен, тогда Entera, освобождение ресурсов остается тебе на домашнее упражнение
|
|
|
Записан
|
|
|
|
|