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

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

Войти
Регистрация
Восстановить пароль
 
Avicii
2 / 2 / 0
Регистрация: 01.12.2012
Сообщений: 123
#1

Файлы. Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать... - C++

31.03.2013, 18:00. Просмотров 398. Ответов 8
Метки нет (Все метки)

Здравствуйте,помогите с программой,с виду все правильно,но выдает непонятный результат. Задание : Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать в другой текстовый документ. Возможно не правильно веду считывания с файла.
Содержимое файла:
Кликните здесь для просмотра всего текста
Sasha 14 9 1991
Pasha 3 7 1991
Andrу 6 1 1990
Kosty 8 11 1992
Polik 2 7 1991

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
49
50
51
#include <iostream>
#include <stdio.h>
using namespace std;
struct student {char fio [20];
                 int den;
                 int month;
                 int god;
                };
FILE *InFile, *OutFile;
int main()
{ int n=5;
  student gr[5],s;
    InFile=fopen ("ops.txt","rt");
    OutFile=fopen ("rez.txt","wt");
 for (int i=0;i<n;i++)
    fread(&gr[i],sizeof (student),1,InFile);
 fprintf (OutFile,"Po vozrasty\n");
  for (int i=0;i<n;i++)
        for (int j=0;j<n;j++)
            if (gr[i].god>gr[j].god) //сортировка по годам
            {
                s=gr[i];
                gr[i]=gr[j];
                gr[j]=s;
            }
    for(int i=0;i<n;i++)//сортировка по месяцам
        for(int j=0;j<n;j++)
            if (gr[i].god==gr[j].god)
            {
                 if(gr[i].month>gr[j].month)
                 {
                    s=gr[i];
                    gr[i]=gr[j];
                    gr[j]=s;
                 }
            }
    for(int i=0;i<n;i++)//сортировка по дням
        for(int j=0;j<n;j++)
            if (gr[i].god==gr[j].god && gr[i].month==gr[j].month)
            {
                 if(gr[i].den>gr[j].den)
                 {
                    s=gr[i];
                    gr[i]=gr[j];
                    gr[j]=s;
                 }
            }
for (int i=0;i<n;i++)
 fprintf(OutFile,"%s\n",gr[i].fio,"%d\n",gr[i].den,gr[i].month,gr[i].god);
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2013, 18:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Файлы. Считать с файлового документа студентов с датой рождения,отсортировать по возрасту и записать... (C++):

В структуре отсортировать студентов по возрасту. - C++
Здравствуйте,помогите мне,пожалуйста,в структуре отсортировать студентов по возрасту,я пыталась сделать это методом пузырька,но ничего не...

Массив считать из файла, отсортировать по возрастанию и записать в новый файл - C++
Создаем текстовый файл из num строК, каждая строка содержит трехразрядное число сгенерированное, далее функция читает содержимое файла в...

Записи: Вывести списки студентов, упорядоченные по возрасту - C++
Описать и вывести массив, содержащий 10 записей следующей структуры: фамилия, возраст, № студенческого билета, средняя оценка за последнюю...

Распечатать список студентов, которые получили только оценки 5 на экзаменах, в возрастающем порядке по возрасту - C++
С текстового файла считать последовательность записей, содержащих данные о результатах сессии студентов группы в следующем формате:...

Из одного файла считать целые числа, в другие файлы записать четные и нечетные числа - C++
Нужно с одного файла считать целые числа и в другие файлы записать четные и нечетные числа. Вот код, но почему-то не работает...и как...

Упорядочить список студентов за датой рождения и напечатать его - Pascal
Уважаемые форумчани. Первый раз прошу помощи такого рода. Но в жизни бывает разное. Вообщем нужно написать с десяток программ на паскале....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
31.03.2013, 18:30 #2
ошибка тут:
C++
1
fread(&gr[i],sizeof (student),1,InFile);
используй fscanf вместо fread.
Avicii
2 / 2 / 0
Регистрация: 01.12.2012
Сообщений: 123
31.03.2013, 19:40  [ТС] #3
Цитата Сообщение от Adler Посмотреть сообщение
ошибка тут:
C++
1
fread(&gr[i],sizeof (student),1,InFile);
используй fscanf вместо fread.
Подскажие тогда,как отформатировать эту строку.

Добавлено через 18 минут
Не получается =(
C++
1
fscanf(InFile,"%s",gr[i].fio,"%d",gr[i].den,gr[i].month,gr[i].god);
Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
31.03.2013, 22:31 #4
как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <stdio.h>
using namespace std;
struct student 
{
  char fio[20];
  int den;
  int month;
  int god;
};
 
int main()
{
  student gr[5];
  for(int i=0;i<5;i++){
    scanf("%s %d %d %d\n",&gr[i].fio,&gr[i].den,&gr[i].month,&gr[i].god);
    printf("%s %d %d %d\n",gr[i].fio,gr[i].den,gr[i].month,gr[i].god);
  }
  return 0;
}
http://ideone.com/GZ5TNH
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2013, 23:04 #5
Цитата Сообщение от Avicii Посмотреть сообщение
Подскажие тогда,как отформатировать эту строку.
fscanf читает до пробельного символа. Значит нужно на строку в файле - четыре fscanf.
Avicii
2 / 2 / 0
Регистрация: 01.12.2012
Сообщений: 123
01.04.2013, 00:24  [ТС] #6
Спасибо,разобрался
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
49
50
51
#include <iostream>
#include <stdio.h>
using namespace std;
struct student {char fio [20];
                 int den;
                 int month;
                 int god;
                };
FILE *InFile, *OutFile;
int main()
{ int n=5;
  student gr[5],s;
    InFile=fopen ("ops.txt","rt");
    OutFile=fopen ("rez.txt","wt");
 for (int i=0;i<n;i++)
    fscanf(InFile,"%s %d %d %d\n",&gr[i].fio,&gr[i].den,&gr[i].month,&gr[i].god);
 fprintf (OutFile,"Po vozrasty\n");
  for (int i=0;i<n;i++)
        for (int j=0;j<n;j++)
            if (gr[i].god>gr[j].god) //сортировка по годам
            {
                s=gr[i];
                gr[i]=gr[j];
                gr[j]=s;
            }
    for(int i=0;i<n;i++)//сортировка по месяцам
        for(int j=0;j<n;j++)
            if (gr[i].god==gr[j].god)
            {
                 if(gr[i].month>gr[j].month)
                 {
                    s=gr[i];
                    gr[i]=gr[j];
                    gr[j]=s;
                 }
            }
    for(int i=0;i<n;i++)//сортировка по дням
        for(int j=0;j<n;j++)
            if (gr[i].god==gr[j].god && gr[i].month==gr[j].month)
            {
                 if(gr[i].den>gr[j].den)
                 {
                    s=gr[i];
                    gr[i]=gr[j];
                    gr[j]=s;
                 }
            }
for (int i=0;i<n;i++)
 fprintf(OutFile,"%s %d %d %d\n",gr[i].fio,gr[i].den,gr[i].month,gr[i].god);
return 0;
}
Все получается.

Добавлено через 36 минут
Еще есть один вопрос =)
Задача похожая,только работа с матрицей.Проблема в том что не считывает данные с фалйа,а берет какие-то левые,не не знаю в чем причина.
Данные исходного файла:
1.1 -2 3.5 -4 5
6.5 7 8 9.3 -10
11.4 12 -13 14 15.5
16 -17 18 -19 20.5
21 22.6 23 24 -25
26 27 28 29.3 -30
31.7 32 -33 34 -35
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
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <stdlib.h>
using namespace std;
 
int main()
{int i,j;
 float a[5][7];
 FILE *fp,*fp1;
 fp=fopen("dat.txt","rt");
 fp1=fopen("rez.txt","wt");
 for (i=0;i<5;i++)
 {for (j=0;j<7;j++)
  {fscanf (fp,"%d ",&a[i][j]);
   if (a[i][j]%1==0)
       {a[i][j]=abs(a[i][j]);}
   if (!a[i][j]%1==0)
       {a[i][j]=round(a[i][j]);}
   fprintf (fp1,"%d ",a[i][j]);
  }
  fprintf (fp1,"\n");
 }
 
 fclose (fp);
 fclose (fp1);
 return 0;
}
nonedark2008
903 / 642 / 131
Регистрация: 28.07.2012
Сообщений: 1,733
01.04.2013, 00:52 #7
%d - целое число, а у тебя переменные типа float. Замени везде %d на %f.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.04.2013, 02:30 #8
C++
1
float a[7][5];
C++
1
2
for (i=0;i<7;i++)
 {for (j=0;j<5;j++)
Avicii
2 / 2 / 0
Регистрация: 01.12.2012
Сообщений: 123
01.04.2013, 08:50  [ТС] #9
Цитата Сообщение от nonedark2008 Посмотреть сообщение
%d - целое число, а у тебя переменные типа float. Замени везде %d на %f.
Вопрос такой появился,когда инициализируешь матрицу,допустим типа float, он в исходном файле ищет числа размерности float или использует только когда записывает в файл?По заданию исходные могут быть десятичными,а в конечном файле целыми.
Вроде получилось,спасибо,только в конечном результате выводит числа с шестью нулями после точки ,примерно так 6.000000. Это из-за типа float? Пробовал с типом double ,не распознает,наверно у этого типа свой спецификатор.

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
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <stdlib.h>
using namespace std;
 
int main()
{int i,j;
 float a[7][5];
 FILE *fp,*fp1;
 fp=fopen("ops2.txt","rt");
 fp1=fopen("rez.txt","wt");
 for (i=0;i<7;i++)
 {for (j=0;j<5;j++)
  {fscanf (fp,"%f ",&a[i][j]);
   if (fmod(a[i][j],1)==0)
       {a[i][j]=abs(a[i][j]);}
   if (!fmod(a[i][j],1)==0)
       {a[i][j]=round(a[i][j]);}
   fprintf (fp1,"%f ",a[i][j]);
  }
  fprintf (fp1,"\n");
 }
 
 fclose (fp);
 fclose (fp1);
 return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2013, 08:50
Привет! Вот еще темы с ответами:

В файл записать фамилию, возраст человека и отсортировать по алфавиту и по возрасту - Free Pascal
В файл записать фамилию , возраст человека. Отсортировать по алфавиту и по возрасту. Результат записать в новий файл.

Вывести список студентов, год рождения которых больше среднего года рождения группы и месяц рождения меньше 8 - Turbo Pascal
Составить программу, которая обеспечивает ввод с клавиатуры и запись во внешний файл следующей информации о студентах: фамилия, дата,...

Файлы записей, напечатать список студентов заданного года рождения - Turbo Pascal
Дан список студентов в катором указани фамилия и год рождения. Отпечатать список студентов заданого года рождения. Program Fz_2; ...

Считать из документа имя, адрес, телефон и поместить в массив, и отсортировать по номерам - C (СИ)
День добрый! Задача считывать из документа данные Имя, адрес, телефон поместить в массив, потом отсортировать по номерам. Я решил все...


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

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

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