Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Отчет по лабораторной работе №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 не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |