| Autor |
Beitrag |
sennaheu
      
Beiträge: 22
|
Verfasst: Mo 31.03.03 14:37
Die Aufgabe lautet:
Erzeuge ein Magisches Viereck mit der Anzahl n.
Ich nehme mal n als Konstante, die man dann individuell verändern kann.
Es ist nur wichtig, dass n ungerade ist. Und für alle n müsste das Programm das Viereck in Tabellenform ausgeben können.
Das arrays verwendet werden, dürfte wohl klar sein.
Falls niemand weiss, was ein Magischen Viereck ist, hier ein Beispiel mit n=3:
8 1 6
3 5 7
4 9 2
Das Besondere an einem Magischen Viereck ist, dass man sowohl horizontal, vertikal und diagonal die Reihen addieren kann und jedesmal die gleiche Zahl herauskommt. In diesem Beispiel ist es 15.
Hier die Anleitung für das Zeichnen eines Magischen Quadrates:
*Schreibe die 1 in die Mitte der ersten Zeile.
*Die folgende Zahl wird eins nach rechts und eins hoch eingetragen. Sollte man dadurch über den Rand herauskommen, so wird auf der gegenüberliegenden Seite weitergemacht.
*Wenn man auf ein Feld, dass schon belegt ist, stösst (nach n-Zahlen), so geht man eins nach unten.
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mo 31.03.03 14:40
Hmmm, interessanter Algorithmus, aber..... wie lautet Deine Frage? *grübel* 
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mo 31.03.03 14:45
Hallo!
Ich denke mal, da will sich jemand Arbeit ersparen. Aber weit gefehlt: Selbst ist der Mann /die Frau!
Bei Fragen stehen wir natürlich gerne zur Verfügung...
Cu,
Udontknow
|
|
sennaheu 
      
Beiträge: 22
|
Verfasst: Mo 31.03.03 16:37
aso, ihr kennt mich noch net...
ich hab in einigen früheren threads schon darüber gesprochen.
ich bin schüler, der in die informatik-ag geht.
das dumme an der ag ist, dass es zwei gruppen gibt. die einen, die es eh schon im vornherein können, und die anderen, die absolut neu in diesem element sind. und unser doller lehrer merkt das nicht (und wir getrauen uns auch nicht es ihm zu sagen  ).
auf jeden fall sind wir immer so mitgezogen worden.
neuerdings gibt uns aber unser lehrer immer hausafgaben auf, die wir dann in der nächsten stunde am beamer vorführen müssen.
seit er das macht, hat mir das board hier sehr geholfen. danke nochmals an alle.
was ich natürlich nicht brauche ist ein fertiger quelltext. der bringt mir nix, da ich das auch kapieren und erklären muss.
es wäre mir viel hilfreicher, wenn jemand, der ahnung hat, schritt für schritt das programm durchgeht und zeile für zeile erklärt was zu tun ist.
einfache befehle kann ich auch. höchstens an komplizierteren stellen wäre vielleicht ein praktische hilfestellung von vorteil, aber ansonsten werde ich dann schon nachfragen, was in meinem geschriebenen programm falsch ist.
ich hoffe es sind alle unklarheiten beseitigt...
ach ne, die frage, was die aufgabe sei.
nunja, unser lehrer hat erklärt was ein magisches quadrat sei (siehe oben) und gesagt, wir sollen ein programm screiben, dass so ein quardrat zeichnet.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 31.03.03 17:03
Gegenvorschlag: Du fängst an und wir helfen weiter.
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mo 31.03.03 17:04
OK, dann mach ich mal den Anfang:
Ich würde es mit einem zweidimensionalen Array machen, so z.B.:
Quelltext 1: 2:
| var Zahlen:array of array of integer; |
Dann brauchste nen Button und ein Edit, wo Du Dein n eingibst.
Dem Button hab ich jetzt den Code zugeordnet:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Button1Click(Sender: TObject); var i,n:integer; begin n:=strtoint(Edit1.Text); SetLength(Zahlen,n); for i:=0 to n-1 do SetLength(Zahlen[i],n); for i:=1 to sqr(n) do begin {...} end; end; |
Dabei wird das erste Array n Elemente lang und jedes Item darin ist ja auch ein Array und das wird in der for-Schleife n Elemente lang.
In der for-Schleife danach, gehst Du die Zahlen von 1 bis n^2 durch, um alle Zahlen einzutragen. Jetzt muss nur noch der wohl etwas kompliziertere Algorithmus für die Stellenberechnung gemacht werden. Hab dafür gerade keine Zeit, schau mal nachher.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 31.03.03 17:39
Der Algorithmus ist nicht schwer. Wenn ich ein bisschen schummle (also ab und zu zwei Anweisungen in eine Zeile), dann geht er in 9 Zeilen.
Folgende Hinweise:
1. schau Dir die Funktion "mod" an. Sie wird Dir sehr helfen, wenn es darum geht, dass Du immer nur Felder ansprichst, die auch im Quadrat drin sind.
2. zur Bestimmung der Mitte solltest Du das Gegenstück zu "mod" nämlich "div" anschauen.
3. Wenn Du die Position im Quadrat änderst, dann speichere vorher, wo Du warst. Du wirst es brauchen!
4. Tue zuerst einmal so, als wäre das nächste Feld, das Du ansprechen willst, nicht besetzt. Dann guck Dir an, ob es das ist. Wenn ja, folge dem Algorithmus.
MfG,
Peter
P.S.: Ausgabe sollte über ein StringGrid erfolgen!
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
sennaheu 
      
Beiträge: 22
|
Verfasst: Di 01.04.03 22:33
ok, ich hab jetzt selber mal ein bischen rumgebastelt.
ich habe es geschaft, ein programm zu schreiben, bei dem zumindest keine delphi-fehler mehr erscheinen.
das programm kann aber hinten und vorne nicht stimmen.
das merkt man spätestens, wenn man es laufen lässt.
anmerkung:
ich habe ein stringrid, ein edit und einen button verwendet.
hier das programm, ich hoffe jemand kann mir sagen, was für einen quark ich da fabriziert habe  und mir sagen, was und wie zu verbessern ist:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;
type TForm1 = class(TForm) StringGrid1: TStringGrid; Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private-Deklarationen} public { Public-Deklarationen} end;
var Form1: TForm1;
TYPE Magquad = array [1..23,1..23] of Integer;
var quadrat: Magquad; Zeilenzahl,n: Integer;
implementation
{$R *.DFM}
function nachfolger(k: Integer): Integer; begin { von nachfolger } if k < Zeilenzahl then nachfolger:= k+1 else nachfolger:= 1 end;
function vorgaenger(k: Integer): Integer; begin { von vorgaenger } if k > 1 then vorgaenger:= k-1 else vorgaenger:= zeilenzahl end;
procedure TForm1.Button1Click(Sender: TObject); var zahl, i, j: Integer; begin if Zeilenzahl mod 2 = 0 then Zeilenzahl := Zeilenzahl + 1; Edit1.Text := IntToStr(Zeilenzahl); StringGrid1.Rowcount := Zeilenzahl; StringGrid1.Colcount := Zeilenzahl; n:= zeilenzahl * zeilenzahl; for i:= 1 to zeilenzahl do for j:= 1 to zeilenzahl do StringGrid1.Cells[i-1,j-1] := '0'; j:= zeilenzahl div 2; i:= j+1; for zahl:= 1 to n do begin i:= nachfolger(i); j:= nachfolger(j); while StringGrid1.Cells[i-1,j-1] > '0' do begin i:= nachfolger(i); j:= vorgaenger(j); end; StringGrid1.Cells[i-1,j-1] := IntToStr(zahl); end; end;
end. |
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mi 02.04.03 08:09
Erster Fehler oder besagter gesagt, Frage: Wo wird Zeilenanzahl initialisiert?
//Nachtrag: Habs mal kur getestet. Einfach am Anfang der Prozedur Button1Click noch
Quelltext 1:
| Zeilenzahl:=strtoint(Edit1.Text); |
einfügen, dann funktionierts anscheinend. T
Achja, wozu hast Du eigentlich die Typendeklaration quadrat gemacht? DIe haste doch gar nimmer verwendet?
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 02.04.03 15:56
Nee, stimmt so nicht. Kommst auch nicht das richtige heraus. Die 1 steht schon an der falschen Stelle! Außerdem ist die letzte Regel des Algorithmus nicht korrekt umgesetzt. Die Regel bezieht sich nicht auf das Feld, wo man hinspringen wollte, sondern auf das Feld, von dem man kommt.
So sieht mein Quelltext aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| procedure TForm1.Button1Click(Sender: TObject); var i,n:integer; x,y, x_alt, y_alt: INTEGER; begin n:=strtoint(Edit1.Text); SetLength(Zahlen,n,n);
for x:=0 to n-1 do for y:=0 to n-1 do zahlen[x,y]:=0; //Array initialisieren
x:=n div 2; //kleinster Index ist Null, daher stimmt das. y:=0; for i:=1 to sqr(n) do begin zahlen[x,y]:=i; //Feld belegen x_alt:=x; y_alt:=y; //Ursprungsfeld speichern inc(x); dec(y); //Springen x:=x mod n; if y < 0 then y:=n-1; //x und y in den richtigen Bereich if zahlen[x,y] <> 0 then //Zielfeld belegt? begin //wenn ja, vom Ursprungsfeld eins nach unten gehen. y:=y_alt+1; y:=y mod n; x:=x_alt; end; end;
StringGrid1.ColCount:=n; StringGrid1.RowCount:=n; for x:=0 to n-1 do for y:=0 to n-1 do StringGrid1.Cells[x,y]:=IntToStr(zahlen[x,y]); end; |
MfG,
Peter
P.S.: Kannst das ganze ja wie bei Dir direkt in ein StringGrid machen, dann kannst Du Anfang und Ende der Funktion kürzen.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
|