Autor Beitrag
moTi05
Hält's aus hier
Beiträge: 5

Win XP SP2
In der Schule: Delphi 3.0
BeitragVerfasst: Mi 14.12.05 20:19 
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.

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


und

ausblenden 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


ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 5

Win XP SP2
In der Schule: Delphi 3.0
BeitragVerfasst: Mi 14.12.05 20:44 
Zitat:
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46

Win XP
Delphi 2005 Prof.
BeitragVerfasst: 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
ausblenden 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.

_________________
Ein Programm ist nur so gut, wie der Programmierer.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 14.12.05 21:16 
Es kann nicht funzen, da Du Y falsch berechnest ...

Y := Oben - Unten 1;

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
moTi05 Threadstarter
Hält's aus hier
Beiträge: 5

Win XP SP2
In der Schule: Delphi 3.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 14.12.05 22:00 
Hoffentlich ist es nicht nur das...;-)
ausblenden 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;

_________________
We are, we were and will not be.
unforgiven
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46

Win XP
Delphi 2005 Prof.
BeitragVerfasst: Mi 14.12.05 22:10 
user profile iconBenBE hat folgendes geschrieben:
Es kann nicht funzen, da Du Y falsch berechnest ...

ausblenden 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...

_________________
Ein Programm ist nur so gut, wie der Programmierer.
moTi05 Threadstarter
Hält's aus hier
Beiträge: 5

Win XP SP2
In der Schule: Delphi 3.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46

Win XP
Delphi 2005 Prof.
BeitragVerfasst: Mi 14.12.05 22:42 
dann lässte einfach das '-1' weg :wink:

_________________
Ein Programm ist nur so gut, wie der Programmierer.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5

Win XP SP2
In der Schule: Delphi 3.0
BeitragVerfasst: 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.