Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem im Umgang mit Sets (https://www.delphipraxis.net/147676-problem-im-umgang-mit-sets.html)

Amateurprofi 18. Feb 2010 01:33

Re: Problem im Umgang mit Sets
 
Zitat:

Zitat von Salazriel
wirklich keiner eine idee?

Versuch es mal so.
Hab nicht geprüft ob das so funktioniert.
Ich meine du solltest erst dann "auf Single" prüfen, wenn von der Menge der Zahlen einer Zelle die Mengen der anderen Zellen dieser Zeile abgezogen wurden.
Die Geschichte mit der Verschiebung und Mod 9 finde ich nicht so glücklich. Ist unklar und teuer.....
Und, nach RestMengeNeuZuOrdnen(i,Spalte,Zeile) meine ich sollte die Prüfung abgebrochen werden, weil sich die Voraussetzungen geändert haben.


Delphi-Quellcode:
procedure HiddenSingles;
var i,Spalte,xSpalte,Zeile,Anfangszelle,Verschiebung:integer;
    RestMenge:Zahlen;
begin
   //Zeilenweise
   for Zeile:=0 to 8 do
      for Spalte:=0 to 8 do begin
         RestMenge:=FeldMenge[Spalte,Zeile];
         For xSpalte:=0 to 8 do
            if xSpalte<>Spalte then
               RestMenge:=RestMenge-FeldMenge[xSpalte,Zeile];
         For i:=1 to 9 do
            If RestMenge=[i] then begin
               StringGrid1.cells[Spalte,Zeile]:=Inttostr(i);
               RestMengeNeuZuOrdnen(i,Spalte,Zeile);
               exit;
            end;
      end;
   //Spaltenweise

   //Blockweise
end;

Salazriel 18. Feb 2010 14:18

Re: Problem im Umgang mit Sets
 
:wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall:

Wie man ja auch meinem Post zur Grundüberlegung von NakedSingles entnehmen kann, wollte ich es ja auch so machen, dass zuerst alle FeldMengen abgezogen werden und DANN die Restmenge überprüft wird, so wie du es vorgesclagen hast funktionierts

Delphi-Quellcode:
For Zeile:=0 to 8 do
  For Spalte:=0 to 8 do
    begin
    RestMenge:=FeldMenge[Spalte,Zeile];
    For Verschiebung:=1 to 8 do
      begin
      RestMenge:=RestMenge-FeldMenge[(Spalte+Verschiebung) mod 9,Zeile];
      end;
         For i:=1 to 9 do
        If RestMenge=[i]
        then
          begin
          StringGrid1.Cells[Spalte,Zeile]:=inttostr(i);
          RestMengeNeuZuOrdnen(i,Spalte,Zeile);
          end;
    end;

Zitat:

Zitat von Amateurprofi
Die Geschichte mit der Verschiebung und Mod 9 finde ich nicht so glücklich. Ist unklar und teuer.....

Das verstehe ich nicht. Zwar ist deine Methode die einfachere (daher werd ich die auch dann nutzen), aber was soll unklar und teuer sein? Meinst du damit, dass beim Lesen des Quelltextes nicht sofort die Funktion davon klar wird oder was? Und funktionell sind die ja identisch, bloß wird bei mir als 1. die RestMenge der Zelle rechts daneben abgezogen und bei dir die RestMenge der Zelle ganz links.


Zitat:

Zitat von Amateurprofi
Und, nach RestMengeNeuZuOrdnen(i,Spalte,Zeile) meine ich sollte die Prüfung abgebrochen werden, weil sich die Voraussetzungen geändert haben.

Die If-Bedingung wird ja nur maximal 1-mal passiert, daher würde der then-Block nur einmal passiert werden. Wenn er passiert wurde, wird die If-Anfrage für alle restlichen i false.
Dein Exit würde nur 'etwas' Leistung sparen, oder?



PS: Heißt das then-Block, ich habe kurz überlegt ob ich Schleifenkörper schreibe, aber if ist ja keine Schleife ?

Amateurprofi 18. Feb 2010 19:58

Re: Problem im Umgang mit Sets
 
Zitat:

Zitat von Salazriel
Zitat:

Zitat von Amateurprofi
Die Geschichte mit der Verschiebung und Mod 9 finde ich nicht so glücklich. Ist unklar und teuer.....

Das verstehe ich nicht. Zwar ist deine Methode die einfachere (daher werd ich die auch dann nutzen), aber was soll unklar und teuer sein? Meinst du damit, dass beim Lesen des Quelltextes nicht sofort die Funktion davon klar wird oder was? Und funktionell sind die ja identisch, bloß wird bei mir als 1. die RestMenge der Zelle rechts daneben abgezogen und bei dir die RestMenge der Zelle ganz links.


Mit unklar meine ich schlecht lesbar.
Deine Absicht ist, von der Menge einer Zelle die Mengen aller anderen Zellen der Zeile abzuziehen, und das sollte man dann dem Sourcecode auch entnehmen : Wenn nicht die selbe Zelle dann ...
Mit teuer meine ich, daß das MOD vergleichsweise viel Rechenzeit kostet.

Zitat:

Zitat von Salazriel
Zitat:

Zitat von Amateurprofi
Und, nach RestMengeNeuZuOrdnen(i,Spalte,Zeile) meine ich sollte die Prüfung abgebrochen werden, weil sich die Voraussetzungen geändert haben.

Die If-Bedingung wird ja nur maximal 1-mal passiert, daher würde der then-Block nur einmal passiert werden. Wenn er passiert wurde, wird die If-Anfrage für alle restlichen i false.
Dein Exit würde nur 'etwas' Leistung sparen, oder?

PS: Heißt das then-Block, ich habe kurz überlegt ob ich Schleifenkörper schreibe, aber if ist ja keine Schleife ?

Ja, richtig, würde Leistung sparen.
Da RestMengeNeuZuOrdnen eh' wieder HiddenSingles aufruft, ist es (m.E.) unnötig, die Prüfung fortzusetzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 Uhr.
Seite 2 von 2     12   

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