9. Pole & cyklus For & práce s texty

9.1 Typ pole (array)

array [<typ_indexu>] of [<typ_položky>]

9.1.1 příklad a poznámky

  • pro uložení výroby za každý měsíc v roce je výhodné deklarovat proměnnou takto:
  • type Vyroba = array [1..12] of Real;

  • pro uložení údajů o výrobě za poslední roky lze definovat:
  • type CelkVyroba = array [1995..2001] of array [1..12] of real;

    vznikne dvourozměrné pole - dvanáct měsíců pro každý z roků (v matematice tomu říkají matice 7 x 12)

  • předchozí delkaraci lze elegantně zhustit:
  • type CelkVyroba = array [1995..2001, 1..12] of real;

    první index je chápán jako řádkový, druhý jako sloupcový

  • nesmíš zapomenout, že Pascal byl definován v době, kdy se ještě s pamětí šetřilo - veškeré globální proměnné se musí vejít do jednoho segmentu, pole nesmí být větší než 64 KB!!!!!

9.2 Cyklus For

for <řídící proměnná> := <začátek> to <konec> do 

      <příkaz>

9.2.1 příklad

  • program popocty.pas
  • program počítá počty znaků ve vstupním textu, ukončovací znak je @

program PoctyZnaku;

const Konec = '@';

var Pocty : array [Char] of Integer;

      Znak : Char;

begin

      for Znak := Chr(255) downto Chr(0) do

            Pocty[Znak] := 0; {vynulování pole Pocty, konec cyklu FOR!!!}

      Read ( Znak );

      while Znak <> Konec do

            begin

                 Pocty[Znak] := Pocty[Znak] + 1;

                 Read ( Znak );

            end;

      for Znak := Chr(0) to Chr(255) do

            if Pocty[Znak] > 0 then

                  Write ( '>', Znak, '< ', Pocty[Znak], ' krát; ' );

end.

9.2.2 Poznámky

  • Místo klíčového slova to lze s úspěchem použít klíčové slovo downto - hodnota řídící proměnné bude klesat.
  • Obsah řídící proměnné se nesmí v těle cyklu měnit!

9.2.3 Cvičení

  • Sestav program, který pomocí cyklu for vypíše ASCII tabulku od ASCII kódu 32 do ASCII kódu 255.
  • Sestav program, který vyhodnocuje píli prodavaček. Pracovnic je 8 (budou tvořit pole 1-8), majitel podniku si za každého dobře obslouženého spokojeného zákazníka poznamená číslo prodavačky. Výstupem je přehled, číslo pracovnice + počet obsloužených zákazníků.   ...řešení

9.3 Řetězce znaků

string [<délka>]

  • délka = maximální délka řetězce
  • implicitně: délka = 255
  • povolený interval pro délka: 1 - 255

9.3.1 příklad

type Str30 = string [30];

var Radek : string [80];

      Nadpis : string;

Deklaruje 

  • typ Str30 pro ukládání řetězců o maximální délce 30 znaků
  • proměnnou Radek - maximálně 80 znaků
  • proměnnou nadpis - maximálně 255 znaků

9.3.2 Procedury a funkce pro typ string

česky: příkazy pro práci s textem

Length (<řetězec>) délka řetězce, 
Lenght ('Praha') = 5
Pos (<co>, <kde>) hledá řetězec co v řetězci kde, vrátí číslo 1. znaku výskytu, 
Pos ('aha','Praha') = 3
Concat (řetězec1> , ... , <řetězecN>) zřetězí (= "sečte") své parametry
Concat ('Pr','aha') =  'Praha'
Copy (<řetězec>, <začátek>, <délka>) vrátí podřetězec řetězce začínající na pozici začátek o dané délce
Copy ('Praha', 3,3) = 'aha'
Delete (<odkud>, <začátek>, <počet>) yak také jinak: vymaže z řetězce odkud počet znaků od pozice začátek, odkud musí být string
Delete ('Praha', 2, 2) = 'Pha'
Insert (<co>, <kam>, <začátek>) vloží do řetězce kam na pozici začátek řetězec co
mesto = 'Praha';
delkamesta = lenght (mesto);
Insert ('- centrum', mesto, delkamesta);

9.3.3 Příklad

pomaxsl.pas

Program najde nejdelší slovo ve vstupním textu.

program NejdelsiSlovo;

const Konec = '@';

         var Slovo, MaxSlovo : string;

               Znak : Char;

begin

          Write ( 'Hledání nejdelšího slova. ');

          Write ( 'Vstup ukončete znakem ''@''. ');

          Slovo := ''; MaxSlovo := '';

          Read ( Znak );

          while Znak <> Konec do

                 begin

                     case Znak of

                          'A'..'Z', 'a'..'z' : Slovo := Slovo + Znak;

                     else

                         begin

                            if Length (Slovo) > Length (MaxSlovo) then

                                MaxSlovo := Slovo;

                                Slovo := '';

                          end; {konec beginu}

                  end; {konec case!!!}

          Read ( Znak );

       end;

       if Length (Slovo) > Length (MaxSlovo) then

                   MaxSlovo := Slovo;

       Write ( 'Nejdelší slovo: ', MaxSlovo );

end.

 

9.3.4 Cvičení

  • Napiš program, který po zadání vstupu vypíše totéž, ale obráceně. Příklad: zadáš 'Praha@', on napíše 'aharP'   ...řešení
  • Napiš program, který uvede ve výstupu tabulku obsahující délku vstupních slov, vstup viz. pomaxsl.pas. Uvažuj nejdelší slovo s 80 znaky. Je-li výskyt slov pro danou délku nulový, neunavuj pro tento případ žádnou informací!  ...řešení
  • Platí-li, že 'raz' + 'dva' je 'razdva', pokus se zjistit kolik je 'razdva' - 'dva'!
  • Kolik vlastně je '1' + '2'????
  • Myslíš si, že Jan Tleskač mohl umět TurboPascal? A Cimrman?

 

© 2001 Milan Volejník, http://hledej.to.zde.cz

aktualizace: 17.09.2002 17:25:36

Powered by Notepad editor.
Copyright © 2001 by !!!Protiproud!!! All rights reserved.
Revised: 17 IX 2002 17:49:12 +0200 .