0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 224
1

Передача локального массива структур в функцию

06.05.2020, 18:11. Показов 2008. Ответов 6
Метки с++ (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, люди добрые. У меня есть структура, которая задаётся внутри функции main(), т.к. по условию задачи глобальных данных быть не должно. Также есть массив структур mass[8]. У меня есть функция menu(), внутри которой есть некоторые другие функции, меняющие значения элементов массива структур mass. Каким образом я могу передать массив структур через указатель/ссылку другим функциям, чтобы поменять значения?
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <clocale>
#include <fstream>
using namespace std;
 
template<class Type>
 
void Input(int& n);
void Adding(int n);
void Looking(int n);
void Output();
void Changing();
void Removing(int n);
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    union Sex {
        char _sex;
    };
 
    struct Olympiad {
        char surname[30];
        int points;
        int rank;
        Sex sex;
        enum SexNumber { man_number = 1, woman_number };
    } mass[8];
 
    int z = 0;
 
    strcpy_s(mass[0].surname, "Smith");
    strcpy_s(mass[1].surname, "Lemon");
    strcpy_s(mass[2].surname, "Teuchi");
    strcpy_s(mass[3].surname, "Tennant");
    strcpy_s(mass[4].surname, "Lona");
    mass[0].points = 99;
    mass[1].points = 75;
    mass[2].points = 60;
    mass[3].points = 47;
    mass[4].points = 16;
    mass[0].rank = 1;
    mass[1].rank = 2;
    mass[2].rank = 3;
    mass[3].rank = 4;
    mass[4].rank = 5;
    mass[0].sex._sex = 'M';
    mass[1].sex._sex = 'W';
    mass[2].sex._sex = 'M';
    mass[3].sex._sex = 'M';
    mass[4].sex._sex = 'W';
    menu();
 
    system("pause");
    return 0;
}
 
void menu() {
    int p = 0, x, v, n = 5; //n - кол-во строк в таблице
    cout << "Введите число для выбора операции: " << endl;
    cout << "1)Ввод данных в таблицу из текстового файла" << endl;
    cout << "2)Добавление новых элементов в конец таблицы" << endl;
    cout << "3)Просмотр таблицы" << endl;
    cout << "4)Ввод данных из текстового файла в таблицу" << endl;
    cout << "5)Изменение выбранного элемента таблицы" << endl;
    cout << "6)Удаление выбранного элемента таблицы" << endl;
    cout << "7)Выход" << endl;
    cin >> p;
    switch (p) {
    case 1:
        Input(n);
        menu();
        break;
    case 2:
        cout << "Сколько строк Вы желаете ввести?" << endl;
        cin >> x;
        for (x; x > 0; x--) {
            Adding(n);
            n++;
        }
        Looking(n);
        menu();
        break;
    case 3:
        Looking(n);
        menu();
        break;
    case 4:
        Output();
        menu();
        break;
    case 5:
 
        Changing();
        menu();
        break;
    case 6:
        Removing(n);
        n--;
        Looking(n);
        menu();
        break;
    case 7:
        exit(0);
    }
 
}
 
void Input(int& n) {
    ifstream Table("Table.txt");
    if (!Table)
    {
        cout << "Error!" << endl;
        exit(1);
    }
    char s;
    int number_n = 0;
    while (!Table.eof())
    {
        Table.get(s);
        if (s == '\n')
            number_n++;
    }
    Table.close();
    Table.open("Table.txt");
    n = number_n + 1;
    for (int i = 0; i < n; i++) {
        Table >> mass[i].surname;
        Table >> mass[i].points;
        Table >> mass[i].rank;
        Table >> mass[i].sex._sex;
    }
    Table.close();
}
 
void Adding(int n) {
    int d;
    char m = 'M';
    char w = 'W';
    cout << "Введите имя участника олимпиады:" << endl;
    cin >> mass[n].surname;
    cout << "Введите количество очков, полученное участником:" << endl;
    cin >> mass[n].points;
    cout << "Введите место участника:" << endl;
    cin >> mass[n].rank;
    cout << "Введите «1», если участник - мужчина и «2», если участник - женщина" << endl;
    cin >> d;
    switch (d) {
    case mass[0].man_number:
        mass[n].sex._sex = 'M'; // M - man
        break;
    case mass[0].woman_number:
        mass[n].sex._sex = 'W'; // W - woman
        break;
    }
}
 
void Looking(int n) {
    cout << "Surname" << setw(20) << "Points" << setw(20) << "Rank" << setw(20) << "Sex" << endl;
    for (int i = 0; i < n; i++)
        cout << mass[i].surname << "\t" << setw(19) << mass[i].points << setw(19) << mass[i].rank << setw(19) << mass[i].sex._sex << endl;
}
 
void Output() {
 
}
 
void Changing() {
 
}
 
void Removing(int n) {
    int a;
    cout << "Которую строку Вы желаете удалить?" << endl;
    cin >> a;
    for (a; a < n; a++) {
        strcpy_s(mass[a - 1].surname, mass[a].surname);
        mass[a - 1].points = mass[a].points;
        mass[a - 1].rank = mass[a].rank;
        strcpy_s(mass[a - 1].sex._sex, mass[a].sex._sex);
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2020, 18:11
Ответы с готовыми решениями:

Передача массива структур в функцию
У меня есть массив структур,функция SLVE,как передать массив структур в функцию? struct...

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

Передача массива структур в функцию
В общем проблема с передачей массива структур в функцию... Структура описана следующим образом:...

Передача массива структур в функцию
День добрый, учусь работать с структурами. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using...

6
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
06.05.2020, 19:21 2
Лучший ответ Сообщение было отмечено KaffLime как решение

Решение

KaffLime, вас просят, чтобы не было глобальных данных (т.е. массив должен объявляться внутри какой-либо функции), а сам тип структуры у вас может и должен быть вне main, чтобы остальные функции его увидели.

Добавлено через 9 минут
При условии вышесказанного надо изменить код.

Цитата Сообщение от KaffLime Посмотреть сообщение
void menu() { // 63 строка
C++
1
void menu(Olympiad *mass, size_t massSize) {
Цитата Сообщение от KaffLime Посмотреть сообщение
menu(); // 57 строка
C++
1
menu(mass, sizeof(mass)/sizeof(mass[0]));
И т.д. прокидываете массив и его размер в каждую из функций.
Т.е. например в строке 76 будет:
C++
1
Input(n, mass, massSize);
и т.д. менять прототипы функций и их вызов в соответствии с необходимостью передавать туда массив.

А вот это
Цитата Сообщение от KaffLime Посмотреть сообщение
template<class Type> // 9 строка
Убрать вообще.
1
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 224
06.05.2020, 19:33  [ТС] 3
Я лично спросил у преподавателя о том, могу ли я задать саму структуру глобально, а массив структур внутри main(), на что она отвечает, что нет, это нарушает условие...
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
06.05.2020, 20:04 4
Цитата Сообщение от KaffLime Посмотреть сообщение
это нарушает условие...
Можно дословно задание?

Если там речь только про данные, то преподаватель и сама неверное понимает задание. Структура сама по себе - это не данные. Это описание данных.

Добавлено через 4 минуты
Обычно требование не делать глобальных данных проистекает из желания научить декомпозиции и разделению на слои абстракции в решаемой задаче.
1
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 224
06.05.2020, 20:15  [ТС] 5
Обобщенная формулировка задания. Выбрать предметную область (в
соответствии с вариантом) для базы данных и доработать структуру для описания
отдельных записей базы данных. Выбранная структура должна иметь не менее пяти
полей (элементов) двух и более типов, включая пользовательский тип union и enum.
Работа содержит описание разработанного студентом программного обеспечения
по обработке заданного массива структур. Для всех вариантов обеспечить
реализацию следующих запросов к заданному массиву структурированной
информации:
1. Ввод информации из текстового файла в массив указателей на записи
2. Добавление новых элементов в конец массива
3. Просмотр всех элементов массива
4. Вывод информации из массива в текстовый файл
5. Корректировка полей выбранного элемента
6. Удаление выбранного элемента
Максимальная оценка за реализацию данного задания составляет 6 (шесть)
баллов.
Для получения оценки из расчета 10 баллов необходимо обеспечить в
соответствии с заданием варианта реализацию еще трех запросов:
1. Удаление элементов по условию (поле &lt; или &gt; заданного значения)
2. Сортировка массива по числовому полю

3. Вставка нового элемента перед выбранным элементом
4. Вставка нового элемента после выбранного элемента
5. Замена выбранного элемента
6. Удаление элементов, начиная от выбранного
7. Просмотр элементов и вычисление среднего на множестве тех элементов,
которые попадают в заданный диапазон по заданному полю (поле типа float или
longint)
8. Просмотр элементов и вычисление минимума и максимума на множестве тех
элементов, которые попадают в заданный диапазон по заданному полю (поле
типа float или longint)
Условия и ограничения
1 Главную процедуру программы с реализацией простейшего меню следует
определить в отдельном модуле
2 Процедуры, реализующие запросы, должны быть размещены в одном или более
модулях
3 Глобальные данные использовать нельзя
4 На экран выводить элементы в виде таблицы (один элемент – одна строка
таблицы)
5 Если после выполнения запроса изменяется хотя бы один элемент, то
заканчивать запрос выводом всего множества элементов
6 Тестами к заданиям служат 2 текстовых файла с правдоподобной информацией
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
06.05.2020, 20:28 6
KaffLime, ну в общем-то все в силе. Структуру по этому заданию выносить в глобальное пространство можно, а вот сам массив - нельзя.
К тому же при помещении структуры внутрь main у вас будут нарушены другие требования к заданию:
1 Главную процедуру программы с реализацией простейшего меню следует
определить в отдельном модуле
2 Процедуры, реализующие запросы, должны быть размещены в одном или более
модулях
Если вы сделаете структуру внутри главной процедуры программы (main), то процедуры, реализующие запросы, которые по условию должны быть в отдельном модуле там находится не смогут, потому что не будут знать как работать со структурой, она будет для них скрыта.
1
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 224
06.05.2020, 22:09  [ТС] 7
Теперь выяснилось, что необходимо поместить объявление структуры в заголовочный файл ) Всё нужно сделать так, как вы написали, благодарствую.
0
06.05.2020, 22:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2020, 22:09
Помогаю со студенческими работами здесь

Передача массива структур в функцию
Помогите пожалуйста исправить ошибку. Массив student std должен передаваться в функции.VS 2010...

Передача динамического массива структур в функцию
Помогите, пожалуйста переделать. Нужно передать динамический массив. Есть такой код:...

Передача динамического массива структур в функцию
Доброго времени суток:) Имеется входной файл,который представлен в виде пар через запятую...

Передача массива структур в функцию не указывая размера массива
Я читаю с командной строки файл в котором содержится массив структур. Есть библиотека с функцией в...

Передача массива структур в функцию через указатель
вот пример куска кода, не могу понять почему ругается на: void Add(student *ptr) { for(int i =...

Передача массива структур в функцию
Есть следующие структуры: public struct Gorod { public bool Otgr; public...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru