Не сохраняет структуры в массив - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Возникала проблема с сохранением структур в C.
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
 
struct ocenki
{
    int Russ;
    int Matan;
    int Inform;
    int History;
    int Asm;
};
struct student
{
    char Fam[20];
    char Name[20];
    char Otch[20];
    char Gorod[20];
    bool pol; //True = man;
    struct ocenki Ocenki;
};
struct groop
{
    char Name[20];
    struct student *Students;
    int KStudents;
    int Kurs;
    int CountGirls;
};
struct ocenki NewOc(int number)
{
    struct ocenki oc;
    printf("|  |  |  |--Russ: ");
    scanf("%d", &oc.Russ);
    fflush(stdin);
    printf("|  |  |  |--Matan: ");
    scanf("%d", &oc.Matan);
    fflush(stdin);
    printf("|  |  |  |--Inform: ");
    scanf("%d", &oc.Inform);
    fflush(stdin);
    printf("|  |  |  |--History: ");
    scanf("%d", &oc.History);
    fflush(stdin);
    printf("|  |  |  |--Asm: ");
    scanf("%d", &oc.Asm);
    printf("|  |  |-----------\n");
    fflush(stdin);
    return oc;
};
struct student NewSt(int number)
{
    struct student Student;
    int pol;
    printf("|  |--Student #%d\n", number);
    printf("|  |  |--Family: ");
    gets(Student.Fam);
    fflush(stdin);
    printf("|  |  |--Name: ");
    gets(Student.Name);
    fflush(stdin);
    printf("|  |  |--Otch: ");
    gets(Student.Otch);
    fflush(stdin);
    printf("|  |  |--Gorod: ");
    gets(Student.Gorod);
    fflush(stdin);
    printf("|  |  |--Pol(1 = Man): ");
    scanf("%d", &pol);
    fflush(stdin);
    Student.pol = false;
    if (pol == 1)
    {
        Student.pol = true;
    }
    printf("|  |  |--Ocenki: \n");
    Student.Ocenki = NewOc(number);
    printf("|  |-----------\n");
    return Student;
};
struct groop NewGr(int number)
{
    struct groop Groop;
    struct student *Students;
    int Counter;
    printf("Input Name of groop #%d: ", number);
    gets(Groop.Name);
    fflush(stdin);
    printf("Group name: %s\n", Groop.Name);
    fflush(stdin);
    printf("|--Curs: ", number);
    scanf("%d", &Groop.Kurs);
    fflush(stdin);
    printf("|--Count of students: ");
    scanf("%d", &Groop.KStudents);
    fflush(stdin);
    Students = (struct student*)malloc(sizeof(struct student) * Groop.KStudents);
    Groop.CountGirls = 0;
    for (Counter = 0; Counter < Groop.KStudents; ++Counter)
    {
        Students[Counter] = NewSt(Counter);
        if (!Students[Counter].pol)
        {
            ++Groop.CountGirls;
        }
    }
    printf("|-----------\n");
    return Groop;
};
struct groop SortG(struct groop grooppa)
{
    int x;
    int y;
    int MinStr;
    char *bCh;
    for (x = 0; x < grooppa.KStudents; ++x)
    {
        for (y = 0; y < grooppa.KStudents; ++y)
        {
            if (grooppa.Students[x].Fam > grooppa.Students[y].Fam)
            {
                bCh = grooppa.Students[x].Fam;
                *(grooppa.Students[x]).Fam = *(grooppa.Students[y]).Fam;
                *(grooppa.Students[y]).Fam = bCh;
            }
        }
    }
    return grooppa;
};
struct groop *SortGrMass(struct groop *Groop_, int KGr)
{
    int i;
    int j;
    struct groop buff;
    for (i = 0; i < KGr; ++i)
    {
        for (j = 0; j < KGr; ++j)
        {
            if (Groop_[i].CountGirls < Groop_[j].CountGirls)
            {
                buff = Groop_[i];
                Groop_[i] = Groop_[j];
                Groop_[j] = buff;
            }
        }
    }
    return Groop_;
};
void OutPut_Struct(struct groop *Gr, int kGr)
{
    int Co;
    int CS;
    for (Co = 0; Co < kGr; ++Co)
    {
        printf("Group: %s Kyrs: %d\n", Gr[Co].Name, Gr[Co].Kurs);
        for (CS = 0; CS < Gr[Co].KStudents; ++CS)
        {
            printf("|--Fam: %s\n", Gr[Co].Students[CS].Fam);
            printf("|--Name: %s\n", Gr[Co].Students[CS].Name);
            printf("|--Otch: %s\n", Gr[Co].Students[CS].Otch);
            printf("|--Gorod: %s\n", Gr[Co].Students[CS].Gorod);
            printf("|--Ocenki: \n");
            printf("|   |--%d\n", Gr[Co].Students[CS].Ocenki.Inform);
            printf("|   |--%d\n", Gr[Co].Students[CS].Ocenki.Matan);
            printf("|   |--%d\n", Gr[Co].Students[CS].Ocenki.Russ);
            printf("|   |--%d\n", Gr[Co].Students[CS].Ocenki.History);
            printf("|   |--%d\n", Gr[Co].Students[CS].Ocenki.Asm);
        }
    }
}
int main()
{
    int KGroop;
    int KStudents;
    int Counter;
    int MGIG;
    struct groop *Groops;
    printf("Input count of groops: ");
    scanf("%d", &KGroop);
    Groops = (struct groop*)malloc(sizeof(struct groop) * KGroop);
    if (!Groops)
    {
        printf("Low memory exception\n");
    }
    fflush(stdin);
    MGIG = 0;
    for (Counter = 0; Counter < KGroop; ++Counter)
    {
        Groops[Counter] = NewGr(Counter);
        if (Groops[MGIG].CountGirls < Groops[Counter].CountGirls)
        {
            MGIG = Counter;
        }
    }
    //Groops[MGIG] = SortG(Groops[MGIG]);
    //Groops = SortGrMass(Groops, KGroop);
    OutPut_Struct(Groops, KGroop);
}

Решение задачи: «Не сохраняет структуры в массив»

textual
Листинг программы
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
 
struct ocenki
{
    int Russ;
    int Matan;
    int Inform;
    int History;
    int Asm;
};
struct student
{
    char Fam[20];
    char Name[20];
    char Otch[20];
    char Gorod[20];
    bool pol; //True = man;
    struct ocenki Ocenki;
};
struct groop
{
    char Name[20];
    struct student *Students;
    int KStudents;
    int Kurs;
    int CountGirls;
};
struct ocenki NewOc()
{
    struct ocenki oc;
    printf("|  |  |  |--Russ: ");
    scanf("%d", &oc.Russ);
    fflush(stdin);
    printf("|  |  |  |--Matan: ");
    scanf("%d", &oc.Matan);
    fflush(stdin);
    printf("|  |  |  |--Inform: ");
    scanf("%d", &oc.Inform);
    fflush(stdin);
    printf("|  |  |  |--History: ");
    scanf("%d", &oc.History);
    fflush(stdin);
    printf("|  |  |  |--Asm: ");
    scanf("%d", &oc.Asm);
    printf("|  |  |-----------\n");
    fflush(stdin);
    return oc;
};
struct student NewSt(int number)
{
    struct student Student;
    int pol;
    printf("|  |--Student #%d\n", number);
    printf("|  |  |--Family: ");
    gets(Student.Fam);
    fflush(stdin);
    printf("|  |  |--Name: ");
    gets(Student.Name);
    fflush(stdin);
    printf("|  |  |--Otch: ");
    gets(Student.Otch);
    fflush(stdin);
    printf("|  |  |--Gorod: ");
    gets(Student.Gorod);
    fflush(stdin);
    printf("|  |  |--Pol(1 = Man): ");
    scanf("%d", &pol);
    fflush(stdin);
    Student.pol = false;
    if (pol == 1)
    {
        Student.pol = true;
    }
    printf("|  |  |--Ocenki: \n");
    Student.Ocenki = NewOc();
    printf("|  |-----------\n");
    return Student;
};
struct groop NewGr(int number)
{
    struct groop Groop;
    ///struct student *Students;
    int Counter;
    printf("Input Name of groop #%d: ", number);
    gets(Groop.Name);
    fflush(stdin);
    printf("Group name: %s\n", Groop.Name);
    fflush(stdin);
    printf("|--Curs: ", number);
    scanf("%d", &Groop.Kurs);
    fflush(stdin);
    printf("|--Count of students: ");
    scanf("%d", &Groop.KStudents);
    fflush(stdin);
    Groop.Students = (struct student*)malloc(sizeof(struct student) * Groop.KStudents);
    Groop.CountGirls = 0;
    for (Counter = 0; Counter < Groop.KStudents; ++Counter)
    {
        Groop.Students[Counter] = NewSt(Counter);
        if (!Groop.Students[Counter].pol)
        {
            ++Groop.CountGirls;
        }
    }
    printf("|-----------\n");
    return Groop;
};
struct groop SortG(struct groop grooppa)
{
    int x;
    int y;
    int MinStr;
    char *bCh;
    for (x = 0; x < grooppa.KStudents; ++x)
    {
        for (y = 0; y < grooppa.KStudents; ++y)
        {
            if (grooppa.Students[x].Fam > grooppa.Students[y].Fam)
            {
                bCh = grooppa.Students[x].Fam;
                *(grooppa.Students[x]).Fam = *(grooppa.Students[y]).Fam;
                *(grooppa.Students[y]).Fam = bCh;
            }
        }
    }
    return grooppa;
};
struct groop *SortGrMass(struct groop *Groop_, int KGr)
{
    int i;
    int j;
    struct groop buff;
    for (i = 0; i < KGr; ++i)
    {
        for (j = 0; j < KGr; ++j)
        {
            if (Groop_[i].CountGirls < Groop_[j].CountGirls)
            {
                buff = Groop_[i];
                Groop_[i] = Groop_[j];
                Groop_[j] = buff;
            }
        }
    }
    return Groop_;
};
void OutPut_Struct(struct groop *Gr, int kGr)
{
    int Co;
    int CS;
    for (Co = 0; Co < kGr; ++Co)
    {
        printf("Group: %s Kyrs: %d\n", Gr[Co].Name, Gr[Co].Kurs);
        for (CS = 0; CS < Gr[Co].KStudents; ++CS)
        {
            printf("|--Fam: %s\n", Gr[Co].Students[CS].Fam);
            printf("|--Name: %s\n", Gr[Co].Students[CS].Name);
            printf("|--Otch: %s\n", Gr[Co].Students[CS].Otch);
            printf("|--Gorod: %s\n", Gr[Co].Students[CS].Gorod);
            printf("|--Ocenki: \n");
            printf("|   |--%d\n", Gr[Co].Students[CS].Ocenki.Inform);
            printf("|   |--%d\n", Gr[Co].Students[CS].Ocenki.Matan);
            printf("|   |--%d\n", Gr[Co].Students[CS].Ocenki.Russ);
            printf("|   |--%d\n", Gr[Co].Students[CS].Ocenki.History);
            printf("|   |--%d\n", Gr[Co].Students[CS].Ocenki.Asm);
        }
    }
}
int main()
{
    int KGroop;
    int KStudents;
    int Counter;
    int MGIG;
    struct groop *Groops;
    printf("Input count of groops: ");
    scanf("%d", &KGroop);
    Groops = (struct groop*)malloc(sizeof(struct groop) * KGroop);
    if (!Groops)
    {
        printf("Low memory exception\n");
    }
    fflush(stdin);
    MGIG = 0;
    for (Counter = 0; Counter < KGroop; ++Counter)
    {
        Groops[Counter] = NewGr(Counter);
        if (Groops[MGIG].CountGirls < Groops[Counter].CountGirls)
        {
            MGIG = Counter;
        }
    }
    Groops[MGIG] = SortG(Groops[MGIG]);
    Groops = SortGrMass(Groops, KGroop);
    OutPut_Struct(Groops, KGroop);
}

Объяснение кода листинга программы

В данном коде реализованы структуры данных для хранения информации о студентах и группах. Структура student содержит поля для хранения имени, фамилии, отчества, города проживания и информации о поле студента (true - мужчина, false - женщина). Также в структуре присутствует поле Ocenki, которое является указателем на структуру ocenki. Это позволяет избежать проблемы с сохранением структуры ocenki в массив, так как в данном случае мы работаем с указателями на структуры, а не с самими структурами. Структура groop содержит поля для хранения имени группы, количества студентов в группе и количества девушек в группе. Также в структуре есть поле Students, которое является массивом указателей на структуры student. Это позволяет хранить информацию о студентах в группе. В функции NewSt создается новый экземпляр структуры student. Сначала пользователю предлагается ввести информацию о студенте, а затем эта информация сохраняется в соответствующие поля структуры. В функции NewGr создается новый экземпляр структуры groop. Сначала пользователю предлагается ввести информацию о группе, а затем эта информация сохраняется в соответствующие поля структуры. В функции SortG происходит сортировка группы студентов по фамилии. Для этого используется алгоритм сортировки пузырьком. В функции SortGrMass происходит сортировка массива групп по количеству девушек в группе. Для этого используется алгоритм сортировки выбором. В функции OutPut_Struct происходит вывод информации о группах и студентах на экран. Для каждой группы выводится информация о количестве студентов и количество девушек в группе, а также информация о каждом студенте, включая его фамилию, имя, отчество, город проживания и оценки по различным предметам.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.556 из 5
Похожие ответы