programowanie c++ - wyk ad 1 - aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe...

31
Programowanie C++ Wyklad 1 - Aplikacje konsowlowe w środowisku QT dr inż. Jakub Możaryn Instytut Automatyki i Robotyki Warszawa, 2014 dr inż. Jakub Możaryn Programowanie C++

Upload: others

Post on 30-May-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Programowanie C++

Wykład 1 - Aplikacje konsowlowe w środowisku QT

dr inż. Jakub Możaryn

Instytut Automatyki i Robotyki

Warszawa, 2014

dr inż. Jakub Możaryn Programowanie C++

Page 2: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Wstęp

dr inż. Jakub Możaryn Programowanie C++

Page 3: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Plan wykładu

Podstawowe pojęcia i proste programy. Pojęcia algorytmu, programu,kodu wykonywalnego. Kompilacja i wykonanie programu. Sieci działań.Struktura programu. Komentarze i dokumentacja programu. Zmienne iich nazwy, podstawowe typy: całkowite, rzeczywiste, znakowe i napisowe.Instrukcje: czytania, pisania, przypisania. Klasyfikacja typów. Stałe,wyrażenia i funkcje. Instrukcje: warunkowa, złożona. Instrukcje cykliczne:pętla for, pętle sterowane warunkiem. Instrukcje przerywające wykonaniepętli. Instrukcja wielokrotnego wyboru.

dr inż. Jakub Możaryn Programowanie C++

Page 4: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Plan wykładu

Rysunek : Proces powstawania i działania progarmu.

dr inż. Jakub Możaryn Programowanie C++

Page 5: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Pojęcia podstawowe

Algorytm

Określamy tym mianem wszelkie przepisy postępowania, któredoprowadzają do uzyskania pożądanego efektu – rozwiązania zadania.

Algorytm

Skończony ciąg jasno zdefiniowanych czynności, koniecznych dowykonania pewnego rodzaju zadań. Algorytm ma przeprowadzić system zpewnego stanu początkowego do pożądanego stanu końcowego.Badaniem algorytmów zajmuje się algorytmika. Algorytm może zostaćzaimplementowany w postaci programu komputerowego.

Algorytm - (def.)

Algorytm to jednoznaczny przepis obliczenia w skończonym czasiepewnych danych wejściowych do pewnych danych wynikowych.

dr inż. Jakub Możaryn Programowanie C++

Page 6: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Pojęcia podstawowe

Kompilacja

Program służący do automatycznego tłumaczenia kodu napisanego wjednym języku (języku źródłowym) na równoważny kod w innym języku(języku wynikowym). Proces ten nazywany jest kompilacją.

Kompilator

W informatyce kompilatorem nazywa się najczęściej program dotłumaczenia kodu źródłowego w języku programowania na językmaszynowy. Niektóre z nich tłumaczą najpierw do języka asemblera, aten na język maszynowy jest tłumaczony przez asembler.

dr inż. Jakub Możaryn Programowanie C++

Page 7: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Plan wykładu

Rysunek : Proces powstawania i działania progarmu.

dr inż. Jakub Możaryn Programowanie C++

Page 8: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Pojęcia podstawowe

Język maszynowy

Zestaw rozkazów procesora, w którym zapis programu wyrażony jest wpostaci liczb binarnych stanowiących rozkazy oraz ich argumenty.

Kod maszynowy

Postać programu komputerowego (zwana postacią wykonywalną lubbinarną) przeznaczona do bezpośredniego lub prawie bezpośredniegowykonania przez procesor. Jest ona dopasowana do konkretnego typuprocesora i wyrażona w postaci rozumianych przez niego kodów rozkazówi ich argumentów. Jest to postać trudna do analizy przez człowieka.

Konsolidator (ang. linker)

Inaczej - program konsolidujący, to jeden z programów składowychkompilatora. Konsolidator w trakcie procesu konsolidacji łączy zadanepliki obiektowe i biblioteki statyczne tworząc w ten sposób plikwykonywalny.

dr inż. Jakub Możaryn Programowanie C++

Page 9: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Oprogramowanie Qt

Qt Creator jest wygodnym środowiskiem programistycznymprzeznaczonym do tworzenia projektów, czyli aplikacji zarównokonsolowych, jak i okienkowych z wykorzystaniem biblioteki Qt.Przedmiotem zajęć są aplikacje konsolowe (część 1, 4h), orazaplikacje okienkowe (część 2, 4h). Na zajęciach używana będziewersja Qt 5.0.2 for Windows 32-bit (MinGW 4.7) wykorzystującakompilator MinGW 4.7. Plik instalacyjny zajmuje 650MB.

Możliwe jest również zainstalowanie wersji wykorzystującejkompilator Microsoft Visual Studio 2010 oraz wersje na Mac i Linux.

Pliki instalacyjne środowiska Qt dla odpowiedniego systemu ikompilatora można znaleźć pod adresemhttp://qt-project.org/downloads

dr inż. Jakub Możaryn Programowanie C++

Page 10: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Qt

Qt - zestaw przenośnych bibliotek i narzędzi programistycznychdedykowanych dla języków C++, QML i Java. Ich podstawowymskładnikiem są klasy służące do budowy graficznego interfejsuprogramów komputerowych GUI (ang. Graphic User Interface),począwszy od wersji 4.0 Qt zawiera też narzędzia do tworzeniaprogramów konsolowych i serwerów.

Twórcą Qt jest obecnie organizacja Qt Project, do której opróczniezależnych twórców Open Source należą m.in. firmy Digia, KDAB,ICS. Digia jest właścicelem praw do komercyjnej wersji Qt oraz doznaków towarowych.

dr inż. Jakub Możaryn Programowanie C++

Page 11: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Qt - historia

Pomysłodawcami i pierwszymi twórcami Qt byli Haavard Nord i EirikChambe-Eng. Projektowanie pierwszych klas biblioteki rozpoczęto w 1991r. Rok później Chambe-Eng opracował koncepcję mechanizmu sygnałów igniazd, który wkrótce stał się fundamentem biblioteki.

4 marca 1994 r. Nord i Chambe-Eng założyli firmę Quasar Technologies.W 1995 firma otrzymała pierwszy kontrakt i zatrudniła pierwszegoprogramistę.

W 1997 twórcy KDE postanowili oprzeć swój produkt na bibliotece Qt.Dzięki temu szybko osiągnęła ona status jednej z najpopularniejszychbibliotek dla aplikacji okienkowych w C++ dla systemu Linux.

W 2008 Trolltech (d. Quasar Technologies) został przejęty przez Nokię.

W 2010 Nokia zapowiedziała użycie Qt jako głównej platformyprogramistycznej w Symbianie oraz systemie MeeGo.

W 2012 Digia kupiła od firmy Nokia framework Qt, zapewniając przyokazji dalsze wsparcie i rozwój darmowej licencji i współpracę z projektemKDE oraz KDE Free Qt Foundation na rzecz otwartego i wolnegooprogramowania.

dr inż. Jakub Możaryn Programowanie C++

Page 12: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Pierwsze uruchomienie Qt

Wraz ze środowiskiem Qt Creator zintegrowany jest rozbudowany systempomocy z przykładami i samouczkami (po angielsku). Zapoznanie się ześrodowiskiem najlepiej zacząć od kroków widocznych na ekraniepowitalnym. Ekran taki pojawi się przy pierwszym uruchomieniu i zawszewtedy, gdy wybrana będzie sekcja Zaczynamy nad górną poziomą kreską.

Rysunek : Ekran główny Qt

dr inż. Jakub Możaryn Programowanie C++

Page 13: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Pierwsze uruchomienie Qt

Wraz ze środowiskiem Qt Creator zintegrowany jest rozbudowany systempomocy z przykładami i samouczkami (po angielsku). Zapoznanie się ześrodowiskiem najlepiej zacząć od kroków widocznych na ekraniepowitalnym. Ekran taki pojawi się przy pierwszym uruchomieniu i zawszewtedy, gdy wybrana będzie sekcja Zaczynamy nad górną poziomą kreską.

Rysunek : Ekran główny Qt

dr inż. Jakub Możaryn Programowanie C++

Page 14: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Pierwsze uruchomienie Qt

W widoku ekranu powitalnego dostępne są sekcje:

Projekty - widok ostatnio otwartych sesji i projektów oraz opcjeutworzenia sesji lub projektu

Przykłady - gotowe projekty z opisem (po angielsku)

Samouczki- instrukcje krok po kroku (po angielsku)

dr inż. Jakub Możaryn Programowanie C++

Page 15: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Pierwsze uruchomienie Qt

Boczny pasek wyboru trybu pracyPowitanieEdycja - podstawowy tryb do tworzenia koduźródłowego programuDesign - tryb tworzenia interfejsu graficznego(nieużywany na ZAP I)Debug - tryb debugowania programuProjekty – ustawienia parametrów budowania iuruchamiania otwartych projektówAnaliza - tryb analizy uruchomionegoprogramu (analiza użycia procesora i pamięci)Pomoc

Rysunek : Pasekwyboru trybu pracy

dr inż. Jakub Możaryn Programowanie C++

Page 16: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Pierwsze uruchomienie Qt

Poniżej paska wyboru trybu znajduje się pasekuruchomienia i budowania projektu, w którymzaczynając od góry dostępne są opcje:

wybór aktywnego projektubudowanie i uruchomienie aplikacjibudowanie i uruchomienie aplikacji w trybiedebugowaniabudowanie aplikacji bez uruchamiania

Rysunek : Pasekuruchomienia ibudowania projektu

dr inż. Jakub Możaryn Programowanie C++

Page 17: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Prosta aplikacja konsolowa

W trybie widoku powitalnego należy wybrać sekcję Projekty, a następniewybrać Nowy projekt.

W oknie tworzenia projektu wybieramy Projekt nieużywający Qt (oznaczato nieużywanie biblioteki Qt, a tylko samego środowiska Qt Creator) idalej Zwykły projekt C++.

dr inż. Jakub Możaryn Programowanie C++

Page 18: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Prosta aplikacja konsolowa

Następnie należy nadać projektowi nazwę (bez spacji i polskichznaków) i wybrać katalog projektów (Utwórz w:), w którymutworzony zostanie katalog dla naszego projektu.

Najlepiej dla danego projektu tworzyć oddzielny katalog. Inaczejłatwo można wprowadzić bałagan do projektowanej aplikacji.

Uwaga

Nie tylko nazwa projektu, ale i cała ścieżka dostępu do katalogu zprojektem, nie mogą zawierać polskich znaków. W przeciwnym wypadkudebugger dostarczony z MinGW może nie działać poprawnie.

dr inż. Jakub Możaryn Programowanie C++

Page 19: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Prosta aplikacja konsolowa

W następnym kroku utworzone zostaną dwa katalogi, osobno dlawersji release i debug. Wersja release jest to końcowa wersjaprogramu skompilowana z optymalizacją rozmiaru pliku wyjściowegoi prędkości działania, którą dostarczamy użytkownikowi programu.Natomiast program skompilowany w wersji debug zawieradodatkowe informacje umożliwiające programiście śledzenie działaniaprogramu w celu usunięcia błędów (tzw. debugowanie).Pozostawiamy tutaj ustawienia domyślne.

dr inż. Jakub Możaryn Programowanie C++

Page 20: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Prosta aplikacja konsolowa

Dalej jest już ostatni krok tworzenia projektu: jako podsumowanie naekranie pojawi się ścieżka do utworzonego katalogu zawierającegopliki projektu oraz nazwy domyślnie utworzonych plików: plikumain.cpp z kodem źródłowym oraz pliku z rozszerzeniem .prozawierającego podstawowe informacje o projekcie (lista plikówźródłowych oraz używanych bibliotek). Utworzony katalog będziezawierał też plik z rozszerzeniem .user zawierający ustawieniaprojektu specyficzne dla konkretnego komputera (m.in. ścieżki dokatalogów). Nas interesować będzie wyłącznie plik main.cpp.

dr inż. Jakub Możaryn Programowanie C++

Page 21: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Prosta aplikacja konsolowa

Po utworzeniu projektu interfejs zostanie automatycznie przełączony wtryb edycji. W trybie tym dostępne są dwa najważniejsze okna:

Projekty zawierające listę otwartych projektów

okno edycji kodu źródłowego.

Dodatkowo mogą pojawić się okna:

Otwarte dokumenty z listą otwartych plików,

okno komunikatów środowiska.

dr inż. Jakub Możaryn Programowanie C++

Page 22: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Prosta aplikacja konsolowa

Rysunek : Interfejs przełączony w tryb edycjidr inż. Jakub Możaryn Programowanie C++

Page 23: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Prosta aplikacja konsolowa

W oknie edycji kodu źródłowego ukazuje się standardowa zawartość plikumain.cpp z prostym programem wypisującym na konsoli napis „HelloWorld!”. Kod ten zastępujemy naszym własnym programem,wykorzystując gotowy szkielet.ZADANIE: napisać program, który poprosi użytkownika o wprowadzenieliczby całkowitej, a następnie wyświetli ją na konsoli.

#include <iostream>using namespace std;int main(){int a;cout << "Podaj liczbe: " << endl;cin >> a;cout << "Podana liczba to: " << a << endlreturn 0;}

dr inż. Jakub Możaryn Programowanie C++

Page 24: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Prosta aplikacja konsolowa - debugowanie

Uruchomienie aktywnego projektu odbywa się za pomocą przycisku zzieloną strzałką Oznacza to, że projekt budowany jest w wersji debug(cooznacza, że może być potem uruchomiony w trybie debug), aleuruchamiany jest w „zwykłym” trybie release.

Pisząc kod łatwo popełnić błąd składniowy lub literówkę, którauniemożliwi poprawną kompilację programu. W takim przypadkukompilator zwróci informację o błędzie

W przykładzie zabrakło średnika na końcu wiersza numer 10, dlategopojawił się komunikat expected ’;’ before ’return’. W językuC++ średnik musi pojawić się po każdej instrukcji, ale niekoniecznie wtym samym wierszu, dlatego błąd wystąpił dopiero w wierszu 12.

dr inż. Jakub Możaryn Programowanie C++

Page 25: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Prosta aplikacja konsolowa - debugowanie

Uruchomienie aktywnego projektu odbywa się za pomocą przycisku zzieloną strzałką Oznacza to, że projekt budowany jest w wersji debug(cooznacza, że może być potem uruchomiony w trybie debug), aleuruchamiany jest w „zwykłym” trybie release.

Pisząc kod łatwo popełnić błąd składniowy lub literówkę, którauniemożliwi poprawną kompilację programu. W takim przypadkukompilator zwróci informację o błędzie

W przykładzie zabrakło średnika na końcu wiersza numer 10, dlategopojawił się komunikat expected ’;’ before ’return’. W językuC++ średnik musi pojawić się po każdej instrukcji, ale niekoniecznie wtym samym wierszu, dlatego błąd wystąpił dopiero w wierszu 12.

dr inż. Jakub Możaryn Programowanie C++

Page 26: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Prosta aplikacja konsolowa - debugowanie

Rysunek : Aplikacja konsolowa z informacjami o błędzie zwróconymi przezkompilator

dr inż. Jakub Możaryn Programowanie C++

Page 27: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Prosta aplikacja konsolowa - debugowanie

Oprócz błędów, które przerywają kompilację, mogą pojawić się równieżostrzeżenia. Dobrze napisany program powinien kompilować się bezostrzeżeń.

W przypadku wystąpienia krytycznego błędu w trakcie działaniaprogramu zostaniemy o tym poinformowani odpowiednim komunikatem.Jeżeli uruchomiliśmy program w zwykłym trybie (release) to pozostajenam zamknięcie programu i okna konsoli.

dr inż. Jakub Możaryn Programowanie C++

Page 28: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Prosta aplikacja konsolowa - debugowanie

Nawet jeżeli kod źródłowy kompiluje się poprawnie i uruchamia bezbłędów wykonania, to może zawierać błąd logiczny, który sprawi, żeprogram nie działa tak jak chcemy. Do wyszukiwania błędów tego typusłuży narzędzie zwane debuggerem, które umożliwia prześledzeniedziałania programu linia po linii, lub zatrzymanie w konkretnym miejscu(zaznaczonym jako tzw. breakpoint).

Punkt przerwania nazywany breakpoint ustawiamy klikając z lewejstrony numeru linii, w której chcemy zatrzymać wykonanie programu.Uruchomienie aplikacji w trybie debug odbywa się za pomocą klawiszaF5 lub przycisk (rys).

Rysunek : Ustawienie punktu przerwaniadr inż. Jakub Możaryn Programowanie C++

Page 29: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Prosta aplikacja konsolowa - debugowanie

Interfejs zostanie automatycznie przełączony w tryb debugowania.Wykonanie programu zostało zatrzymane w linii z breakpointem (żółtastrzałka). W oknie po prawej stronie wypisane są zmienne dostępne wdanej funkcji oraz ich wartości.

Rysunek : Interfejs Qt w trybie debugowania

dr inż. Jakub Możaryn Programowanie C++

Page 30: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Prosta aplikacja konsolowa - debugowanie

W trakcie debugowania przydatne są przyciski z panelu, który pojawił sięw widoku debugowania poniżej kodu źródłowego.

Zaczynając od lewej strony przyciski to:- kontynuacja (uruchomienie) debugowania F5- zatrzymanie debugowania- przejście do kolejnej linii F10- wejście do wnętrza funkcji F11- wyjście z aktualnej funkcji Shift+F11

dr inż. Jakub Możaryn Programowanie C++

Page 31: Programowanie C++ - Wyk ad 1 - Aplikacje konsowlowe w … · 2014-05-09 · ich nazwy, podstawowe typy: całkowite, rzeczywiste, ... postaci liczb binarnych stanowiących rozkazy

Prosta aplikacja konsolowa - debugowanie

Jeżeli program uruchomiliśmy w trybie debug, to komunikat o błędziejest bardziej szczegółowy, a miejsce, w którym działanie programu zostałoprzerwane, wskazane jest za pomocą żółtej strzałki.

Rysunek : Interfejs Qt w trybie debug i wyświetlonymi informacjami o błędzie

dr inż. Jakub Możaryn Programowanie C++