bsuir.info
БГУИР: Дистанционное и заочное обучение
(файловый архив)
Вход (быстрый)
Регистрация
Категории каталога
Другое [157]
АВС [6]
КПиЯП [80]
ОАиП [305]
ОКТ [79]
СиСПО [8]
Форма входа
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Файловый архив
Файлы » ПОИТ » ОАиП

Лабараторная №2 по ОАиП ч.2 вар 8
Подробности о скачивании 27.01.2011, 23:54
2. Написать программу обработки файла данных, состоящих из структур, в которой реализованы следующие функции: с тандартная обработка файла (создание, просмотр, добавление); линейный поиск в файле; сортировка массива (файла) методами прямого выбора и QuickSort; двоичный поиск в отсортированном массиве.
Для книг, хранящихся в библиотеке, задаются: номер книги, автор, название, год издания, издательство и количество страниц. Вывести список книг с фамилиями авторов в алфавитном порядке, изданных после заданного года. Ключ: автор.
Оконный режим:
#include <vcl.h>
#include <stdio.h>
#include <io.h>
#pragma hdrstop

#include "z2.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;

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;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
OpenDialog1->Title="Открыть файл";
if (OpenDialog1->Execute()) {
File_Zap = OpenDialog1->FileName;
if ((Fz=fopen(File_Zap.c_str(),"rt"))==NULL) {
ShowMessage("Ошибка открытия ФАЙЛА!");
return;
}
}

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);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
Form2->Show();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Memo1->Clear();
AnsiString avtor, avtor1;
avtor = InputBox("Введите фамилию для поиска","","");

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

#include "Unit2.h"
#include "z2.cpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;

book bk;

//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm2::Button1Click(TObject *Sender)
{

Fz = fopen(File_Zap.c_str(),"at");
strcpy(bk.avtor, Edit1 -> Text.c_str());
bk.nomer=StrToInt(Edit2->Text);
bk.god=StrToInt(Edit3->Text);
strcpy(bk.izdatel, Edit4->Text.c_str());
bk.str=StrToInt(Edit5->Text);

fwrite(&bk, size, 1, Fz);

fclose(Fz);

Edit1->Text="";
Edit2->Text="";
Edit3->Text="";
Edit4->Text="";
Edit5->Text="";

Form2->Close();

}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormActivate(TObject *Sender)
{
OpenDialog1->Title="Открыть файл";
if (OpenDialog1->Execute()) {
File_Zap = OpenDialog1->FileName;
if ((Fz=fopen(File_Zap.c_str(),"rt"))==NULL) {
ShowMessage("Ошибка открытия ФАЙЛА!");
return;
}
}
}
//---------------------------------------------------------------------------
Результат работы программы:
Главное окно:

Создание файла:

Добавление данных в файл:

Загрузка данных из файла:

Линейный поиск:


Сортировка прямым выбором:

Быстрая сортировка:

Индивидуальное задание:

Консольный режим:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#include <io.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
struct book{
char avtor[10];
int nomer;
int god;
char izdatel[10];
int str;
};
int size = sizeof(book);
FILE *Fz;
char File_Zap[] = "1.txt";
book books;
book bk, *mas_Z;
void Out(book);
void QuickSort(int,int);

int main(int argc, char* argv[])
{
int kod, D_f, i=0, j, kol;
int m; book r;
char avtor[10];
int kodd = 0;
long len;


while(true) {
puts("\n Create - 1\n Add - 2\n View - 3\n lin_poisk - 4\n Sort - 5\n QuickSort - 6\n Ind_zad - 7\n EXIT - 0");
scanf("%d", &kod);
switch(kod) {
case 0: puts("\nPress any key ... ");
break;
case 1:
if ((Fz=fopen(File_Zap,"wb"))==NULL) {
puts("\n Create ERROR!");
//return;
}
fclose(Fz);
printf("\n Create New File %s !\n",File_Zap);
break;
case 2:
Fz = fopen(File_Zap,"ab");
printf("\n Avtor - ");
fflush(stdin);
gets(books.avtor);
printf(" Nomer - ");
scanf("%d", &books.nomer);
printf(" God - ");
scanf("%d", &books.god);
printf(" Izdatel - ");
fflush(stdin);
gets(books.izdatel);
printf(" Stranici - ");
scanf("%d", &books.str);

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);
}
}

Результат работы программы:
Создание нового файла:

Добавление записей:

Вывод на экран данных из файла:

Сортировка прямым выбором:

Быстрая сортировка:

Индивидуальное задание:

Категория: ОАиП | Добавил: schamile
Просмотров: 2395 | Загрузок: 25
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]