Úvod do programování 6. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015
Umíme z minulé hodiny Algoritmy Třídění pole: Selection sort, Insertion sort, Bubble sort Třídění pole omezených hodnot: Counting sort Binární vyhledávání v setříděném poli Syntax Globální proměnné Měření počtu operací Měření doby běhu programu Jan Lánský Úvod do programování 6. hodina 2
Cíle hodiny Syntax Znaky Vlastní implementace řetězcových algoritmů jsou výborné na procvičení schopností práce s polem Textové řetězce Algoritmy Lexikografické uspořádání Zřetězení, podřetězec Hledání indexu výskytu znaku, řetězce Vymazání, vložení a nahrazení znaku, řetězce Změna hodnoty znaku na pozici dané indexem Naše vlastní řetězce Jan Lánský Úvod do programování 6. hodina 3
Znaky V některých programovacích jazycích bývá char 8 bitů ASCII char - velikost 16 bitů UTF16 znak Znakové konstanty uzavřeny v apostrofech Př.: char c1 = 'a'; Každé znakové konstantě odpovídá celočíselná hodnota Př.: int i = c1; Ale nedělat char c2 = (char) 40; Uspořádané podposloupnosti: číslice, malá písmena, velká písmena Jan Lánský Úvod do programování 6. hodina 4
Znaky Každá znaková konstanta má celočíselnou hodnotu Kolikáté písmeno abecedy nebo kolikáté číslo? Převod písmen na velká písmena a na malá písmena. Nevyvolá chybu. Jan Lánský Úvod do programování 6. hodina 5
Typy znaků Některé znaky jsou zároveň řídící a oddělovače slov (například znaky pro odřádkování char.isletterordigit písmeno nebo číslo char.isletter písmeno char.islower malá písmena (a, b, c, ) char.isupper velká písmena (A, B, C, ) char.isdigit číslice (0, 1, 2, ) char.iscontrol řídící znaky ( ) char.ispunctuation interpunkce (? :, ) char.iswhitespace oddělovače slov (mezera, ) char.issymbol symboly (< = + ) Jan Lánský Úvod do programování 6. hodina 6
Typy Znaků Tabulka prvních 256 znaků včetně typu znaku. Prvních 128 znaků společné i 8-bitovým znakovým sadám Výpis abecedy malých písmen v cyklu Analogicky: velká písmena, čísla Jan Lánský Úvod do programování 6. hodina 7
Textové řetězce string pole znaků s konstantní hodnotou Hodnoty uzavřeny v uvozovkách Př.: string a = "ahoj"; a[0] až a[3] Př.: prázdný řetězec string s = "" Př.: string s =Console.ReadLine() Nelze přímo modifikovat prvky přes []. char uzavírá hodnoty do apostrofů Pomocí funkcí vytváříme nové řetězce (s použitím již existujících řetězců StringBuilder pole znaků s nekonstantní hodnotou (nebudeme probírat) Jan Lánský Úvod do programování 6. hodina 8
Textové řetězce Inicializace řetězce Načtení řetězce z klávesnice Převod řetězce na pole znaků Převod pole znaků na řetězec Délka řetězce Získání hodnoty znaku s daným indexem Neovlivní s2 Pole konstantních hodnot. Mohu přiřadit celé nové pole, ale ne modifikovat hodnoty prvků pole Přístup ke konkrétnímu znaku je jen pro čtení, hodnota znak nejde modifikovat pomocí [] Jan Lánský Úvod do programování 6. hodina 9
Funkce vracející bool Test, zda obsahuje zadaný řetězec Test rovnosti řetězců Test nerovnosti řetězců s2.contains("ova"); true 'o' 'v' 'a' 'N' 'o' 'v' 'a' 'k' "Novak"!= "novak"; true 'n' 'o' 'v' 'a' 'k' 'N' 'o' 'v' 'a' 'k' Jan Lánský Úvod do programování 6. hodina 10
Lexikografické uspořádání string.compare Nalezne nejnižší index, na kterém se hodnoty znaků liší. Menší znak určil menší řetězec. 0 řetězce se rovnají -1 první řetězec je menší 1 první řetězec je větší Pokud je jeden řetězec Compare("doga", s1); -1 prodloužením druhého řetězce, pak 'd' 'r' 'u' 'h' delší řetězec je větší 'd' 'o' 'g' 'a' Lexikografické = podobné abecedě. Ale liší se (malá, velká písmena) Compare("druhy", s1); 1 'd' 'r' 'u' 'h' 'd' 'r' 'u' 'h' 'y' Jan Lánský Úvod do programování 6. hodina 11
Indexy Index prvního (posledního) výskytu řetězce (znaku) v řetězci. Možno omezit pozice od které hledám a délku prohledávaného úseku První výskyt znaku První výskyt řetězce Poslední výskyt První 'b' od pozice 3 v úseku délky 1 nenalezeno Předposlední řádek: omezení pozice od které hledám Poslední řádek: navíc omezena i délka prohledávaného úseku První 'u' od pozice 2 je na 3 Poslední 'b' 4 První "ubu " 1 První 'u' 1 První pozice má index 0 'b' 'u' 'b' 'u' 'b' 'u' 'b' 'u' 'b' 'u' 'b' 'u' 'b' 'u' 'b' 'u' 'b' 'u' 'b' 'u' 'b' 'u' 'b' 'u' 'b' 'u' 'b' 'u' 'b' 'u' 0 1 2 3 4 5 Indexy pole s1 Jan Lánský Úvod do programování 6. hodina 12
Počet výskytů Taková funkce není, vytvoříme si jí Index posledního výskytu Hledáme od posledního výskytu doprava Šlo by testovat přímo poslední v hlavičce cyklu Končíme, nenalezli jsme další výskyt Jan Lánský Úvod do programování 6. hodina 13
Převod na malá a velká písmena ToUpper - velká písmena Převod = konverze ToLower - malá písmena Nevyvolá chybu, co nejde převést nechá být Lze volat i řetězcové hodnotě Aplikováno na s4, ale výsledek stejný jako by bylo aplikováno na s1 Volání funkcí: řetězec tečka funkce 'p' 'a' 'v' 'e' 'l' 'P' 'A' 'V' 'E' 'L' 'P' 'a' 'v' 'e' 'l' s4 "pavel" s4 "PAVEL" s1 "Pavel" Jan Lánský Úvod do programování 6. hodina 14
Zřetězení Zřetězení = konkatenace: Nový řetězec obsahuje první zadaný řetězec následovaný druhým zadaným řetězcem + operátor zřetězení Zřetězit lze i řetězec se znakem s2 "Novak" s1 "Pavel" ' ' 'P' 'a' 'v' 'e' 'l' 'N' 'o' 'v' 'a' 'k' 'P' 'a' 'v' 'e' 'l' ' ' 'N' 'o' 'v' 'a' 'k' " " s1 + " " + s2 Jan Lánský Úvod do programování 6. hodina 15
Podřetězec souvislá část řetězce Podřetězec Podřetězec začínající na pozici zadané indexem a končící na konci řetězce s3.substring(6,3) "Nov" s3.substring(6) "Novak" 'N' 'o' 'v' 'N' 'o' 'v' 'a' 'k' 'P' 'a' 'v' 'e' 'l' ' ' 'N' 'o' 'v' 'a' 'k' 0 1 2 3 4 5 6 7 8 9 10 První pozice má index 0 Indexy pole s3 Podřetězec začínající na pozici zadané indexem a mající zadanou délku Chyba: pokud index + délka > Length s3 "Pavel Novak" Jan Lánský Úvod do programování 6. hodina 16
Vložení Vložení: na pozici zadanou indexem vloží zadaný řetězec. Znaky původního řetězce posune. Vložení doprostřed řetězce Vložení nakonec řetězce s3.insert(6, "je") "Pavel je Novak" 'P' 'a' 'v' 'e' 'l' ' ' 'j' 'e' ' ' 'N' 'o' 'v' 'a' 'k' 'P' 'a' 'v' 'e' 'l' ' ' 'N' 'o' 'v' 'a' 'k' 0 1 2 3 4 5 6 7 8 9 10 11 12 První pozice má index 0 Indexy pole s3 Zelená posun Červená - vložení s3 "Pavel Novak" Jan Lánský Úvod do programování 6. hodina 17
Odstranění Odstranění: V řetězci nalezne podřetězec určený svým začátkem (a délkou). Nalezený řetězec odstraní. Zbylé znaky posune. 'P' 'a' ' ' 'N' 'o' 'v' 'a' 'k' 'P' 'a' 'v' 'e' 'l' 'P' 'a' 'v' 'e' 'l' ' ' 'N' 'o' 'v' 'a' 'k' 0 1 2 3 4 5 6 7 8 9 10 První pozice má index 0 Zelená posun Indexy pole s3 Zadaný index začátku odstraňovaného řetězce s3.remove(5) "Pavel" Zadaný index začátku a délka odstraňovaného podřetězce Chyba: pokud index + délka > Length s3.remove(2, 3) "Pa Novak" s3 "Pavel Novak" Jan Lánský Úvod do programování 6. hodina 18
Nula nahrazení není chyba Nahrazení Vymazání: Replace("retezec", "") Nahrazení: V řetězci nalezne podřetězec určený hodnotou, ten odstraní a na místo jeho bývalého začátku vloží jiný podřetězec. Opakuje pro všechny výskyty. První podřetězec je nahrazen druhým Stejné jako předchozí řádek Místo řetězců můžou být jen znaky s3.replace('v', 'w') s3.replace("pavel", "Petr") 'P' 'a' 'w' 'e' 'l' ' ' 'N' 'o' 'w' 'a' 'k' 'P' 'e' 't' 'r' ' ' 'N' 'o' 'v' 'a' 'k' 'P' 'a' 'v' 'e' 'l' ' ' 'N' 'o' 'v' 'a' 'k' s3 "Pavel Novak" Zelená posun Červená - výměna Jan Lánský Úvod do programování 6. hodina 19
Změna hodnoty znaku v řetězci String je pole znaků s konstantní hodnotou Nelze použít zápis s[0] = 'a' Přesto chceme hodnoty znaků někdy měnit Tři možná řešení Naše volba Využití funkce Substring Konverze na pole znaků a zpět Konverze na StringBuilder a zpět Jan Lánský Úvod do programování 6. hodina 20
Změna hodnoty znaku Podřetězec, který začíná na začátku řetězce a končí před zadaným indexem Vše spojíme Podřetězec, který začíná na za zadaným indexem a končí na konci řetězce 'a' s1 'v' hodnota 's' ' s2 ' 'o' 'a' 'v' 'e' 's' ' ' 'o' 'a' 'v' 'e' 's' ' ' 'o' 0-1 index +1 Len Jan Lánský Úvod do programování 6. hodina 21
Změna hodnoty znaku - Ukázka Novak Horal index = 2 hodnota 'r' s1 Od pozice 0 počet prvků 2 'H' 'o' 'r' 'a' 'k' 'H' 'o' 'v' 'a' 'k' 0 1 2 3 4 s2 Od pozice 3 do konce řetězce Jan Lánský Úvod do programování 6. hodina 22
Funkce Split Nyní nebudeme ještě používat, až později string[] string.split(char[]) Rozdělí řetězec na disjunktní podřetězce podle oddělovačů zadaných v poli Vrací pole řetězců Problém Při dělení na slova, čísla nejde vyjmenovat všechny myslitelné oddělovače. Znak, se kterým jsme nepočítali. Tj. pole polí. Na nás zatím moc složité Jan Lánský Úvod do programování 6. hodina 23
Ukázkový příklad spíše antipříklad V zadaném řetězci převeďte každé liché slovo na velká písmena a každé sudé slovo na malá písmena. Řešení na následujícím slajdu Není řešeno obecně, ale pro konkrétní řetězec (s hlavičkou by se nevešlo na slajd) Časová složitost může být vysoká (dle přesné implementace stringu) Iterativní přidávání znaků na konec Jan Lánský Úvod do programování 6. hodina 24
Ukázkový příklad řešení Až zkončí písmena bude změna velikosti velke zda je nyní slovo z velkých písmen prvni zda čekáme na první písmeno řetězce zmena zda při příštím nepísmenu máme změnit proměnnou velke Při prvním nepísmenu změna velikosti, Vytváříme nový řetězec přidáváním znaků nakonec Jan Lánský Úvod do programování 6. hodina 25
Naše řetězce char[] Pole znaků char[] může odsimulovat string Se znalostí minulých hodin snadno vytvoříme jednotlivé funkce, co má string Ukážeme si několik funkcí, zbytek bude na cvičení Jan Lánský Úvod do programování 6. hodina 26
Naše řetězce char[] Výpis na obrazovku znak po znaku Převod řetězce string na náš řetězec char[] Zřetězení, bude další slide Jan Lánský Úvod do programování 6. hodina 27
Naše řetězce char[] Vytvořit pole potřebné délky Do nového řetězce nakopírujeme první řetězec Druhý řetězec kopírujeme s posunem o délku prvního pole Jan Lánský Úvod do programování 6. hodina 28
Zpětná vazba Objevili jste ve slajdech chyby? Včetně pravopisných Nechápete nějaký slajd? Je příliš obtížný, nesrozumitelný? Máte nějaký nápad na vylepšení? Anonymní formulář Odeslání za pár vteřin http://goo.gl/forms/wxkzqbszls Jan Lánský Úvod do programování 6. hodina 29