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
[email protected] 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 další typy: desetinné číslo další typy: logická hodnota znak výčtový typ struktura
int System.Int32 32 bitů byte, sbyte, short, ushort, uint, long, ulong double System.Double 64 bitů float, decimal bool char System.Char 16 bitů Unicode enum 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 i i i i př.:
+= -= *= /= %=
10; 10; 10; 10; 10;
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 - relační operátory:
- logické spojky && || & | ! ^
Pavel Töpfer, 2016
b = 18;
== != < > <= >=
and (zkrácené vyhodnocování) or (zkrácené vyhodnocování) and (úplné vyhodnocování) or (úplné vyhodnocování) not xor
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