Skip to content
Snippets Groups Projects
Commit 1901316a authored by Hatice Yildirim's avatar Hatice Yildirim
Browse files

Download Implementierung von WeishauptOrlando

parent 8ed541eb
No related branches found
No related tags found
2 merge requests!8Develop2,!6WeishauptOrlando
from src.interfaces import ICounter
class Counter(ICounter):
def count_ed(self, s: str) -> int:
"""Zählt die Anzahl der Buchstaben 'E' und 'D' in einem String (Case-Insensitive)."""
s = s.upper()
return s.count("D") + s.count("E")
from src.interfaces import IRomanConverter
def int_to_roman(num: int) -> str:
"""Konvertiert eine Dezimalzahl in eine römische Zahl."""
val = [
1000, 900, 500, 400,
100, 90, 50, 40,
10, 9, 5, 4,
1
]
syb = [
"M", "CM", "D", "CD",
"C", "XC", "L", "XL",
"X", "IX", "V", "IV",
"I"
]
roman_num = ''
i = 0
while num > 0:
for _ in range(num // val[i]):
roman_num += syb[i]
num -= val[i]
i += 1
return roman_num
class RomanConverter(IRomanConverter):
def roman_to_int(self, s: str) -> int:
"""Konvertiert eine römische Zahl (String) in eine Dezimalzahl."""
roman_values = {
'I': 1, 'V': 5, 'X': 10, 'L': 50,
'C': 100, 'D': 500, 'M': 1000
}
total = 0
prev_value = 0
# Iteriere über die Zeichen der römischen Zahl von rechts nach links
for char in reversed(s.upper()):
value = roman_values.get(char)
if value is None:
raise ValueError(f"Ungültiges Zeichen '{char}' in der römischen Zahl.")
if value < prev_value:
total -= value
else:
total += value
prev_value = value
return total
from src.calculator import Calculator
from src.Count_ED import Counter
from src.RomanConverter import RomanConverter, int_to_roman
if __name__ == "__main__":
# Erstelle eine Instanz der Calculator-Klasse
calc = Calculator()
# Eine Liste von Test-Ausdrücken, die überprüft werden sollen
test_expressions = [
"2+3", # Einfacher Additionstest
"10-4/2", # Test mit Division und Subtraktion
"(3+5)*2", # Komplexerer Ausdruck mit Klammern
"3++5", # Ungültiger Ausdruck (doppelte Operatoren)
"3--5", # Ungültiger Ausdruck (doppelte Operatoren)
"10*/2", # Ungültiger Ausdruck (Operatorenkombinationen)
"5/0", # Division durch Null (Fehler)
"(3+5))", # Ungültiger Ausdruck (zu viele Klammern)
"abc", # Ungültiger Ausdruck (nur Buchstaben)
"-3*-3" # Gültiger Ausdruck mit Vorzeichen
]
# Schleife, um alle Test-Ausdrücke zu durchlaufen
for expr in test_expressions:
try:
# Versuche, den Ausdruck zu berechnen und gebe das Ergebnis aus
print(f"Eingabe: '{expr}' → Ausgabe: {calc.calculate(expr)}")
except Exception as e:
# Wenn ein Fehler auftritt, gebe die Fehlermeldung aus
print(f"Eingabe: '{expr}' → Fehler: {e}")
print("______________________________________________________________")
if __name__ == "__main__":
counter = Counter()
test_strings = ["Decker", "", "Hallo", "Der Esel", "D", "E", "d", "e"]
for string in test_strings:
print(f"Eingabe: '{string}' → Ausgabe: {counter.count_ed(string)}")
print("______________________________________________________________")
if __name__ == "__main__":
converter = RomanConverter()
# Test römische Zahl in Dezimalzahl umwandeln
print("Test römische Zahl in Dezimalzahl umwandeln")
print(converter.roman_to_int("MCMXCIV")) # Ausgabe: 1994
print(converter.roman_to_int("XIV")) # Ausgabe: 14
print(converter.roman_to_int("CDXLIV")) # Ausgabe: 444
# Test Dezimalzahl in römische Zahl umwandeln
print("Test Dezimalzahl in römische Zahl umwand")
print(int_to_roman(1994)) # Ausgabe: MCMXCIV
print(int_to_roman(14)) # Ausgabe: XIV
print(int_to_roman(444)) # Ausgabe: CDXLIV
\ No newline at end of file
import re
from src.interfaces import ICalculator
class Calculator(ICalculator):
"""Ein Taschenrechner, der mathematische Ausdrücke berechnet."""
def calculate(self, expression: str) -> float:
"""Berechnet einen mathematischen Ausdruck als String und überprüft auf ungültige Eingaben."""
try:
# Entfernt überflüssige Leerzeichen
expression = expression.replace(" ", "")
# Nur erlaubte Zeichen (Zahlen, Operatoren, Klammern) und Zahlen mit Vorzeichen
if not re.match(r'^[0-9+\-*/().]+$', expression):
raise ValueError("Ungültige Zeichen im Ausdruck.")
# Überprüfung auf doppelte Operatoren, aber keine Vorzeichen wie -* oder -+
# Hier wird jetzt auch sichergestellt, dass -3*-3 gültig bleibt
if re.search(r'(?<!\d)[+\-*/]{2,}', expression): # Erfasst auch doppelte Operatoren wie ++, --, **, etc.
raise SyntaxError("Ungültige doppelte Operatoren im Ausdruck.")
# Sicherstellen, dass Klammern ausgeglichen sind
if expression.count("(") != expression.count(")"):
raise ValueError("Fehlende oder zu viele Klammern.")
# Sicherstellen, dass der Ausdruck nicht mit einem Operator beginnt oder endet,
# aber das Minuszeichen als Teil der Zahl akzeptiert wird
if re.match(r'^[*/]', expression) or re.match(r'[*/]$', expression): # Weitere Kontrolle
raise ValueError("Der Ausdruck darf nicht mit einem Operator beginnen oder enden.")
# Evaluierung des mathematischen Ausdrucks mit eval()
result = eval(expression, {"__builtins__": None}, {})
# Sicherstellen, dass das Ergebnis numerisch ist
if isinstance(result, (int, float)):
return float(result)
else:
raise ValueError("Ungültiger Ausdruck.")
except ZeroDivisionError:
raise ZeroDivisionError("Division durch Null ist nicht erlaubt.")
except (SyntaxError, TypeError, NameError) as e:
raise ValueError(f"Ungültiger mathematischer Ausdruck: {str(e)}")
from abc import ABC, abstractmethod
class ICounter(ABC):
@abstractmethod
def count_ed(self, s: str) -> int:
"""Zählt die Buchstaben 'E' und 'D' in einem String (Case-Insensitive)."""
pass
class IRomanConverter(ABC):
@abstractmethod
def roman_to_int(self, s: str) -> int:
"""Konvertiert eine römische Zahl (String) in eine Dezimalzahl."""
pass
class ICalculator(ABC):
@abstractmethod
def calculate(self, expression: str) -> float:
pass
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment