Не сохраняет структуры в массив - 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
происходит вывод информации о группах и студентах на экран. Для каждой группы выводится информация о количестве студентов и количество девушек в группе, а также информация о каждом студенте, включая его фамилию, имя, отчество, город проживания и оценки по различным предметам.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д