Mit rontottam el/hogy kéne megcsinálni? (Free pascal)
A feladat:
Kérjünk be két természetes számot (M,N), majd rajzoljunk ki a képernyőre egy MxN méretű paralelogrammát csillag (*) jelekből (a paralelogrammának N sora legyen, mindegyik sorban M csillaggal).
Például M=8 és N=3-ra:
********
********
********
Az én megoldásom:
program paralelogramma;
var n,m,i,s,h:integer;
begin
write ('Írj be 2 természetes számot szóközzel elválasztva! ');
read(n,m);
for i:=1 to n do begin
for h:=n downto 0 do write (' ');
for s:=1 to m do write ('*');
writeln;
end;
end.
Minden sor elejére n szóközt ír..... tudom, hogy a downto-s sorban van a hiba, de nem jövök rá, hogyan kellene megcsinálni.
Hát nézzük: az első sorba 2 = (n-1) spacet akarsz írni. A 2. sorba 1 = (n-2) = (n-i)
A ciklusokba belekavarodtál. A begin-től endig lévő rész csak egy sor kiírásáért felelős, ott nem kell downto.
Helyesen: for h:=0 to n-i do write(' ');
Nem szoktam kóddal válaszolni, de megdolgoztál vele...
program paralelogramma;
var n,m,i,s,h:integer;
begin
write ('Írj be 2 természetes számot szóközzel elválasztva! ');
read(n,m);
for i:=1 to n do begin
for h:=1 to n do write (' '); // így egyszerűbb...
for s:=1 to m do write ('*');
writeln;
dec(n); // lényeg
end;
end.
Amúgy be vagy oltva beszélő változónevek ellen, vagy mi? Őszintén szólva nemigen fedeztem fel logikát a változóneveidben. Kissé átesve a ló túlsó oldalára, lehetett volna ilyesmi:
program paralelogramma;
var magassag,szelesseg,szamlalo,csillagok,szokozok:integer;
begin
write ('Írj be 2 természetes számot szóközzel elválasztva! ');
read(magassag,szelesseg);
for szamlalo:=1 to magassag do begin
for szokozok:=1 to magassag do write (' ');
for csillagok:=1 to szelesseg do write ('*');
writeln;
dec(magassag);
end;
end.
Kissé értelemzavaró ugyan, hogy egy MAGASSAG nevű változót csökkentesz a ciklusban, de nevezheted másképp is... Ellenkező dőléshez bevezethetsz egy újabb változót:
program paralelogramma;
var magassag,szelesseg,eltolas,szamlalo,csillagok,szokozok:integer;
begin
write ('Írj be 2 természetes számot szóközzel elválasztva! ');
read(magassag,szelesseg);
eltolas:=1;
for szamlalo:=1 to magassag do begin
for szokozok:=1 to eltolas do write (' ');
for csillagok:=1 to szelesseg do write ('*');
writeln;
inc(eltolas);
end;
end.
A fenti programok egy szóközzel eltolják a paralelogrammádat. Ha ez zavar, némi bonyolítással ki tudod küszöbölni, kihasználva, hogy a ciklus nem fut le, ha a végértéke kisebb a kezdőértéknél:
program paralelogramma; // jobbra dőlő
var magassag,szelesseg,szamlalo,csillagok,szokozok:integer;
begin
write ('Írj be 2 természetes számot szóközzel elválasztva! ');
read(magassag,szelesseg);
for szamlalo:=1 to magassag do begin
for szokozok:=1 to magassag-1 do write (' '); // 0 esetén egyszer se fut le
for csillagok:=1 to szelesseg do write ('*');
writeln;
dec(magassag);
end;
end.
program paralelogramma; // balra dőlő
var magassag,szelesseg,eltolas,szamlalo,csillagok,szokozok:integer;
begin
write ('Írj be 2 természetes számot szóközzel elválasztva! ');
read(magassag,szelesseg);
eltolas:=0; // emiatt nem ír szóközt első alkalommal
for szamlalo:=1 to magassag do begin
for szokozok:=1 to eltolas do write (' ');
for csillagok:=1 to szelesseg do write ('*');
writeln;
inc(eltolas);
end;
end.
A dec() csökkenti, az inc() növeli a változó értékét (decrease, increase).
Itt ezt is írhatod helyettük:
magassag:=magassag-1; //dec(magassag);
eltolas:=eltolas+1; //inc(eltolas);
Ami a változókat illeti, nem muszáj negyed sor hosszúságú neveket adnod nekik, de a 3-4 karakteres értelmes rövidítésekre igazán rákaphatnál. Gondolj arra, hogy nemcsak tíz soros programokat fogsz majd írni öt változóval. Lehet, hogy a kód megírásakor még nem állsz fejre a sok értelmetlen betűnévtől, de képzeld el, hogy két hét múlva akarsz javítani valami bosszantó hibát, amikor már túl vagy néhány másik programon... Az is lehet, hogy megint tanácsot kérnél valakitől, vajon hova fog kívánni az illető a nyolc oldalon (és akkor még finom voltam) sereglő ábécés változóiddal? A munkát inkább a szövegszerkesztő funkciók használatával csökkentsd.
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!