Programowanie obiektowe w C++ – System rezerwacji biletów w kinie cz. III
Zanim przytoczę całość kodu, pozwolę sobie sporządzić mały schemat, ułatwiający pracę ze źródłem:
// poczatek kodu, dodawanie bibliotek, namespace, itd. void wyswietl_menu_glowne(); void czekaj_na_klawisz(); // klasa Miejsce class Miejsce { public: char imie[20]; char nazwisko[20]; int numer; bool zarezerwowane; Miejsce(); Miejsce(char t_imie[], char t_nazwisko[], int t_numer, bool t_zarezerwowane); void rezerwuj(); void wypisz(); bool jestZarezerwowane(); }; // klasa Film class Film { private: char tytul[100]; static const int ilosc_miejsc = 30; int wybrane_miejsce; Miejsce wszystkie_miejsca[ilosc_miejsc]; public: Film(); Film(char t_tytul[]); void wypisz(); void wybierz_miejsce(); void wyswietl_wszystkie_miejsca(); void wyswietl_wolne_miejsca(); void wyswietl_zarezerwowane_miejsca(); void dodaj_rezerwacje(); void anuluj_rezerwacje(); void sprawdz_miejsce(); }; // kalsa Kino class Kino { private: static const int ilosc_filmow = 5; int wybrany_film; Film wszystkie_filmy[ilosc_filmow]; int ilosc_dodanych_filmow; public: Kino(); void dodaj_film(char t_tytul[]); void wybierz_film(); void wyswietl_wszystkie_filmy(); void wyswietl_wszystkie_miejsca(); void wyswietl_wolne_miejsca(); void wyswietl_zarezerwowane_miejsca(); void dodaj_rezerwacje(); void anuluj_rezerwacje(); void sprawdz_miejsce(); }; // funkcja główna int main();
Całość kodu:
#include <iostream> #include <stdio.h> using namespace std; void wyswietl_menu_glowne() // funkcja bez argumentów { cout << "System rezerwacji miejsc - Singlekino.pl" << endl << endl; // tworzymy menu cout << "Wybierz opcje:" << endl << endl; cout << "1 - Dodaj rezerwacje" << endl; cout << "2 - Usun rezerwacje" << endl; cout << "3 - Sprawdz miejsce" << endl; cout << "4 - Wyswietl wszystkie rezerwacje" << endl; cout << "5 - Wyswietl wolne miejsca" << endl; cout << "6 - Wyswietl zarezerwowane miejsca" << endl; cout << "7 - Zamknij system" << endl; } void czekaj_na_klawisz() { cout << endl << "(Wcisnij dowolny przycisk, aby wyjsc)" << endl; getchar(); } class Miejsce { public: // składniki klasy będą publiczbe char imie[20]; // składniki klasy char nazwisko[20]; int numer; bool zarezerwowane; Miejsce() { strcpy(imie, ""); strcpy(nazwisko, ""); numer = 0; zarezerwowane = false; } Miejsce(char t_imie[], char t_nazwisko[], int t_numer, bool t_zarezerwowane) { strcpy(imie, t_imie); strcpy(nazwisko, t_nazwisko); numer = t_numer; zarezerwowane = t_zarezerwowane; } void rezerwuj() { if(zarezerwowane) { cout << "Miejsce jest juz zarezerwowane."; } else { cout << "Podaj imie: "; cin >> imie; cout << "Podaj nazwisko: "; cin >> nazwisko; zarezerwowane = true; cout << endl << "Miejsce " << numer << " zostalo zarezerwowane dla: " << imie << " " << nazwisko << "."; } } void anuluj_rezerwacje() { if(zarezerwowane) { strcpy(imie, ""); strcpy(nazwisko, ""); zarezerwowane = false; cout << "Rezerwacja anulowana." << endl; } else { cout << "Nie ma takiej rezerwacji." << endl; } } void wypisz() // funkcja wypisująca { if(zarezerwowane) { cout<< "Numer: " << numer << ", " << imie << " " << nazwisko << endl; } else { cout << "Numer: " << numer << " - miejsce wolne" << endl; } } bool jestZarezerwowane() { return zarezerwowane; } }; // zamykamy nawias klamrowy i dajemy ŚREDNIK ! class Film { private: char tytul[100]; static const int ilosc_miejsc = 30; int wybrane_miejsce; Miejsce wszystkie_miejsca[ilosc_miejsc]; public: // składniki klasy będą publiczbe Film() // konstruktor domyślny { strcpy(tytul, ""); wybrane_miejsce = 0; int i = 0; for(i = i; i < ilosc_miejsc; i++) { wszystkie_miejsca[i] = Miejsce("","",i+1,false); } } Film(char t_tytul[]) { strcpy(tytul, t_tytul); wybrane_miejsce = 0; int i = 0; for(i = i; i < ilosc_miejsc; i++) { wszystkie_miejsca[i] = Miejsce("","",i+1,false); } } void wypisz() { cout << endl << "tytul: " << tytul << endl; } void wybierz_miejsce() { cout << "Wybierz numer miejsca (lub 0 aby wyjsc):" << endl << endl; cin >> wybrane_miejsce; if(wybrane_miejsce < 0 || wybrane_miejsce > ilosc_miejsc) { if(wybrane_miejsce != 0) { wybrane_miejsce = 0; cout << "Nie ma takiego miejsca" << endl << endl; } } } void wyczysc_miejsce() { wybrane_miejsce = 0; } void wyswietl_wszystkie_miejsca() { int i = 0; for(i = i; i < ilosc_miejsc; i++) { wszystkie_miejsca[i].wypisz(); } cout << endl << "Wszystkich miejsc: " << ilosc_miejsc << endl; } void wyswietl_wolne_miejsca() { int i = 0; int wolne = 0; for(i = i; i < ilosc_miejsc; i++) { if(!wszystkie_miejsca[i].jestZarezerwowane()) { wszystkie_miejsca[i].wypisz(); wolne++; } } cout << endl << "Wolnych miejsc: " << wolne << endl; } void wyswietl_zarezerwowane_miejsca() { int i = 0; int zarezerwowane = 0; for(i = i; i < ilosc_miejsc; i++) { if(wszystkie_miejsca[i].jestZarezerwowane()) { wszystkie_miejsca[i].wypisz(); zarezerwowane++; } } cout << endl << "Zarezerwowanych miejsc: " << zarezerwowane << endl; } void dodaj_rezerwacje() { cout << "Dodaj rezerwacje:" << endl << endl << endl; wyswietl_wolne_miejsca(); wybierz_miejsce(); if(wybrane_miejsce != 0) { wszystkie_miejsca[wybrane_miejsce-1].rezerwuj(); } czekaj_na_klawisz(); } void anuluj_rezerwacje() { cout << "Anuluj rezerwacje:" << endl << endl << endl; wyswietl_zarezerwowane_miejsca(); wybierz_miejsce(); if(wybrane_miejsce != 0) { wszystkie_miejsca[wybrane_miejsce-1].anuluj_rezerwacje(); } czekaj_na_klawisz(); } void sprawdz_miejsce() { cout << "Sprawdz rezerwacje:" << endl << endl << endl; wybierz_miejsce(); if(wybrane_miejsce != 0) { wszystkie_miejsca[wybrane_miejsce-1].wypisz(); wyczysc_miejsce(); } czekaj_na_klawisz(); } }; // zamykamy nawias klamrowy i dajemy ŚREDNIK ! class Kino { private: static const int ilosc_filmow = 5; int wybrany_film; Film wszystkie_filmy[ilosc_filmow]; int ilosc_dodanych_filmow; public: Kino() { wybrany_film = 0; ilosc_dodanych_filmow = 0; } void dodaj_film(char t_tytul[]) { if(ilosc_dodanych_filmow<ilosc_filmow) { wszystkie_filmy[ilosc_dodanych_filmow] = Film(t_tytul); ilosc_dodanych_filmow++; cout << "Dodano film " << t_tytul << endl; } else { cout << "Maksymalna liczba filmow dodana" << endl; } } void wybierz_film() { cout << "Wybierz numer filmu (lub 0 aby wyjsc):" << endl << endl; cin >> wybrany_film; if(wybrany_film < 0 || wybrany_film > ilosc_filmow) { if(wybrany_film != 0) { wybrany_film = 0; cout << "Nie ma takiego filmu" << endl << endl; } } } void wyswietl_wszystkie_filmy() { int i = 0; for(i = i; i < ilosc_filmow; i++) { cout << "Film nr. " << i+1 << ": "; wszystkie_filmy[i].wypisz(); cout << endl; } cout << endl << "Wszystkich filmow: " << ilosc_filmow << endl; } void wyswietl_wszystkie_miejsca() { int i = 0; for(i = i; i < ilosc_filmow; i++) { wszystkie_filmy[i].wypisz(); wszystkie_filmy[i].wyswietl_wszystkie_miejsca(); } } void wyswietl_wolne_miejsca() { int i = 0; for(i = i; i < ilosc_filmow; i++) { wszystkie_filmy[i].wypisz(); wszystkie_filmy[i].wyswietl_wolne_miejsca(); } } void wyswietl_zarezerwowane_miejsca() { int i = 0; for(i = i; i < ilosc_filmow; i++) { wszystkie_filmy[i].wypisz(); wszystkie_filmy[i].wyswietl_zarezerwowane_miejsca(); } } void dodaj_rezerwacje() { cout << "Dodaj rezerwacje:" << endl << endl << endl; wyswietl_wszystkie_filmy(); wybierz_film(); if(wybrany_film != 0) { wszystkie_filmy[wybrany_film-1].dodaj_rezerwacje(); } } void anuluj_rezerwacje() { cout << "Anuluj rezerwacje:" << endl << endl << endl; wyswietl_wszystkie_filmy(); wybierz_film(); if(wybrany_film != 0) { wszystkie_filmy[wybrany_film-1].anuluj_rezerwacje(); } } void sprawdz_miejsce() { cout << "Sprawdz rezerwacje:" << endl << endl << endl; wyswietl_wszystkie_filmy(); wybierz_film(); if(wybrany_film != 0) { wszystkie_filmy[wybrany_film-1].sprawdz_miejsce(); } } }; int main() { Kino kino; char znak; // tu zapiszemy wciśnięty klawisz // dodajmy kilka filmów do bazy kino.dodaj_film("film1"); kino.dodaj_film("film2"); kino.dodaj_film("film3"); kino.dodaj_film("film4"); kino.dodaj_film("film5"); //kino.wyswietl_wszystkie_miejsca(); wyswietl_menu_glowne(); znak = getchar(); // program pobiera znak while(znak != '7') { system("cls"); switch(znak) { case '1': kino.dodaj_rezerwacje(); break; case '2': kino.anuluj_rezerwacje(); break; case '3': kino.sprawdz_miejsce(); break; case '4': kino.wyswietl_wszystkie_miejsca(); czekaj_na_klawisz(); break; case '5': kino.wyswietl_wolne_miejsca(); czekaj_na_klawisz(); break; case '6': kino.wyswietl_zarezerwowane_miejsca(); czekaj_na_klawisz(); break; } system("cls"); wyswietl_menu_glowne(); znak = getchar();// jeszcze raz dokonujemy wyboru } // tutaj pętla zawraca i jeszcze raz sprawdza warunek return 0; }
Co w przypadku, gdy właściciel kina zażyczy sobie możliwości rezerwacji kilku filmów w jednej sali, zależnie od daty i godziny? Zaden problem. Wystarczy rozbudować klasę Kino. Jej zadaniem byłoby nie tylko tworzenie kolejnych filmów o okreslonym tytule i czasie emisji (data, godzina) ale również pilnowanie aby seanse nie kolidowały ze sobą. Jak widzimy, modyfikując istnejącą już klasę otrzymujemy bardzo realny system.
Dodając mozliwość odczytu i zapisu danych do bazy oraz ubierając całość w przystępnie wyglądający interfejs użytkownika mamy progam z prawdziwego zdarzenia :-)
Adam Sawicki – programista aplikacji internetowych, obserwator nowych trendów w świecie startup’ów i technologii webowych. Autor kursu C++ dla początkujących www.cpp.jcom.pl.
Strony: 1 2
Ciekawe, które kino chciałoby tego użyć…
W obecnej formie, żadne. To nie jest system produkcyjny dla klienta, tylko po to, żeby zrozumieć na czym polega programowanie zorientowane obiektowo. Dalej można ten program rozwijać, a to jest dobry początek ;)
Ciekawe, czy ktoś zrozumie na czym polega programowanie zorientowane obiektowo czytając Twojego bloga… ;)
Z takim nastawieniem jak twoje, na pewno nie ;)
Gdybym na prawdę potrzebował bardzo prosty program do sprzedaży miejsc numerowanych to dało by się ten adoptować ??
Adoptować w jakim sensie?
Dostosować do rzeczywistego wyglądu sali i drukować bilety zgodne z układem siedzeń.
Jeżeli funkcjonalności tego programu Panu odpowiadają to jak najbardziej tak. Moim zdaniem aby to użyć komercyjnie trzeba by dorobić jeszcze kilka rzeczy jak na przykład interfejs i zapis danych.