Wer kann mich unterstützen - das Programm läuft nicht richtig

Für Dinge zum Forum, Kritik, Verbesserungsvorschläge, Umfragen und ähnliches.
Antworten
ChefMinges
Beiträge: 5
Registriert: Fr 5. Nov 2021, 23:37

Wer kann mich unterstützen - das Programm läuft nicht richtig

Beitrag von ChefMinges »

Hallo,

das Programm generiert random einen (Weiten-)Wert zwischen 50 und 150, der erraten werden muss. Der zu erratende Wert wird über die Eingabe zweier Werte (Geschwindigkeit & Wurfwinkel) für die Weitenberechnung ermittelt. Hat jemand eine Idee, warum die Meldungen in Abhängigkeit der Nähe zum Suchwert nicht funktionieren?

Code: Alles auswählen

program Wurfweiten;
var
  Anzahl: Integer = 0;
  Abwurfwinkel, Geschwindigkeit, Bogenmass, Wurfweite, Wurfweite_gerundet: real;
  Spielwunsch: string;
  Zufallszahl: Integer;
  Label Sprungmarke;
begin
  Sprungmarke:
  Zufallszahl := Random(150) + 50;
  WriteLn (Zufallszahl);
  WriteLn ('***Wurfweiten - Ratespiel***' + chr(10));
  repeat
    Write ('Mit welcher Geschwindigkeit v 0 werfen Sie [m/s]: ');
    ReadLn (Geschwindigkeit);
    Write ('Wie ist Ihr Abwurfwinkel [°]: ');
    ReadLn (Abwurfwinkel);
    Bogenmass := (3.14*Abwurfwinkel)/180;
    Wurfweite := ((Geschwindigkeit*Geschwindigkeit)*sin(2*Bogenmass))/9.81;
    Wurfweite_gerundet := trunc(Wurfweite);
    Inc (Anzahl);
    if (Wurfweite_gerundet >= (ZufallsZahl + 20)) then
       WriteLn ('Viel zu weit  - Die Wurfweite beträgt:', trunc(Wurfweite));
    if (Wurfweite_gerundet < (ZufallsZahl + 20)) and (Wurfweite_gerundet > (ZufallsZahl + 10)) then
       WriteLn ('zu weit  - Die Wurfweite beträgt:', trunc(Wurfweite));
    if (Wurfweite_gerundet < (ZufallsZahl + 10)) and (Wurfweite_gerundet > (ZufallsZahl + 5)) then
       WriteLn ('nur noch etwas zu weit  - Die Wurfweite beträgt:', trunc(Wurfweite));
    if (Wurfweite_gerundet <= (ZufallsZahl - 20)) then
       WriteLn ('Viel zu kurz  - Die Wurfweite beträgt:', trunc(Wurfweite));
    if (Wurfweite_gerundet < (ZufallsZahl - 20)) and (Wurfweite_gerundet > (ZufallsZahl - 10)) then
       WriteLn ('zu kurz  - Die Wurfweite beträgt:', trunc(Wurfweite));
    if (Wurfweite_gerundet < (ZufallsZahl - 10)) and (Wurfweite_gerundet > (ZufallsZahl - 5)) then
       WriteLn ('nur noch etwas zu kurz  - Die Wurfweite beträgt:', trunc(Wurfweite));
       until (Zufallszahl <= (Wurfweite_gerundet + 5)) and (Zufallszahl >= (Wurfweite_gerundet - 5));
  WriteLn ('Sie haben ',trunc(Wurfweite), ' m weit geworfen');
  WriteLn ('Treffer !');
  WriteLn ('Gratulation, Sie haben das Ziel nach ', Anzahl, ' Versuchen getroffen. Es war ', trunc(Zufallszahl), ' m entfernt.');
  WriteLn ('Noch ein Spiel? JA / NEIN');
  ReadLn  (Spielwunsch);
   if Spielwunsch = 'JA' then
   Goto Sprungmarke
   else if Spielwunsch = 'NEIN' then
   WriteLn ('Auf Wiedersehen')
end.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Wer kann mich unterstützen - das Programm läuft nicht richtig

Beitrag von wp_xyz »

Was funktioniert denn nicht? Ich habe es gerade probiert, und da schien mir alles in Ordnung zu sein.

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 331
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Wer kann mich unterstützen - das Programm läuft nicht richtig

Beitrag von Niesi »

Also, ich schaue es mir gerade an: gib mal bitte fuer Geschwindigkeit 37 und fuer Winkel 30 ein ... witzig witzig ... :shock:
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 331
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Wer kann mich unterstützen - das Programm läuft nicht richtig

Beitrag von Niesi »

Bei den letzten Bedingungen hattest Du Dich vertan.
Vermutlich, weil Du oben von gross auf klein geprueft hast und unten von klein auf gross ...

P.S.: Ich hab' den Code ein wenig geaendert, bei "Goto" fange ich immer an zu zittern. Bitte entschuldige das ...

Code: Alles auswählen

program Wurfweiten;
uses crt;
var
  Anzahl: Integer = 0;
  Abwurfwinkel, Geschwindigkeit, Bogenmass, Wurfweite, Wurfweite_gerundet: real;
  Spielwunsch: string;
  Zufallszahl: Integer;
  //Label Sprungmarke;
begin
  Spielwunsch := 'y';
  while Spielwunsch = 'y' do
  begin
    Zufallszahl := Random(150) + 50;

    WriteLn('Zufallszahl = ', Zufallszahl);

    Write('***Wurfweiten - Ratespiel***' + chr(10));
    repeat
      WriteLn;
      Write('Mit welcher Geschwindigkeit v 0 werfen Sie [m/s]: ');
      ReadLn(Geschwindigkeit);
      WriteLn;
      Write('Wie ist Ihr Abwurfwinkel [Grad]: ');
      ReadLn (Abwurfwinkel);
      WriteLn;
      Bogenmass := (pi*Abwurfwinkel)/180;
      Wurfweite := ((Geschwindigkeit*Geschwindigkeit)*sin(2*Bogenmass))/9.81;
      Wurfweite_gerundet := round(Wurfweite);
      Inc(Anzahl);
      if (Wurfweite_gerundet >= (ZufallsZahl + 20)) then WriteLn ('Viel zu weit  - Die Wurfweite betraegt:', trunc(Wurfweite));
      if (Wurfweite_gerundet < (ZufallsZahl + 20)) and (Wurfweite_gerundet > (ZufallsZahl + 10)) then WriteLn ('zu weit  - Die Wurfweite betraegt:', trunc(Wurfweite));
      if (Wurfweite_gerundet < (ZufallsZahl + 10)) and (Wurfweite_gerundet > (ZufallsZahl + 5)) then WriteLn ('nur noch etwas zu weit  - Die Wurfweite betraegt:', trunc(Wurfweite));
      if (Wurfweite_gerundet <= (ZufallsZahl - 20)) then WriteLn ('Viel zu kurz  - Die Wurfweite betraegt:', trunc(Wurfweite));
      if (Wurfweite_gerundet > (ZufallsZahl - 20)) and (Wurfweite_gerundet < (ZufallsZahl - 10)) then WriteLn ('zu kurz  - Die Wurfweite betraegt:', trunc(Wurfweite));
      if (Wurfweite_gerundet > (ZufallsZahl - 10)) and (Wurfweite_gerundet < (ZufallsZahl - 5)) then WriteLn ('nur noch etwas zu kurz  - Die Wurfweite betraegt:', trunc(Wurfweite));
    until (Zufallszahl <= (Wurfweite_gerundet + 5)) and (Zufallszahl >= (Wurfweite_gerundet - 5));
    WriteLn;
    WriteLn('Sie haben ',trunc(Wurfweite), ' m weit geworfen');
    WriteLn;
    WriteLn('Treffer !');
    WriteLn;
    WriteLn('Gratulation, Sie haben das Ziel nach ', Anzahl, ' Versuchen getroffen. Es war ', trunc(Zufallszahl), ' m entfernt.');
    WriteLn;
    Write('Noch ein Spiel? y / n');
    Spielwunsch := ReadKey;
  end;
end.
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

ChefMinges
Beiträge: 5
Registriert: Fr 5. Nov 2021, 23:37

Re: Wer kann mich unterstützen - das Programm läuft nicht richtig

Beitrag von ChefMinges »

Guten Morgen :),

vielen Dank für die Korrektur. Jetzt funktioniert es. Eine Frage habe ich noch. Die Wurfenweiten

Code: Alles auswählen

Sie haben ',trunc(Wurfweite), ' m weit geworfen'); 
sollen immer mit 2 Kommastellen angegeben werden. Hat da jemand noch eine Idee?

Gruß Chris

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 331
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Wer kann mich unterstützen - das Programm läuft nicht richtig

Beitrag von Niesi »

Dann darfst Du kein trunc() benutzen - es schneidet die Nachkommastellen ab. Habe mich da schon gewundert ...

Probier mal round() oder WriteLn('Sie haben ', Wurfweite:6:2, ' m weit geworfen');
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Wer kann mich unterstützen - das Programm läuft nicht richtig

Beitrag von Winni »

Hi!

1. Real ist aus dem letzten Jahrtausend und nur für die Kompatibilität zu Turbo vorhanden. Single oder Double benutzen

2. Auf 2 Nachkomamastellen runden:

Code: Alles auswählen

Wurfweite := round(Wurfweite*100) / 100;
Winni

ChefMinges
Beiträge: 5
Registriert: Fr 5. Nov 2021, 23:37

Re: Wer kann mich unterstützen - das Programm läuft nicht richtig

Beitrag von ChefMinges »

Vielen Dank euch beiden .... ich wünsche euch einen schönen Sonntag

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Wer kann mich unterstützen - das Programm läuft nicht richtig

Beitrag von wp_xyz »

Brechnete Werte selbst würde ich nur aus gutem Grund runden, eine schönere Darstellung ist keiner, denn wenn man damit weiterrechnet, hat man einen Fehler eingebaut, der sich weiterschleppt.

Nur für die Anzeige als String zu runden ist ok. Bei WriteLn geht das am einfachsten mit dem Zusatz ":Gesamtbreite:Dezimalen", wobei "Gesamtbreite" automatisch angepasst wird, wenn der angeforderte Platz nicht ausreicht:

Code: Alles auswählen

WriteLn ('Viel zu weit  - Die Wurfweite betraegt: ', Wurfweite:0:2);

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Wer kann mich unterstützen - das Programm läuft nicht richtig

Beitrag von Winni »

Hi!

Wenn man gerundete Werte will, und dann mit den ungerundeten Werten weiterrechnet, so ist das definitiv ein algoritmischer Fehler.

Winni

ChefMinges
Beiträge: 5
Registriert: Fr 5. Nov 2021, 23:37

Re: Wer kann mich unterstützen - das Programm läuft nicht richtig

Beitrag von ChefMinges »

Moin Jungs,

vielen Dank für den Hinweis - so richtig haut die Berechnung auch noch nicht hin. Habe gerade auch gesehen, dass die Funktion zur Berechnung des Zufallswertes nicht die Range von 50 - 150 abdecket sondern 50 - 200 ... jemand eine Idee?

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Wer kann mich unterstützen - das Programm läuft nicht richtig

Beitrag von Winni »

Hi!

Code: Alles auswählen

Zufallszahl := Random(150);
ergibt eine Zahl zwischen Null und 149.

Wenn Du den Bereich von 50 bis 150 abdecken möchtest, dann brauchst Du also

Code: Alles auswählen

Zufallszahl := Random(101) + 50;
Winni

ChefMinges
Beiträge: 5
Registriert: Fr 5. Nov 2021, 23:37

Re: Wer kann mich unterstützen - das Programm läuft nicht richtig

Beitrag von ChefMinges »

...stimmt - einfach mal den Kopf anschalten - arrrg ... vielen Dank ... jetzt läuft es wirklich perfekt...

Antworten