Лабораторные работы / ЛЗ1 / ЛЗ1
.docМосковский Энергетический Институт (Технический Университет)
Кафедра математического моделирования
Лабораторная работа №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();