1 Wstęp do informatyki- wykład 3 Pierwszy program w C++ Wyprowadzanie danych Deklaracja zmiennych Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania. Wydanie VI, Helion, 2012 www.cplusplus.com Jerzy Grębosz, Opus magnum C++11, Helion, 2017 B. Stroustrup, Język C++. Kompendium wiedzy. Wydanie IV, Helion, 2014 S. B. Lippman, J. Lajoie, Podstawy języka C++, WNT, Warszawa 2003.
C++ - krótka historia 2 Język C++ został stworzony przez Bjarne Stroustrup a i jego zespół w AT&T, jako rozwinięcie C. Przeznaczenie: symulacje- język miał umożliwić efektywne zorientowane obiektowo programowanie. Pierwsza wersja C(++) powstała w 1980 roku jako C with classes, a ostateczna wersja języka wg Stroustrupa - w 1985 roku, już pod nazwą C++. 1989 - utworzenie przez ANSI (American National Standards Institute) komitetu standaryzacyjnego. Cel unifikacja języka różnicowanego przez producentów kompilatorów i środowisk programistycznych. 1998 ISO (International Organization for Standarization) zatwierdza standard dla C++ (ISO/IEC 14882). W 2011 zatwierdzono standard C++11, a w 2017 standard C++17
Pierwszy program 3 #include <iostream> using namespace std; int main() //funkcja main { /* zawsze zaczynamy naukę języka od Witaj swiecie */ cout << "Witaj swiecie"; } Wykonanie tego programu spowoduje pojawienie się na ekranie tekstu: Witaj swiecie
Pierwszy program 4 W każdym programie w języku C++ musi być specjalna funkcja zwana main. Od tej funkcji komputer zaczyna wykonywanie programu. Treść tej funkcji jej ciało tj.: instrukcje wykonywane w tej funkcji zawarta jest między dwoma nawiasami klamrowymi: { } W naszym przypadku w funkcji main jest tylko jedna instrukcja cout << "Witaj swiecie"; która sprawia, że na standardowym urządzeniu wyjściowym cout czyli po prostu na ekranie ma się pojawić tekst zamieszczony w cudzysłowie. Znaki << oznaczają akcję, którą ma podjąć cout czyli wyprowadzić na ekran tekst. Umieszczony na końcu średnik jest znakiem końca instrukcji.
Pierwszy program 5 Funkcja main musi zwracać ( obliczać ) wartość typu int (czyli liczbę całkowitą), co zaznaczamy pisząc nazwę typu int przed nazwą funkcji. Wartość typu int zwracana jest do systemu i zwyczajowo powinna wynosić 0, jeśli program kończy się pomyślnie. Niezerowa wartość zwrócona oznacza zwykle niepowodzenie. Normalnie, jeśli funkcja deklaruje, że zwraca wartość, to musi to zrobić (za pomocą instrukcji return). Pod tym względem main jest wyjątkiem: jeśli nie ma w treści instrukcji return, kompilator doda ją sam. int main() { cout << "Witaj swiecie"; return 0; }
Pierwszy program 6
Pierwszy program 7 #include <iostream> //dyrektywa preprocesora Włączenie do programu zawartości pliku nagłówkowego iostream. Dzięki temu w programie dostępne będą definicje, narzędzia (w postaci najrozmaitszych klas, funkcji, stałych itd.), służące do wykonywania operacji wejścia/wyjścia, a więc np. wczytywania z konsoli i wypisywania na ekranie danych. Instrukcja #include nie jest przeznaczona dla kompilatora. Włączenie pliku wykonywane jest przez preprocesor, który zajmuje się wyłącznie przetwarzaniem tekstu naszego programu przed jego właściwą kompilacją to, co zobaczy kompilator, to tekst naszego programu przetworzony przez preprocesor.
Pierwszy program 8 using namespace std; Linia ta oznacza, że nazw (klas, stałych, funkcji) niezdefiniowanych w naszym programie należy szukać w przestrzeni nazw std. W tej przestrzeni nazw znajdują się właśnie nazwy obiektów dostarczone przez dyrektywę preprocesora #include <iostream>: czyli, samo dołączenie pliku iostream nie wystarcza. Dyrektywy using moglibyśmy tu nie zastosować, ale wtedy musielibyśmy pisać na przykład std::cout, zamiast po prostu cout.
Kompilator 9 Program w takiej postaci, jak to właśnie napisaliśmy, jest to tekst źródłowy programu (kod źródłowy). Wersja źródłowa programu musi zostać przetłumaczona z języka C++ na język maszyny (procesora). Do tego tłumaczenia służy tak zwany kompilator C++. Tekst naszego programu poddajemy więc kompilacji i w jej rezultacie otrzymujemy skompilowaną( czyli przetłumaczoną na język maszynowy) wersję naszego programu. Taka skompilowana wersja jest już wprawdzie w języku procesora, ale jest jeszcze niepełna musi zostać połączona z tak zwanymi bibliotekami. Proces łączenia (linkowania, konsolidacji) naszego programu z bibliotekami wykonywany jest przez program zwany linkerem (ang. to link ).
Linkowanie- konsolidacja 10 Przyłączenie funkcji bibliotecznych następuje dopiero w czasie linkowania. Nasza dyrektywa (instrukcja) #include zapoznała kompilator jedynie z samym nagłówkiem biblioteki. Potrzebny był on po to, by kompilator mógł sprawdzać poprawność naszego odnoszenia się do biblioteki. Natomiast sama treść funkcji bibliotecznych dołączana jest dopiero na etapie linkowania. W rezultacie trzech etapów pracy nad programem: edycji, kompilacji, linkowania- konsolidacji otrzymaliśmy program w wersji nadającej się do uruchomienia.
Białe znaki. Komentarze 11 Wewnątrz instrukcji można postawić dodatkowe znaki spacji i tabulatory,czy nawet znaki nowej linii. Są to tzw. białe znaki. Znaki te napotkane wewnątrz instrukcji są prawie zawsze ignorowane. Używanie ich zwiększa czytelność programu. Komentarze mogą być wieloliniowe, jeśli ograniczone są dwuznakami ' /*' i ' */', lub jednoliniowe: od dwuznaku ' //' włącznie do końca bieżącej linii. Zostaną one wycięte z tekstu programu (i zastąpione jednym znakiem odstępu) już na wstępnym etapie przetwarzania i nie mają żadnego znaczenia na dalszych etapach kompilacji. Komentarze służą programiście/zespołowi do opisywaniakomentowania tego co robimy. Komentarze typu /*... */ nie mogą być w sobie zagnieżdżane.
Proste operacje We/Wy 12 Po dołączeniu do naszego programu pliku nagłówkowego iostream zdefiniowane są między innymi, identyfikatory cout i cin. Są to nazwy obiektów reprezentujących standardowe strumienie: wejściowy (ang. standard input stream) i wyjściowy (ang. standard output stream). Obiekt cout reprezentuje standardowy strumień wyjściowy, czyli strumień danych wyprowadzanych z programu na standardowe wyjście - ekran komputera. Skrót cout należy rozumieć jako console output. Dla strumienia cout mamy dostarczony mechanizm wstawiania do strumienia za pomocą operatora '<<'.
13 Wyprowadzanie danych Piszemy więc cout << "Witaj swiecie"; aby wstawić napis do strumienia wyjściowego cout. -"Witaj swiecie" to literał łańcuchowy (napisowy). Są to bezpośrednio zapisane w programie ciągi znaków (napisy, inaczej zwane też łańcuchami znakowymi), które chcemy traktować jako teksty, a nie elementy języka. Ciągi takie ujmujemy w cudzysłów. Dlaczego musimy zapisywać znaki i ciągi znaków w apostrofach/cudzysłowie? Otóż nieujęte w cudzysłów napisy i nieujęte w apostrof znaki alfabetyczne traktowane są jako nazwy zmiennych lub słowa kluczowe (oznaczające instrukcje lub inne elementy języka).
Wyprowadzanie danych Spróbujmy zmodyfikować nasz program. W środku tekstu ujętego w cudzysłów wpiszmy znaki \n: cout << "Witaj \nswiecie" Zmiana ta spowoduje, że tekst wypisany na ekranie będzie wyglądać następująco Witaj swiecie Znak \n ( new line) powoduje, że w trakcie wypisywania tekstu na ekranie następuje przejście do nowej linii. Dalszy ciąg tekstu wypisywany jest poniżej, od początku nowej linii. 14
Wyprowadzanie danych 15 Ewentualna następna instrukcja wyprowadzania tekstu zacznie go wypisywać od miejsca, w którym poprzednia skończyła. Zatem następujące instrukcje cout << "Witaj \nswiecie"; cout <<"Zaczynamy " ; cout <<"nauke programowania"; spowodują pojawienie się na ekranie tekstu: Witaj swieciezaczynamy nauke programowania Taki sam rezultat otrzymamy gdy napiszemy: cout << "Zaczynamy " << "nauke programowania";
Wyprowadzanie danych 16 Analogiczny rezultat możemy osiągnąć korzystając z manipulatora endl: cout << "Witaj "<< endl <<"swiecie"; cout <<"Zaczynamy "<<"nauke programowania"; Manipulator endl (zdefiniowany również dzięki dołączeniu pliku nagłówkowego iostream) wstawiamy do tego samego strumienia po kolejnej parze znaków '<<'. Jego nazwa nie jest ujęta w cudzysłowy, bo nie chcemy zobaczyć na ekranie napisu "endl". Jego wstawienie do strumienia wyjściowego powoduje dodanie znaku nowej linii. Gdybyśmy endl nie dodali, to znak nowej linii nie byłby wyprowadzony i następna operacja pisania na ekran kontynuowana byłaby w tym samym wierszu.
Wyprowadzanie danych 17 W tym przykładzie wstawiliśmy do strumienia dwa elementy: napis i manipulator. Moglibyśmy wstawić ich więcej. Zauważmy jednak, że wstawianie danych do strumienia wyjściowego odbywa się pojedynczo: każda dana musi być poprzedzona znakami '<<'. Np. cout << "Pierwsza linia," << endl << "druga linia," << endl << "i w koncu trzecia." << endl;
Wyprowadzanie danych- znaki specjalne 18 ZNAK EFEKT \a Sygnał dźwiękowy \b backspace \t Tabulacja pozioma \n Przejście do nowego wiersza \r Powrót karetki \ Cudzysłów \ Apostrof \?? \\ Ukośnik \ \xhh Kod znaku ASCII (hexadecymalnie)
Wyprowadzanie danych znaki specjalne 19 Linia może być zawsze przedłużona, jeśli jej ostatnim znakiem (czyli poprzedzającym znak końca linii) jest znak \ : cout<< "Nasz bardzo bardzo dlugi\ napis."; Do obiektu cout możemy wysyłać także pojedyncze znaki: cout<<'a';//'a'-to literał znakowy w oraz liczby: cout<<121;//literał liczbowy
#include <iostream> using namespace std; Przykład 2 - zmienne int main() //funkcja main { int jablka; //deklarujemy zmienna typu int } //przypisujemy tej zmiennej wartosc: jablka = 10; //instrukcja przypisania cout<<"mam "<< jablka <<" jablek"<<endl; jablka = jablka -1;//modyfikujemy zmienna cout<<"chrum, chrum. Teraz mam " << jablka <<" jablek."<<endl; return 0; 20
Instrukcja deklaracji i zmienne Output: Mam 10 jablek Chrum, chrum. Teraz mam 9 jablek. Aby zapisać w komputerze jakąkolwiek informację, trzeba wskazać położenie tej danej i określić ilość zajmowanego przez nią miejsca. Możemy to robić przy pomocy przy pomocy instrukcji deklaracji. W powyższym programie wystąpiła instrukcja deklaracji zmiennej: int jablka; Nazwa jablka określa zmienną służącą do przechowywania liczby typu całkowitego int. Teraz program natykając się na nazwę jablka będzie się odnosił do tego samego miejsca w pamięci. 21
Instrukcja deklaracji i zmienne 22 Zmienne to nazwane obszary pamięci o określonym adresie i typie. Każda zmienna: ma nazwę (użyty w programie symbol nazywa się nazwą zmiennej), przez tę nazwę odwołujemy się do konkretnego obszaru pamięci, w którym chcemy przechowywać wartości jakiejś danej, zawartość tego obszaru (wartość zmiennej) możemy zmieniać w trakcie wykonania programu W C++ wszystkie zmienne trzeba deklarować!
Deklaracja zmiennych: Instrukcja deklaracji i zmienne nazwa_typu nazwa_zmiennej; Deklaracja mówi, jakiego typu dane będą przechowywane pod określoną nazwą. Typ danej - to zbiór jej możliwych wartości plus zestaw operacji, które można nad nimi wykonywać (następny wykład). Nazwa zmiennej może to być dowolnie długi ciąg liter, cyfr oraz znaków podkreślenia _. Nazwa nie może się zacząć od cyfry. Małe i wielkie litery w nazwach są rozróżniane. Powyższa deklaracja jest również definicją tzn.kompilator alokuje w pamięci miejsce na zmienną. 23
Instrukcja przypisania Jeśli chcemy zadeklarować kilka zmiennych tego samego typu deklarujemy je oddzielając przecinkami: int a, b, c;//deklaracja 3 zmiennych typu int Instrukcja przypisania powoduje przypisanie wartości pewnemu miejscu w pamięci, np. jablka = 10; Symbol = to operator przypisania. Drugi przykład instrukcji przypisania pokazuje, że wartość zmiennej można zmieniać: jablka = jablka -1;//wyrażenie arytmetyczne 24
Wprowadzanie danych 25 Wprowadzanie danych odbywa się za pomocą podobnego mechanizmu. Tym razem obiektem reprezentującym strumień informacji wchodzących do programu ze świata zewnętrznego jest obiekt cin z klasy istream, dostępnej dzięki dołączeniu pliku iostream. Źródłem tej informacji jest domyślnie klawiatura komputera. Nazwa cin pochodzi od console input. Mechanizm wyjmowania ze strumienia realizowany jest za pomocą operatora '>>'.
Przykład 3 #include <iostream> using namespace std; int main() { } int stopy; //Do przechowania danej wejsciowej double metry; //Do wpisania wyniku cout << "Podaj wysokosc w stopach: "; cin >> stopy; //przyjecie danej z klawiatury metry = stopy * 0.3; //przeliczenie cout << stopy << " stop - to jest: " return 0; << metry << " metrow\n"; 26
Przykład 3 Kolejność wydarzeń jest taka: Najpierw (kolejno) deklarowane są zmienne stopy (zmienna typu całkowitego int), metry (zmienna typu zmiennoprzecinkowego double). Następnie wypisywane jest na ekranie pytanie: "Podaj wysokosc w stopach: " Następnie do zmiennej stopy wczytywana jest z klawiatury liczba stóp. Dalej widzimy instrukcję przypisania dokonującą mnożenia i wstawiającą rezultat do zmiennej (do obiektu) metry. Na koniec wypisanie rezultatu obliczeń. 27 Przykładowe wykonanie programu Podaj wysokosc w stopach: 5 5 stop - to jest: 1.5 metrow
Inicjacja zmiennych. Przy okazji deklarowania zmiennych można ustalać ich wartości, co nazywa się inicjacją. 1 sposób. Deklarację z inicjację zapisujemy w formie: nazwa_typu nazwa_zmiennej = wyrażenie; Na przykład: int a = 3; co jest skróconą formą od: int a; a = 3; W tym przypadku wyrażeniem inicjującym był literał. Ogólnie może być to dowolne wyrażenie. Np. int a = 3; int b = a + 1;//deklaracja zmiennej b //i ustalenie wartości na 4 28