47808 (608380), страница 3
Текст из файла (страница 3)
Додаток Б
Лістинг програми
-
Table.cpp
#include
#pragma hdrstop
#include "Table.h"
Table::Table()
{
list = new Record;
list->next = list->prev = list;
list->id = 0;
ID = 0;
}
Table::~Table()
{
Record *t,*q;
for(t=list->next;t!=list;t=q)
{
q = t->next;
delete t->data;
delete t;
}
delete list;
}
Table: Iterator Table: record()
{
Record *r = new Record;
ID++;
r->id = ID;
r->data = create();
r->next = list->next;
r->prev = list;
list->next->prev = r;
list->next = r;
return Iterator(r,this);
}
void Table::clear()
{
Record *t,*q;
for(t=list->next;t!=list;t=q)
{
q = t->next;
delete t->data;
delete t;
}
list->next = list->prev = list;
ID = 0;
}
void Table::save(FILE *f)
{
Fprintf (f,"%d\n", ID);
for(Record *t=list->next;t!=list;t=t->next)
{
fprintf(f,"%7d ",t->id);
t->data->save(f);
fprintf(f,"\n");
}
Fprintf (f,"END");
}
void Table::zvit(FILE *f)
{
fprintf(f,"Ціна Назва Виробник Вид Дата\n");
fprintf(f,"-----------------------------------------------\n");
for(Record *t=list->next;t!=list;t=t->next)
{
t->data->zvit(f);
}
}
void Table::load(FILE *f)
{
int id;
Record *t;
int rez = fscanf(f,"%d\n",&ID);
if((rez!=EOF)&&(rez!=0))
{
while(true)
{
t = new Record;
rez = fscanf(f,"%d",&t->id);
if((rez==EOF)||(rez==0))
{
delete t;
break;
}
t->data = create();
rez = t->data->load(f);
if((rez==EOF)||(rez==0))
{
delete t;
break;
}
t->next = list;
t->prev = list->prev;
list->prev->next = t;
list->prev = t;
}
}
}
void Table::Iterator::remove()
{
r->next->prev = r->prev;
r->prev->next = r->next;
delete r->data;
delete r;
}
void Table::Iterator::operator >>(Iterator &p)
{
if((t==p.t)&&(p.r!=r)&&(p.r!=r->next)&&(p.r!=t->list))
{
p.r->next->prev = p.r->prev;
p.r->prev->next = p.r->next;
p.r->next = r->next;
p.r->prev = r;
r->next->prev = p.r;
r->next = p.r;
}
}
void Table::Iterator::operator <<(Iterator &p)
{
if((t==p.t)&&(p.r!=r)&&(p.r!=r->prev)&&(p.r!=t->list))
{
p.r->next->prev = p.r->prev;
p.r->prev->next = p.r->next;
p.r->next = r;
p.r->prev = r->prev;
r->prev->next = p.r;
r->prev = p.r;
}
}
-
Table.h
#ifndef TableH
#define TableH
#include
#include
#include "Date.h"
#include "My_date.h"
class Table
{
public:
class Data
{
public: virtual ~Data(){}
virtual void save(FILE *f){}
virtual void zvit(FILE *f) {}
virtual int load(FILE *f){return 1;}
};
private:
struct Record
{
int id;
Data *data;
Record *next;
Record *prev;
} *list;
int ID;
public:
class Iterator;
friend class Iterator;
class Iterator
{
friend class Table;
Record *r;
Table *t;
protected:
Iterator(Record *R,Table *T):r(R),t(T){}
Data* data() {return r->data;}
Iterator the_next() {return Iterator(r->next,t);}
Iterator the_prev() {return Iterator(r->prev,t);}
public: Iterator(){}
int id(){return r->id;}// повертає номер запису в таблиці
void operator++() {r = r->next;}// переміщує ітератор на наступний запис
void operator--() {r = r->prev;}// переміщує ітератор на попередній запис
bool operator==(const Iterator &p){return r==p.r;}// порівнює з іншим ітератором
bool operator!=(const Iterator &p){return r!=p.r;}// порівнює з іншим ітератором
bool valid() {return r!=t->list;}// true - вказує на дійсний елемент;false - вказує на нульовий елемент
void operator>>(Iterator &p);// перемістити p після даного ітератора
void operator<<(Iterator &p);// перемістити p до даного ітератора
void remove();// видалити запис з таблиці
};
protected:
Iterator the_first() {return Iterator(list->next,this);}
Iterator the_last() {return Iterator(list->prev,this);}
Iterator record();
virtual Data* create(){return new Data;};
public: Table();
virtual ~Table();
void clear();// очистити таблицю
void save(FILE *f);// зберегти таблицю
void zvit(FILE *f);
void load(FILE *f);// завантажити таблицю
};
template class MyTable : public Table
{
public:
class Iterator : public Table::Iterator
{
friend class MyTable;
Iterator(const Table::Iterator &p):Table::Iterator(p){}
public: Iterator(){}
MyData& operator*() {return *(MyData*)data();}// доступ до полів MyData
MyData* operator->() {return (MyData*)data();}// доступ до полів MyData
Iterator next() {return Iterator(the_next());}// повертає ітератор на наступний елемент
Iterator prev() {return Iterator(the_prev());}// повертає ітератор на попередній елемент
};
protected:
virtual Data* create(){return new MyData;}
public: Iterator record() {return Iterator(Table::record());}// створює новий запис і повертає ітератор на нього
Iterator first() {return Iterator(the_first());}// повертає ітератор на перший запис в таблиці
Iterator last() {return Iterator(the_last());}// повертає ітератор на останній запис в таблиці
};
-
Number.cpp
#include
#pragma hdrstop
#include "Number.h"
void Number::save(FILE *f)
{char s[1000];
char s1[1000];
char s2[1000];
sprintf(s,"%s",str.c_str());
sprintf(s1,"%s",str1.c_str());
sprintf(s2,"%s",str2.c_str());
for(int i=0;s[i];i++) if(s[i]==' ') s[i]='_';
fprintf(f,"%d %s %s %s %d %d %d ",d,s,s1,s2,day,month,year);
}
void Number::zvit(FILE *f)
{
char s[1000];
char s1[1000];
char s2[1000];
sprintf(s,"%s",str.c_str());
sprintf(s1,"%s",str1.c_str());
sprintf(s2,"%s",str2.c_str());
fprintf(f,"%5d %10s %10s %10s %2d %2d %4d ",d,s,s1,s2,day,month,year);
fprintf(f,"\n");
}
int Number::load(FILE *f)
{ char s[1000];
char s1[1000];
char s2[1000];
int rez = fscanf(f,"%d %s %s %s %d %d %d",&d,s,s1,s2,&day,&month,&year);
if(rez==7)
{ for(int i=0;s[i];i++) if(s[i]=='_') s[i]=' ';
for(int i=0;s1[i];i++) if(s1[i]=='_') s1[i]=' ';
for(int i=0;s2[i];i++) if(s2[i]=='_') s2[i]=' ';
str = AnsiString(s);
str1 = AnsiString(s1);
str2 = AnsiString(s2);
}
return rez;
}
-
Number.h
#ifndef NumberH
#define NumberH
#include "Table.h"
#include "Date.h"
#include "My_date.h"
class Number : public Table::Data
{
public: int d;
int day; // число випуска
int year; // год випуска
int month; // месяц випуска
AnsiString str; // название мебели
AnsiString str1; // производитель
AnsiString str2; // вид мебели
void save(FILE *f);
void zvit(FILE *f);
int load(FILE *f);// 0 - помилка завантаження; EOF - кінець файла; >0 - завантаження успішне
};
5. Date.cpp
#include
#pragma hdrstop
#include "Date.h"
bool Date::load(int d,int m,int y)
{ if(y>=1900)
{ switch(m)
{
case 1:// січень 31 день
case 3:// березень 31 день
case 5:// травень 31 день
case 7:// липень 31 день
case 8:// серпень 31 день
case 10:// жовтень 31 день
case 12:// грудень 31 день
if((d31)) return false;
break;
case 2:// лютий 28-29 день
if(y%4)
{
if((d29)) return false;
}
else
{
if((d28)) return false;
}
break;
case 4:// квітень 30 день
case 6:// червень 30 день
case 9:// вересень 30 день
case 11:// листопад 30 день
if((d30)) return false;
break;
default: return false;
}
Day = d;
Month = m;
Year = y;
X = d + m*100 + year*10000;
Name = StrToInt(d)+"."+StrToInt(m)+"."+StrToInt(y);
}
else return false;
}
bool Date::load(const AnsiString &s)
{
int x = s.Pos(".");
if(x)
{
AnsiString str = s.SubString(1,x-1);
int d = StrToInt(str);
str = s.SubString(x+1,s.Lenth-x);
int y = str.Pos(".");
if(y)
{
str = s.SubString(x+1,y+x-1);
int m = StrToInt(str);
str = s.SubString(y+x+1,s.Lenth-x-y);
int y = StrToInt(str);
return load(d,m,y);
}
else return false;
}
else return false;
}
6. Date.h
#ifndef DateH
#define DateH
class Date
{ int Day;
int Month;
int Year;
long X;
AnsiString Name;
public: bool load(int d,int m,int y);
bool load(const AnsiString &s);
int day(){return Day;}
int month(){return Month;}
int year(){return Year;}
const char& str(){return Str.c_str();}
const Date& operator=(const Date &D){Day = D.Day; Month = D.Month; Year = D.Year;}
bool operator>(const Date &D){return X>D.X;}
bool operator>=(const Date &D){return X>=D.X;}
bool operator<(const Date &D){return X bool operator<=(const Date &D){return X<=D.X;} bool operator==(const Date &D){return X==D.X;} bool operator!=(const Date &D){return X==D.X;} }; 7. Main.cpp #include #pragma hdrstop #include "Main.h" #include "My_date.h" #include "Date.h" #pragma package(smart_init) #pragma resource "*.dfm" TMainForm *MainForm; __fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner) { } //------------------------------------------------------------------------void __fastcall TMainForm::Add(TObject *Sender) { Ptr p = list.record(); p->d = StrToInt(NewInt->Text); p->day = StrToInt(Day->Text); p->year = StrToInt(Year->Text); p->month = StrToInt(Month->Text); //p->x = StrToFloat(NewDouble->Text); p->str = String->Text; p->str1 = FirmaString->Text; p->str2 = WidString->Text; redraw(); } void TMainForm::redraw() { List->Clear(); StrList->Clear(); for(Ptr p = list.first();p.valid();++p) { List->Items->Add(IntToStr(p->d)); StrList->Items->Add(p->str); } } //------------------------------------------------------------------------void __fastcall TMainForm::Del(TObject *Sender) { int n = List->ItemIndex; int i; Ptr p; for(i=0,p=list.first();p.valid()&&(i if((i==n)&&p.valid()) { p.remove(); redraw(); } } //------------------------------------------------------------------------void __fastcall TMainForm::Find(TObject *Sender) { int x = StrToInt(NewInt->Text); Ptr p; int i; for(i=0,p=list.first();p.valid()&&(p->d!=x);++p,++i); if(p.valid()) { List->ItemIndex = i; StrList->ItemIndex = i; NewInt->Text = IntToStr(p->d); Day->Text = IntToStr(p->day); Year->Text = IntToStr(p->year); Month->Text = IntToStr(p->month); //NewDouble->Text = FloatToStr(p->x); String->Text = p->str; FirmaString->Text = p->str1; WidString->Text = p->str2; } else List->ItemIndex = -1; } //------------------------------------------------------------------------ void __fastcall TMainForm::Sort(TObject *Sender) { Ptr t,p,q; for(t=list.first().next();t.valid();t=q) { q = t.next(); for(p=t.prev();p.valid()&&(p->d>t->d);--p); p>>t; } redraw(); } //------------------------------------------------------------------------ void __fastcall TMainForm::Save(TObject *Sender) { FILE *f; if(SaveDialog->Execute()) { f = fopen(SaveDialog->FileName.c_str(),"w"); if(f!=NULL) { list.save(f); fclose(f); } } } //------------------------------------------------------------------------ void __fastcall TMainForm::ZvitClick(TObject *Sender) { FILE *f; if(SaveDialog->Execute())















