Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Отчет по лабораторной работе №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-29; просмотров: 182.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...