Pascal repeat until használata alprogramokban?
Sziasztok!
A minap az oldalon sokan segítettetek nekem egy feladat megoldásában, ami elég jól sikerült!
Ugyan ezt a programot kellene kicsit továbbfejleszteni, úgy hogy procedúrákat használjon.
program absz;
uses crt;
var
maganhangzo, massalhangzo, kulonlegeskarakter, szoveg, z : string;
maganhangzos:array[1..14] of byte;
massalhangzos:array[1..21] of byte;
specialiskarakter:array[1..19] of byte;
i,j,k,l : byte;
betu,x : char;
betus : byte;
procedure karakterek;
begin
betus := 0;
for j := 1 to 14 do
maganhangzos[j]:=0;
for k := 1 to 21 do
massalhangzos[k]:=0;
for l := 1 to 19 do
specialiskarakter[l]:=0;
maganhangzo:='áéöőüűúóíaeiou';
massalhangzo:='bcdfghjklmnpqrstvwxyz';
kulonlegeskarakter:=',;?.:-_@#/\+"!%=()*';
end;
procedure beolvasas;
begin
textcolor(12);
write('Irjon be egy szoveget! ');
readln(szoveg);
delay(1400);
Write('Kerem a megszamolando betut : ');
readln(betu);
textcolor(6);
for i := 1 to length(szoveg) do
begin
for l:=1 to 19 do
if (lowercase(szoveg[i])=kulonlegeskarakter[l]) then inc(specialiskarakter[l]);
for j:=1 to 14 do
if (lowercase(szoveg[i])=maganhangzo[j]) then inc(maganhangzos[j]);
for k:=1 to 21 do
if (lowercase(szoveg[i])=massalhangzo[k]) then inc(massalhangzos[k]);
if (lowercase(szoveg[i])=lowercase(betu)) then inc(betus);
end;
WriteLn;
end;
procedure kiir1;
begin
WriteLn('A szovegben a(z) ',betu,' betu ',betus,' alkalommal fordult elo.');
writeln;
end;
procedure kiir2;
begin
textcolor(5);
writeln('Megmutassam a maganhangzokat es massalhangzokat?');
textcolor(6);
repeat
writeln('I/N');
x:=(upcase(readkey));
until(x <> 'I') or (x <> 'N');
if x='I' then begin
writeln('Maganhangzok: ');
for j:=1 to 14 do
if maganhangzos[j]>0 then writeln(maganhangzo[j],' betu: ',maganhangzos[j],' alkalommal fordult elo.');
writeln('Massalhangzok:');
for k:=1 to 21 do
if massalhangzos[k]>0 then writeln(massalhangzo[k],' betu: ',massalhangzos[k],' alkalommal fordult elo.');
end;
end;
procedure kiir3;
begin
textcolor(5);
writeln('Megmutassam a kulonleges karaktereket?');
textcolor(6);
repeat
writeln('I/N');
x:=(upcase(readkey));
until(x <> 'I') or (x <> 'N');
if x='I' then begin
writeln('Kulonleges karakterek: ');
for l:=1 to 19 do
if specialiskarakter[l]>0 then writeln(kulonlegeskarakter[l],' karakter: ',specialiskarakter[l],' alkalommal fordult elo.');
end;
end;
procedure kiir4;
begin
textcolor(5);
writeln('Erdekli hogy hany karaktert gepelt be?');
textcolor(6);
repeat
writeln('I/N');
x:=(upcase(readkey));
until(x <> 'I') or (x <> 'N');
if x='I' then begin
writeln('Ennyi karakter talaltam osszesen: ',length(szoveg));
end;
end;
procedure restart;
begin
repeat
textcolor(5);
writeln('Futtassam meg egyszer a programot?');
textcolor(6);
writeln('Igen/Nem');
readln(z)
until z='nem';
end;
begin
clrscr;
karakterek;
beolvasas;
kiir1;
kiir2;
kiir3;
kiir4;
restart;
readln;
end.
Így néz ki a program most. Jelenleg a 'restart' procedure csak saját magát indítja újra, tudom. Ezt kellene úgy megoldani hogy az egész programot újraindítsa.
Engedelmeddel csak a lényeget, vagyis a programtörzset és a restart eljárást másolom ide:
procedure restart;
begin
repeat
textcolor(5);
writeln('Futtassam meg egyszer a programot?');
textcolor(6);
writeln('Igen/Nem');
readln(z);
z := LowerCase(z)
until (z='igen') or (z='nem');
end;
begin
clrscr;
karakterek;
repeat
beolvasas;
kiir1;
kiir2;
kiir3;
kiir4;
restart;
until (z='nem');
readln;
end.
Egy-két megjegyzés: Utólag észrevettem, hogy végül is beraktad a választ egy globális változóba (z), csak használnod kellett volna -- ugyanúgy, ahogyan a programban már többször is megtetted. Kifejezetten idétlennek találom a sok azonnali i/n választás után a gondosan begépelendő és Enterrel lezárandó restart-féle beolvasást, de ezen lényegében nem változtattam. Az én terminálablakom történetesen lila hátterű, ezért a kérdésekből csak valami maszat látszik; javaslom, hogy a gondosan számértékkel kiírt TextColor()-értékeket inkább az elején add meg konstanskén, és csak névvel hivatkozz rájuk, hogy egyetlen helyen át lehessen állítani őket alkalmasabb színre, ha szükséges.
+ A fenébe, nem jó helyre tettem a repeat-et, bocs.
A programtörzs:
begin
repeat
clrscr;
karakterek;
beolvasas;
kiir1;
kiir2;
kiir3;
kiir4;
restart;
until (z='nem');
readln;
end.
Azért még lesz itt mit gatyába rázni, ha nem is túl sok.
Például ezzel a többször visszatérő vizsgálattal mi volt a célod?
until(x <> 'I') or (x <> 'N');
Magyarra fordítva: Addig tart a ciklus, amíg X vagy 'I'-től, vagy 'N'-től különböző nem lesz. Mivel Ez törvényszerűen teljesül, bármelyik billentyűt ütöd le, mert egyszerre két betűvel nem lehet egyenlő. Ha 'I'-t kap, akkor 'N'-nel nem lesz egyenlő, ha 'N'-t, akkor 'I'-vel, ha pedig bármi egyebet, akkor egyikkel se -- tehát nem tudsz olyan billentyűt leütni, hogy tovább ne lépjen.
Tessék, egy változat, elnézést az esetleges bénaságokért, már félig alszom:
Megjegyzés: Az ékezetes karaktereket nem tudod ilyen egyszerűen kezelni, azokat kivettem a magánhangzók közül.
Persze, hogy csináltam marhaságokat, például ebben a sorban:
massalhangzok := 'bcdfghjklmnpqrstvwvalaszyz';
Az X változó nevének lecserélésekor itt is „válasz” került az x helyére :)
Az ékezetes magánhangzók törlésekor meg nem rövidítettem meg a tömböt.
Újabb nekifutás, újabb átszervezésekkel (figyeld a konstansokat):
Nagyon szépen köszönöm a segítséget! Még tegnap este a kérdés kiírása után én is ugyan így oldottam meg a repeat until ciklust, de gondoltam hátha valaki tud egy elegánsabb megoldást. :)
Elnézést kérek hogy egyből ide másoltam a kódot és hogy voltak kissé értelmetlen soraim, de még eléggé az elején járok a dolognak. Megpróbálom hasznosítani az infókat. Köszi még egyszer! :)
További kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!