Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Ausgabe von einer dreistelligen Zahl(123)


ReggaeGregi - Di 13.03.07 22:51
Titel: Ausgabe von einer dreistelligen Zahl(123)
Hi Leute,
ich hab ein kleines Problemchen. Es wäre super wenn Ihr mir dabei helfen könnt. Und zwar habe ich ein Programm geschrieben welches eine dreistellige Zahl aus drei zufällig gewählten verschiedenen Zahlen zusammensetzt. Zum Beispiel (123). Die Bedingung ist das keine Zahl in der dreistelligen Zahl doppelt vorkommen darf(z.B. 122). Nun dies habe ich hingekriegt. Es war eigentlich kein Problem. Unten seht Ihr wie ich es gemacht habe. Wie gesagt die Zahl soll dreistellig sein.

Die Aufgabe mit der ich nicht zurechtkomme: Das Programm wirft die Zahlen in einem Memo-Feld raus. Aber manche zahlen kommen ja doppelt(123, 687, 123). Wie kann ich das Programm schreiben damit es eine dreistellige Zahl nur einmal raus gibt damit ich ermitteln kann wie viel dreistellige Zahlen möglich sind. Also wie viele Kombinationen! Danke im Voraus. ;)

Hier mein Quelltext

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:integer;
begin
 a:=randomrange(1,9);
 b:=randomrange(0,9);
 c:=randomrange(0,9);
 If (a<>b) and (a<>c) and (b<>c) then
     begin a:=StrToInt(IntToStr(a)+IntToStr(b)+IntToStr(c));
With Memo1.Lines Do Memo1.Lines.Add('Zahl: '+IntToStr(a));
     end;
end;     

procedure TForm1.Button2Click(Sender: TObject);
begin
halt
end;

end.


Dunkel - Di 13.03.07 23:05
Titel: Re: Ausgabe von einer dreistelligen Zahl(123)
Da sieht irgendwie komisch aus:

Delphi-Quelltext
1:
a:=StrToInt(IntToStr(a)+IntToStr(b)+IntToStr(c));                    

Ich würde es so machen:

Delphi-Quelltext
1:
a:= a*100 + b*10 + c;                    


Und daraus

Delphi-Quelltext
1:
With Memo1.Lines Do Memo1.Lines.Add('Zahl: '+IntToStr(a));                    

würde ich ein simples

Delphi-Quelltext
1:
Memo1.Lines.Add('Zahl: '+IntToStr(a));                    

machen.

Zu Deinem Problem:
deklariere ein globales Integer-Array in dem Du alle bisher zu Deiner Liste hinzugefügten Zahlen "zwischenspeicherst", vergleiche dann in Deiner Prozedur, ob die Zahl schon im "Zwischenspeicher" vorhanden ist, wenn nicht -> füge diese dem Memo hinzu.


dsJena - Di 13.03.07 23:24

Wo macht man das eigentlich, kannst du im Quelltext die Stelle markieren?

PS: Er hat das doch schon gut gemacht, ich meine verkürzen kann man die Befehle doch immer... ;-)


Dunkel - Di 13.03.07 23:53

user profile icondsJena hat folgendes geschrieben:
Wo macht man das eigentlich, kannst du im Quelltext die Stelle markieren?

Was wolle?

user profile icondsJena hat folgendes geschrieben:
PS: Er hat das doch schon gut gemacht, ich meine verkürzen kann man die Befehle doch immer... ;-)

Sicherlich funktioniert es so wie er es gemacht hat. Das von mir waren nur Vorschläge...


ReggaeGregi - Mi 14.03.07 14:00

tut mir leid aber das hat mir nicht sehr geholfen.


Martin1966 - Mi 14.03.07 14:13

user profile iconReggaeGregi hat folgendes geschrieben:
tut mir leid aber das hat mir nicht sehr geholfen.

Was hast du denn nicht verstanden? Ansonsten ist können wir dir nicht gezielt helfen. ;-)

Lg, Martin


Narses - Mi 21.03.07 01:20

Moin!

Um das Mysterium für "kommende Generationen" zu lüften, hier noch die Musterlösung: ;)

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:
// bei Programmstart ausführen
procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize; // wirklich zufällige Zahlen
end;

// neue 3stellige Zahl ans Memo anfügen
procedure TForm1.Button1Click(Sender: TObject);
  var
    Zahl: String;
begin
  repeat // solange(1) wiederholen...
    repeat // solange(2) wiederholen...
      Zahl := IntToStr(RandomRange(100,999)); // 3stellige Zahl bilden
      // ...bis(2) die Zahl keine doppelten Ziffern hat!
    until (Zahl[1] <> Zahl[2]) and (Zahl[1] <> Zahl[3]) and (Zahl[2] <> Zahl[3]);
    // ...bis(1) die Zahl "neu" = nicht im Memo ist
  until (Memo1.Lines.IndexOf(Zahl) = -1); // Index -1 bedeutet, nicht drin
  Memo1.Lines.Add(Zahl); // dann die Zahl einfügen
end;


// Programm beenden
procedure TForm1.Button2Click(Sender: TObject);
begin
  Application.Terminate; // _NICHT_ "Halt;" verwenden!
end;


//EDIT: wobei ich gerade sehe, dass das ja gar nicht die eigentliche Aufgabe war... :autsch: OK, Ansatz: statt Zufällig eine Zahl zu ziehen, einfach mit einer Schleife von 100 bis 999 laufen und wenn die Ziffernbedingung passt, die Zahl ins Memo einfügen... ;) naja, so haste dann doch noch was zu tun und kein c&p, ist mir ja auch lieber... :P

cu
Narses