Podstawy programowania Łagodny start
mgr Tomasz Jach WWW: E-mail: Adres: Instytut Informatyki ul. Będzińska 39 41-200 Sosnowiec Pokój 214 Telefon: 32 3689765
Warunki zaliczenia Krótki test na ostatnim wykładzie 10 pytań jednokrotnego wyboru Skala ocen: o 5 pkt. -> 2.0 6 pkt. -> 3,0 7 pkt. -> 3,5 8 pkt. -> 4,0 9 pkt. -> 4,5 10 pkt. -> 5,0
Na początku były metody ręczne
Ewolucja
* Rzecz o wykonywaniu poleceń
*
Sposoby zapisu algorytmów Opis słowny Zwykły tekst, podobny do języka naturalnego Schemat blokowy Specjalny zestaw symboli graficznych Pseudokod Pomieszanie żargonu informatycznego z matematycznym
Opis słowny Cel: wymień żarówkę Wejście: niedziałające światło Wyjście: działające światło 1. Wyłącz prąd 2. Wykręć starą żarówkę 3. Wkręć nową żarówkę 4. Jeżeli nie działa, to zadzwoń po fachowca 5. Jeżeli działa, to zakończ.
Opis słowny Łatwy do odczytania przez laika Czytelny przy prostych programach Mało czytelny przy złożonych programach Zależny od języka naturalnego Nieprecyzyjny
Schemat blokowy Start Operacje Decy zja Stop Operacje wejścia/ wyjścia
Dane wejściowe: uszkodzona żarówka Dane wyjściowe: światło w pokoju Ilu programistów potrzeba do wymiany żarówki?
Schemat blokowy Bardziej zorganizowany zapis Czytelny przy większych programach Uniwersalny Potrzeba dużo papieru i miejsca Lekko nieprecyzyjny
Pseudokod Cel: wymień żarówkę Wejście: niedziałające światło Wyjście: działające światło 1. Power := false 2. Żarówka := nowa 3. IF NOT działa THEN zadzwoń po fachowca 4. ELSE zakończ.
Pseudokod Już bardzo zbliżony do kodu źródłowego Bardzo czytelny, ale po pewnej wprawie Uniwersalny Mało czytelny na pierwszy rzut oka
Pojęcie algorytmu Algorytm skończony zbiór ściśle określonych zasad postępowania prowadzących do rozwiązania dowolnego zadania z pewnej klasy zadań. Innymi słowy algorytm określa na jakich danych operujemy, oraz co z nimi należy zrobić, aby osiągnąć zamierzony cel أبو عبد هللا محمد بن موسى الخوارزمي
Algorytmy - problemy Na jakim poziomie abstrakcji kończyć? A co by było, gdyby? programowanie defensywne
Algorytmy formalnie Jednoznaczny przepis Dane wejściowe -> Dane wyjściowe Weryfikacja dostarczonych danych Determinizm
Ćwiczenie 1 1. Napisz algorytm gotowania rosołu (dla niegotującej części sali niech to będzie zalewanie zupki chińskiej)
Analiza problemu Czy podołamy? Jakie dane musimy mieć? Czy ktoś już nie dokonał czegoś podobnego? Specyfikacja Dane wejściowe, dane wyjściowe. Algorytmy. Kodowanie Esencja tego przedmiotu Ewaluacja Czy działa? Czy działa dobrze? Nie od razu Kraków zbudowano
Różnice w zapisie komputerowym #include <cstdlib> main() { string imie; cin >> imie; cout << Nazywasz się << imie << endl; } Kod źródłowy
Różnice w zapisie komputerowym #include <cstdlib> main() { string BANG!!! imie; cin >> imie; cout << Nazywasz się << imie << endl; } Kompilator
Różnice w zapisie komputerowym 11101011 1010101110101000110101010 101011100010101110100101 10100001010100111010101 10100101000010101 10101010101010 0000111110101 Kod wynikowy
Rodzaje języków programowania Wysokiego poziomu C/C++ C# Java PHP.. Nieskopoziomowe Assembler i inne assemblerowate
Rodzaje języków programowania Wysokiego poziomu Połączenie składni matematycznej, angielskiej i syntetycznej Nieskopoziomowe Zbliżone do wewnętrznej reprezentacji komputera
Języki ezoteryczne ++++++++++ [ >+++++++>++++++++++>+++>+<<<<- ] Na początek ustawiamy kilka przydatnych później wartości >++. drukuje 'H' >+. drukuje 'e' +++++++. drukuje 'l'. drukuje 'l' +++. drukuje 'o'
Języki ezoteryczne Whitespace
TXT -> EXE Kod źródłowy BANG!!! Kod wynikowy Chyba, że: 1. Popełnimy błąd składniowy (syntax) 2. Zdarzy się coś wyjątkowego Kompilator
Często wybieram się w podróże samochodem. Zarabiam mało, a chciałbym sporo zobaczyć. Muszę zaplanować budżet. Na budżet składają się wydatki na benzynę, zakwaterowanie oraz kieszonkowe Samochód pali średnio 5 litrów / 100 km, zaś dystans do pokonania różni się w zależności od podróży Kieszonkowe i zakwaterowanie zależy od tego ile dni zostanę. Zwykle przyjmuję 100 zł na nocleg dziennie i 50 zł kieszonkowego na dzień Ile wydam na weekend 200 km poza domem? No to do roboty
Podejście standardowe
Podejście mniej standardowe
Podejście XXI wieku
Środowisko programistyczne http://www.codeblocks.org/ Wersja z mingw-setup.exe!
Drzewko plików. Środowisko programistyczne Tu piszemy kod. Tu będą błędy.
A co ja właściwie napisałem?
Biblioteka standardowa limits.h - makra określające granice dla typów ścisłych cmath.h - funkcje matematyczne cstdio.h - operacje wejścia/wyjścia cstdlib.h - zespół funkcji użytkowych string.h - funkcje operujące na tablicach znaków time.h - narzędzia do odczytywania, interpretacji i prezentacji czasu iostream.h obsługa wejścia/wyjścia
A co ja właściwie napisałem? Nie wszystko jest dostępne od razu Nie wszystko ma jednoznaczną nazwę
Przestrzenie nazw Nie trzeba pisać: using namespace std; Ale bez tego trzeba używać modyfikatora przestrzeni nazw przed większością funkcji: std::cout << Coś << std::endl;
Dobry programista, to leniwy programista.
A co ja właściwie napisałem?
A co ja właściwie napisałem? int to skrót od integer, czyli liczba całkowita main nazwa funkcji głównej int main( ) { } W nawiasach () parametry funkcji W nawiasach {} ciało funkcji
Wszyscy kochamy matematykę f(x) = x 2 + 13 f nazwa funkcji x parametr wejściowy Podnieść x do kwadratu i dodaj 13 przepis na działanie funkcji f(5) = 38
Wszyscy kochamy matematykę Dane wejścio we Przepis na działani e Wynik
A co ja właściwie napisałem? Return oznacza powrót. W tym przypadku wyjście z programu. Dla chętnych proszę sobie doczytać czemu 0?
Kompilowanie
Dane wejściowe: Stałe: samochód pali 5l / 100 km; kieszonkowe: 50 zł/dzień; zakwaterowanie: 100zł/dzień Zmienne: liczba dni, liczba kilometrów Dane wyjściowe: koszt wycieczki 1. Wczytaj od użytkownika ile kilometrów ma jego wycieczka. 2. Wczytaj od użytkownika na ile dni jedzie 3. Oblicz całkowity koszt wycieczki 4. Wypisz koszt na ekran Algorytm obliczania kosztów podróży
Schemat blokowy Start spalanie := 5 kieszonkowe := 50 zakwaterowanie := 100 paliwo := 5.2 Wypisz koszt Wczytaj iledni Stop Wczytaj jakdaleko koszt:= jakdaleko*paliwo*spalanie/100 + iledni * kieszonkowe + iledni * zakwaterowanie
Zmienna element programu przechowujący określone wartości w pamięci operacyjnej. Każda zmienna posiada: Swoją nazwę która musi być unikatowa w obrębie danego fragmentu programu. Swój typ określający jakie wartości (i z jakiego zakresu) zmienna może przechowywać. Pojęcie zmiennej
Zmienne Dobrze: Suma suma _15suma druga_suma TrzeciaSuma Źle: 44suma WyyNicZ3k DooDaaWAnIa
Typy zmiennych Typ zmiennej określa rodzaj (i wielkość) danych w niej zawartych Kilka popularniejszych: int double float void long int
Typy zmiennych Typ zmiennej określa rodzaj (i wielkość) danych w niej zawartych Kilka popularniejszych: Int liczba całkowita Double liczba zmiennoprzecinkowa Float - liczba zmiennoprzecinkowa Void nic long int długa liczba całkowita
Dane wejściowe: Stałe: samochód pali 5l / 100 km; kieszonkowe: 50 zł/dzień; zakwaterowanie: 100zł/dzień Zmienne: liczba dni, liczba kilometrów Dane wyjściowe: koszt wycieczki 1. Wczytaj od użytkownika ile kilometrów ma jego wycieczka. 2. Wczytaj od użytkownika na ile dni jedzie 3. Oblicz całkowity koszt wycieczki 4. Wypisz koszt na ekran Algorytm obliczania kosztów podróży
Słówko const to deklaracja stałej. Jej wartość pozostaje niezmienna w całym programie.
cout << oraz cin >> to operatory strumieniowe. Nazwy pochodzą od wejścia i wyjścia, strzałki natomiast określają kierunek. Klawiatura (cin) >> zmienna Ekran << Zmienna/Stała Każdy napis oparujemy w cudzysłowy. Jak widać można łańcuchować strumienie endl określa nam koniec linii
Jeżeli wewnątrz łańcucha znakowego ma wystąpić znak cudzysłowu, należy go wpisać z poprzedzającym znakiem \ (backslash): Hans Kloss zwany \ J23\
Mnożenie (*), dzielenie (/), odejmowanie (-) i dodawanie (+) mają takie same reguły jak w matematyce. Przypisanie (=) sprawia, że to co stoi po lewej stronie uzyskuje wartość tego, co stoi po prawej Dlaczego napisałem 100.0 a nie 100?
Wartości zmiennych wypisujemy w taki sam sposób jak napisy. Każdy napis opatrujemy w cudzysłowy. Jak widać można łańcuchować strumienie endl określa nam koniec linii
Uporządkujmy wiedzę Identyfikatory Separatory Komentarze Typy proste Operatory
Identyfikatory Czyli nazwy. Występują bardzo powszechnie: Nazwy zmiennych Nazwy funkcji Nazwy stałych Identyfikatory są arbitralnie wybranymi nazwami dla zmiennych, funkcji, definiowanych przez programistę typów danych itp. Nie mogą być jednak słowami kluczowymi.
Identyfikatory Nazwy powinny rozpoczynać się od litery (znak podkreślenia to też litera) Nie mogą rozpoczynać się od cyfry Polskie znaki diakrytyczne to nie litery! Małe i wielkie litery są rozróżniane: zmienna Zmienna zmienna Gorąco zachęcam do stosowania tzw. camelcasenotation
Identyfikatory Nie wszystkie nazwy są dostępne. Nie można nazywać ich tak samo jak zastrzeżone słowa kluczowe:
Separatory Nawiasy kwadratowe [ ] wykorzystywane są do deklarowania i odwoływania się do tablic. int tablicazmiennych[10]; Nawiasy okrągłe ( ) wykorzystywane są do grupowania wyrażeń, izolowania wyrażeń warunkowych, wskazują wywołanie funkcji i jej parametry. double x1 = (-b+sqrt(delta)) /(2*a);
Separatory Nawiasy klamrowe { } oznaczają początek i koniec instrukcji złożonej, zwanej również blokiem. { } cin << zmienna; cout >> zmienna; Średnik ; jest znakiem kończącym instrukcję.
Separatory Spacje rozdzielają instrukcje. Podobnie jak entery i tabulatory. Kompilator wymaga tylko pojedynczej przerwy. Ale co się czyta lepiej?
Komentarze Komentarze służą głównie do dwóch celów Tłumaczenia co trudniejszych fragmentów kodu Tymczasowego wyłączania fragmentów programu //to jest komentarz jednolinijkowy /* A to komentarz który rozciąga się na wiele linii Nie można go zagnieżdżać/*
Komentarze Komentarze powinny mieć sens! To sensu nie ma: double paliwo; //zmienna zmiennoprzecinkowa paliwo int counter; //licznik Ale to ma: int counter; /* Licznik tych linii pliku, które zawieraj wzorzec */ float paliwo; /* Zmienna przechowuje ilość paliwa zużytego przez pojazd */ float delta; /* Wyróżnik trójmianu kwadratowego */
Typy proste Typy arytmetyczne: całkowite (podstawowe): char znakowy, int całkowity, bool logiczny wyliczeniowe; zmiennopozycyjne (podstawowe): float pojedyncza precyzja, double podwójna precyzja. Typ void. Typy wskaźnikowe itd.
Typ char Krótka liczba całkowita. Używana zwykle do przechowywania pojedynczych znaków (liter, cyfr, itp.) Wartość zmiennej znakowej to liczba całkowita równa kodowi danego znaku. Zajmuje mniej miejsca w pamięci komputera jakiś jeden bajt
Typ char Wartość zmiennej znakowej to liczba całkowita równa kodowi danego znaku: cout << Czy kontynuować? (T/N) << endl; char wybor; cin >> wybor; Ale można i tak: char c = 'A'; char d; d = c + 1; cout << c; // Wyprowadza literę A cout << d; // Wyprowadza literę B
Typ char kody ASCI char znak = 'A'; cout << znak; // Wyprowadza literę A cout << (int) znak; //wyjdzie 65
Typ char kody ASCI
Typ int To po prostu liczba całkowita. Zapisywana wraz ze znakiem (+/-)
Typ int To po prostu liczba całkowita. Zakres to +/- 2 miliardy. int liczba = 5; int drugaliczba = liczba 2; Co wyjdzie? int trzecia; cout << trzecia; A tutaj? int duzaliczba = 2147483647; duzaliczba = duzaliczba + 1; cout << duzaliczba;
Typ int Liczby możemy zapisywać w różnych systemach liczenia. int liczba = 5; int drugaliczba = 065; //ósemkowo int trzecia = 0xFF; //szesnastkowo
Operatory Wracamy do podstawówki i uczymy się: + dodawać - odejmować * mnożyć / dzielić % liczyć resztę z dzielenia
Operatory Dzielenie działa różnie w zależności od operandów: int a=5, b=2; float c=5.0, d=2.0; cout << a / b << << c/d; Żeby to pierwsze działało jak trzeba: cout << (float) a/b;
Operatory Reszta z dzielenia (operator modulo) int a=5, b=2; float c=5.0, d=2.0; cout << a % b; int liczba; cin >> liczba; if( liczba % 2 == 0) cout << Parzysta ;
Operatory relacji i logiczne Operatory relacji służą do porównywania dwóch lub więcej wartości > większe < mniejsze >= większe lub równe <= mniejsze lub równe Operatory porównania == równe (UWAGA: podwójne równa się)!= różne Operatory logiczne: && (and, oraz) (or, lub)! (not, nie)
Operatory relacji i logiczne Wyrażenia połączone tymi operatorami oblicza się od lewej do prawej, koniec obliczeń następuje natychmiast po określeniu wartości logicznej wyrażenia. Operatory relacji mają wyższy priorytet niż operatory porównania. Priorytet operatora && jest wyższy niż a oba są niższe niż operatorów relacji i porównania. Albo nauczysz się priorytetów albo użyjesz nawiasów.
Operatory (in/de)krementacji Inkrementacja to zwiększenie wartości o 1. Poniższe zapisy są równoznaczne: int a; a = a + 1; // to samo co: a++; a = a 1; a--;
Operatory inkrementacji/dekrementacji Operator inkrementacji (++) zwiększa wartość zmiennej o jeden, podczas gdy operator dekrementacji (--) zmniejsza wartość zmiennej o jeden. Oba operatory mogą występować w dwóch formach: Przedrostkowej (++x). Przyrostkowej (x++). Obie postacie powodują zwiększenie zapamiętanej w zmiennej wartości o jeden, ale w przypadku formy przedrostkowej odbywa się to przed jej wykorzystaniem (przed zwróceniem jej wartości), a w przypadku formy przyrostkowej dopiero po wykorzystaniu danej zmiennej.
Operatory inkrementacji/dekrementacji
Operatory inkrementacji/dekrementacji Wynik:
Operator przypisania Operator przypisania to przekopiowanie wartości jednej zmiennej do drugiej. Kopiować możemy tylko typy proste (z drobnymi wyjątkami, ale to nie temat na dziś). Operator przypisania jest lewostronnie łączny. Czyli po ludzku: int i = 5, j, k, l; j = k = l = i; Po raz kolejny zwracam uwagę na różnicę pomiędzy = (przypisaniem) oraz == (porównaniem)!
Operator przypisania Operator przypisania może skracać niektóre zapisy. Zamiast pisać: i = i + 10; Zapiszemy: i+=10; Można tak robić z: * / + - % i/=2 -> i = i / 2;