Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi problem baue endlosschleife (https://www.delphipraxis.net/70830-problem-baue-endlosschleife.html)

pagan1900 5. Jun 2006 15:23


problem baue endlosschleife
 
folgendes:
----------
n bekomme ich vom benutzer übergeben
sprich ich habe eine radiogroup, in der festgelegt ist, das
wenn der benutzer den radiobutton an indexstelle 0 anklickt

case n.ItemIndex of
(n beduetet anzahl der knoten!)
0: n:=2; m_max:=2; min_m:=1;
1: n:=3; min_m:=2; m_max:=5;
2: n:=4; min_m:=4; m_max:=7;
3: n:=5; min_m:=5; m_max:=8;
4: n:=6; min_m:=6; m_max:=11;
5: n:=7; min_m:=7; m_max:=12;
6: n:=8; min_m:=8; m_max:=14;

daher bekomme ich das n her! (später soll es wenn der benutzer
den erstenlevel (2knotiger graph) erfolgreich bestanden hat automatisch sich erhöhen (level um level).)


Delphi-Quellcode:
(*-----Bestimmen--von--m-----------------------------*)
 function m_bestimmen(min_m:integer; m_max:integer):integer;
 var local:integer;
  begin
    repeat
    local:=random(m_max+1);
    until local>=min_m;
    result:=local;
  end;
hier bestimme ich die pfeildaten:
NUR das problem ich produziere ständig eine endlosschleife an dieser stelle
siehe folgenden quelltextausschnitt!

Kann mir jemand bei diesem problem helfen ?
freue mich auf eure antwort!

Delphi-Quellcode:
 procedure a_b_Pfeilnur1mal(a,b:TPfeil;var a1,b1:integer);
 var locali:integer;
     notOK:boolean;
 begin
   notok:=false;
   repeat
     repeat
       a1:=random(n)+1;
       b1:=random(n)+1;
     until a1<>b1;      // Neuen Vektor finden

     for locali:= 1 to m do
      begin
        NotOK:=((a1 = a[locali]) and (b1 = b[locali])) or // V1 = V[I] oder
               ((b1 = a[locali]) and (a1 = b[locali]));   // V1 = -V[I]
        if NotOK then break;
            // Wenn NotOK, also der Vektor schon vorhanden ist,
            // dann Abbruch der FOR-Schleife.
      end;

   until not(NotOK);
         // Wenn die FOR-Schleife ganz durchlaufen wird und immer gilt:
         // NotOK = false ( Razz ), dann ist der neue Vektor noch nicht vorhanden.
         // Also: Ende bei not(NotOK);
 end;
und hier soll er rein:

Delphi-Quellcode:
procedure TfrmUebung.Button1Click(Sender: TObject);
  var
  x1,y1,x2,y2:integer;
  locali,localj:integer;
  a1,b1:integer;
  px1,px2:integer;
  Gewichtung:string;
  begin
    m:=m_bestimmen(min_m,m_max); //anzahl der Pfeile wird festgestellt

    //wertelegen(Anf,Ende,Kosten);

    for locali:= 1 to m do
     begin
      a_b_Pfeilnur1mal(Anf,Ende,a1,b1);
      Anf[locali]:=(a1);
      Ende[locali]:=(b1);
      Kosten[locali]:=Kosten_bestimmen;
     end;
   
  {Eingaben}
    for locali:=1 to m do
     begin
       px1:=Anf[locali];
       px2:=Ende[locali];
       Gewichtung:=inttostr(Kosten[locali]);
       with imgGraph,imgGraph.Canvas do
        begin
          Font.Name := 'Arial';
          Font.Height := 30;
// ** Einzelner Pfeil
          X1 := (Kx[px1]);
          Y1 := (Ky[px1]);
          X2 := (Kx[px2]);
          Y2 := (Ky[px2]);
          setzeKnoten(Canvas,Kx,Ky,KRadius,Startknoten);
          Brush.Color := clBlack;
          ZeichneVerbindungspfeil(Canvas,x1,y1,x2,y2,KRadius,Offset);
          pfeilbewertung (x1,y1,x2,y2,KRadius,Offset,Gewichtung,Canvas);
        end;
     end;
 end;

Mystic 5. Jun 2006 15:44

Re: problem baue endlosschleife
 
Bitte benutze die [delphi]-Tags für Delphi-Code.

Wenn ich das richtig sehe heissen sowohl die Variable als auch die RadioGroup beide "n"?

pagan1900 5. Jun 2006 17:24

Re: problem baue endlosschleife
 
ups falsch geschrieben, nein die radiogroup hat natürlich einen anderen namen!
ich wollte damit nur verdeutlichen woher ich n,max_m, m_min habe!
das wichtigste ist, wie löse ich die endloschleife auf!

ich will das das programm mir werte generiert, und mit denen einen graphen zeichnet

ich muss also, da ein pfeil bei mir aus 2werten besteht, die in arrays abgespeichert werden
Anf
Ende
(und der gewichtung wird seperat generiert)
diese werden zum einen zum rechnen und zum anderen stellen diese beiden werte 2 punkte da die dann mit vektorpfeilen verbunden werden.
das problem welches da besteht, da random irgendwelche werte produziert
und das hier für beide werte, kann es sein,das folgendes passieren kann

Anf: 1|2|3|4|1
ende 2|1|2|1|2
dises währe zwar noch nicht problematisch, aber nun
generiere ich für jeden "pfeil" die gewichtung welche zum berechnen benötigt werden!

Anf: 1|2|3|4|1
ende 2|1|2|1|2
kosten 1|2|9|8|5

und da ist nun das problem welches ich versucht habe aufzulösen!
2x ein pfeil 1->2,aber mit unterschiedlichen kosten!
dieses muss aufgelöst werden, sprich jder pfeil der generiert wird darf im array nur 1x vorkommen!

Mystic 6. Jun 2006 04:40

Re: problem baue endlosschleife
 
Warum machst du die Bestimmung nicht so?
Delphi-Quellcode:
(*-----Bestimmen--von--m-----------------------------*)
function m_bestimmen(min_m:integer; m_max:integer):integer;
begin
  // Liefert Zufallszahl m mit min_m >= m <= m_max
  result := random(m_max - min_m + 1) + min_m;
end;
Zu der Endlosschleife:

Delphi-Quellcode:
NotOK := ((a1 = a[locali]) and (b1 = b[locali])) or // V1 = V[I] oder
         ((b1 = a[locali]) and (a1 = b[locali]));   // V1 = -V[I]
Sollte das dann nicht so heissen?

Delphi-Quellcode:
NotOK := ((a1 = a[locali]) and (b1 =  b[locali])) or // V1 = V[I] oder
         ((a1 = -a[locali]) and (b1 = - b[locali]));   // V1 = -V[I]
Ansonsten testest du ja im zweiten Fall auf den Vektor, der an f(x)=x gespiegelt ist, oder sehe ich das falsch?


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:44 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