Programowanie obiektowe w C++ – Piszemy system rezerwacji biletów w kinie cz. I
Gościnie autorem wpisu jest Adam Sawicki.
Znamy podstawy C++, wiemy czym są klasy. Można przystąpić do wykorzystania naszej wiedzy pisząc system, który sprzedamy za niebotyczną sumę pieniędzy :-) Pomysłów jest wiele – wybierzmy jeden. Załóżmy, że zgłasza się do nas właściciel znanej sieci kin „Singlekino.pl” i prosi o oprogramowanie ułatwiające zarządzanie jego firmą. Potrzebny będzie system rezerwacji miejsc, aby nikt nie musiał stać z powodu ich niedostępności i zasłaniać film innym.
Podstawowymi elementami systemu będą opcje umożliwiające dodanie i usuwanie rezerwacji, składającej się z imienia, nazwiska i numeru miejsca. Warto mieć możliwość sprawdzenia, czy miejsce o które pyta klient jest wolne. Oczywiście nieopisaną pomoc dla osoby przyjmującej rezerwacje będą listy z podziałem na wolne i zajęte miejsca oraz lista zbiorcza (łącząca dwie poprzednie).
Jeszcze raz przyjrzyjmy się wymaganiom projektu:
- dodawanie rezerwacji w formie: imię, nazwisko i numer miejsca,
- usuwanie wybranej rezerwacji,
- sprawdzanie, czy wybrane miejsce jest jeszcze wolne,
- lista wszystkich miejsc,
- lista wolnych miejsc,
- lista zarezerwowanych miejsc.
Widzimy, że interfejs użytkownika będzie stanowić zgrabne menu z sześcioma opcjami do wyboru i wyjściem z systemu. Nie tracąc czasu przygotujmy sobie „szablon” programu, który będziemy rozbudowywać:
#include <iostream> 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; } int main() { char znak; // tu zapiszemy wciśnięty klawisz wyswietl_menu_glowne(); znak = getchar(); // program pobiera znak return 0; }
Powyższy kod nie wymaga zbyt wielu wyjaśnień. Program wyświetla menu i czeka na wciśnięcie dowolnego przycisku (funkcja getchar(),
dołączymy tutaj jeszcze bibliotekę stdio.h
, która obsługuję tą funkcję). Dopiszmy obsługę naszego wyboru. W tym celu przydatna okaże się funkcja while, oraz instrukcja switch
. Uzupełnijmy powyższy kod:
#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; } int main() { char znak; // tu zapiszemy wciśnięty klawisz wyswietl_menu_glowne(); znak = getchar(); // program pobiera znak while (znak != '7') //jeśli nie wybraliśmy 7, czyli nie chcemy kończyć to: { switch (znak) //operator sterujący { case '1': cout << "Dodaj rezerwacje" << endl; break; case '2': cout << "Anuluj rezerwacje" << endl; break; case '3': cout << "Sprawdz miejsce" << endl; break; case '4': cout << "Wyswietl wszystkie miejsca" << endl; break; case '5': cout << "Wyswietl wolne miejsca" << endl; break; case '6': cout << "Wyswietl zarezerwowane miejsca" << endl; break; } znak = getchar();// jeszcze raz dokonujemy wyboru } // tutaj pętla zawraca i jeszcze raz sprawdza warunek return 0; }
Do tej pory również nie zostało napisane nic co mogłoby powalić na nogi. W pętli while
sprawdzana jest wartość zmiennej znak
. Jeżeli jest ona różna od ’7
’ przechodzimy do funkcji switch
i wykonujemy odpowiednią instrukcję w zależności od wyboru. Zastanówmy się nad uczynieniem programu bardziej użytecznym.
W jaki sposób wykorzystać obiekty? Podstawowym elementem będzie rezerwacja stanowiąca imię
, nazwisko
i numer miejsca
. Przyda się również zmienna wskazująca czy miejsce jest zajęte. Nic nie stoi na przeszkodzie by uczynić z niej obiekt. Spróbujmy to zrobić:
class Miejsce // słowo class i nazwa klasy, w tym przypadku "Miejsce" { // składniki klasy będą publiczne public: char imie[20]; // składniki klasy char nazwisko[20]; int numer; // numer miejsca bool zarezerwowane; // czy miejsce jest zarezerwowane };
Możemy założyć, że liczba miejsc w kinie jest stała. Jest to bardzo ważna informacja, mianowicie wiemy, że liczba obiektów miejsce będzie taka sama przez cały czas działania programu. W zależności czy wybrane miejsce będzie zarezerwowane czy nie, zmieniać się będą zmienne imię
, nazwisko
i zarezerwowane
. Numer zostanie przypisany podczas tworzenia obiektu.
Rozbudujmy nasz obiekt o odpowiedni konstruktor. Pierwszy z nich będzie domyślny, drugi natomiast umożliwi utworzenie konkretnego miejsca z rezerwacją
Miejsce() // konstruktor domyślny { strcpy(imie, ""); // brak imienia strcpy(nazwisko, ""); // brak nazwiska numer = 0; // brak przypisanego miejsca zarezerwowane = false; // miejsce niezarezerwowane }
Chcąc użyć funkcji strcpy
wbudowanej w C++ bezpiecznie jest uaktualnić naszą listę bibliotek o string.h
:
#include <iostream> #include <string.h> using namespace std;
Konstruktor przeładowany:
Miejsce(char t_imie[], char t_nazwisko[], int t_numer, bool t_zarezerwowane) { //imie = t_imie; strcpy(imie, t_imie); //nazwisko = t_nazwisko; strcpy(nazwisko, t_nazwisko); numer = t_numer; zarezerwowane = t_zarezerwowane; }
Umieszczamy je w klasie po linii:
zarezerwowane = false; // miejsce niezarezerwowane
Skoro mamy już konstruktory to napiszmy wewnętrzną, publiczną funkcję, która umożliwi rezerwację miejsca. Umieszczamy ją w klasie tuż po konstruktorach. Potrzebne będą imię i nazwisko zainteresowanej osoby.
void rezerwuj() // publiczna funkcja rezerwująca { if(zarezerwowane) // sprawdźmy czy miejsce jest wolne { cout << "Miejsce jest już zarezerwowane."; } else // jeżeli tak { cout << "Podaj imie: "; // pobierz imię cin >> imie; cout << "Podaj nazwisko: "; // pobierz nazwisko cin >> nazwisko; zarezerwowane = true; // oznacz miejsce jako zarezerwowane cout << endl << "Miejsce " << numer << " zostało zarezerwowane dla: " << imie << " " << nazwisko << "." << endl; // wypisz odpowiednią informację. } }
Jeżeli ktoś wybrał to miejsce na seans to równie dobrze będzie mógł z niego zrezygnować. Z pomocą przychodzi funkcja anulująca rezerwację.
void anuluj_rezerwacje() { if(zarezerwowane) // sprawdź czy miejsce jest zarezerwowane { strcpy(imie, ""); // wyczyść imię strcpy(nazwisko, ""); // wyczyść nazwisko zarezerwowane = false; // oznacz miejsce jako niezarezerwowane cout << "Rezerwacja anulowana." << endl; // odpowiedni komunikat } else // jeżeli nie jest { cout << "Nie ma takiej rezerwacji." << endl; // odpowiedni komunikat } }
To już jest coś :-) Aby zobaczyć co „siedzi” w obiekcie Miejsce
napiszmy funkcję wypisz
, informującą nas o aktualnym jego stanie.
void wypisz() // funkcja wypisująca { if(zarezerwowane) // jeżeli miejsce jest zarezerwowane { cout << "Numer: " << numer << ", " << imie << " " << nazwisko << endl; } else // jeżeli nie { cout << "Numer: " << numer << " - miejsce wolne" << endl; } }
Jesteśmy gotowi to przeprowadzenia małego testu. W funkcji głównej (main
):
//... char znak; // tu zapiszemy wciśnięty klawisz // tutaj umieścimy nasz test wyswietl_menu_glowne(); //...
wykonamy sprawdzenie klasy. Dodajmy zmienną o nazwie rezerwacja typu Miejsce
:
Miejsce rezerwacja;
Sprawdźmy co siedzi w środku:
rezerwacja.wypisz();
Odpalmy program i widzimy, że obiekt rezerwacja
to wolne miejsce o numerze 0
.
Spróbujmy je zarezerwować:
rezerwacja.rezerwuj(); rezerwacja.wypisz();
Po dokonaniu rezerwacji znamy imię
i nazwisko
zainteresowanej osoby.
Na koniec anulujmy rezerwację:
rezerwacja.anuluj_rezerwacje(); rezerwacja.wypisz();
Takim sposobem miejsce o numerze 0
jest z powrotem wolne.
Całość programu wygląda następująco:
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; class Miejsce // słowo class i nazwa klasy, w tym przypadku miejsce { // otwieramy nawias klamrowy public: // składniki klasy będą publiczne 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 << "." << endl; } } 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; } } }; 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; } int main() { char znak; // tu zapiszemy wciśnięty klawisz Miejsce rezerwacja; rezerwacja.wypisz(); rezerwacja.rezerwuj(); rezerwacja.wypisz(); rezerwacja.anuluj_rezerwacje(); rezerwacja.wypisz(); wyswietl_menu_glowne(); znak = getchar(); // program pobiera znak while (znak != '7') //jeśli nie wybraliśmy 7, czyli nie chcemy kończyć to: { switch (znak) //operator sterujący { case '1': cout << "Dodaj rezerwacje" << endl; break; case '2': cout << "Anuluj rezerwacje" << endl; break; case '3': cout << "Sprawdz miejsce" << endl; break; case '4': cout << "Wyswietl wszystkie miejsca" << endl; break; case '5': cout << "Wyswietl wolne miejsca" << endl; break; case '6': cout << "Wyswietl zarezerwowane miejsca" << endl; break; } znak = getchar();// jeszcze raz dokonujemy wyboru } // tutaj pętla zawraca i jeszcze raz sprawdza warunek return 0; }
Co zrobimy następnie? Obecnie mamy tylko jedno miejsce. Trudno byłoby utrzymać takie kino :-) Należy wybrać liczbę miejsc, dopilnować aby ich numery się nie powtarzały i umożliwić rezerwację zgodnie z życzeniem klienta.
Rozbudujemy klasę Miejsce
oraz zbudujemy kolejną, nadrzędną o nazwie Kino
. Zapraszam do następnego artykułu :-)
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.
jak wywołać metodę wyswietl_menu_glowne w Javie?
To nie jest metoda tylko funkcja. W Javie nie ma funkcji tylko są metody więc najpierw trzeba zrobić obiekt danej klasy. Przykład:
public class Main {
void wypisz() {
System.out.print(„aaa”);
}
public static void main(String[] args) {
Main m = new Main();
m.wypisz(); //”aaa”
}
}