Dit is de opdracht::
Hier nog even een duidelijke afbeelding van het rooster (tovervierkant)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.
& 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;
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.