Programmeren 'Tovervierkant'

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 'Tovervierkant'

Bericht door BusinessMath » 25 mar 2014, 17:44

Hallo,

Dit is de opdracht::
Programma-opzet

Schrijf een programma dat een tovervierkant weergeeft op het scherm volgens het onderstaande algoritme.
De gebruiker geeft de orde (oneven) van het tovervierkant.

Een tovervierkant is een vierkante tabel met natuurlijke getallen (alle verschillend) waarvoor geldt dat de som van de getallen in een rij, de som van een getallen in een kolom, en de som van de getallen in één van beide diagonalen dezelfde waarde heeft. Een voorbeeld (de som is steeds 15):
8 1 6
3 5 7
4 9 2

De orde van een tovervierkant is het aantal getallen in een rij of kolom. De orde van dit voorbeeld is 3. Voor de gevallen dat de orde oneven is bestaat er een eenvoudig algoritme om een tovervierkant te genereren. Dit is het algoritme van de la Loubère.

We gaan uit van een roosterpatroon en bakenen daarin een vierkant af. Elke cel heeft een kolomnummer p (genummerd vanaf 0 van links naar rechts) en een rijnummer q (genummerd vanaf 0 van boven naar onder).
Hieronder een voorbeeld met drie kolommen en drie rijen:
p=0 p=1 p=2
q=0 8 1 6
q=1 3 5 7
q=2 4 9 2


Het algoritme van de la Loubère

We maken een wandeling door het vierkant waarbij alle hokjes precies één maal worden bezocht; in het eerste hokje zetten we een 1, in het volgende een 2, enzovoort. Het algoritme geeft aan in welke volgorde de hokjes hiertoe bezocht moeten worden.

1. We beginnen onze wandeling in het hokje midden bovenaan. Daarin zetten we een 1.

2. We gaan vanuit hokje (p,q) telkens naar het volgende hokje door 1 stap opzij en 2 stappen ‘omlaag’ te bewegen. Dit komt neer op p:=p+1 en q:=q+2. Zouden we hierdoor buiten het vierkant komen (p>=n of q>=n), dan trekken we n van p en/of q af. Deze berekening kan met ‘mod’ handiger genoteerd worden.

3. We hebben nu een nieuw hokje in het vierkant. Daarin zetten we het volgende getal.

4. Als het laatst ingevulde getal een veelvoud is van n (in bovenstaand voorbeeld als je bij de 3 of de 6 bent), dan doen we een andere stap, namelijk 1 stap omlaag.

5. Als alle hokjes gevuld zijn, dan is het tovervierkant voltooid.
Hier nog even een duidelijke afbeelding van het rooster (tovervierkant)

Afbeelding


& dit is wat ik tot nu toe heb gemaakt::

Code: Selecteer alles

procedure TForm1.Button1Click(Sender: TObject);
var n,p,q,k: integer;
    a: array [1..99,1..99]of real;

begin
  n:= StrToInt( edit1.Text);
  if (n mod 2 = 0) then
    Showmessage ('vul een oneven getal in')
  else
    begin

        {Stap 1}
          begin
             p:=((n+1)/2);
             StringGrid1.cells[p,0] :='1';
          end;
        {stap2}
          begin
           p:=k;
            for p:=k  to n - 1 do
             for q:=0 to n-1 do
              {hier de stringGrid vullen? }

            p:=p+1;
            q:=q+2;
            if p>=n then
              p:=p-n;
            if q>=n then
              q:=q-n;
          end;


    end;
Het eerste gedeelte (tot stap 1) klopt. dit heb ik al gecontroleerd.

De gebruiker voert een ONEVEN getal in. Dit getal geeft het aantal rijen en kolommen weer voor het vierkant.


mijn vraag gaat over de stappen 1 t/m 5

Mijn eerste vraag is: klopt dit begin (van de stappen) een beetje?
Mijn tweede vraag is: Hoe kan ik de StringGrid invullen?
Of moet je eerst al die stappen uitvoeren en het resultaat in de StrigGrid zetten?

Bij stap 2 begin je toch in het hokje waar je de '1' hebt ingevuld?
Je moet bij stap twee dan in elk hokje een verschillend getal krijgen.
Of doe je dit met een herhaling?

Het gaat dus eigenlijk om de stappen (1),2 en 3
Want verder ben ik nog niet gekomen

Hopelijk kunnen jullie mij helpen.
:mrgreen:
Durf te vragen!

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

Re: Programmeren 'Tovervierkant'

Bericht door arie » 25 mar 2014, 22:11

De array a heb je hier niet nodig
Stap 1 was OK, hoeft alleen niet tussen begin en end. Het is wel handig om daar meteen ook q de beginwaarde te geven. Let nog wel even op: als StringGrid1 de cellen vanaf nul begint te nummeren, dan is (n+1)/2 niet het midden.

Als dat klaar is moeten we alle andere cellen (k:=2 to n*n) invullen.

Noot: bij stap 2 is er een kortere manier (zonder die 2 if's) door mod te gebruiken, kan je die manier vinden?

Hieronder jouw code met een raamwerk voor de verdere oplossing, lukt het je hiermee?

Code: Selecteer alles

procedure TForm1.Button1Click(Sender: TObject);
var n,p,q,k: integer;
    a: array [1..99,1..99]of real;

begin
  n:= StrToInt( edit1.Text);
  if (n mod 2 = 0) then
    Showmessage ('vul een oneven getal in')
  else
    begin
        {Stap 0: geef StringGrid1 n rijen en n kolommen: }



        {Stap 1: geef p en q hun beginwaarden en vul het middenboven hokje in:}
        p := (n+1)/2;
        q := 0;
        StringGrid1.cells[p,q] := '1';


        {stap 2 t/m 5: zet alle andere getallen (2 t/m n*n) op de goede plaats: }
        for k:=2 to n*n do
        begin

            {stap 2 en 4: bepaal eerst de nieuwe waardes van p en q: }
            if ((k-1) mod n = 0) then { vorige k is veelvoud van n: voer stap 4 uit: }
            begin

            end;
           
            else { vorige k GEEN veelvoud van n: voer stap 2 uit: }
            begin
                p:=p+1;
                q:=q+2;
                if p>=n then
                    p:=p-n;
                if q>=n then
                    q:=q-n;
            end;


            {stap 3: geef cel [p, q] van StringGrid1 de waarde k: }


        end;
    end;
end;

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

Re: Programmeren 'Tovervierkant'

Bericht door BusinessMath » 31 mar 2014, 16:21

Het is gelukt! Bedankt! :mrgreen:

Echt heel handig dat je die stappen erbij zet, welke van toepassing is.
Durf te vragen!

Plaats reactie