[Pascal] Function en Array

Pagina: 1
Acties:

  • Kickasz
  • Registratie: April 2003
  • Niet online
De opdracht is simpel schrijf een functie die de som uitrekent van 10 getallen.

Dit is wat ik tot nu toe heb
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
uses wincrt;

var uitkomst : real ;
    getal : Array of integer ;
    t : integer ;

begin
  t:=0;
  writeln('Voer 10 getallen in');

  while t < 10 do
  begin
   readln(getal[t]);
   uitkomst:=uitkomst+(getal[t]);
   t:=t+1;
  end;

  writeln('De uitkomst is ',uitkomst:2:2);
end.

Maar nu moet ik dus een function gaan gebruiken in deze formule. Het probleem
is dat ik geen array of integer aan de praat kan krijgen in mijn function. Ik zelf
zat hier aan te denken maar dat werkte niet :(.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
uses wincrt;

var uitkomst : real ;
      t : integer ;

Function som (getal : Array of integer): integer;
  begin
    som:=som+getal[t];
  end;

begin
  t:=0;
  writeln('Voer 10 getallen in');

  while t < 10 do
  begin
   readln(getal[t]);
   uitkomst:=som(getal[t]);
   t:=t+1;
  end;

  writeln('De uitkomst is ',uitkomst:2:2);
end.

Heb gezocht naar soort gelijke vragen hier op Got, maar nix kunnen vinden.
Daarnaast had ik wel een handleiding gevonden, maar daar kon ik nix
vinden over het gebruik van een array in een function.

thx 4 jullie hulp :Y)

[ Voor 4% gewijzigd door Kickasz op 11-09-2003 11:06 ]


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Zet je code eens uitgelijnd tussen [code] tags, zo is het moeilijk lezen.

In je functie haal je een array binnen maar doe je vervolgens alleen wat met 1 waarde en de variabele som zijn daar niet bekend.
Je functie en je variabele hetzelfde noemen lijkt me ook niet handig.
Waarschijnlijk zoek je naar een loopje binnen de functie.

Who is John Galt?


  • Brothar
  • Registratie: Oktober 2000
  • Laatst online: 04-02 09:14

Brothar

meester

Je moet ook geen array gebruiken.

[ Voor 18% gewijzigd door Brothar op 11-09-2003 11:14 ]

eagle


  • Kickasz
  • Registratie: April 2003
  • Niet online
mja ok das makkelijk gezegd maar geef me dan een oplossing niet simpel weg een flame dat ik het verkeerd doe want zo ver was ik ook al

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Kickasz schreef op 11 September 2003 @ 11:14:
mja ok das makkelijk gezegd maar geef me dan een oplossing niet simpel weg een flame dat ik het verkeerd doe want zo ver was ik ook al
Als je som aanroept, is de uitkomst van som niet gedefinieerd. Aan het einde van de de functie som kan je het resultaat toe (som:=som+getal[t]) Maar som was dus nog niet gedefinieerd.

De volgende keer dat je som aanroept is de uitkomst van som weer niet gedefinieerd (de functie zelf weet dus NIET wat het resultaat van zijn vorige aanroep was).

Ten tweede geef je een array mee aan de som functie, terwijl een integer zou volstaan.

Zie dit niet als een flame, maar misschien is het een idee om nog eens een Pascal boek of tutorial er eens bij te pakken en dan met name het stukje over procedures en functies want je haalt nu wat dingen door elkaar.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

De code die je gemaakt hebt zonder functie is ook niet helemaal goed. Tis een wonder dat ie niet knalt eigenlijk :) Je declareerd namelijk een Dynamisch, maar reserveerd geen ruimte ervoor en loopt in geheugen te schrijven wat niet mag. Dit is beter:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
uses wincrt;

var uitkomst : real ;
    getal : Array[0..9] of Integer;  // Geen dynamisch array meer, maar nu statisch
    t : integer ;

begin
  t:=0;
  writeln('Voer 10 getallen in');

  while t < 10 do
  begin
   readln(getal[t]);
   uitkomst:=uitkomst+(getal[t]);
   t:=t+1;
  end;

  writeln('De uitkomst is ',uitkomst:2:2);
end.


Wat werkt er dan niet als je t ombouwt naar een functie? Lees ook even [rml][ Delphi] Hoe wordt parameter aan procedure doorgegeven?[/rml] en [rml][ Delphi] Array meegeven als parameter procedure[/rml]

We adore chaos because we like to restore order - M.C. Escher


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Creepy schreef op 11 September 2003 @ 11:27:
Ten tweede geef je een array mee aan de som functie, terwijl een integer zou volstaan.
Ik denk dat ie zijn opdracht niet helemaal snapt :) Volgensmij moet ie eerst het hele array inlezen en dan in een functie het array doorlopen en de som ervan geven.

We adore chaos because we like to restore order - M.C. Escher


  • Kickasz
  • Registratie: April 2003
  • Niet online
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
program opdra17;

uses wincrt;

var  uitk,getal1,getal2,getal3,getal4,getal5,getal6,getal7,getal8,getal9,getal10 : integer ;

Function som (a,b,c,d,e,f,g,h,i,j: integer): integer;
  begin
    som:=a+b+c+d+e+f+g+h+i+j;
  end;

begin
  writeln('Voer 10 getallen in');
  readln(getal1,getal2,getal3,getal4,getal5,getal6,getal7,getal8,getal9,getal10);
  uitk:=som(getal1,getal2,getal3,getal4,getal5,getal5,getal7,getal8,getal9,getal10);
  writeln('De uitkomst is ', uitk);

end.



Dit is de opdracht zoals ie moet wezen, nou wil ik dus alleen ipv getal1 t/m getal10 een array gebruiken. Mijn excuses als mijn vraag wat onduidelijk was :o

[ Voor 4% gewijzigd door Kickasz op 11-09-2003 12:02 ]


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

Janoz

Moderator Devschuur®

!litemod

Je hebt een array gedefinieerd om mee te geven, maar je geeft een element me. Dat is dus geen array. Je moet meer code in je functie verplaatsten. Stel je wilt in een functie de som van de getallen in een array hebben. Waarom heb je de while lus dan niet in die functie staan?

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


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Zie de topics die ik hierboven gaf. Als je dan er nog niet uit komt moet je hier er maar even een vraag over stellen.

We adore chaos because we like to restore order - M.C. Escher


  • Brothar
  • Registratie: Oktober 2000
  • Laatst online: 04-02 09:14

Brothar

meester

Was geen flame, maar een vingerwijzing hoe je het kunt oplossen. (NB er zijn een aantal mogelijke oplossingen; ik dacht aan 1 zonder gebruikmaking van een array).

De truc is: tijdens de loop, waarmee je de getallen (eventueel, maar niet noodzakelijkerwijs in een array) krijgt ingevoerd, roep je de functie aan, waardoor het totaal steeds wordt 'bijgesteld' (precies zoals je dat doet bij hoofdrekenen).

In je functie-aanroep geef je dan 2 (!) parameters door: het totaal tot dan toe, en het getal dat erbij moet worden opgeteld.

Tip: begin eerst met pseudocode/PSD, en ga dan in Pascal coderen.
(ik zie tenminste niet dat je dat hebt gedaan).

[ Voor 31% gewijzigd door Brothar op 11-09-2003 14:08 ]

eagle


Verwijderd

Eerst getallen inlezen met een for loop in een array en dan die array meegeven aan functie die array doorloopt en getallen opteld.

uit me hoofd zoiets als dit, kan qua syntax vrij brak zijn, maar heb al tijd geen delphi gedaan :)

code:
1
2
3
4
5
6
7
8
9
10
function Som(IntArray: Array[0..9] of Integer): Integer
var
   i: Integer;
begin
   Result := 0;
   for (i := 0 to IntArray.ItemIndex - 1) do
   begin
      Result := Result + IntArray[i];
   end
end;

[ Voor 14% gewijzigd door Verwijderd op 11-09-2003 15:50 . Reden: Geen code gebruikt ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 00:12

Tomatoman

Fulltime prutser

Om te beginnen is een while-constructie vaak eenvoudig te vervangen door een for-constructie. Dit is een standaard while-constructie:
Delphi:
1
2
3
4
5
6
7
8
9
10
var
  i: Integer;
begin
  i := 0;
  while i < 10 do
  begin
    DoeIets;
    i := i + 1;
  end;
end;

Dit is het equivalent in de vorm van een for-constructie:
Delphi:
1
2
3
4
5
6
var
  i: Integer;
begin
  for i := 0 to 9 do
    DoeIets;
end;

De voordelen zijn duidelijk: het is gemakkelijker te begrijpen, het kost (vaak) wat minder regels code, maar het belangrijkste is dat je bij een while-constructie veel sneller een fout maakt. Je hoeft dan alleen bijvoorbeeld i := 0 te vergeten en er gebeuren allerlei onverwachtse dingen. Een while-constructie is dus niet fout, maar vaak kan het wat handiger met for (er zijn natuurlijk uitzonderingen).

Dan het opvragen van alle waarden. Dat kan zoals je zelf al opmerkte met een array:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
program Berekening1

uses WinCrt;

var
  Invoer : array[0..9] of Integer;
  i, j, Totaal: Integer;
begin
  { Tien getallen opvragen}
  WriteLn('Voer 10 getallen in');
  for i := 0 to 9 do
    ReadLn(Invoer[i]);
Nu heb je alle getallen, maar moet je er nog wat mee doen. Daarom:
Delphi:
13
14
15
16
17
18
19
  { De getallen optellen }
  Totaal := 0; // Niet vergeten een beginwaarde te geven
  for j := 0 to 9 do // Je kunt ook i hergebruiken en j weglaten
    Totaal := Totaal + Invoer[j];
  { Resultaat weergeven }
  WriteLn('De uitkomst is ', Totaal);
end.
Nu heb je een stuk code waar je eerst tien getallen opvraagt en ze vervolgens alletien bij elkaar optelt, maar het kan nog wat eenvoudiger. Je kunt immers ieder getal dat de gebruiker invoert al meteen bij het totaal optellen:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
program Berekening2

uses WinCrt;

var
  Invoer, i, Totaal: Integer;
begin
  Totaal := 0; // Niet vergeten een beginwaarde te geven
  WriteLn('Voer 10 getallen in');
  for i := 0 to 9 do
  begin
    ReadLn(Invoer);
    Totaal := Totaal + Invoer;
  end;
  WriteLn('De uitkomst is ', Totaal);
end.
Aangezien je niet alle invoerwaardes tijdelijk hoeft te onthouden, heb je in dit tweede voorbeeld geen array meer nodig. Invoer is in dit voorbeeld daarom gewoon een Integer.

Ik realiseer me dat ik je nu twee werkende voorbeelden compleet heb voorgekauwd, maar ik hoop dat je wat geleerd hebt van de denkwijze om tot dit resultaat te komen.

[ Voor 2% gewijzigd door Tomatoman op 11-09-2003 18:20 . Reden: foutje in code ]

Een goede grap mag vrienden kosten.

Pagina: 1