Вывод записей структуры по алфавиту

161
26 августа 2021, 17:00

Задание:

Описать структуру с именем STUDENT, содержащие поля:

  • фамилия и инициалы;
  • номер группы;
  • успеваемость (массив из пяти элементов).

Написать программу, выполняющую следующие действия:

  • ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT;
  • вывод всех записей по алфавиту;
  • вывод всех студентов, имеющих хотя бы одну оценку 2, если таких студентов нет, вывести соответствующее сообщение.

Сделал всё, кроме вывода записей по алфавиту (вроде как всё), вообще в голову не лезет, сказали сделать с помощью strcmp(), но додуматься не могу.

Код:

#include <iostream>
#include <string.h>
#include <cctype>
using namespace std;
struct student 
{
    char* fio;
    int group;
    int usp[5];
};
int main()
{
    student data[10];
    int n = 3;
    for (int i = 0; i < n; i++)
    {
        char temp[256];
        cout << "Введите ФИО студента №" << i << endl;
        cin >> temp;
        //cin.getline(temp, 256, '\n');
        data[i].fio = new char[strlen(temp) + 1];
        strcpy(data[i].fio, temp);
        cout << "Введите номер группы студента №" << i << endl;
        cin >> data[i].group;
        cout << "Введите успеваемость студента №" << i << endl;
        for(int j = 0; j < 5; j++)
            cin >> data[i].usp[j];
    }
    cout << endl << "Записи, отсортированные по алфавиту:";
    /*
    Вывести отсортированную структуру
    */
    cout << endl << endl << "Студенты имеющие двойки: ";
    for(int i = 0; i < n; i++){
        for(int j = 0; j < 5; j++){
            if(data[i].usp[j] == 2){
                cout << endl << "Фамилия: " << data[i].fio << endl;
                cout << "Номер группы: " << data[i].group << endl;
                cout << "Успеваемость: ";
                for(int g = 0; g < 5; g++)
                    cout << data[i].usp[g] << " ";
                break;
            }
        }
    }
}
Answer 1

Вы почему то стали инициализировать только первые три элемента массива. Для начала четко укажите количество студентов:

constexpr int n = 10;
student data[n];
// ваш код где нужно инициализировать все элементы

существуют очень много альгоритмов для сортировки. Представлю один из них для сортировки ваших С_строк:

for (int k = n / 2; k > 0; k /=2)   
    for (int i = 0; i < n - k; ++i)             
        for (int j = i;  j >= 0; --j)           
            if (strcmp(data[j].fio, data[j + k].fio) > 0) {
                student temp = data[j];
                data[j] = data[j + k];
                data[j + k] = temp;
            }   
READ ALSO
Символьный массив

Символьный массив

Задание: Вывести слова введенного текста, изменив каждое слово следующим образом: буквы слова, стоящие до первой гласной, перенести в конец...

79
Как найти утечку памяти?

Как найти утечку памяти?

Проблема в xPtr, никак не могу найти ошибку, он на нулевом элементе даже

97
Как передаются указатели на переменные при записи/чтении *fstream

Как передаются указатели на переменные при записи/чтении *fstream

Как избавиться от локальных переменных, используя элементы класса в read()?

163
C++, полиморфизм и умные указатели

C++, полиморфизм и умные указатели

Я плохо понимаю, как умные указатели (особенно shared_ptr) взаимодействуют с полиморфными типамиОбщая картина кажется простой, но как только я начинаю...

86