diff --git a/Sonderuebung/WiSe24-25/SU04_2024_11_12_Unterprogramme_Testen-Debuggen/03_taschenrechner_mit_funktionen.f95 b/Sonderuebung/WiSe24-25/SU04_2024_11_12_Unterprogramme_Testen-Debuggen/03_taschenrechner_mit_funktionen.f95
new file mode 100644
index 0000000000000000000000000000000000000000..08d639895fd9ea07000cb31ed2bdd0e7b58d5386
--- /dev/null
+++ b/Sonderuebung/WiSe24-25/SU04_2024_11_12_Unterprogramme_Testen-Debuggen/03_taschenrechner_mit_funktionen.f95
@@ -0,0 +1,119 @@
+program taschenrechner
+    implicit none
+    
+    CHARACTER :: op ! Operator
+
+    CHARACTER :: end 
+
+    DO 
+
+
+        WRITE(*,*) "Gebe einen Rechenoperator (+,-,*,/) ein!"
+        WRITE(*,*) "Fuer die Berechnung einer Kreisflaeche schreibe A"
+        WRITE(*,*) "Fuer Quader Ober- und Unterflaeche Q"
+
+        DO ! Eingabe wird wiederholt, wenn der Operaor ungültig ist
+            READ(*,*) op
+            IF (op == "+" .OR. op == "-" .OR. op == "*" .OR. op == "/" .OR. op == "A" .OR. op == "Q") EXIT
+            WRITE(*,*) "Die Eingabe ist ungueltig. Gebe einen neuen Operator ein."
+        END DO
+
+
+        IF (op == "+" .OR. op == "-" .OR. op == "*" .OR. op == "/") THEN
+            CALL calc(op)
+        ELSEIF (op == "A") THEN
+            CALL circle
+        ELSEIF (op == "Q") THEN
+            CALL quader
+        ELSE
+            WRITE(*,*) "Operatorfehler"
+        END IF
+
+
+
+        ! Austrittsbedingung
+        WRITE(*,*) "Soll eine weitere Rechnung statt finden? (j/n)"
+        READ(*,*) end
+        IF(end == "n") EXIT
+
+    END DO
+
+
+ CONTAINS
+
+ !!! Rechnungen des alten Taschenrechners
+    subroutine calc(op)
+        character :: op 
+        integer :: a, b
+        integer :: res
+
+
+        WRITE(*,*) "Gebe zwei Zahlen ein!"
+        READ(*,*) a, b
+    
+        SELECT CASE (op)
+        CASE("+")
+            res = a + b
+        CASE("-")
+            res = a - b
+        CASE("*")
+            res = a * b
+        CASE("/")
+            res = division(a, b)
+        CASE DEFAULT
+            WRITE(*,*) "Der Eingegebene Operator ist ungueltig."
+        END SELECT    
+        
+        WRITE(*,*) "Das Ergebnis ist ", res
+    end subroutine calc
+
+    function division(a, b) result(res)
+        integer :: a, b
+        integer :: res
+    
+        DO ! Hiermit wird Division durch 0 ausgeschlossen, ohne die Rechnung abzubrechen
+            IF (b == 0) THEN
+                WRITE(*,*) "Division durch 0 ist veboten! Gebe die zweite Zahl erneut ein."
+                READ(*,*) b
+            END IF
+        END DO
+            
+        res = a / b     
+    end function division
+
+
+
+ !!! Neue Rechnungen
+    subroutine quader
+        INTEGER :: a, b, c, res
+
+        WRITE(*,*) "Gebe die Laenge, Hoehe und Breite eines Quaders an."
+        READ(*,*) a, b, c
+
+        ! Oberfläche
+        res = 2*a*b + 2*b*c + 2*c*a
+        WRITE(*,*) "Die Oberfaeche ist ", res
+
+        ! Volumen
+        res = a * b * c
+        WRITE(*,*) "Das Volumen ist ", res
+
+    end subroutine quader
+
+    subroutine circle
+        REAL :: r, res
+        REAL, PARAMETER :: pi = 3.141592
+    
+        WRITE(*,*) "Welchen Radius hat der Kreis?"
+        READ(*,*) r
+    
+        ! Kreisumfang
+        res = pi * r * 2
+        WRITE(*,*) "Der Umfang des Kreises ist ", res
+
+        ! Kreisvolumen
+        res = pi * r**2
+        WRITE(*,*) "Das Volumen des Kreises ist ", res
+    end subroutine circle
+
+end program taschenrechner
\ No newline at end of file