Запись имеет вид: фамилия студента, номер зачетной книжки, 4 оценки за экзамен. Выводить информацию о всех двоечниках и корректировать ее.
Не могу сделать поиск и корректировку.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <clocale>
#include <stdlib.h>
int p;
using namespace std;
struct tov { char name[10]; int c; int kol; } t1;
void input(FILE*); // // создание нового файла
void print(FILE*); //просмотр файла
void app(FILE*); // добавление в файл
void find(FILE*); //поиск и изменение
void main()
{
setlocale(LC_CTYPE, "Russian");
char c;
FILE* tf{};
while (1)
{
puts(" 1 – создание нового файла");
puts(" 2 – просмотр файла");
puts(" 3 – добавление в файл");
puts(" 4 – поиск и изменение ");
puts(" 0 - выход");
c = _getch();
switch (c)
{
case '1':input(tf); break;
case '2':print(tf); break;
case '3':app(tf); break;
case '4':find(tf); break;
case '0':return;
default: puts(" неверный режим");
}
}
}
void input(FILE* tf)
{
char ch;
tf = fopen("file1.dat", "wb"); // // открытие бинарного файла для записи
printf("\n список \n");
do
{
printf("\n фио: "); scanf("%s", t1.name );
printf(" зачетка "); scanf("%d", &t1.c);
printf(" 4 оценки: "); scanf("%d", &t1.kol);
fwrite(&t1, sizeof(t1), 1, tf); // запись в файл одной структуры t1
printf("\n Закончить? y/n \n");
ch = _getch();
} while (ch != 'y');
fclose(tf);
}
void print(FILE* tf)
{
int i;
tf = fopen("file1.dat", "rb");
i = 1;
fread(&t1, sizeof(t1), 1, tf);
while (!feof(tf))
{
printf("\n %3d)ФИО: %s зачетка: %d ", i, t1.name , t1.c);
printf(" оценки: %d", t1.kol);
printf("\n");
fread(&t1, sizeof(t1), 1, tf);
i++;
}
_getch();
}
void app(FILE* tf)
{
char ch;
tf = fopen("file1.dat", "ab");
printf("\n добавить к списку:\n");
do
{
printf("\n фио "); scanf("%s", t1.name );
printf(" зачетка "); scanf("%d", &t1.c);
printf(" 4 оценки: "); scanf("%d", &t1.kol);
fwrite(&t1, sizeof(t1), 1, tf);
printf("\n закончить? y/n ");
ch = _getch();
} while (ch != 'y');
fclose(tf);
}
void find(FILE* tf)
{
}
}
C/C++
Составить программу, выполняющую следующие функции:
Как я понимаю, вам нужно добавить функцию поиска и корректировки всех студентов с четверками в файле. Я предлагаю воспользоваться следующим алгоритмом:
1. Открыть файл для чтения и записи (режим "rb+").
2. Считать одну запись из файла.
3. Если достигнут конец файла (feof), выйти из функции.
4. Проверить, есть ли у студента оценки ниже 4.
5. Если есть, вывести информацию о студенте.
6. Спросить пользователя, нужно ли изменить оценки.
7. Если пользователь отвечает "да", считать новые значения оценок.
8. Перезаписать структуру в файле новыми значениями.
9. Повторить шаги с 2 по 8 для всех записей в файле.
10. Закрыть файл.
Вот как может выглядеть реализация этого алгоритма в функции find:
1. Открыть файл для чтения и записи (режим "rb+").
2. Считать одну запись из файла.
3. Если достигнут конец файла (feof), выйти из функции.
4. Проверить, есть ли у студента оценки ниже 4.
5. Если есть, вывести информацию о студенте.
6. Спросить пользователя, нужно ли изменить оценки.
7. Если пользователь отвечает "да", считать новые значения оценок.
8. Перезаписать структуру в файле новыми значениями.
9. Повторить шаги с 2 по 8 для всех записей в файле.
10. Закрыть файл.
Вот как может выглядеть реализация этого алгоритма в функции find:
void find(FILE* tf) {
tf = fopen("file1.dat", "rb+");
if (tf == NULL) {
printf("Ошибка открытия файла.");
return;
}
fread(&t1, sizeof(t1), 1, tf);
while (!feof(tf)) {
if (t1.kol < 4) {
printf("\nСтудент с ФИО %s и зачетной книжкой %d имеет оценки ниже 4\n", t1.name, t1.c);
printf("Введите новые значения оценок: ");
scanf("%d", &t1.kol);
fseek(tf, -sizeof(t1), SEEK_CUR); // переместить указатель файла на начало записи
fwrite(&t1, sizeof(t1), 1, tf); // перезаписать запись новыми значениями
printf("Запись изменена.\n");
}
fread(&t1, sizeof(t1), 1, tf);
}
fclose(tf);
}
Надеюсь, это поможет вам решить задачу. Удачи!
Александр Завальный
благодарю
Александр Завальный

Александр Завальный
код считывает только одну оценку и при замене зацикливается на поиске оценок и добавлении в файл новых записей
Для реализации поиска и корректировки необходимо добавить функцию, которая будет находить студентов с оценками ниже 3 и выводить их на экран. Затем можно добавить функцию, которая будет запрашивать у пользователя номер зачетной книжки студента, которого нужно изменить, и затем запрашивать новые оценки. После этого можно перезаписать данные в файле.
Пример кода для функции поиска и корректировки:
void find(FILE* tf)
{
int found = 0;
int num;
printf("Введите номер зачетной книжки студента: ");
scanf("%d", &num);
tf = fopen("file1.dat", "rb+"); // открытие бинарного файла для чтения и записи
fread(&t1, sizeof(t1), 1, tf);
while (!feof(tf))
{
if (t1.c == num && t1.kol < 3) // если нашли студента с номером зачетки num и оценкой ниже 3
{
printf("\nСтудент %s с номером зачетной книжки %d имеет оценки ниже 3: %d %d %d %d\n", t1.name , t1.c, t1.kol, t1.kol, t1.kol, t1.kol);
printf("Введите новые оценки: ");
scanf("%d %d %d %d", &t1.kol, &t1.kol, &t1.kol, &t1.kol);
fseek(tf, -sizeof(t1), SEEK_CUR); // перемещаем указатель на начало структуры
fwrite(&t1, sizeof(t1), 1, tf); // перезаписываем данные в файле
printf("Данные изменены.\n");
found = 1;
break;
}
fread(&t1, sizeof(t1), 1, tf);
}
if (!found)
{
printf("Студент с номером зачетной книжки %d не найден или не имеет оценок ниже 3.\n", num);
}
fclose(tf);
}
Пример кода для функции поиска и корректировки:
void find(FILE* tf)
{
int found = 0;
int num;
printf("Введите номер зачетной книжки студента: ");
scanf("%d", &num);
tf = fopen("file1.dat", "rb+"); // открытие бинарного файла для чтения и записи
fread(&t1, sizeof(t1), 1, tf);
while (!feof(tf))
{
if (t1.c == num && t1.kol < 3) // если нашли студента с номером зачетки num и оценкой ниже 3
{
printf("\nСтудент %s с номером зачетной книжки %d имеет оценки ниже 3: %d %d %d %d\n", t1.name , t1.c, t1.kol, t1.kol, t1.kol, t1.kol);
printf("Введите новые оценки: ");
scanf("%d %d %d %d", &t1.kol, &t1.kol, &t1.kol, &t1.kol);
fseek(tf, -sizeof(t1), SEEK_CUR); // перемещаем указатель на начало структуры
fwrite(&t1, sizeof(t1), 1, tf); // перезаписываем данные в файле
printf("Данные изменены.\n");
found = 1;
break;
}
fread(&t1, sizeof(t1), 1, tf);
}
if (!found)
{
printf("Студент с номером зачетной книжки %d не найден или не имеет оценок ниже 3.\n", num);
}
fclose(tf);
}
Александр Завальный
всё понял спасибо
print("Hello World!")
Александр Завальный
hello
Похожие вопросы
- 9.Составить программу с использованием функции
- Помогите составить программу на Visual Studio C++
- Составить программу на c++ УСПОЛЬЗУЯ МАССИВ!!!
- Составьте программу удаления столбца, содержащего максимальный элемент матрицы A[N][N] НА ЯЗЫКЕ СИ
- Составить программу C++, с помощью switch/case
- Составить программу c++ срочно пожалуйста
- Нужно составить программу для решения дифф. уравнений методом Рунге-Кутта
- Составить программу для нахождения корней уравнения
- Помогите написать программу с использованием функций, с++
- Составить программу для обработки одномерных статических массивов.