______________________________________________________________

Aufgabe 5.1
___________
Quelltext:

MODULE intervall EXPORTS Main;
IMPORT IO;

EXCEPTION OutOfRange;	(* Wert auerhalb des Intervalls *)

VAR Min, Max, Eingabe : INTEGER;

(*-------------------------------------------------------------------*)
(* Prozedur GetIntInIntervall, liest Argumente: a, b als Werte       *)
(* gibt zurueck: Wert im Intervall [a:b]                             *)
(*-------------------------------------------------------------------*)

PROCEDURE GetIntInIntervall(VALUE a,b : INTEGER) : INTEGER
RAISES {OutOfRange} =

BEGIN

  TRY
      Eingabe:= IO.GetInt();
      EVAL IO.GetLine();
      IF Eingabe<a OR Eingabe>b THEN RAISE OutOfRange END;
  EXCEPT
    |IO.Error =>
      IO.Put("\nFalsche Eingabe: bitte eine ganze Zahl eingeben.\n");
      EVAL IO.GetLine();            (* faengt falsche Zeichen auf *)
      RETURN GetIntInIntervall(a,b);
  END;

  RETURN Eingabe;

END GetIntInIntervall;

(*********************************************************************)
(* Programm 'intervall' liest Wert innerhalb Intervall ein.          *)
(*  Aufrufe:                                                         *)
(* 'intervall' -> GetIntInIntervall                                  *)
(*********************************************************************)

BEGIN

  IO.Put("Dieses Programm liest eine ganze Zahl\n");
  IO.Put("innerhalb vorgegebener Grenzen ein.\n\n");

 LOOP
  TRY
    IO.Put("Bitte geben sie ein Minimum an:"); 
    Min:= GetIntInIntervall(FIRST(INTEGER),LAST(INTEGER));
    EXIT
  EXCEPT
    |OutOfRange =>
      IO.Put("\nEingegebener Wert liegt ausserhalb des Intervalls:\n");
      IO.PutInt(FIRST(INTEGER)); IO.Put(" : ");
      IO.PutInt(LAST(INTEGER)); IO.Put("\n");
  END;
 END;

 LOOP
  TRY
    IO.Put("Bitte geben sie ein Maximum an:");
    Max:= GetIntInIntervall(Min,LAST(INTEGER));
    EXIT
  EXCEPT
    |OutOfRange =>
      IO.Put("\nEingegebener Wert liegt ausserhalb des Intervalls:\n");
      IO.PutInt(Min); IO.Put(" : "); IO.PutInt(LAST(INTEGER)); IO.Put("\n");
  END;
 END;

 LOOP
  TRY
    IO.Put("Bitte geben sie den zu pruefenden Wert ein:");
    Eingabe:= GetIntInIntervall(Min,Max);
    EXIT
  EXCEPT
    |OutOfRange =>
      IO.Put("\nEingegebener Wert liegt ausserhalb des Intervalls:\n");
      IO.PutInt(Min); IO.Put(" : "); IO.PutInt(Max); IO.Put("\n");
  END;
 END;

END intervall.

Testlauf:

Dieses Programm liest eine ganze Zahl
innerhalb vorgegebener Grenzen ein.

Bitte geben sie ein Minimum an:0
Bitte geben sie ein Maximum an:100
Bitte geben sie den zu pruefenden Wert ein:0
[.]
Dieses Programm liest eine ganze Zahl
innerhalb vorgegebener Grenzen ein.

Bitte geben sie ein Minimum an:-50
Bitte geben sie ein Maximum an:-1
Bitte geben sie den zu pruefenden Wert ein:0

Eingegebener Wert liegt ausserhalb des Intervalls:
-50 : -1
Bitte geben sie den zu pruefenden Wert ein:-1
[.]
Dieses Programm liest eine ganze Zahl
innerhalb vorgegebener Grenzen ein.

Bitte geben sie ein Minimum an:5
Bitte geben sie ein Maximum an:-5

Eingegebener Wert liegt ausserhalb des Intervalls:
5 : 9223372036854775807
Bitte geben sie ein Maximum an: [...]
Bitte geben sie den zu pruefenden Wert ein:4

Eingegebener Wert liegt ausserhalb des Intervalls:
5 : 5
Bitte geben sie den zu pruefenden Wert ein: 

[...]

Dieses Programm liest eine ganze Zahl
innerhalb vorgegebener Grenzen ein.

Bitte geben sie ein Minimum an:-5
Bitte geben sie ein Maximum an:5
Bitte geben sie den zu pruefenden Wert ein:ab

Falsche Eingabe: bitte eine ganze Zahl eingeben.

[...]

Testlaufende.

Aufgabe 5.2
___________
Quelltext:

MODULE int EXPORTS Main;
IMPORT IO;

EXCEPTION OutOfRange;	(* Wert auerhalb des Intervalls *)
VAR Min, Max, Zahla, Zahlb, Eingabe : INTEGER;

(*-------------------------------------------------------------------*)
(* Prozedur GetIntInIntervall, liest Argumente: a, b als Werte       *)
(* gibt zurueck: Wert im Intervall [a:b]                             *)
(*-------------------------------------------------------------------*)

PROCEDURE GetIntInIntervall(VALUE a,b : INTEGER) : INTEGER
RAISES {OutOfRange} =

BEGIN

  TRY
      Eingabe:= IO.GetInt();
      EVAL IO.GetLine();
      IF Eingabe<a OR Eingabe>b THEN RAISE OutOfRange END;
  EXCEPT
    |IO.Error =>
      IO.Put("\nFalsche Eingabe: bitte eine ganze Zahl eingeben.\n");
      EVAL IO.GetLine();            (* faengt falsche Zeichen auf *)
      RETURN GetIntInIntervall(a,b);
  END;

  RETURN Eingabe;

END GetIntInIntervall;

(*-------------------------------------------------------------------*)
(* Prozedur Addition, liest Argumente: a, b als Werte                *)
(* gibt zurueck: Summe 2er Werte im Intervall [a:b]                  *)
(*  Aufrufe:                                                         *)
(* Addition -> GetIntInIntervall                                     *)
(*-------------------------------------------------------------------*)

PROCEDURE Addition(VALUE a,b : INTEGER) RAISES{OutOfRange} =

BEGIN

  IO.Put("\nBitte geben sie eine erste Zahl an:");
  Zahla:= GetIntInIntervall(a,b);

  IO.Put("Bitte geben sie eine zweite Zahl an:");
  Zahlb:= GetIntInIntervall(a,b);

  INC(Zahla,Zahlb);
  IF Zahla<a OR Zahlb>b THEN RAISE OutOfRange END;
  IO.Put("\nErgebnis:");
  IO.PutInt(Zahla); IO.Put("\n");

END Addition;

(*-------------------------------------------------------------------*)
(* Prozedur Subtraktion, liest Argumente: a, b als Werte             *)
(* gibt zurueck: Differenz 2er Werte im Intervall [a:b]              *)
(*  Aufrufe:                                                         *)
(* Subtraktion -> GetIntInIntervall                                  *)
(*-------------------------------------------------------------------*)

PROCEDURE Subtraktion(VALUE a,b : INTEGER) RAISES{OutOfRange} =

BEGIN

  IO.Put("\nBitte geben sie eine erste Zahl an:");
  Zahla:= GetIntInIntervall(a,b);

  IO.Put("Bitte geben sie eine zweite Zahl an:");
  Zahlb:= GetIntInIntervall(a,b);

  DEC(Zahla,Zahlb);
  IF Zahla<a OR Zahlb>b THEN RAISE OutOfRange END;
  IO.Put("\nErgebnis:");
  IO.PutInt(Zahla); IO.Put("\n");

END Subtraktion;

(*********************************************************************)
(* Programm 'int' bestimmt Intervalle und fuehrt Addition und Sub-   *)
(* traktion innerhalb des Intervalls aus.                            *)
(*  Aufrufe:                                                         *)
(* 'intervall' -> GetIntInIntervall                                  *)
(* 'intervall' -> Addition -> GetIntInIntervall                      *)
(* 'intervall' -> Subtraktion -> GetIntInIntervall                   *)
(*********************************************************************)

BEGIN

  Min:= FIRST(INTEGER); Max:= LAST(INTEGER);
  IO.Put("\nGegenwaertiges Intervall: ");
  IO.PutInt(Min); IO.Put(" : "); IO.PutInt(Max); IO.Put("\n");

(* Anzeigen des Menues, abhaengig von Nutzerwahl Operationen ausfuehren *)

  LOOP

    IO.Put("\n(1) INTERVALL FESTLEGEN");
    IO.Put("\n(2) SUMME");
    IO.Put("\n(3) DIFFERENZ");
    IO.Put("\n(4) ENDE\n");
    (* Wiederhole, bis Eingabe korrekt*)
    LOOP
      TRY
        Eingabe:= GetIntInIntervall(1,4);
        EXIT
      EXCEPT
         |OutOfRange =>
           IO.Put("\nEingegebener Wert ist kein Menuepunkt.\n");
      END;
    END;

    (**Ereignisbehandlung**)
    (* Fall: Intervall gewaehlt = Wiederhole Intervall einlesen      *)
    (* bis Werte korrekt; Fall: Operation gewaehlt = Rufe Operation, *)
    (* melde Fehler bei Ergebnis jenseits Intervall;                 *)
    (* Fall: Abbruch gewaehlt = Schleife verlassen.                  *)
    IF Eingabe= 1 THEN
      LOOP
       TRY
         IO.Put("Bitte geben sie ein Minimum an:"); 
         Min:= GetIntInIntervall(FIRST(INTEGER),LAST(INTEGER));
         EXIT
       EXCEPT
         |OutOfRange =>
           IO.Put("\nEingegebener Wert liegt ausserhalb des Intervalls:\n");
           IO.PutInt(FIRST(INTEGER)); IO.Put(" : ");
           IO.PutInt(LAST(INTEGER)); IO.Put("\n");
       END;
      END;

      LOOP
       TRY
         IO.Put("Bitte geben sie ein Maximum an:");
         Max:= GetIntInIntervall(Min,LAST(INTEGER));
         EXIT
       EXCEPT
         |OutOfRange =>
           IO.Put("\nEingegebener Wert liegt ausserhalb des Intervalls:\n");
           IO.PutInt(Min); IO.Put(" : ");
           IO.PutInt(LAST(INTEGER)); IO.Put("\n");
       END;
      END;
    ELSIF Eingabe= 2 THEN
      TRY
        Addition(Min,Max);
      EXCEPT
        |OutOfRange => IO.Put("\nWert liegt ausserhalb des Intervalls\n");
          IO.PutInt(Min); IO.Put(" : "); IO.PutInt(Max); IO.Put("\n");
      END;
    ELSIF Eingabe= 3 THEN
      TRY
        Subtraktion(Min,Max);
      EXCEPT
        |OutOfRange => IO.Put("\nWert liegt ausserhalb des Intervalls\n");
          IO.PutInt(Min); IO.Put(" : "); IO.PutInt(Max); IO.Put("\n");
      END;
    ELSIF Eingabe= 4 THEN
      EXIT
    END;

  END;

END int.

Testlauf:

Gegenwaertiges Intervall: -9223372036854775808 : 9223372036854775807

(1) INTERVALL FESTLEGEN
(2) SUMME
(3) DIFFERENZ
(4) ENDE
1
Bitte geben sie ein Minimum an:0
Bitte geben sie ein Maximum an:200

(1) INTERVALL FESTLEGEN
(2) SUMME
(3) DIFFERENZ
(4) ENDE
2

Bitte geben sie eine erste Zahl an:100
Bitte geben sie eine zweite Zahl an:10

Ergebnis:110

(1) INTERVALL FESTLEGEN
(2) SUMME
(3) DIFFERENZ
(4) ENDE
1
Bitte geben sie ein Minimum an:0
Bitte geben sie ein Maximum an:100

(1) INTERVALL FESTLEGEN
(2) SUMME
(3) DIFFERENZ
(4) ENDE
3

Bitte geben sie eine erste Zahl an:75
Bitte geben sie eine zweite Zahl an:100

Wert liegt ausserhalb des Intervalls
0 : 100

(1) INTERVALL FESTLEGEN
(2) SUMME
(3) DIFFERENZ
(4) ENDE
1
Bitte geben sie ein Minimum an:0
Bitte geben sie ein Maximum an:200

(1) INTERVALL FESTLEGEN
(2) SUMME
(3) DIFFERENZ
(4) ENDE
2

Bitte geben sie eine erste Zahl an:-10

Wert liegt ausserhalb des Intervalls
0 : 200

(1) INTERVALL FESTLEGEN
(2) SUMME
(3) DIFFERENZ
(4) ENDE
3

Bitte geben sie eine erste Zahl an:-10

Wert liegt ausserhalb des Intervalls
0 : 200

(1) INTERVALL FESTLEGEN
(2) SUMME
(3) DIFFERENZ
(4) ENDE
4

Testlaufende.