Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: помогите с кодом!  (Прочитано 9501 раз)
0 Пользователей и 1 Гость смотрят эту тему.
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
Постоялец

ru
Offline 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(...)
Вместо
Код:
if(a[i]==0)...
надо видимо писать
Код:
if(a[i][j]==0)...
Потом несуразица какая-то с использованием переменной 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)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #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
Деятель
Команда клуба

ru
Offline 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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 09-01-2008 12:17 » 

LogRus, а кто память чистить будет? Улыбаюсь Непедагогично.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #5 : 09-01-2008 12:41 » 

dimka, Жаль
Но могу сказать, что в данном случае не критично, т.к. всё равно при выходе прибьются. Улыбаюсь
Записан

Странно всё это....
Aveic
Постоялец

ru
Offline Offline
Пол: Мужской
Yellow


« Ответ #6 : 09-01-2008 12:41 » 

dimka, я написал правильный вариант, на тот момент у него было неправильно написано. Автор исправил сообщение. Было написано a=(int*)malloc(n*sizeof(int)). Он уже много чего исправил.
LogRus, а кто память чистить будет? Улыбаюсь Непедагогично.
Да очистку мы забыли , но все равно для такой программы это не приведет к особым проблемам.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 09-01-2008 15:16 » 

LogRus, Aveic, вот потому я и говорю "Непедагогично." В этой программе проблем не будет, но приучать к хорошему, светлому, вечному надо сразу. Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Aveic
Постоялец

ru
Offline Offline
Пол: Мужской
Yellow


« Ответ #8 : 09-01-2008 19:50 » 

Улыбаюсь Согласен, тогда Entera, освобождение ресурсов остается тебе на домашнее упражнение Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines