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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Анастасия Ан
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 14
#1

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

03.07.2012, 20:48. Просмотров 531. Ответов 10
Метки нет (Все метки)

Для заданной в файле матрицы А (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);
}
В чем ошибка?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2012, 20:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение марицы из файла (C++):

Переделать в коде чтение из файла в чтение с клавиатуры - C++
Переделайте что бы текст считывался с клавиатуры, а не с файла! Буду благодарен за помощь! //файл должен начинаться со слова, между...

Марицы и действия над ними - C++
Помогите пожалуйста, я в С++ полный чайник, а очень надо решить задачку. Задачка такого типа: Определить сумму четных элементов...

Чтение из файла. Повторное чтение файла - C++
Добрый день. Необходимо реализовать в программе функцию повторного чтения данных из файла, в случае некорректного ввода их в оный. Вот...

Для заданной марицы вычислить значение среднего арифметического элементов k-го столбца и n-й строки - C++
Написать функцию, которая для заданного двухмерного массива типа int вычисляет и возвращает значение среднего арифметического элементов...

Вывести элементы марицы, расположенные ниже главной диагонали, не используя условный оператор - C++
Дана матрица размера M х N. Вывести ее элементы, расположенные ниже главной диагонали . Вывод элементов производить по столбцам, условный...

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла. - C++
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;locale.h&gt; #include&lt;iomanip&gt; #include &lt;cstdlib&gt; using namespace std; struct...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Catstail
Модератор
22615 / 10976 / 1779
Регистрация: 12.02.2012
Сообщений: 18,117
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 нужно объявить.
1
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 465
Записей в блоге: 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 корректен
1
Catstail
Модератор
22615 / 10976 / 1779
Регистрация: 12.02.2012
Сообщений: 18,117
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;
}
1
Анастасия Ан
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 14
04.07.2012, 09:37  [ТС] #5
когда ввожу имя файла выводит "Error by open". Как правильно вводить?
0
Catstail
Модератор
22615 / 10976 / 1779
Регистрация: 12.02.2012
Сообщений: 18,117
04.07.2012, 09:56 #6
Думаю, дело в том, что нужно задавать полный путь: D:\ABC\DEF\123.txt
1
Анастасия Ан
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.
0
Catstail
Модератор
22615 / 10976 / 1779
Регистрация: 12.02.2012
Сообщений: 18,117
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 минут
Виноват, добавка с досрочным выходом - лишняя.
1
Анастасия Ан
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 например), то выдает ошибку.
Да и ответ опять неправильный.
0
Catstail
Модератор
22615 / 10976 / 1779
Регистрация: 12.02.2012
Сообщений: 18,117
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

см. картинку. А твой код я сейчас посмотрю...
0
Миниатюры
Чтение марицы из файла  
Catstail
Модератор
22615 / 10976 / 1779
Регистрация: 12.02.2012
Сообщений: 18,117
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++;
  }
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2012, 13:05
Привет! Вот еще темы с ответами:

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется - C++
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

Из заданой марицы A(N,N)удалить строку и столбец, в которых находяться первый элемент, равно нулю. - C++
Из заданой марицы A(N,N)удалить строку и столбец, в которых находяться первый элемент, равно нулю. Полученою матрицу умножить. Элементы...

как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла? - C++
Друзья! Создадим два текстовых файла, f_0.txt и f_1.txt и что-нибудь в них запизаем, например в первый запихаем 1234 а во второй 5678 и...

Чтение файла с несколькими знаками конца файла - C++
В файле несколько раз встречается ноль, и ни как не получается прочитать его полностью. Как можно решить данную проблему ?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.07.2012, 13:05
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru