Entwickler-Ecke

Sonstiges (Delphi) - Magische Quadrate - jede Zahl nur einmal verwenden


swasy - Di 24.04.07 08:27
Titel: Magische Quadrate - jede Zahl nur einmal verwenden
Hy sitz grad mit ein paar Freunden in der schule und arbeiten an einem Delphi-Projekt "Magische Quadrate"...
leider kommen wir nicht mehr weiter und hoffen ihr könnt uns helfen.
Was wir aufjedenfall noch brauchen wäre eine Kontrolle das jede Zahl nur einmal verwendet werden darf!



Delphi-Quelltext
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:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
implementation

{$R *.DFM}
 //----kp
type tMagic=array [1..100]of integer;
var Magic:tMagic;

//---  MaQuad = Array name....wird erstellt
type tMaQuad = array [1..3,1..3of integer;
var MaQuad : tMaQuad;

procedure TfrmMagischeQuadrate.BtnNeuesSpielClick(Sender: TObject);
var summe, summe1:real;
begin   //---  Zellen werden bei klick auf neues Spiel auf 0 gesetzt
  with StrGridEingabe do
  begin
    cells[0,0]:=' ';
    cells[0,1]:=' ';
    cells[0,2]:=' ';
    cells[1,0]:=' ';
    cells[1,1]:=' ';
    cells[1,2]:=' ';
    cells[2,0]:=' ';
    cells[2,1]:=' ';
    cells[2,2]:=' ';
  end;

  begin  //---Zufallszahl wird erstellt
    Randomize;
    Magic[1]:=Random(15)+1;

    //--- Zufallszahl wird im Stringrid angezeigt
    StrGridEingabe.cells[1,1]:=IntToStr(Magic[1]);
  end;

  begin  //---bei start werden die Ergebnissfelder auf die Zahl 0 gesetzt
  LblSumme1.Caption:='0';
  LblSumme2.Caption:='0';
  LblSumme3.Caption:='0';
  LblSumme4.Caption:='0';
  LblSumme5.Caption:='0';
  LblSumme6.Caption:='0';
  LblSumme7.Caption:='0';
  LblSumme8.Caption:='0';
  end;

  begin  //--- die Zufallszahl wird mal 3 genommen und wird in Edtsumme ausgegeben
    summe:=StrToFloat (StrGridEingabe.cells[1,1]);
    summe1:=(summe)*3;
    EdtSumme.Text:=FloatToStr(summe1);
  end;
 //----------------Label Farb änderung----------------
 //----- SummeND
        frmMagischeQuadrate.LblSumme1.Font.Color:=clBlack;
 //----- SummeHD
        frmMagischeQuadrate.LblSumme5.Font.Color:=clBlack;
 //----- SummeZeile[1]
        frmMagischeQuadrate.LblSumme2.Font.Color:=clBlack;
 //----- SummeZeile[2]
        frmMagischeQuadrate.LblSumme3.Font.Color:=clBlack;
 //----- SummeZeile[3]
        frmMagischeQuadrate.LblSumme4.Font.Color:=clBlack;
 //----- SummeSpalte[1]
        frmMagischeQuadrate.LblSumme8.Font.Color:=clBlack;
 //----- SummeSpalte[2]
        frmMagischeQuadrate.LblSumme7.Font.Color:=clBlack;
 //----- SummeSpalte[3]
        frmMagischeQuadrate.LblSumme6.Font.Color:=clBlack;

 //----------------ENDE --- Label Farb änderung----------------
end;

procedure TfrmMagischeQuadrate.BtnSchliessenClick(Sender: TObject);
begin
  close;             //---Programm wird geschlossen
end;

procedure Summenkontrolle (MQOrdnung : integer);

var z, s, SummeHD , SummeND : Integer;
    summe1 : real;
// --- Berechnung der Werte

//---Hier wurde ein Array für alle Zeilensummen erstellt
type tSummeZeile = array [1..3of Integer;
var  SummeZeile : tSummeZeile;

type tSummeSpalte = array [1..3of Integer;
var  SummeSpalte : tSummeSpalte;

begin

  For z := 1 to MQOrdnung do begin
    SummeZeile[z]:=0;
    For s := 1 to MQOrdnung do  begin
      //--- Berechnung Zeilensumme
      SummeZeile[z]:= SummeZeile[z]+MaQuad[z,s];
    end// For s
    // Ausgabe SummeZeile[z];
  end;  // For z

  For s := 1 to MQOrdnung do begin
    SummeSpalte[s]:=0;
    For z := 1 to MQOrdnung do  begin
      //--- Berechnung Spaltensumme
      SummeSpalte[s]:= SummeSpalte[s]+MaQuad[z,s];
    end// For s
  end;     // For z

  SummeND:=0;
  For s := 1 to MQOrdnung do begin
    //--- Berechung Nebendiagonale
    SummeND:= SummeND+MaQuad[s,(MQOrdnung+1)-s];
  end// For s

  SummeHD:=0;
  For s := 1 to MQOrdnung do begin
    //--- Berechung Hauptdiagonale
    SummeHD:= SummeHD+MaQuad[s,s];
  end;

  //---Wert wird dem Label zugeordnet
  frmMagischeQuadrate.LblSumme1.Caption:= IntToStr (SummeND);
  frmMagischeQuadrate.LblSumme5.Caption:= IntToStr (SummeHD);
  frmMagischeQuadrate.LblSumme2.Caption:= IntToStr (SummeZeile[1]);
  frmMagischeQuadrate.LblSumme3.Caption:= IntToStr (SummeZeile[2]);
  frmMagischeQuadrate.LblSumme4.Caption:= IntToStr (SummeZeile[3]);
  frmMagischeQuadrate.LblSumme8.Caption:= IntToStr (SummeSpalte[1]);
  frmMagischeQuadrate.LblSumme7.Caption:= IntToStr (SummeSpalte[2]);
  frmMagischeQuadrate.LblSumme6.Caption:= IntToStr (SummeSpalte[3]);


  //----------------Label Farb änderung----------------
   summe1:= StrToInt(frmMagischeQuadrate.EdtSumme.Text) ;
  //----- SummeND
   if    summe1 = SummeND
    then
      begin
        frmMagischeQuadrate.LblSumme1.Font.Color:=clBlue;
      end
    else  frmMagischeQuadrate.LblSumme1.Font.Color:=clRed;

  //----- SummeHD
     if    summe1 = SummeHD
    then
      begin
        frmMagischeQuadrate.LblSumme5.Font.Color:=clBlue;
      end
    else  frmMagischeQuadrate.LblSumme5.Font.Color:=clRed;
  //----- SummeZeile[1]
     if    summe1 = SummeZeile[1]
    then
      begin
        frmMagischeQuadrate.LblSumme2.Font.Color:=clBlue;
      end
    else  frmMagischeQuadrate.LblSumme2.Font.Color:=clRed;
  //----- SummeZeile[2]
     if    summe1 = SummeZeile[2]
    then
      begin
        frmMagischeQuadrate.LblSumme3.Font.Color:=clBlue;
      end
    else  frmMagischeQuadrate.LblSumme3.Font.Color:=clRed;
  //----- SummeZeile[3]
     if    summe1 = SummeZeile[3]
    then
      begin
        frmMagischeQuadrate.LblSumme4.Font.Color:=clBlue;
      end
    else  frmMagischeQuadrate.LblSumme4.Font.Color:=clRed;
  //----- SummeSpalte[1]
     if    summe1 = SummeSpalte[1]
    then
      begin
        frmMagischeQuadrate.LblSumme8.Font.Color:=clBlue;
      end
    else  frmMagischeQuadrate.LblSumme8.Font.Color:=clRed;
  //----- SummeSpalte[2]
     if    summe1 = SummeSpalte[2]
    then
      begin
        frmMagischeQuadrate.LblSumme7.Font.Color:=clBlue;
      end
    else  frmMagischeQuadrate.LblSumme7.Font.Color:=clRed;
  //----- SummeSpalte[3]
     if    summe1 = SummeSpalte[3]
    then
      begin
        frmMagischeQuadrate.LblSumme6.Font.Color:=clBlue;
      end
    else  frmMagischeQuadrate.LblSumme6.Font.Color:=clRed;

 //----------------ENDE --- Label Farb änderung----------------

end;  //  --------------- Ende Summenkontrolle


procedure TfrmMagischeQuadrate.BtnUeberpruefenClick(Sender: TObject);
  var MQOrdnung: integer;

begin
  //---- Inhalt von StringGrid wird dem Array MaQuad zugeordnet

  MaQuad[1,1]:=StrToInt (StrGridEingabe.cells[0,0]);
  MaQuad[2,1]:=StrToInt (StrGridEingabe.cells[0,1]);
  MaQuad[3,1]:=StrToInt (StrGridEingabe.cells[0,2]);
  //----  Spalte 2
  MaQuad[1,2]:=StrToInt (StrGridEingabe.cells[1,0]);
  MaQuad[2,2]:=StrToInt (StrGridEingabe.cells[1,1]);
  MaQuad[3,2]:=StrToInt (StrGridEingabe.cells[1,2]);
  //----  Spalte 3
  MaQuad[1,3]:=StrToInt (StrGridEingabe.cells[2,0]);
  MaQuad[2,3]:=StrToInt (StrGridEingabe.cells[2,1]);
  MaQuad[3,3]:=StrToInt (StrGridEingabe.cells[2,2]);
  MQOrdnung:=3;
  Summenkontrolle (MQOrdnung);

end;


end.


Moderiert von user profile iconTino: Titel geändert.


Horst_H - Di 24.04.07 08:39

Hallo,

anschaulich hast Du eine Menge von Zahlen, da bieten sich doch der typ set an.
Include, exclude, if zahl in Menge then

Gruß Horst


FiceGoesDelphi - Di 24.04.07 10:36

Ich bin mir nicht ganz sicher aber meine zu wissen, dass erst vor kurzem ein ähnliches Problem hier im Forum diskutiert wurde. Ich glaube du solltest in die Suche mal "Sudoku" eingeben! Da sollten Random-Zahlen auch nur einmal wiedergegeben werden! Vllt hilft dir das ja weiter!

Liebe Grüße,
FGD


Jakob_Ullmann - Mi 02.05.07 15:01

Oder du schreibst:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var 
  MagicControl: TStrings;
  i: Integer;
begin
  { Bei jedem Kontrolldurchlauf eines Kästchens }
  for i := 1 to MagicControl.Count do
  begin
    if StrToInt(MagicControl[i] = StrToInt({ das Kästchen }then
    MagicControl.Add({ Das Kästchen })
    else
    begin
      MagicControl.Clear;
      Application.MessageBox
        ('Fehler beim Ausfüllen.','Magische Quadrate',MB_OK + MB_ICONERROR);   
    end;
  end;
end;


swasy - Di 15.05.07 08:46

hy,

wir bekommen immer einen fehler bei der zeile
"for i := 1 to MagicControl.Count do"
und er sagt es würde eine Zugriffsverletzung vorliegen
wir haben jetzt schon alles versucht was uns eingefallen ist aber bekommen den fehler nicht weg!


jasocul - Di 15.05.07 09:26


Delphi-Quelltext
1:
for i := 0 to MagicControl.Count-1 do                    

Solche Zählungen fangen immer bei "0" an.


Christian V. - Di 15.05.07 17:57

Um zu prüfen ob jede Zahl nur einmal vorkommt einfach ein Array erstellen:

Delphi-Quelltext
1:
InUse: Array [1..9of Boolean;                    

Sobald die Zahl in einem feld vorkommt, den entsprechenden Wert im Array auf True setzen.


swasy - Di 22.05.07 08:35

und was brauchen wir noch außer diese eine zeile?!

"InUse: Array [1..9] of Boolean;"

weil mit einem array of boolean haben wir noch nie gearbeitet und haben echt keine ahnung was wir noch machen müssen!


arj - Di 22.05.07 10:54

Du hast ja dein MaQuad. Jetzt könntest du einfach testen, ob irgendeine Zahl irgendwoanders verwendet wird:


Delphi-Quelltext
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:
i,j     : Integer;
zahl    : Integer;
doppelt : Boolean;

doppelt := false; // Bis jetzt wird keine doppelt verwendet
for i:= 1 to 9 do // Werte initialisieren
  InUse[i] := false;

for i :=1 to 3 do
begin
  for j:=1 to 3 do
  begin
    zahl := MaQua[i,j]; // Zahl die an der Stelle steht
    if (zahl > 9 or zahl < 1// Wenn die Zahlen nicht im Bereich von 1,...,9 sind
       continue; // mit nächsten Feld weitermachen
    if InUse[zahl] then // prüfen ob zahl schon verwendet wird
    begin
      doppelt := true; // doppelte Zahl entdeckt
      break; // abbrechen
    end
    else
    begin
      InUse[zahl] := true;
    end;
  end;
end;


swasy - Mi 23.05.07 13:37

hi danke für den quelltext =)

if (zahl > 9 or zahl < 1); // Wenn die Zahlen nicht im Bereich von 1,...,9 sind

in dieser zeile kommt eine fehlermeldung das die Typen inkompatible sind


alzaimar - Mi 23.05.07 13:45


Delphi-Quelltext
1:
if (Zahl > 1and (Zahl < 9)                    


Klammer beachten.


swasy - Mi 23.05.07 14:04

vielen dank es hat funktioniert =)

noch ein problem wir wollen ein start formular machen auf dem 3 button sind, wenn man auf den button klickt öffnet sich das formular mit den magischen quadrate 3*3 die 2 anderen button dienen dazu magische quadrate 5*5 oder 7*7 zu öffnen.

wäre cool wenn mir da jemand helfen könnte :D


Christian S. - Mi 23.05.07 16:07

Hallo!

Bitte erstelle für eine neue Frage auch ein neues Topic. Danke! :-)

Grüße
Christian