Free Pascal? DIV, MOD
Leírná nekem valaki részletesen, hogy a DIV és a MOD hogyan működik?
Esetleg pluszban még ehhez a sorhoz egy magyarázatot is.
while (a mod 7>0) or (a mod 2>0) do a:=a+1;
A div a sima maradékos osztás, megadja, hogy a baloldali számban hányszor van meg a jobboldali.
Pl 12 div 4 = 3, pont ahogy 12/4 = 3. De 13 div 4 is 3 lesz, mivel maradékos osztás, és csak az egész értéket fogja visszaadni (nem kerekít, csak elhagyja a maradékot, ez fontos!)
A mod pedig a moduló művelet, ez pedig ponthogy az osztás utáni maradékot fogja megadni. 12 mod 4 = 0, mivel 12-t 4-el elosztva 0 lesz a maradék. 13 mod 4 esetén pedig 1 lesz az eredmény.
Amire itt oda kell figyelni, hogy Pascalban a moduló művelet előjele a baloldali értéktől függ. Tehát:
13 mod 4 = 1
13 mod (-4) = 1
viszont,
-13 mod 4 = -1
-13 mod (-4) = -1
while (a mod 7>0) or (a mod 2>0) do a:=a+1;
Amíg A változó héttel vagy kettővel való osztásának egész része nagyobb nullánál, addig növeld eggyel az értékét.
+ JUJ,DE CSÚNYÁT MONDTAM!
Amíg A változó héttel vagy kettővel való osztásának MARADÉKA nagyobb nullánál, addig növeld eggyel az értékét. (tehát hagyd abba, ha héttel vagy kettővel osztható)
a 'while (a mod 7 > 0) or (a mod 2 > 0) do Inc(a);' értelmezése jelen esetben, addig növeld a értékét amíg kettővel ÉS héttel nem lesz osztható maradék nélkül.
Az elől és hátultesztelős ciklusok 'érdekessége'.
program Project2;
{$APPTYPE CONSOLE}
uses SysUtils;
var a : Integer;
begin
a := 1;
while (a mod 7 > 0) or (a mod 2 > 0) do
begin
Write(a:3);
Inc(a);
end;
a := 1;
repeat
Write(a:3);
Inc(a);
until (a mod 7 > 0) or (a mod 2 > 0);
ReadLn;
end.
Az első ciklusunk 14-ig fut a második 2-ig. Ha a while ciklusban a feltétel 'while (a mod 7 > 0) and (a mod 2 > 0) do Inc(a);' lenne az is csak kettőig futna.
@SimkoL:
Igazad van. Most már nem is merek az éjszakázás áldatlan hatásaival mentegetőzni, lassan szembe kell néznem a szellemi leépülés rémével. Hiába olajoztam Soproni Fekete Démonnnal az akadozó fogaskerekeket, már az se a régi...
@Kérdező:
Az idézett sor logikája tehát nagyjából:
Akkor fejezd be a ciklust, ha A osztható héttel, de ez alól felmentést ad, ha ugyanakkor nem osztható kettővel. Az (A mod 7) is, meg az (A mod 2) is igaz vagy hamis értékeket szolgáltató kifejezések, tehát:
hamis vagy hamis → // egyikkel sem osztható, folytasd
igaz vagy hamis → // 7 osztja, de 2 nem, folytasd
igaz vagy igaz → // mindkettő osztja, teljesült a feltétel, állj le
Vagyis a cseles ciklus a 7 első páros többszörösénél áll le.
Itt SimkoL programját úgy módosítottam, hogy a REPEAT most ugyanazt csinálja a WHILE, esetleg így még jobban látszik a különbség a feltételek megadása között:
program WhileRepeat;
var a : Integer;
begin
a := 1;
while (a mod 7 > 0) or (a mod 2 > 0) do
begin
Write(a:3);
Inc(a);
end;
WriteLn;
a := 1;
repeat
Write(a:3);
Inc(a);
until (a mod 7 = 0) and (a mod 2 = 0);
ReadLn;
end.
Kapcsolódó 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!