Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Prozedur, die Zufallszahlen erzeugt!


steffi1980 - Di 24.03.09 17:08
Titel: Prozedur, die Zufallszahlen erzeugt!
Hallo,

Bin gerade dabei eine Prozedur zu erzeugen, die 10 Zufallszahlen im Bereich 0<=x<=100 erzeugt und in einem Array abspeichert. Gleichzeitig sollen Maximum und Durchschnitt der erzeugten Zufallszahlen berechnet und mit Hilfe von SHOWMESSAGE Anweisungen ausgegeben werden!

Kann mir jemand diese Prozedur schreiben? Wäre echt lieb!


Nersgatt - Di 24.03.09 17:09

Was zahlst Du?


Gausi - Di 24.03.09 17:10

Wie sehen denn deine Ansätze aus? Was hast du bereits, wo kommst du nicht weiter?

Ansonsten wäre das ein Fall für die Jobbörse, bei dem sich jemand schnell ein paar Euro verdienen kann...


steffi1980 - Di 24.03.09 17:17

Ok, sorry hab das blöd formuliert. Aber ich versteh nicht viel von Delphi, brauchs aber dringend für ne Klausur.


Nersgatt - Di 24.03.09 17:21

Dann zeig doch mal Deine Ansätze!


steffi1980 - Di 24.03.09 17:25

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Dann zeig doch mal Deine Ansätze!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
begin
procedure Zufallszahlen (const zahl1, zahl2 : INTEGER);
  VAR a: Array[1..10of INTEGER;
      m: INTEGER;
      d: REAL;
      BEGIN
        RANDOMIZE;
        FOR i:= 1 TO 10 DO
          BEGIN
            a[i]:= RandomRange (1,10);
            m:=

Wie weiter weiß ich nicht und ob das richtig ist bezweifel ich auch stark!

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


JayEff - Di 24.03.09 17:29

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Dann zeig doch mal Deine Ansätze!
Und wenn du keine hast, dann wenigstens einen Preis! :mrgreen:
Hausaufgaben macht dir hier niemand (umsonst :mrgreen: ). Aber wir helfen dir mit dem größten Vergnügen zu lernen, was du dazu wissen musst :zustimm:
Ein Aufruf von randomize; (z.B. im onCreate der Form, bitte nur 1 Mal pro Programm) initialisiert den Pseudo-Zufallsgenerator von Delphi. Mit der Funktion random(range: Integer): Integer erhälst du eine Zufallszahl zwischen 0 und (range-1) (iirc). Damit solltest du schon mal ein paar Schritte weiter sein :zustimm:

Ich seh grad erst deinen aktuellsten Post: Gewöhn dir mal Capslock im Code ab, das sieht doch nix gleich und widerspricht dem Styleguide ;)
RandomRange kannte ich jetzt nicht, wenn die funktioniert, dann ist ja gut. Aber sollen die Zahlen nicht zwischen 1 und 100 liegen? Deine liegen zwischen 1 und 10.
Das Abspeichern im Array funktioniert ja schon ziemlich gut. Das Maximum bekommst du mit einer if-Abfrage in der Schleife: Du fragst, ob die aktuell als Maximum gespeicherte Zufallszahl kleiner ist als die gerade erzeugte, und falls ja, speicherst du die neue, sonst tust du nix. Den Durchschnitt errechnet man (das solltest du wissen, oder? ;) ) indem man über alle Zahlen summiert und dann durch die Anzahl an Zahlen teilt.

edit: Delphi-Code kannst du in <span class="inlineSyntax"><span class="codecomment">{PROTECTTAGd66a386d5c560f97752dc570d8947955}</span></span>-Tags schreiben, dann sieht der viel schöner aus :zustimm:


steffi1980 - Di 24.03.09 19:20

Das wäre jetzt mein nächster Ansatz, kann das Maximum aber nicht beschreiben, weil ichs leider immernoch nicht verstehe.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure Zufallszahlen;
  VAR a: Array[1..10of INTEGER;
      m,i: INTEGER;
      d: REAL;
      BEGIN
        RANDOMIZE;
        FOR i:= 1 TO 10 DO
          BEGIN
            a[i]:= Random(100)+1;
            m:= a[1];
            IF a[i]>a[1then showmessage (INTTOSTR(i));


Moderiert von user profile iconKha: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt


Dude566 - Di 24.03.09 19:27

user profile iconsteffi1980 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

Bin gerade dabei eine Prozedur zu erzeugen, die 10 Zufallszahlen im Bereich 0<=x<=100 erzeugt und in einem Array abspeichert. Gleichzeitig sollen Maximum und Durchschnitt der erzeugten Zufallszahlen berechnet und mit Hilfe von SHOWMESSAGE Anweisungen ausgegeben werden!

Kann mir jemand diese Prozedur schreiben? Wäre echt lieb!


Wenn du gerade eine Prozedur machst, warum sollen wir dir dann einen fertigen Code liefern? :roll:


steffi1980 - Di 24.03.09 19:32

user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconsteffi1980 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

Bin gerade dabei eine Prozedur zu erzeugen, die 10 Zufallszahlen im Bereich 0<=x<=100 erzeugt und in einem Array abspeichert. Gleichzeitig sollen Maximum und Durchschnitt der erzeugten Zufallszahlen berechnet und mit Hilfe von SHOWMESSAGE Anweisungen ausgegeben werden!

Kann mir jemand diese Prozedur schreiben? Wäre echt lieb!


Wenn du gerade eine Prozedur machst, warum sollen wir dir dann einen fertigen Code liefern? :roll:


Hatte mich bereits für die unglückliche Formulierung entschuldigt und auch nen Ansatz geliefert, falls du nicht lesen kannst ;-)


Dude566 - Di 24.03.09 20:28

Ich kann sehr wohl lesen, nur sehe es nicht ein mir die Mühe zu machen alles zu lesen wenn der Thread nicht gleich richtig ausformuliert wird. :mahn:


Narses - Di 24.03.09 20:29

Moin!

Bitte beim Thema bleiben - oder einfach raushalten, danke. :)

cu
Narses


andras - Di 24.03.09 20:40

Zum Maximum:
Du gehst alle Zahlen im Array durch. Mit der 1. Zahl beginnst du. Diese wird automatisch als Maximum angenenommen. Daran werden alle folgenden Zahlen gemessen. Ist eine größer wird sie als neuer Maximum genommen und die nächsten Zahlen werden an ihr gemessen. Das machst du so lange bis du am Ende des Arrays angekommen bist.

Der Durchschnitt ist dir klar?


Dude566 - Di 24.03.09 20:50

Zu dem Maximum:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var
max : integer;

procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
  array : array of integer;
begin
  for i := Low(arrayto High(arraydo
    if max < array[i] then max := array[i];
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  max := 0;
end;


Durchschnitt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
  array : integer;
  summe : integer;
  schnitt : integer;
begin
   for i := low(arrayto high(array)
    do summe := summe + array[i];
   schnitt := summe div length(array);
end;


JayEff - Di 24.03.09 21:00

Maximum wird nix, weil array ein reservierter Bezeichner ist. umbenennen der Variable in etwas anderes sollte helfen.
Durchschnitt wird nix, weill der /-Operator eine Kommazahl liefert. Entweder div nehmen, welches iirc abrundet, oder den Typ der Ergebnisvariable als Floatingpoint-Typen wählen, z.B. Extended. Ausserdem gleicher Fehler wie bei Maximum, bezüglich array-Variable.


Gausi - Di 24.03.09 21:05

Außerdem berechnet die Maximum-Funktion das Minimum, und das nur, wenn das Array auch negative Werte enthält. :zwinker:

Besser so (plusminus ein paar Syntaxfehler :angel:)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
type
  TIntArray = Array of Integer;

function Maximum(aArray: TIntArray);
var i, tmpmax: Integer;
begin
  if length(aArray) > 1 then
  begin
    tmpmax := aArray[0];
    for i := 1 to length(aArray)-1 do
      if tmpmax < aArray[i] then
        tmpmax := aArray[i];
    result := tmpmax;
  end else
    result := -42// Fehler !!
end;


Dude566 - Di 24.03.09 21:11

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Außerdem berechnet die Maximum-Funktion das Minimum, und das nur, wenn das Array auch negative Werte enthält. :zwinker:


Bei meinem Code?


JayEff - Di 24.03.09 21:15

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Außerdem berechnet die Maximum-Funktion das Minimum, und das nur, wenn das Array auch negative Werte enthält. :zwinker:
:gruebel: bitte, was? Meinst du damit, das "<" ist falschrum? Ich denke nicht...?

user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:


Delphi-Quelltext
1:
2:
3:
4:
  for i := Low(arrayto High(arraydo
    if max < array[i] then max := array[i]; //wenn das vorige max kleiner ist als die aktuelle zahl, 
                                            //ist die aktuelle zahl natürlich größer als das vorige maximum, passt doch?
end;


PS: Oha, Bug im DF gefunden, mal sehen ob's den schon gibt ... Ah, oder vllt nicht... Jetzt bin ich verwirrt :gruebel:


Gausi - Di 24.03.09 21:18

Hm. Hab ich mich da eben verguckt? :gruebel: Kann sein. :oops:

Trotzdem ist es besser, das Maximum mit dem ersten Array-Eintrag zu initialisieren, nicht mit 0.


JayEff - Di 24.03.09 21:19

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Trotzdem ist es besser, das Maximum mit dem ersten Array-Eintrag zu initialisieren, nicht mit 0.
Definitiv, denn sonst wird 0 als Maximum angegeben, wenn das Array nur negative Zahlen enthält :mahn:


Dude566 - Di 24.03.09 21:21

Jo hast ja im Prinzip recht, wir haben es so gelernt.


Quitzlinga - Mi 25.03.09 15:14

Hi Steffi1980

Du solltest nicht den Wagen vor dem Rad erfinden. Ich habe so das Gefühl, das Du dir über die Aufgabe selbst noch nicht ganz klargeworden bist, sondern sie nur oberflächlich betrachtet hast.

Jede DV-Aufgabe (Projekt, Aufgabenstellung, Arbeit etc.) läuft immer nach folgenden linearen Prinzip ab:

(1) Planung und Konzeption (Was will ich überhaupt und wie könnte ich das allgemein beschreiben)
(2) DV-Konzeption (Ich mache mir Gedanken um Punkt 1 und wie ich die Probleme dort konkret lösen könnte,
ohne das auf einen spezielle Sprache festzulegen)
(3) Realisierung im der entsprechenden Sprache (in deinem Fall Pascal)

Dein Problem ist, Du beginnst schon bei Punkt 3, ohne dir grossartig Gedanken zu Punkt 1 und 2 gemacht zu haben.
Solange Du icht sehr gut im programmieren und Supermann bist, führt diese Denkweise früher oder später zu Problemen (spätestens bei der Wartung der entsprechenden Software)

Also einmal ganz von vorne, Schritt für Schritt:

1. Lehne Dich zurück,atme einmal tief ein und aus und löse Dich vom Gedanken, das deine Aufgabe mal so eben lösbar ist.
Dazu hast Du noch zuwenig Erfahrung (meiner Meinung nach)

2. Schnappe Dir ein Blatt Papier und beginne mit der Planung, d.h. schreibe alles auf, was Du weisst und ordne das
erstmal. In den meisten Fällen ist das sowieso erst mal dein Aufgabenstellung, also in diesem Fall :

Zitat:
Erzeuge 10 Zufallszahlen im Bereich 0<=x<=100 und speichere das in einem Array ab. Berechne Maximum und Durchschnitt der erzeugten Zufallszahlen und gebe es mit Hilfe von SHOWMESSAGE aus.


Das sind schon einmal sehr wertvolle Informationen. Ordnen sie wir ein bischen und teilen wir sie den einzelnen
Punkten mal zu :

(1) Erzeuge Zufallszahl, Speichere Zufallszahl ab, Berechne Maximum, Berechne Durchschnitt,
Gebe Durchschnitt und Maximum aus.
(2) Erzeuge 10 Zufallszahlen, speichere Zufallszahlen in ein Array ab, Zeige Durchschnitt und Maximum mit Hilfe
einer BS-Funktion an.
(3) Löse das ganze in Pascal

3. Löse dich mal von Pascal und andere Programmiersprachen und schreibe den Programmablauf von (1) einfach mal abstrakt
auf, z.B. so:

(a) Meine_Aufgabenstellung
(aa) Erzeuge_Zufallszahl
(bb) Speichere_Zufallszahl_ab
(cc) Wiederhole aa und bb solange, bis eine bestimmte Anzahl erreicht ist
(dd) Berechne_Maximum_der_Zufallszahlen
(ee) Berechne_Durchschnitt_der_Zufallszahlen
(ff) Gebe_Durchschnitt_und_Maximum_der_Zufallszahlen_aus

4. Gehe nun zu Schritt 2 des Ablaufs und konkretisiere das ganze:

(a) Meine_Aufgabenstellung
(aa) Erzeuge_Zufallszahl (0 <= Zufallszahl <= 100)
(bb) Speichere_Zufallszahl_ab (intern, Array)
(cc) Wiederhole aa und bb solange, bis eine bestimmte Anzahl erreicht ist (10 mal)
(dd) Berechne_Maximum_der_Zufallszahlen (Zwischenspeichern in Variable Maximum)
(ee) Berechne_Durchschnitt_der_Zufallszahlen (Zwischenspeichern in Variable Durchschnitt)
(ff) Gebe_Durchschnitt_und_Maximum_der_Zufallszahlen_aus (Maximum, Duchschnitt)
(fff) Realisierung mittels BS-Funktion

5. Komme zum Schluss und realisiere das ganze in Pascal. Hier liefere ich Dir nur einen Ansatz (nicht getestet),
füllen musst du die Rümpfe schon selbst ;-) :


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:
44:
45:
46:
   const Anzahl = 10;

   Type ZArray = array[1..Anzahl] of integer;
   
   procedure Meine_Aufgabenstellung();

    function Erzeuge_Zufallszahl(Unten,Oben): integer;
    begin
      // das musst Du selber schreiben ;-)
    end;

    procedure Speichere_Zufallszahl_ab(Zufallszahlen : ZArray);
    begin
      // das musst Du selber schreiben ;-)
    end;

    function Berechne_Maximum_der_Zufallszahlen(Zufallszahlen : ZArray): integer;
    begin
      // das musst Du selber schreiben ;-)
    end;

    function Berechne_Durchschnitt_der_Zufallszahlen(Zufallszahlen : ZArray): integer;
    begin
      // das musst Du selber schreiben ;-)
    end;

    procedure Gebe_Durchschnitt_und_Maximum_der_Zufallszahlen_aus(Durchschnitt,Maximum);
    begin
      ShowMessage('// das musst Du selber schreiben ;-)');
    end;

   var
      Durchschnitt,Maximum,Erzeugte_Anzahl,ZZahl : integer;
      Zufallszahlen : ZArray; 
   begin
     Randomize;
     Erzeugte_Anzahl := 0;
     while Erzeugte_Anzahl < Anzahl do begin
       ZZahl := Erzeuge_Zufallszahl(0,100);
       Speichere_Zufallszahl_ab(Zufallszahlen);
       Inc(Erzeugte_Anzahl);
     end;
     Maximum := Berechne_Maximum_der_Zufallszahlen(Zufallszahlen);
     Durchschnitt := Berechne_Durchschnitt_der_Zufallszahlen(Zufallsszahlen);
     Gebe_Durchschnitt_und_Maximum_der_Zufallszahlen_aus(Durchschnitt,Maximum);
   end;


Wie bereits am Anfang gesagt, niemals den Wagen vor dem rad erfinden. Eine gute Planung ist mehr Wert, als stumpfes drauflos programmieren. Für weitere Probleme rate ich Dir, die Suche hier zu benutzen oder ganz einfach zu googeln. Viel Glück bei Deiner Klausur

MfG

Quitzlinga