Autor Beitrag
swasy
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 24.04.07 08:27 
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!


ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 485

Win XP Prof
Delphi 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Mi 02.05.07 15:01 
Oder du schreibst:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 15.05.07 09:26 
ausblenden Delphi-Quelltext
1:
for i := 0 to MagicControl.Count-1 do					

Solche Zählungen fangen immer bei "0" an.
Christian V.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 311

Win Xp Prof
Turbo Delphi 2005
BeitragVerfasst: Di 15.05.07 17:57 
Um zu prüfen ob jede Zahl nur einmal vorkommt einfach ein Array erstellen:
ausblenden Delphi-Quelltext
1:
InUse: Array [1..9of Boolean;					

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

_________________
Hardware runs the world, software controls the hardware, code generates software - Have You already coded today?
swasy Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 378

Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
BeitragVerfasst: Di 22.05.07 10:54 
Du hast ja dein MaQuad. Jetzt könntest du einfach testen, ob irgendeine Zahl irgendwoanders verwendet wird:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 23.05.07 13:45 
ausblenden Delphi-Quelltext
1:
if (Zahl > 1and (Zahl < 9)					


Klammer beachten.

_________________
Na denn, dann. Bis dann, denn.
swasy Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 23.05.07 16:07 
Hallo!

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

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.

Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.