Prezentácia sa nahráva. Prosím počkajte

Prezentácia sa nahráva. Prosím počkajte

Prednáška 4 string, prístup ku znakom stringu príklady cyklov

Podobné prezentácie


Prezentácia na tému: "Prednáška 4 string, prístup ku znakom stringu príklady cyklov"— Prepis prezentácie:

1 Prednáška 4 string, prístup ku znakom stringu príklady cyklov
funkcie manipulujúce so stringom char, ord a chr boolean vyhodnocovanie podmienok priorita operátorov

2 Textový a číselný typ Windows pracuje s hodnotami v editovacích poliach ako s textom: dôsledok: 1+2=12 v prípade požiadavky matematických operácií – potreba previesť text na číslo: celé číslo: StrToInt reálne číslo: StrToFloat

3 Chybovosť štandardných prevodov
štandardné prevody sú chybové – v prípade zadania nesprávnej (nečíselnej) hodnoty aplikácia skolabuje existencia blbuvzdornej procedúry – VAL syntax: VAL (textová premenná alebo hodnota, číselná premenná, code) textovú hodnotu zmení na číselnú podľa toho, o akého je číselná hodnota typu (integer, real), code nadobudne hodnotu 0. v prípade neúspechu do premennej code vloží chybový kód informujúci o pozícii, na ktorej chyba nastala

4 Modifikácia úvodného príkladu
Vytvorte blbuvzdornú aplikáciu na sčítavanie dvoch čísel. procedure TForm1.Button1Click(Sender: TObject); var a,b,vysledok,code:integer; begin Val(Edit1.text,a,code); if code>0 then begin ShowMessage(‘Chybne zadanie 1. cisla na pozicii ‘+IntToStr(code)); end else begin Val(Edit2.text,b,code); ShowMessage(‘Chybne zadanie 2. cisla na pozicii ‘+IntToStr(code)); vysledok:=a + b; Label3.Caption:=StrToInt(vysledok); end;

5 Typ string Edit1 obsahuje hodnotu typu string
umožňuje evidovať textovú (alfanumerickú hodnotu) až do rozsahu 231 znakov hodnoty sa do reťazca vkladajú prostredníctvom: priradenia (:=), napr. mojString:=‘Ahoj studenti’; zlučovania (pridania znakov do existujúceho reťazca), napr. mojString:= mojString+’. Ako sa mate?’ bude obsahovať text ’ Ahoj studenti. Ako sa mate?’ mojString:= ’Dobry den.’ +mojString bude obsahovať text ’Dobry den.Ahoj studenti’ počet znakov uložených v reťazci získame prostredníctvom funkcie length napr. Length(mojString) vráti počet znakov, ktoré aktuálne mojString obsahuje premenná typu string umožňuje prístup k textu nielen ako k celku, ale aj k jeho jednotlivých hodnotám prostredníctvom []: napr. mojString[5] vráti piaty znak reťazca prvý znak získame ako mojString[1], nie mojString[0]

6 Jednoduché príklady Zistite, koľko cifier má zadané číslo.
triviálny príklad: procedure TForm1.Button1Click(Sender: TObject); var retazec:string; dlzka:integer; begin retazec:=edit1.Text; dlzka:=length(retazec); ShowMessage('Retazec ma '+IntToStr(dlzka)+' znakov.'); end; efektívnejšie: ShowMessage('Retazec ma '+IntToStr(length(Edit1.Text))+' znakov.');

7 Porovnanie efektívnosti - string
Zistite, koľko ráz sa v zadanom čísle opakuje cifra 3. procedure TForm1.Button1Click(Sender: TObject); var retazec:string; i,pocetVyskytov:integer; begin retazec:=edit1.Text; pocetVyskytov:=0; // prechod po retazci od prveho po posledny znak for i:=1 to length(retazec) do if retazec[i]='3' then pocetVyskytov:=pocetVyskytov+1; ShowMessage('Pocet vyskytov je '+IntToStr(pocetVyskytov)); end;

8 Porovnanie efektívnosti - integer
Zistite, koľko ráz sa v zadanom čísle opakuje cifra 3. procedure TForm1.Button1Click(Sender: TObject); var mojeCislo,pocetVyskytov:integer; begin mojeCislo:=StrToInt(Edit1.Text); pocetVyskytov:=0; while mojeCislo>0 do begin if mojeCislo mod 10=3 then pocetVyskytov:=pocetVyskytov+1; mojeCislo:=mojeCislo div 10; end; ShowMessage('Pocet vyskytov je '+IntToStr(pocetVyskytov));

9 Ďalšie typické príklady
Zistite ciferný súčet zadaného čísla. procedure TForm1.Button1Click(Sender: TObject); var retazec:string; sucet,i:integer; begin retazec:=edit1.Text; sucet:=0; for i:=1 to length(retazec) do sucet:=sucet+StrToInt(retazec[i]); ShowMessage('Ciferny sucet je '+IntToStr(sucet)); end;

10 Ďalšie typické príklady
Nájdite maximálnu cifru v zadanom čísle. procedure TForm1.Button1Click(Sender: TObject); var mx,i:integer; begin mx:=0; for i:=1 to length(edit1.Text) do if StrToInt(Edit1.Text[i])>max then mx:=StrToInt(Edit1.Text[i]); ShowMessage('Maximalna cifra je '+IntToStr(mx)); end; prehľadnosť kódu je poplatná jeho stručnosti

11 Ďalšie typické príklady
Zistite zrkadlový obraz zadaného čísla. procedure TForm1.Button1Click(Sender: TObject); var retazec,zrkadlo:string; i:integer; begin retazec:=Edit1.Text; zrkadlo:=''; for i:=1 to length(retazec) do zrkadlo:=retazec[i]+zrkadlo; ShowMessage('Zrkadlom '+retazec+' je '+zrkadlo); end;

12 String alebo integer? diskutabilné a prípad od prípadu špecifické
v prípade prístupu k jednotlivým cifrám čísla je rýchlejšie (ako z programátorského, tak i zo systémového) a zrozumiteľnejšie použiť typ string pri použití typu integer sme totiž nútení operovať s operáciami pre celočíselné delenie predchádzajúce riešenia sú funkčné nielen pre čísla, ale pre ľubovoľný text

13 Char pri práci so stringom sme často pristupovali v rámci jeho obsahu k jedinému znaku napr. mojString[i] za týmto prístupom je skrytý fakt, že string pozostáva z elementárnejších častí – znakov typ reprezentujúci znak – char string je štruktúrovaný typ – ide vlastne o pole (ďalšia prednáška) znakov typ umožňujúci uchovávať a spracúvať jediný znak rovnako ako string vyžaduje pre oddelenie znakov od okolia apostrofy za reprezentáciou znakov je skrytá ASCII tabuľka:

14 Char II. znaky s kódom 0–31 sú riadiace
zobraziť pozíciu ľubovoľného znaku v tabuľke dokážeme prostredníctvom funkcie Ord, napr. Ord(‘A’) vráti hodnotu 65 a Ord(‘a’) hodnotu 97 pre zobrazenie (použitie) znaku na konkrétnej pozícii používame funkciu Chr napr. Chr(65) je ‘A’ alebo Chr(97) jw ‘a’ zaujímavým (riadiacim) znakom je znak ukrytý na pozícii 13, ktorý v texte spôsobí odriadkovanie (Enter) Napr. ShowMessage('Ahojte!'+chr(13)+'Ja som pocitac'); zobrazí okno s odriadkovaním:

15 Ordinálne a neordinálne typy
vďaka kódovaniu znakov v ASCII tabuľke dokážeme pre každý znak určiť jeho nasledovníka i predchodcu => ide o ordinálny typ rovnako je ordinálnym typom i typ integer pre hodnotu typu real nasledovníka ani predchodcu určiť nedokážeme, označujeme ho ako neordinálny ako určíte čo ide za 8.1? je to 8.11, alebo 8.2? pre ordinálne typy sú navyše definované funkcie: Succ – nasledovník (vráti nasledujúcu hodnotu – v prípade integer číslo o jedna väčšie) Succ(‘A’) je ‘B’ Succ(19) je 20 Pred – predchodca (vráti predchádzajúcu hodnotu – v prípade integer číslo o jedna menšie)

16 Ordinálne a neordinálne typy II.
High – najväčšia možná hodnota, akú môže nadobudnúť typ, z ktorého pochádza argument funkcie var c:integer; begin ShowMessage(inttostr(high(c))); end; Low - najmenšia možná hodnota, akú môže nadobudnúť typ, z ktorého pochádza argument funkcie pre celé čísla sú navyše definované procedúry Inc – zvýši hodnotu premennej o 1 c:=10; Inc(c); // c je 11 Dec - zníži hodnotu premennej o 1 Dec(c); // c je 9

17 Príklad Zakódujte text tak, že posuniete jednotlivé písmená abecedy o 3 pozície, napr. Ahoj bude: A – D, h – k, o – r, j – m, teda Dkrm. procedure TForm1.Button3Click(Sender: TObject); var slovo,vysledok:string; znak:char; i,pozicia:integer; begin slovo:=Edit1.text; vysledok:=''; for i:=1 to length(slovo) do begin znak:=slovo[i]; pozicia:=ord(znak); // ord vrati poziciu pozicia:=pozicia+3; // posunie sa o tri pozicie znak:=chr(pozicia); // precita sa novy znak vysledok:=vysledok+znak; // prida sa do noveho slova end; // cele to mozno zapisat jednym riadkom // vysledok:=vysledok+chr(ord(slovo[i])+3) ShowMessage(vysledok);

18 Typ Boolean jednoduchý typ schopný nadobúdať len dve pravdivostné hodnoty: Áno a Nie True alebo False možno ho veľmi jednoducho nahradiť inými typmi (integer), no zvyšuje čitateľnosť kódu okrem nadobúdania týchto hodnôt sa často (a často neuvedomene) využíva prostredníctvom zistenia výsledku výrazu: if a>b then if c mod 10 = 0 then možno ho použiť aj nasledovne: var vys:boolean; a,b:integer; begin vys:=a>b; if vys=true then beep; // pripadne staci napisat len // if vys then beep; end;

19 Príklad I. Zistite počet výskytov párnych číslic v reťazci a zistite, či v ňom nachádza aj nula. procedure TForm1.Button1Click(Sender: TObject); var retazec:string; i,pocet:integer; nula:boolean; znak:char; begin retazec:=Edit1.Text; nula:=false; pocet:=0; for i:=1 to length(retazec) do begin znak:=retazec[i]; if znak='0' then nula:=true; if StrToInt(znak) mod 2=0 then inc(pocet); end; ShowMessage('Pocet: '+inttostr(pocet)); if nula then ShowMessage('Nula tu je') else ShowMessage('Nula tu nie je');

20 Príklad II. Zistite či sa v zadanom reťazci nachádza nula.
nie je potrebné prechádzať celý reťazec do konca, postačí dovtedy, kým sa nenájde 0. v prípade, že sa nenájde, treba skončiť pri poslednom znaku procedure TForm1.Button1Click(Sender: TObject); var retazec:string; i:integer; nula:boolean; begin retazec:=Edit1.Text; nula:=false; i:=1; repeat if retazec[i]='0' then nula:=true; inc(i); until (nula or (i>length(retazec))); if nula then ShowMessage('Nula tu je') else ShowMessage('Nula tu nie je'); end;

21 Vyhodnocovanie podmienok
v predošlom príklade bola použitá logická spojka OR – alebo pascal má k dispozícii nasledovné prostriedky: AND OR NOT navyše XOR – exclusive OR opak OR:

22 Priorita operátorov ktorú operáciu uprednostníme pred inou
známe z matematiky ZŠ – násobenie má prednosť pred sčítaním integer, string, boolean, real 4*3+5*8-1 a>b and c<d not a>b not (a>b) a>b and c>d or f>g


Stiahnuť ppt "Prednáška 4 string, prístup ku znakom stringu príklady cyklov"

Podobné prezentácie


Reklamy od Google