Kezdőoldal » Számítástechnika » Programozás » Pascal repeat until használata...

Pascal repeat until használata alprogramokban?

Figyelt kérdés

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.



2016. jan. 5. 20:30
1 2
 1/18 tabaki ***** válasza:
Jézusmária, legalább első hozzászólásként tetted volna be, ha már kódfeltöltő oldalt nem ismersz! Így mindenkinek, minden oldalon negyedórát kell majd szánkáznia, míg leérkezik a hozzászólásokig. Rémes!
2016. jan. 5. 23:07
Hasznos számodra ez a válasz?
 2/18 tabaki ***** válasza:
A logikus az volna, hogy ha restart nem eljárás(procedure), hanem függvény(function) lenne, és a program annak visszatérési értékétől függően maradna benn egy repeat..until ciklusban, vagy lépne ki belőle. Ha függvényt még nem akarsz, akkor egy globális változó értékét állítsd át, hogy a programtörzsben vizsgálhasd. Mindjárt jobban is belenézek.
2016. jan. 5. 23:21
Hasznos számodra ez a válasz?
 3/18 tabaki ***** válasza:

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.

2016. jan. 5. 23:51
Hasznos számodra ez a válasz?
 4/18 tabaki ***** válasza:

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

2016. jan. 6. 00:03
Hasznos számodra ez a válasz?
 5/18 tabaki ***** válasza:

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.

2016. jan. 6. 01:06
Hasznos számodra ez a válasz?
 6/18 tabaki ***** válasza:

Tessék, egy változat, elnézést az esetleges bénaságokért, már félig alszom:

[link]

Megjegyzés: Az ékezetes karaktereket nem tudod ilyen egyszerűen kezelni, azokat kivettem a magánhangzók közül.

2016. jan. 6. 02:17
Hasznos számodra ez a válasz?
 7/18 tabaki ***** válasza:

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):

[link]

2016. jan. 6. 10:37
Hasznos számodra ez a válasz?
 8/18 A kérdező kommentje:

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! :)

2016. jan. 6. 16:00
 9/18 tabaki ***** válasza:
Én meg megint elszúrtam azt a bizonyos sort, most meg kimaradt az x... :)
2016. jan. 6. 17:48
Hasznos számodra ez a válasz?
 10/18 SimkoL ***** válasza:
Egy-két halmaz csodákat művelt volna :)
2016. jan. 6. 18:21
Hasznos számodra ez a válasz?
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!