S třední škola stavební Jihlava Sada 1 - Základy programování 13. Práce s řetězci - palindrom Digitální učební materiál projektu: SŠS Jihlava šablony registrační číslo projektu:cz.1.09/1.5.00/34.0284 Šablona: III/2 - inovace a zkvalitnění výuky prostřednictvím ICT Jaromír Železný 2013 Projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem České republiky
Strukturované datové typy pokud mají data určitou společnou vlastnost a jsou určitým způsobem organizována, říkáme o nich, že tvoří struktury Strukturované datové typy: 1) Řetězec 2) Pole a) jednorozměrné b) vícerozměrné (nejčastěji dvou-, tří-) 3) Záznam 4) Množina 5) Soubor
Řetězec znaků jeden znak = datový typ CHAR řetězec = datový typ STRING CHAR = jeden znak STRING = řetězec dlouhý 255 znaků při deklarování proměnné jako stringse vpaměti rezervuje (vyhradí) prostor pro 255 znaků, který můžeme využít
Řetězec znaků pokud jsme si ale jisti, že do dané proměnné nebudeme tak dlouhá řetězec ukládat, můžeme velikost rezervovaného prostoru upravit při deklaraci var Jmeno:String[15]; var Jmeno:String[15]; takto deklarovaná proměnné nebude mít vyhrazený prostor pro 255 znaků, ale pouze pro 15 znaků pokud bychom do této proměnné chtěli uložit delší řetězec, příkaz by vyvolal chybu.
Řetězec znaků znaky vřetězci jsou uloženy odděleně, můžeme k nim přistupovat jednotlivě každé políčko řetězce má svůindex = své pořadové číslo jednotlivé znaky můžeme vypisovat, ale také je měnit
Program TEST; Var jmeno:string[5]; Begin Jmeno:= Pavla ; Writeln (Jmeno); Writeln (Jmeno[1]); Writeln (Jmeno[2]); Writeln (Jmeno[3]); Writeln (Jmeno[4]); Writeln (Jmeno[5]); Writeln; Jmeno[4] := e ; Jmeno[5] := l ; Writeln (Jmeno); Readln; End. Řetězec znaků
Řetězec znaků funkce LENGTH(RETEZEC) vrací počet znaků v řetězci funkce CHR(CISLO)vrací znak podle hodnoty CISLO z tabulky ASCII funkce ORD(ZNAK) vrací číslo znaku ZNAK z tabulky ASCII funkce UPCASE(ZNAK) převede malé písmeno na velké funkce LOWERCASE(ZNAK)převede velké písmeno na malé (lze použít ve Free Pascalu v TP pomocí ORD(x) -32)
Tabulka ACSI kódů kód znak kód znak kód znak kód znak kód znak kód znak 32 mezera 48 0 64 @ 80 P 96 ` 112 p 33! 49 1 65 A 81 Q 97 a 113 q 34 '' 50 2 66 B 82 R 98 b 114 r 35 # 51 3 67 C 83 S 99 c 115 s 36 $ 52 4 68 D 84 T 100 d 116 t 37 % 53 5 69 E 85 U 101 e 117 u 38 & 54 6 70 F 86 V 102 f 118 v 39 ' 55 7 71 G 87 W 103 g 119 w 40 ( 56 8 72 H 88 X 104 h 120 x 41 ) 57 9 73 I 89 Y 105 i 121 y 42 * 58 : 74 J 90 Z 106 j 122 z 43 + 59 ; 75 K 91 [ 107 k 123 { 44, 60 < 76 L 92 \ 108 l 124 45 61 = 77 M 93 ] 109 m 125 } 46. 62 > 78 N 94 ^ 110 n 126 ~ 47 / 63? 79 O 95 _ 111 o 127 del Kódy s hodnotami 0 až 31 se většinou nezobrazují jako konkrétní znaky (to záleží na daném programu), jsou určeny jako řídící kódy pro různé periférie (monitor, tiskárna apod.) anebo mají konkrétní význam např. přechod textu na novou řádku, pípnutí apod.
Řetězec znaků funkce COPY(RETEZEC,INDEX,POCET) vrací POCET znaků do konce řetězce RETEZEC počínaje znakem na pozici INDEX funkce CONCAT(s1,[s2,, sn])spojuje řetězce s1, CONCAT(s1,[s2,, sn]) s2,, snv jeden řetězec, je-li výsledek delší než 255 znaků, je zkrácen na 255 znaků
Řetězec znaků procedura DELETE(RETEZEC,INDEX,POCET) odstraní POCET znaků z řetězce RETEZEC počínaje znakem na pozici INDEX procedura INSERT(ZDROJ,RETEZEC,INDEX) vloží do řetězce RETEZEC od pozice INDEX řetězec ZDROJ procedura STR(CISLO,RETEZEC) převede číslo CISLO na řetězec RETEZEC procedura VAL(RETEZEC,CISLO, Err_Code) převede řetězec RETEZEC na číslo CISLO
Řetězec znaků Př.: napište program, kterým převrátíme řetězec. Ve výstupu bude první znak na posledním místě, druhý na předposledním, a poslední znak způvodního řetězce bude na prvním místě.
Řetězec znaků - program Postup: 1. Stanovíme si, co má program dělat, tzn. si určíme, co má být vstupem a výstupem. Na vstupu je jakýkoliv řetězec o maximální délce 255 znaků. Na výstupu bude ten samý řetězec, ale zrcadlově převrácený. 2. Navrhneme algoritmus, tzn. si určíme postup. a) Nejprve se zjistíme délku vstupního řetězce, abychom věděli, jak dlouhý bude výstupní řetězec b) Pokud známe délku vstupního a výstupního řetězce, potom máme vyhráno a nyní již stačí pouze vzít poslední znak způvodního řetězce a umístit ho jako první znak řetězce nového. A toto nám právě umožňují indexy. c) Nakonec už jen vypíšeme výstupní řetězec, který je oproti vstupu zrcadlově převrácený
Řetězec znaků - program Postup : 3. Délka vstupního řetězce využijeme funkce LENGHT (=anglicky délka), výsledkem této funkce je číslo. Začátek kódu bude vypadat takto: var delka, poradi : integer; vstupni, vystupni: string; Begin writeln ( Zadej vstupni retezec (max 255 zna ku): ); readln(vstupni); delka := length(vstupni);
Řetězec znaků - program 4. Převrácení řetězce -využijeme toho, že známe délku řetězce, a tudíž víme, kolik znaků musíme přehodit z konce na začátek. Ktomu nám poslouží cyklus se známým počtem opakování (cyklus FOR). Posledním krokem je vypsání řetězce vystupni for poradi:=1 to delka do begin vystupni[poradi] := vstupni[delka poradi + 1]; vystupni := CONCAT (vystupni, vystupni[poradi]); {vystupni := vystupni + vystupni[poradi];} end; Writeln (vystupni);
Řetězec znaků - program Zastavme se u zmateného indexu vprvním přiřazovacím příkazu vlevo je sice index poradi, to bychom ještě pochopili, přece jen musíme projít celý řetězec, a proměnná poradije i vhlavičce cyklu FOR, ale na pravé straně máme najednou index [delka-poradi+1]. Je to pořadí znaku, který je zrcadlově převrácený ke znaku s indexem poradi. Ukážeme si to například na slově JELEN. Na konci by nám mělo vyjít slovo NELEJ. Délka obou řetězců je 5. poradi=1: Vystupni[1]:=Vstupni[5 1+1] Vystupni[1]:= Vstupni[5] poradi=2: Vystupni[2]:=Vstupni[5 2+1] Vystupni[2]:= Vstupni[4] poradi=3: Vystupni[3]:=Vstupni[5 3+1] Vystupni[3]:= Vstupni[3] poradi=4: Vystupni[4]:=Vstupni[5 4+1] Vystupni[4]:= Vstupni[2] poradi=5: Vystupni[5]:=Vstupni[5 5+1] Vystupni[5]:= Vstupni[1]
Řetězec znaků - program Program prevraceni; var delka, poradi : integer; vstupni, vystupni: string; Begin writeln ( Zadej vstupni retezec (maximalne 255 znaku): ); readln (vstupni); delka := length(vstupni); for poradi :=1 to delka do begin vystupni:= CONCAT(vystupni, vstupni[delka - poradi + 1]); end; writeln ( Prevraceny retezec:, vystupni); readln ; end. Úkol: Upravte předcházející program tak, aby testoval, zda je vstupní řetězec PALINDROM
Řetězec znaků PALINDROM Abychom zjistili, zda je dané slovo palindromem, stačí vpředcházejícím programu dopsat podmínku, která by testovala, jestli vstupní a výstupní řetězec je stejný. IF vstupni = vystupni THEN WRITELN ( Je to palindrom ) ELSE WRITELN ( Neni to palindrom );
Řetězec znaků Pokud bychom zjišťovali, zda je palindromem celá věta (např.: JELENOVI PIVO NELEJ), tak nám náš program v této podobě oznámí, že se o palindrom nejedná, neboť po převrácení bude výsledek JELEN OVIP IVONELEJ. Proto potřebujeme ze vstupního řetězce odstranit mezery. Můžeme toho dosáhnout například tím, že budeme v řetězci procházet znak po znaku, a pokud narazíme na mezeru, tak ji vynecháme. Vstup_original := vstupni ; Vstupni := ; FOR i:=1 to length(vstup_original) DO Begin IF vstup_original[i] <> THEN Vstupni := vstupni + vstup_original[i]; End; Writeln (vstupni);
Zdroje: TurboPascal 6.0 - příručka uživatele (help) Literatura: Radek HYLMAR: Programování pro úplné začátečníky, Computer Press, Brno, 2009, ISBN 978-80-251-2129-0 Januš DRÓZD, Rudolf KRYL: Začínáme s programováním, GRADA a.s., Praha, 1992, ISBN 80-85424-41-X Tomáš HRUŠKA: Pascal pro začátečníky, SNTL, Praha 1989, ISBN 80-03-00345-8 Materiál je určen k bezplatnému používání pro potřeby výuky a vzdělávání na všech typech škol a školských zařízení. Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je : Jaromír Železný Pokud není uvedeno jinak, byly při tvorbě použity volně přístupné internetové zdroje. Autor souhlasí se sdílením vytvořených materiálů a jejich umístěním na www.ssstavji.cz.