Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
dan-man007
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 62
1

Поиск в массиве объектов типа "Student" по заданному полю (файловый ввод/вывод)

26.03.2016, 22:54. Просмотров 847. Ответов 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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <iostream>
#include <fstream>
#include <locale.h> /* Для русского языка */
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Rus"); /* Обязательно должно быть первым. Русифицирует символы в консоли */
    fstream file("structure.txt");
    if (!file.is_open()) {
        file.open("structure.txt", fstream::out);
        return 0;
    }
 
    struct university
    {
        char *fam;
        char *name;
        char *otch;
        char gender;
        char facul;
        int kurs;
        int group;
        int mark[5];
        char city;
    };
    university student1;
 
    cout << "Введите фамилию: " << endl;
    cin >> student1.fam;
    cout << "Введите имя: " << endl;
    cin >> student1.name;
    cout << "Введите отчество: " << endl;
    cin >> student1.otch;
    cout << "Введите пол:" << endl;
    cin >> student1.gender;
    cout << "Введите факультет: " << endl;
    cin >> student1.facul;
    cout << "Введите курс: " << endl;
    cin >> student1.kurs;
    cout << "Введите группу: " << endl;
    cin >> student1.group;
    cout << "Введите оценку по программированию: " << endl;
    cin >> student1.mark[0];
    cout << "Введите оценку по математике: " << endl;
    cin >> student1.mark[1];
    cout << "Введите оценку по алгоритмам: " << endl;
    cin >> student1.mark[2];
    cout << "Введите оценку по литературе: " << endl;
    cin >> student1.mark[3];
    cout << "Введите оценку по экономике: " << endl;
    cin >> student1.mark[4];
    cout << "Введите город: " << endl;
    cin >> student1.city;
 
    university student2;
 
    cout << "Введите фамилию: " << endl;
    cin >> student2.fam;
    cout << "Введите имя: " << endl;
    cin >> student2.name;
    cout << "Введите отчество: " << endl;
    cin >> student2.otch;
    cout << "Введите пол:" << endl;
    cin >> student2.gender;
    cout << "Введите факультет: " << endl;
    cin >> student2.facul;
    cout << "Введите курс: " << endl;
    cin >> student2.kurs;
    cout << "Введите группу: " << endl;
    cin >> student2.group;
    cout << "Введите оценку по программированию: " << endl;
    cin >> student2.mark[0];
    cout << "Введите оценку по математике: " << endl;
    cin >> student2.mark[1];
    cout << "Введите оценку по алгоритмам: " << endl;
    cin >> student2.mark[2];
    cout << "Введите оценку по литературе: " << endl;
    cin >> student2.mark[3];
    cout << "Введите оценку по экономике: " << endl;
    cin >> student2.mark[4];
    cout << "Введите город: " << endl;
    cin >> student2.city;
 
    university student3;
 
    cout << "Введите фамилию: " << endl;
    cin >> student3.fam;
    cout << "Введите имя: " << endl;
    cin >> student3.name;
    cout << "Введите отчество: " << endl;
    cin >> student3.otch;
    cout << "Введите пол:" << endl;
    cin >> student3.gender;
    cout << "Введите факультет: " << endl;
    cin >> student3.facul;
    cout << "Введите курс: " << endl;
    cin >> student3.kurs;
    cout << "Введите группу: " << endl;
    cin >> student3.group;
    cout << "Введите оценку по программированию: " << endl;
    cin >> student3.mark[0];
    cout << "Введите оценку по математике: " << endl;
    cin >> student3.mark[1];
    cout << "Введите оценку по алгоритмам: " << endl;
    cin >> student3.mark[2];
    cout << "Введите оценку по литературе: " << endl;
    cin >> student3.mark[3];
    cout << "Введите оценку по экономике: " << endl;
    cin >> student3.mark[4];
    cout << "Введите город: " << endl;
    cin >> student3.city;
 
 
 
    file.close();
 
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2016, 22:54
Ответы с готовыми решениями:

Поиск в массиве объектов типа "Student" по заданному полю (файловый ввод/вывод)
Помогите написать программу 1. Файл содержит итоги контрольного срока, каждая...

Реализовать поиск в массиве структур "Student" по заданному полю (файловый ввод/вывод)
Помогите написать программы... 1. Пусть на диске текстовый файл ' Hrupa.txt...

Реализовать поиск по заданному полю в массиве объектов типа Student и вывод этих данных на консоль
В задаче надо определить самое часто встречаемое имя среди женщин и среди...

Реализовать поиск по заданному полю в массиве структур типа "Student"
не могу понять почему не работает цикл void init?? Срабатывает только один...

Реализовать сортировку и поиск по заданному полю в массиве пользовательского типа (файловый ввод/вывод)
Подскажите, как реализовать часть задания, которая выделена красным цветом. ...

6
Renji
2123 / 1561 / 476
Регистрация: 05.06.2014
Сообщений: 4,518
26.03.2016, 23:04 2
Цитата Сообщение от dan-man007 Посмотреть сообщение
Не могу понять, как в цикле считать информацию из файла и отсортировать по алфавиту.
Дальше сами.
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
#include<iostream>
#include<fstream>
#include<map>
#include<vector>
 
int main()
{
    std::map<std::string,std::string> data;
    std::ifstream stream("test.txt");
    std::string name,alias,empty_line;
 
    //читаем
    while(getline(stream,name) &&
          getline(stream,alias) &&
          getline(stream,empty_line))
        data[name]=alias;
 
    //а на печать идет уже отсортированное
    for(auto&pair:data)
        std::cout<<"имя"<<pair.first<<std::endl<<
                   "погоняло"<<pair.second<<std::endl<<
                   std::endl;
    return 0;
}
1
dan-man007
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 62
27.03.2016, 00:18  [ТС] 3
Цитата Сообщение от Renji Посмотреть сообщение
Дальше сами.
В файле следующая структура:
Бубнов Виктор Митрофанович Мужской ФМИ 5 115 5 4 3 4 Курск
Петров Александр Григорьевич Мужской ФМИ 4 114 2 4 4 3 Москва
Мидийная Мария Шараповна Женский ФМИ 5 115 4 5 5 5 Рязань
Петров Виктор Герасимович Мужской ФМИ 3 113 5 4 3 4 Самара
Наталья Ельморенко Радионовна Женский ФМИ 2 112 5 3 3 4 Волгоград
_______________________________________________________________
Написал код.
ошибки:
1)Ошибка C4996 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
2)Ошибка C4996 'fscanf': This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. (таких ошибок много).
в чем может быть дело?

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <fstream>
#include <locale.h> /* Для русского языка */
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Rus");
    
    FILE *file;
    file = fopen("structure.txt","r");
    
    const int n = 5;
    int i, j, im;
    struct university
    {
        char *fam[50];
        char *name[50];
        char *otch[50];
        char gender[10];
        char facul[50];
        int kurs;
        int group;
        int mark[5];
        char city[50];
    };
 
    university students[n], study1;
    
    for (int i = 0; i < n; i++)
    {
        fscanf(file, "%s\n", &students[n].fam);
        fscanf(file, "%s\n", &students[n].name);
        fscanf(file, "%s\n", &students[n].otch);
        fscanf(file, "%c\n", &students[n].gender);
        fscanf(file, "%c\n", &students[n].facul);
        fscanf(file, "%u\n", &students[n].kurs);
        fscanf(file, "%u\n", &students[n].group);
        fscanf(file, "%u\n", &students[n].mark[0]);
        fscanf(file, "%u\n", &students[n].mark[1]);
        fscanf(file, "%u\n", &students[n].mark[2]);
        fscanf(file, "%u\n", &students[n].mark[3]);
        fscanf(file, "%u\n", &students[n].mark[4]);
        fscanf(file, "%s\n", &students[n].city);
        fscanf(file, "\n");
        printf("Фамилия\t%s\n", students[i].fam);
        printf("Имя\t%s\n", students[i].name);
        printf("Отчество\t%s\n", students[i].otch);
        printf("Пол\t%s\n", students[i].gender);
        printf("Факультет\t%s\n", students[i].facul);
        printf("Курс\t%u\n", students[i].kurs);
        printf("Группа\t%u\n", students[i].group);
        printf("Оценка по программированию\t%un", students[i].mark[0]);
        printf("Оценка по литературе\t%u\n", students[i].mark[1]);
        printf("Оценка по математике\t%u\n", students[i].mark[2]);
        printf("Оценка по физике\t%u\n", students[i].mark[3]);
        printf("Оценка по теории алгоритмов\t%u\n", students[i].mark[4]);
        printf("Город\t%s\n", students[i].city);
        printf("\n");
    }
    
    getch();
    system("cls");
 
    for (i = 0; i < n - 1; i++)
    {
        im = i;
        for (j = i + 1; j < n; j++)
            if (strcmp(students[im].city, students[j].city) > 0) im = j;
        study1 = students[i];
        students[i] = students[im];
        students[im] = study1;
    }
    cout << "\t\tПосле сортировки:\n\n";
    for (i = 0; i < n; i++)
    {
        printf("Фамилия\t%s\n", students[i].fam);
        printf("Имя\t%s\n", students[i].name);
        printf("Отчество\t%s\n", students[i].otch);
        printf("Пол\t%s\n", students[i].gender);
        printf("Факультет\t%s\n", students[i].facul);
        printf("Курс\t%u\n", students[i].kurs);
        printf("Группа\t%u\n", students[i].group);
        printf("Оценка по программированию\t%u\n", students[i].mark[0]);
        printf("Оценка по литературе\t%u\n", students[i].mark[1]);
        printf("Оценка по математике\t%u\n", students[i].mark[2]);
        printf("Оценка по физике\t%u\n", students[i].mark[3]);
        printf("Оценка по теории алгоритмов\t%u\n", students[i].mark[4]);
        printf("Город\t%s\n", students[i].city);
        printf("\n");
    }
    fclose(file);
    getch();
 
    system("pause");
    return 0;
}
0
Renji
2123 / 1561 / 476
Регистрация: 05.06.2014
Сообщений: 4,518
27.03.2016, 00:20 4
Цитата Сообщение от dan-man007 Посмотреть сообщение
в чем может быть дело?
В том что:
1) Код на Си. Нет, вам на лекции наврали, все эти fopen и printf это Си, а не плюсы.
2) Компилируется в Студии которой куда-то там надо засунуть _CRT_SECURE_NO_WARNINGS, иначе она будет на стандартный Си материться.
1
dan-man007
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 62
27.03.2016, 12:27  [ТС] 5
Цитата Сообщение от Renji Посмотреть сообщение
В том что:
1) Код на Си. Нет, вам на лекции наврали, все эти fopen и printf это Си, а не плюсы.
2) Компилируется в Студии которой куда-то там надо засунуть _CRT_SECURE_NO_WARNINGS, иначе она будет на стандартный Си материться.
Попробовал адаптировать код. Программа компилируется, но при затем выдает ошибку:
Вызвано исключение по адресу 0x62DC7B2C (msvcp140d.dll) в Структуры (1).exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00C0FBA9.

Необработанное исключение по адресу 0x62DC7B2C (msvcp140d.dll) в Структуры (1).exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00C0FBA9.

Вызвано исключение по адресу 0x62DC7B2C (msvcp140d.dll) в Структуры (1).exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00C0FBA9.

Программа "[6064] Структуры (1).exe" завершилась с кодом 0 (0x0).
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <iostream>
#include <fstream>
#include <locale.h> /* Для русского языка */
 
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Rus");
    
    fstream file("structure.txt");
    if (!file.is_open()) {
        file.open("structure.txt", fstream::out);
        return 0;
    }
 
    const int n = 5;
    int i, j, im;
    struct university
    {
        char fam[50];
        char name[50];
        char otch[50];
        char gender[10];
        char facul[50];
        int kurs;
        int group;
        int mark[5];
        char city[50];
    };
 
    university students[n], study1;
    
    for (int i = 0; i < n; i++)
    {
        file >> students[n].fam;
        file >> students[n].name;
        file >> students[n].otch;
        file >> students[n].gender;
        file >> students[n].facul;
        file >> students[n].kurs;
        file >> students[n].group;
        file >> students[n].mark[0];
        file >> students[n].mark[1];
        file >> students[n].mark[2];
        file >> students[n].mark[3];
        file >> students[n].mark[4];
        file >> students[n].city;
        cout << "Фамилия: "<< students[i].fam << endl;
        cout << "Имя" << students[i].name << endl;
        cout << "Отчество" << students[i].otch << endl;
        cout << "Пол" << students[i].gender << endl;
        cout << "Факультет" << students[i].facul << endl;
        cout << "Курс" << students[i].kurs << endl;
        cout << "Группа" << students[i].group << endl;
        cout << "Оценка по программированию" << students[i].mark[0] << endl;
        cout << "Оценка по литературе" << students[i].mark[1] << endl;
        cout << "Оценка по математике" << students[i].mark[2] << endl;
        cout << "Оценка по физике"<< students[i].mark[3] << endl;
        cout << "Оценка по теории алгоритмов" << students[i].mark[4] << endl;
        cout << "Город" << students[i].city << endl;
        cout << endl;
    }
    
    system("cls");
 
    for (i = 0; i < n - 1; i++)
    {
        im = i;
        for (j = i + 1; j < n; j++)
            if (strcmp(students[im].city, students[j].city) > 0) im = j;
        study1 = students[i];
        students[i] = students[im];
        students[im] = study1;
    }
    cout << "\t\tПосле сортировки:\n\n";
    for (i = 0; i < n; i++)
    {
        cout << "Фамилия: " << students[i].fam << endl;
        cout << "Имя" << students[i].name << endl;
        cout << "Отчество" << students[i].otch << endl;
        cout << "Пол" << students[i].gender << endl;
        cout << "Факультет" << students[i].facul << endl;
        cout << "Курс" << students[i].kurs << endl;
        cout << "Группа" << students[i].group << endl;
        cout << "Оценка по программированию" << students[i].mark[0] << endl;
        cout << "Оценка по литературе" << students[i].mark[1] << endl;
        cout << "Оценка по математике" << students[i].mark[2] << endl;
        cout << "Оценка по физике" << students[i].mark[3] << endl;
        cout << "Оценка по теории алгоритмов" << students[i].mark[4] << endl;
        cout << "Город" << students[i].city << endl;
        cout << endl;
    }
    
    file.close();
    system("pause");
    return 0;
}
0
Renji
2123 / 1561 / 476
Регистрация: 05.06.2014
Сообщений: 4,518
27.03.2016, 12:31 6
Лучший ответ Сообщение было отмечено dan-man007 как решение

Решение

students[n] students[i]
1
dan-man007
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 62
27.03.2016, 12:40  [ТС] 7
Цитата Сообщение от Renji Посмотреть сообщение
students[n] students[i]
Спасибо за помощь

Добавлено через 25 секунд
Рабочий код:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream>
#include <fstream>
#include <locale.h> /* Для русского языка */
 
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Rus");
    
    fstream file("structure.txt");
    if (!file.is_open()) {
        file.open("structure.txt", fstream::out);
        return 0;
    }
 
    const int n = 5;
    int i, j, im;
    struct university
    {
        char fam[10];
        char name[10];
        char otch[10];
        char gender[10];
        char facul[10];
        int kurs;
        int group;
        int mark[5];
        char city[10];
    };
 
    university students[n], study1;
    cout << "До сортировки: " << endl;
        for (int i = 0; i < n; i++)
        {
            file >> students[i].fam;
            file >> students[i].name;
            file >> students[i].otch;
            file >> students[i].gender;
            file >> students[i].facul;
            file >> students[i].kurs;
            file >> students[i].group;
            file >> students[i].mark[0];
            file >> students[i].mark[1];
            file >> students[i].mark[2];
            file >> students[i].mark[3];
            file >> students[i].mark[4];
            file >> students[i].city;
            cout << "Фамилия: " << students[i].fam << endl;
            cout << "Имя: " << students[i].name << endl;
            cout << "Отчество: " << students[i].otch << endl;
            cout << "Пол: " << students[i].gender << endl;
            cout << "Факультет: " << students[i].facul << endl;
            cout << "Курс: " << students[i].kurs << endl;
            cout << "Группа: " << students[i].group << endl;
            cout << "Оценка по программированию: " << students[i].mark[0] << endl;
            cout << "Оценка по литературе: " << students[i].mark[1] << endl;
            cout << "Оценка по математике: " << students[i].mark[2] << endl;
            cout << "Оценка по физике: " << students[i].mark[3] << endl;
            cout << "Оценка по теории алгоритмов: " << students[i].mark[4] << endl;
            cout << "Город: " << students[i].city << endl;
            cout << endl;
        }
    
    for (i = 0; i < n - 1; i++)
    {
        im = i;
        for (j = i + 1; j < n; j++)
            if (strcmp(students[im].city, students[j].city) > 0) im = j;
        study1 = students[i];
        students[i] = students[im];
        students[im] = study1;
    }
    cout << "После сортировки: " << endl;
    for (i = 0; i < n; i++)
    {
        cout << "Фамилия: " << students[i].fam << endl;
        cout << "Имя: " << students[i].name << endl;
        cout << "Отчество: " << students[i].otch << endl;
        cout << "Пол: " << students[i].gender << endl;
        cout << "Факультет: " << students[i].facul << endl;
        cout << "Курс: " << students[i].kurs << endl;
        cout << "Группа: " << students[i].group << endl;
        cout << "Оценка по программированию: " << students[i].mark[0] << endl;
        cout << "Оценка по литературе: " << students[i].mark[1] << endl;
        cout << "Оценка по математике: " << students[i].mark[2] << endl;
        cout << "Оценка по физике: " << students[i].mark[3] << endl;
        cout << "Оценка по теории алгоритмов: " << students[i].mark[4] << endl;
        cout << "Город: " << students[i].city << endl;
        cout << endl;
    }
    
    file.close();
    system("pause");
 
    return 0;
}
0
27.03.2016, 12:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2016, 12:40

Реализовать поиск по заданному полю в массиве объектов типа "Сотрудник"
Задание: Структура &quot;Сотрудник&quot;: - фамилия, имя, отчество; - должность -...

Реализовать поиск по заданному полю в массиве объектов типа "Bus"
. Bus: Фамилия и инициалы водителя, Номер автобуса, Номер маршрута, Марка, Год...

Реализовать поиск по заданному полю в массиве объектов типа "Абитуриент"
При поступлении в университет лица, получившие оценку «неудовлетворительно» на...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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