2. Написать программу обработки файла данных, состоящих из структур, в которой реализованы следующие функции: с тандартная обработка файла (создание, просмотр, добавление); линейный поиск в файле; сортировка массива (файла) методами прямого выбора и QuickSort; двоичный поиск в отсортированном массиве. Для книг, хранящихся в библиотеке, задаются: номер книги, автор, название, год издания, издательство и количество страниц. Вывести список книг с фамилиями авторов в алфавитном порядке, изданных после заданного года. Ключ: автор. Оконный режим: #include <vcl.h> #include <stdio.h> #include <io.h> #pragma hdrstop
struct book{ char avtor[10]; int nomer; int god; char izdatel[10]; int str; }; int size = sizeof(book); FILE* Fz; AnsiString File_Zap; book *books; void Out(book, TMemo*); void QuickSort(int,int); int kol;
Fz = fopen(File_Zap.c_str(),"rt"); int D_f = fileno(Fz); // Находим дескриптор файла int len = filelength(D_f); // Находим размер файла int i, j; kol = len/size; //Количество записей в файле books = new book[kol];
// Считываем записи из файла в динамический массив for (i=0; i < kol; i++) fread((books+i), size, 1, Fz); fclose(Fz);
for (i=0; i < kol; i++) Out(books[i], Memo1);
} //--------------------------------------------------------------------------- void Out(book z, TMemo *Memo1) { Memo1->Lines->Add("Автор "+AnsiString(z.avtor)); Memo1->Lines->Add("Номер книги "+AnsiString(z.nomer)); Memo1->Lines->Add("Год издания "+AnsiString(z.god)); Memo1->Lines->Add("Издательство "+AnsiString(z.izdatel)); Memo1->Lines->Add("Страницы "+AnsiString(z.str)); Memo1->Lines->Add("------------"); } void __fastcall TForm1::Button2Click(TObject *Sender) { OpenDialog1->Title="Создать новый файл"; if (OpenDialog1->Execute()){ File_Zap = OpenDialog1->FileName; if ((Fz=fopen(File_Zap.c_str(),"wt"))==NULL) { ShowMessage("Ошибка создания ФАЙЛА!"); return; } } Memo1->Lines->Add("Создали новый файл: "+AnsiString(File_Zap)); fclose(Fz); } //---------------------------------------------------------------------------
int i, kod = 0; for (i = 0; i < kol; i++){ avtor1 = books[i].avtor; if ( avtor1 == avtor) { kod = 1; Out(books[i],Memo1); } } if(kod == 0) // Вывод сообщения, что элемент не найден Memo1->Lines->Add("Такой книги нет."); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button5Click(TObject *Sender) { Memo1->Clear(); int i, j, m; book r;
for (i = 0; i < kol-1; i++) { m = i; for (j = i+1; j < kol; j++) if (books[j].avtor[0] < books[m].avtor[0]) m = j; r = books[m]; // Переставляем элементы books[m] = books[i]; books[i] = r; } for (i=0; i < kol; i++) Out(books[i], Memo1); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button6Click(TObject *Sender) { QuickSort(0,kol);
Memo1->Clear();
for (int i=0; i < kol; i++) Out(books[i], Memo1); } //--------------------------------------------------------------------------- void QuickSort(int L,int R) { int i, j, m; char x; book r;
i = L; j = R; x = books[(L + R)/2].avtor[0]; while (i < j) { while (books[i].avtor[0] < x) i++; while (books[j].avtor[0] > x) j--; if (i <= j) { r = books[i]; // Переставляем элементы books[i] = books[j]; books[j] = r; // i++; j--; } m = j; QuickSort(L,m); QuickSort(m+1,R); } } void __fastcall TForm1::Button7Click(TObject *Sender) { QuickSort(0,kol);
Memo1->Clear(); int god1; god1 = StrToInt(InputBox("Введите год","",""));
for (int i=0; i < kol; i++) if(books[i].god > god1) Out(books[i], Memo1); } //--------------------------------------------------------------------------- Вспомогательное окно: #include <vcl.h> #pragma hdrstop
fwrite(&books, size, 1, Fz); fclose(Fz); break; case 3: if ((Fz=fopen(File_Zap,"rb"))==NULL) { puts("\n Open ERROR!"); //return; } Fz = fopen(File_Zap,"rb"); D_f = fileno(Fz); len = filelength(D_f); kol = len/size; mas_Z = new book[kol]; // Считываем записи из файла в динамический массив for (i=0; i < kol; i++) { fread((mas_Z+i), size, 1, Fz); Out(mas_Z[i]); } break; case 4:
printf("\n Avtor_poisk - "); scanf("%s",avtor);
for (i = 0; i < kol; i++){ if ( mas_Z[i].avtor == avtor) { kodd = 1; Out(mas_Z[i]); } } if(kodd == 0) // Вывод сообщения, что элемент не найден printf("\n Net takogo avtora."); break; case 5: for (i = 0; i < kol-1; i++) { m = i; for (j = i+1; j < kol; j++) if (mas_Z[j].avtor[0] < mas_Z[m].avtor[0]) m = j; r = mas_Z[m]; // Переставляем элементы mas_Z[m] = mas_Z[i]; mas_Z[i] = r; } for (i=0; i < kol; i++) Out(mas_Z[i]); break; case 6: QuickSort(0,kol); for (int i=0; i < kol; i++) Out(mas_Z[i]); break; case 7: QuickSort(0,kol); int god1; printf("\n God_vivod - "); scanf("%d",&god1); for (int i=0; i < kol; i++) if(mas_Z[i].god > god1) Out(mas_Z[i]);
break;
return 0; } } } //--------------------------------------------------------------------------- void Out(book z) { printf("\n %20s , %6.3d, %6.3d, %20s, %6.3d .",z.avtor, z.nomer, z.god, z.izdatel, z.str); } void QuickSort(int L,int R) { int i, j, m; char x; book r;
i = L; j = R; x = mas_Z[(L + R)/2].avtor[0]; while (i < j) { while (mas_Z[i].avtor[0] < x) i++; while (mas_Z[j].avtor[0] > x) j--; if (i <= j) { r = mas_Z[i]; // Переставляем элементы mas_Z[i] = mas_Z[j]; mas_Z[j] = r; // i++; j--; } m = j; QuickSort(L,m); QuickSort(m+1,R); } }
Результат работы программы: Создание нового файла: