Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
16
Добавлен:
28.06.2014
Размер:
450.05 Кб
Скачать

Московский Энергетический Институт (Технический Университет)

Кафедра математического моделирования

Лабораторная работа №1

по ЯПиМТ

«Работа с файлами»

Выполнил: Козлачкова М.Ю.,

А-14-08

Проверил: Князев А.В.

2010г.

Задача

1. Разработать программу, обеспечивающую реализацию следующих функций:

- создание файла записей;

- чтение файла и вывод записей на экран;

- добавление записей в файл;

- модификация полей произвольной записи;

- вывод на экран записей, удовлетворяющих заданному условию, и подсчёт числа таких записей;

- удаление заданной записи;

2. Программа должна обеспечивать использование свободного пространства, образующегося при удалении записей. При этом должен использоваться следующий способ отметки свободных блоков (записей):

- массив отметок удаления.

3. Программа должна обеспечивать удобный для пользователя интерфейс (меню, окна и т.д.).

4. Структура записей и дополнительные условия приведены в следующей таблице:

Поле P1

Поле P2

Поле P3

Поле P4

Условие

Способ упор.

Наименование

автомобиля

Марка

автомобиля

Число мест

Расход

бензина

P3>4 &

P4<4.9

P2

Организация ввода/вывода в файле:

Запись и чтение структуры данных осуществляются в двоичном файле при помощи функций для работы с файлами: fopen, fclose, fseek, fread, fwrite и fflush. Если файл не существует, то для работы с ним используется функция fopen(FName, ”wb+”), если же файл уже существует, то fopen(FName, “rb+”), в том и другом случае возможно как чтение, так и вывод данных в файл, без необходимости заново его открывать.

Структура данных:

Структура данных, в которую помещается запись из файла, имеет вид класса:

Класс <Имя класса>

нач

лит: <Наименование автомобиля>

лит: <Марка автомобиля>

цел: <Число мест>

вещ: <Расход бензина>

цел: <Номер следующего элемента>

лог: <Удален элемент или нет>

кон

К классу прилагается комплект функций для работы с ним.

Для обеспечения масштабируемости одновременно в оперативной памяти хранится не более одной записи.

Организация добавления, редактирования и удаления записей:

При считывании из файла запись, если она не содержит отметку Удален, отображается в соответствующий элемент управления StringGrid.

При добавлении новой записи в таблицу, проверяется наличие ранее удалённых записей, если «пустое» место есть, то при помощи функции fseek осуществляется переход на удалённое место в файле, и оно заполняется, иначе запись добавляется в конец файла.

При редактировании записи, происходит её поиск в файле, затем указатель в файле помещается на заданную позицию и запись перезаписывается.

При удалении записи, вычисляется её номер и по заданному номеру в файле, запись удаляется. Для обозначения удалённой записи в файле, в техническое поле одной из записей (любой) заносится адрес удаленной записи. Если техническое поле какой-либо записи не содержит адреса удаленной, то оно имеет значение -1.

Организация поиска записей, удовлетворяющих заданному условию:

При поиске записей, удовлетворяющих заданному условию, просматривается весь файл, и элементы, которые удовлетворяют условию и не содержат отметку Удален, заносятся в соответствующий элемент управления StringGrid. Возможен вариант, когда условий окажется несколько, тогда в соответствие с этим, выборка организуется логическим «и».

Сортировка данных:

После каждой манипуляции с файлом осуществляется сортировка. Т.к. предполагается, что количество записей для данной задачи невелико, используется метод сортировки «пузырька», в котором среди соседних записей «всплывает» та, значение которой больше другой. Тем самым однонаправленный список сортируется по возрастанию. Ключом сортировки является поле «Марка автомобиля».

Тесты:

Добавление элемента:

Элемент добавлен:

Изменение элемента:

Элемент изменен:

Удаление элемента:

Элемент удален:

Жесткий поиск:

Поиск по полю:

Текст программы:

//------------------- Unit1.cpp--------------------------------------------------------

#include <vcl.h>

#include <stdio.h>

#include <dstring.h>

#pragma hdrstop

#include "Unit1.h"

#include "Unit2.h"

#include "Unit3.h"

#include "Unit4.h"

#include "Unit5.h"

#include "Unit6.h"

#include "Unit7.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

FILE *FN;

Auto Info,InfoOld;

int tmp = 0, fileclosed;

extern void PrintList(FILE *);

extern void DelInfo(FILE *,Auto);

extern int Search(FILE*);

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

//Надписи на столбцах

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

Form1->StrGr->Cells[0][0] = "Наименование автомобиля";

Form1->StrGr->Cells[1][0] = "Марка автомобиля";

Form1->StrGr->Cells[2][0] = "Число мест";

Form1->StrGr->Cells[3][0] = "Расход бензина";

}

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

//Создать новый, пустой файл

//-1 в начале говорит о том, что ссылка на первый элемент пуста

//0 говорит о том, что в файле 0 записей

void __fastcall TForm1::N2Click(TObject *Sender)

{

for (int i = 1; i <= Form1->StrGr->RowCount; i++)

{

Form1->StrGr->Cells[0][i] = "";

Form1->StrGr->Cells[1][i] = "";

Form1->StrGr->Cells[2][i] = "";

Form1->StrGr->Cells[3][i] = "";

}

char *s;

int i = -1;

if (OpDial->Execute())

{

s = strcat(OpDial->FileName.c_str(),".bin");

if ((FN = fopen(s,"w+b"))==NULL)

ShowMessage("Не удалось создать файл");

else

{

fseek(FN,0,0);

fwrite(&i, sizeof(int),1,FN);

i++;

fwrite(&i, sizeof(int),1,FN);

fileclosed = 1;

}

}

}

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

//Открытие файла

void __fastcall TForm1::N3Click(TObject *Sender)

{

for (int i = 1; i <= Form1->StrGr->RowCount; i++)

{

Form1->StrGr->Cells[0][i] = "";

Form1->StrGr->Cells[1][i] = "";

Form1->StrGr->Cells[2][i] = "";

Form1->StrGr->Cells[3][i] = "";

}

char *s;

if (OpDial->Execute())

{

if (fileclosed == 0)

fclose(FN);

s = (OpDial->FileName).c_str();

if ((FN = fopen(s,"r+b"))==NULL)

ShowMessage("Не удалось открыть файл");

else

{

PrintList(FN);

fileclosed = 1;

}

}

}

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

//Закрытие файла

void __fastcall TForm1::N4Click(TObject *Sender)

{

int i;

for (i = 1; i < 18; i++)

{

Form1->StrGr->Cells[0][i] = "";

Form1->StrGr->Cells[1][i] = "";

Form1->StrGr->Cells[2][i] = "";

Form1->StrGr->Cells[3][i] = "";

}

fileclosed = fclose(FN);

ShowMessage("Файл закрыт!");

}

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

//Поиск по условиям

void __fastcall TForm1::N6Click(TObject *Sender)

{

Form5->Show();

tmp = Search(FN);

Form5->Label2->Caption = "Всего найдено записей: "+IntToStr(tmp);

PrintList(FN);

}

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

//Поиск по условиям пользователя

void __fastcall TForm1::N7Click(TObject *Sender)

{

Form7->Show();

}

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

//Выход из программы

void __fastcall TForm1::N9Click(TObject *Sender)

{

if (fileclosed)

fclose(FN);

if (Application->MessageBox(

"Закрыть программу?","Выход", MB_YESNO+MB_ICONQUESTION)==IDYES)

Application->Terminate();

}

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

//Добавить элемент в файл

void __fastcall TForm1::N11Click(TObject *Sender)

{

if (fileclosed)

Form2->Show();

}

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

//Изменение записи списка

void __fastcall TForm1::N12Click(TObject *Sender)

{

tmp = Form1->StrGr->Row;

Form4->Show();

Form4->Edit1->Text = Form1->StrGr->Cells[0][tmp];

Form4->Edit2->Text = Form1->StrGr->Cells[1][tmp];

Form4->Edit3->Text = Form1->StrGr->Cells[2][tmp];

Form4->Edit4->Text = Form1->StrGr->Cells[3][tmp];

strcpy(InfoOld.Name, Form1->StrGr->Cells[0][tmp].c_str());

strcpy(InfoOld.Mark, Form1->StrGr->Cells[1][tmp].c_str());

InfoOld.SeatsNumb = StrToInt(Form1->StrGr->Cells[2][tmp]);

InfoOld.UseP = StrToFloat(Form1->StrGr->Cells[3][tmp]);

}

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

//Удаление выбранного элемента из списка

void __fastcall TForm1::N13Click(TObject *Sender)

{

if (Application->MessageBox(

"Хотите удалить эту информацию?","Удаление",

MB_YESNO+MB_ICONQUESTION)==IDYES)

{

tmp = Form1->StrGr->Row;

strcpy(Info.Name, Form1->StrGr->Cells[0][tmp].c_str());

strcpy(Info.Mark, Form1->StrGr->Cells[1][tmp].c_str());

DelInfo(FN,Info);

PrintList(FN);

}

}

//-------------------------- Unit1.h-------------------------------------------------

#ifndef Unit1H

#define Unit1H

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

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Grids.hpp>

#include <Menus.hpp>

#include <Dialogs.hpp>

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

class TForm1 : public TForm

{

__published: // IDE-managed Components

TMainMenu *MainMenu1;

TMenuItem *N1;

TMenuItem *N3;

TMenuItem *N4;

TMenuItem *N5;

TMenuItem *N6;

TMenuItem *N7;

TMenuItem *N8;

TMenuItem *N9;

TMenuItem *N10;

TMenuItem *N11;

TMenuItem *N12;

TMenuItem *N13;

TStringGrid *StrGr;

TOpenDialog *OpDial;

TMenuItem *N2;

void __fastcall N9Click(TObject *Sender);

void __fastcall N11Click(TObject *Sender);

void __fastcall N3Click(TObject *Sender);

void __fastcall N4Click(TObject *Sender);

void __fastcall N2Click(TObject *Sender);

void __fastcall N12Click(TObject *Sender);

void __fastcall N13Click(TObject *Sender);

void __fastcall N6Click(TObject *Sender);

void __fastcall N7Click(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

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

extern PACKAGE TForm1 *Form1;

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

#endif

//----------------Unit2.cpp-----------------------------------------------------------

//ДОБАВЛЕНИЕ ЭЛЕМЕНТА В ФАЙЛ

#include <vcl.h>

#include <stdio.h>

#include <dstring.h>

#pragma hdrstop

#include "Unit2.h"

#include "Unit1.h"

#include "Unit3.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm2 *Form2;

extern FILE *FN;

extern Auto Info;

extern void AddInfo(FILE *,Auto);

extern void PrintList(FILE *);

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

__fastcall TForm2::TForm2(TComponent* Owner)

: TForm(Owner)

{

}

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

//Очистить форму

void __fastcall TForm2::Button2Click(TObject *Sender)

{

Form2->Edit1->Text = "";

Form2->Edit2->Text = "";

Form2->Edit3->Text = "";

Form2->Edit4->Text = "";

}

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

//Принять добавление элемента

void __fastcall TForm2::Button1Click(TObject *Sender)

{

strcpy(Info.Name,Form2->Edit1->Text.c_str());

strcpy(Info.Mark,Form2->Edit2->Text.c_str());

Info.SeatsNumb = StrToInt(Form2->Edit3->Text);

Info.UseP = StrToFloat(Form2->Edit4->Text);

Info.NotDeleted = true;

Form2->Edit1->Text = "";

Form2->Edit2->Text = "";

Form2->Edit3->Text = "";

Form2->Edit4->Text = "";

AddInfo(FN,Info);

PrintList(FN);

Form2->Close();

}

//-------------------Unit2.h--------------------------------------------------------

#ifndef Unit2H

#define Unit2H

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

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

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

class TForm2 : public TForm

{

__published: // IDE-managed Components

TLabel *Label1;

TLabel *Label2;

TLabel *Label3;

TLabel *Label4;

TEdit *Edit1;

TEdit *Edit2;

TEdit *Edit3;

TEdit *Edit4;

TButton *Button1;

TButton *Button2;

void __fastcall Button2Click(TObject *Sender);

void __fastcall Button1Click(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm2(TComponent* Owner);

};

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

extern PACKAGE TForm2 *Form2;

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

#endif

//----------------Unit3.cpp-----------------------------------------------------------

//ОПИСАНИЕ КЛАССА Info

#include <vcl.h>

#include <stdio.h>

#include <string.h>

#pragma hdrstop

#include "Unit3.h"

#include "Unit1.h"

#include "Unit4.h"

#include "Unit5.h"

#include "Unit7.h"

#include "Unit6.h"

extern Auto Info;

extern FILE *FN;

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

//Преобразование char в AnsiString

AnsiString Trans(char S[])

{

int i;

AnsiString Str = "";

for (i = 0; i < strlen(S); i++)

Str.Insert(S[i],Str.Length()+1);

return Str;

}

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

//Считывание записи с номером n

Auto ReadElem(FILE *FN, int num)

{

Auto Tmp;

fseek(FN,(2*sizeof(int)+num*sizeof(Auto)),0);

fread(&Tmp,sizeof(Auto),1,FN);

return Tmp;

}

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

//Возвращение физического номера записи

int RetNum(FILE *FN, Auto Info)

{

int num = 0, flag = 1;

Auto InfoTmp;

fseek(FN,0,0);

fseek(FN,2*sizeof(int),0);

while (flag)

{

fread(&InfoTmp,sizeof(Auto),1,FN);

if ((strcmp(InfoTmp.Name,Info.Name)!=0)||(strcmp(InfoTmp.Mark,Info.Mark)!=0))

num++;

else

flag = 0;

}

return num;

}

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

//Поиск удаленного элемента в списке,

//возвращает номер (физический порядковый), если такой

//найден и кол-во записей, если такого нет.

int Poisk(FILE *FN)

{

int num = -1, flag = 1,quan; //номер свободного места, флаг и кол-во записей

Auto Info1;

fseek(FN,2*sizeof(int),0);

while ((!feof(FN))&&flag)

{

num++;

fread(&Info1,sizeof(Auto),1,FN);

if (!(Info1.NotDeleted))

flag = 0;

}

return num;

}

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

//Поиск предыдущего элемента в логическом порядке

//возвращает -1, если таких нет и номер

//такого элемента, если он найден

int FindPrev(FILE *FN1,Auto Info1)

{

int first, flag = 1, ptr;

Auto InfoTmp, InfoTmp1;

fseek(FN1,0,0);

fread(&first,sizeof(int),1,FN1);

InfoTmp = ReadElem(FN1,first);

if (strcmp(InfoTmp.Mark, Info1.Mark)>0)

return -1;

else

{

while (flag)

{

ptr = InfoTmp.Next;

if (ptr == -1)

return RetNum(FN1,InfoTmp);

else

{

InfoTmp1 = InfoTmp;

InfoTmp = ReadElem(FN1,ptr);

if (strcmp(InfoTmp.Mark, Info1.Mark)>=0)

flag = 0;

}

}

}

return RetNum(FN1,InfoTmp1);

}

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

//Функция сравнения на равенство двух записей,

//первая - полная запись из файла, вторая получена

//в результате заполнения пользователем окна поиска

bool CompInfo(Auto Info1, Auto Info2)

{

bool flag1,flag2,flag3,flag4;

if (strcmp(Info2.Name,"\0")==0)

flag1 = true;

else

flag1 = (strcmp(Info1.Name,Info2.Name)==0);

if (strcmp(Info2.Mark,"\0")==0)

flag2 = true;

else

flag2 = (strcmp(Info1.Mark,Info2.Mark)==0);

if (Info2.SeatsNumb == 0)

flag3 = true;

else

flag3 = (Info1.SeatsNumb == Info2.SeatsNumb);

if (Info2.UseP == 0)

flag4 = true;

else

flag4 = (Info1.UseP == Info2.UseP);

return (flag1&&flag2&&flag3&&flag4);

}

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

//Вывод списка на экран

void PrintList(FILE *FN1)

{

int ptr, num, i; //ссылка, кол-во записей в файле

bool flag = true;

Auto Info1;

fseek(FN,0,0);

fread(&ptr,sizeof(int),1,FN1);

fread(&num,sizeof(int),1,FN1);

if (num > 18)

Form1->StrGr->RowCount = num;

for (i = 1; i <= num; i++)

{

Form1->StrGr->Cells[0][i] = "";

Form1->StrGr->Cells[1][i] = "";

Form1->StrGr->Cells[2][i] = "";

Form1->StrGr->Cells[3][i] = "";

}

if (ptr != -1)

{

i = 1;

while ((i <= num)&&flag)

{

Info1 = ReadElem(FN,ptr);

ptr = Info1.Next;

flag = (Info1.NotDeleted&&(ptr != -1));

Form1->StrGr->Cells[0][i] = Trans(Info1.Name);

Form1->StrGr->Cells[1][i] = Trans(Info1.Mark);

Form1->StrGr->Cells[2][i] = IntToStr(Info1.SeatsNumb);

Form1->StrGr->Cells[3][i] = FloatToStr(Info1.UseP);

i++;

}

}

}

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

//Вывод записей, подходящих по условиям

int Search(FILE *FN1)

{

int ptr, num, i, res = 0; //ссылка, кол-во записей в файле

bool flag = true; int s=0;

Auto Info1;

fseek(FN,0,0);

fread(&ptr,sizeof(int),1,FN1);

fread(&num,sizeof(int),1,FN1);

for (i = 0; i < num; i++) //Считаем кол-во искомых записей

{

fread(&Info1,sizeof(Auto),1,FN);

if ((Info1.SeatsNumb > 4)&&(Info1.UseP < 4.9))

res++;

}

if (res > 18)

Form5->StrGr1->RowCount = res;

for (i = 1; i <= res; i++)

{

Form5->StrGr1->Cells[0][i] = "";

Form5->StrGr1->Cells[1][i] = "";

Form5->StrGr1->Cells[2][i] = "";

Form5->StrGr1->Cells[3][i] = "";

}

if (ptr != -1)

{

i = 1;

while ((i <= res)&&flag)

{

Info1 = ReadElem(FN,ptr);

ptr = Info1.Next;

flag = (ptr != -1);

if ((Info1.SeatsNumb > 4)&&(Info1.UseP < 4.9)&&(Info1.NotDeleted))

{

Form5->StrGr1->Cells[0][i] = Trans(Info1.Name);

Form5->StrGr1->Cells[1][i] = Trans(Info1.Mark);

Form5->StrGr1->Cells[2][i] = IntToStr(Info1.SeatsNumb);

Form5->StrGr1->Cells[3][i] = FloatToStr(Info1.UseP);

i++;

s++;

}

}

}

return s;

}

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

//Поиск по условиям пользователя

int UserSearch(FILE *FN1, Auto Info)

{

int ptr, num, i, res = 0; //ссылка, кол-во записей в файле

bool flag = true; int s=0;

Auto Info1;

fseek(FN,0,0);

fread(&ptr,sizeof(int),1,FN1);

fread(&num,sizeof(int),1,FN1);

for (i = 0; i < num; i++) //Считаем кол-во искомых записей

{

fread(&Info1,sizeof(Auto),1,FN);

if ((CompInfo(Info1,Info))&& (Info1.NotDeleted))

res++;

}

if (res > 18)

Form6->StrGr1->RowCount = res;

for (i = 1; i <= res; i++)

{

Form6->StrGr1->Cells[0][i] = "";

Form6->StrGr1->Cells[1][i] = "";

Form6->StrGr1->Cells[2][i] = "";

Form6->StrGr1->Cells[3][i] = "";

}

if (ptr != -1)

{

i = 1;

while ((i <= res)&&flag)

{

Info1 = ReadElem(FN,ptr);

ptr = Info1.Next;

flag = (ptr != -1);

if (CompInfo(Info1,Info)&&Info1.NotDeleted)

{

Form6->StrGr1->Cells[0][i] = Trans(Info1.Name);

Form6->StrGr1->Cells[1][i] = Trans(Info1.Mark);

Form6->StrGr1->Cells[2][i] = IntToStr(Info1.SeatsNumb);

Form6->StrGr1->Cells[3][i] = FloatToStr(Info1.UseP);

i++;

s++;

}

}

}

return s;

}

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

//Добавить элемент

void AddInfo(FILE *FN, Auto Info)

{

int ptr, num; //номер первого элемента, кол-во записей

int fr,prev,tmp; //номер удаленной ячейки, номер предыдущего элемента

Auto InfoTmp;

fseek(FN, 0, 0);

fread(&ptr, sizeof(int),1, FN);

if (ptr == -1) //Если файл пустой

{

fseek(FN, 0, 0); //Указатель в начало файла

ptr++; //Ссылку перевели на первый элемент

num = 1; //Кол-во записей = 1

fwrite(&ptr, sizeof(int),1,FN); //Записали ссылку

fwrite(&num, sizeof(int),1,FN); //Записали кол-во элементов

Info.Next = -1;

fwrite(&Info, sizeof(Auto),1,FN);

}

else

{

fread(&num,sizeof(int),1,FN);

fr = Poisk(FN); //Нашли свободное место для записи

prev = FindPrev(FN,Info);

if (prev != -1) //Есть элементы, меньшие по полю "марка автомобиля"

{

InfoTmp = ReadElem(FN,prev);

tmp = InfoTmp.Next;

InfoTmp.Next = fr;

Info.Next = tmp;

fseek(FN,(2*sizeof(int)+prev*sizeof(Auto)),0);

fwrite(&InfoTmp,sizeof(Auto),1,FN);

fseek(FN,(2*sizeof(int)+fr*sizeof(Auto)),0);

fwrite(&Info,sizeof(Auto),1,FN);

}

else

{

fseek(FN,0,0);

fread(&ptr,sizeof(int),1,FN);

Info.Next = ptr;

ptr = fr;

fseek(FN,0,0);

fwrite(&ptr,sizeof(int),1,FN);

fseek(FN,(2*sizeof(int)+fr*sizeof(Auto)),0);

fwrite(&Info,sizeof(Auto),1,FN);

}

fseek(FN,sizeof(int),0);

fread(&num,sizeof(int),1,FN);

num++;

fseek(FN,sizeof(int),0);

fwrite(&num,sizeof(int),1,FN);

}

}

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

//Удаление элемента из списка

void DelInfo(FILE *FN,Auto Info)

{

int first,prev,ptr,num;

Auto InfoTmp,Info1;

num = RetNum(FN,Info);

Info1 = ReadElem(FN,num);

fseek(FN,0,0);

fread(&first,sizeof(int),1,FN);

if (num == first) //Если удаляем первый в логическом списке элемент

{

Info1.NotDeleted = false;

fseek(FN,(2*sizeof(int)+num*sizeof(Auto)),0);

fwrite(&Info1,sizeof(Auto),1,FN);

first = Info1.Next;

fseek(FN,0,0);

fwrite(&first,sizeof(int),1,FN);

}

else

{

prev = FindPrev(FN,Info1);

InfoTmp = ReadElem(FN,prev); //Считали предыдущий элемент

ptr = Info1.Next;

Info1.NotDeleted = false;

fseek(FN,(2*sizeof(int)+num*sizeof(Auto)),0);

fwrite(&Info1,sizeof(Auto),1,FN);

InfoTmp.Next = ptr;

fseek(FN,(2*sizeof(int)+prev*sizeof(Auto)),0);

fwrite(&InfoTmp,sizeof(Auto),1,FN);

}

}

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

//Изменение полей записи

void ChangeInfo(FILE *FN, Auto InfoO, Auto InfoN)

{

int num,tmp,first; //физический номер элемента в файле

Auto InfoTmp,Info2;

num = RetNum(FN,InfoO);

Info2 = ReadElem(FN,num);

tmp = FindPrev(FN,Info2); //Нашли предыдущий элемент

InfoTmp = ReadElem(FN,tmp);

InfoTmp.Next = Info2.Next; //Перенаправили ссылку с предыдущего на следующий

fseek(FN,(2*sizeof(int)+tmp*sizeof(Auto)),0);

fwrite(&InfoTmp,sizeof(Auto),1,FN);

tmp = FindPrev(FN,InfoN);

InfoN.NotDeleted = true;

if (tmp == -1)

{

fseek(FN,0,0);

fread(&first,sizeof(int),1,FN);

fseek(FN,0,0);

fwrite(&num,sizeof(int),1,FN);

InfoN.Next = first;

}

else

{

InfoTmp = ReadElem(FN,tmp);

InfoN.Next = InfoTmp.Next;

InfoTmp.Next = num;

fseek(FN,(2*sizeof(int)+tmp*sizeof(Auto)),0);

fwrite(&InfoTmp,sizeof(Auto),1,FN);

}

fseek(FN,(2*sizeof(int)+num*sizeof(Auto)),0);

fwrite(&InfoN,sizeof(Auto),1,FN);

}

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

#pragma package(smart_init)

//-------------------Unit3.h--------------------------------------------------------

#ifndef Unit3H

#define Unit3H

struct Auto

{

char Name[20]; //Название автомобиля

char Mark[15]; //Модель автомобиля

int SeatsNumb; //Число мест

Extended UseP; //Расход бензина

int Next; //Номер следующего элемента

bool NotDeleted; //Удален элемент или нет

};

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

#endif

//-------------------Unit4.cpp--------------------------------------------------------

//ИЗМЕНЕНИЕ ПОЛЕЙ ЗАПИСИ

#include <vcl.h>

#include <stdio.h>

#include <dstring.h>

#pragma hdrstop

#include "Unit4.h"

#include "Unit1.h"

#include "Unit3.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm4 *Form4;

extern FILE *FN;

extern Auto Info;

extern Auto InfoOld;

extern int tmp;

extern AnsiString Trans(char []);

extern void PrintList(FILE *);

extern ChangeInfo(FILE *,Auto ,Auto);

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

__fastcall TForm4::TForm4(TComponent* Owner)

: TForm(Owner)

{

}

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

//Отменить изменение полей записи

void __fastcall TForm4::Button2Click(TObject *Sender)

{

Form4->Edit1->Text = Trans(InfoOld.Name);

Form4->Edit2->Text = Trans(InfoOld.Mark);

Form4->Edit3->Text = IntToStr(InfoOld.SeatsNumb);

Form4->Edit4->Text = FloatToStr(InfoOld.UseP);

}

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

//Изменить поля записи

void __fastcall TForm4::Button1Click(TObject *Sender)

{

Auto InfoNew;

if (Application->MessageBox(

"Хотите изменить эту информацию?","Изменение",

MB_YESNO+MB_ICONQUESTION)==IDYES)

{

strcpy(InfoNew.Name, Form4->Edit1->Text.c_str());

strcpy(InfoNew.Mark, Form4->Edit2->Text.c_str());

InfoNew.SeatsNumb = StrToInt(Form4->Edit3->Text);

InfoNew.UseP = StrToFloat(Form4->Edit4->Text);

ChangeInfo(FN,InfoOld,InfoNew);

Form4->Edit1->Text = "";

Form4->Edit2->Text = "";

Form4->Edit3->Text = "";

Form4->Edit4->Text = "";

Form4->Close();

PrintList(FN);

}

}

//----------------------Unit4.h-----------------------------------------------------

#ifndef Unit4H

#define Unit4H

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

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

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

class TForm4 : public TForm

{

__published: // IDE-managed Components

TEdit *Edit1;

TEdit *Edit2;

TEdit *Edit3;

TEdit *Edit4;

TLabel *Label1;

TLabel *Label2;

TButton *Button1;

TButton *Button2;

TLabel *Label3;

TLabel *Label4;

void __fastcall Button2Click(TObject *Sender);

void __fastcall Button1Click(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm4(TComponent* Owner);

};

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

extern PACKAGE TForm4 *Form4;

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

#endif

//----------------------Unit5.cpp-----------------------------------------------------

//Поиск машины с числом мест > 4 и расходом бензина < 4.9

#include <vcl.h>

#pragma hdrstop

#include "Unit5.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm5 *Form5;

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

__fastcall TForm5::TForm5(TComponent* Owner)

: TForm(Owner)

{

Form5->StrGr1->Cells[0][0] = "Наименование автомобиля";

Form5->StrGr1->Cells[1][0] = "Марка автомобиля";

Form5->StrGr1->Cells[2][0] = "Потребление бензина";

Form5->StrGr1->Cells[3][0] = "Максимальная скорость";

Form5->Label2->Caption = "";}

//----------------------Unit5.h-----------------------------------------------------

#ifndef Unit5H

#define Unit5H

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

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Grids.hpp>

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

class TForm5 : public TForm

{

__published: // IDE-managed Components

TStringGrid *StrGr1;

TLabel *Label1;

TLabel *Label2;

private: // User declarations

public: // User declarations

__fastcall TForm5(TComponent* Owner);

};

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

extern PACKAGE TForm5 *Form5;

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

#endif

//----------------------Unit6.cpp-----------------------------------------------------

//Поиск пользователя

#include <vcl.h>

#pragma hdrstop

#include "Unit6.h"

#include "Unit7.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm6 *Form6;

extern int Found;

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

__fastcall TForm6::TForm6(TComponent* Owner)

: TForm(Owner)

{

Form6->StrGr1->Cells[0][0] = "Наименование автомобиля";

Form6->StrGr1->Cells[1][0] = "Марка автомобиля";

Form6->StrGr1->Cells[2][0] = "Потребление бензина";

Form6->StrGr1->Cells[3][0] = "Максимальная скорость";

}

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

void __fastcall TForm6::Button1Click(TObject *Sender)

{

int i;

for (i = 1; i <= Found; i++)

{

Form6->StrGr1->Cells[0][i] = "";

Form6->StrGr1->Cells[1][i] = "";

Form6->StrGr1->Cells[2][i] = "";

Form6->StrGr1->Cells[3][i] = "";

}

Form6->Close();

Form7->Edit1->Text = "";

Form7->Edit2->Text = "";

Form7->Edit3->Text = "";

Form7->Edit4->Text = "";

}

//----------------------Unit6.h-----------------------------------------------------

#ifndef Unit6H

#define Unit6H

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

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Grids.hpp>

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

class TForm6 : public TForm

{

__published: // IDE-managed Components

TStringGrid *StrGr1;

TLabel *Label1;

TLabel *Label2;

TLabel *Label3;

TLabel *Label4;

TLabel *Label5;

TButton *Button1;

void __fastcall Button1Click(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm6(TComponent* Owner);

};

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

extern PACKAGE TForm6 *Form6;

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

#endif

//----------------------Unit7.cpp-----------------------------------------------------

#include <vcl.h>

#include <stdio.h>

#include <string.h>

#include <SysUtils.hpp>

#pragma hdrstop

#include "Unit7.h"

#include "Unit3.h"

#include "Unit6.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm7 *Form7;

int Found;

extern int UserSearch(FILE *, Auto);

extern AnsiString Trans(char []);

extern FILE *FN;

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

__fastcall TForm7::TForm7(TComponent* Owner)

: TForm(Owner)

{

Form7->Edit1->Text = "";

Form7->Edit2->Text = "";

Form7->Edit3->Text = "";

Form7->Edit4->Text = "";

}

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

void __fastcall TForm7::Button1Click(TObject *Sender)

{

Auto InfoTmp;

char Str[2] = "\0";

//Заполнение информационной части

if (CompareText(Form7->Edit1->Text,"")==0)

strcpy(InfoTmp.Name,Str);

else

strcpy(InfoTmp.Name,Form7->Edit1->Text.c_str());

if (CompareText(Form7->Edit2->Text,"")==0)

strcpy(InfoTmp.Mark,Str);

else

strcpy(InfoTmp.Mark,Form7->Edit2->Text.c_str());

if (CompareText(Form7->Edit3->Text,"")==0)

InfoTmp.SeatsNumb = 0;

else

InfoTmp.SeatsNumb = StrToInt(Form7->Edit3->Text);

if (CompareText(Form7->Edit4->Text,"")==0)

InfoTmp.UseP = 0;

else

InfoTmp.UseP = StrToFloat(Form7->Edit4->Text);

Form7->Close();

Соседние файлы в папке ЛЗ1