Podstawy
programowania I
Wykład nr 3
Wprowadzenie do programowania w C++. Mechanika tworzenia programu. Pierwszy program
autor: dr inż. Michał Łabowski
▪ michal.labowski@wat.edu.pl
▪ www.mlabowski.wel.wat.edu.pl
Podstawowe definicje Programowanie (informatyka) – działanie polegające na konstruowaniu programów w języku programowania.
Program (informatyka) – przepis jednoznacznie określający ciąg czynności, które mają być wykonane przez komputer.
Język programowania (informatyka) – narzędzie służące do formułowania programów dla komputerów, którego składnia określa zasady zapisu programów, a semantyka przypisuje programom ich interpretację (określa efekty działania programu).
Popularne języki programowania:
• C++
• C#
• C
• Python
• Java
Podstawowe definicje Mechanizm wykonywania kodu
programu
Interpretacja Kompilacja Interpreter (informatyka):
• program wykonujący program zapisany w pewnym języku programowania w ten sposób, że tekst programu jest czytany i natychmiast wykonywany.
• interpreter jest zwykle wolniejszy od kompilatora, ale pozwala łatwo zatrzymać wykonanie programu w dowolnym miejscu, sprawdzić jego stan, stwierdzić błąd w czasie wykonywania, zmienić wykonywany program itp.
• często wykorzystywany przy uruchamianiu nowych programów oraz przy wykonywaniu instrukcji wprowadzanych przez użytkownika bezpośrednio z klawiatury.
• ułatwia przenośność programów pomiędzy systemami operacyjnymi Interpretowalne (skryptowe) języki programowania:
• Python, R, JavaScript, Ruby, PHP
• Programy nazywamy skryptami
Podstawowe definicje Interpreter (na przykładzie języka Python)
Plik
źródłowy • m.py Kod
bajtowy • m.pyc
PVM • Wykonywanie
1. Tworzymy pliki źródłowe z kodem źródłowym w dowolnym edytorze tekstu 2. Kod źródłowy jest tłumaczony do kodu bajtowego. Kod bajtowy to
niskopoziomowa, niezależna od platformy reprezentacja kodu źródłowego.
Podstawowe definicje Kompilator (na przykładzie języka C++)
Kod źródłowy
Kompilator
Kod pośredni
Konsolidator (linker)
Kod wykonywalny Kod
uruchomieniowy Kod biblioteczny
2 1
3
Mechanika tworzenia programu:
1. tworzenie kodu źródłowego
2. kompilacja Dwuetapowy proces tworzenia kodu wykonywalnego
Tworzenie kodu źródłowego w C++
Tworzenie kodu źródłowego:
• odbywa się w dowolnym edytorze tekstu, choć zalecane jest korzystanie z IDE (autouzupełnianie, wsparcie refaktoryzacji, kolorowanie składni)
• kod źródłowy zapisujemy w plikach z rozszerzeniem (przyrostkiem) .cpp (można spotkać także .cc, .c++, .cxx)
• nazwa pliku powinna spełniać wymagania systemu operacyjnego, najczęściej nie powinna zawierać znaków specjalnych (znaków diakrytycznych i spacji). W systemie Linux wielkość liter ma znaczenie
Składniki nazwy pliku z kodem źródłowym:
plik.cpp
Nazwa bazowa Kropka Rozszerzenie
Kompilacja i konsolidacja Kompilacja:
• Przetworzenie kodu źródłowego zapisanego w plikach źródłowych na kod pośredni (kod maszynowy) zapisany w plikach obiektowych (ang. object files)
• Pliki obiektowe zawierają kod maszynowy wynikający z kodu źródłowego napisanego przez programistę
• Kod maszynowy po etapie kompilacji nie jest gotowy do uruchomienia
• Przed rozpoczęciem zasadniczej kompilacji kodu kompilator uruchamia preprocesor, który wykonuje czynności przygotowawcze (ang. preprocessing).
• Kompilator dostarcza informacji o ewentualnych błędach w kodzie źródłowym Preprocesor
• Jest programem uruchamianym przez kompilator
• Jest uruchamiany automatycznie podczas kompilacji programu
• Z jego wywołaniem związane są dyrektywy preprocesora umieszczane w kodzie źródłowym
• Dyrektywy preprocesora rozpoczynają się od znaku # (ang. hash)
• Przykładowa dyrektywa: #include <iostream> umieszczona w kodzie źródłowym jest zastępowana przez preprocesor kodem zawartym w pliku iostream.
• Przegląda kod źródłowy w poszukiwaniu zrozumiałych dla siebie dyrektyw i
wykonuje związane z nimi operacje (np. rozwijanie makr)
Kompilacja i konsolidacja Konsolidacja (linkowanie):
• łączy (linkuje) skompilowany kod pośredni z kodem startowym (ang. start-up code) i kodem bibliotecznym
• Wynikiem jego działania jest kod wykonywalny
• Kod startowy jest interfejsem pomiędzy programem działającym w przestrzeni użytkownika a systemem operacyjnym
• Każdy z systemów operacyjnych wymaga innego kodu źródłowego
• Kod biblioteczny to kod wykorzystywanych bibliotek zewnętrznych, np. bibioteki iostream (obsługa strumieni wejścia/wyjścia).
• Linker pobiera z bibliotek jedynie te fragmenty kodu, które są wymagane przez
funkcje użyte w programie (kodzie źródłowym)
Kompilacja i konsolidacja Kompilacja i konsolidacja w systemie Linux
• Najpowszechniej wykorzystywanym kompilatorem jest g++ (GNU C++), inne
Aby skompilować kod składający się z wielu plików źródłowych można podać potrzebne pliki w wierszu poleceń:
g++ plik_1.cpp plik_2.cpp
W efekcie powstaje plik wykonywalny o domyślnej nazwie a.out oraz dwa pliki obiektowe plik_1.o i plik_2.o.
Jeśli zmodyfikujemy jeden z plików źródłowych, np. plik_1.cpp możemy ponownie skompilować ten plik i połączyć go ze skompilowanym wcześniej plikiem obiektowym plik_2.o:
g++ plik_1.cpp plik_2.o
Cykl życia oprogramowania Cykl życia oprogramowania:
1. Planowanie 2. Analiza
3. Projektowanie 4. Implementacja 5. Testowanie 6. Wdrożenie
7. Konserwacja (utrzymywanie oprogramowania, pielęgnacja) 8. Wyłączenie
Pisząc kod programista powinien mieć na uwadze, że znacznie więcej czasu poświęca się na CZYTANIE kodu niż jego pisanie. Kod należy zatem pisać tak, żeby przyjemnie go się czytało (był logiczny, zapisany zgodnie ze standardami tworzenia oprogramowania).
Fazy procesu tworzenia oprogramowania
Metodologie tworzenia oprogramowania:
Architektura oprogramowania Architektura oprogramowania:
• Określa organizację systemu, relacje komponentów
• Najpowszechniejszym językiem opisu architektury jest UML (ang. Unified Modeling Language)
• Powszechnie wykorzystywane są zasady SOLID – zbiór dobrych praktyk
programowania obiektowego
Język C++
Język C++:
• Powstał na początku lat 80. W zakładach Bell Labs, opracował go Bjarne Stroustrup
• Został stworzony na podstawie języka C, C++ jest nadzbiorem języka C.
• Język C był językiem wysokiego poziomu, umożliwiającym łatwe odwołania do sprzętu i programowanie systemowe
• Poprawne programy napisane w języku C są poprawnymi programami w C++
• Programy C++ mogą wykorzystywać biblioteki napisane w języku C
• Nazwa C++ pochodzi od istniejącego w C operatora inkrementacji ++ (C++ to rozszerzony, ulepszony C)
• Język obiektowy
• W programowaniu obiektowym najważniejsze są dane, nie algorytmy – zamiast dopasować problem do języka, w programowaniu obiektowym próbuje się dopasować język do problemu – realizowane jest to przez tworzenie własnych typów danych, czyli klas)
• Klasa to opis nowej postaci danych, obiekt to konkretna struktura danych
Język C++
Podstawowe cechy programów obiektowych:
• Enkapsulacja (ang. encapsulation): ukrywanie informacji, wewnętrznych algorytmów przed nieuprawnionym dostępem
• Polimorfizm: pozwala tworzyć wiele definicji tych samych operatorów i funkcji, tak że, kontekst programu decyduje, która definicja zostanie użyta
• Dziedziczenie: pozwala wywodzić nowe klasy z klas istniejących wcześniej (rozszerzenie funkcjonalności), co pozwala na powtórne wykorzystanie kodu.
Standardy języka C++:
• Definiowany przez organizację ANSI (ang. American National Standarization Institute - ANSI), IEC (ang. International Electrotechnical Commision - IEC) i ISO.
• Co kilka lat wydawany jest nowy standard definiujący/wprowadzający nowe funkcjonalności
• C++98/C++03 – pierwsze standardy C++
• C++11 (ISO/IEC 14882:2011) – znaczące rozwinięcie języka
• C++17
• C++20
• Kompilatory nie zawsze wspierają najnowsze standardy
Zintegrowane środowiska programistyczne Zintegrowane środowisko programistyczne
• ang. Integrated Development Environment – IDE
• program lub grupa programów służących do tworzenia oprogramowania:
• zawiera edytor tekstu - pisanie kodu
• uruchamia kompilator i linker
• uruchamia debugger (ang. Debugging - odpluskwianie) – proces polegający na sekwencyjnym wykonywaniu programu z możliwością podglądania wartości zmiennych. Popularnym debuggerem jest GDB (GNU Project Debugger)
• pozwala na uruchomienie programu
• IDE to tzw. toolchain
Uruchomienie Debugging
Zintegrowane środowiska programistyczne Popularne IDE C++
• Microsof Visual Studio Code
• Eclipse
• QtCreator
• Code::Blocks Wybrane zalety IDE
• ułatwia pisanie kodu (kolorowanie składni)
• podpowiedzi (uzupełnianie składni)
• formatowanie kodu
• statyczna analiza kodu
Struktura projektu Pliki projektu w C++
pliki źródłowe pliki nagłówkowe
• rozszerzenia: .cpp, .c
• zawierają definicje funkcji, klas • rozszerzenia: .hpp, .h
• zawierają deklaracje funkcji, klas
• nazwa pliku nie może zawierać białych znaków (spacji, tabulatorów)
• nazwa pliku nie może zawierać znaków specjalnych (np. polskich znaków)
• nazwa pliku nie może rozpoczynać się od cyfry
• pliki mogą być grupowane w foldery
Przykładowy program
Przykładowy program „Hello world” napisany w języku C++ w
Wynik uruchomienia programu
Przykładowy program - komentarze
Nr linii Opis
1 – 4, 7
Komentarz wielolinijkowy (linie 1-4) i jednolinijkowy (linia 7). Komentarz to notatka zostawiona przez programistę czytelnikowi, objaśniająca działanie programu. Komentarz to linia lub linie tekstu w kodzie programu, które nie są tłumaczone na kod wynikowy (są pomijane przez kompilator). Używanie komentarzy do opisu kodu jest dobrą praktyką programistyczną. Komentarze sąPrzykładowy program
Nr linii Opis
6
Dyrektywa preprocesora (zawsze zaczynają się znakiem „#”), mówiąca: „dołącz w tym miejscu kod zawarty w bibliotece iostream, tzw. plik nagłówkowy z deklaracjami funkcji bibliotecznych”. Preprocesor wykonuje tę operację przed kompilacją kodu. Nawiasy <…> oznaczają, że plik będzie wyszukiwany w katalogach o ścieżkach zdefiniowanych w kompilatorze lub w opcjach projektu.Gdy dołączamy stworzony przez nas plik nagłówkowy wykorzystujemy znak cudzysłowu ”…” – wtedy przeszukiwany będzie w pierwszej kolejności folder z naszym projektem, później standardowe ścieżki.
Przykładowy program
Nr linii Opis
6
Dyrektywa using mówiąca: „użyj przestrzeni nazw standard”. Przestrzeń ta dotyczy obiektów zawartych w pliku nagłówkowym iostream. Od tej pory można do nich odnosić się bez przedrostka z nazwą przestrzeni, tzn. gdyby pominąć dyrektywę using… linia 12 wyglądałaby następująco: std::cout << „Hello world! <<std::endl.
Przykładowy program
Nr linii Opis
10
Nagłówek funkcji main. Funkcja ta musi pojawić się w każdym programie.Składnia: typ_zwracany nazwa_funkcji (lista_argumentów). Typ_zwracany to nazwa typu argumentu zwracanego przez funkcję za pomocą słowa kluczowego return. Nazwa_funkcji - nazwy obiektów w C++ nie mogą zawierać znaków specjalnych (np. polskich znaków, spacji), nie mogą zaczynać się od cyfry.
Lista_argumentów – w tym przypadku funkcja nie przyjmuje żadnych argumentów. W C++ funkcje są wywoływane przez inne funkcje, a nagłówek stanowi interfejs funkcji wywoływanej na rzec funkcji wywołującej.
Typ zwracany
Nazwa funkcji
Lista argumentów
Nagłówek funkcji
Przykładowy program
Nr linii Opis
11 - 14
Ciało funkcji, czyli zestaw instrukcji wykonywanych w momencie wywołania funkcji (linie 7, 8), ograniczony klamrami. Instrukcje kończą się średnikiem.12
Obiekt cout z biblioteki iostream, służący m.in. do wyświetlenia strumienia wyjściowego z programu (tutaj jest nim ciąg znaków Hello wordl!) na ekranie.Nagłówek funkcji Ciało funkcji
Definicja funkcji
Przykładowy program
Nr linii Opis
13
Dyrektywa return powoduje zakończenie wykonywania funkcji (tzn., że jest ostatnia instrukcją wykonaną w funkcji), przekazuje argument zwracany (tutaj zero) na zewnątrz (czyli do obiektu wywołującego funkcję i czekającego na rezultat jej działania)Nagłówek funkcji Ciało funkcji
Definicja funkcji