Pascal tömb elemek?
Sziasztok!
Lenne egy feladatom ami egy darabig el is fut rendesen, de van egy hiba amire nem tudok rájönni sehogyan mi lehet az!
A lényeg az lenne hogy egy 10 számból álló tömbnek kellene az összegét kiszámoltatni és kiíratni.
A probléma az lenne, hogy 10 szám helyett csak egy számot ír ki mint tömb, de az összegét kiírja a többi számjeggyel együtt.
program asd;
uses crt;
var
szamsor : array [1..10] of integer;
osszeg,i : integer;
begin
clrscr;
randomize;
begin
for i:= 1 to 10 do
szamsor[i]:=random(100);
write(' ',szamsor[i]);
end;
begin
writeln(' ');
for i:= 1 to 10 do
osszeg:=(osszeg+szamsor[i]);
write('osszeg ',osszeg);
end;
readln;
end.
Erre jutottam eddig. Megköszönném ha valaki elmagyarázná hogy hol a hiba!
Értelmetlenül használod a begin/end blokkot. Ha a ciklusban több utasítást akarsz végrehajtani, akkor azokat kell begin és end közé fogni, kb így:
for i:= 1 to 10 do
begin
szamsor[i]:=random(100);
write(' ',szamsor[i]);
end;
A kívánt sorokból így lesz *összetett* utasítás. Te nem rakod őket begin és end közé, tehát csak a for csak a következő sort, mint *egyszerű* utasítást, hajtja végre. Ezen nem változtat, hogy ötletszerűen begin/else blokkokba rendezed a kódot.
Ahogy kiírtam a kérdést én is kipróbáltam, és észre is vettem, de így már világosabb ahogy leírtad. Köszönöm szépen!
Esetleg azt nem tudnád leírni hogy ezeknek a számoknak az átlagát hogyan számoltathatnám ki? Én arra gondolok hogy az összeget elosztom tízzel.
program asd;
uses crt;
var
szamsor : array [1..10] of longint;
x,atlag,osszeg,i : longint;
begin
clrscr;
randomize;
x:=10;
for i:= 1 to 10 do
begin
szamsor[i]:=random(100);
write(' ',szamsor[i]);
end;
writeln(' ');
for i:= 1 to 10 do
osszeg:=(osszeg+szamsor[i]);
write('osszeg ',osszeg);
writeln(' ');
atlag:=(osszeg div x);
write('atlag ',atlag);
write(',' ,osszeg mod x);
readln;
end.
Így jó eredményeket kapok 100 százalékban. Köszönöm szépen még egyszer a segítséget! :)
Ez igaz, de semmi szerepét nem látom az X változónak, bátran állhatna a helyén a 10 konstans.
Az én változatom:
program tombosszeg;
uses Crt;
var
szamsor : array [1..10] of byte;
osszeg, i : integer;
begin
ClrScr;
Randomize;
for i:= 1 to 10 do
begin
szamsor[i] := Random(100);
Write(szamsor[i], ' ');
end;
WriteLn; WriteLn;
osszeg := szamsor[1];
for i:= 2 to 10 do
begin
Write(osszeg, ' + ', szamsor[i], ' = ');
Inc(osszeg, szamsor[i]);
writeLn(osszeg);
end;
WriteLn;
writeLn('Osszeg: ', osszeg);
writeLn('Atlag: ', osszeg * 0.1 :3:1);
readln;
end.
Más lenne a helyzet, ha azt szeretnéd, hogy könnyen átírhasd a programot más hosszúságú tömbre, de ekkor sem kell változót használnod, elég egy CONST az elejére:
program tombosszeg;
uses Crt;
const
tombelemszam = 15;
var
szamsor : array [1..tombelemszam] of byte;
osszeg, i : integer;
begin
ClrScr;
Randomize;
for i:= 1 to tombelemszam do
begin
szamsor[i] := Random(100);
Write(szamsor[i], ' ');
end;
WriteLn; WriteLn;
osszeg := szamsor[1];
for i:= 2 to tombelemszam do
begin
Write(osszeg, ' + ', szamsor[i], ' = ');
Inc(osszeg, szamsor[i]);
writeLn(osszeg);
end;
WriteLn;
WriteLn('Osszeg: ', osszeg);
WriteLn('Atlag, 3 tizedesjegyig: ', osszeg / tombelemszam :3:3);
readln;
end.
Még tökéletesebb lenne a megoldás, ha az elején bekérnéd a tömb hosszát, ekkor azt valóban változóban tárolhatnád. Ennek a tisztességes megvalósításához viszont dinamikus tömböt kéne használnod, ezzel egyelőre nem terhellek. A másik, egyáltalán nem elegáns megoldás, hogy egy sokkal nagyobb tömböt definiálsz, és annak csak a méret-változóban kapott számú elemét használod. Szerintem a gyakorlás kedvéért érdemes lenne megírnod ezt a verziót is, csak rá ne szokj a módszerre.
Hááát... én túl sok ilyen részletet nem látok, esetleg a következőket:
Inc(osszeg, szamsor[i]);
Az Inc() növelő függvény, amely a zárójelben megadott első értéket megnöveli a másodikkal. Ha csak egy értéket adsz meg, akkor eggyel növel.
Tehát „Inc(osszeg, szamsor[i]);” helyett írhatod, hogy „osszeg := osszeg + szamsor[i];”
„Inc(osszeg);” ugyanazt jelenti, mint „osszeg := osszeg + 1;”.
Ezt a részt nyugodtan írd át, az ismerősebb megoldásra.
:3:3
Ez annyit jelent, hogy az előtte álló értéknek (ebben az esetben a művelet eredményének) a kiírását a kettőspontok után megadott számú számjegyekre csonkolod a tizedespont előtt és után. Ebben az esetben például az érték mindenképpen kisebb lesz száznál, tehát az egész résznek feltétlenül elegendő a 3 számjegy, a törtrésznek pedig mondjuk, hogy megelégszünk ennyivel. Megadhatsz neki nagyobb pontosségot is (pl. osszeg / tombelemszam :3:12), sőt el is hagyhatod ezt a formázást. Utóbbi esetben azonban egy rosszabbul olvasható, kellemetlen kiírási módot kapsz. Próbáld ki!
Az első program a tízes osztó miatt garantáltan nem igényel egynél több tizedesjegyet, ezért formáztam így az eredményt:
:3:1
A CONST azért hasznos, mert így névvel hivatkozhatsz egy állandó értékre. Megírhattam volna úgy is, hogy minden helyre, ahol most TOMBELEMSZAM szerepel, beírom a tömb méretét (vagyis 15-öt), a program ugyanaz lenne. Ha viszont hirtelen az az ötletem támad, hogy 7 vagy 32 elemű tömböt szeretnék, sokkal kényelmesebb egy helyen a legelején megváltoztatni ezt az értéket, mintsem minduntalan végigbogarászni a teljes kódot, és minden helyen megváltoztatni, ráadásul az utóbbi módszerrel a hibázás lehetősége is sokkal nagyobb. Így a fordító tudja, hogy valahányszor TOMBELEMSZAM szerepel a szövegben, oda az elején megadott számot kell írnia, ha az 15, akkor annyit, ha valami más, akkor meg amannyit.
Szerintem minden egyéb ismerős kell, hogy legyen a számodra, de ha valami elkerülte a figyelmemet, kérdezz, azért van az oldal.
:3:3 Ebben annyit javítanék, hogy az egészeket mindig kiírja teljes egészében még akkor is ha hosszabbak az 'előírtnál', tehát ott nem csonkol. A tizedes részen vagy vág vagy ha rövidebb akkor 0-kal kiegészít a kellő hosszra.
Bocs, hogy beleszóltam :)
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!