Podstawy programowania - tjach.pltjach.pl/tresc/uploads/2014/11/w1.pdf · No to do roboty Często...

86
Podstawy programowania Łagodny start

Transcript of Podstawy programowania - tjach.pltjach.pl/tresc/uploads/2014/11/w1.pdf · No to do roboty Często...

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ń

*

Rzecz o wykonywaniu poleceń

*

Sposoby zapisu algorytmów

• Zwykły tekst, podobny do języka naturalnego Opis słowny

• Specjalny zestaw symboli graficznych

Schemat blokowy

• Pomieszanie „żargonu” informatycznego z matematycznym

Pseudokod

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

Operacje

Start

Stop Decy

zja

Operacje

wejścia/

wyjścia

Ilu programistów

potrzeba do

wymiany żarówki?

Dane wejściowe: uszkodzona

żarówka

Dane wyjściowe: światło w pokoju

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)

Nie od razu Kraków zbudowano

Ewaluacja

Czy działa? Czy działa dobrze?

Kodowanie

Esencja tego przedmiotu

Specyfikacja

Dane wejściowe, dane wyjściowe. Algorytmy.

Analiza problemu

Czy podołamy? Jakie dane musimy mieć? Czy ktoś już nie dokonał czegoś podobnego?

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 imie;

cin >> imie;

cout << „Nazywasz się „

<< imie << endl;

}

Kompilator

BANG!!!

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

Kompilator

BANG!!! Kod źródłowy Kod

wynikowy

Chyba, że:

1. Popełnimy błąd składniowy (syntax)

2. Zdarzy się coś wyjątkowego

No to do roboty

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?

Podejście standardowe

Podejście mniej standardowe

Podejście XXI wieku

Środowisko programistyczne

http://www.codeblocks.org/

Wersja z mingw-setup.exe !

Środowisko programistyczne

Tu piszemy kod.

Tu będą błędy.

Drz

ew

ko

plik

ów

.

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 main(…) {

}

int to skrót od

integer, czyli liczba

całkowita

main – nazwa funkcji

„głównej”

W nawiasach () –

parametry funkcji

W nawiasach {} –

ciało funkcji

Wszyscy kochamy

matematykę

f – nazwa funkcji

x – parametr wejściowy

Podnieść x do kwadratu i dodaj 13 – przepis na działanie funkcji

f(5) = 38

f(x) = x2 + 13

Wszyscy kochamy

matematykę

Wynik

Przepis na

działanie

Dane wejścio

we

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

Algorytm obliczania kosztów podróży

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

Schemat blokowy

spalanie := 5

kieszonkowe := 50

zakwaterowanie := 100

paliwo := 5.2

Start

Stop

Wczytaj

ileDni

Wczytaj

jakDaleko

koszt:= jakDaleko*paliwo*spalanie/100 +

ileDni * kieszonkowe +

ileDni * zakwaterowanie

Wypisz

koszt

Pojęcie zmiennej

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ć.

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

Algorytm obliczania kosztów podróży

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

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;