Здравствуйте.
Задача - разработать программу, содержащую односвязный линейный список студентов.
В структуре должны быть такие поля:
id;
ФИО;
Пол;
Год рождения;
Курс;
Группа;
Оценки по 5 произвольным предметам.
Со всем вроде справился, но при вводе пола, программа успешно вылетает.
Пожалуйста, посмотрите, что тут сделано не так? Какие проблемы с вводом?
#include <stdio.h>
#include <string.h>
#include <windows.h>
#define MAX 10
#define KOL 15
struct Student
{
int id;
char LastName[KOL];
char FirstName[KOL];
char Patronymic[KOL];
char Gender;
int Year_of_birth;
int Course;
char Group[KOL];
int MathRating;
int EnglishRating;
int UkrainianRating;
int ProgrammingRating;
int PhilosophyRating;
struct Student* nextStudent;
};
void InitStudentList(struct Student** student)
{
*student = (struct Student*)
malloc(sizeof(struct Student));
(*student)->id = 1;
printf("Введите фамилию 1 студента: ");
scanf("%s", (*student)->LastName);
printf("Введите имя 1 студента: ");
scanf("%s", (*student)->FirstName);
printf("Введите отчество 1 студента: ");
scanf("%s", (*student)->Patronymic);
printf("Введите пол 1 студента: ");
scanf("%s", (*student)->Gender);
printf("Введите год рождения 1 студента: ");
scanf("%d", &(*student)->Year_of_birth);
printf("Введите курс 1 студента: ");
scanf("%d", &(*student)->Course);
printf("Введите группу 1 студента: ");
scanf("%s", (*student)->Group);
printf("Введите оценку по Высшей математике 1-го студента: ");
scanf("%d", &(*student)->MathRating);
printf("Введите оценку по иностранному языку 1 студента: ");
scanf("%d", &(*student)->EnglishRating);
printf("Введите оценку по Украинскому языку 1 студента: ");
scanf("%d", &(*student)->UkrainianRating);
printf("Введите оценку по программированию 1 студента: ");
scanf("%d", &(*student)->ProgrammingRating);
printf("Введите оценку по философии 1 студента: ");
scanf("%d", &(*student)->PhilosophyRating);
printf("\n");
(*student)->nextStudent = NULL;
struct Student* endStudent = *student;
for (int i = 2; i <= MAX; i++)
{
endStudent->nextStudent =
(struct Student*) malloc(sizeof(struct Student));
endStudent = endStudent->nextStudent;
endStudent->id = i;
printf("Введите фамилию %d студента: ", i);
scanf("%s", endStudent->LastName);
printf("Введите имя %d студента: ", i);
scanf("%s", endStudent->FirstName);
printf("Введите отчество %d студента: ", i);
scanf("%s", endStudent->Patronymic);
printf("Введите пол %d студента: ", i);
scanf("%s", endStudent->Gender);
printf("Введите год рождения %d студента: ", i);
scanf("%d", endStudent->Year_of_birth);
printf("Введите курс %d студента: ", i);
scanf("%d", endStudent->Course);
printf("Введите группу %d студента: ", i);
scanf("%s", endStudent->Group);
printf("Введите оценку по Высшей математике %d студента: ", i);
scanf("%d", endStudent->MathRating);
printf("Введите оценку по Иностранному языку %d студента: ", i);
scanf("%d", endStudent->EnglishRating);
printf("Введите оценку по Украинскому языку %d студента: ", i);
scanf("%d", endStudent->UkrainianRating);
printf("Введите оценку по программированию %d студента: ", i);
scanf("%d", endStudent->ProgrammingRating);
printf("Введите оценку по философии %d студента: ", i);
scanf("%d", endStudent->PhilosophyRating);
printf("\n");
endStudent->nextStudent = NULL;
}
}
void PrintList(struct Student* student)
{
struct Student* printStudent = student;
printf("==========================\n");
printf("Номер Фамилия Имя Отчество Пол Год рождения Курс Группа Оценка по Высшей математике Оценка по Иностранному языку Оценка по Украинскому языку Оценка по программированию Оценка по философии\n");
printf("==========================\n");
while (printStudent)
{
printf("%d ", printStudent->id);
printf("%-15s ", printStudent->LastName);
printf("%-15s ", printStudent->FirstName);
printf("%-15s ", printStudent->Patronymic);
printf("%s ", printStudent->Gender);
printf("%d ", printStudent->Year_of_birth);
printf("%d ", printStudent->Course);
printf("%-15s ", printStudent->Group);
printf("%d ", printStudent->MathRating);
printf("%d ", printStudent->EnglishRating);
printf("%d ", printStudent->UkrainianRating);
printf("%d ", printStudent->ProgrammingRating);
printf("%d ", printStudent->PhilosophyRating);
printf("\n");
printStudent = printStudent->nextStudent;
}
printf("==========================\n");
}
void FreeList(struct Student** student)
{
if (*student == NULL)
return;
struct Student* tmp = *student;
struct Student* curr_stud;
while (tmp)
{
curr_stud = tmp;
tmp = tmp->nextStudent;
free(curr_stud);
}
*student = NULL;
}
void ChangeStudentLastName(int n, char name[KOL], struct Student* students)
{
struct Student* st = 0;
for (st = students; st != NULL; st = st->nextStudent)
{
if (st->id == n)
{
strncpy(st->LastName, name, sizeof(st->LastName));
st->LastName[sizeof(st->LastName) - 1] = '\0';
printf("зміни записані\n");
break;
}
}
}
int main(void)
{
int command;
struct Student* BaseStudent = NULL;
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
InitStudentList(&BaseStudent);
for (;;)
{
printf("Введіть команду:\n1 - Виведення списку студентів,\n2 - Змінити прізвище зазначеного студента,\n3 - вихід\n");
scanf("%d", &command);
switch (command)
{
case 1:
PrintList(BaseStudent);
break;
case 2:
{
int n;
char name[KOL];
printf("Введіть номер студента: ");
scanf("%d", &n);
printf("Введіть нове прізвище студента: ");
scanf("%s", &name);
ChangeStudentLastName(n, name, BaseStudent);
break;
}
case 3:
FreeList(&BaseStudent);
return 0;
default:
printf("Помилка вводу...");
FreeList(&BaseStudent);
return 0;
}
}
return 0;
}