NPRG031 Programování II --- 2/2 Z, Zk paralelka Y St 14:00-15:30 v S3 Pavel Töpfer Kabinet software a výuky informatiky MFF UK MFF Malostranské nám., 4. patro, pracovna 404 pavel.topfer@mff.cuni.cz http://ksvi.mff.cuni.cz/~topfer Pavel Töpfer, 2016 Programování II - 1 1
Plán na letní semestr Základní prostředky jazyka C# (příkazy datové typy, pole, řetězce, třídy, struktury, soubory, vlastnosti, rozhraní, kolekce, výjimky, ) Objektové programování Prostředí Visual Studio, druhy aplikací a jejich vývoj Událostmi řízené programování - ne detaily, od toho je předmět NPRG035 Jazyk C# a platforma.net (povinně volitelný ve 2. ročníku) Počítačová simulace, realizace simulačního modelu Dynamické programování Grafy reprezentace grafu v programu, programová realizace základních grafových algoritmů - částečný obsahový překryv se souběžně vyučovaným předmětem NTIN060 Algoritmy a datové struktury I (jiný pohled na věc) Pavel Töpfer, 2016 Programování II - 1 2
Literatura Pavel Töpfer: Algoritmy a programovací techniky, Prometheus Praha 1995, 2. vyd. 2007 Miroslav Virius: C# pro zelenáče, Neocortex Praha 2002 Eric Gunnerson: Začínáme programovat v C#, Computer Press Praha 2001 Jeft Kent: Visual C# 2005 bez předchozích znalostí, Computer Press Brno 2007 Pavel Töpfer, 2016 Programování II - 1 3
Užitečné odkazy http://www.cs.vsb.cz/behalek/vyuka/pcsharp/text/ studijní materiály VŠB TU Ostrava http://msdn.microsoft.com/en-us/vstudio/hh341490 download Visual Studio, tutoriály o C# a Visual Studiu http://www.microsoft.com/en-us/download/details.aspx?id=7029 C# Language Specification 5.0 http://artax.karlin.mff.cuni.cz/~mper7437/programovani/instalace2013.pdf stručný návod k instalaci Visual Studia Pavel Töpfer, 2016 Programování II - 1 4
Zápočet v LS - o udělení rozhoduje cvičící * domácí úkoly, příp. písemky, práce na cvičeních * zápočtový program v C# (náročnější než v ZS, s GUI) + písemná dokumentace k zápočtovému programu * praktický zápočtový test u počítače (odladění programu v C#) Zkouška v LS - k účasti na zkoušce není nutné předchozí získání započtu - zahrnuje i algoritmické učivo předmětu NPRG030 Programování I - část písemná a ústní (zkouška není u počítačů) * písemná část je praktická (vyřešení rozsáhlejšího algoritmického problému) * v ústní části diskuse o řešení písemky + teorie Pavel Töpfer, 2016 Programování II - 1 5
Přechod od Pascalu k jazyku C# Používání mezer a řádkování - volné, stejně jako v Pascalu - doporučená a prostředím podporovaná indentace Identifikátory - case-sensitivní (rozlišuje malá a velká písmena) - možnost používat diakritiku - klíčová slova malými písmeny - jména standardních tříd, metod a vlastností pascalská notace např. Math, DivideByZeroException, Main, WriteLine, - konvence pro vlastní identifikátory: proměnné malými písmeny, konstanty velkými písmeny, soukromé metody začínají malým písmenem = velbloudí notace, veřejné velkým písmenem = pascalská notace např. i, MAX, soucetcisel, SoucetCisel, Pavel Töpfer, 2016 Programování II - 1 6
Struktura programu Celý program se skládá ze tříd, vše se deklaruje a používá uvnitř tříd (proměnné, konstanty, funkce, ). Položky deklarované ve třídě: datové složky třídy = členské proměnné metody = členské funkce Prozatím: celý program je tvořen jedinou statickou třídou (její obsah tedy odpovídá celému pascalskému programu) Příště: jak jinak to může vypadat (a zpravidla vypadá) se třídami Pavel Töpfer, 2016 Programování II - 1 7
Proměnné - zápis deklarace syntaxe: int alfa; float a1, a2; - umístění deklarace: BUĎ členská proměnná třídy (tzn. datová složka objektu) NEBO lokální kdekoliv ve funkci, ale nesmí zakrýt jinou stejnojmennou deklaraci uvedenou v téže funkci (pozor na kolize!) - lokální platnost deklarace v bloku, kde je uvedena - možnost inicializace v rámci deklarace: int alfa = 15; - v programu nelze použít nedefinovanou hodnotu proměnné (kontrola při překladu) Pavel Töpfer, 2016 Programování II - 1 8
Konstanty - syntaxe jako inicializované proměnné, specifikátor const: const int ALFA = 15; - číselné konstanty podobné jako v Pascalu (různé typy) - konstanty typu char v apostrofech: a typu string v uvozovkách: aaa Pavel Töpfer, 2016 Programování II - 1 9
Typy Hodnotové - proměnná hodnotového typu obsahuje přímo uložená data (při dosazení se kopíruje hodnota) Referenční - proměnná referenčního typu obsahuje odkaz na svoje data (při dosazení se kopíruje pouze adresa) Dvě různé proměnné referenčního typu mohou odkazovat na stejný objekt. K němu pak lze přistupovat střídavě pomocí obou těchto proměnných. Pavel Töpfer, 2016 Programování II - 1 10
Hodnotové typy: celé číslo int System.Int32 32 bitů další typy: byte, sbyte, short, ushort, uint, long, ulong desetinné číslo double System.Double 64 bitů další typy: float, decimal logická hodnota bool znak char System.Char 16 bitů Unicode výčtový typ enum struktura struct Referenční typy: pole [ ] System.Array znakový řetězec string System.String třída class (standardní třídy, např. ArrayList, StringBuilder, List<>) Pavel Töpfer, 2016 Programování II - 1 11
Aritmetické výrazy - obvyklé symboly operací i priority stejné jako v Pascalu + - * / - symbol / představuje reálné i celočíselné dělení (zvolí se podle typu argumentů) - znak % pro modulo (zbytek po celočíselném dělení) - klíčová slova checked, unchecked určení, zda se má kontrolovat aritmetické přetečení v celočíselné aritmetice (implicitně se nekontroluje, počítá se modulo rozsah) - použití jako checked(výraz) nebo checked{blok} - standardní matematické funkce statické metody třídy Math Pavel Töpfer, 2016 Programování II - 1 12
Středník - ukončuje každý příkaz (musí být i za posledním příkazem bloku!) - nesmí být za blokem ani za hlavičkou funkce - odděluje sekce v hlavičce for-cyklu Čárka - odděluje deklarace více proměnných téhož typu - odděluje parametry v deklaraci funkce i při volání funkce - odděluje indexy u vícerozměrného pole Komentáře - víceřádkové /* xxx */ - jednořádkové // xxx do konce řádku - dokumentační /// xxx do konce řádku Blok (složený příkaz) - závorky { } místo pascalského begin end Pavel Töpfer, 2016 Programování II - 1 13
Dosazovací příkaz - syntaxe: proměnná = výraz; např. i = 2*i + 10; - příkaz modifikace hodnoty: i++; ++i; i--; --i; i += 10; i -= 10; i *= 10; i /= 10; i %= 10; př.: a += 2 * b[i++]; Pavel Töpfer, 2016 Programování II - 1 14
Podmíněný příkaz - podmínka = výraz typu bool v závorkách if (a == 5) b = 17; if (a == 5) b = 17; else b = 18; - relační operátory: ==!= < > <= >= - logické spojky && and (zkrácené vyhodnocování) or (zkrácené vyhodnocování) & and (úplné vyhodnocování) or (úplné vyhodnocování)! not ^ xor Pavel Töpfer, 2016 Programování II - 1 15
Cykly while a do-while - cyklus while stejný jako while-cyklus v Pascalu (podmínka je opět celá v závorce a nepíše se do ) while (podmínka) příkaz; - cyklus do-while má podmínku na konci jako cyklus repeat-until v Pascalu, ale význam podmínky je proti Pascalu obrácený, tzn. dokud podmínka platí, cyklus se provádí - více příkazů v těle cyklu musí být uzavřeno v bloku { } do příkaz while (podmínka); Pavel Töpfer, 2016 Programování II - 1 16
For-cyklus - syntaxe: for (inicializace; podmínka pokračování; příkaz iterace) příkaz těla for (int i = 0; i < N; i++) a[i] = 3*i+1; - příkaz iterace nemůže být blok { }, příkaz těla ano - pokud v sekci inicializace deklarujeme novou řídicí proměnnou, jejím rozsahem platnosti je tento for-cyklus - některá sekce může být prázdná (třeba i všechny) for (; i < N;) { } //while-cyklus for (;;) { } //věčný cyklus, přeruší break Pavel Töpfer, 2016 Programování II - 1 17
- sémantika for-cyklu for(a; B; C) D A; while (B) {D; C} Pavel Töpfer, 2016 Programování II - 1 18
Ukončení cyklu - příkazy break; continue; - stejný význam jako v Pascalu Pavel Töpfer, 2016 Programování II - 1 19
Příkaz switch - analogie pascalského příkazu case - varianta se může rozhodovat podle hodnoty výrazu celočíselného, typu char, výčtového typu nebo také typu string - sekce označeny case, za každým slovem case je jediná konstanta, ale pro více variant case může být společný blok příkazů - blok příkazů v sekci case není v závorkách { } - jednou sekcí (ne nutně poslední) může být default: - je povinnost ukončit každou sekci case (i sekci default) příkazem break, příp. return nebo goto (pozor: v C, C++, Javě se může propadat mezi sekcemi častý zdroj chyb!) Pavel Töpfer, 2016 Programování II - 1 20
int j, i =...; switch (i) { case 1: i++; break; case 2: case 3: i--; break; default: i=20; j=7; break; } Pavel Töpfer, 2016 Programování II - 1 21
Funkce - pascalské procedury a funkce metody (členské funkce) nějaké třídy - procedura funkce typu void - v deklaraci i při volání vždy píšeme ( ), i když nemá žádné parametry - na pořadí deklarací nezáleží (není třeba žádná deklarace forward) - ve funkci nelze lokálně definovat jinou funkci, strukturu nebo třídu, lze tam ale deklarovat lokální proměnné (ve třídě lze ovšem deklarovat jinou třídu a ta může mít své metody) Pavel Töpfer, 2016 Programování II - 1 22
- funkce mohou vracet i složitější typy (např. objekty) - return hodnota; definování návratové hodnoty a zároveň ukončení výpočtu funkce ( exit ), v případě funkcí typu void pouze: return; - předávání parametrů: hodnotou standardně odkazem specifikátor ref u parametru v hlavičce i při volání výstupní specifikátor out u parametru v hlavičce i při volání (out je také odkazem, nemusí ale mít vstupní hodnotu, v těle funkce se do něj musí dosadit hodnota) specifikátor ref nebo out se opakuje u každého parametru, který je tímto způsobem předáván Pavel Töpfer, 2016 Programování II - 1 23
static int Soucet(int a, int b, out bool velky) { velky = a + b > 1000; return a + b; } static void Main(string[] args) { bool v; int s = Soucet(15, 2394, out v); if (v) Console.WriteLine("velky {0}", s); else Console.WriteLine("maly {0}", s); } Pavel Töpfer, 2016 Programování II - 1 24
Výchozí metoda Main ( ) - plní funkci hlavního programu (určuje začátek a konec výpočtu) - je to statická metoda nějaké třídy (nic mimo třídy neexistuje) - často se pro ni vytváří samostatná třída - obvykle jediná v aplikaci je tak jednoznačně určeno, kde má začít výpočet - může jich být i více, pak se ale při kompilaci musí přepínačem specifikovat, ze které třídy se má použít Main() při spuštění programu - syntaxe: static void Main(string[] args) Pavel Töpfer, 2016 Programování II - 1 25
using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class Program { XXX FUNKCE XXX static void Main(string[] args) { XXX HLAVNÍ PROGRAM XXX } } } XXX FUNKCE XXX Pavel Töpfer, 2016 Programování II - 1 26