Ú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
Úvod do programování 6. hodina 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
Úvod do programování 6. hodina Cíle hodiny Syntax Znaky 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 Vlastní implementace řetězcových algoritmů jsou výborné na procvičení schopností práce s polem Jan Lánský Úvod do programování 6. hodina
Znaky char - velikost 16 bitů – UTF16 znak 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
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
Úvod do programování 6. hodina 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
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
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 []. 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) char uzavírá hodnoty do apostrofů Jan Lánský Úvod do programování 6. hodina
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 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í [] Neovlivní s2 Jan Lánský Úvod do programování 6. hodina
Funkce vracející bool 'o' 'v' 'a' 'N' 'k' 'n' 'o' 'v' 'a' 'k' 'N' Test, zda obsahuje zadaný řetězec Test rovnosti řetězců Test nerovnosti řetězců s2.Contains("ova"); true "Novak" != "novak"; true 'o' 'v' 'a' 'N' 'k' 'n' 'o' 'v' 'a' 'k' 'N' Jan Lánský Úvod do programování 6. hodina
Lexikografické uspořádání string.Compare Nalezne nejnižší index, na kterém se hodnoty znaků liší. Menší znak určil menší řetězec. Lexikografické = podobné abecedě. Ale liší se (malá, velká písmena) 0 – řetězce se rovnají -1 první řetězec je menší 1 první řetězec je větší Pokud je jeden řetězec prodloužením druhého řetězce, pak delší řetězec je větší Compare("doga", s1); -1 Compare("druhy", s1); 1 'd' 'r' 'u' 'h' 'o' 'g' 'a' 'd' 'r' 'u' 'h' 'y' Jan Lánský Úvod do programování 6. hodina
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í 'b' od pozice 3 v úseku délky 1 nenalezeno První výskyt řetězce Poslední výskyt První 'u' od pozice 2 je na 3 'b' 'u' 1 2 3 4 5 Poslední 'b' 4 Předposlední řádek: omezení pozice od které hledám Poslední řádek: navíc omezena i délka prohledávaného úseku První "ubu " 1 První 'u' 1 První pozice má index 0 Indexy pole s1 Jan Lánský Úvod do programování 6. hodina
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
Převod na malá a velká písmena Převod = konverze ToUpper - velká písmena ToLower - malá písmena Nevyvolá chybu, co nejde převést nechá být Volání funkcí: řetězec tečka funkce Lze volat i řetězcové hodnotě 'p' 'a' 'v' 'e' 'l' 'P' 'A' 'V' 'E' 'L' s4 "pavel" s4 "PAVEL" Aplikováno na s4, ale výsledek stejný jako by bylo aplikováno na s1 s1 "Pavel" Jan Lánský Úvod do programování 6. hodina
Zřetězení 'N' 'o' 'v' 'a' 'k' ' ' 'P' 'e' 'l' 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" 'N' 'o' 'v' 'a' 'k' ' ' 'P' 'e' 'l' " " s1 + " " + s2 Jan Lánský Úvod do programování 6. hodina
Podřetězec Podřetězec – souvislá část řetězce Podřetězec začínající na pozici zadané indexem a končící na konci řetězce Podřetězec začínající na pozici zadané indexem a mající zadanou délku Chyba: pokud index + délka > Length s3.Substring(6,3) "Nov" 'N' 'o' 'v' 'a' 'k' 'P' 'e' 'l' ' ' 1 2 3 4 5 6 7 8 9 10 s3.Substring(6) "Novak" První pozice má index 0 Indexy pole s3 s3 "Pavel Novak" Jan Lánský Úvod do programování 6. hodina
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' 'N' 'o' 'k' 1 2 3 4 5 6 7 8 9 10 11 12 Zelená – posun Červená - vložení Indexy pole s3 První pozice má index 0 s3 "Pavel Novak" Jan Lánský Úvod do programování 6. hodina
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. Zadaný index začátku odstraňovaného řetězce Zadaný index začátku a délka odstraňovaného podřetězce Chyba: pokud index + délka > Length Zelená – posun 'P' 'a' ' ' 'N' 'o' 'v' 'k' 'e' 'l' 1 2 3 4 5 6 7 8 9 10 s3.Remove(2, 3) "Pa Novak" s3.Remove(5) "Pavel" První pozice má index 0 s3 "Pavel Novak" Indexy pole s3 Jan Lánský Úvod do programování 6. hodina
Nahrazení 'P' 'a' 'w' 'e' 'l' ' ' 'N' 'o' 'k' 't' 'r' 'v' 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("Pavel", "Petr") s3.Replace('v', 'w') 'P' 'a' 'w' 'e' 'l' ' ' 'N' 'o' 'k' 't' 'r' 'v' Zelená – posun Červená - výměna s3 "Pavel Novak" Jan Lánský Úvod do programování 6. hodina
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í Využití funkce Substring Konverze na pole znaků a zpět Konverze na StringBuilder a zpět Naše volba Jan Lánský Úvod do programování 6. hodina
Úvod do programování 6. hodina Změna hodnoty znaku Podřetězec, který začíná na začátku řetězce a končí před zadaným indexem Podřetězec, který začíná na za zadaným indexem a končí na konci řetězce Vše spojíme 'a' … 'v' hodnota 's' ' ' 'o' 'e' -1 index +1 Len s1 s2 Jan Lánský Úvod do programování 6. hodina
Změna hodnoty znaku - Ukázka Novak Horal index = 2 hodnota 'r' 'H' 'o' 'r' 'a' 'k' 'v' 1 2 3 4 s2 Od pozice 3 do konce řetězce s1 Od pozice 0 počet prvků 2 Jan Lánský Úvod do programování 6. hodina
Funkce Split string[] string.Split(char[]) Problém 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
Úvod do programování 6. hodina 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
Ukázkový příklad řešení 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 Až zkončí písmena bude změna velikosti 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
Úvod do programování 6. hodina 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
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
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
Úvod do programování 6. hodina 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