Entwickler-Ecke

Sonstiges (Delphi) - Zahlen erraten...


moTi05 - Mi 14.12.05 20:19
Titel: Zahlen erraten...
Hallo!

Ich arbeite grade in der Schule an einem Programm in dem es darum geht, Zufallszahlen aus einem bestimmen Wertebereich (z.B. 15 bis 25), vom Computer generiert wurden zu erraten. Im Moment beschränkt sich dies auf eine Zahl. Leider ist mein Problem das die im Unterricht genannte Formel um eine Zufallszahl im gewünchten Bereich zu erhalten nicht von meinem Delphi akzeptiert wird.


Delphi-Quelltext
1:
zahlpc:=random(oben-unten+1)+unten;  //  !! Hier liegt der erste Fehler - laut Delphi  !!                    


und


Delphi-Quelltext
1:
zahlpc := random(oben-unten+1)+unten; // !! Hier liegt - laut Delphi - der zweite Fehler !!                    


Die Variablen sind alle richtig deklariert. Der Tipp des Users (tipp); die Zufallszahl des PCs (zahlpc) sowie die obere und untere Grenze (oben und unten).

Im Quellcode (s.u.) sind die beiden Fehlerhaften stellen als Kommentare ausgeschnitten um beim restlichen entwickeln des Programms nicht zu stören.

Mein Problem lautet nun, was ist an der Formel, bzw. am Syntax der von mir eingegeben Zeilen falsch? Delphi 3.0 gibt mir als Fehler an, dass an der ersten Zeile mit random(...) ein "Operator oder Semikolon fehlt", jedoch habe ich ja eins eingegeben. Des weitern sind "Inkompatible Typen" angegeben. Die selben Fehler werden auch in der zweiten "random(...)-Zeile" verursacht.

Kann mir jemand bei meinem Problem helfen? Für Rückfragen bin ich offen ;)

Danke im Vorraus,

Timo



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:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
var hilfe : integer;

begin

  versuch               := 0;                         // Versuchszähler
  panelversuche.caption := IntToStr(versuch);         // wird auf 0 gesetzt


 randomize;                                           // Zufallszahlen werden zufällig ;-)

 unten   := StrToInt(editunten.text);                 // Einlesen der unteren
 oben    := StrToInt(editoben.text);                  // und oberen Grenze



 if (unten > oben)    // Test, ob die Grenzen richtig def. sind

   then

     begin
       showmessage('Leider sind die Größen Falsch definiert. Werte werden getauscht.'); // Textausgabe, Werte falsch

       hilfe  := unten;
       unten  := oben;        // Dreieckstausch, oben und unten werden vertauscht
       oben   := hilfe;

       editunten.text   := IntToStr(unten);   // Die nun vertauschten Werte werden in den jeweiligen edit-Zeilen ausgegeben
       editoben.text    := IntToStr(oben);

       unten   := StrToInt(editunten.text);   // Erneutes Einlesen der Grenzen aus den edit-Zeilen
       oben    := StrToInt(editoben.text);

       //zahlpc:=random(oben-unten+1)+unten;  //  !! Hier liegt der erste Fehler - laut Delphi  !!

       showmessage('Jetz gehts!')   // Bestätigung an den User. Zufallszahl wurde generiert.
     end

       else

       showmessage('Jetz gehts!')   // Bestätigung an den User. Zufallszahl wurde generiert.

       //zahlpc := random(oben-unten+1)+unten; // !! Hier liegt - laut Delphi - der zweite Fehler !!
end;


jaenicke - Mi 14.12.05 20:25

Du hast die Deklaration der zahlpc nicht angegeben, deshalb: woher sollen wir wissen, wo der Fehler liegt?
Aber, wenn ich raten soll: Wahrscheinlich ist zahlpc als Integer deklariert, Random gibt aber eine Dezimalzahl, also mit Komma, zurück.
Also: Round(Random(...))


Marc. - Mi 14.12.05 20:34

user profile iconjaenicke hat folgendes geschrieben:
Du hast die Deklaration der zahlpc nicht angegeben, deshalb: woher sollen wir wissen, wo der Fehler liegt?
Aber, wenn ich raten soll: Wahrscheinlich ist zahlpc als Integer deklariert, Random gibt aber eine Dezimalzahl, also mit Komma, zurück.
Also: Round(Random(...))



wenns als integer wert deklariert wäre, bräuchtest es auch nicht zu runden, weils nur ganze zahlen sind :roll:


wenn du zufallszahlen willst hätte ich das wie folgt geschrieben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button1Click(Sender: TObject);
var
zahlpc, oben, unten: integer;

begin

randomize;        
                           
unten   := StrToInt(editunten.text);          
oben    := StrToInt(editoben.text);             

zahlpc:=random((oben-unten+1)+unten);

label1.Caption := IntToStr(zahlpc);

end;


;) vllt hilfts dir ja


moTi05 - Mi 14.12.05 20:44

Zitat:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button1Click(Sender: TObject);
var
zahlpc, oben, unten: integer;

begin

randomize;        
                           
unten   := StrToInt(editunten.text);          
oben    := StrToInt(editoben.text);             

zahlpc:=random((oben-unten+1)+unten);

label1.Caption := IntToStr(zahlpc);

end;


;) vllt hilfts dir ja


Allgemein weiß ich ja wie ich die Zufallszahl generiere. Nur in diesem speziellen Beispiel scheint irgendetwas nicht zu klappen... :(

Sorry das ich es vergessen habe, "ZahlPC" ist auch eine Integer Variable.


Marc. - Mi 14.12.05 20:47
Titel: bitte löschen ... voreilig gepostet... :oops:
was klappt denn nicht? kommt ne fehlermeldung?


[edit] oh.. habs oben net ganz durchgelesen :oops:


unforgiven - Mi 14.12.05 21:02

okay...das hab ich schon mal gemacht, könnte diur jetzt den kompletten quelltext reinstellen, aber dann wäre es für dich nicht sinnvoll ^^

zu deinem problem mit randomzahlen

um aus einem bereich von zB 10-25 zahlen zu ziehen berechnest du erst mal wieviele zahlen da drinne sind (ich nehme mal an, das die schranken nicht mit dazu zählen)
also 11,12,13,14,15,16,17,18,19,20,21,22,23,24 -> wären 14 -> oben-unten-1

nun erzeugst du ein random

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
x:=Random(14); //liefert zahlen von 0-13 zurück
x:=Random(14)+10 //liefert dir zahlen im bereich von 10-25 zurück

{ jetzt allgemein }
y:=oben-unten-1;
x:=Random(y)+unten;


das sollte funktionieren
ich teste mal ^^

Edit: jop funzt...

Moderiert von user profile iconGausi: BBCodes aktiviert.


BenBE - Mi 14.12.05 21:16

Es kann nicht funzen, da Du Y falsch berechnest ...

Y := Oben - Unten 1;


moTi05 - Mi 14.12.05 21:52

Mir gehts ja nicht um die Mathematische Formel zum ausrechnen, die weiß ich mehr oder weniger selbst ;)

Viel mehr ist mein Problem, dass Delphi disesen Code, der oben steht, einfach nicht annimmt. Irgendwas will der die ganze Zeit.

>> "Inkompatibler Typ"
oder
>> "Operator oder Semikolon fehlt"

Diese Fehlermeldungen beziehen sich auf die beiden stellen mit dem random(...)


Gausi - Mi 14.12.05 22:00

Hoffentlich ist es nicht nur das...;-)

Delphi-Quelltext
1:
2:
3:
4:
5:
x:=Random(14); //liefert zahlen von 0-13 zurück   
x:=Random(14)+10; //liefert dir zahlen im bereich von 10-25 zurück   
{ jetzt allgemein }   
y:=oben-unten-1;   
x:=Random(y)+unten;


unforgiven - Mi 14.12.05 22:10

user profile iconBenBE hat folgendes geschrieben:
Es kann nicht funzen, da Du Y falsch berechnest ...


Delphi-Quelltext
1:
Y := Oben - Unten 1;                    


nein es muss -1 heißen...da du ja die werte zwischen den schranken haben willst...und da ja a-b einen wert zu viel hat (wenn man berücksichtigt, das a und b nicht mit in der definitionsmenge sind)...

von daher stimmt die formel...

aber wie gesagt, es kann auch nurl, wie gausi bemerkt hat, an dem fehlendem semikolon bei mir liegen...

merke: der häufigste fehler ist das fehlende semikolon, also immer nach jeder zeile gucken ob da auch nen semikolon is (außer vor else) ;)

ich hab das ganze auch mal in einem langzeittest getest mit ner ListBox...und es kamen nur werte raus zwischen den schranken...bei 100 versuchen ist die wahrscheinlichkeit sehr sehr gering, das eine zahl nicht gezogen wurde...


moTi05 - Mi 14.12.05 22:35

In der bei uns gestellen Aufgabe ist es aber so das die Schrankenwerte bin einbezogen werden sollen... ^___^

*alles wieder kaputt mach*


unforgiven - Mi 14.12.05 22:42

dann lässte einfach das '-1' weg :wink:


jaenicke - Do 15.12.05 18:07

user profile iconNoTVerYEvilPzYchO hat folgendes geschrieben:
user profile iconjaenicke hat folgendes geschrieben:
Du hast die Deklaration der zahlpc nicht angegeben, deshalb: woher sollen wir wissen, wo der Fehler liegt?
Aber, wenn ich raten soll: Wahrscheinlich ist zahlpc als Integer deklariert, Random gibt aber eine Dezimalzahl, also mit Komma, zurück.
Also: Round(Random(...))


wenns als integer wert deklariert wäre, bräuchtest es auch nicht zu runden, weils nur ganze zahlen sind :roll:

Ok, die Version von Random mit Parameter liefert ja ein Integer, ok, Sorry!

Aber woher kommt denn dann der inkompatible Typ? Hmm...


moTi05 - Do 15.12.05 18:18

Danke für alle Antworten !

Aber das Problem hat sich mehr oder weniger von selbst gelöst.

Ich hab dummer Weiße den Button der die random(...)-Funktion auslöst auch random genannt...

Kann geschlossen werden. Danke.