Добавил:
Tushkan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторные работы / ЛЗ1 / Программа / 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)
Соседние файлы в папке Программа