Umíte pascalsky - 17.lekce ...

Umíte pascalsky?
17.lekce
Vytisknout  

Datový typ STRING , práce s řetězci

Pohodlnou práci s řetězci znaků umožňuje datový typ string. Proměnnou typu string deklarujeme s udáním maximální délky nebo bez udání maximální délky (pak je to 255).

Příklad:
var Jmeno: STRING[20];
      Radek: STRING[80];
      Retez: STRING;

Stejně jako u typu pole lze pracovat s jednotlivými složkami proměnné pomocí indexu:

Jmeno[1] - první znak proměnné Jmeno
Jmeno[0] - obsahuje znak, jehož ordinální číslo je rovno počtu znaků v řetězci.

Má-li být proměnné typu string přiřazen řetězec větší délky než udává deklarace, přiřadí se jen ta část řetězce (od začátku řetězce), která se do proměnné vejde.
Je-li řetězec kratší,zbytek proměnné obsahuje nedefinované znaky.

Pro proměnné typu string jsou definovány následující operace:
- přiřazení ... Např. Jmeno := 'Petr'; Radek := 'Jana je doma';
- relační operace ... Např. Jmeno > Retez (protože 'P' > 'J')
- vstup procedurou read,readln ... Např. readln(Jmeno);
- výstup procedurou write,writeln ... Např. writeln(Radek);
- spojovat řetězce operátorem + ... Např. Radek := Jmeno + Retez;

Uveďme si některé funkce (procedury), které jsou definovány pro proměnné typu string a usnadňují tak práci s těmito proměnnými:

typ název parametry význam (popis)
fce Length retez aktální počet znaků řetězce retez (délka řetězce)
fce Pos podretez,retez je-li podretez obsažen v retez, udá pozici pozici 1.znaku podretez v retez, jinak dává 0
fce Concat ret1,ret2,ret3,... spojí řetězce ret1,ret2,ret3 ... v jeden řetězec
fce Copy retezec,od,pocet zkopíruje část řetězce retezec od pozice od o délce pocet znaků
fce Delete retez,od,pocet smaže část řetězce retez od pozice od o délce pocet znaků
proc Insert vloz,retez,od vloží řetězec vloz do řetězce retez od posice od
proc Str cislo,retez převede číslo cislo na řetězec a vloží do řetězce retez
proc Val retez,cislo,chyba řetězec retez převede na číslo cislo,je-li převod v pořádku, chyba=0 , jinak údává posici prvního nepřípustného znaku


Příklad: Sestavte program Retezec, který podle volby uživatele umožňuje:
1) Zadat zvolený počet slov do pole řetězců
2) Vytisknout všechny slova za sebou
3) Najde nejkratší slovo a nejdelší
4) Najde slovo,ve kterém se vyskytuje zadaný podřetězec
Všechny úkoly řešte užitím procedur s parametry.

Myšlenka (hrubý algoritmus):
<zadání slov> - v cyklu načítáme řetězce a ukládáme do pole (array of STRING[]) ... Nacti()
<tisk všech slov> - tisk prvků pole ... Tisk()
<nejkratší,nejdelší slovo> - hledáme slovo s minimální (maximální) hodnotou fce Length() ... Nej_delka()
<slovo obsahující ...> - obsahuje-li podřetězec, má fce Pos() kladnou hodnotu ... Najdi()

Program Retezec může vypadat takto:

program Retezec;
  const Max = 50;
  type TSlova = array[1..Max] of STRING[20];
  var slova : TSlova;
         slovo : STRING[20];
         pocet_slov,volba :integer;
{TSlova typ pole se složkami typu STRING}
{slova proměnná typu TSlova}
{slovo proměnná typu STRING max.délky 20}
 
procedure Nacti(kolik:integer);
  var ktere : integer;
  begin
    for ktere:=1 to kolik do
        begin
           writeln('Zadejte slovo (max. 20 znaků)');
           readln(slova[ktere]);
        end;

{opakuj}

{načtení slov}

  end;

procedure Tisk(pocet:integer);
  var ktere : integer;
  begin
    writeln('Zadaná slova jsou:');
    for ktere:=1 to pocet do
           write(slova[ktere],' ');
    writeln;
{opakuj)
{tisk slova}
  end;

procedure Nej_delka(pocet:integer);
  var ktere,minimum,maximum: integer;
         min_slovo,max_slovo : STRING[20];
  begin
    minimum:=Length(slova[1]);min_slovo:=slova[1];
    maximum:=Length(slova[1]);max_slovo:=slova[1];
    for ktere:=2 to pocet do
      begin
        if Length(slova[ktere])< minimum then
          begin
            minimum:=Length(slova[ktere]);
            min_slovo:=slova[ktere];
          end;
        if Length(slova[ktere]) > maximum then
          begin
            maximum:=Length(slova[ktere]);
            max_slovo:=slova[ktere];
          end;
      end;
    writeln('Nejkratší slovo je ',min_slovo);
    writeln('a nejdelší je ',max_slovo);





{nalezení nejkratšího slova}



{nalezení nejdelšího slova}



{tisk těchto slov}
  end;

procedure Najdi(pocet:integer);
  var ktere: integer;
         hledej : STRING[20];
  begin
    writeln('Zadejte hledaný podřetězec ');readln(hledej);
    writeln('Tato slova obsahují hledaný podřetězec ');
    for ktere:=1 to pocet do
      if Pos(hledej,slova[ktere]) > 0 then writeln(slova[ktere]);
  end;


{Nalezení slova obsahujícího ..}


Begin

{Hlavní program}
 Repeat
   writeln('Program Řetězec umožňuje:');
   writeln('1 ... Zadat slova');
   writeln('2 ... Tisk slov');
   writeln('3 ... Najít nejkratší a nejdelší slovo');
   writeln('4 ... Najít slovo obsahující ...');
   writeln('0 ... Ukončit');
   writeln('Zadejte svoji volbu:');
   readln(volba);
   case volba of
     1: begin
            write('Zadejte počet slov:');readln(pocet_slov);
            Nacti(pocet_slov);
          end;
     2: Tisk(pocet_slov);
     3: Nej_delka(pocet_slov);
     4: Najdi(pocet_slov);
     0: writeln('Nashledanou');
   end;
 until volba = 0;
{opakuj}
    {nabídka činností}





    {vvýběr činnosti}
    {provedení zvolené činnost}


       


End.



Domácí úkol:

    Sestavte program Palindrom, který umožňuje mezi zadanými slovy najít všechny palindromy - slova, která se čtou stejně zepředu i zezadu (např. radar).

On-line účast na řešení úkolu

Řešit úkol Prohlídka hodnocení úkolu Dotazy,připomínky

Pomocí volby Řešit můžete (po přihlášení) odeslat vaše řešení domácího úkolu (každý úkol smíte řešit jen jednou). Volbou Hodnocení si přečtete hodnocení a komentář od vyučujícího. Dotaz nebo připomínku můžete opakovaně zasílat pomocí tlačítka Dotazy, Komunikace (na levém okraji) zobrazuje příklad možné komunikace s vyučujícím.