Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 25.05.2014
Сообщений: 26

Возврат функцией массива структур

27.05.2014, 17:39. Показов 4270. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу программу, которая в зависимости от выбора пользователя считывает информацию о студентах, вводимую с клавиатуры, либо использует заранее подготовленный массив. После этого сортирует массив и выводит таблицу в виде упорядоченного по группам и алфавиту списка. Проблема с использованием массива-заготовки. Как правильно передать его в функцию? И еще вопрос: вот у меня есть структура students, у нее поля name, group и др. Можно ли получить размер определенного поля структуры, не используя непосредственно переменных с этим структурным типом (т.е., я знаю, что, если student1 - переменная структурного типа students, можно написать "sizeof (student1.name)", а можно ли еще как-то)?
Кликните здесь для просмотра всего текста
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
122
123
124
125
126
127
128
129
130
131
132
133
134
//7.4
#include <iostream>
#include <algorithm>
#include <windows.h>
#include <cstring>
#include <iomanip>
//#include <cstdio>
using namespace std;
 
const int name_size = 30, n = 6;
struct students
{
    char name[name_size];
    char group[n];
    int age;
    float average;
    float scholarship;
};
 
students* fill_arr(int);
students* use_arr();
students  fill_name(students);
students  fill_group(students);
int fill_age(students);
float fill_average(students);
float fill_scholaship(students);
void print_data(students);
void print_data_tab(students);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char choice;
    students *students_arr = NULL;
    int students_num;
    cout << "Заполните информацию о студентах \n1-ввести данные с клавиатуры \n2-использовать заготовку" << endl;
    cin >> choice;
    switch (choice)
    {
    case '1':
        cout << "Введите количество студентов: ";
        cin >> students_num;
        students_arr = fill_arr(students_num);
        break;
    case '2':
        students_arr = use_arr();
        students_num = sizeof (students_arr) / sizeof (students);
        break;
    }
    system("cls");
    cout << "\nИнформация о студентах: \n" << endl;
    int i, j; students temp;
    for (i = 0; i < students_num; i++)
        for (j = 0; j<students_num - i - 1; j++)
            if (strcmp(students_arr[j].group, students_arr[j + 1].group) > 0)
                swap(students_arr[j], students_arr[j + 1]);
            else
            if (strcmp(students_arr[j].group, students_arr[j + 1].group) == 0)
                if (strcmp(students_arr[j].name, students_arr[j + 1].name) > 0)
                    swap(students_arr[j], students_arr[j + 1]);
    for (int i = 0; i < students_num; i++)
        print_data_tab(students_arr[i]);
    system("pause");
}
students* fill_arr(int students_num)
{
    students* students_arr = new students[students_num];
    for (int i = 0; i < students_num; i++)
    {
        students_arr[i] = fill_name(students_arr[i]);
        students_arr[i] = fill_group(students_arr[i]);
        students_arr[i].age = fill_age(students_arr[i]);
        students_arr[i].average = fill_average(students_arr[i]);
        students_arr[i].scholarship = fill_scholaship(students_arr[i]);
    }
    return students_arr;
}
students* use_arr()
{
    students student1 = { "Урманов Роман Сергеевич", "Б8120", 18, 5.0, 7500 },
        student2 = { "Спицын Вячеслав Валерьевич", "Б8120", 17, 4.5, 0 },
        student3 = { "Аристова Дарья Павловна", "Б8120", 18, 4.0, 0 },
        student4 = { "Иванов Петр Владимирович", "М6180", 22, 5.0, 9000 },
        student5 = { "Дорошин Сергей Александрович", "М6180", 22, 4.9, 2800 },
        student6 = { "Годенко Николай Борисович", "Б5216", 19, 4.3, 2400 },
        student7 = { "Афанасьев Виктор Иванович", "Б5216", 19, 4.0, 1900 },
        student8 = { "Галинов Вячеслав Иванович", "Б5216", 19, 3.8, 0 };
    students default_students_arr[] = { student1, student2, student3, student4, student5, student6, student7, student8 };
    return default_students_arr;
}
students  fill_name(students stu_data)
{
    cout << "\nВведите имя студента: ";
    cin.get();
    gets_s(stu_data.name, sizeof (stu_data.name));
    return stu_data;
}
students fill_group(students stu_data)
{
    cout << "Введите группу: ";
    gets_s(stu_data.group, sizeof (stu_data.group));
    return stu_data;
}
int fill_age(students stu_data)
{
    cout << "Введите возраст студента: ";
    cin >> stu_data.age;
    return stu_data.age;
}
float fill_average(students stu_data)
{
    cout << "Введите средний балл студента: ";
    cin >> stu_data.average;
    return stu_data.average;
}
float fill_scholaship(students stu_data)
{
    cout << "Введите размер стипендии: ";
    cin >> stu_data.scholarship;
    return stu_data.scholarship;
}
void print_data(students stu_data)
{
    cout << "ФИО студента: " << stu_data.name << endl
        << "Группа: " << stu_data.group << endl
        << "Возраст: " << stu_data.age << endl
        << "Средний балл: " << stu_data.average << endl
        << "Стипендия: " << stu_data.scholarship << endl << endl;
}
void print_data_tab(students stu_data)
{
    cout << setiosflags(ios::left) << setw(sizeof (stu_data.group)) << stu_data.group << setw(sizeof (stu_data.name)) << stu_data.name << setw(4) << stu_data.age << setw(5) << stu_data.average << setw(6) << stu_data.scholarship << endl;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.05.2014, 17:39
Ответы с готовыми решениями:

Возвращение функцией значения динамического массива структур
Auto readfile() { ifstream file(file); int i = 0, color; Auto *A = new Auto; while (!file.eof()) { file &gt;&gt; A.name &gt;&gt;...

Сортировка элементов массива структур шаблонной функцией
Как отсортировать с помощью шаблонной функции по значению полей в массиве структур? Кто знает, подскажите пожалуйста. Программа, которую...

Возврат объекта функцией
class C { int c; }c1,c2; C func() { return c1; }

23
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,538
Записей в блоге: 1
31.05.2014, 15:21
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Exzotick Посмотреть сообщение
montkay, я тут маленько поиздевался над вашим кодом и понял, что ошибка возникает, если в case 2 не делать динамического выделения памяти. Почему это необходимо, если в функции use_arr мы создаем статический массив, и присваиваем его pStud?
ты что, вообще не понимаешь? Блин! Ты в этой функции копируешь default_students_arr в pStud
то есть из одного места в памяти в другое, ё-моё!
И и источник и приёмник копируемых данных должен быть выделенной памятью! иначе ты скопируешь default_students_arr неизвестно куда! А надо, чтобы было известно, т.е. заранее выделить место для копии default_students_arr, чтобы это место было такого же размера!
0
0 / 0 / 0
Регистрация: 25.05.2014
Сообщений: 26
31.05.2014, 16:44  [ТС]
Можно ли это сделать, не копируя один массив в другой, а присвоить указатель на массив другому указателю?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,538
Записей в блоге: 1
31.05.2014, 18:35
Exzotick, нет, так как этот массив - локальный внутри этой функции и указатель на него будет действовать только внутри неё.
После возвращения из функции этот массив (default_students_arr) будет "уничтожен", точнее затёрт данными из других функций, а может и не затёрт, в любом случае сохранность данных не гарантируется.

Поэтому нужно поэлементно копировать данные в память, которая была заранее выделена до вызова этой функции и соответственно гарантированно сохранится и после выхода из неё.
0
12 / 12 / 12
Регистрация: 19.02.2014
Сообщений: 72
31.05.2014, 23:21
Если функция char* fill_name (students) будет возвращать return pStud->name;, то не должно быть ошибок.
Если создать статический массив внутри функции, то он умрет в этой же функции, в отличии от динамически выделенной памяти.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.05.2014, 23:21

Возврат функцией указателя на функцию
Всем привет! У меня возникла такая проблема: класс имеет поле-указатель на функцию. В методе, который осуществляет доступ к этуму полю,...

Возврат функцией экземпляра класса
Подскажите, будет ли корректной с точки зрения выделения памяти и всего прочего такая запись: MyObject fun(....) { myObject Obj =...

Можно ли присвоить одному массиву структур значение другого массива структур и записать его в файл
Можно ли присвоить одному массиву структур значение другого массива структур и записать его в файл?

Как сделать возврат функцией (или процедурой) массива
Ниже приведенный код не работает: function GetArrContents1(): array of integer; var a1: array of integer; begin ...

Возврат значения функцией
Может ли функция вернуть (return) 2 переменных одновременно?


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru