cin >> god;
}
void album::output()//ф-ція виводу
{
cout << endl<< setw(10) << setiosflags(ios::left) << nazv
<< setw(10) << setiosflags(ios::left) << god;
}
album1::album1():album() {}//конструктор
album1::~album1(){ album::~album(); }//деструктор
void album1::input()
{
album::input();
cout << "Vvedite kl-vo trekov v albome: ";
cin >> trek;
}
void album1::output()
{
album::output();
cout<< setw(10) << setiosflags(ios::left) << trek;
}
album2::album2():album1() {}
album2::~album2() { album1::~album1(); }
void album2::input()
{
album1::input();
cout << "Vvedite prodolzitelnost alboma po vremeni: ";
cin >> time;
}
void album2::output()
{
album1::output();
cout << setw(12) << setiosflags(ios::left) << time;
}
album3::album3():album2() {}
album3::~album3() { album2::~album2(); }
void album3::input()
{
album2::input();
cout << "Vvedite kolichestvo bonus trekov: ";
cin >> bonus;
}
void album3::output()
{
album2::output();
cout << setw(10) << setiosflags(ios::left) << bonus;
}
void caption()//заголовкова ф-ція
{
cout << endl << setw(10) << setiosflags(ios::left) << "|Nazv"
<< setw(10) << setiosflags(ios::left) << "|God"
<< setw(10) << setiosflags(ios::left) << "|Treki"
<< setw(10) << setiosflags(ios::left) << "|Vremya"
<< setw(10) << setiosflags(ios::left) << "|Bonus+"<< endl;
cout << "-------------------------------------------------------";
}
Trist::Trist(int type, int vvod)//Створення списку об'єктів
{
album1 *pr;
album2 *sp;
album3 *fl;
head = new Tool;
head->t = type;
if (head->t == 0)
{
pr = new album1;
if (vvod)
pr->input();
head->d=pr;
} else
if (head->t == 1)
{
sp = new album2;
if (vvod)
sp->input();
head->d=sp;
} else
if (head->t == 2)
{
fl = new album3;
if (vvod)
fl->input();
head->d=fl;
}
head->right=NULL;
head->left=NULL;
tail=head;
current=head;
}
Trist::~Trist()//Висвободження памяті
{
Tool *h;
h=head;
while (h!=0)
{ head=head->right;
head->left=NULL;
delete h;
h=head;
}
}
void Trist::add(int type, int vvod)//додавання нового об’єкта у список
{
Tool *q = new Tool;
album1 *pr;
album2 *sp;
album3 *fl;
q->t = type;
switch (q->t)
{
case 0:
pr = new album1;
if (vvod)
pr->input();
q->d=pr;
break;
case 1:
sp=new album2;
if (vvod)
sp->input();
q->d=sp;
break;
case 2:
fl=new album3;
if (vvod)
fl->input();
q->d=fl;
break;
}
if (current==tail)
{
q->right=NULL;
q->left=current;
current->right=q;
tail=q;
current=q;
} else
{ q->right=current->right;
current->right->left=q;
current->right=q;
q->left=current;
current=q;
}
}
//Головний файл
#include "RGZ_dsc.cpp"
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <fstream.h>
void sozdan(Trist *&a, int n);//створення
void output(Trist *&a);//вивід на екран
void output_file(Trist *&a, int n);//вивід до файлу
void input_file(Trist *&a);//читання з файлу
Tool* pois(Trist *&a, char* nazv);//ф-ція пошуку
Tool* zadacha(Trist *&a,int godL,int godR);//виконання задачі
void main()//Головна програма
{
int i,N=5,k;
Trist *a = NULL;
clrscr();
randomize();
while (1)
{
cout << "\n\n############################";
cout << "\n# 1 - Sozdanie bazi dannih #";
cout << "\n# 2 - Vivod na ekran #";
cout << "\n# 3 - Vivod v fail #";
cout << "\n# 4 - Chtenie iz faila #";
cout << "\n# 5 - Poisk #";
cout << "\n# 6 - Redaktirovanie zapisi #";
cout << "\n# 7 - Vstavka novoi zapisi #";
cout << "\n# 8 - Udalenie zapisi #";
cout << "\n# 9 - Vipolnrnie zadachi #";
cout << "\n# 10 - Vihod #";
cout << "\n\n############################";
cout << "\n Vvedite nomer operatsii:";
cin >> k;
switch (k)
{
case 1:
cout << "\n Sozdanie tablizi dannih";
cout << "\n Vvedite N: ";
cin >> N;
sozdan(a,N);
cout << "\n Tabliza dannih sozdana.";
getch();
break;
case 2:
cout << "\n Vivod na ekran ";
output(a);
cout << "\n Vivod na ekran zavershen.";
getch();
break;
case 3:
cout << "\n Vivod v fail a.dat ";
output_file(a,N);
cout << "\n Vivod v fail uspeshno zavershen.";
getch();
break;
case 4:
cout << "\n Chtenie iz faila a.dat ";
input_file(a);
cout << "\n Chtenie iz faila uspeshno zavershena.";
getch();
break;
case 5:
cout << "\n Poisk obyekta ";
cout << "\n Vvedite kluch dlya poiska(nazvanie alboma): ";
char *nazv;
cin >> nazv;
Tool *n;
// n=NULL;
n = pois(a,nazv);
if (n==NULL) cout << "\n Zapis ne naidena.";
else
{
cout << "\n Zapis bila naidena.";
caption();
n->d->output();
}
delete nazv;
getch();
break;
case 6:
cout << "\n Redaktirovanie zapisi ";
cout << "\n Vvedite nomer zapisi: ";
int c;
cin >> c;
a->current=a->head;
for (i=0;a->current!=NULL;i++)
{
if (i==c)
{
a->current->d->input();
break;
}
a->current=a->current->right;
}
cout << "\n Redaktirovanie uspeshno zaversheno.";
getch();
break;
case 7:
cout << "\n Vstavka novoi zapisi ";
cout << "\n Vvedite tip novoy zapisi [0..2]: ";
int p = 0;
cin >> p;
a->current=a->tail;
a->add(p,1);
cout << "\n Vstavka zapisi uspeshno zaversena.";
getch();
break;
case 8:
cout << "\n Udalenie zapisi ";
cout << "\n Vvedite nomer zapisi dlya udalenia: ";
int j = 0;
cin >> j;
a->current=a->head;
for (i=0;a->current!=NULL;i++)
{
if (i==j)
{
Tool *q = a->current;
if (q->left!=NULL) q->left->right = q->right;
if (q->right!=NULL) q->right->left = q->left;
if (q==a->head) a->head=q->right;
if (q==a->tail) a->tail=q->left;
delete q;
a->current = a->tail;
break;
}
a->current=a->current->right;
}
cout << "\n Zapis bila udalena.";
getch();
break;
case 9:
cout << "\n Poisk obyekta s minimalnim kl-vom trekov v zadannom diapazone let";
cout << "\n Vvedite leviy predel poiska(god): ";
int godL,godR;
cin >> godL;
cout << "\n Vvedite praviy predel poiska(god): ";
cin >> godR;
Tool *k;
k = zadacha(a,godL,godR);
if (n==NULL) cout << "\n Zapis ne naidena.";
else
{
cout << "\n Zapis bila naidena.";
caption();
k->d->output();
}
getch();
break;
case 10:
delete a;
exit(0);
break;
}
}
}
void sozdan(Trist *&a, int n)
{
if (a!=NULL)
delete a;
cout << "\nVvedite tip zapisi [0..2]: ";
int k;
cin >> k;
a = new Trist(k,1);
for (int i=1;i<n;i++)
{
cout << "\nVvedite tip zapisi [0..2]: ";
cin >> k;
a->add(k,1);
}
}
void output(Trist *&a)
{
caption();
a->current=a->head;
while (a->current!=NULL)
{
a->current->d->output();
a->current=a->current->right;
}
}
void output_file(Trist *&a, int n)
{
ofstream file("a.dat",ios::out|ios::binary);
if (!file)
{
cerr << "\nOshibka vivoda v fail!\n";
getch();
exit(1);
}
file.seekp(0);
file.write((char*)&(n),sizeof(n));
a->current=a->head;
while (a->current!=NULL)
{
file.write((char*)&(a->current->t),sizeof(a->current->t));
file.write(a->current->d->nazv,sizeof(a->current->d->nazv));
switch (a->current->t)
{
case 0:
album1 *obj1;
obj1=(album1*)a->current->d;
int trek = obj1->getTrek();
file.write((char*)&(trek),sizeof(trek));
break;
case 1:
album2 *obj2;
obj2=(album2*)a->current->d;
trek = obj2->getTrek();
int time = obj2->getTime();
file.write((char*)&(trek),sizeof(trek));
file.write((char*)&(time),sizeof(time));
break;
case 2:
album3 *obj3;
obj3=(album3*)a->current->d;
trek = obj3->getTrek();
time = obj3->getTime();
int bonus = obj3->getBonus();
file.write((char*)&(trek),sizeof(trek));
file.write((char*)&(time),sizeof(time));
file.write((char*)&(bonus),sizeof(bonus));
break;
}
a->current=a->current->right;
}
file.close();
}
void input_file(Trist *&a)
{
ifstream file("a.dat",ios::in);
if (!file)
{
cerr << "\nOshibka chtenia faila!\n";
getch();
exit(1);
}
int n;
file.read((char*)&(n),sizeof(n));
int i;
delete a;
for (i=0;i<n;i++)
{
int t;
file.read((char*)&(t),sizeof(t));
if (i==0) a=new Trist(t,0); else a->add(t,0);
file.read((char*)&(a->current->d->nazv),sizeof(a->current->d->nazv));
switch (t)
{
case 0:
album1 *obj1;
obj1=(album1*)a->current->d;
int trek = 0;
file.read((char*)&(trek),sizeof(trek));
obj1->setTrek(trek);
break;
case 1:
album2 *obj2;
obj2=(album2*)a->current->d;
trek = 0;
int time = 0;
file.read((char*)&(trek),sizeof(trek));
file.read((char*)&(time),sizeof(time));
obj2->setTrek(trek);
obj2->setTime(time);
break;
case 2:
album3 *obj3;
obj3=(album3*)a->current->d;
trek = 0;
time = 0;
int bonus = 0;
file.read((char*)&(trek),sizeof(trek));
file.read((char*)&(time),sizeof(time));
file.read((char*)&(bonus),sizeof(bonus));
obj3->setTrek(trek);
obj3->setTime(time);
obj3->setBonus(bonus);
break;
}
}
file.close();
}
Tool* pois(Trist *&a, char* nazv)
{
Tool *n = NULL;
a->current=a->head;
while (a->current!=NULL)
{
n = a->current;
if (strcmp(n->d->nazv,nazv)==0) break;
else n=NULL;
a->current=a->current->right;
}
return n;
}
Tool* zadacha(Trist *&a,int godL,int godR)
{
Tool *k = NULL;
a->current=a->head;
int max=1000;
while (a->current!=NULL)
{
k = a->current;
if(k->d->god>godL)
if(k->d->god<godR)
if(k->d->trek<min) break;
else k=NULL;
a->current=a->current->right;
}
return k;