AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Sammelbilder [lineares Feld]

Ein Thema von me2u · begonnen am 26. Apr 2007 · letzter Beitrag vom 3. Mai 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#11

Re: Sammelbilder [lineares Feld]

  Alt 28. Apr 2007, 12:55
Ja Fabian, ist klar. Die Optimierungen kann man natürlich noch viel weiter treiben. Ich habs nur nicht gemacht, damit es me2u auch versteht. Aber du hast natürlich recht.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
me2u
(Gast)

n/a Beiträge
 
#12

Re: Sammelbilder [lineares Feld]

  Alt 29. Apr 2007, 20:15
Hi, ich habe mittlerweile folgenden Code: Ich habe übrigens das mit dem boolean geändert, kam irgendwie gerade so, als ich an anderer Stelle das mit + 1 eingebaut habe und dafür natürlich integer oder cardinal benötige.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

const bilder_gesamt = 10; //Anzahl aller Bilder

var Bilder : array [0..(bilder_gesamt-1)] of integer;
    Tafeln : integer; //Anzahl der Tafeln Schokolade, die gekauft werden
    fehlend : integer; //Anzahl der Bilder, die man noch nicht gesammelt hat
    i : integer; //Zählvariable

begin
  //Zufallsgenerator initialisieren
  randomize;

  //Startwerte setzen
  Tafeln := 0;
  fehlend := bilder_gesamt;
  //Zuerst müssen alle Bilder den Wert 0 haben
  for i := 0 to (bilder_gesamt - 1) do
    Bilder[i]:=0;

  //Verarbeitung: "Einkauf" Schleife
  while fehlend > 0 do
  begin
    Tafeln := Tafeln + 1;
    i := Random(bilder_gesamt);
    //Bild wird als gekauft "markiert"
    Bilder[i] := Bilder[i] + 1;
    //Wenn man das Bild hat, wird fehlend verringert
    IF Bilder[i] = 1 THEN
      fehlend := fehlend - 1;
  end;

  //Ausgabe
  lblAusgabe.Caption := 'Man muss ' + IntToStr(Tafeln) + ' Tafeln kaufen bis man alle Bilder gesammelt hat.';
end;
Jetzt muss man ja theoretisch aus den ganzen Werten, die man rausbekommt einen Mittelwert berechnen. Dafür muss man aber die ganze Prozedur öfters ausführen lassen. Wie kann man so etwas machen? Meine Idee wäre jetzt alles oben bei private reinzuschreiben und unten bei "procedure TForm1.Button1Click(Sender: TObject);" dann alles öfter hinzuschreiben. Ist aber sehr unsauber

Und natürlich bräuchte man eine neue Variable, sagen wir mal "Mittelwert". Man muss ja dann immer das Ergebnis bei Tafeln irgendwie zwischenspeichern und am Ende dann rechnen

Mittelwert = (Ergebnis1 + Ergebnis2 + Ergebnis3 + ...) / Anzahl Durchläufe

Wie realisiert man so etwas am besten ohne diese Ergebnis1 bis x ?

Mit freundlichen Grüßen
me2u

P.S. Ihr seid echt das geilste Delphi Forum, das ich kenne ! Ohne euch hätte ich das wahrscheinlich nicht gepackt. Aber jetzt ist mir ganz klar, was da oben beim Einkaufen der Schokolade passiert
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#13

Re: Sammelbilder [lineares Feld]

  Alt 29. Apr 2007, 20:30
Zitat von me2u:
Mittelwert = (Ergebnis1 + Ergebnis2 + Ergebnis3 + ...) / Anzahl Durchläufe

Wie realisiert man so etwas am besten ohne diese Ergebnis1 bis x ?
Pack doch deine ganze Berechnung noch mit ner einfachen for-Schleife rein. Und anstelle der Ausgabe berechnest du
Ergebnis := Ergebnis + Tafeln ; Zum Schluss nur noch dein Ergebnis durch die Anzahl der Durchläufe teilen:

Delphi-Quellcode:
var
   Ergebnis, i : integer ;
begin
    Ergebnis := 0 ;
    for i := 1 to AnzahlDurchlaeufe do begin
        // dein Code
        Ergebnis := Ergebnis + Tafeln ;
    end ;
    TafelnMittelwert := Ergebnis / AnzahlDurchlaeufe ;
    // Ausgabe
end ;
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#14

Re: Sammelbilder [lineares Feld]

  Alt 29. Apr 2007, 20:33
Du kannst ja für die From eine eigene Prozedur schreiben wie "Bilder sammeln" o.ä. und das dann mehrmals ausführen.
Delphi-Quellcode:
procedure BilderSammeln;
begin
  // Deine ButtonClick-Prozedur
end;

procedure Button1Click(Sender : Tobject);
begin
  BilderSammeln;
end;
Nun könntest du das über mehrere Wege berechnen:
1. Du erstellst ein globales, privates array of Cardinal (o.ä.) und lässt dass dann Füllen und später berechnen
2. Du nimmst nur eine globale Variable, und hast eine bestimmte Anzahl von Durchläufen (z.B.) 10 und schreibst alle Werte rein, und berechnest dass dann...
3. Du nimmst die 1. oder 2. Variante, aber dann lokal. Dann muss deine BilderSammeln ein Rückgabewert bekommen

Ich hätte es so gemacht:
Delphi-Quellcode:
procedure Button1Click(Sender : TObject);
const
  Durchlaeufe= 10;
var
  Gesamt : Cardinal;
  i : Cardinal;
begin
  for i := 0 to Durchlaeufe- 1 do
  begin
    Gesamt := Gesamt + BilderSammeln; // Alternativ: inc(Gesamt, BilderSammeln);
  end;
  Showmessage('Man benötigt bei ' + IntToStr(Durchlaeufe) + ' Durchläufe(n) ' + IntToStr(Round(Gesamt / Durchlaeufe)) + ' Tafeln Schokolade durchschnittlich');
end;
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
me2u
(Gast)

n/a Beiträge
 
#15

Re: Sammelbilder [lineares Feld]

  Alt 2. Mai 2007, 22:41
Sorry, dass ich nochmal nerve, aber ich habe Probleme bei dem Mittelwert berechnen. Irgendwie bin ich ganz durcheinander ^^ Bin mir auch nicht sicher, was ich da mit den ganzen neuen Variablen (x und durchlaeufe) überhaupt gemacht hab bzw. machen wollte.

Hier mein Code:
Delphi-Quellcode:
procedure TForm1.btnBerechnenClick(Sender: TObject);

var Bilder : array of integer;
    bilder_gesamt: integer; //Anzahl aller Bilder
    Tafeln : integer; //Anzahl der Tafeln Schokolade, die gekauft werden
    fehlend : integer; //Anzahl der Bilder, die man noch nicht gesammelt hat
    durchlaeufe : integer; //Zählvariable
    Mittelwert : real;
    Ergebnis : integer; //Summe aller Tafeln
    AnzahlDurchlaeufe : integer;//gewünschte Anzahl der Durchläufe
    i, x : integer; //Zählvariablen

begin
  //Zufallsgenerator initialisieren
  randomize;

  //Startwerte setzen
  bilder_gesamt := StrToInt(edtGesamtbilder.Text);
  //dynamischer Array
  SetLength(Bilder, bilder_gesamt);
  AnzahlDurchlaeufe := StrToInt(edtDurchlaeufe.Text);
  Ergebnis := 0;

  //Verarbeitung: "Einkauf" Schleife
  for durchlaeufe := 1 to AnzahlDurchlaeufe do
  begin
    while fehlend > 0 do
    begin
      Tafeln := 0;
      fehlend := bilder_gesamt;
      //Zuerst müssen alle Bilder den Wert 0 haben
      for i := 0 to (bilder_gesamt - 1) do
      begin
        Bilder[i]:=0;
      end;
      Tafeln := Tafeln + 1;
      x := Random(bilder_gesamt);
      //Bild wird als gekauft "markiert"
      Bilder[x] := Bilder[x] + 1;
      //Wenn man das Bild hat, wird fehlend verringert
      IF Bilder[x] = 1 THEN
      begin
        fehlend := fehlend - 1;
      end;
    end;
  //Man addiert alle Tafeln
  Ergebnis := Ergebnis + Tafeln;
  end;

  Mittelwert := Ergebnis/AnzahlDurchlaeufe;

  //Ausgabe
  lblAusgabe.Caption := 'Man muss rund ' + FloatToStr(Mittelwert) + ' Tafeln kaufen bis man alle Bilder gesammelt hat.';
end;

end.
Irgendwelche Vorschläge, wieso das eine Endlosschleife gibt, wären sehr hilfreich. Achja, und mache ich da nicht auch Sachen, die sinnlos sind? Also, was könnte man optimieren ?

mfg
me2u
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#16

Re: Sammelbilder [lineares Feld]

  Alt 3. Mai 2007, 06:40
In einem solchen Fall startet man das Programm und läßt es erstmal loslaufen. Dann wechselt man in die IDE und setzt in der Prozedur, die gerade läuft, einen Breakpoint. Wenn der Debugger dann dort anhält, kann man per F7/F8 durch den Code steppen und sich überlegen, ob das was das Programm tut, sinnvoll ist.

Dein Problem ist folgendes: Jedesmal wenn du in den Laden gehst, um eine neue Schokolade zu kaufen, wirfst du alle schon gesammelten Bilder in den Papierkorb. Auf diese Weise machst du den Schokoladenhersteller reich und du wirst niemals alle Bilder gesammelt haben.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#17

Re: Sammelbilder [lineares Feld]

  Alt 3. Mai 2007, 07:43
Zitat von me2u:
Delphi-Quellcode:
    while fehlend > 0 do
    begin
      Tafeln := 0;
      fehlend := bilder_gesamt;
      //Zuerst müssen alle Bilder den Wert 0 haben
      for i := 0 to (bilder_gesamt - 1) do
      begin
        Bilder[i]:=0;
      end;
      Tafeln := Tafeln + 1;
      x := Random(bilder_gesamt);
      //Bild wird als gekauft "markiert"
      Bilder[x] := Bilder[x] + 1;
      //Wenn man das Bild hat, wird fehlend verringert
      IF Bilder[x] = 1 THEN
      begin
        fehlend := fehlend - 1;
      end;
    end;
Diese while Schleife muss ja ins Endlose laufen... Kuck mal genau hin. EIn Schleifendurchlauf kann Fehlend höchstens um 1 verringern. Und beim nächsten Schleifendurchlauf setzt du Fehlend wieder auf Bilder_gesamt, dessen Wert sicherlich > 1 ist.
  Mit Zitat antworten Zitat
me2u
(Gast)

n/a Beiträge
 
#18

Re: Sammelbilder [lineares Feld]

  Alt 3. Mai 2007, 23:32
Guten Abend,

ich habe mittlerweile ein funktionstüchtiges Programm für das Problem fertiggestellt. Es ist eigentlich garnicht so schwer Und Jelly, du hattest Recht. Ich hatte das mit dem fehlend und noch irgendwas anderes in der falschen Schleife drin und es wurde immer wieder neu gesetzt und konnte somit nie eine andere Bedingung erfüllen.

Hier nochmal der fertige Code:

Delphi-Quellcode:
procedure TForm1.btnBerechnenClick(Sender: TObject);

var Bilder : array of integer;
    bilder_gesamt: integer; //Anzahl aller Bilder
    Tafeln : integer; //Anzahl der Tafeln Schokolade, die gekauft werden
    fehlend : integer; //Anzahl der Bilder, die man noch nicht gesammelt hat
    durchlaeufe : integer; //Zählvariable
    Mittelwert : real;
    Ergebnis : integer; //Summe aller Tafeln
    AnzahlDurchlaeufe : integer;//gewünschte Anzahl der Durchläufe
    i, x : integer; //Zählvariablen

begin
  //Zufallsgenerator initialisieren
  randomize;

  //Eingabe: Variablen holen
  bilder_gesamt := StrToInt(edtGesamtbilder.Text);
  AnzahlDurchlaeufe := StrToInt(edtDurchlaeufe.Text);
  Ergebnis := 0;

  //dynamischer Array
  SetLength(Bilder, bilder_gesamt);


  //Verarbeitung: "Einkauf" Schleife
  for durchlaeufe := 1 to AnzahlDurchlaeufe do
  begin
    fehlend := bilder_gesamt;
    Tafeln := 0;

    //Zuerst müssen alle Bilder den Wert 0 haben
    for i := 0 to (bilder_gesamt - 1) do
    begin
      Bilder[i]:=0;
    end;

    while fehlend > 0 do
    begin
      Tafeln := Tafeln + 1;
      x := Random(bilder_gesamt);

      //Bild wird als gekauft "markiert"
      Bilder[x] := Bilder[x] + 1;

      //Wenn man das Bild hat, wird fehlend verringert
      IF Bilder[x] = 1 THEN
        fehlend := fehlend - 1;
    end;

  //Man addiert alle Tafeln
  Ergebnis := Ergebnis + Tafeln;
  end;

  Mittelwert := Ergebnis/AnzahlDurchlaeufe;

  //Ausgabe
  lblAusgabe.Caption := 'Man muss rund ' + FloatToStr(Mittelwert) + ' Tafeln kaufen bis man alle Bilder gesammelt hat.';
end;

end.
Ahh, ein tolles Gefühl, wenn's endlich läuft ! Vielen Dank nochmal an alle, die hier gepostet haben. Ohne euch hätte ich das bestimmt nicht hingekriegt. Ihr seid einfach die besten!

Mit freundlichen Grüßen
me2u
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz