Příklad 2
/*
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
- metoda Nacti - načte údaje stanice z klávesnice
- metoda Vypis - vypíše údaje stanice na obrazovku
- metoda Mensi(X) - vrací true, pokud číslo stanice "this" je menší
než číslo stanice X
Vytvořte třídu PoleStanic s těmito složkami:
- atribut Pocet - počet stanic
- atribut Pole - dynamicky alokované pole stanic
- 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 - utřídí pole stanic podle čísla vzestupně
Funkce main provede tyto činnosti:
- načtení stanic z klávesnice
- výpis stanic na obrazovku
- utřídění stanic podle čísla
- 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
struct CisloStanice{
unsigned int KodObvodu:7;
unsigned int EvidCislo:20;
unsigned int KodZeleznice:7;
};
union CelkoveCS{
CisloStanice CS;
long long C;
};
class Stanice{
public:
static const int MaxNazev=31;
static const int MaxCislo=12;
private:
char Nazev[MaxNazev];
CelkoveCS Cislo;
public:
void Nacti();
void Vypis()const;
bool Mensi(const Stanice &S) const{ return Cislo.C<S.Cislo.C;}
};
void Vymena(Stanice& a, Stanice& b);
stanice.cpp
#include "stdafx.h"
#include "Stanice.h"
void Stanice::Nacti(){
unsigned int kz,ec,ko;
cout << "Zadej nazev stanice: ";
cin >> Nazev;
Cislo.C=0;
cout << "Zadej cislo stanice ve tvaru XX-YYYYYY-ZZ: ";
scanf("%d-%d-%d",&kz,&ec,&ko);
Cislo.CS.EvidCislo=ec;
Cislo.CS.KodObvodu=ko;
Cislo.CS.KodZeleznice=kz;
}
void Stanice::Vypis()const
{
printf ("%02d-%06d-%02d",Cislo.CS.KodZeleznice,
Cislo.CS.EvidCislo,Cislo.CS.KodObvodu);
cout << " " << Nazev << '\n' ;
}
void Vymena(Stanice& a, Stanice& b){
Stanice pom;
pom=a;
a=b;
b=pom;
}
PoleStanic.h
#pragma once
#include "Stanice.h"
class PoleStanic{
int Pocet;
Stanice *Pole;
public:
PoleStanic() {Pocet=0; Pole=0;}
~PoleStanic() { delete[] Pole;}
void Alokuj(int _Pocet);
void Dealokuj();
void Nacti();
void Vypis()const;
void Serad();
};
PoleStanic.cpp
#include "stdafx.h"
#include "PoleStanic.h"
void PoleStanic::Alokuj(int _Pocet)
{
Dealokuj();
Pole = new Stanice[_Pocet];
Pocet = _Pocet;
}
void PoleStanic::Dealokuj()
{
delete[] Pole;
Pocet=0;
}
void PoleStanic::Nacti()
{
int poc;
cout << "Zadej pocet stanic: ";
cin >> poc;
Alokuj(poc);
for (int i=0;i<Pocet;i++)
Pole[i].Nacti();
}
void PoleStanic::Vypis() const
{
int i;
const char* TextCislo = "Cislo";
const char* TextNazev = "Nazev";
int PocMezer=Stanice::MaxCislo+1-
static_cast<int>(strlen(TextCislo));
int PocPoml=Stanice::MaxCislo+1+
static_cast<int>(strlen(TextNazev));
cout<<TextCislo;
for(i=0;i<PocMezer;i++) cout<<" ";
cout<<TextNazev<<"\n";
for(i=0;i<PocPoml;i++)cout<<"-";
cout<<"\n";
for(i=0;i<Pocet;i++)Pole[i].Vypis();
}
void PoleStanic::Serad()
{
int index;
for(int i=0;i<Pocet-1;i++)
{
index=i;
for(int j=i+1;j<Pocet;j++) {
if (Pole[j].Mensi(Pole[index])) index=j;
}
if (index!=i) Vymena(Pole[index],Pole[i]);
}
}
Main…
#include "stdafx.h"
#include "PoleStanic.h"
int main()
{
PoleStanic pole;
pole.Nacti();
cout << "\nNeutridene pole stanic\n";
pole.Vypis();
pole.Serad();
cout << "\nUtridene pole stanic\n";
pole.Vypis();
system ("pause");
return 0;
}