Informacje o nowych artykułach oraz akcjach edukacyjnych prosto na Twojej skrzynce e-mail!

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.

Spodobało się?

Jeśli tak, to zarejestruj się do newslettera aby otrzymywać informacje nowych artykułach oraz akcjach edukacyjnych. Gwarantuję 100% satysfakcji i żadnego spamowania!

, , , , , , , , , ,

Dodaj komentarz

Komentarze (2)

  • amazingTesla pisze:

    jak wywołać metodę wyswietl_menu_glowne w Javie?

    • lukas124 pisze:

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

Odpowiedz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Pin It on Pinterest