Fortran 77 Aufgabe - help needed.. - post aufs wesentliche gekürzt



  • Guten Tag,

    folgende Programmieraufgabe:

    --------------------------------------------------

    Zwei Realzahlen A und B werden eingelesen.
    Bilden sie n-mal den Quotienten A/B. Das Ergebnis wird nun n-mal mit B multipliziert, so dass sich wieder das Ergebnis A ergibt.

    Steigern Sie n von 1 bis nmax, wobei nmax die Anzahl der Divisionen/Multiplikationen ist, bei der sich eine Differenz zwischen dem ursprünglichen und neuem Wert von A ergibt.
    Verhindern Die die Division durch 0 und A=B. In diesen Fällen soll erneut B eingegeben werden. Negative Vorzeichen bei der Eingabe sollen ignoriert werden.
    Begrenzen sie nmax (z.B. < 1200) --> kontrollierter Abbruch mit entsprechender Meldung

    Ausgabe: nmax, Aalt, Aneu (entsprechend kommentiert), Abschied mit "GOOD-BYE"

    Probieren Sie mit dem Programm z.B. die Divisionen 1/3, 5/3, 10/2.
    Erläutern Sie die Ergebnisse und erklären Sie die unterschiedlichen Resultate bei Verwendung der Datentypen Real*4 bzw. Real*8.

    --------------------------------------------------

    Wenn ich die Aufgabe richtig verstehe muss ich solange hintereinander dividieren und später genauso oft dividieren bis sich die Variable A verändert ?

    Wie realisiere ich dies in Fortran 77 ?
    Wie lasse ich ihn immer wieder dividieren (bis maximal 1200 mal bzw. bis A einen anderen Wert hat) dann wieder multiplizierien (genauso oft) und jedesmal prüfen ? Das muss ja quasi so aussehen:

    (A / 😎 * B
    Prüfen ob a sich verändert hat
    (A / B / 😎 * B * B
    Prüfen ob a sich verändert hat
    (A / B / B / 😎 * B * B * B
    Prüfen ob a sich verändert hat
    ....
    bis 1200 mal oder bis die Prüfung anschlägt

    Wie krieg ich das in ne Fortran Schleife ?

    --------------------
    EDIT: Post reduziert auf das wesentliche



  • kein fortran77 progger mehr hier ? 😢
    warum muss ich mich auch mit sonem alten scheiss rumschlagen -.-



  • Vielleicht würden sich mehr Leute deinen Thread ansehen, wenn du ihn lesbarer formatieren würdest. Das Stichwort des Tages ist "Code-Tags"! Schließe deinen Code in [code ] und [/code ] (ohne Leerzeichen) ein. Sinnvoll fände ich auch eine Reduktion deines Beitrags auf das Wesentliche. Das ist schon recht viel zu lesen... 🙂



  • ok hab den post aufs wesentliche reduziert.
    code ist nicht enhalten nur ne idee wie ich mir vorstelle wie er sein müsste...
    daher auch nix im codeblock.

    mfg philipp



  • So hab grad eben mal etwas mit if und goto rumgespielt - mein Fortran 77 quellcode sieht momentan so aus:

    C     Name des Programms
          Program Ungenau
    C     Automatische Variablendeklaration deaktivieren
          IMPLICIT NONE
    C     Variablen deklarieren
          INTEGER n, nmax, X, Y
          REAL A,B,Aneu
    C     Variablen initialisieren
          A = 0
          B = 0
          X = 0
          Y = 0
          Aneu = 0
          n = 1
          nmax = 1200
    C     Benutzereingabe anfordern
          WRITE (*,*) 'Bitte Variable A eingeben:'
    C     Benutzereingabe als Variable a speichern
          READ (*,*) A
    C     Benutzereingabe anfordern
    10    WRITE (*,*) 'Bitte Variable B eingeben:'
    C     Benutzereingabe als Variable b speichern
          READ (*,*) B
    
    C     Fehlerkontrolle, falls Variable B der Zahl Null entspricht
          IF (B .EQ. 0) THEN
    C     Textausgabe
          WRITE (*,*) 'B darf nicht Null oder A entsprechen- Wiederholung'
    C     Sprung zurck zur Eingabe von Variable B
          GOTO 10
          ELSE
    C     Falls Variable A gleich Variable B ist
          IF (A .EQ. B) THEN
    C     Textausgabe
          WRITE (*,*) 'B darf nicht Null oder A entsprechen- Wiederholung'
    C     Spung zurck zur Eingabe von Variable B
          GOTO 10
          ENDIF
          ENDIF
    
    C     Den Wert der Variable A auf Aneu zuweisen
          Aneu = A
    
    C     Solange n nicht nmax erreicht hat zu 200 springen
    100   IF (n .LT. nmax) THEN
          GOTO 200
          ELSE
    C     Ausgabe der 3 Variablen falls Bedingung nicht erfllt
          WRITE (*,*) 'Variable nmax:',n
          WRITE (*,*) 'Variable Aalt:',A
          WRITE (*,*) 'Variable Aneu',Aneu
    C     Sprung zum GOOD-BYE und Programmende
          GOTO 999
          ENDIF
    
    C     Zwei reele Zahlen auf gleichheit Prfen
    200   IF (A .EQ. Aneu) THEN
    C     Variable n bei jedem Durchlauf inkrementieren
          n = n + 1
          GOTO 300
          ELSE
          WRITE (*,*) 'Variable nmax:',n
          WRITE (*,*) 'Variable Aalt:',A
          WRITE (*,*) 'Variable Aneu',Aneu
          GOTO 999
          ENDIF
    
    300   IF (X .LT. n) THEN
          Aneu = Aneu / B
          X = X + 1
          GOTO 300
          ELSE
          GOTO 400
          ENDIF
    
    400   IF (Y .LT. n) THEN
          Aneu = Aneu * B
          Y = Y + 1
          GOTO 400
          ELSE
          GOTO 100
          ENDIF
    
    999   WRITE (*,*) ''
          WRITE (*,*) 'GOOD-BYE'
    C     Programmende
          END
    

    Kein schöner Programmierstil, aber scheint zu funktionieren..

    Ich frage mich allerdings wie ich die Minuszeichen abfange ?
    Noch ne IF Abfrage wo er nach dem minus fragt ?


Anmelden zum Antworten