Отчет по лабораторной работе №8
Постановка задачи
Сформировать двоичный файл из элементов, заданной в варианте структуры, распечатать его содержимое, выполнить удаление и добавление элементов в соответствии со своим вариантом, используя для поиска удаляемых или добавляемых элементов функцию. Формирование, печать, добавление и удаление элементов оформить в виде функций. Предусмотреть сообщения об ошибках при открытии файла и выполнении операций ввода/вывода.
Вариант Задания
Структура "Студент":
- фамилия, имя, отчество;
- домашний адрес;
- группа;
- рейтинг.
Удалить все элементы, у которых рейтинг меньше заданного, добавить 1 элемент в конец файла.
Текст программы
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <fstream.h>
#include <cstring>
#include <string.h>
#include <windows.h>
#include <iomanip.h>
//---------------------------------------------------------------------------
#pragma argsused
char* rus(const char* text);
struct student // структура студент
{
char fio[50]; // фамиилия имя отчество
char adress[20]; // адресс проживания
char group[20]; // группа
float rate; // рэйтинговый бал
};
void add(student *, FILE *, int &);
void read(student *, FILE *, int &);
void kill(student *, FILE *, FILE * , float, int &);
void read2(student *, FILE *, float, int & );
void end(student *, FILE *, float, int&);
void save(student *, FILE *, FILE *, FILE *, int &);
void load(student *, FILE *,FILE *, int &);
int main(int argc, char* argv[])
{ /*
7. Структура "Студент":
|
|
- фамилия, имя, отчество;
- домашний адрес;
- группа;
- рейтинг.
Удалить все элементы, у которых рейтинг меньше заданного,
добавить 1 элемент в конец файла.
Текст функций для:
• формирования файла,
• печати файла,
• добавления записи в файл,
• удаления записи из файла
• поиска структуры для удаления.
p.s. Работая над данной лабораторной, я взял на себя смелость дополнить
задание. Я проработал диалоговое окно, сделал функцию сохранения и загрузки
файла. Так же появился выбор между добавлением студентов в список и
удалением их.
*/
int counter2 = 0; // счетчик кол-ва людей в списке
float sortrate; // переменная для хранения рейтинга сортировки студентов
student mas[10]; // у нас будет 5 студентов
FILE *f; // указатель на файл 1
FILE *ff; // аналогично на 2
FILE *fff;// в этом файле будем хранить число элементов структуры
|
|
int choice, choice2, choice4; // переменные для выбора
int choice3 = 3; // аналогично
int choice5,choice7;
load(mas, f, fff, counter2); // загрузка...(загружаем из файла fff кол-во
// людей в списке)
//-----------------------------------------------
printf(rus("Вы хотите создать новый файл или загрузить имеющийся? \n1 - создать новый, 2 - загрузить "));
scanf("%d",&choice); // делаем выбор
if (choice == 1)
{ // если 1, то добавляем студентов в список(не больше 5 в этом случае)
add(mas,f,counter2); // добавления записи в файл (создание новой версии)
printf(rus("Показать список и продолжить работу? 1 - да, 2 - нет "));
scanf("%d",&choice2); // делаем второй выбор
}
//-----------------------------------------------
if((choice == 1)&&(choice2 == 1)||(choice == 2))
// в зависимости от наших выборов приходим сюда
{
read(mas,f,counter2); // ф-ия чтение из файла f
printf(rus("Вы хотите продолжить работать со списком? 1 - да, 2 - нет "));
scanf("%d",&choice4); // опять выбор
}
//-----------------------------------------------
if ((choice4 == 1))
{
|
|
while (choice7 != 3)
{
printf(rus("Вы хотите добавить или удалить студентов в список?\n"));
printf(rus("1 - добавить, 2 - удалить, 3 - ничего не хочу "));
scanf("%d", &choice7);
if (choice7 == 2)
{
printf(rus("Удалить все элементы, у которых рейтинг меньше какого? "));
scanf("%f",&sortrate); // вводим райтинг студентов, меньше которого удалить
kill(mas,f,ff,sortrate,counter2); // убиваем из списка студентов с малым рейтингом
read2(mas,ff,sortrate, counter2); // вывод на экран
}
else if (choice7 == 1)
{
while(choice3 != 2)
{
printf(rus("Вы хотите добавить еще одного студента? 1 - да, 2 - нет "));
scanf("%d",&choice3); // очередной выбор
if (choice3 == 1)
|
|
{
end(mas,ff,sortrate,counter2); // добавляем в конец списка одного студента
read2(mas,ff,sortrate,counter2); // вывод на экран
}
};
choice3 = 3; // что бы не зависал на этапе выше
}
}
}
//--------------------------------------------------------------
printf(rus("Вы хотите сохранить файл? 1 - да, 2 - нет "));
scanf("%d", &choice5);
if (choice5 == 1)
{
save(mas,f,ff,fff,counter2);
printf(rus("Файл сохранен\n"));
}
else printf(rus("Файл не сохранен\n"));
printf(rus("Нажмите любую клавишу для выхода."));
getch();
return 0;
}
void add(student *mas, FILE *f, int &counter2)
{
f = fopen("f.txt", "wb"); // открываем файл для записи
if (f == NULL) exit(1);
for (int i = 0; i < 5; i++)
{ // записываем 5 студентов
printf("fio="); scanf("%s", &mas[i].fio);
printf("adress="); scanf("%s", &mas[i].adress);
printf("group="); scanf("%s", &mas[i].group);
printf("rate="); scanf("%f", &mas[i].rate);
fwrite(&mas[i], sizeof(student),1,f);
}
counter2 = 5;
fclose(f); // закрываем файл
}
void read(student *mas, FILE *f, int &counter2)
{
clrscr(); // очистка экрана
printf("------------READ_one---------------\n");
f = fopen("f.txt", "rb"); // открываем первый файл для чтения
if (f == NULL) exit(2);
int i = 0;
while(!feof(f)&& i<counter2)
{
// считываем студентов
fread(&mas[i], sizeof(student),1,f);
i++;
}
for (int j = 0; j < counter2; j++)
{
// выводим на экран
cout << j+1 << rus(" студент:") << endl;
cout <<"fio = " << setw(20) << mas[j].fio <<" adress = " << mas[j].adress << endl;
cout <<"group = " << setw(20)<<mas[j].group << " rate = " << mas[j].rate;
cout << endl << endl;
}
fclose(f); // закрыть поток
}
void kill(student *mas, FILE *f, FILE *ff, float sortrate, int &counter2)
{
int i = 0;
int counter = 0; // cчетчик людей.
f = fopen("f.txt", "rb");// открываем файл откуда будем считывать
if (f == NULL) exit(3);
while(!feof(f)&&(i<counter2))
{ // cчитываем всех студентов из файла f
fread(&mas[i], sizeof(student),1,f);
i++;
}
sortrate = sortrate - 0.001;
ff = fopen("ff.txt", "wb"); // открываем для редактирования файл ff
for (int j = 0; j < counter2; j++)
{
if (mas[j].rate > sortrate)
{
// записываем тех, кто попадает под хороший рейтинг
printf("fio= %s", mas[i].fio);
printf("adress= %s", mas[i].adress);
printf("group= %f", mas[i].group);
printf("rate= %f", mas[i].rate);
fwrite(&mas[j], sizeof(student),1,ff);
}
}
for (int j = 0; j < counter2; j++)
{ // проходим по всем студентам и сверяем с райтингом
if (mas[j].rate > sortrate)
{
// узнаем кол-во людей
// понадобится в дальнейшем для обработки файла
counter++;
}
}
counter2 = counter;
fclose(f);
fclose(ff);
}
void read2(student *mas, FILE *ff, float sortrate, int &counter2)
{
clrscr(); // очистка экрана
printf("--------------READ_two----------------\n");
ff = fopen("ff.txt", "rb"); // открываем файл для чтения
if (ff == NULL) exit(4);
int i = 0;
while(!feof(ff)&&(i<counter2))
{
// считываем наше кол-во студентов, которое осталось со второго файла
fread(&mas[i], sizeof(student),1,ff);
i++;
}
// выводим на экран
for (int j = 0; j < counter2; j++)
{
cout << j+1 << rus(" студент:") << endl;
cout <<"fio = " << setw(20) << mas[j].fio <<" adress = " << mas[j].adress << endl;
cout <<"group = " << setw(20)<<mas[j].group << " rate = " << mas[j].rate;
cout << endl << endl;
}
fclose(ff); // закрывем поток
}
void end(student *mas, FILE *ff, float sortrate, int &counter2)
{
printf("--------------END----------------\n");
ff = fopen("ff.txt", "ab"); // открываем второй файл для записи
if (ff == NULL) exit(5);
// запись в последний студент
printf("fio="); scanf("%s", &mas[counter2].fio);
printf("adress="); scanf("%s", &mas[counter2].adress);
printf("group="); scanf("%s", &mas[counter2].group);
printf("rate="); scanf("%f", &mas[counter2].rate);
fwrite(&mas[counter2], sizeof(student),1,ff);
counter2++; // увеличиваем кол-во людей в списке на 1
fclose(ff);
}
void save(student *mas, FILE *f, FILE *ff, FILE *fff, int& counter2)
{
int i = 0;
ff = fopen("ff.txt", "rb");// открываем файл откуда будем считывать
if (ff == NULL) exit(6);
while(!feof(ff)&&(i<counter2))
{ // cчитываем всех студентов из файла ff
fread(&mas[i], sizeof(student),1,ff);
i++;
}
f = fopen("f.txt", "wb"); // открываем для редактирования файл f
for (int j = 0; j < counter2; j++)
{
// записываем тех, кто попадает под хороший рейтинг
printf("fio= %s", mas[j].fio);
printf("adress= %s", mas[j].adress);
printf("group= %f", mas[j].group);
printf("rate= %f", mas[j].rate);
fwrite(&mas[j], sizeof(student),1,f);
}
clrscr(); // очистка экрана
printf(rus("Сохранение файла... подождите\n"));
for (int i = 0; i < 80; i++)
{
printf(rus("."));
Sleep(50);
}
printf("\n--------------SAVE----------------\n");
//counter2 = counter;
fff = fopen("fff.txt", "wb"); // открываем файл для записи
if (fff == NULL) exit(7);
fwrite(&counter2, 16 ,1,fff); // записываем кол-во студентов в файл
fclose(f);
fclose(ff);
fclose(fff); // закрываем файл
}
void load(student *mas, FILE *f, FILE *fff, int &counter2)
{
int i = 0;
fff = fopen("fff.txt", "rb"); // открываем файл для считывания
f = fopen("f.txt", "rb");// открываем файл откуда будем считывать
if (f == NULL) exit(8);
while(!feof(f)&&(i<10))
{ // cчитываем всех студентов из файла f
fread(&mas[i], sizeof(student),1,f);
i++;
}
if (fff == NULL) // если файл пустой, то подсчитываем всех студентов
// с адекватными оценками 1,2,3,4,5;
{
for (int j = 0; j < 10; j++)
{ // проходим по всем студентам и сверяем с райтингом
if ((mas[j].rate==1)||(mas[j].rate==2)||(mas[j].rate==3)||(mas[j].rate==4)||(mas[j].rate==5))
{
// узнаем кол-во людей
// понадобится в дальнейшем для обработки файла
counter2++;
}
}
}
else fread(&counter2, 16,1,fff); // если файл существует, то узнаем
// количество студентов
fclose(fff); // закрываем файл
fclose(f); // закрываем файл
}
char bufrus[256];
char* rus(const char* text)
{
CharToOem(text,bufrus);
return bufrus;
}
//---------------------------------------------------------------------------
Результат работы программы
Дата добавления: 2018-05-13; просмотров: 425; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!