20.)
Elemezzük a szöveges változókra érvényes műveleteket, függvényeket és
eljárásokat.
A következőkben olyan
programokat szeretnénk írni, amelyek szöveges változókat is kezelnek. A
szöveges változókkal végezhető műveleteket és eljárásokat mutatja be a Szoveg nevű program:
Program Szoveg;
Uses NewDelay,
Crt, CrtPlus;
Var A,B,C,D:
String;
I,N: Byte;
Begin
TextMode(CO80);
ClrScr;
A:= 'alma';
B:= 'fa';
C:= a+b;
WriteLn(C);
n:= Length(C);
WriteLn(N);
D:= Copy(C,2,3);
WriteLn(D);
For
I:= 1 To N Do WriteLn(C[I]);
WriteLn(Ord(C[0]));
Insert('vad',C,1);
WriteLn(C);
WriteLn(Pos('dal',C));
Delete(C,4,4);
WriteLn(c);
Tunj;
Varj;
End.
Szöveges változók között
csak egyetlen művelet létezik, az összeadás, mely a két szöveg egymás után
helyezését jelenti. A Length függvény a szöveges változó hosszát adja vissza. A
Copy függvény első paramétere egy szöveg, melyből a második paramétertől
kezdődően, a harmadik paraméter hosszban másolatot készít. A String úgy tárolódik, hogy a nulladik
karakterének kódja a String hosszát
jelenti. Az Ord függvény a karakter sorszámát adja vissza (a Chr függvény fordítottja),
azaz a String hosszát. Az Insert eljárás első paraméterét, a második
paraméterként megadott szövegbe, a harmadik paraméterben megadott helytől
kezdve beszúrja. A Pos függvény az első paraméterként megadott szöveg helyét
keresi a második paraméterként megadott szövegben. Visszaadott értéke a
keresett szöveg első karakterének helye, ha ez 0, akkor a keresett szöveget nem
találta. A Delete eljárás, az első paraméterként megadott szövegből, a második
paraméterben megadott helytől kezdődően, a harmadik paraméterben megadott számú
karaktert töröl.
21.) Írjunk
programot, amely bekér egy szöveget, és fordítva írja ki.
Program Fordito;
Uses NewDelay,
Crt, CrtPlus;
Var Szov: String;
I,N: Byte;
Begin
TextMode(CO80);
ClrScr;
Write('Kérem a szöveget: ');
ReadLn(Szov);
N:= Length(szov);
For
I:= N DownTo 1 Do Write(Szov[I]);
Tunj;
Varj;
End.
A programban egyetlen
igazi újdonság az, hogy a For
ciklust csökkenő értékekkel használja. Elemzésétől eltekintünk.
22.) Írjunk
programot, amely egy beolvasott szöveg karaktereit a következőképpen alakítja
át: a Space és a kódban előtte lévő karaktereket Space-szé alakítja, a számokat
nem változtatja meg, a nagybetűből kisbetűt, a kisbetűből nagybetűt készít,
egyéb karaktereket ponttal helyettesít.
A program több újdoságot
is tartalmaz. Az első a Function,
azaz függvény deklaráció. A függvény formailag nagyon hasonlít az eljárásra,
csak itt van visszaadott érték, amelynek típusát a függvény neve után kettősponttal
elválasztva le kell megadni. A programbeli Valt függvényt Char típusú
paraméterrel kell meghívni, és Char típusú a visszaadatott érték is, azaz karakterből
másik karaktert készít. A visszaadott értéket a végrehajtó részében kell
megadni úgy, hogy a függvény nevét egy értékadás bal oldalán szerepeltetjük.
Jelen esetben a Valt értékét egy Case
szerkezettel a legcélszerűbb megadni. A Ch változó értékétől függően,
négyféleképpen kap értéket a függvény. A külön le nem írt karakterek esetére az
Else ág adja az értékeket. A betűváltások
is tartalmaznak újdonságokat. A szelektor értékeket tartományként is leírhatjuk.
Az Ord függvényt már ismerjük, a kisbetű a nagybetűs párjánál 32-vel nagyobb
kódú, így állítottuk elő. Az UpCase függvény a kisbetűből nagybetűt készít.
Program Valto;
Uses NewDelay,
Crt, CrtPlus;
Var ISzov,OSzov:
String;
I,N: Byte;
Function Valt(Ch:
Char): Char;
Begin
Case
Ch Of
#0..#32: Valt:=' ';
’0’..’9’: Valt:= Ch;
'A'..'Z': Valt:= Chr(Ord(Ch)+32);
'a'..'z': Valt:= UpCase(Ch);
Else
Valt:= '.';
End;
End;
Begin
TextMode(CO80);
ClrScr;
Write('Kérem a szöveget: ');
ReadLn(ISzov);
N:= Length(ISzov);
OSzov[0]:= Chr(N);
For
I:= 1 To N Do OSzov[I]:= Valt(ISzov[I]);
WriteXY(19,3,OSzov);
Tunj;
Varj;
End.
Az OSzov (Out Szov)
létrehozása is érdekes. A hossza megadásával kezdjük, ami az ISzov (In Szov)
hosszával megegyezik. Majd a karaktereit a vált függvény segítségével egyenkét
hozzuk létre. Rövidebben a hosszbeállítás (N nélkül) Így nézne ki: OSzov[0]:=
ISzov[0];. Ha csak egyetlen szöveges változóval akarnánk megoldani, akkor a Do utáni értékadás: OSzov[0]:= Valt(Iszov[0]);
lehetne. Természetesen, ekkor ISzov-et kellene kiíratni.
23.) Írjunk
programot, amely bekér egy szöveget, majd feladványkét kiírja magánhangzók
nélkül, és addig kérdezi a felhasználót, amíg el nem találja a helyes választ.
Program Szoki;
Uses NewDelay,
Crt, CrtPlus;
Var FSzov,VSzov:
String;
I,N: Integer;
Begin
TextMode(CO80);
ClrScr;
Write('Kérem a szöveget: ');
ReadLn(FSzov);
ClrScr;
N:= Length(FSzov);
For
I:= 1 To N Do
If
FSzov[I] In
['a','á','e','é','i','í','o','ó','ö','ő','u','ú','ü','ű',
'A','Á','E','É','I','Í','O','Ó','Ö','Ő','U','Ú','Ü','Ű'] Then
Write('.') Else Write(FSzov[i]);
Window(1,3,80,25);
Repeat
Write('Mi a tipped: ');
ReadLn(VSzov);
Until
FSzov=VSzov;
WriteLn('Eltaláltad');
Tunj;
Varj;
End.
A lista két új dolgot
tartalmaz. Az egyik a halmaz megadásának egyik módját, amikor a halmaz elemeit
szögletes zárójelbe téve felsoroljuk, mivel most karakterekről van szó ezért a
karaktereket zárójelbe kell tenni. A másik a halmazba való tartozás relációja,
melyet az In lefoglalt szóval
fogalmazhatunk meg. Mint minden relációnak ennek az értéke is csak igaz vagy
hamis lehet, ezért állhat az If
feltételében.
24.) Írjunk programot,
amely bekér egy szöveget, majd szavanként fordított sorrendben írja ki.
Program Szavalo; {Nyomkövetéssel futtatni}
Uses NewDelay,
Crt, Crtplus;
Const Max=10;
var Szov: String;
N,I,J: Byte;
Sz: Array[1..Max]
Of String;
Begin
TextMode(CO80);
ClrScr;
Write('Kérem a szöveget: ');
ReadLn(Szov);
N:= Length(Szov);
J:= 1;
For
I:= 1 To N Do
If
Szov[I]<>' ' Then
Sz[J]:= Sz[J]+Szov[I]
Else
Inc(J);
For
I:= J DownTo 1 Do WriteLn(Sz[I]);
Tunj;
Varj;
End.
A program a szavak
számát a J változóban tárolja, melynek maximális értéke Max lehet. A szöveg
szavakra bontáskor az Sz String-tömbbe
kerülnek. A szöveg beírásakor nem szabad a szavakat egynél több Space-szel
elválasztani, mert akkor üres szavakat is létrehoz. A fordított For ciklus oldja meg a fordított
sorrendű kiírást.