Prozent Zufallszahl

Getting started ... Alles für einen gelungenen Start.
6 Beiträge • Seite 1 von 1
6 Beiträge Seite 1 von 1

Prozent Zufallszahl

Beitrag von drama (ForumUser / 25 / 11 / 0 ) »
Hallo Leute,

ich bräuchte mal eure Hilfe. Ich bin immer noch dabei einen Waldbrand zu schreiben.

Die Eingabe soll nun in Prozent stattfinden. Also wenn ich eingebe dass 10% von meinem Wald mit Feuer bedeckt sind auch in einem Feld von 10 x 10 Bäumen ungefähr 10 Bäume Feuer haben.

Das ist das Unterprogramm für die Zufallszahl das komplette Prgramm ist weiter unten.

Code: Alles auswählen.

  *&---------------------------------------------------------------------*
*&      Form  get_zufallszahl
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->IV_ZAHL_LIMIT  text
*----------------------------------------------------------------------*

FORM get_zufallszahl USING iv_zahl_limit TYPE i.
  CALL FUNCTION 'QF05_RANDOM_INTEGER'
    EXPORTING
      ran_int_max   = iv_zahl_limit
      ran_int_min   = 1
    IMPORTING
      ran_int       = lv_zufalls_zahl
    EXCEPTIONS
      invalid_input = 2
      OTHERS        = 1.
ENDFORM.                    "get_zufallszahl
Hier ist das komplette Programm:

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report  ZTS_WALDBRAND
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zts_waldbrand.

"! TODO Aus- und Eingabe in Prozent




SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME TITLE text-t01.
PARAMETERS p_feuer TYPE i DEFAULT 10.
SELECTION-SCREEN END OF BLOCK a.

SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE text-t02.
PARAMETERS p_wachs TYPE i DEFAULT 1.
SELECTION-SCREEN END OF BLOCK b.

SELECTION-SCREEN BEGIN OF BLOCK d WITH FRAME TITLE text-t04.
PARAMETERS p_aktion  TYPE i DEFAULT 5.
SELECTION-SCREEN END OF BLOCK d.

SELECTION-SCREEN BEGIN OF BLOCK e WITH FRAME TITLE text-t05.
PARAMETERS p_laenge TYPE i DEFAULT 10.
SELECTION-SCREEN END OF BLOCK e.

SELECTION-SCREEN BEGIN OF BLOCK f WITH FRAME TITLE text-t06.
PARAMETERS p_hoehe  TYPE i DEFAULT 10.
SELECTION-SCREEN END OF BLOCK f.

* DATENTYP  |    BEDEUTUNG     |
*-----------|------------------|
*     i     |   Ganze Zahl     |
*     f     |   Gleitpunktzahl |
*     c     |   Textfeld       |⁣⁣
*------------------------------|

CONSTANTS cv_frei(1)            TYPE c VALUE '-'.
CONSTANTS cv_baum(1)            TYPE c VALUE 'T'.
CONSTANTS cv_brennender_baum(1) TYPE c VALUE 'F'.
CONSTANTS cv_zahl_zwei          TYPE i VALUE  2. "aufbau_wald



TYPES: BEGIN OF ty_merken,
  zeile   TYPE i,
  spalte  TYPE i,
  wert(1) TYPE c,
END OF ty_merken.

*&---------------------------------------------------------------------*
*&      Interne Tabellen                                               *
*&---------------------------------------------------------------------*
DATA lt_wald_new        TYPE STANDARD TABLE OF ty_merken. "Namenskonvention
DATA lt_wald_old        TYPE STANDARD TABLE OF ty_merken. "Namenskonvention

*&---------------------------------------------------------------------*
*&      Strukturen                                                     *
*&---------------------------------------------------------------------*
DATA ls_wald_new        TYPE ty_merken. "Namenskonvention
DATA ls_wald_old        TYPE ty_merken. "Namenskonvention
DATA ls_wald_old_chg    TYPE ty_merken. "Namenskonvention

*&---------------------------------------------------------------------*
*&      Variablen                                                      *
*&---------------------------------------------------------------------*
DATA lv_zufalls_zahl    TYPE i.
DATA lv_zaehler_spalte  TYPE i.
DATA lv_zaehler_zeile   TYPE i.
DATA lv_zaehler_aktion  TYPE n.
DATA lv_spalte_links    TYPE i.
DATA lv_spalte_rechts   TYPE i.
DATA lv_zeile_oben      TYPE i.
DATA lv_zeile_unten     TYPE i.
DATA lv_zeile_old       TYPE i.

*&---------------------------------------------------------------------*
*&      HAUPTPROGRAMM                                                  *
*&---------------------------------------------------------------------*
PERFORM initialisierung_wald.
DO p_aktion TIMES.
  PERFORM zeitschritt_simulieren.
ENDDO.

*&---------------------------------------------------------------------*
*&      UNTERPROGRAMME                                                 *
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Form  initialize_wald
*&---------------------------------------------------------------------*
*&       Startvorgang des Waldes
*&---------------------------------------------------------------------*

FORM initialisierung_wald.
  lv_zaehler_aktion = 0.

* WRITE:/ lv_zaehler_aktion , '. Schritt: Einfügen des Waldes.'.
  CLEAR lv_zaehler_aktion.

*Ursprünglichen Wald aufbauen
  PERFORM aufbau_wald.


*Ausgabe
*  PERFORM display_wald.

  lt_wald_old = lt_wald_new.

  CLEAR lt_wald_new.

ENDFORM.                   "starten_von_wald

*&---------------------------------------------------------------------*
*&      Form  zeitschritt_simulieren
*&---------------------------------------------------------------------*
*       Iterationsschritt ausführen
*----------------------------------------------------------------------*

FORM zeitschritt_simulieren.

  lv_zaehler_aktion = lv_zaehler_aktion + 1.

  WRITE:/ lv_zaehler_aktion , '. Schritt: Stadium nach ' , lv_zaehler_aktion , ' Iteration.'.

  WRITE:/ .

* Hier werden die weitern schritte ausgegeben
* Werte der alten Matrix übernehmen bzw. verändern wenn nötig

  LOOP AT lt_wald_old INTO ls_wald_old.

    IF ls_wald_old-wert = cv_frei.
      PERFORM feldaenderung_bei_wert_leer.

    ELSEIF ls_wald_old-wert = cv_baum.
      PERFORM feldaenderung_bei_wert_baum.

    ELSEIF ls_wald_old-wert = cv_brennender_baum.
      PERFORM feldaenderung_bei_wert_feuer.

    ENDIF.

  ENDLOOP.

* Ausgabe
  PERFORM display_wald.

ENDFORM.                    "zeitschritt_simulieren

*&---------------------------------------------------------------------*
*&      Form  feldaenderung_bei_wert_leer
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM feldaenderung_bei_wert_leer.
* Entscheiden ob Baum wächst oder Feld leer bleibt (mit - oder " " aufgefüllt, je nachdem wie die vorgaben im Code sind)
  PERFORM get_zufallszahl USING p_wachs.

  IF lv_zufalls_zahl = 1.
    PERFORM ls_wald_new_fuellen USING cv_baum ls_wald_old-spalte ls_wald_old-zeile.
  ELSE.
    PERFORM ls_wald_new_fuellen USING cv_frei ls_wald_old-spalte ls_wald_old-zeile.
  ENDIF.

  INSERT ls_wald_new INTO TABLE lt_wald_new.
  CLEAR ls_wald_new.
ENDFORM.                    "feldaenderung_bei_wert_leer


*&---------------------------------------------------------------------*
*&      Form  feldaenderung_bei_wert_baum
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM feldaenderung_bei_wert_baum.
* Umliegende Felder prüfen, ob brennend oder nicht.
  PERFORM umliegende_felder_pruefen.

* Wenn kein brennender Baum umliegend, Feld unverändert.
  IF ls_wald_new-wert <> cv_brennender_baum.
    ls_wald_new = ls_wald_old.
  ENDIF.

  INSERT ls_wald_new INTO TABLE lt_wald_new.
  CLEAR ls_wald_new.
ENDFORM.                    "feldaenderung_bei_wert_baum

*&---------------------------------------------------------------------*
*&      Form  umliegende_felder_und_tree_auf_fire_prüfen
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Gibt das feuer an die umligenden Bäume weiter und testet ob
*&      ein Baum verfügbar ist = Ob ein Baum da steht, ob er brennt und
*&      ob er nicht brennt.
*&---------------------------------------------------------------------*

FORM umliegende_felder_pruefen.
* Links von dem Aktiven Feld prüfen
  lv_spalte_links = ls_wald_old-spalte - 1.
  READ TABLE lt_wald_old WITH KEY spalte = lv_spalte_links zeile = ls_wald_old-zeile INTO ls_wald_old_chg.

  IF ls_wald_old_chg-wert = cv_brennender_baum.
    PERFORM ls_wald_new_fuellen USING cv_brennender_baum ls_wald_old-spalte ls_wald_old-zeile.
  ENDIF.

* Rechts von dem Aktiven Feld prüfen
  IF ls_wald_new-wert <> cv_brennender_baum.
    lv_spalte_rechts = ls_wald_old-spalte + 1.
    READ TABLE lt_wald_old WITH KEY spalte = lv_spalte_rechts zeile = ls_wald_old-zeile INTO ls_wald_old_chg.

    IF ls_wald_old_chg-wert = cv_brennender_baum.
      PERFORM ls_wald_new_fuellen USING cv_brennender_baum ls_wald_old-spalte ls_wald_old-zeile.
    ENDIF.
  ENDIF.

* Über dem Aktiven Feld prüfen
  IF ls_wald_new-wert <> cv_brennender_baum.
    lv_zeile_oben = ls_wald_old-zeile + 1.
    READ TABLE lt_wald_old WITH KEY spalte = ls_wald_old-spalte zeile = lv_zeile_oben INTO ls_wald_old_chg.

    IF ls_wald_old_chg-wert = cv_brennender_baum.
      PERFORM ls_wald_new_fuellen USING cv_brennender_baum ls_wald_old-spalte ls_wald_old-zeile.
    ENDIF.
  ENDIF.

* Unter dem aktuellen Feld prüfen
  IF ls_wald_new-wert <> cv_brennender_baum.
    lv_zeile_unten = ls_wald_old-zeile - 1.
    READ TABLE lt_wald_old WITH KEY spalte = ls_wald_old-spalte zeile = lv_zeile_unten INTO ls_wald_old_chg.

    IF ls_wald_old_chg-wert = cv_brennender_baum.
      PERFORM ls_wald_new_fuellen USING cv_brennender_baum ls_wald_old-spalte ls_wald_old-zeile.
    ENDIF.
  ENDIF.
ENDFORM.                    "umliegende_felder_und_tree_auf_fire_prüfen

*&---------------------------------------------------------------------*
*&      Form  feldaenderung_bei_wert_feuer
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM feldaenderung_bei_wert_feuer.

  DATA lv_baum_bool TYPE abap_bool.

  lv_baum_bool = abap_true.

  lv_spalte_links = ls_wald_old-spalte + 1.
  READ TABLE lt_wald_old WITH KEY spalte = lv_spalte_links zeile = ls_wald_old-zeile INTO ls_wald_old_chg.

  IF ls_wald_old_chg-wert = cv_baum.
    lv_baum_bool = abap_false.
  ENDIF.

* Rechts vom Aktiven Feld prüfen
  lv_spalte_rechts = ls_wald_old-spalte + 1.
  READ TABLE lt_wald_old WITH KEY spalte = lv_spalte_rechts zeile = ls_wald_old-zeile INTO ls_wald_old_chg.

  IF ls_wald_old_chg-wert = cv_baum.
    lv_baum_bool = abap_false.
  ENDIF.

* Über dem Aktiven Feld prüfen
  lv_zeile_oben = ls_wald_old-zeile - 1.
  READ TABLE lt_wald_old WITH KEY spalte = ls_wald_old-spalte zeile = lv_zeile_oben INTO ls_wald_old_chg.

  IF ls_wald_old_chg-wert = cv_baum.
    lv_baum_bool = abap_false.
  ENDIF.

* Unter dem Aktiven Feld prüfen
  lv_zeile_unten = ls_wald_old-zeile + 1.
  READ TABLE lt_wald_old WITH KEY spalte = ls_wald_old-spalte zeile = lv_zeile_unten INTO ls_wald_old_chg.

  IF ls_wald_old_chg-wert = cv_baum.
    lv_baum_bool = abap_false.
  ENDIF.

  IF lv_baum_bool = abap_true.
    PERFORM ls_wald_new_fuellen USING cv_frei ls_wald_old-spalte ls_wald_old-zeile.

  ELSE.
    ls_wald_new = ls_wald_old.
  ENDIF.

  INSERT ls_wald_new INTO TABLE lt_wald_new.
  CLEAR ls_wald_new.
ENDFORM.                    "feldändern_bei_wert_feuer

*&---------------------------------------------------------------------*
*&      Form  aufbau_wald
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM aufbau_wald.

  DO p_hoehe TIMES.
    lv_zaehler_zeile = lv_zaehler_zeile + 1.
*   Abstand zum linken Rand
    WRITE '        '.

    DO p_laenge TIMES.
      lv_zaehler_spalte = lv_zaehler_spalte + 1.

      PERFORM get_zufallszahl USING cv_zahl_zwei.
      IF lv_zufalls_zahl = 1.
        p_feuer =  100 / p_feuer.
        PERFORM get_zufallszahl USING p_feuer.
        IF lv_zufalls_zahl = 1.
          PERFORM ls_wald_new_fuellen USING cv_brennender_baum lv_zaehler_spalte lv_zaehler_zeile.
        ELSE.
          PERFORM ls_wald_new_fuellen USING cv_baum lv_zaehler_spalte lv_zaehler_zeile.
        ENDIF.

      ELSEIF lv_zufalls_zahl = 2.
        PERFORM ls_wald_new_fuellen USING cv_frei lv_zaehler_spalte lv_zaehler_zeile.
      ELSEIF lv_zufalls_zahl = 0.
        p_feuer = p_feuer / 100.
      ENDIF.

      INSERT ls_wald_new INTO TABLE lt_wald_new.
    ENDDO.
    CLEAR lv_zaehler_spalte.
  ENDDO.
ENDFORM.                    "aufbau_wald
*&---------------------------------------------------------------------*
*&      Form  ls_wald_new_fuellen
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->VALUE      text
*      -->(1)        text
*----------------------------------------------------------------------*

FORM ls_wald_new_fuellen USING iv_wert TYPE c iv_spalte TYPE i iv_zeile TYPE i.
  ls_wald_new-wert = iv_wert.
  ls_wald_new-spalte = iv_spalte.
  ls_wald_new-zeile = iv_zeile.
ENDFORM.                    "ls_wald_new_fuellen

*&---------------------------------------------------------------------*
*&      Form  get_zufallszahl
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->IV_ZAHL_LIMIT  text
*----------------------------------------------------------------------*

FORM get_zufallszahl USING iv_zahl_limit TYPE i.
  CALL FUNCTION 'QF05_RANDOM_INTEGER'
    EXPORTING
      ran_int_max   = iv_zahl_limit
      ran_int_min   = 1
    IMPORTING
      ran_int       = lv_zufalls_zahl
    EXCEPTIONS
      invalid_input = 2
      OTHERS        = 1.
ENDFORM.                    "get_zufallszahl



*&---------------------------------------------------------------------*
*&      Form  display_wald
*&---------------------------------------------------------------------*
*       Ausgabe
*----------------------------------------------------------------------*


FORM display_wald.
  LOOP AT lt_wald_new INTO ls_wald_new.
    IF ls_wald_new-zeile > lv_zeile_old.
      NEW-LINE.
      WRITE '               '.
    ENDIF.

    IF ls_wald_new-wert = cv_baum.
      WRITE ls_wald_new-wert COLOR 5.
    ELSEIF ls_wald_new-wert = cv_brennender_baum.
      WRITE ls_wald_new-wert COLOR 6.
    ELSE.
      WRITE ls_wald_new-wert.
    ENDIF.
    lt_wald_old = lt_wald_new.
    lv_zeile_old = ls_wald_new-zeile.
  ENDLOOP.

  CLEAR lv_zeile_old.

  CLEAR lt_wald_new.

  WRITE:/ .
  WRITE:/ .
ENDFORM.                    "display_wald

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Prozent Zufallszahl

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Hi!

Kleiner Tipp am Rande:
Versuch nicht so viel mit globalen Variablen zu arbeiten. Deine FORM get_zufallszahl würde ich z.B. so schreiben:

Code: Alles auswählen.

FORM get_zufallszahl USING u_limit TYPE i CHANGING c_number TYPE i.
  CALL FUNCTION 'QF05_RANDOM_INTEGER'
    EXPORTING
      ran_int_max   = u_limit
      ran_int_min   = 1
    IMPORTING
      ran_int       = c_number
    EXCEPTIONS
      invalid_input = 2
      OTHERS        = 1.
ENDFORM.
Damit hast du eine saubere Trennung zwischen den einzelnen Logiken in deinem Programm.

So, wo liegt nun dein Problem? Du hast irgendwie vergessen eine Frage zu formulieren. :wink:

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Prozent Zufallszahl

Beitrag von drama (ForumUser / 25 / 11 / 0 ) »
Damit hast du eine saubere Trennung zwischen den einzelnen Logiken in deinem Programm.

So, wo liegt nun dein Problem? Du hast irgendwie vergessen eine Frage zu formulieren. :wink:
Super, danke schon mal dafür. :)

Also die Frage:

Ich habe eine Eingabe die Ausgibt wie viel Feuer da sein soll.
Diese Ausgabe/Eingabe soll in Prozent sein.

Nun die Frage:

Wie mache ich es, dass die Eingabe/Ausgabe in Prozent geht? :)

Re: Prozent Zufallszahl

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Hab mir grad nochmal dein Coding durchgesehen.
Verstehe ich dich richtig: Du willst, dass der Benutzer auf dem Selektionsbild "nur" Prozentzahlen eingeben kann? Also eine Zahl von 0 - 100?
Dazu könntest du einfach einen Datentyp nehmen der eine Längennagabe zulässt (z.B.: TYPE n LENGTH 3).
Vor dem Aufruf deiner Programmlogik musst du nur noch eine Prüfung (mit Fehlermeldung) einbauen, damit Werte >100 nicht zulässig sind.

Dazu (und auch für zukünftige Reports) würde ich dir die sog. Report-Ereignisse empfehlen zu verwenden:

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*&      HAUPTPROGRAMM                                                  *
*&---------------------------------------------------------------------*
START-OF-SELECTION. "= Definierter Einsprungspunkt
IF p_feuer > 100.
  message ...
ELSE.
  PERFORM initialisierung_wald.
  DO p_aktion TIMES.
    PERFORM zeitschritt_simulieren.
  ENDDO.
ENDIF.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
drama

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Prozent Zufallszahl

Beitrag von ewx (Top Expert / 4848 / 312 / 642 ) »
Für die Validierung von Eingabe-Parametern dann aber bitte das Ereignis AT SELECTION-SCREEN nehmen...

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
drama


Re: Prozent Zufallszahl

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
ewx hat geschrieben:Für die Validierung von Eingabe-Parametern dann aber bitte das Ereignis AT SELECTION-SCREEN nehmen...
Stimmt. :oops:
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Seite 1 von 1

Vergleichbare Themen

10
Antw.
8553
Views
Prozent rechnen im ALV
von Kleenmex » 21.05.2008 14:04 • Verfasst in ABAP Objects®
2
Antw.
2176
Views
Prozent von Summenzeile
von DeMa » 09.04.2018 15:33 • Verfasst in ABAP Objects®
2
Antw.
2256
Views
Höhe eines Controls in Prozent festlegen
von Mr_Blonde » 22.11.2006 10:57 • Verfasst in Dialogprogrammierung

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

User Exit EXIT_RQCPRM10_001
vor 3 Stunden von Manfred K. 1 / 76
Trennen Strasse und Hausnummer
vor 5 Stunden von payten 13 / 10355
Dialog-Container mit Toolbar/Status
vor 19 Stunden von DeathAndPain gelöst 22 / 3346
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1141

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

User Exit EXIT_RQCPRM10_001
vor 3 Stunden von Manfred K. 1 / 76
Trennen Strasse und Hausnummer
vor 5 Stunden von payten 13 / 10355
Dialog-Container mit Toolbar/Status
vor 19 Stunden von DeathAndPain gelöst 22 / 3346
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1141

Unbeantwortete Forenbeiträge

User Exit EXIT_RQCPRM10_001
vor 3 Stunden von Manfred K. 1 / 76
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2702
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9284