Структуры С++. Обращение к элементам внутри массива структур

Необходимо написать код, чтобы для каждого студента можно было вводить по 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 шт):

Автор решения: Harry

У вас большая проблема при выводе. Смотрите, Фамилию-прочее вы выводите для индекса 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).

→ Ссылка