Informacje organizacyjne, Wprowadzenie do programowanie w języku C++. Spotkanie 1 Dr inż. Dariusz JĘDRZEJCZYK 11/3/2016 Katedra Informatyki Stosowanej i Modelowania 2 W ramach przedmiotu przedstawione zostaną zagadnienia programowania proceduralnego w języku C++ dotyczące: zmiennych i tablic instrukcji warunkowych pętli wskaźników funkcji Dr inż. Dariusz JĘDRZEJCZYK pok. 409, pawilon B5, IV piętro tel. 012 617 41 80 djedrzej@agh.edu.pl home.agh.edu.pl/~djedrzej 11/3/2016 Katedra Informatyki Stosowanej i Modelowania 3 1
Z zakresu wiedzy: Zna zasady poprawnego budowania aplikacji z wykorzystaniem modelu programowania strukturalnego. Zna zasady budowania funkcji oraz posługiwania się nimi. Zna paradygmat programowania strukturalnego Z zakresu umiejętności: Potrafi samodzielnie zaprojektować aplikację z wykorzystaniem paradygmatu programowania strukturalnego. Potrafi poprawnie przeprowadzić analizę kodu źródłowego i wyeliminować ewentualne błędy. 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 4 Na zajęciach będzie sprawdzana lista obecności W przypadku nieobecności na konkretnym spotkaniu nie jest możliwe oddanie projektu przewidzianego na te właśnie zajęcia. W przypadku nieobecności na konkretnym spotkaniu nie jest możliwe odrobienie zajęć z inną grupą. 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 5 Projekty z zajęć są oceniane w zależności od stopnia zrealizowania przykładu na danych zajęciach. Projekty są oceniane w skali 0-3 punkty. W przypadku nieobecności na ćwiczeniu z danej tematyki - nie jest możliwe oddanie projektu przewidzianego na te zajęcia. Brak możliwości podejścia do terminów poprawkowych: Sumaryczna liczba punktów jest mniejsza niż 25% maksymalnej liczby punktów możliwej do zdobycia w ramach ćwiczeń. Liczba nieobecności jest mniejsza niż połowa zajęć (zaokrąglenie w górę). 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 6 2
Oceny będą ustalane według poniższego algorytmu (wyciąg z regulaminu studiów AGH). Przedstawione procenty należy określać względem maksymalnej liczby punktów, jaką można zdobyć na zajęciach: poniżej 50% - 2,0 (niedostateczny), od 50% - 3,0 (dostateczny), od 61% - 3,5 (plus dostateczny), od 71% - 4,0 (dobry), od 81% - 4,5 (plus dobry), od 91% - 5,0 (bardzo dobry) 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 7 http:// home.agh.edu.pl/~djedrzej 11/3/2016 Katedra Informatyki Stosowanej i Modelowania 8 Wykład nie jest oparty tylko i wyłącznie na jednym podręczniku. W związku z tym dopuszczalne są wszystkie książki o tematyce programowania obiektowego. Mogą to być np. pozycje przedstawione obok. Jednak ze względu na mnogość informacji umieszczonych na stronach internetowych jak najbardziej polecam nie tylko książki, ale również jako źródło wiedzy Internet. 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 9 3
11/3/2016 Katedra Informatyki Stosowanej i Modelowania 10 Programowanie liniowe Programowanie strukturalne Model programowania Programowanie zdarzeniowe Programowanie obiektowe 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 11 Proces tworzenia programu rozpoczyna się od jego ogólnego opisu, przechodząc następnie do szczegółów. W programowaniu strukturalnym zaleca się wykorzystanie tylko kilku najważniejszych struktur sterujących: Iteracja - powtarzanie instrukcji w pętli do momentu, w którym zostanie spełniony warunek iteracyjny Wybór - realizacja poszczególnych instrukcji programu (przypisania, wprowadzania/wyprowadzania danych, warunkowa, wyboru, złożona, procedury) w zależności od jego stanu Sekwencja - wykonanie poszczególnych instrukcji w kolejności Podprogram 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 12 4
Zadanie Algorytm Kod źródłowy programu Opracowanie kodu Unit1.cpp Unit2.cpp Unit1.h Unit2.h źródłowego (stworzony na Kompilator podstawie wcześniej wymyślonego algorytmu, czyli sposobu rozwiązania Unit1.obj Unit2.obj danego zadania) Konsolidator Plik.lib Generowanie kodu Plik.exe wynikowego 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 13 Cechą charakterystyczną języka C++ (jak wielu innych) jest możliwość programu z wielu modułów. Modułem może być każdy plik zawierający poprawny kod źródłowy. Programy buduje się z wykorzystaniem funkcji. Każda funkcja może posiadać (lecz nie musi) argumenty i może zwracać dany typ. W celu wygenerowania pliku wynikowego programu w jednym i tylko jednym module programu musi znaleźć się funkcja o nazwie main(). Od funkcji main() rozpoczyna się wykonywanie programu. Moduł, który zawiera funkcję main() jest modułem głównym. 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 14 Standard C++ //int main(int argc, char** argv) int main(int argc, char *argv[]) { return 0; } Rozwiązanie Microsoft int _tmain(int argc, _TCHAR *argv[]) { return 0; } 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 15 5
argc - liczba elementów w tablicy argv argv[] - tablica z elementami podanymi podczas uruchamiania programu Podczas uruchomienia programu bez dodatkowych parametrów wówczas: argc = 1, natomiast w tablicy argv jest nazwa programu W przypadku urochomienia programu w sposób poniżej:./program boo foo hii wówczas argc = 4, natomiast w tablicy argv są umieszczone kolejno program, boo, foo, hii 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 16 01. main(... ){ 02.... 03. } 01. main(... ) 02. { 03.... 04. } 01. main(... ) 02. { 03.... 04. } stosować wcięcia, otwierać i zamykać nawiasy a później pisać zawartość w przypadku wykonywania np. pętli bez użycia nawiasów klamrowych wykona się tylko pierwsza instrukcja poniżej pętli 01. main(... ) 02. { 03. { 04.... 05. } 06. } 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 17 Deklaracja Definicja Inicjalizacja Sposób nazywania zmiennych Zasięg zmiennych Klasy pamięci - modyfikatory deklaracji zmiennych i stałych 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 18 6
zmienna - to obiekt w programowaniu, który przechowuje różnego rodzaju dane niezbędne do działania programu. Zmienna podczas działania programu może zmieniać swoje wartości (jak wskazuje nazwa). Tworząc zmienną musimy nadać jej nazwę oraz typ, który określa co nasza zmienna będzie przechowywać. <modyfikator> <typ> nazwazmiennej; 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 19 char - zmienna przechowuje znaki (litery, cyfry, znaki interpunkcyjne). Za pomącą tego typu zmiennej można także przechowywać niewielkie liczby. int - zmienna służy do przechowywania liczb całkowitych. bool - zmienna służy do przechowywania wartości logicznych true/false (prawda/fałsz). float - zmienna przechowuje liczby rzeczywiste (zmiennoprzecinkowe - do 7 cyfr po przecinku). double - zmienna przechowuje liczby rzeczywiste podobnie jak powyższy typ ale posiada dużo większą dokładność (do 15 miejsc po przecinku). void - to dane "niezdefiniowane". Można im przypisywać wartość tylko po określeniu rozmiaru i przydzieleniu pamięci. 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 20 C++ pozwala także na użycie pewnych kwalifikatorów przed typem zmiennej: signed - zmienna może przechowywać wartości dodatnie i ujemne (zmienna posiada znak +/-). unsigned - zmienna może przechowywać tylko wartości dodatnie. short - zmienna jest typu krótkiego - wpływa na długość zajmowanej pamięci (a więc również na zakres zmiennej). long - zmienna jest typu długiego. 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 21 7
Nazwa Długość Zakres Opis unsigned char 1 bajt 0 do 255 char lub signed char 1 bajt -128 do 127 Liczby całkowite lub znaki unsigned int 2 bajty 0 do 65 535 int lub signed int 2 bajty -32 768 do 32 767 short int 2 bajty -32 768 do 32 767 unsigned long 4 bajty 0 do 4 294 967 295 Liczby całkowite long lub signed long 4 bajty -2 147 483 648 do 2 147 483 647 Liczby double 8 bajtów 1.7 * 10-308 do 1.7 * 10 +308 rzeczywiste long double 10 bajtów 3.4 * 10-4932 do 1.1 * 10 +4932 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 22 register; oznacza, że zmienna ma być trzymana w rejestrze procesora, a nie w pamięci. Co prawda i tak zdecyduje o tym kompilator, ale jest to już pewna podpowiedź. const; oznacza, że obiekt jest stały. W konsekwencji istnieje obowiązek zainicjalizowania go i nie wolno później zmieniać jego wartości volatile; oznacza, że nie ma się wyłączności do podanego obiektu (tzn. może być to rejestr sprzętowy komputera albo zmienna używana przez inny wątek). Oznacza to, że kompilatorowi nie wolno używać w celach optymalizacyjnych wartości odczytanej we wcześniejszej operacji; musi on za każdym odczytem jej wartości dokonać jej fizycznego odczytu 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 23 static; w ogólności oznacza, że obiekt taki istnieje przez cały czas, niezależnie od zasięgu, który go używa. Dla funkcji oraz zmiennych globalnych oznacza z kolei zniesienie zewnętrznego symbolu obiektu lub funkcji (tzn. poza bieżącą jednostką kompilacji, czyli plikiem, nic nie może z tego korzystać) extern; oznacza, że następująca deklaracja nie jest fizyczną deklaracją, lecz zaimportowaniem owej deklaracji z innej jednostki kompilacji auto - przydział miejsca w pamięci dla zmiennej następuje dynamicznie (na stosie) w czasie wykonywania bloku, w którym zmienna została zadeklarowana. Po zakończeniu wykonywania instrukcji z danego bloku pamięć po zmiennej zostaje zwolniona. Jest to domyślna klasa zmiennych. 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 24 8
Deklaracja - to informacja dla kompilatora dotycząca tego czym jest tworzony obiekt. w jednym zakresie może istnieć wiele deklaracji tej samej zmiennej. Wykorzystanie modyfikatora extern. extern <typ> nazwazmiennej; 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 25 Definicja - jest zarówno deklaracją, ale dodatkowo rezerwuje pamięć dla tworzonego obiektu. w jednym zakresie może istnieć tylko jedna definicja zmiennej o tej samej zmiennej. <typ> nazwazmiennej; int a; - definicja zmiennej o nazwie "a" do przechowywania liczb całkowitych (typu int) char b; - zmienna o nazwie "b" do przechowywania znaków (typ char). 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 26 Inicjalizacja jest to nadawanie początkowej wartości zmiennej w chwili jej tworzenia. char znak = 'w'; //stworzenie zmiennej znakowej o nazwie "znak" // i przypisanie do niej znaku "w". int b = 8; //stworzenie zmiennej typu całkowitego o nazwie "b" // i nadanie jej wartości 8. 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 27 9
Nadając zmiennej nazwę należy trzymać się następujących reguł: zmienna jest jednym ciągiem znaków bez spacji np. nazwa_zmiennej, nazwazmiennej, nazwa zmiennej, nie zaczynamy nazwy od cyfry np. zmienna12, 12zmienna, nie używamy polskich liter takich jak: ą, ę, itp. nazwa zmiennej powinna kojarzyć się z przeznaczeniem tej zmiennej np. poleokregu nazwa nie może być słowem kluczowym języka programowania np. auto, for, int, short, class, itp. camelcase, PascalCase, notacja węgierska 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 28 Zmienne lokalne Zmienne tego typy "widoczne" są tylko w określonym bloku. bloki ograniczone nawiasami klamrowymi zakres bloku funkcji - zakres dotyczący wszystkich funkcji definiowanych w programie. zakres obszaru klasy - zasięg określony przez zakres tworzonej klasy i dotyczy danych składowych oraz funkcji składowych klasy. zakres obszaru przestrzeni nazw - zasięg dotyczący obszaru przestrzeni nazw. Pojęcie to niedawno zostało wprowadzone do języka C++. Można dzięki niemu wprowadzić jakiś porządek wśród nazw - poprzez zgrupowanie ich w rodziny. 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 29 Zmienne globalne Zmienne tego typu widoczne są w każdym "zakątku" programu. Oznacza to, że można z niej korzystać w każdym miejscu programu. Trzeba jedna zwrócić uwagę, że przy tworzeniu tego typu zmiennych, istnieje niebezpieczeństwo przypadkowego nadpisania jej wartości, co może spowodować nieprawidłowe działanie programu. Dlatego zaleca się korzystanie ze zmiennych lokalnych. Zmienne globalne deklaruje się przed blokiem funkcji main() Zmienne globalne są domyślnie inicjowane zerem. 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 30 10
Rzutowanie typów polega na konwersji jednego typu na drugi. float a = 3.34; // sposób pierwszy int b = (int) a; // rzutowanie zmiennej rzeczywistej na typ // całkowity - zmienna "b" przyjmie wartość 3 int c = int (a); // zauważmy, że rzutowanie wykonujemy poprzez // wpisanie w nawiasie zmiennej, a przed nią // typ, na który rzutujemy char znak = 'q'; cout<<znak<<": "<<(int)znak; //wyświetlenie kodu ASCII znaku q 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 31 Komentarze jedno-liniowe // #include <iostream.h> // biblioteka wejścia-wyjścia Komentarze wielo-liniowe (blokowe) /* */ /* początek komentarza blokowego #include <iostream.h> Koniec komentarza blokowego */ Komentarze zagnieżdżone /* początek komentarza blokowego #include <iostream.h> // komentarz jedno-liniowy Koniec komentarza blokowego */ 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 32 Dyrektywa include nakazuje wstawić plik nagłówkowy. Plik, podany jako argument, umieszczamy, w zależności od jego lokalizacji, w <> lub "". Plik podany w <> jest wyszukiwany w katalogu, który jest zarejestrowany przez kompilator jako katalog z plikami nagłówkowymi #include <nazwa_pliku> Plik podany w "" jest szukany w bieżącym katalogu lub w podanej ścieżce dostępu. #include "nazwa_pliku" 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 33 11
Biblioteka iostream (input/output stream) jest standardową biblioteką wejścia/wyjścia w C++. Pozwala na: Wyświetlanie tekstu i zmiennych na ekranie (konsoli) za pomocą obiektu cout i operatora "<<" cout<< "Podaj liczbe calkowita:"; pobieranie danych z klawiatury i zapisywanie do zmiennych za pomocą obiektu cin i operatora ">>" cin>> zmiennadoliczbcalkowitych; // zmienna o nazwie zmiennadoliczbcalkowitych musi być wcześniej zdefiniowana Dodawania znaku nowej linii cout<< endl; 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 34 Dyrektywa using namespace musi być użyta w przypadku, gdy zamiast pliku iostream.h, będzie użyta iostream, w celu udostępnienia definicji zawartej w tym pliku. Jest w tym przypadku używana, aby nie pisać za każdym razem wywołanie obiektu cout czy cin z przedrostkiem std::. using namespace std; cout<< "Podaj nazwę"<< endl; Bez użycia przestrzeni nazw powyższy zapis przedstawia się następująco: std::cout<< "Podaj nazwę"<< std::endl; 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 35 Przykład odczytania podanych podczas uruchomienia programu dodatkowych parametrów funkcji głównej main(): 1. #include <iostream> 2. using namespace std; 3. int main(int argc, char* argv[]) { 4. cout << "argc = " << argc << endl; 5. for(int i = 0; i < argc; i++) 6. cout << "argv[" << i << "] = " << argv[i] << endl; 7. system("pause"); 8. return 0; 9. } 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 36 12
1. #include <iostream> 2. #include <cstdlib> 3. using namespace std; 4. int main(int argc, char* argv[]) { 5. for(int i = 1; i < argc; i++) 6. cout << atoi(argv[i]) << endl; 7. return 0; 8. } atoi( ) funkcja do konwersji znaków ASCII na zmienne typu int 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 37 1. #include <iostream> 2. using namespace std; 3. int a = 0; // zmienna globalna 4. int main( void ) 5. { 6. int a = 1; // zmienna lokalna 7. cout<< "Zmienna globalna a = "<<::a << endl; 8. cout<< "Zmienna lokalna a = "<< a << endl; 9. cout<< "\nkoniec programu..."; 10. return 0; 11. } 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 38 cin.get(); #include <iostream> using namespace std; cin.sync(); //kasowanie zbędnych znaków z bufora cin.get(); //oczekiwanie na wciśnięcie klawisza getchar(); #include <cstdio> using namespace std; getchar(); //oczekiwanie na wciśnięcie klawisza system("pause"); #include <cstdlib> using namespace std; system("pause"); //działa tylko w systemie Windows! 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 39 13
Windows Microsoft Visual Studio (Microsoft DreamSpark) Dev-C++ (http://orwelldevcpp.blogspot.com/) Windows/Linux/Mac OSX Eclipse (https://eclipse.org/) NetBeans (https://netbeans.org/) Code::Blocks (http://www.codeblocks.org/) Linux Geany KDevelop (https://www.kdevelop.org/) Mac OSX XCode 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 40 Tworzenie projektu z wykorzystaniem kompilatora Micorosoft Visual Studio. Napisanie prostego przykładu na wczytywanie i wypisywanie danych wprowadzonych przez użytkownika. 11/3/2016 Katedra Informatyki Stosowanej i Modelowania 41 Dziękuję za uwagę i zapraszam na 15 minut przerwy. W dalszej części ćwiczenia do samodzielnego wykonania. 11/3/2016 Katedra Informatyki Stosowanej i Modelowania 42 14
Zadanie 1 Stwórz projekt w Microsoft Visual Studio typu: Win32 Console Application Empty Project. W zbudowanych projektach należy wypisać dowolny tekst oraz przeprowadzić kompilację, budowanie oraz uruchomienie programu. Obie aplikacje powinny zatrzymać się po wypisaniu zadanego tekstu. 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 43 Zadanie 2 Napisz program pozwalający na wczytywanie i wypisywanie wprowadzonych przez użytkownika danych takich jak np.: Imię Nazwisko Wiek Wzrost Waga itp.. Aplikacja powinna zatrzymać się po wypisaniu zadanego tekstu. 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 44 Zadanie 3 Napisz program pozwalający na obliczenie odległości podanego przez użytkownika punktu od początku układu współrzędnych oraz od dowolnego innego punktu. Punkt zadany jest w postaci współrzędnej x oraz y. Uwaga: Odległość od początku układu liczona jest według wzoru: pierwiastek(x 2 +y 2 ). Odległość punktu A(x1,y1) od punktu B(x2,y2) liczona jest według wzoru: pierwiastek((x2-x1) 2 +(y2-y1) 2 ) Aby wykorzystać pierwiastek należy dołączyć do projektu bibliotekę <cmath> i użyć funkcję sqrt(). 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 45 15