Структуры С++. Обращение к элементам внутри массива структур
Необходимо написать код, чтобы для каждого студента можно было вводить по 3 предмета\оценки и 2 питомца. Оценки и домашние животные должны быть массивами структур. На данный момент код выглядит так:
#include <iostream>
#include <string>
using namespace std;
const int n = 5;
const int mn = 3;
const int pn = 2;
struct grades
{
string subject;
int grade;
};
struct pets
{
string kind;
string nickname;
double weight;
int birth_year;
};
struct student
{
string name;
string patronym;
string surname;
grades all_grades[mn];
pets pet[pn];
};
void in_table(student tab[n], int& tablecount2);
void print_table(student tab[n], int& tablecount2);
int main() {
student table[n];
int tablecount = -1, menu;
do {
cout << "\n1 - заполнение полей структуры\n2 - вывод элементов полей структуры\n3 - запись в файл\n0 - выход\n";
cout << "\n";
cout << "Ваш выбор: ";
cin >> menu;
cout << "\n";
switch (menu)
{
case 1: in_table(table, tablecount); cout << "\n"; break;
case 2: print_table(table, tablecount); cout << "\n"; break;
case 0: break;
default: cout << "\nОшибка ввода\n";
}
} while (menu != 0);
}
void in_table(student tab[n], int& tablecount2)
{
if (tablecount2 < n - 1)
{
cout << "Количество места в массиве: " << n - tablecount2 - 1 << "\n";
tablecount2++;
cout << "\nИмя: ";
cin >> tab[tablecount2].name;
cout << "Отчество: ";
cin >> tab[tablecount2].patronym;
cout << "Фамилия: \n";
cin >> tab[tablecount2].surname;
for (int i = 0; i < mn; i++)
{
cout << "Название предмета: ";
cin >> tab[tablecount2].all_grades[i].subject;
cout << "Оценка: ";
cin >> tab[tablecount2].all_grades[i].grade;
}
cout << "Введите домашних животных: \n";
for (int i = 0; i < pn; i++)
{
cout << "Вид животного: ";
cin >> tab[tablecount2].pet[i].kind;
cout << "Кличка: ";
cin >> tab[tablecount2].pet[i].nickname;
cout << "Вес: ";
cin >> tab[tablecount2].pet[i].weight;
cout << "Год рождения: ";
cin >> tab[tablecount2].pet[i].birth_year;
}
}
else
{
cout << "Массив полон! Невозможно добавить запись\n";
}
}
void print_table(student tab[n], int& tablecount2)
{
cout << "\nВывод таблицы: \n";
for (int i = 0; i <= tablecount2; i++)
{
cout << "\ni = " << i;
cout << "\nИмя: " << tab[i].name;
cout << "\nОтчество: " << tab[i].patronym;
cout << "\nФамилия: " << tab[i].surname;
for (int j = 0; j < mn; j++)
{
cout << "Название предмета: ";
cout << tab[tablecount2].all_grades[j].subject << "\n";
cout << "Оценка: ";
cout << tab[tablecount2].all_grades[j].grade << "\n";
}
for (int j = 0; j < pn; j++)
{
cout << "Вид животного: ";
cout << tab[tablecount2].pet[j].kind << "\n";
cout << "Кличка: ";
cout << tab[tablecount2].pet[j].nickname << "\n";
cout << "Вес: ";
cout << tab[tablecount2].pet[j].weight << "\n";
cout << "Год рождения: ";
cout << tab[tablecount2].pet[j].birth_year << "\n";
}
}
}
Однако при такой записи получается, что у разных студентов одинаковые значения в структурах оценки и питомцы. Как исправить код, чтобы у каждого студента можно было вводить его собственные значения? В этом случае получается такой вывод:
Вывод таблицы:
i = 0
Имя: Егор
Отчество: Семенович
Фамилия: ИвановНазвание предмета: географ�ия
Оценка: 5
Название предмета: физика
Оценка: 3
Название предмета: химия
Оценка: 2
Вид животного: попугай
Кличка: Кеша
Вес: 0.3
Год рождения: 2020
Вид животного: хомяк
Кличка: Боря
Вес: 0.2
Год рождения: 2022
i = 1
Имя: Антон
Отчество: Михайлович
Фамилия: КостылевНазвание предмета: географ�ия
Оценка: 5
Название предмета: физика
Оценка: 3
Название предмета: химия
Оценка: 2
Вид животного: попугай
Кличка: Кеша
Вес: 0.3
Год рождения: 2020
Вид животного: хомяк
Кличка: Боря
Вес: 0.2
Год рождения: 2022
При таком вводе:
Количество места в массиве: 5
Имя: Егор
Отчество: Семенович
Фамилия:
Иванов
Название предмета: русский
Оценка: 3
Название предмета: математика
Оценка: 4
Название предмета: обществознание
Оценка: 4
Введите домашних животных:
Вид животного: кот
Кличка: Барсик
Вес: 4
Год рождения: 2012
Вид животного: собака
Кличка: Пес
Вес: 7
Год рождения: 2015
1 - заполнение полей структуры
2 - вывод элементов полей структуры
3 - запись в файл
0 - выход
Ваш выбор: 1
Количество места в массиве: 4
Имя: Антон
Отчество: Михайлович
Фамилия:
Костылев
Название предмета: география
Оценка: 5
Название предмета: физика
Оценка: 3
Название предмета: химия
Оценка: 2
Введите домашних животных:
Вид животного: попугай
Кличка: Кеша
Вес: 0.3
Год рождения: 2020
Вид животного: хомяк
Кличка: Боря
Вес: 0.2
Год рождения: 2022
Стоит ли как-то сделать из структур pets и grades таблицу (как структура student?)
Ответы (1 шт):
У вас большая проблема при выводе. Смотрите, Фамилию-прочее вы выводите для индекса i:
for (int i = 0; i <= tablecount2; i++)
{
cout << "\ni = " << i;
cout << "\nИмя: " << tab[i].name;
cout << "\nОтчество: " << tab[i].patronym;
cout << "\nФамилия: " << tab[i].surname;
а вот потом животных и оценки выводите независимо от i только для последнего элемента:
for (int j = 0; j < mn; j++)
{
cout << "Название предмета: ";
cout << tab[tablecount2].all_grades[j].subject << "\n";
cout << "Оценка: ";
cout << tab[tablecount2].all_grades[j].grade << "\n";
}
Видите это tablecount2 вместо i?
Что написали, то и получили... Обычная невнимательность + нетерпение (сразу бросились не в отладчик, а в ruSO).