Здравствуйте!
Готовлюсь к сессии, задача стоит в лабораторной работе следующая :
Описать структуру с именем STUDENT, содержащую следующие поля:
- порядковый номер;
- номер;
- фамилия и имя;
- год рождения;
- год поступления в университет;
- структура OCENKI, содержащая четыре поля: физика, математика, программирование, история.
Написать программу, выполняющую следующие действия с помощью
функций:
- ввод с клавиатуры данных в файл, состоящий из структур типа
STUDENT; записи должны быть упорядочены по алфавиту;
- чтение данных из этого файла и вывод их на экран;
- корректировку данных в файле по номеру записи;
- вывод на дисплей анкетных данных студентов отличников, если таких
студентов нет, вывести соответствующее сообщение.
Мой код с ошибками выглядит вот так :
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 256
// Структура для оценок
struct OCENKI {
float fizika;
float matematika;
float programming;
float istoriya;
};
// Структура для студента
struct STUDENT {
int orderNumber;
int number;
char name[N];
int birthYear;
int entryYear;
struct OCENKI grades;
};
int s_size = sizeof(struct STUDENT);
// Объявление функции
struct STUDENT get_data();
// Функция для ввода данных о студентах в файл
void inputToFile(FILE* file_p);
// Функция для чтения данных из файла и вывода их на экран
void outputFromFile(FILE* file_p);
// Функция для корректировки данных в файле по номеру записи
void correctData(FILE* file_p);
// Функция для вывода на экран анкетных данных студентов отличников
void excellentStudents(FILE* file_p);
// Функция для сравнения и сортировки студентов по алфавиту
int compareStudents(const void* a, const void* b);
int main() {
FILE* file_p = fopen("students.dat", "r+b");
if (file_p == NULL) {
file_p = fopen("students.dat", "w+b");
if (file_p == NULL) {
puts("Error");
exit(1);
}
}
int choice;
do {
system("cls");
printf("Menu\n"
"1 - Entering data into a file\n"
"2 - Outputting data from a file\n"
"3 - Correcting data in the file\n"
"4 - Displaying data about excellent students\n"
"0 - Exit\n");
printf("-> ");
scanf("%d", &choice);
switch (choice) {
case 1:
inputToFile(file_p);
system("pause");
break;
case 2:
outputFromFile(file_p);
system("pause");
break;
case 3:
correctData(file_p);
system("pause");
break;
case 4:
excellentStudents(file_p);
system("pause");
break;
case 0:
fclose(file_p);
return 0;
}
} while (1);
}
void inputToFile(FILE* file_p) {
fseek(file_p, 0, SEEK_END);
do {
struct STUDENT temp_d;
printf("Enter serial number: ");
scanf("%d", &temp_d.orderNumber);
//очищаем буфер ввода от лишних символов новой строки
getchar();
printf("Enter number: ");
scanf("%d", &temp_d.number);
printf("Enter your first and last name:");
//очищаем буфер ввода от лишних символов новой строки
getchar();
fgets(temp_d.name, N, stdin);
printf("Enter year of birth: ");
scanf("%d", &temp_d.birthYear);
printf("Enter the year you entered the university:");
scanf("%d", &temp_d.entryYear);
printf("Enter your physics grade: ");
scanf("%f", &temp_d.grades.fizika);
printf("Enter your math grade: ");
scanf("%f", &temp_d.grades.matematika);
printf("Enter your programming grade: ");
scanf("%f", &temp_d.grades.programming);
printf("Enter your history grade: ");
scanf("%f", &temp_d.grades.istoriya);
fwrite(&temp_d, s_size, 1, file_p);
printf("Continue? (0 - output): ");
if (getchar() == '0') break;
} while (1);
//сортировка по алфавиту
fseek(file_p, 0, SEEK_SET);
int len = ftell(file_p) / s_size;
struct STUDENT* students = (struct STUDENT*)malloc(len * s_size);
fread(students, s_size, len, file_p);
qsort(students, len, s_size, compareStudents);
fseek(file_p, 0, SEEK_SET);
fwrite(students, s_size, len, file_p);
free(students);
}
void outputFromFile(FILE* file_p) {
rewind(file_p);
struct STUDENT temp_d;
puts("| Serial number | Number | Last name and first name | Year of birth | Year of admission | Physics | Mathematics | Programming | History |");
while (fread(&temp_d, s_size, 1, file_p) > 0) {
printf("|%18d |%7d |%15s |%13d |%18d |%7.2f |%12.2f |%18.2f |%8.2f |%8.2f |\n",
temp_d.orderNumber, temp_d.number, temp_d.name, temp_d.birthYear, temp_d.entryYear,
temp_d.grades.fizika, temp_d.grades.matematika, temp_d.grades.programming, temp_d.grades.istoriya);
}
puts("\n______________________________________________________________________________________________________");
}
void correctData(FILE* file_p) {
fseek(file_p, 0, SEEK_END);
int len = ftell(file_p) / s_size;
int i;
struct STUDENT temp_d;
printf("Enter the serial number of the record to be corrected:");
scanf("%d", &i);
if (i > len || i <= 0) {
puts("There is no record with this serial number!");
return;
}
fseek(file_p, s_size * (i - 1), SEEK_SET);
fread(&temp_d, s_size, 1, file_p);
printf("|%18d |%7d |%15s |%13d |%18d |%7.2f |%12.2f |%18.2f |%8.2f |%8.2f |\n",
temp_d.orderNumber, temp_d.number, temp_d.name, temp_d.birthYear, temp_d.entryYear,
temp_d.grades.fizika, temp_d.grades.matematika, temp_d.grades.programming, temp_d.grades.istoriya);
int orderNumber = temp_d.orderNumber;
temp_d = get_data();
temp_d.orderNumber = orderNumber;
fseek(file_p, s_size * (i - 1), SEEK_SET);
fwrite(&temp_d, s_size, 1, file_p);
}
void excellentStudents(FILE* file_p) {
rewind(file_p);
struct STUDENT temp_d;
int hasExcellentStudents = 0;
puts("| Serial number | Number | Last name and first name | Year of birth | Year of admission | Physics | Mathematics | Programming | History |");
while (fread(&temp_d, s_size, 1, file_p) > 0) {
if (temp_d.grades.fizika == 5.0 && temp_d.grades.matematika == 5.0 &&
temp_d.grades.programming == 5.0 && temp_d.grades.istoriya == 5.0) {
printf("|%18d |%7d |%15s |%13d |%18d |%7.2f |%12.2f |%18.2f |%8.2f |%8.2f |\n",
temp_d.orderNumber, temp_d.number, temp_d.name, temp_d.birthYear, temp_d.entryYear,
temp_d.grades.fizika, temp_d.grades.matematika, temp_d.grades.programming, temp_d.grades.istoriya);
hasExcellentStudents = 1;
}
}
if (!hasExcellentStudents) {
puts("no excellent students.");
}
puts("\n______________________________________________________________________________________________________");
}
int compareStudents(const void* a, const void* b) {
return strcmp(((struct STUDENT*)a)->name, ((struct STUDENT*)b)->name);
}
struct STUDENT get_data() {
struct STUDENT temp_d;
temp_d.orderNumber = 0;
printf("Enter serial number: ");
scanf("%d", &temp_d.orderNumber);
printf("Enter number: ");
scanf("%d", &temp_d.number);
printf("Enter your first and last name: ");
scanf("%s", temp_d.name);
printf("Enter year of birth: ");
scanf("%d", &temp_d.birthYear);
printf("Enter the year you entered the university: ");
scanf("%d", &temp_d.entryYear);
printf("Enter your physics grade:");
scanf("%f", &temp_d.grades.fizika);
printf("Enter your math grade:");
scanf("%f", &temp_d.grades.matematika);
printf("Enter your programming grade:");
scanf("%f", &temp_d.grades.programming);
printf("Enter your history grade:");
scanf("%f", &temp_d.grades.istoriya);
return temp_d;
}
Не могу разобраться, что работает не так. Буду очень благодарна за помощь!