Příklad 3
/*
Je dán seznam železničních stanic s těmito údaji:
- název stanice - maximálně 30 znaků
- číslo stanice ve tvaru XX-YYYYYY-ZZ, kde:
- XX - kód železnice
- YYYYYY - evidenční číslo
- ZZ - kód obvodu
Vytvořte třídu Stanice s těmito složkami:
- atribut Nazev - název stanice
- atribut Cislo - číslo stanice - definované jako bitové pole
- atribut PocKoleji - počet kolejí
- metoda Nacti - načte údaje stanice z klávesnice
- metoda Vypis - vypíše údaje stanice na obrazovku
- statická metoda MensiCislo(X, Y) - vrací true,
pokud číslo stanice X je menší než číslo stanice Y
- statická metoda MensiNazev(X, Y) - vrací true,
pokud název stanice X je menší než název stanice Y
- statická metoda MensiPocKoleji(X, Y) - vrací true,
pokud počet kolejí stanice X je menší než počet kolejí stanice Y
Vytvořte třídu PoleStanic s těmito složkami:
- atribut Pocet - počet stanic
- atribut Pole - dynamicky alokované pole stanic
- atribut KlicTrideni - druh údaje stanice, podle kterého
se pole stanic bude třídit resp. je utříděno
(číslo, název, počet kolejí)
- atribut Utrideno - je rovno true, pokud je pole utříděno
podle klíče KlicTrideni
- atribut MensiFce - ukazatel na jednu ze statických metod
třídy Stanice odpovídající klíči KlicTrideni
- konstruktor - inicializuje atributy třídy
- metoda Alokuj(X) - alokuje pole X stanic
- metoda Dealokuj - dealokuje pole stanic
- metoda Nacti - načte pole stanic z klávesnice
- metoda Vypis - vypíše pole stanic na obrazovku
- metoda Serad(X) - utřídí pole stanic vzestupně podle klíče X
- metoda NastavKlicTrideni(X) - uloží do atributu KlicTrideni
hodnotu X a změní ukazatel MensiFce podle klíče X
- metoda NajdiDleKlice(S, K) - hledá stanici S podle klíče třídění K.
Vrací index nalezené stanic v poli. Pokud taková stanice neexistuje,
vrací -1.
- metody NajdiCislo, NajdiNazev, NajdiPocKoleji - hledají stanici,
která má zadané číslo, název nebo počet kolejí pomocí metody
NajdiDleKlice
Funkce main provede tyto činnosti:
- načtení stanic z klávesnice
- výpis stanic na obrazovku
- utřídění stanic podle zadaného klíče
- výpis utříděného pole stanic na obrazovku
*/
Stdafx.h
#pragma once
#include <iostream>
using namespace std;
#pragma warning(disable:4996)
Stdafx.cpp
// stdafx.cpp : source file that includes just the standard includes
// Program03.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file
Stanice.h
#pragma once
class Stanice{
public:
static const int MaxNazev=31;
static const int MaxCislo=12;
union Cislo {
struct{
unsigned int KodObvodu:7;
unsigned int EvidCislo:20;
unsigned int KodZeleznice:7;
};
long long C;
void Nacti();
};
private:
char Nazev[MaxNazev];
Cislo Cis;
int PocKoleji;
public:
Stanice(){}
Stanice(Stanice::Cislo cislo,const char* nazev,int poc_koleji);
void Nacti();
void Vypis()const;
static bool MensiCislo(const Stanice &S1, const Stanice &S2)
{ return S1.Cis.C<S2.Cis.C;}
static bool MensiNazev(const Stanice &S1, const Stanice &S2)
{return strcmp(S1.Nazev,S2.Nazev)<0;}
static bool MensiPocKoleji(const Stanice &S1, const Stanice &S2)
{return S1.PocKoleji<S2.PocKoleji;}
};
void Vymena(Stanice& a, Stanice& b);
stanice.cpp
#include "stdafx.h"
#include "Stanice.h"
void Stanice::Nacti(){
cout << "Zadej nazev stanice: ";
cin >> Nazev;
Cis.Nacti();
cout << "Zadej pocet koleji: ";
cin >> PocKoleji;
}
void Stanice::Vypis()const
{
printf ("%02d-%06d-%02d",Cis.KodZeleznice,
Cis.EvidCislo,Cis.KodObvodu);
cout << " " << Nazev ;
int pom=static_cast<int> (strlen(Nazev));
for (int i=0; i<(MaxNazev-pom);i++)
cout << " ";
cout << PocKoleji <<"\n";
}
void Vymena(Stanice& a, Stanice& b){
Stanice pom;
pom=a;
a=b;
b=pom;
}
Stanice::Stanice(Stanice::Cislo cislo,const char* nazev,int poc_koleji){
Cis=cislo;
strcpy(Nazev,nazev);
PocKoleji=poc_koleji;
}
void Stanice::Cislo::Nacti()
{
unsigned int kz,ec,ko;
C=0;
cout << "Zadej cislo stanice ve tvaru XX-YYYYYY-ZZ: ";
scanf("%d-%d-%d",&kz,&ec,&ko);
EvidCislo=ec;
KodObvodu=ko;
KodZeleznice=kz;
}
PoleStanic.h
#pragma once
#include "Stanice.h"
enum KlicTrideniStanice{ktCislo,ktNazev,ktPocKoleji};
typedef bool (*MensiFceStanice)(const Stanice &S1, const Stanice &S2);
class PoleStanic{
int Pocet;
Stanice *Pole;
mutable KlicTrideniStanice KlicTrideni;
mutable bool Utrideno;
mutable MensiFceStanice MensiFce;
public:
PoleStanic();
~PoleStanic() { delete[] Pole;}
void Alokuj(int _Pocet);
void Dealokuj();
void Nacti();
void Vypis()const;
void Serad(KlicTrideniStanice kt);
int NajdiCislo(Stanice::Cislo cislo) const
{return NajdiDleKlice(Stanice(cislo,"",0),ktCislo);}
int NajdiNazev(const char* nazev) const
{return NajdiDleKlice(Stanice(Stanice::Cislo(),nazev,0),ktNazev);}
int NajdiPocKoleji(int poc_koleji) const
{return NajdiDleKlice(Stanice(Stanice::Cislo(),"",poc_koleji),ktNazev);}
private:
int NajdiDleKlice(const Stanice& S,KlicTrideniStanice kt) const;
void NastavKlicTrideni(KlicTrideniStanice kt) const ;
};
PoleStanic.cpp
#include "stdafx.h"
#include "PoleStanic.h"
void PoleStanic::Alokuj(int _Pocet)
{
Dealokuj();
Pole = new Stanice[_Pocet];
Pocet = _Pocet;
}
void PoleStanic::Dealokuj()
{
Utrideno=true;
delete[] Pole;
Pocet=0;
Pole=0;
}
void PoleStanic::Nacti()
{
int poc;
cout << "Zadej pocet stanic: ";
cin >> poc;
Alokuj(poc);
for (int i=0;i<Pocet;i++)
Pole[i].Nacti();
Utrideno=false;
}
void PoleStanic::Vypis() const
{
int i;
const char* TextCislo = "Cislo";
const char* TextNazev = "Nazev";
const char* TextPocKoleji= "Pocet koleji";
int PocMezer=Stanice::MaxCislo+1-
static_cast<int>(strlen(TextCislo));
int PocMezer2=Stanice::MaxNazev-
static_cast<int>(strlen(TextNazev));
int PocPoml=Stanice::MaxCislo+1+Stanice::MaxNazev+
static_cast<int>(strlen(TextPocKoleji));
cout<<TextCislo;
for(i=0;i<PocMezer;i++) cout<<" ";
cout<<TextNazev;
for (i=0;i<PocMezer2;i++)cout<<" ";
cout << TextPocKoleji<<"\n";
for(i=0;i<PocPoml;i++)cout<<"-";
cout<<"\n";
for(i=0;i<Pocet;i++)Pole[i].Vypis();
}
void PoleStanic::Serad(KlicTrideniStanice kt)
{
int index;
NastavKlicTrideni(kt);
if (Utrideno) return;
for(int i=0;i<Pocet-1;i++)
{
index=i;
for(int j=i+1;j<Pocet;j++) {
if (MensiFce(Pole[j],Pole[index])) index=j;
}
if (index!=i) Vymena(Pole[index],Pole[i]);
}
Utrideno=true;
}
void PoleStanic::NastavKlicTrideni(KlicTrideniStanice kt) const
{
if (kt!=KlicTrideni) {
KlicTrideni=kt;
switch (kt){
case ktCislo:
MensiFce=Stanice::MensiCislo;break;
case ktNazev:
MensiFce=Stanice::MensiNazev;break;
case ktPocKoleji:
MensiFce=Stanice::MensiPocKoleji;break;
}
Utrideno=false;
}
}
PoleStanic::PoleStanic(){
Pocet=0;
Pole=0;
Utrideno=true;
MensiFce=Stanice::MensiCislo;
KlicTrideni=ktCislo;
}
int PoleStanic::NajdiDleKlice(const Stanice& S,KlicTrideniStanice kt) const {
KlicTrideniStanice KlicPuv=KlicTrideni;
bool u=Utrideno;
int i;
NastavKlicTrideni(kt);
for(i=0;i<Pocet;i++){
if(!MensiFce(Pole[i],S) && !MensiFce(S,Pole[i])) break;
}
NastavKlicTrideni(KlicPuv);
Utrideno=u;
return i<Pocet ? i :-1;
}
Main…
#include "stdafx.h"
#include "PoleStanic.h"
int main()
{
int klic;
PoleStanic pole;
pole.Nacti();
cout << "\nNeutridene pole stanic\n";
pole.Vypis();
cout << "Zadej klic trideni (0-cislo, 1-nazev, 2-pocet koleji): ";
cin >> klic;
pole.Serad(static_cast <KlicTrideniStanice> (klic));
cout << "\nUtridene pole stanic\n";
pole.Vypis();
cout << "Zadej typ udaje pro hledani(0-cislo, 1-nazev, 2-pocet koleji): ";
cin >> klic;
int index;
switch (klic)
{
case 0: {
Stanice::Cislo c;
c.Nacti();
index=pole.NajdiCislo(c);
break;
}
case 1: {
cout << "Zadej nazev stanice: ";
char Nazev[Stanice::MaxNazev];
cin >> Nazev;
index=pole.NajdiNazev(Nazev);
break;
}
case 2: {
cout << "Zadej pocet koleji: ";
int poc_koleji;
cin >> poc_koleji;
index=pole.NajdiPocKoleji(poc_koleji);
break;
}
}
if (index = -1) cout << "Stanice neexistuje\n";
else cout << "Nalezena stanice s cislem " << index + 1 << "\n";
system ("pause");
return 0;
}