Podstawy programowania - tjach.pltjach.pl/tresc/uploads/2014/11/w1.pdf · No to do roboty Często...
Transcript of Podstawy programowania - tjach.pltjach.pl/tresc/uploads/2014/11/w1.pdf · No to do roboty Często...
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
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
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'
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?
Środowisko programistyczne
http://www.codeblocks.org/
Wersja z mingw-setup.exe !
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
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;
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
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?
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ć.
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
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
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 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.
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)!