Kezdőoldal » Számítástechnika » Programozás » Pascal tömb elemek?

Pascal tömb elemek?

Figyelt kérdés

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!



2015. okt. 12. 16:48
1 2
 1/14 tabaki ***** válasza:

É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.

2015. okt. 12. 17:08
Hasznos számodra ez a válasz?
 2/14 tabaki ***** válasza:
+ ...tehát a FOR csak... stb.
2015. okt. 12. 17:10
Hasznos számodra ez a válasz?
 3/14 A kérdező kommentje:

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.

2015. okt. 12. 17:16
 4/14 tabaki ***** válasza:
Persze, úgy is kell. Arra viszont gondolj, hogy az átlag már törtszám lesz, tehát nem integer. Ha csak ki akarod íratni a művelet eredményét, akkor mindegy, de ha el akarod tárolni, akkor lebegőpontos típus kell.
2015. okt. 12. 18:07
Hasznos számodra ez a válasz?
 5/14 A kérdező kommentje:

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! :)

2015. okt. 12. 18:10
 6/14 tabaki ***** válasza:

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.

2015. okt. 12. 19:08
Hasznos számodra ez a válasz?
 7/14 A kérdező kommentje:
Ezekkel annyi a baj hogy sokkal bonyolultabbnak tűnnek. Bár leginkább azért mert vannak benne olyan részek amiket még életemben nem használtam, de még nem is láttam. :)
2015. okt. 12. 19:40
 8/14 tabaki ***** válasza:

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.

2015. okt. 12. 20:43
Hasznos számodra ez a válasz?
 9/14 SimkoL ***** válasza:

: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 :)

2015. okt. 12. 21:14
Hasznos számodra ez a válasz?
 10/14 tabaki ***** válasza:
Na, ez még istenes. Mikor a kódolással égek be, az kínosabb, és az se példátlan...
2015. okt. 12. 21:36
Hasznos számodra ez a válasz?
1 2

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

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!