Toon posts:

[pascal] beginnersprobleempje

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig een pascal-programmaatje te schrijven waar ik niet helemaal uit kom. Het werkt voor 95% alleen er zit nog een klein foutje in:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
program frequentie; uses crt;
var i: integer;
    cijfer: array [1..10] of integer;
    aantal: integer;
begin
   clrscr;
   write ('Geef het aantal in te voeren cijfers: ');
   readln (aantal);
    for i:=0 to aantal do
    begin
    cijfer[i]:=0;
    readln(i);
    cijfer[i]:=cijfer[i]+1;
    end;

for i:=1 to aantal do
 begin
 writeln ('het cijfer ',i,' is ',cijfer[i], ' keer ingetypt.');
 end;
writeln ('geef ENTER om het programma af te sluiten');
readln;
end.

Het proleem is dat ik een variabele (aantal) heb voor een aantal in te voeren cijfers. Alleen het programma stopt wanneer ik het cijfer ingevuld heb wat ik bij aantal ingevoerd heb. Snappie?

Dus stel ik geef aan 5 getallen in te voeren, dan kan ik net zo lang getallen in blijven voeren totdat ik het getal 5 ingeef.
Het zal wel iets heel simpels zijn maar ik zit er al een tijdje op blind te staren.

Alvast bedankt.

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Heb je het programma zelf al eens gedebugged?
Zonee, moet je eens doen. Je zult zelf zien wat er verkeerd aan is, en zo leer je ook het meest.

Het probleem zit hier: je gebruikt je loop variabele om je gegevens in in te geven.
Doe dat niet! Daardoor komt het dat je programma pas stopt als je het getal hebt ingegeven dat je bij aantal hebt ingegeven.
Dit kan er ook voor zorgen dat je geheugen gaat gaan gebruiken dat niet toegewezen is. Je kan nl. meer dan 10 items inlezen, en je hebt slechts een array van 10 items.

Ik denk dat je je boek er nog eens moet bijpakken en het hoofdstuk over loops en arrays moet doornemen, want je code klopt niet echt.
code:
1
2
3
for i := 0 to aantal do begin
   readln(cijfer[i]);
end;

Zal al heel wat beter zijn.

Een for - loop gaat zelf al de 'loop-variabele' (i bij jou) gaan ophogen, dus je hoeft dat niet zelf te doen. Althans, ik vermoed toch dat jij dat probeert.
Jij gaat een getal gaan inlezen, gaat dat gebruiken als subscript en gaat op die plaats in je array de waarde zetten van het volgende element, wat nog niet toegewezen is....

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik dacht de frequentie van de cijfers op deze manier bij te houden:
cijfer[i]:=cijfer[i]+1;
Zo wordt het getal in de array cijfer die van 1 tot 10 loopt toch iedere keer opgehoogd met 1?

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Neen, zoals ik al zei, je for loop zorgt zelf voor die ophoging. Dat is eigen aan een for-loop.

code:
1
cijfer[i] := cijfer[i] + 1 ;

Gaat de waarde die in het i-de element van de array cijfer zit met 1 gaan ophogen.

code:
1
2
for i := 0 to Aantal do begin
end;

Is het equivalent van:
code:
1
2
3
4
i:=0;
while i <= Aantal do begin
  i := i + 1;
end;


Zoals ik al zei,
pak je boekie er nog maar ff bij.

[ Voor 7% gewijzigd door whoami op 19-06-2003 14:04 ]

https://fgheysels.github.io/


  • avon
  • Registratie: November 2002
  • Laatst online: 27-06-2025
ff lussje maken

for i = 1 tot 10 do

cijfer[i]:= waarde

next

Gratis webwinkel beginnen? Met Onetoshop.com kunt u direct beginnen!


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Wat whoami probeerd te zeggen is, dat je je loop-counter laat overschrijven door user-input. ;-) De correctie die hij geeft lost inderdaad je probleem op.

Daarnaast is het inderdaad een probleem dat je maar 10 waardes in mag voeren, maar dat iemand gerust 20 waardes op kan geven. Dit zal je programma laten crashen. 't Is natuurlijk maar een beginners programmatje, maar in principe kan je dit efficienter oplossen.
Waarschijnlijk heb je hier dynamisch gealloceerd geheugen voor nodig.

Zelf vond ik vroeger de Help die bij Borland Pascal geleverd was altijd erg bruikbaar.

grmpf... forum hing. :|

[ specs ] [ Tweaker gallery ]


Verwijderd

Topicstarter
Explore schreef op 19 juni 2003 @ 14:08:
Wat whoami probeerd te zeggen is, dat je je loop-counter laat overschrijven door user-input. ;-) De correctie die hij geeft lost inderdaad je probleem op.

Daarnaast is het inderdaad een probleem dat je maar 10 waardes in mag voeren, maar dat iemand gerust 20 waardes op kan geven. Dit zal je programma laten crashen. 't Is natuurlijk maar een beginners programmatje, maar in principe kan je dit efficienter oplossen.
Waarschijnlijk heb je hier dynamisch gealloceerd geheugen voor nodig.

Zelf vond ik vroeger de Help die bij Borland Pascal geleverd was altijd erg bruikbaar.

grmpf... forum hing. :|
Volgens mij is de bedoeling van het programma niet helemaal goed doorgekomen.
Ik probeer op deze manier een soort van turflijst bij te houden.
Ik heb een array van cijfers. Deze cijfers lopen van 1 t/m 10. Vervolgens geef ik aan hoeveel getallen ik wil inlezen (bijvoorbeeld 5).
Dan geef ik de volgende input:
1
2
2
2
3
Het is de bedoeling dat het programmaatje op het moment dat ik de 5 getallen ingevoerd heb de volgende output geeft:

Het getal 1 is 1 keer ingevoerd
Het getal 2 is 3 keer ingevoerd
Het getal 3 is 1 keer ingevoerd

Op de manier zoals woami het aangaf lees ik getallen in de array in. Dan is 10 een beetje weinig ja. Maar ik wil in de array elk ingevoerd getal in die array per invoer met 1 ophogen. Turven dus ;)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-08 23:56

Janoz

Moderator Devschuur®

!litemod

Er zijn dus 2 verschillende dingen:
1 - het aantal al ingegeven cijfers, deze moet tot 'aantal' lopen.
2 - het ingegeven cijfer dat aangeeft welk array element opgehoogd moet worden.
Waarom gebruik je dan voor beiden i?;)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 02:19

Reptile209

- gers -

Zullen we anders even bij de gote fout (waarom het al helemaal niet werkt dus) beginnen?
Even een korte snip:
Verwijderd schreef op 19 June 2003 @ 13:50:

eerst
Delphi:
1
2
var i: integer;
  cijfer: array [1..10] of integer;

en verderop
Delphi:
1
2
3
for i:=0 to aantal do
  begin
  cijfer[i]:=0;
Je maakt een array van 1 t/m 10, en daarna begin je met je lus op element 0. Dat kan en mag niet van Pascal -> vastloper. Laat dus ofwel je lus bij 1 beginnen (Pascal-style), ofwel laat je array van 0 tot x lopen (C-style).

Zo scherp als een voetbal!

Pagina: 1