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”
}
}