Форум программистов, компьютерный форум CyberForum.ru

Чтение марицы из файла - C++

Восстановить пароль Регистрация
 
Анастасия Ан
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 14
03.07.2012, 20:48     Чтение марицы из файла #1
Для заданной в файле матрицы А (m на n) определить количество строк, которые упорядочены по возрастанию. Это мои соображения...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
void main(void)
{
int N=0;
int M=0;
int a[50][50];
FILE *in=fopen("file.in", "rt");//файл чтения
FILE *out=fopen("file.out", "wt");//файл записи
fscanf(in,"%d",&N); //Считали N
fscanf(in,"%d",&M);
   for(i=0;i<N;i++)
    {
     for(j=0;j<M;j++)
      {
       fscanf(in,"%d",&a[i][j]);
      }
    }
 
K=N;
 
   for(i=0;i<N;i++)
    {
     for(j=0;j<M;j++)
      { 
        if(a[i][j]>a[i][j+1]) 
        K--;
        break;
      }
    }
 
cout<<"\n K="<<K<<endl;
 
fclose(in);
fclose(out);
}
В чем ошибка?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21491 / 10244 / 1670
Регистрация: 12.02.2012
Сообщений: 17,125
03.07.2012, 21:07     Чтение марицы из файла #2
0) в этой задаче вообще не нужен массив (без него можно обойтись)
1) зачем выходной файл?
2) строки 23-28:

C++
1
2
3
4
5
6
7
8
    for(j=0;j<M-1;j++)  // если не отнять 1, то будет выход индекса за гр. в операторе if
      { 
        if(a[i][j]>a[i][j+1]) 
        {                     // это не один оператор, а группа  
           K--;
           break;
        }
      }
Да, RaiaNKnight прав/права - переменную k нужно объявить.
RaiaNKnight
 Аватар для RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 458
Записей в блоге: 1
03.07.2012, 21:08     Чтение марицы из файла #3
Цитата Сообщение от Анастасия Ан Посмотреть сообщение
Для заданной в файле матрицы А (m на n) определить количество строк, которые упорядочены по возрастанию. Это мои соображения...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
void main(void)
{
int N=0;
int M=0;
int a[50][50];
FILE *in=fopen("file.in", "rt");//файл чтения
FILE *out=fopen("file.out", "wt");//файл записи
fscanf(in,"%d",&N); //Считали N
fscanf(in,"%d",&M);
   for(i=0;i<N;i++)
    {
     for(j=0;j<M;j++)
      {
       fscanf(in,"%d",&a[i][j]);
      }
    }
 
K=N;
 
   for(i=0;i<N;i++)
    {
     for(j=0;j<M;j++)
      { 
        if(a[i][j]>a[i][j+1]) 
        K--;
        break;
      }
    }
 
cout<<"\n K="<<K<<endl;
 
fclose(in);
fclose(out);
}
В чем ошибка?
1) Переменную K объявите.
2) В цикле по j, где вы проверяете упорядочение, сделать до m-1. Можете еще дописать условие, что если m=1, то continue.
Полагаю, что I/O корректен
Catstail
Модератор
 Аватар для Catstail
21491 / 10244 / 1670
Регистрация: 12.02.2012
Сообщений: 17,125
03.07.2012, 21:12     Чтение марицы из файла #4
Вот решение без массива:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include "stdio.h"
 
int main(int argc, char* argv[])
{
    FILE *Inp;
 
    char Fname[200];
 
    int i,j,n,m,s,c=0,p=0,k=0;
 
    printf("Enter n ");
    scanf ("%d",&n);
 
    printf("Enter m ");
    scanf ("%d",&m);
 
    for (i=0; i<200; i++) Fname[i]=0;
    printf("Enter File Name ");
    scanf ("%s",Fname);
 
    if ((Inp=fopen(Fname,"r")) == NULL)
    {
        printf("Error by open\n");
        return -1;
    }
    else
        for (i=0; i<n; i++)
        {
            s=0;
            fscanf(Inp,"%d",&p);
            for (j=1; j<m; j++)
            {
                fscanf(Inp,"%d",&c);
                if (c > p) s++;
                p=c;
            }
            if (s == (m-1)) k++;
 
        }
 
     printf("Number of ordered rows is %d\n",k);
 
     fclose(Inp);
 
    return 0;
}
Анастасия Ан
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 14
04.07.2012, 09:37  [ТС]     Чтение марицы из файла #5
когда ввожу имя файла выводит "Error by open". Как правильно вводить?
Catstail
Модератор
 Аватар для Catstail
21491 / 10244 / 1670
Регистрация: 12.02.2012
Сообщений: 17,125
04.07.2012, 09:56     Чтение марицы из файла #6
Думаю, дело в том, что нужно задавать полный путь: D:\ABC\DEF\123.txt
Анастасия Ан
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 14
04.07.2012, 15:29  [ТС]     Чтение марицы из файла #7
Вот это место не очень понятно:

Цитата Сообщение от Catstail Посмотреть сообщение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    else
        for (i=0; i<n; i++)
        {
            s=0;
            fscanf(Inp,"%d",&p);
            for (j=1; j<m; j++)
            {
                fscanf(Inp,"%d",&c);
                if (c > p) s++;
                p=c;
            }
            if (s == (m-1)) k++;
 
        }
 
     printf("Number of ordered rows is %d\n",k);
 
     fclose(Inp);
 
    return 0;
}
Можете с комментариями объяснить? И, кстати, программа выдает неправильный ответ. В матрице было две строки расположенные в порядке возрастания. А ответ 0.
Catstail
Модератор
 Аватар для Catstail
21491 / 10244 / 1670
Регистрация: 12.02.2012
Сообщений: 17,125
04.07.2012, 16:05     Чтение марицы из файла #8
Программа правильная. При вводе нужно сначала задавать число строк, потом число столбцов. Если задашь наоборот - сработает неверно.

Вот кусок с объяснением.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    for (i=0; i<n; i++) // цикл по номеру строки
    {
        s=0;                       // счетчик чисел, стоящих в порядке
        fscanf(Inp,"%d",&p); // читаем первое число строки
        for (j=1; j<m; j++)    // цикл по номеру столбца (первое число уже считано)
        {
            fscanf(Inp,"%d",&c); // читаем очередное
            if (c > p)          // если очередное > предыдущего  
                s++;        //  увеличим s
            p=c;                // делаем очередное предыдущим 
        }
                if (s == (m-1)) k++;     // если s=m-1, значит строка упорядочена - увеличим счетчик
    }
Вот исходная матрица:

1 2 -2 3 4
1 2 3 6 8
0 1 2 3 6
1 8 7 6 1
7 3 10 1 1
1 2 3 6 8
1 2 3 6 8

Выдача программы: 4 (верно).

Добавлено через 12 минут
Виноват, добавка с досрочным выходом - лишняя.
Анастасия Ан
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 14
05.07.2012, 12:37  [ТС]     Чтение марицы из файла #9
Цитата Сообщение от Catstail Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    for (i=0; i<n; i++) // цикл по номеру строки
    {
        s=0;                       // счетчик чисел, стоящих в порядке
        fscanf(Inp,"%d",&p); // читаем первое число строки
        for (j=1; j<m; j++)    // цикл по номеру столбца (первое число уже считано)
        {
            fscanf(Inp,"%d",&c); // читаем очередное
            if (c > p)          // если очередное > предыдущего  
                s++;        //  увеличим s
            p=c;                // делаем очередное предыдущим 
        }
                if (s == (m-1)) k++;     // если s=m-1, значит строка упорядочена - увеличим счетчик
    }
Вот по этому алгоритму поиска количества строк, упорядоченных в порядке возрастания написала другую программу. Ваша, как я поняла работает, если всю матрицу вбить в один сплошной столбик.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
  int N,n,m;
  setlocale(LC_ALL, "Russian");
  ifstream  in("input.txt"); 
 
  cout<<"Введите размерность матрицы"<<endl;
  cout<<"n="; cin>>n;
  cout<<"n="; cin>>m;
 
  int **a=new int* [n]; 
  for(int z=0; z<m;z++) a[z]=new int[m];
 
  for(int i=0;i<n;i++)
  {
      for(int j=0;j<m;j++)
      {
          in>>a[i][j];
      }
  }
    
  int k=0;
  for(int i=0;i<n;i++)
  {
      for(int j=0;j<(m-1);j++)
      {
          int s=0;
          if (a[i][j]<a[i][j+1])
          s=s++;
      }
      if(s==(m-1)) k++;
  }
    
  cout<<"\n k="<<k;
    
  return 0;
}
Но и тут что-то не так(( Если матрица больше поряка 4 x 4 (4 x 5 например), то выдает ошибку.
Да и ответ опять неправильный.
Catstail
Модератор
 Аватар для Catstail
21491 / 10244 / 1670
Регистрация: 12.02.2012
Сообщений: 17,125
05.07.2012, 12:58     Чтение марицы из файла #10
Не важно, вбивать матрицу в столбик или по строкам, важно, чтобы сначала шли элементы первой строки, потом второй и т.д.

Этот код работает правильно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "stdio.h"
 
int main(int argc, char* argv[])
{
    FILE *Inp;
 
    char Fname[200];
 
    int i,j,n,m,s,c=0,p=0,k=0;
 
    printf("Enter number of rows ");
    scanf ("%d",&n);
 
    printf("Enter number of cols ");
    scanf ("%d",&m);
 
    for (i=0; i<200; i++) Fname[i]=0;
    printf("Enter File Name ");
    scanf ("%s",Fname);
 
    if ((Inp=fopen(Fname,"r")) == NULL)
    {
        printf("Error by open\n");
        return -1;
    }
    else
        for (i=0; i<n; i++) // öèêë ГЇГ® Г*îìåðó ñòðîêè
        {
            s=0;            // Г±Г·ГҐГІГ·ГЁГЄ Г·ГЁГ±ГҐГ«, ñòîÿùèõ Гў ïîðÿäêå
            fscanf(Inp,"%d",&p); // Г·ГЁГІГ*ГҐГ¬ ïåðâîå ÷èñëî ñòðîêè
            for (j=1; j<m; j++)  // öèêë ГЇГ® Г*îìåðó ñòîëáöГ* (ïåðâîå ÷èñëî óæå Г±Г·ГЁГІГ*Г*Г®)
            {
                fscanf(Inp,"%d",&c); // Г·ГЁГІГ*ГҐГ¬ î÷åðåäГ*îå
                if (c > p)           // åñëè î÷åðåäГ*îå > ïðåäûäóùåãî - óâåëè÷èì s
                    s++;
                p=c;                 // äåëГ*ГҐГ¬ î÷åðåäГ*îå ïðåäûäóùèì 
            }
            
            if (s == (m-1)) k++;     // åñëè s=m-1, Г§Г*Г*Г·ГЁГІ ñòðîêГ* óïîðÿäî÷åГ*Г* - óâåëè÷èì Г±Г·ГҐГІГ·ГЁГЄ
 
        }
 
     printf("Number of ordered rows is %d\n",k);
 
     fclose(Inp);
 
    return 0;
}
Файл D:\123.txt:

1 2 -2 3 4
1 2 3 6 8
0 1 2 3 6
1 8 7 6 1
7 3 10 1 1
1 2 3 6 8
1 2 3 6 8

см. картинку. А твой код я сейчас посмотрю...
Миниатюры
Чтение марицы из файла  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2012, 13:05     Чтение марицы из файла
Еще ссылки по теме:

чтение из файла C++
Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла. C++
Чтение файла с несколькими знаками конца файла C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Catstail
Модератор
 Аватар для Catstail
21491 / 10244 / 1670
Регистрация: 12.02.2012
Сообщений: 17,125
05.07.2012, 13:05     Чтение марицы из файла #11
Посмотрел... Ошибка вот:

C++
1
2
3
4
5
6
7
8
9
10
11
12
int k=0;
  for(int i=0;i<n;i++)
  {
      int s=0; // должно быть здесь
      for(int j=0;j<(m-1);j++)
      {
          //   int s=0;   <- неверно!!!
          if (a[i][j]<a[i][j+1])
          s++;  // s= - лишнее!
      }
      if(s==(m-1)) k++;
  }
Yandex
Объявления
05.07.2012, 13:05     Чтение марицы из файла
Ответ Создать тему
Опции темы

Текущее время: 15:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru