Programmeren

Het forum voor overige vragen betreffende wiskunde uit het hoger onderwijs.
Plaats reactie
BusinessMath
Vast lid
Vast lid
Berichten: 57
Lid geworden op: 23 feb 2014, 15:14

Programmeren

Bericht door BusinessMath » 08 mar 2014, 18:06

Hallo

ik had nog een vraag.
ik ben nu bezig met programmeren, om eerste paasdag te berekenen.

Dit is wat ik heb gemaakt.

Code: Selecteer alles


function pasen (n: integer): string;                  {de functie pasen}
Var jaartal, i, a, b, m, q, w,d  :integer;

Begin
      jaartal:= StrToInt(form1.Edit1.text);     {het jaartal dat wordt ingevuld}
      i:= jaartal + 9;

        while jaartal <= i do                        {herhaling met while...do}

           begin
            n := (jaartal - 1900);
            a := n MOD 19;
            b := (7*a+1) DIV 19;
            m := (11*a+4-b) MOD 29;
            q := n DIV 4;
            w := (n+q+31-m) MOD 7;
            d := 25-m-w;
            jaartal:= jaartal + 1;                            {voor de herhaling}

            if d>0 then
            Result:=  Form1.memo1.lines.add(IntToStr(d) +  ' april ' + IntToStr(1900+n)) {antwoord als d>0}
            else
            Result:= Form1.Memo1.lines.add(IntToStr(31+d) + ' maart ' + IntToStr(1900+n));
            end;

End;

procedure TForm1.Button1Click(Sender: TObject);
Var jaartal : integer;

begin
       jaartal:= StrToInt(edit1.text);                        {het jaartal dat wordt ingevuld}
       memo1.clear;
          if (edit1.text >= '0') then
             begin
               IntToStr(jaartal);
               Memo1.text:= Pasen(jaartal);                        {het aanroepen van de functie pasen}
             end;

end;
end.
Alleen als ik nu op runnen wil drukken, komt er een fout te staan. ik kan niet ontdekken wat ik fout heb gedaan.
Ik denk echt dat het heel makkelijk is, maar kan gewoon niet bedenken hoe het anders moet.

Dit is de fout die het programma geeft. Links onderin staan de fouten weergegeven, het gaat om de bovenste 2. De eerste fout is rood gemarkeerd in het programma en de tweede fout gaat over de regel eronder.

Afbeelding

Hopelijk kunnen jullie mij helpen!

Bedankt :mrgreen:
Durf te vragen!

arie
Moderator
Moderator
Berichten: 3911
Lid geworden op: 09 mei 2008, 09:19

Re: Programmeren

Bericht door arie » 08 mar 2014, 23:42

Ik verwacht dat de functie Form1.Memo1.lines.add() een Integer teruggeeft, terwijl Result een string verwacht (want de functie pasen() geeft als resultaat een string terug).
In dat geval zou deze aanpassing van de if-statement de oplossing zijn:

Code: Selecteer alles

if d>0 then
    Result := IntToStr(d) +  ' april ' + IntToStr(1900+n) {antwoord als d>0}
else
    Result := IntToStr(31+d) + ' maart ' + IntToStr(1900+n);
end;
Nu ken je aan Result een string toe.

(in je procedure TForm1.Button1Click() wordt die string dan vervolgens na aanroep van pasen() toegekend aan Memo1.text)

Werkt dit zo?

PS1: de volgende regel heeft volgens mij geen effect en kan je weglaten : IntToStr(jaartal);

PS2: kijk ook nog eens naar je functie pasen():
Is het niet de bedoeling dan je een functie pasen(jaartal: Integer) maakt die voor 1 jaar (namelijk jaartal) voor dat jaar een string met de paasdatum teruggeeft ? De herhaling voor een aantal jaren (je while-constructie) kan je dan inbouwen in de procedure TForm1.Button1Click(), waarbinnen je eerst de nieuwe functie pasen(jaartal) voor de gewenste jaren aanroept, en steeds elk resultaat van die aanroep toevoegt aan Form1.memo1.

Gebruikersavatar
op=op
Vergevorderde
Vergevorderde
Berichten: 1087
Lid geworden op: 23 apr 2010, 18:11

Re: Programmeren

Bericht door op=op » 09 mar 2014, 08:32

Even apart van je probleem.
Je schrijft:
function pasen (n: integer): string; {de functie pasen}

Wat heeft het commentaar {de functie pasen} voor zin?

of:
while jaartal <= i do {herhaling met while...do}

{herhaling met while...do}. Dat zie ik ook wel.

Commentaren die niets toevoegen zijn storend voor de lezer.
Je helpt de lezer door steekhoudende commentaren.
B.v.
function pasen (n: integer): string; {deze functie berekent de paasdag voor het jaar n}

while jaartal <= i do {'geef hier de formule die je hanteert'}

BusinessMath
Vast lid
Vast lid
Berichten: 57
Lid geworden op: 23 feb 2014, 15:14

Re: Programmeren

Bericht door BusinessMath » 10 mar 2014, 19:07

Ik heb het aangepast. er worden nu geen foutmeldingen meer gegeven.

Ik heb zoals je zei ook de functie aangemaakt dat geld voor één jaar.

Maar nu ik het ga invullen, krijg ik maar één antwoord in plaats van 10. (dat is de bedoeling)

Ik heb nu dit.

Code: Selecteer alles

function pasen (n: integer): string;                  
Var jaartal, i, a, b, m, q, w,d  :integer;

Begin
      jaartal:= StrToInt(form1.Edit1.text);     {het jaartal dat wordt ingevuld}

            n := (jaartal - 1900);
            a := n MOD 19;
            b := (7*a+1) DIV 19;
            m := (11*a+4-b) MOD 29;
            q := n DIV 4;
            w := (n+q+31-m) MOD 7;
            d := 25-m-w;

            if d>0 then
            Result:= (IntToStr(d) +  ' april ' + IntToStr(1900+n)) {antwoord als d>0}
            else
            Result:= (IntToStr(31+d) + ' maart ' + IntToStr(1900+n));



End;

procedure TForm1.Button1Click(Sender: TObject);
Var jaartal,i : integer;

begin
        jaartal:= StrToInt(edit1.text);                        {het jaartal dat wordt ingevuld}
        memo1.clear;
        i:= jaartal + 9  ;

        while jaartal <= i do
        Begin
           memo1.text:= pasen(jaartal) ;
           jaartal:= jaartal +1;

        end;
end;

Volgens mij klopt het nu niet in de Procedure buttonclick.
Moet ik Het aanroepen van de functie pasen wel beginnen met meom1.text? of komt dit later pas?
Waarom rekent hij maar voor één jaar uit, en niet de komende 10 jaar, ik heb er toch duidelijk in staan dat het herhaald moet worden? of mis ik iets?
Ik zie het niet.
Durf te vragen!

arie
Moderator
Moderator
Berichten: 3911
Lid geworden op: 09 mei 2008, 09:19

Re: Programmeren

Bericht door arie » 10 mar 2014, 20:11

Je functie pasen heeft als invoerparameter n, maar daar doe je nu niets mee (de variabele jaartal lees je binnen de functie steeds uit form1.Edit1.text).
De invoerparameter zou jaartal moeten zijn = het jaartal waarvoor de paasdag (is dit steeds de eerste of tweede paasdag?) berekend zou moeten worden.
De regel
jaartal:= StrToInt(form1.Edit1.text); {het jaartal dat wordt ingevuld}
heb je dan niet meer nodig en kan verdwijnen.
Dat is mooi: op die manier wordt pasen() nu ONafhankelijk van het bestaan van form1.Edit1, maar alleen afhankelijk van jaartal waarmee je de functie aanroept. Je kan die functie dan overal waar je wil hergebruiken:
- alles wat je functie nodig heeft geef je mee als invoerparameter
- de berekening ligt vast in die functie
- het resultaat van de berekening is de uitvoer van je functie.

Wat commentaar betreft: je kan boven aan de functie wel aangeven wat de functie doet, zo nodig ook expliciet wat er in moet en wat er uit komt.
Dit lijkt wat overdreven maar je kan dan direct zien wat de functie doet, eist en teruggeeft zonder in de code te kijken.
(bovendien kunnen sommige programmeeromgevingen hieruit zelfs automatisch de documentatie van je programma genereren, bijvoorbeeld als html, pdf, etc).

Je functie wordt dan:

Code: Selecteer alles

{ pasen: bereken de eerste paasdag van een gegeven jaar }
{ IN: jaartal van het jaar waarin de eerste paasdag berekend moet worden }
{ OUT: string met de datum van eerste paasdag }
function pasen (jaartal: integer): string;                  
Var jaartal, i, a, b, m, q, w, d, n  :integer;

Begin
            n := (jaartal - 1900);
            a := n MOD 19;
            b := (7*a+1) DIV 19;
            m := (11*a+4-b) MOD 29;
            q := n DIV 4;
            w := (n+q+31-m) MOD 7;
            d := 25-m-w;

            if d>0 then
                Result:= (IntToStr(d) +  ' april ' + IntToStr(1900+n)) {antwoord als d>0}
            else
                Result:= (IntToStr(31+d) + ' maart ' + IntToStr(1900+n));

End;
Nu werkt dit deel: pasen() geeft nu de gewenste string terug voor het gegeven jaartal.


Wat betreft procedure TForm1.Button1Click():
de regel
memo1.text:= pasen(jaartal);
maakt memo1.text steeds gelijk aan de laatste output van pasen().
Lukt het je om dit te veranderen zodanig dat de output van elke aanroep van pasen() wordt toegevoegd aan memo1.text ?

BusinessMath
Vast lid
Vast lid
Berichten: 57
Lid geworden op: 23 feb 2014, 15:14

Re: Programmeren

Bericht door BusinessMath » 11 mar 2014, 13:53

Bedankt.

Dit is mijn oplossing.

Code: Selecteer alles

procedure TForm1.Button1Click(Sender: TObject);
Var jaartal,i : integer;

begin
        jaartal:= StrToInt(edit1.text);                        {het jaartal dat wordt ingevuld}
        memo1.clear;
        i:= jaartal +9;

            while jaartal <= i do
               begin
                  pasen(jaartal)   ;
                  memo1.lines.add(pasen(jaartal));
                  jaartal:=jaartal+1;
               end;
Ik had memo1.text maar dat moest memo1.lines.add zijn, zodat de aantwoorden steeds worden toegevoegd.

Ik krijg nu wel 10 antwoorden! :)
Durf te vragen!

arie
Moderator
Moderator
Berichten: 3911
Lid geworden op: 09 mei 2008, 09:19

Re: Programmeren

Bericht door arie » 11 mar 2014, 17:06

Mooi!

Nog een kleine tip:
probeer je variabelen een zo intuitief mogelijke naam te geven:
voorbeeld: i is in je procedure TForm1.Button1Click() het maximale jaartal dat je wil tonen, dan kan je dat bijvoorbeeld maxjaartal noemen. Je code wordt daardoor:

Code: Selecteer alles

procedure TForm1.Button1Click(Sender: TObject);
Var jaartal, maxjaartal : integer;

begin
        jaartal:= StrToInt(edit1.text);                        {het jaartal dat wordt ingevuld}
        memo1.clear;
        maxjaartal := jaartal + 9;

            while jaartal <= maxjaartal do
               begin
                 :
                 etc.
Dit is voor anderen die je code lezen (en voor jezelf over een aantal jaar) veel duidelijker.
In een kort programma zoals dit valt dat natuurlijk wel mee, maar als programma's groter wordt heeft dat wel voordeel.

In je functie pasen() gebruik je waarschijnlijk de letters uit een of meer formules, die letters kan je dan wel aanhouden (identiek aan de letters uit de formules die je gebruikt).

BusinessMath
Vast lid
Vast lid
Berichten: 57
Lid geworden op: 23 feb 2014, 15:14

Re: Programmeren

Bericht door BusinessMath » 12 mar 2014, 17:05

Bedankt voor de tip.
Dit ga ik zeker gebruiken. Het wordt er inderdaad veel overzichtelijker van en je ziet gelijk wat er mee wordt bedoeld. :mrgreen:
Durf te vragen!

Plaats reactie