Страница 1 из 1

Что нетак?

Добавлено: 18 янв 2010, 23:56
zealot74
Здравствуйте.

Есть такая задача: Дана матрица N строк, М столбцов. Вычислить сумму элементов каждой строки до первого отрицательного.

Продвинулся до того чтобы суммировались элементы строк матрицы до первого отрицательного НО не все строки и столбцы считаются.

Подскажите пожалуста как добиться того чтобы элементы матрицы считались до первого отрицательного во всей матрице?

вот текст программы

Код: Выделить всё

#include <conio.h>
#include <windows.h>
#include <stdio.h>

int main()
{ SetConsoleCP(1251);
SetConsoleOutputCP(1251);
randomize();
int q,i,j,n,m,a[50][50],pervotr=0, pervo=0; float b[50];

printf("\nВведите количество строк N "); scanf("%d", &n);
printf("\nВведите количество столбцов M "); scanf("%d", &m);
printf("\n");
for(i=0; i < n ; i++){
for(j=0; j < m ; j++){
a[i][j]=random(11)-5;
printf("%3d",a[i][j]);
}printf("\n");}

for(j=0; j < m ; j++){
for(i=0; i < n ; i++){
if (a[i][j] < 0) goto get_out;
b[i]+=a[i][j];} }

get_out:; 

printf("\n");
for(i=0;i<n;i++)printf("%3.3f",b[i]);
getch();}
Вот скрин красным показано то что не считается а зелёным то что считается

Re: Что нетак?

Добавлено: 19 янв 2010, 01:52
BulldozerBSG
Перенеси метку в первый цикл.
Было:

Код: Выделить всё

for(j=0; j < m ; j++)
{
  for(i=0; i < n ; i++)
  {
    if (a[i][j] < 0) goto get_out;
    b[i]+=a[i][j];
  }
}

get_out:;
Стало:

Код: Выделить всё

for(j=0; j < m ; j++)
{
  for(i=0; i < n ; i++)
  {
    if (a[i][j] < 0) goto get_out;
    b[i]+=a[i][j];
  }
get_out:;
}
p.s. Для кода программ есть специальный код BB, выглядит как решетка

Re: Что нетак?

Добавлено: 19 янв 2010, 09:14
zealot74
спасибо прогу сделал но вот так

Код: Выделить всё

if(a[i][j]>=0)
{
   b[i]+=a[i][j];
}
else
{
   break;
}
вот теперь как сделать чтобы читал исходные данные из файла и записывал результат в файл?

Re: Что нетак?

Добавлено: 19 янв 2010, 20:23
Romeo
- Для открытия input и output файлов нужно будет вызвать функцию fopen. По одному вызову на каждый файл - итого два вызова. Параметры смотри в встроенном хелпе.
- Далее все scanf меняем на fscanf, а все printf на fprintf.
- В конце программы не забываем вызвать fclose для обоих хендлов.

Re: Что нетак?

Добавлено: 19 янв 2010, 21:24
zealot74
Получилось вот что.... но она должна работать так:
считывает с файла input.txt количество строк и столбцов матрицы, далее считает сумму элементов строк до первого отрицательного. Затем результат вписывается в файл output.txt.

В этой версии же программа не считает вообще выводит в файл просто нули...

подскажите в чём ошибка?

Код: Выделить всё

#include <conio.h>
#include <stdio.h>
#include <alloc.h>
 
int main()
{
int i,j,n,m; float **a,*b;
FILE *in, *out;
if((in=fopen("input.txt", "rt"))==NULL)
{fprintf(stderr, "Cannot open input "); return 1;}
if((out=fopen("output.txt", "wt"))==NULL)
{fprintf(stderr, "Cannot open output"); return 1;}
fscanf(in, "%d %d", &n, &m);
b=(float *)calloc(n, sizeof(float));
a=(float **)calloc(n, sizeof(float));
for(i=0;i<n;i++) a[i]=(float *)calloc(m, sizeof(float));
 
for(i=0;i<n;i++) b[i]=0;
 
for(i=0;i<n;i++)
for(j=0;j<m;j++)
fscanf(in, "%f", &a[i][j]);
 
for(i=0;i<n;i++){
for(j=0;j<m;j++){
 if(a[i][j]>=0){
                         b[i]+=a[i][j];
           }
          else {break;}
    }
   }
 
for(i=0;i<n;i++) fprintf(out, "%3.3f ", b[i]);
 
for (i=0; i < n ; i++) free(a[i]);
free(a);
free(b);
fclose(in);
fclose(out);
;}

Re: Что нетак?

Добавлено: 20 янв 2010, 12:59
Romeo
Старый код:

Код: Выделить всё

a=(float **)calloc(n, sizeof(float));
Новый код:

Код: Выделить всё

a=(float **)calloc(n, sizeof(float*));
После применения указанных изменений я откомпилировал твой код и засунул в input.txt вот такие данные:

Код: Выделить всё

2
2
1 2
3 4
Потом запустил программу. В output.txt увидел следующее содержимое:

Код: Выделить всё

3.000 7.000 

Re: Что нетак?

Добавлено: 20 янв 2010, 15:49
zealot74
:D спасибо за помощ)