AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zahlenquadrat

Ein Thema von Thunderbolt · begonnen am 1. Feb 2005 · letzter Beitrag vom 3. Feb 2005
Antwort Antwort
Benutzerbild von Thunderbolt
Thunderbolt

Registriert seit: 29. Feb 2004
26 Beiträge
 
#1

Zahlenquadrat

  Alt 1. Feb 2005, 18:15
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
Ich habe in der Vergangenheit gute Entscheidungen getroffen. Ich habe in der Zukunft gute Entscheidungen getroffen.
George W. Bush
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Zahlenquadrat

  Alt 1. Feb 2005, 18:24
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!
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
Benutzerbild von Thunderbolt
Thunderbolt

Registriert seit: 29. Feb 2004
26 Beiträge
 
#3

Re: Zahlenquadrat

  Alt 2. Feb 2005, 07:49
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.
Ich habe in der Vergangenheit gute Entscheidungen getroffen. Ich habe in der Zukunft gute Entscheidungen getroffen.
George W. Bush
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Zahlenquadrat

  Alt 2. Feb 2005, 09:21
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
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Zahlenquadrat

  Alt 2. Feb 2005, 10:16
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...
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
Benutzerbild von Thunderbolt
Thunderbolt

Registriert seit: 29. Feb 2004
26 Beiträge
 
#6

Re: Zahlenquadrat

  Alt 2. Feb 2005, 17:44
Zitat von Binärbaum:
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.
Ich habe in der Vergangenheit gute Entscheidungen getroffen. Ich habe in der Zukunft gute Entscheidungen getroffen.
George W. Bush
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Zahlenquadrat

  Alt 2. Feb 2005, 20:56
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!
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Zahlenquadrat

  Alt 3. Feb 2005, 12:02
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 von Thunderbolt:
sehr seltsamen ergebnisse aus bei den zwischenausgaben
MfG
Binärbaum
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz