Не сохраняет структуры в массив - 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);
}Решение задачи: «Не сохраняет структуры в массив»
#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 происходит вывод информации о группах и студентах на экран. Для каждой группы выводится информация о количестве студентов и количество девушек в группе, а также информация о каждом студенте, включая его фамилию, имя, отчество, город проживания и оценки по различным предметам.