Скачиваний:
17
Добавлен:
28.06.2014
Размер:
10.88 Кб
Скачать
//---------------------------------------------------------------------------
//ОПИСАНИЕ КЛАССА 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)
Соседние файлы в папке Программа
  • #
    28.06.201443.36 Кб16Unit2.obj
  • #
    28.06.20141.58 Кб16Unit2.~cpp
  • #
    28.06.201451 б16Unit2.~ddp
  • #
    28.06.20143.73 Кб16Unit2.~dfm
  • #
    28.06.20141.11 Кб16Unit2.~h
  • #
    28.06.201410.88 Кб17Unit3.cpp
  • #
    28.06.2014472 б16Unit3.h
  • #
    28.06.201485.92 Кб16Unit3.obj
  • #
    28.06.201410.88 Кб16Unit3.~cpp
  • #
    28.06.2014475 б16Unit3.~h
  • #
    28.06.20141.91 Кб16Unit4.cpp