Programm zum Auszählen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
maexxel1607
Beiträge: 5
Registriert: Fr 24. Feb 2012, 09:43

Programm zum Auszählen

Beitrag von maexxel1607 »

Guten Morgen. Ich habe ein Programm geschrieben, das Kugeln auszählen soll. Nun zeigt es beim Ausführen immer Null. Ich programmiere noch nicht lange und das ist ehrlich gesagt mein erstes Programm. Könntet ihr euch bitte mal ansehen, ob es ersichtliche Fehler gibt, die die angezeigten Nullen erklären?
Vielen Dank im Vorraus!

Code: Alles auswählen

var d{anzahl durchführungen}, i,KZF1,KZF2,KZF3 :integer;
          KZG {kugelzahl gesamt}, K{kugel} : integer;
          w1,w2,w3:integer;
 
begin 
      KZF1:=strtoint(kzf1_e.text);
      KZF2:=strtoint(kzf2_e.text);
      KZF3:=strtoint(kzf3_e.text);
 
      KZG:=  KZF1+KZF2+KZF3; 
       begin
               w1:=0;
               w2:=0;
               w3:=0; end;
 
 
               For i:=d to 0
      do begin
 
            K:=random(KZG);
        if (K<=KZF1)                 then begin  w1 :=w1 +1; end;
        if (KZF1<K) and (K<= (KZF1+KZF2))   then begin  w2 :=w2+1; end;
        if (KZF2<K) and (K<= (KZF1+KZF2+KZF3))   then begin  w3 :=w3 +1; end; 
        end;
 
 
         Gkzf1_e.text:=inttostr(w1);
         Gkzf2_e.text:=inttostr(w2);
         Gkzf3_e.text:=inttostr(w3);
end;

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: Programm zum Auszählen

Beitrag von knight »

Funktionierte das Herunterzählen nicht mit
for i = d downto 0 ?

knight

maexxel1607
Beiträge: 5
Registriert: Fr 24. Feb 2012, 09:43

Re: Programm zum Auszählen

Beitrag von maexxel1607 »

Danke! jetzt bekomme ich immerhin Zahlen angezeigt. Jedoch unrealistisch große.
Vielen dank

max

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Programm zum Auszählen

Beitrag von Linkat »

Hallo maexxel1607,

erst einmal herzlich willkommen im Lazarusforum und viel Spaß beim Programmieren mit Lazarus/Object Pascal.

Zu deinem Programm:
d muss noch einen Wert zugewiesen werden. Wie auch schon knight gepostet hat, kann die for-Schleife wenn d>0 mit 'downto' heruntergezählt werden, oder für d<0 mit 'to' hochgezählt werden.

Dein Schreibstil ist noch sehr gewöhnungsbedürftig. Bitte sehe nach, wie ander Pascal-Programmierer ihre Zeilen "ordentlich/übersichtlich" schreiben.
Das begin und end macht hier

Code: Alles auswählen

begin
               w1:=0;
               w2:=0;
               w3:=0; end;
wohl keinen Sinn.

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Programm zum Auszählen

Beitrag von theo »

Ich sehe nicht, wo du der Variable d einen Wert zuweist.

Ausserdem solltest du, wie Linkat schon sagte, dringend an einem leserlichen Stil arbeiten.

maexxel1607
Beiträge: 5
Registriert: Fr 24. Feb 2012, 09:43

Re: Programm zum Auszählen

Beitrag von maexxel1607 »

Ja, das stimmt wohl. Nochmal danke. Ihr habt mir geholfen!

Jetzt habe ich nur das Problem, dass die Wahrscheinlichkeit der ersten Farbe immer doppelt so groß ist wie die anderen und die letzte ist immer 0. Eigentlich müssten sie ja aber bei hoher Zahl der Durchführungen ungefär gleich sein.
Habt ihr eine Idee?

Der Quelltext sieht jetzt so aus:

Code: Alles auswählen

var      d{anzahl durchführungen},
          i,
          KZF1,KZF2,KZF3,KZF4,KZF5,KZF6,KZF7,
          KZG {kugelzahl gesamt},
          K{kugel},
          H1,H2,H3,H4,H5,H6,H7:integer;
 
          WKF :real;
 
begin
 
 
   {wertzuweisung Kugelzahl wird abhängig von edit komponente gesetzt}
      KZF1:=strtoint(kzf1_e.text);
      KZF2:=strtoint(kzf2_e.text);
      KZF3:=strtoint(kzf3_e.text);
      KZF4:=strtoint(kzf4_e.text);
      KZF5:=strtoint(kzf5_e.text);
      KZF6:=strtoint(kzf6_e.text);
      KZF7:=strtoint(kzf7_e.text);
 
 
 
                                    KZG:=   KZF1
                                    +KZF2
                                    +KZF3
                                    +KZF4
                                    +KZF5
                                    +KZF6
                                    +KZF7
 
 
               H1:=0;
               H2:=0;
               H3:=0;
               H4:=0;
               H5:=0;
               H6:=0;
               H7:=0;
 
 
 
 
         d:=strtoint(d_e.text)-1;
 
               For i:=d downto 0
 
      do begin
            K:=random(KZG);
 
 
        if (0<K) and (K<=KZF1))
        then begin  H1 :=H1 +1; end;
 
        if (KZF1<K) and (K<= (KZF1+KZF2))
        then begin  H2 :=H2+1; end;
 
        if ((KZF1+KZF2)<K) and (K<= (KZF1+KZF2+KZF3))
        then begin  H3 :=H3 +1; end;
 
        if ((KZF1+KZF2+KZF3)<K) and (K<= (KZF1+KZF2+KZF3+KZF4))
        then begin  H4 := H4 +1 end;
 
        if ((KZF1+KZF2+KZF3+KZF4)<K) and (K<=(KZF1+KZF2+KZF3+KZF4+KZF5))
        then begin  H5 :=H5 +1 end;
 
        if ((KZF1+KZF2+KZF3+KZF4+KZF5)<K) and (K<= (KZF1+KZF2+KZF3+KZF4+KZF5+KZF6))
        then begin  H6 :=H6 +1 end;
 
        if ((KZF1+KZF2+KZF3+KZF4+KZF5+KZF6)<K) and (K<= (KZF1+KZF2+KZF3+KZF4+KZF5+KZF6+KZF7))
        then begin  H7 :=H7 +1 end;
 
end;
 
     Gkzf1_e.text:=inttostr(H1);
     Gkzf2_e.text:=inttostr(H2);
     Gkzf3_e.text:=inttostr(H3);
     Gkzf4_e.text:=inttostr(H4);
     Gkzf5_e.text:=inttostr(H5);
     Gkzf6_e.text:=inttostr(H6);
     Gkzf7_e.text:=inttostr(H7);
 
 
 
end;
Ich hoffe, es ist jetzt übersichtlicher. ;)

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Programm zum Auszählen

Beitrag von Linkat »

Hast du den Zufallsgenerator mit dem Befehl "randomize" (am Besten in FormCreate) initialisiert?

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Programm zum Auszählen

Beitrag von theo »

maexxel1607 hat geschrieben: Ich hoffe, es ist jetzt übersichtlicher. ;)
Nicht wirklich. Vor allem Kompiliert das bestimmt nicht mehr. Wo hast denn du jetzt das her?
Da fehlen Klammern und Strichpunkte und was-weiss-ich.
Du solltest das erstmal sauber machen.

maexxel1607
Beiträge: 5
Registriert: Fr 24. Feb 2012, 09:43

Re: Programm zum Auszählen

Beitrag von maexxel1607 »

Linkat hat geschrieben:Hast du den Zufallsgenerator mit dem Befehl "randomize" (am Besten in FormCreate) initialisiert?
Nein, ich hab nichts initialisiert. Ich benutze einfach nur den Befehl "random" für die zufällige Auswahl aus der Menge.


theo hat geschrieben:Nicht wirklich. Vor allem Kompiliert das bestimmt nicht mehr. Wo hast denn du jetzt das her?
Da fehlen Klammern und Strichpunkte und was-weiss-ich.
Ich weiß. Ich hab den Quelltext gekürzt, da ich das mit zich Variablen gemacht habe, und immer das gleiche. Im Originaltext fehlt nichts und es kompiliert auch richtig. Wie kann man es noch übersichtlicher machen?

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Programm zum Auszählen

Beitrag von Linkat »

Hallo maexxel1607

Damit der Zufallsgenerator auch wirklich Zufallszahlen generiert, musst du ihn einmal im Programm durch den Aufrauf 'randomize' initialisieren.
Am Besten du schreibst randomize in die FormCreate-Prozedur. Hierfür machst du auf der Form einen Doppelklick und Lazarus erzeugt den Prozedur-Rumpf. Nun schreibst du einfach noch 'randomize;' in die leere Zeile und fertig.

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;
end;
Und für einen leserlichen Programmierstil musst du dich einfach an einfachen Programmen orientieren.

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Programm zum Auszählen

Beitrag von MAC »

Wieso nicht leserlich und EInfach ??
Kleiner unterschied:
EingabeParameter werden hier wie folgt erwartet, soll bbei zwei kugeln die gleiche chance bestehen ist nicht KZF[0] = 1 und KZF[1] = 1 sondern
KZF[0] = 1 und KZF[1] = 2 !!!
bei einer 33 % chane für das erste wie folgt KZF = {1,3} ist richtig KZF = {1,2} ist bis jetzt bei dir richtig.

dadurch spart man sich ne abfrage in der schleife, außerdem werden die Parameter von ner Memo eingescannt weil das schneller geschrieben ist... Array's werden verwendet. Ist nicht schlimm wenn du das nicht sofort verstehst, du darfst dich aber freuen sobalt du es verstehst :D

Achja, bei 70 Millionen versuchen hab ich folgendes Ergebnis:

Code: Alles auswählen

KZF:
1
2
3
4
5
6
7

Code: Alles auswählen

H:
10004579
9999343
9999249
9998991
10000694
9994514
10002630


Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  i,i2:integer;
  KZF,h:array [0..6] of integer;
  K:integer;
  WKF :real;
 
begin
 
if Memo1.Lines.Count < length(KZF) then exit;
for i := 0 to high(KZF) do
    begin
    TryStrtoInt(Memo1.Lines.Strings[i],KZF[i]);
    H[i] := 0;
    end;
TryStrtoInt(d_e.text,i);
 
 
for i := i-1 downto 0 do
    begin
    K := random(KZF[high(KZF)])+1;
    for i2 := 0 to high(KZF) do
        begin
        if K <= KZF[i2] then
           begin
           inc(H[i2]);
           break; // innere schleife abbrechen
           end;
        end;
 
    end;
 
Memo2.Clear;
for i := 0 to high(KZF) do Memo2.Lines.Add(InttoStr(H[i]));
 
end;

Code: Alles auswählen

Signatur := nil;

maexxel1607
Beiträge: 5
Registriert: Fr 24. Feb 2012, 09:43

Re: Programm zum Auszählen

Beitrag von maexxel1607 »

Ich muss zugeben, ich bin jetzt etwas überfordert :D
Aber danke dür die schnelle und gute Hilfe!

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Programm zum Auszählen

Beitrag von theo »

maexxel1607 hat geschrieben: Wie kann man es noch übersichtlicher machen?
Z.B. indem man Begin und End immer auf separaten Zeilen und mit gleichem Einzug macht, wie im Beispiel von MAC.
Dann kannst du Blöcke viel leichter erkennen und den Sinn des Ganzen entziffern.

Antworten