Kezdőoldal » Számítástechnika » Programozás » Hogy oldjam meg Free Pascalban...

Adamhu99 kérdése:

Hogy oldjam meg Free Pascalban? For ciklus?

Figyelt kérdés

Kaptunk egy csomó programozásos házit és itt elakadtam. Valaki tudna segíteni a hatványozásban? Még nem csináltunk hatványozást és ez elég nehéz egy csomó mindent próbáltam (neten is kerestem megoldást), de nem megy. A for ciklushoz (for to do)-hoz nem értek mert beteg voltam amikor suliban tanultuk. El tudná magyarázni nekem valaki, hogy mire jó a for ciklus? (suliban kérdeztem a többieket de ők sem tudják elmagyarázni hogy miért kell oda... csak annyit hogy kell, eredetileg forciklus nélkül csináltuk a programokat és ez most új/újabb). A programot le tudom írni csak valahogy ki kéne egészíteni.


program hatvanyozashazi;

uses crt;

var a,h,i:integer;

begin

clrscr;

write('A bekért szám: ');

readln(a);

write('A hatvány: ');

i:=1;

for 1 to h do

i:=i*a;

readkey;

end.



2015. szept. 15. 18:50
1 2 3 4 5
 11/45 tabaki ***** válasza:

@coopper:

Szerintem nem kell az egész programot átrendezni. Egy új, független ciklusváltozóval (a trehányságoktól eltekintve) a bekérések is érthetők, szerintem ilyesmiről volna szó:


program hatvanyozashazi;

uses crt;

var a,c,h,i:integer;

begin

      ClrScr;

      Write('A bekért szám: ');

      ReadLn(a);

      Write('A hatvány: ');

      ReadLn(h);

      i := 1;

      for c:=1 to h do

            i := i * a;

      WriteLn(i);

      ReadKey;

end.

2015. szept. 15. 19:36
Hasznos számodra ez a válasz?
 12/45 A kérdező kommentje:

Köszönöm a segítségeteket. Igen ez így jól működik. A tanárnő még mondta hogy adja ki az összes hatványt. (de ezt szerintem meg tudom oldani.)


pl.:5^4 (negyedigen)

5=5

5*5=25

5*5*5=125

5*5*5*5=625


Elnézést a trehányságomért. :)

2015. szept. 15. 19:50
 13/45 tabaki ***** válasza:
Mindenesetre mutasd be, hogy hogyan oldottad meg. Mellesleg a programértelmezésedhez még fűzök majd egy-két megjegyzést, azért se tűnj el.
2015. szept. 15. 20:00
Hasznos számodra ez a válasz?
 14/45 A kérdező kommentje:

Rendben.

Elnézést csak vacsoráztam. Nézem és gondolkozok, de nem tudom mivel kéne kiegészíteni a programot.

Szerintem a "for..." és a "writeln(i);" közé kell valamit beírni de nem tudom pontosan, hogy mit.

2015. szept. 15. 20:27
 15/45 SimkoL ***** válasza:

for c := 1 to h do

begin

  i := i * a;

  WriteLn(i);

end;

Erre gondoltál ?

2015. szept. 15. 20:56
Hasznos számodra ez a válasz?
 16/45 A kérdező kommentje:

Nem tudom hogy kéne mert írhatok ilyet:

" WriteLn(a,'*',a,'=',i); " de ez sem jó mert 5*5=625 az eredmény (ha 4 a hatvány). " WriteLn(a,'*',h,'=',i); " sem jó mert ez 5*4=625.


Elvileg így kéne " WriteLn(a,'*',a,'=',h/12,5); " (nem biztos hogy jó a 12,5), de ehhez real változó kell, akkor meg nem működik a program.

2015. szept. 15. 21:00
 17/45 A kérdező kommentje:

SimkoL

nem arra. először olyasmi kellett, de az már megvan, már csak azt kell megoldanom hogy így kiírja a program.

pl.: 5^4-en (5 a negyediken)

5=5

5*5=25

5*5*5=125

5*5*5*5=625


És ez nem sikerül az eredmény miatt (WriteLn-nel elvileg ki tudnám írni, de i=625, h=4 és a=5.

2015. szept. 15. 21:04
 18/45 SimkoL ***** válasza:

for c := 1 to h do

begin

   i := i * a;

   WriteLn(a, '^' ,c, '=', i);

end;

2015. szept. 15. 21:20
Hasznos számodra ez a válasz?
 19/45 A kérdező kommentje:
Ezzel csak az a baj hogy 5*5=25 és ez így nem jó: 5^4=625
2015. szept. 15. 21:26
 20/45 tabaki ***** válasza:

Megint elhúztam az időt, de itt vannak a megjegyzéseim, ahol marhaságot írok, majd SimkoL kijavít... Ami nagyjából stimmelt, azzal nem foglalkoztam.


„2. sor "uses crt" erre nem emlékszem (azt tudom hogy ezt mindig ki kell írni)”

Ez ilyen sommásan marhaság, akkor is, ha így tanultátok. A CRT egy előre megírt eljárás- és függvénygyűjtemény (unit), bizonyos feladatok ellátására. A USES után írt neve jelzi a fordítónak, hogy ebből is felhasználsz a programodban. Neked most összesen két dolog miatt kell (ClrScr és ReadKey), mindkettő könnyűszerrel elhagyható: Ha az elején nem törlöd a képernyőt, a végén pedig mondjuk ReadLn utasítással vársz a kilépésre, akkor enélkül is teljes értékű a program.


„4. "begin" (ha jól emlékszem) hogy elinduljon a program”

Nem tudom, mennyire tértetek ki rá, de sok fontos művelet (a FOR ciklus például éppen ilyen) _egyetlen_ utasításra vonatkozik. Ha ez csak egy pontosvesszővel lezárt egyszerű utasítás lehetne, akkor már igen egyszer dolgokat is (itt például azt, hogy mindig kiírasd az aktuális hatványértéket) lehetetlenség lenne megvalósítani. A BEGIN és END azt jelenti a fordító számára, hogy a közéjük írt akárhány sort egy, összetett utasításnak kell tekintenie. Ilyen értelemben maga a program is egy utasítás.


„i := 1; ezt nem tudom”

Az I ugyanolyan számváltozó, mint a többi, csak a program nem a felhasználójától kérdezi meg, hogy mennyi legyen az értéke, hanem maga állítja be. A „:=” azt jelenti, hogy „legyen egyenlő” tehát a sor értelme: „i értéke legyen 1”. Itt azért van szükség erre az értékadásra, hogy az első szorzáskor (vagyis a első hatványának kiszámolásakor) az eredmény 1*A legyen, tehát maga az alapszám.


„for 1 to h do itt ciklusonként bekéri 1-től a "h" értékéig a számokat és elvégzi a műveletet "i:=i*a;" (lehet hogy itt lenne a hiba?)”

Itt már szó volt róla, hogy kell az utasításba egy ciklusváltozó, ennek a kezdőértékét állítod be (ugyanúgy, mint az előbb I-t):

FOR C := 1 ...

és ez a TO után írt értékig fog növekedni (egyéb útmutatás nélkül egyesével):

... TO H DO // (a DO csak annyit tesz, hogy „csináld”)

Elmismásolod az I := I * A; művelet jelentőségét, pedig ez az egész programnak a kulcsa. Ez megint csak egy értékadás, de hétköznapi szemlélettel furcsa, mert olyan, mintha logikai paradoxon lenne benne: I értéke legyen I és A szorzata, de akkor viszont I*A-t kéne A-val beszorozni, hiszen már az van I-ben, stb. De a kifejezés nem így működik, hanem ezt jelenti:

„Szorozd össze I-t A-val, és utána ezt az értéket tedd bele I-be”

...tehát I értéke megváltozik, de ez nem hat vissza a műveletre, az csak az előző értékére vonatkozott.


„readkey; nem egyből jelenjen meg a program, csak egy billentyűkombináció megnyomására (parancsgomb a fordítás, elvileg)”

Nem, mintha érteném nagybecsű szavaidat, de nem egészen ezt jelenti... A ReadKey valóban billentyűütésre vár, amelyet azután azonnal be is olvas (tehát nem kell Enterrel lezárnod). A programok végén egyszerűen azért használatos, hogy a program ablaka ne tűnjön el azonnal az érdemi rész lefutása után. Itt a beolvasott értékkel nem kezdesz semmit, más esetben (nyilván nem a kilépéskor) viszont érdekelhet, hogy a felhasználó milyen gombot nyomott meg, ilyenkor egy CHAR típusú változóba be is tudod tenni az értékét, pl.:

betu := ReadKey;


„end. a program vége.”

Ez igaz, mert az END után pont van. Említettem, hogy az összetett utasításokat is END zárja, ezek után azonban pontosvessző áll, mint minden utasítás végén.


Még annyit megjegyeznék, hogy változónévként én nem tartom szerencsésnek a (pláne csak félig-meddig következetesen alkalmazott) betűjelöléseket. Nyugodtan adhatsz értelmes neveket: alap, kitevo, hatvany, stb. Ciklusváltozóként egyébként régről maradt hagyományként szokás semleges egybetűs változóneveket adni, ezek közt is vannak gyakrabban használatosak, mint például az I vagy a C (iterator/index, counter), de ezek helyett is írhatsz akármit, ha ezáltal érthetőbbé teszed a kódot.

2015. szept. 15. 21:53
Hasznos számodra ez a válasz?
1 2 3 4 5

Kapcsolódó kérdések:




Minden jog fenntartva © 2025, 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!