Programování v Pascalu Přednáška 7 RNDr. Hana Havelková
Řetězce Deklarace Deklarovaná a skutečná délka řetězce Přístup k jednotlivým znakům Porovnávání řetězců Spojování řetězců Typové konstanty Funkce a procedury pro práci s řetězci Řetězce jako parametry procedur a funkcí
Deklarace Reprezentace proměnné typu string [ délka ] délka 0 -255 znaků Reprezentace proměnné typu string jednorozměrné pole znaků indexované od 1 do N aktuální (skutečná) délka uloženého řetězce je zaznamenána v bytu s indexem 0 (formálně je obsah toho bytu typu char)
Příklady type TJmeno = string [20]; TNadpis = string [60]; TDen = string [2]; TPredmet = string [3]; var jmeno, prijmeni : TJmeno; predmet : TPredmet; veta : string; zahlavi, zapati : TNadpis ;
Přístup k jednotlivým znakům pomocí indexu var S : string[10] ; přiřadíme S := 'Dobrý den'; potom S[1] = 'D' , S[2] = 'o', …, S[9] = 'n' skutečná délka S je 9 S[0] obsahuje znak s kódem 9
Náhrada všech y, i podtržítkem uses Crt; var veta : string; i : byte; begin ClrScr; WriteLn ('Zadej větu :'); ReadLn (veta); for i := 1 to Length(veta) do if veta[i] in ['i','í', 'I','y','ý','Y'] then veta [i] := '_'; WriteLn ('Procvic si psani i – y '); WriteLn (veta); ReadLn; end.
Uspořádání řetězců lexikografické dle kódování znaků ‘4’ < ‘Z’ < ‘f’ < ‘fa’ < ‘fb’ < ‘g’ < ‘č’ < ‘á’ je možné používat relační operátory =, <, >, <=, >=, <> 'Novák' < 'Novák ' < 'Nováková'
Typové konstanty const NADPIS : string = 'Programování I' ; AUTOR : string [20] = 'Jan Soukup'; VERZE : string [3] = '1.0';
Kontrola platného identifikátoru const PlatneZnaky : set of char = ['_', 'A'..'Z', 'a'..'z']; Cislice : set of char = ['0'..'9']; var id : string; i, delka : byte; Chyba : boolean; begin Chyba := false; Write('Zadej identifikator: ') ; ReadLn(id); delka := Length(id); if (delka = 0) or not (id[1] in PlatneZnaky) then Chyba := true else for i := 2 to delka do if not ((id[i] in Cislice) or (id[i] in PlatneZnaky)) then begin Chyba := true; break; end; if Chyba then WriteLn('Chyba!') else WriteLn('OK'); ReadLn; end.
Počet cifer čísla zadaného jako řetězec s kontrolou platnosti čísla var cislo : string; n : longint; kod, cifry : integer; begin Write('Zadej cislo: '); ReadLn(cislo); cifry := Length(cislo); if (cislo[1]='-') or (cislo[1]='+') then begin Dec(cifry); cislo := Copy (cislo,2,cifry); {vypustime z retezce znamenko} end; Val (cislo, n, kod) ; {prevedeni na cislo} if kod > 0 then WriteLn ('Neplatne cislo') else WriteLn('Pocet cifer je ', cifry); ReadLn end.
Zjištění pohlaví dle křestního jména const vyjimka1 : string = 'Rut'; vyjimka2 : string = 'Ester'; vyjimka3 : string = 'Miriam'; var jmeno : string; delka : byte; vysledek : string[4]; posledni_znak : char; begin Write('Zadej krestni jmeno: '); ReadLn(jmeno); if (jmeno = vyjimka1) or (jmeno = vyjimka2) or (jmeno = vyjimka3) then vysledek := 'zena' else begin delka := Length(jmeno); posledni_znak := jmeno[delka]; if (posledni_znak = 'a') or (posledni_znak = 'e') then vysledek := 'zena' else vysledek := 'muz'; end; WriteLn('Pohlavi: ', vysledek); ReadLn; end.
Načtení dlouhého čísla type Cislo = array [1..100] of byte; var C : Cislo; {C[1]…cifra v řádu jednotek} PC : byte; {počet cifer} S : string [100]; i : integer; begin ReadLn(S); PC := 0; for i := Length(S) downto 1 do begin inc (PC); C[PC] := ord(S[i]) - ord('0') ; end; …. end.
Standardní rutiny pro práci s řetězci Length(S) aktuální délka řetězce Concat(S1, S2, …, Sn) spojení řetězců za sebe (stejné jako pomocí operátoru +) Copy(S, Index, Pocet) kopírování části řetězce S dané délky počínaje od daného indexu Delete(S, Index, Pocet) zrušení části řetězce S dané délky počínaje od daného indexu Insert(Co, Kam, Index) do řetězce Kam vloží Co na pozici daného indexu Pos(Co, Kde) pozice prvního výskytu podřetězce Co v řetězci Kde (0 pokud není obsažen)
Řetězec jako parametr procedur a funkcí vstupní parametr (volání hodnotou) je-li formální parametr typu string bez udaného počtu znaků, může být skutečným parametrem string bez udaného počtu znaků i string[pocet_znaku] je-li formální parametr pojmenovaného typu string [pocet_znaku], může být skutečným parametrem string bez udaného počtu znaků i string[jiny_pocet_znaku] výstupní parametr (volání odkazem) používáme pokud chceme načíst řetězce v podprogramu chceme změnit hodnoty řetězce chceme výsledek výpočtů podprogramu uložit do řetězce u formálního parametru musíme použít var formální a skutečný parametr by měly být shodné typy nebo skutečný parametr může být typ string a formální pojmenovaný podtyp typu string
Funkce monogram function Monogram (jm: string):string; var predchozi, aktualni : char; mono : string; i : byte; begin mono := ''; {prázdný řetězec} predchozi := ' '; {mezera} for i:=1 to Length(jm) do begin aktualni := jm[i]; if (predchozi = ' ') and (aktualni <> ' ') then mono := mono + UpCase(aktualni); predchozi := aktualni; end; Monogram := mono;
Funkce Palindrom (1) function Palindrom(text : string) : boolean; var i, delka : byte; odpoved : boolean; {pomocna vnitrni funkce} function SmazMezery (text : string): string; vysledek : string; i : byte; znak : char; begin vysledek := ''; for i := 1 to Length(text) do begin znak := text[i]; if znak <> ' ' then vysledek := vysledek + znak; end; SmazMezery := vysledek;
Funkce Palindrom (2) begin odpoved := true; text := SmazMezery(text); delka := Length(text); for i:=1 to delka div 2 do if text[i] <> text[delka-i+1] then begin odpoved := false; break; end; Palindrom := odpoved;
Procedura Jmeno {upravi jmeno tak, ze první pismeno je velke, ostatní mala} procedure Jmeno(var jm : string); var i : byte; znak : char; begin jm[1] := UpCase(jm[1]); for i := 2 to Length(jm) do begin znak := jm[i]; if znak in ['A'..'Z'] then jm[i] := chr(ord(znak) + ord('a') - ord('A')); end;