1. Úvodní informace BI-EP1 Efektivní programování 1 ZS 2011/2012 Ing. Martin Kačer, Ph.D. 2010-11 Martin Kačer Katedra teoretické informatiky Fakulta informačních technologií České vysoké učení technické v Praze Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
O předmětu
Účel Praktické procvičení algoritmů aneb jak psát programy Rychle Přehledně Efektivně Bez chyb (pokud možno ) a stále tak trochu experiment Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 3
Naše cíle Naučit se programovat odstraňovat chyby (ještě lépe: nedělat) přemýšlet!!! Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 4
ACM Contest International Collegiate Programming Contest (ICPC) Prestižní soutěž v programování Statisíce studentů 2000 univerzit 82 zemí ze 6 kontinentů Týmová Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 5
ACM ICPC x BI-EP1 Příklady ze soutěže Formát použitý v soutěži (ale nikoli v týmech) Cílem rozhodně není jen ICPC Algoritmy jsou obecné Soutěž nepovinná (ale doporučená ) Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 6
Forma Především řešení konkrétních úloh Rozsah 1+2 Jednou za 14 dnů přednáška Téměř každý týden cvičení (konzultace) Řešení úloh doma (to především!) Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 7
Náplň přednášek Přednáška Řešení problémů z minulého týdne Diskuze nad variantami Obecné postupy a algoritmy Zadání na další týden Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 8
Náplň cvičení Cvičení Pokračování přednášky Zhodnocení Zkoušení řešení u počítače Konzultace v případě potřeby Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 9
Hodnocení Pouze zápočet Řešení úloh Co nejvíc Samostatně Volitelný předmět!!! FÉROVOST!!! Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 10
Hrajte fér! Samostatně V podstatě jediná podmínka zápočtu Poctivě Internet pro obecné hledání ANO Internet pro konkrétní řešení NE! Internet pro zjištění vstupů NE! Porušení pravidel = okamžitý konec! Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 11
Vyhodnocovací systém
PCSS odevzdání řešení Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 13
PCSS zjištění výsledku Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 14
PCSS možné odezvy Jen pro poslední pokus! compile error program nejde přeložit runtime error chyba za běhu time limit exceeded pomalé/cyklí se wrong answer špatná odpověď presentation error asi chyba formátu accepted úspěšně odevzdáno Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 15
PCSS výsledky ostatních Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 16
O řešení úloh
Jaké chceme řešení Správné Vždycky správné! Stabilní Efektivní Rychle hotové!!! V JEDNODUCHOSTI JE SÍLA!!! Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 18
Jednoduché = dobré Rychle napsané Přehledné Méně chyb Často efektivnější ale samozřejmě ne vždy => Preferujeme jednoduché Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 19
V čem spočívá jednoduchost Zbytečně nepsat Zbytečně nepočítat Co nejméně speciálních případů Ale na žádný nezapomenout! Přehlednost Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 20
Přemýšlejme! První nápad nemusí být nejlepší První nápad nemusí být ani správný Proč to děláme zrovna tak? Kdy to (ne)bude fungovat? Výhoda automatického hodnocení Neřekne nám, proč je to špatně Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 21
Správnost algoritmu NELZE stoprocentně otestovat Nechceme zkoušet a DOUFAT Chceme VĚDĚT!!! Dokážete zdůvodnit volbu řešení? Umíte dokázat správnost? Bude to fungovat opravdu VŽDY? Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 22
Typické postupy
Povaha úloh Textové zadání Přesně popsaný vstup a výstup Nutno dodržovat Automatické vyhodnocování Úkolem je program, který správně řeší jakoukoli instanci problému! Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 24
Vícenásobné zadání Vstup s jediným příkladem V našich úlohách asi nebude Na začátku zadán počet příkladů Ukončení vstupu Konec souboru Speciální hodnota Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 25
Zpracování při známém počtu N Příklad 1 Příklad 2 Příklad N int n = readnumber(); for (int i = 0; i < n; ++i) { readoneproblem(); solveoneproblem(); printoneproblem(); } Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 26
Zpracování s detekcí konce A1 B1 A2 B2 0 0 for (;;) { int a = readnumber(), b = readnumber(); if (a == 0 && b == 0) break; solveoneproblem(a, b); printoneproblem(); } Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 27
Typické čtení v C/C++ Hodnoty oddělené mezerami - scanf Čísla Znaky Řetězce scanf( %d, &num); scanf( %d%d%d, &num1, &num2, &num3); scanf( %c%c, &char1, &char2); scanf( %s, string); /* proč tam není &string? */ /* proč se v normálních programech nepoužívá? */ Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 28
Čtení v C možné potíže Jaký je rozdíl v těchto zápisech? scanf( %d%d, &num1, &num2); scanf( %d %d, &num1, &num2); scanf( %d%d\n, &num1, &num2); scanf( %d%d, &num1, &num2); scanf( %c%c, &ch1, &ch2); scanf( %d%d, &num1, &num2); scanf( %i%i, &num1, &num2); Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 29
Čtení v C whitespace Přeskakování mezer Je-li zadána mezera Většina konverzí (kromě %c!!) 2 5 ABCDE FGHIJ 2 5 ABCDE FGHIJ scanf( %d%d, &num1, &num2); scanf( %c%c, &ch1, &ch2); ch1 ch2 newline! A scanf( %d%d\n, &num1, &num2); scanf( %c%c, &ch1, &ch2); ch1 ch2 A B Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 30
Čtení v C whitespace Přeskakování mezer Je-li zadána mezera Většina konverzí (kromě %c!!) 2 5 *** * * * 2 5 *** * * * scanf( %d%d, &num1, &num2); scanf( %c%c, &ch1, &ch2); ch1 ch2 newline mezera scanf( %d%d\n, &num1, &num2); scanf( %c%c, &ch1, &ch2); ch1 * ch2 * Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 31
Čtení v C whitespace Přeskakování mezer Je-li zadána mezera Většina konverzí (kromě %c!!) 3 7 scanf( %d%d, &num1, &num2); num1 3 num2 7 3 7 scanf( %c%c, &ch1, &ch2); ch1 3 ch2 mezera! Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 32
Čtení v C formát čísel V desítkové soustavě vždy %d!! i když je to obvykle jedno 12:05 08:45 scanf( %d:%d, &num1, &num2); scanf( %d:%d, &num3, &num4); num1 12 num2 5 num3 8 num4 45 08:45 scanf( %i:%i, &num3, &num4); num3 0 num4 nedefinováno! Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 33
Typické čtení Java O něco málo složitější StringTokenizer st = new StringTokenizer(""); BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String nexttoken() throws Exception { while (!st.hasmoretokens()) st = new StringTokenizer(input.readLine()); return st.nexttoken(); } int nextint() throws Exception { return Integer.parseInt(nextToken()); } Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 34
Typické čtení Java (jinak) Třída Scanner ALE POZOR NA RYCHLOST! import java.util.scanner Scanner sc = new Scanner(System.in); int i = sc.nextint(); double d = sc.nextdouble(); String s = sc.next(); Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 35
Čtení po řádcích C/C++ gets / fgets / getchar Uloží i newline!! Pozor na kombinaci se scanf! 2 ABCDE FGHIJ 2 ABCDE FGHIJ scanf( %d\n, &num); fgets(string, length, stdin); num 2 string ABCDE scanf( %d, &num); fgets(string, length, stdin); num 2 string prázdný! Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 36
Čtení po řádcích Java Pro změnu asi o něco jednodušší BufferedReader BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String nextline() throws Exception { return input.readline(); } Martin Kačer, BI-EP1, ZS 2011 1. Úvodní informace 37