Program na rezerváciu dovolenkových pobytov pre ubytovacie zariadenia

Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
Kategória: Programy v C, C++

Program: Cestovka.cppCestovka.hRezerv.cppRezerv.hUbytuj.cppUbytuj.h
Súbor exe: Cestovka.exe
Potrebné: Define.hRezerv.datUbytovne.dat

Program na rezerváciu dovolenkových pobytov pre ubytovacie zariadenia. O dovolenkovom pobyte sú známe tieto udaje
  • jednoznačný identifikátor pobytu (celé číslo)
  • lokalita
  • typ ubytovania( chata, hotel, rodinný penzion)
  • počet miest
  • cena za lôžko/noc
  • rezervácia

Program umožnuje vyhľadávanie voľných pobytov v zadanej lokalite s počtom lôžok väčším alebo rovným ako zadané číslo a s cenou menšou alebo rovnou ako zadaná hodnota a rezerváciu pobytu a zrušenie rezervácie na vybraný pobyt. Na prezentáciu zoznamu pobytov je použitý spojkový zoznam a jednotlivé položky záznamov majú dynamickú veľkosť. Všetky záznamy sú uložené v súbore.

POZOR: Program si kladie za cieľ ukázať prácu so spojkovým zoznamom a súbormi. Nečakajte "vymakané" grafické rozhranie ani "myšoidné" ovládanie.
/* ========================================================================== */
/*                                                                            */
/*   Rezerv.cpp                       Copyright (c) TrSek alias Zdeno Sekerak */
/*   Datum:20.05.2005                                    http://www.trsek.com */
/*                                                                            */
/*   Description                                                              */
/*   Tato trieda sa stara o rezervaciu ubytovni. Umoznuje si vybrat ubytovne  */
/*   podla podmienok ako je cena a pocet volnych lozok. Vsetko si uklada do   */
/*   suboru rezerv.dat.                                                       */
/*   Vsetko je prezentovane v obojsmernom spojkovom zozname.                  */
/* ========================================================================== */
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
#include "define.h"
#include "rezerv.h"
 
 
// konstruktor
Rezerv::Rezerv()
{
  prvy  = NULL;
  zaz   = NULL;
  pocet = 0;
  akt   = 0;
  max_id = 0;
  find_id = -1;
 
  Load();
}
 
// destruktor
Rezerv::~Rezerv()
{
  Save();
  DeleteAll();
}
 
// ulozi zaznamy do suboru
void Rezerv::Save()
{
FILE *f;
int len;
 
   // zrusime podmienky
   Find(-1,0,"");
 
   f = fopen( REZV_FILE, "wb" );
   if( f==NULL )
       Chyba("Nemozem ulozit do suboru");
 
   // presun na zaciatok
   if( MoveFirst())
      // vsetko v poriadku ukladame data
      do {
         // ulozime staticke data
         fwrite( zaz, sizeof(Rezervacia)-4, 1, f );
 
         // a teraz dynamicke, ulozime velkost pola + hodnotu
         len = strlen( zaz->meno )+1;
         fwrite( &len, sizeof(len), 1, f );
         fwrite( zaz->meno, len, 1, f );
     }
     // ideme na dalsi
     while( MoveNext());
 
   // zavrieme
   fclose(f);
}
 
 
// ulozi zaznamy do suboru
void Rezerv::Load()
{
FILE *f;
int len;
 
   // mensie upratovanie
   DeleteAll();
 
   f = fopen( REZV_FILE, "rb" );
   // nieje subor tak nic
   if( f==NULL )
       return;
 
   // vsetko v poriadku ukladame data
   while( !feof(f))
   {
      // pridame
      AddNew();
 
      // precitame staticke data
      if( fread( zaz, sizeof(Rezervacia)-4, 1, f ))
      {      
         // dynamicke pole
         fread( &len, sizeof(len), 1, f );
         fread( pom, len, 1, f );
         Insert(1,pom);
 
         // ake je max_id
         if( zaz->id > max_id )
             max_id = zaz->id;
      }
      else
         Delete();
   }
 
   // zavrieme
   fclose(f);
   MoveFirst();
}
 
 
// ulozi premennu
void Rezerv::Insert(char id, char* meno)
{
  // pozor je alokovanie miesto
  if( zaz==NULL )
      AddNew();
 
  // meno lokality
  if( id==1 )
  {
    zaz->dlzm = strlen(meno)+1;
    zaz->meno = (char*) malloc( zaz->dlzm );
    strcpy( zaz->meno, meno );
  }
 
  // pocet rezervovanych
  if( id==2 ) zaz->id_ubyt = atoi(meno);
  // pocet rezervovanych
  if( id==3 ) zaz->rezerv  = atoi(meno);
}
 
 
// konvertuje int do string
char* Rezerv::ToStr(int poc)
{
   sprintf(pom, "%d", poc);
   return pom;
}
 
 
// vrati ako retazec
char* Rezerv::Get(char id)
{
  // pozor je alokovanie miesto
  if( zaz==NULL )
      return "";
 
  // podla id
  if( id==0 ) return ToStr( zaz->id );
  if( id==1 ) return zaz->meno;
  if( id==2 ) return ToStr( zaz->id_ubyt );
  if( id==3 ) return ToStr( zaz->rezerv );
  return "";
}
 
 
// vrati iba ak je integer
int Rezerv::GetInt(char id)
{
  // pozor je alokovanie miesto
  if( zaz==NULL )
      return 0;
 
  // podla id
  if( id==0 ) return zaz->id;
  if( id==2 ) return zaz->id_ubyt;
  if( id==3 ) return zaz->rezerv;
  return 0;
}
 
 
// vrati pocet id
int Rezerv::GetPocetId()
{
  return 4;
}
 
 
// vrati meno id
char* Rezerv::GetName(char id)
{
  // podla id
  if( id==0 ) return "Id zaznamu";
  if( id==1 ) return "Meno objednavatela";
  if( id==2 ) return "Id ubytovne";
  if( id==3 ) return "Pocet rezervovanych miest";
  return "";
}
 
 
// prejdi na prvy zaznam
int  Rezerv::MoveFirst(void)
{
   zaz = prvy;
   akt = 1;
 
   // najdeme prvy co vyhovuje podmienke
   while( !IsCondition() && ( zaz!=NULL ))
   {
     zaz = zaz->zani;
     akt++;
   }
 
   // najdene???
   return (zaz==NULL)?false:true;
}
 
 
// posun na dalsi zaznam
int  Rezerv::MoveNext(void)
{
Rezervacia* old = zaz;
int old_akt = akt;
 
   if( zaz!=NULL )
   {
     zaz = zaz->zani;
     akt++;
   }
 
   // najdeme dalsi co vyhovuje podmienke
   while( !IsCondition() && ( zaz!=NULL ))
   {
     zaz = zaz->zani;
     akt++;
   }
 
   // uz dalsi nieje, vratme stary
   if( !IsCondition())
   {
       zaz = old;
       akt = old_akt;
       return false;
   }
 
   // najdene???
   return (zaz==NULL)?false:true;
}
 
 
// posun na predosli zaznam
int  Rezerv::MovePrev(void)
{
Rezervacia* old = zaz;
int old_akt = akt;
 
   if( zaz!=NULL )
   {
     zaz = zaz->pred;
     akt--;
   }
 
   // najdeme dalsi co vyhovuje podmienke
   while( !IsCondition() && ( zaz!=NULL ))
   {
     zaz = zaz->pred;
     akt--;
   }
 
   // uz dalsi nieje, vratme stary
   if( !IsCondition())
   {
       zaz = old;
       akt = old_akt;
       return false;
   }
 
   // najdene???
   return (zaz==NULL)?false:true;
}
 
 
// posun nakoniec
int  Rezerv::MoveLast(void)
{
Rezervacia* old = zaz;
int old_akt = akt;
 
   // najdeme dalsi co vyhovuje podmienke
   while( IsCondition() && ( zaz->zani!=NULL ))
   {
     old = zaz;
     old_akt = akt;
     zaz = zaz->zani;
     akt++;
   }
 
   // uz dalsi nieje, vratme posledny najdeny
   if( !IsCondition())
   {
       zaz = old;
       akt = old_akt;
       return false;
   }
 
   // najdene???
   return (zaz==NULL)?false:true;
}
 
 
// rezervuje neake miesta
int Rezerv::Rezervuj(int poc, int id_ubyt)
{
   // a ako ???
   if( zaz == NULL )
       return 0;
 
  // je mozne rezervovat/odrezervovat
  zaz->rezerv  = poc;
  zaz->id_ubyt = id_ubyt;
  return poc;
}
 
 
//
void Rezerv::AddNew(void)
{
  Rezervacia* novy;
 
  // vytvorim nove miesto
  novy = (Rezervacia*) malloc(sizeof(Rezervacia));
 
  // smola uz asi niet pamate
  if( novy== NULL )
      Chyba("Malo pamete");
 
  // prepojim smerniky
  if( zaz!=NULL )
  {
      novy->zani = zaz->zani;
       zaz->zani = novy;
      novy->pred = zaz;
      novy->id = ++max_id;
 
      if( novy->zani != NULL )
          (novy->zani)->pred = novy;
  }
  else
  {
      prvy = novy;
      prvy->pred = NULL;
      prvy->zani = NULL;
      novy->id   = 1;
  }
 
  pocet++; akt++;
  zaz = novy;
 
  zaz->dlzm = 0;
  zaz->meno = NULL;
  zaz->id_ubyt = 0;
  zaz->rezerv  = 0;
}
 
 
// zmazeme zaznam
void Rezerv::Delete(void)
{
  Rezervacia* pred = NULL;
  Rezervacia* zani = NULL;
 
  // uz niet co
  if( zaz == NULL )
      return;
 
  // opravime smernik pred
  if( zaz->zani != NULL )
  {
    zani = zaz->zani;
    zani->pred = zaz->pred;
  }
 
  // opravime smernik za
  if( zaz->pred != NULL )
  {
    pred = zaz->pred;
    pred->zani = zaz->zani;
  }
 
  // zmazeme alokovane pamete
  if( zaz->meno )
      free( zaz->meno );
 
  // je to zaroven prvy ???
  if( zaz == prvy )
      prvy = zaz->zani;
 
  pocet--;
  free( zaz );
 
  // nastavime neaky smernik
  zaz = NULL;
  if( pred != NULL ) { zaz = pred; akt--; }
  if( zani != NULL ) zaz = zani;
}
 
 
// zobrazi aktualny zaznam
void Rezerv::Show(void)
{
  printf("\n");
  printf("--------------------------------------\n");
  printf("                  ID: %s\n", Get(0));
  printf("   Meno a priezvisko: %s\n", Get(1));
  printf("         id ubytovne: %s\n", Get(2));
  printf(" pocet rezervovanych: %s\n", Get(3));
  printf("--------------------------------------\n");
  printf("\n");
}
 
 
// vypise na ktorom zazname som a kolko ich je
void Rezerv::Bar(void)
{
  printf("Rezervacie aktualna/celkovo: %d/%d.\n", GetPocet(), GetPocet());
 
  // ak je podmienka
  if( find_id>-1 )
      printf("Podmienka: %s %s %s\n", GetName(find_id), GetSign(find_sign), find_meno );
}
 
 
// najdi zaznam podla id a sign
void Rezerv::Find(char id, char sign, char* meno)
{
  find_id = id;
  find_sign = sign;
  strcpy( find_meno, meno );
  MoveFirst();
}
 
 
// vyhovuje podmienke
int Rezerv::IsCondition()
{
  // otazka na nic dava false
  if( zaz == NULL )
      return false;
 
  // urcite lebo ziadna nieje
  if( find_id==-1 )
      return true;
 
  //  
  switch( find_id )
  {
     case 0:  return Compare( zaz->id, atof(find_meno), find_sign )? true:false;
     case 1:  return CompareS( zaz->meno, find_meno, find_sign )? true:false;
     case 2:  return Compare( zaz->id_ubyt, atof(find_meno), find_sign )? true:false;
     case 3:  return Compare( zaz->rezerv, atof(find_meno), find_sign )? true:false;
  }
 
  // niekde nieco zlyhalo
  return false;
}
 
 
// vycisti pamet
void Rezerv::DeleteAll(void)
{
  Rezervacia* pom = NULL;
  zaz = prvy;
 
  while( zaz!=NULL )
  {
    if( zaz!=NULL )
	      pom = prvy->zani;
    else
	      pom = NULL;
 
    Delete();
    zaz = pom;
  }
 
  // kde nic nieje ani smernik nebude
  prvy = zaz = NULL;
  pocet = akt = 0;
}
 
 
// vrati znamienko
char* Rezerv::GetSign(char id)
{
  switch(id)
  {
    case 1: return "=";
    case 2: return "<";
    case 3: return "<=";
    case 4: return ">";
    case 5: return "=>";
    case 6: return "!=";
  }
 
 return "";
}
 
 
// compare string
int Rezerv::CompareS(char* prvy, char* druhy, char sign)
{
int porov;
 
  porov = strcmp( prvy, druhy );
 
  if(( sign==1 ) && ( porov==0 )) return true;    // =
  if(( sign==2 ) && ( porov< 0 )) return true;    // <
  if(( sign==3 ) && ( porov<=0 )) return true;    // <=
  if(( sign==4 ) && ( porov> 0 )) return true;    // >
  if(( sign==5 ) && ( porov>=0 )) return true;    // =>
  if(( sign==6 ) && ( porov!=0 )) return true;    // !=
 
  // nic
  return false;
}
 
 
// compare integer
int Rezerv::Compare(float prvy, float druhy, char sign)
{
  if(( sign==1 ) && ( prvy==druhy )) return true;   // =
  if(( sign==2 ) && ( prvy< druhy )) return true;   // <
  if(( sign==3 ) && ( prvy<=druhy )) return true;   // <=
  if(( sign==4 ) && ( prvy >druhy )) return true;   // >
  if(( sign==5 ) && ( prvy>=druhy )) return true;   // =>
  if(( sign==6 ) && ( prvy!=druhy )) return true;   // !=
 
  // nic
  return false;
}
 
 
// vypise chybu a skonci
// ide o osetrenie chyb ktore uz program nedokaze rozchodit
void Rezerv::Chyba(char* text)
{
  printf("%s", text);
  exit(1);
}