Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2023, 22:23   #1
kat_is
Новичок
Джуниор
 
Регистрация: 12.12.2023
Сообщений: 1
По умолчанию Описать структуру с именем STUDENT на языке Си

Здравствуйте!
Готовлюсь к сессии, задача стоит в лабораторной работе следующая :

Описать структуру с именем 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;
}

Не могу разобраться, что работает не так. Буду очень благодарна за помощь!
kat_is вне форума Ответить с цитированием
Старый 13.12.2023, 05:56   #2
Steelcraft
Форумчанин
 
Регистрация: 13.03.2023
Сообщений: 111
По умолчанию

  1. Отформатируйте код, в таком виде его невозможно читать
  2. Если реально хотите получить помощь, укажите, что именно не получилось. Экстрасенсы обитают на других форумах.
  3. Если реально хотите получить помощь, приложите файл с исходными данными. Вряд ли найдутся желающие тратить время на его заполнение вручную, это явное неуважение .
  4. У вас действительно используются дробные оценки, т.е. можно получить оценку 3.1415? Если нет, исправьте типы. Если да, то сравнивать реальные числа на равенство - очень плохая идея. К примеру, может оказаться, что оценка 5 реально хранится как 4.9999....
  5. Код:
    int s_size = sizeof(struct STUDENT);
    - плохая идея. Погуглите, какой тип значения выдает функция sizeof() на самом деле.
Steelcraft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JS Описать структуру с именем STUDENT, содержащую следующие поля M0nest Помощь студентам 0 14.11.2022 10:40
Описать класс с именем STUDENT (C++) DFG322 Помощь студентам 1 05.12.2021 12:56
Описать структуру с именем STUDENT C# Приложение Windows Forms (не консольное) Genij4444 Помощь студентам 1 04.03.2018 22:36
Описать Структуру с именем STUDENT DzirT34669 Помощь студентам 6 08.01.2015 14:21
Программа на Turbo C: Описать структуру с именем STUDENT kolyasha Помощь студентам 7 10.06.2014 08:02