Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zahlenquadrat (https://www.delphipraxis.net/39372-zahlenquadrat.html)

Thunderbolt 1. Feb 2005 18:15


Zahlenquadrat
 
Ich brauch mal kurz Hilfe. Mein Delphi spinnt rum und schreibt ganz komische Sachen.

Die Aufgabenstellung ist die Folgende:

1. Man hat ein Quadrat mit n Feldern höhe und breite (bei unserem Beispiel 5).
2. In das Mittlere Feld der ersten "Zeile" schreibt man eine 1 hin.
3. Nun füllt man die restlichen Zahlen (2 bis n^2) in die Felder nach folgenden Regeln:
1. Folgt die Zahl einem Teiler von n, kommt diese in das Feld darunter.
2. Ist sie kein Teiler kommt die Zahl in das Feld rechts oben (1 nach rechts, 1 nach oben).
3. Ist man am Rand angelangt, springt die Zahl auf die Gegenseite.


Ein Dreieck mit n=5 sähe also so aus:

17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9


dazu hab ich schnell einen quelltext geschrieben:


Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type zweidimensional=array [1..10,1..10] of word;
var
  matrix :zweidimensional;
  i,x,y :integer;

const
  n=5;

procedure ausgeben;
var k,l:integer;
begin
  for k:=1 to n do
    begin
      for l:=1 to n do write(matrix[x,y]:3);
      writeln;
    end;
end;

begin
  x:= (n div 2)+1;
  y:=1;
  matrix[x,y]:=1;
  ausgeben;
  for i:=2 to sqr(n) do
    begin
      if (i-1 mod n)=0 then
        begin
          if y=n then y:=1 else inc(y);
          matrix[x,y]:=i;
        end
      else
        begin
          if x=n then x:=1 else inc(x);
          if y=1 then y:=n else dec(y);
          matrix[x,y]:=i;
        end;
      ausgeben; //zum fortschritt debuggen
    end;

    ausgeben;

    readln;
end.

seltsamerweise spuckt das programm sehr seltsame ergebnisse aus bei den zwischenausgaben. schaut sie euch bitte mal an. ich finde den fehler irgendwie nicht :(

leddl 1. Feb 2005 18:24

Re: Zahlenquadrat
 
Wie wärs, wenn du die Procedur ausgeben folgendermaßen umschreibst?
Delphi-Quellcode:
procedure ausgeben;
var k,l:integer;
begin
  for k:=1 to n do
    begin
      for l:=1 to n do write(matrix[l,k]:3);
      writeln;
    end;
end;
Denn x und y sind zwar global deklariert, werden aber in dieser Procedur nicht verändert. Habs nich probiert, das sollte es aber wohl eigentlich sein!

Thunderbolt 2. Feb 2005 07:49

Re: Zahlenquadrat
 
das isses nich. die ausgabe ist schon richtig. das komische ist, dass bei den zwischendurchläufe das komplette array den aktuellen wert zu haben scheint. irgendwie speichert das programm die koords nicht richtig oder weist ihnen nicht richtig den wert zu. probierts mal selbst aus.

Binärbaum 2. Feb 2005 09:21

Re: Zahlenquadrat
 
Zitat:

Zitat von Thunderbolt
seltsamerweise spuckt das programm sehr seltsame ergebnisse aus bei den zwischenausgaben. schaut sie euch bitte mal an. ich finde den fehler irgendwie nicht :(

Das liegt wohl daran, dass du den Array am Anfang deines Programmes nicht initialisierst. Wenn man den Elementen keinen Wert zuweist, steht dann dort das, was an der entsprechenden Stelle im Hauptspeicher steht, und das können irgendwelche ganz wilden Zahlen sein. Vielleicht solltest du den Array am Anfang mit null füllen, dann müsste das Problem behoben sein.

MfG
Binärbaum

leddl 2. Feb 2005 10:16

Re: Zahlenquadrat
 
Ich sags nochmal, in der Ausgabe benutzt du x und y, die du nur in der Befüllungsfunktion änderst. In der Ausgabe-Funktion hast du zwar 2 Schleifen mit l und k, die werden aber nicht benutzt. Du gibst also l*k die aktuellen Werte von x und y aus. Daher steht überall die gleiche Zahl...

Thunderbolt 2. Feb 2005 17:44

Re: Zahlenquadrat
 
Zitat:

Zitat von Binärbaum
Zitat:

Zitat von Thunderbolt
seltsamerweise spuckt das programm sehr seltsame ergebnisse aus bei den zwischenausgaben. schaut sie euch bitte mal an. ich finde den fehler irgendwie nicht :(

Das liegt wohl daran, dass du den Array am Anfang deines Programmes nicht initialisierst. Wenn man den Elementen keinen Wert zuweist, steht dann dort das, was an der entsprechenden Stelle im Hauptspeicher steht, und das können irgendwelche ganz wilden Zahlen sein. Vielleicht solltest du den Array am Anfang mit null füllen, dann müsste das Problem behoben sein.

MfG
Binärbaum

tut mir leid dir das sagen zu müssen, aber was du da redest ist absoluter unsinn. ich initialisiere das feld ja indem ich ihm eben i zuweise. das was du meinst würde nur vorkommen, wenn ich das feld direkt abfragen würde ohne da was zu speichern.

@leddl: jo. sry. hab mich da verschrieben, war aber nit die ursache.



Ich hab den Fehler jetzt gefunden. Ich hab dämlicherweise an dieser Stelle:

Code:
if (i-1 mod n)=0 then
        begin
          if y=n then y:=1 else inc(y);
          matrix[x,y]:=i;
        end
mist gebaut. es hätte (i-1) mod n heissen müssen, da der compiler sonst (i-(1 mod n)) rechnet.

leddl 2. Feb 2005 20:56

Re: Zahlenquadrat
 
Gut, OK, die eigentliche Berechnung hab ich mir nich angeschaut. Das war mir für die kurze Zeit, die ich hatte zu aufwendig. Aber daraus
Zitat:

das komische ist, dass bei den zwischendurchläufe das komplette array den aktuellen wert zu haben scheint.
hab ich halt geschlossen, daß das Array bei der Ausgabe eben nur aus einer einzigen Zahl besteht.
Hab auch den Quelltext nich ausprobiert.

Bin aber auf jeden Fall froh, daß ich trotzdem irgendwie recht hatte! :mrgreen:

Binärbaum 3. Feb 2005 12:02

Re: Zahlenquadrat
 
Zitat:

Zitat von Thunderbolt
tut mir leid dir das sagen zu müssen, aber was du da redest ist absoluter unsinn. ich initialisiere das feld ja indem ich ihm eben i zuweise. das was du meinst würde nur vorkommen, wenn ich das feld direkt abfragen würde ohne da was zu speichern.

Unter Initialisierung verstehe ich was anderes. Bei der Initialisierung wird die Matrix schon vor dem Beginn der eigentlichen Berechnungen mit einem vorgegebenen Wert (meist null) gefüllt, um sicher zu gehen, dass da nicht irgendwelches komisches Zeug drin steht, was dann später bei der Berechnung Probleme verursachen könnte.
Du speicherst zwar i in der Matrix ab, aber da du nach jedem Schleifendurchlauf die Matrix anzeigen lässt, stehen dann immer nur in einem Teil der Felder die berechneten Werte, während in den anderen Feldern beliebige Werte stehen. Erst zum Ende der Berechnung, also wenn die Schleife komplett abgearbeitet wurde, stehen die berechneten Ergebnisse in der Matrix. Deshalb entstehen auch die
Zitat:

Zitat von Thunderbolt
sehr seltsamen ergebnisse aus bei den zwischenausgaben

MfG
Binärbaum


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz