Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zufallsvariable (https://www.delphipraxis.net/124615-zufallsvariable.html)

Hans33 21. Nov 2008 22:56


Zufallsvariable
 
Hallo,

hab eine Frage.
Ich möchte ein Zahlenrätsel zum Einstieg in die Spieleprogrammierung machen.
Hab Turbo Delphi.

Soweit bin ich gekommen.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var z:0..50; var r:Real;
begin
r:=strtofloat(edit1.Text);
If r<z Then
begin
Label2.Caption:='Die Zahl ist zu klein';
end;
If r>z Then
begin
Label2.Caption:='Die Zahl ist zu groß';
end;
If z=r Then
begin
Label2.Caption:='Richtig!!';
end;

Die Lösungszahl ist immer 112. Das ist das Problem
Danke für Hilfen!

freak4fun 21. Nov 2008 23:20

Re: Zufallsvariable
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  r: real;
  i: Integer;
begin
  Randomize;
  for i := 0 to 50 do
    begin
      r := Random(51);
      ListBox1.Items.add('Zahl: ' + FloatToStr(r));
    end;
end;
Randomize sollte nur ein mal aufgerufen werden. Random(51) erzeugt Zahlen zwischen 0 und 50 (einschließlich der Grenzen). ;)

Hawkeye219 21. Nov 2008 23:25

Re: Zufallsvariable
 
Hallo,

bei mir ist die Lösung immer 0!

Es wird eben die Zahl genommen, die zufällig in z steht - bis du einen sinnvollen Wert dort einträgst.

Gruß Hawkeye

blackdrake 22. Nov 2008 00:50

Re: Zufallsvariable
 
Hallo.

Soll das Zahlenrätsel wirklich Real-Zahlen abfragen? Das wären dann Zahlen mit Komma. Oder möchtest du Integer-Zahlen, also ganzzahlige Werte? Bei den Real-Zahlen musst du darauf achten, dass du das amerikanische Komma, den Punkt nimmst.

Außerdem ist die Notation "var z:0..50;" falsch. Was willst du damit genau aussagen?

Als erstes müsstest du z einen gültigen Typen zuweisen, z.B. Integer:

Delphi-Quellcode:
var z: integer;
und dann müsstet du im Code irgendwo z definieren/initialisieren.

Ich glaube in diesem Falle meinst du

Delphi-Quellcode:
z := Random(51);
In diesem Falle wäre Random aber nur für ganzzahlige Zahlen gültig! Deswegen irritiert mich, dass du diese mit einem Fließkommawert vergleichen willst.

Möchtest du eine zufällige Kommazahl mit 2 Nachkommastellen, könntest du sowas machen:

Delphi-Quellcode:
var z: real;

z := Random(51 * 100) / 100
Gruß
blackdrake

Hawkeye219 22. Nov 2008 01:17

Re: Zufallsvariable
 
Hallo Daniel,

Zitat:

Zitat von blackdrake
Außerdem ist die Notation "var z:0..50;" falsch.

Nein, das ist eine gültige Notation. Sie besagt, dass die Variable z ganzzahlige Werte im Bereich 0..50 aufnehmen kann. Wenn zur Laufzeit ein Wert außerhalb dieses Bereichs zugewiesen wird, dann erhält man bei eingeschalteter Bereichsprüfung eine Exception.

Gruß Hawkeye

DP-Maintenance 22. Nov 2008 08:16

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Windows API / MS.NET Framework API" nach "Object-Pascal / Delphi-Language" verschoben.

Hans33 22. Nov 2008 10:59

Re: Zufallsvariable
 
Hi

bin jetzt nicht wirklich schlau daraus geworden.
Ich möchte nur eine Zahl in mein Edit-Feld eingeben. Die Zufallsvariable soll eine ganze Zahl zwischen 1 und 50 sein
also
Delphi-Quellcode:
r:=Random(51)
r muss dazu doch eine ganze Zahl sein
also
Delphi-Quellcode:
r:Integer;
aber was muss dann die zahl, die ich in das Edit-Feld einege sein? Integer oder Real? Eigentlich doch Integer da r auch Integer ist?!?!
dann bin ich auf das gekommen
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var z,r:Integer;
begin
 r:=strtoint(edit1.Text);
 z:=Random(51);
 If r<z Then
  begin
   Label2.Caption:='Die Zahl ist zu klein';
  end;
 If r>z Then
  begin
   Label2.Caption:='Die Zahl ist zu groß';
  end;
 If z=r Then
  begin
   Label2.Caption:='Richtig!!';
  end;
 end;
end.
aber dann ist die Lösungszahl zwischen 10 und 11, asber wenn ich dann 9,5 oder 9.5 eingebe kommt eine Fehlermeldung!!

was nun??

Hans33 22. Nov 2008 11:03

Re: Zufallsvariable
 
Die Zufalls variable ändert sich auch bei jedem Button-Klick was natürlich nicht sein sollt sonst kann man ja die Zahl nie eraten :lol:

quendolineDD 22. Nov 2008 11:10

Re: Zufallsvariable
 
Sicher, weil du bei StrToInt keine Gleitkommazahlen verwenden kannst, sondern ganzzahlige Werte brauchst.
Nun versteh ich auch inwiefern du das machen willst ;-)

Einfach dann die Zufallsvariable im FormCreate zuweisen und die Abfrage mit der Eingabe im ButtonClick-Ereignis.

Delphi-Quellcode:
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  public
    z : integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var r : real;
begin
  r := StrToFloat(Edit1.Text); //Gleitkommawert von Eingabe r zuweisen

       if r < z then Label2.Caption := 'Zu niedrig'
  else if r > z then Label2.Caption := 'Zu hoch'
  else if r = z then Label2.Caption := 'Erraten';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
z := random(50)+1; //Zufallszahl im Bereich 1-50
end;
Edit: Stimmt, hatte das einfach den Vorpostern entnommen ^^

DeddyH 22. Nov 2008 11:15

Re: Zufallsvariable
 
Btw: Eine Zufallszahl im Bereich 1 bis 50 bekommt man mit Random(50) + 1.

Hans33 22. Nov 2008 11:48

Re: Zufallsvariable
 
Ja klappt auch soweit aber die zu erratenen zahl ist immer 0!!
auch wenn ich das Projekt schließe und dann nochmal starte. Muss das so sein?

quendolineDD 22. Nov 2008 11:51

Re: Zufallsvariable
 
Poste mal deinen gesamten Quelltext. Bei mir kommen nach jedem Neustart des Programms neue Zufallszahlen heraus ...

Du darfst die Initialisierung des Zufallsgenerator, durch den Aufruf von der Prozedur Randomize nicht vergessen!

Hans33 22. Nov 2008 11:55

Re: Zufallsvariable
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  public
    z : integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject);
var r : real;
begin
  r := StrToFloat(Edit1.Text);

       if r < z then Label2.Caption := 'Zu niedrig'
  else if r > z then Label2.Caption := 'Zu hoch'
  else if r = z then Label2.Caption := 'Erraten';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
z := random(100)+1;
end;
end.

DeddyH 22. Nov 2008 12:01

Re: Zufallsvariable
 
Wieso vergleichst Du ganze mit Fließkommazahlen?

Hans33 22. Nov 2008 12:05

Re: Zufallsvariable
 
Warum? Ist das falsch?
Wenn ja wie mach ichs anders??

DeddyH 22. Nov 2008 12:09

Re: Zufallsvariable
 
Hier mal ein schnell runtergetipptes Beispielprojekt (implementation-Teil):
Delphi-Quellcode:
uses Math;

procedure TfrmRaten.btnRatenClick(Sender: TObject);
var Ratezahl: Integer;
begin
  Ratezahl := StrToIntDef(edtEingabe.Text,0);
  case Sign(Ratezahl - Zahl) of
     0: ShowMessage('Erraten');
     1: ShowMessage('Zu hoch');
    -1: ShowMessage('Zu niedrig');
  end;
  edtEingabe.SetFocus;
  edtEingabe.SelectAll;
end;

procedure TfrmRaten.FormCreate(Sender: TObject);
begin
  Randomize;
  Zahl := Random(100) + 1;
end;

blackdrake 22. Nov 2008 12:14

Re: Zufallsvariable
 
@Hans33: Wenn die zu erratende Zahl eine ganze Zahl sein sollte, wieso solltest du dann dem Benutzer erlauben, eine Fließkommazahl einzugeben? Wenn der Benutzer 9.5 eingibt, ist das schlicht und einfach ein falscher Wert. Das ist genau so, wie wenn er "a" eingibt, ist auch falsch.

StrToIntDef aus dem vorherigen Post wandelt eine ungültige Eingabe in 0 um und somit erhält der Benutzer keine Fehlermeldungen bei einer Kommazahl oder einem nicht-numerischen Wert.

quendolineDD 22. Nov 2008 12:53

Re: Zufallsvariable
 
Macht sich bloß dumm, wenn der Benutzer dann nicht darauf hingewiesen wird, das er eine falsche Eingabe macht und immer weiter macht ...
Ich glaube aber das Grundproblem ist hier einfach das Verständnis, weswegen man nicht unbedingt eine Abfrage der Benutzereingabe machen sollte.

DeddyH 22. Nov 2008 12:56

Re: Zufallsvariable
 
Wer so blöd ist, beim Zahlenraten ein "a" oder sowas einzugeben, hat es nicht besser verdient :twisted:

Hans33 22. Nov 2008 12:59

Re: Zufallsvariable
 
was ist dann falsch?
Ich kann kein denkfehler erkennen!
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  public
    z :integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
z := random(50)+1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var r : real;
begin
  r := StrTofloat(edit1.Text);

       if r < z then Label2.Caption := 'Zu niedrig'
  else if r > z then Label2.Caption := 'Zu hoch'
  else if r = z then Label2.Caption := 'Erraten';
end;
end.

Hans33 22. Nov 2008 13:00

Re: Zufallsvariable
 
ob ich r:Integer; oder r:Real; mach macht kein unterschied im Ergebnis

DeddyH 22. Nov 2008 13:01

Re: Zufallsvariable
 
Wie äußert sich der Fehler denn?

foerster7892 22. Nov 2008 13:13

Re: Zufallsvariable
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var r : integer;
begin
  r := StrToInt(edit1.Text);
  z := random(50)+1;
       if r < z then Label2.Caption := 'Zu niedrig';
       if r > z then Label2.Caption := 'Zu hoch';
       if r = z then Label2.Caption := 'Erraten';
end;
Hi
ich hab zwar selbst keine Ahnung von irgendwas aber probiers mal so!

Hans33 22. Nov 2008 13:14

Re: Zufallsvariable
 
@DeddyH: also ich starte das programm.
Die Lösungszahl ist 0.
Starte ich das Programm neu, ist die Lösungszahl 0.
Das kann ich so oft ich will machen, immer 0.

alzaimar 22. Nov 2008 13:15

Re: Zufallsvariable
 
Zeig mal Deinen Code.

quendolineDD 22. Nov 2008 13:16

Re: Zufallsvariable
 
Scheint als würde bei dir Randomize nicht aufgerufen.
Hast du den Quellcode einfach nur kopiert? Klicke mal doppelt auf deine Form, das bei dir selber das OnCreate-Ereignis erzeugt wird ...

DeddyH 22. Nov 2008 13:16

Re: Zufallsvariable
 
Ist das FormCreate auch zugewiesen? Schau mal im Objektinspektor nach.

foerster7892 22. Nov 2008 13:19

Re: Zufallsvariable
 
bei neuen delphiversionen muss mann oder frau den randomize nicht mehr extra aufrufen(zu mindest nicht für einfaches random ob man den noch für was anderes nutzen kann weiß ich net)

Hans33 22. Nov 2008 13:19

Re: Zufallsvariable
 
@forerster7891: Klappt nicht.
zB. 16 ist zu hoch
15 zu klein
15,5
oder 15.5
kommt eine fehlermeldung

DeddyH 22. Nov 2008 13:21

Re: Zufallsvariable
 
In meiner Hilfe (D2007) steht:
Zitat:

Um den Zufallszahlengenerator zu initialisieren, rufen Sie Randomize einmal auf oder weisen der Variablen RandSeed vor dem Aufruf von Random einen Wert zu.

DeddyH 22. Nov 2008 13:22

Re: Zufallsvariable
 
Hans, häng das Projekt doch mal als ZIP-Archiv an, sonst kommen wir wohl nicht weiter.

Hans33 22. Nov 2008 13:22

Re: Zufallsvariable
 
Mein Code:

Delphi-Quellcode:
nit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClick(Sender: TObject);
  public
    z :integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
z := random(50)+1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var r : real;
begin
  r := StrTofloat(edit1.Text);

       if r < z then Label2.Caption := 'Zu niedrig'
  else if r > z then Label2.Caption := 'Zu hoch'
  else if r = z then Label2.Caption := 'Erraten';
end;
end.




außerdem: Bei objektinspektor ist OnCreate zugewiesen

foerster7892 22. Nov 2008 13:24

Re: Zufallsvariable
 
hast bei dem was ich da geschrieben hab bei jedem klick nen andern wert(deshalb wars mal größer mal kleiner)

DeddyH 22. Nov 2008 13:24

Re: Zufallsvariable
 
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;
  z := random(50)+1;
  ShowMessage(IntToStr(z)); //zur Kontrolle
end;

procedure TForm1.Button1Click(Sender: TObject);
var r : integer; //real mit integer zu vergleichen macht selten Sinn
begin
  r := StrToInt(edit1.Text);

       if r < z then Label2.Caption := 'Zu niedrig'
  else if r > z then Label2.Caption := 'Zu hoch'
  else if r = z then Label2.Caption := 'Erraten';
end;

Hans33 22. Nov 2008 13:27

Re: Zufallsvariable
 
Liste der Anhänge anzeigen (Anzahl: 1)
So hier
das Projekt heißt Raten

Hans33 22. Nov 2008 13:30

Re: Zufallsvariable
 
Das ist die Lösung:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;
  z := random(50)+1;

end;

procedure TForm1.Button1Click(Sender: TObject);
var r : integer;
begin
  r := StrToInt(edit1.Text);

       if r < z then Label2.Caption := 'Zu niedrig'
  else if r > z then Label2.Caption := 'Zu hoch'
  else if r = z then Label2.Caption := 'Erraten';
end;
end.

DeddyH hats richtig gemacht nun funktioniert es

Hans33 22. Nov 2008 22:53

Re: Zufallsvariable
 
Vielen Dank für die Hilfe!!!!! :dancer:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 Uhr.

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