Hogy oldjam meg Free Pascalban? For ciklus?
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.
@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.
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. :)
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.
for c := 1 to h do
begin
i := i * a;
WriteLn(i);
end;
Erre gondoltál ?
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.
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.
for c := 1 to h do
begin
i := i * a;
WriteLn(a, '^' ,c, '=', i);
end;
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.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!