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
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.
|