Python :: Aufgabe #267

2 Lösungen Lösungen öffentlich

flexible Temperaturumrechnung

Fortgeschrittener - Python von Gnom - 10.04.2020 um 11:24 Uhr
Gegeben sei ein String-Array mit einer beliebigen Anzahl von Temperaturangaben in °C, °F oder K (z. B. "24,5 °C", "74.3 °F" oder "-270 K"). Dabei sollen unterschiedliche Ausprägungen vorliegen: positive/negative Zahlen, Ganzzahlen/Kommazahlen, Trennung durch Punkt oder Komma, Angaben mit "°" oder ohne, Angabe der Einheit ("K"/"C"/"F", evtl. auch "k"/"c"/"f"), Variationen der Anordnung von Leerzeichen.

Das Programm soll nacheinander alle Strings analysieren und jeweils die Zahl und die Einheit ermitteln und in Variablen speichern, die Temperatur von der gegebenen Einheit in die beiden anderen Einheiten umrechnen und alle drei Werte geordnet mit einer Nachkommastelle ausgeben.

Lösungen:

vote_ok
von Klaus (1960 Punkte) - 21.04.2020 um 14:03 Uhr
Der Umfang und die Komplexität der Aufgabe macht natürlich keinen OOP-Ansatz erforderlich. Eine einfache Darstellung über Funktionen wäre ausreichend. Ich persönlich mag einfach die Bündelung von Daten und Funktionen in einem Objekt.

Quellcode ausblenden Python-Code
class TemperatureConverter:
    """ input: Liste gemäß Aufgabendefinition
        print-output: formatierter String mit allen umgerechneten Temperaturwerten
    """

    def __init__(self, data_list):
        self.temperature_data = []                          # Liste der übergebenen Daten als TemperatureData-Objekt
        self.return_string = ''                             # Rückgabestring
        for element in data_list:
            self.temperature_data.append(self.__convert_to_tempdata(element))   # Umwandlung in TemperatureData-Objekt
        for element in self.temperature_data:
            self.return_string += element.return_results() + '\n'    # Erzeugt den Ausgabetext für den Datensatz

    def __convert_to_tempdata(self, element):

        sign = '+'                                          # speichert das Vorzeichen
        value = ''                                          # speichert den Wert
        unit = ''                                           # speichert die Einheit

        for letter in element:
            if letter.isnumeric():
                value += letter
            elif letter == '-':
                sign = '-'
            elif letter in '. ,'.split():
                value += '.'
            elif letter.lower() in 'c f k'.split():
                if unit != '':                              # Es wurde mehr als eine Einheit angegeben
                    raise Exception
                unit = letter.lower()

        convert_value = sign + value

        if unit == '':                                      # Es wurde keine Einheit angegeben
            raise Exception

        return TemperatureData(float(convert_value), unit)

    def __str__(self):
        return self.return_string


class TemperatureData:

    def __init__(self, value, unit):
        self.unit = unit
        self.value = value
        self.data = {'c': 0, 'f': 0, 'k': 0, self.unit: self.value}
        self.__calculate_data()                                     # Berechnet das vollständige Dictionary

    def __calculate_data(self):
        if self.unit == 'c':
            self.data['f'] = self.__c_to_f(self.value)
            self.data['k'] = self.__c_to_k(self.value)
        elif self.unit == 'f':
            self.data['c'] = self.__f_to_c(self.value)
            self.data['k'] = self.__f_to_k(self.value)
        elif self.unit == 'k':
            self.data['c'] = self.__k_to_c(self.value)
            self.data['f'] = self.__k_to_f(self.value)

    def __c_to_f(self, value):
        return 32 + (value * (9/5))

    def __c_to_k(self, value):
        return 273.15 + value

    def __f_to_c(self, value):
        return ((value - 32) * (5/9))

    def __f_to_k(self, value):
        return (value - 32) * (5/9) + 273.15

    def __k_to_c(self, value):
        return value - 273.15

    def __k_to_f(self, value):
        return (value - 273.15) * (9/5) + 32

    def return_results(self):
        return_string = f"{round(self.data['c'],1):9.1f} Grad Celsius," \
                        f"{round(self.data['f'],1):9.1f} Grad Fahrenheit," \
                        f"{round(self.data['k'],1):9.1f} Kelvin"
        return return_string


if __name__ == '__main__':
    try:
        print(TemperatureConverter(["24,5 °C", "74.3 °F", "-270 K"]))
    except:
        print('Falsches Datenformat. Bitte prüfen Sie, ob ihre Eingabe den Aufgabenbedingungen entspricht.')
vote_ok
von Pavith (50 Punkte) - 12.06.2020 um 20:44 Uhr
Quellcode ausblenden Python-Code
print("Umrechnung von Celsius nach Kelvin: Drücke (1) ")
print("Umrechnung von Celsius nach Fahrenheit: Drücke (2) ")
print("Umrechnung von Kelvin nach Celsius: Drücke (3) ")
print("Umrechnung von Kelvin nach Fahrenheit: Drücke (4) ")
print("Umrechnung von Fahrenheit nach Celsius: Drücke (5) ")
print("Umrechnung von Fahrenheit nach Kelvin: Drücke (6) ")
def Temperaturauswahl():
    global antwort
    antwort = float(input("Wähle eine Zahl für die jeweilige Umrechnung: "))

    global Neustart
    if antwort not in [1,2,3,4,5,6]:
        print("Eingabe ungültig!")
        antwort = input("Wähle eine Zahl für die jeweilige Umrechnung: ")
    elif antwort==1:
        ck = float(input("Geben Sie einen Wert ein, welchen Sie von Celsius nach Kelvin umwandeln wollen: "))
        print(ck + 273.15)
        Neustart = input("Wollen Sie eine neue Berechnung durchführen?: (Klicken Sie \"J\") ")

        if Neustart not in ["J", "j"]:
            print("Vielen Dank")
        else:
            return Temperaturauswahl()

    elif antwort==2:
        cf = float(input("Geben Sie einen Wert ein, welchen Sie von Celsius nach Fahrenheit umwandeln wollen: "))
        print(cf*(9/5)+32)
        Neustart = input("Wollen Sie eine neue Berechnung durchführen?: (Klicken Sie \"J\") ")

        if Neustart not in ["J", "j"]:
            print("Vielen Dank")
        else:
            return Temperaturauswahl()
    elif antwort==3:
        kc = float(input("Geben Sie einen Wert ein, welchen Sie von Kelvin nach Celsius umwandeln wollen: "))
        print(kc - 273.15)
        Neustart = input("Wollen Sie eine neue Berechnung durchführen?: (Klicken Sie \"J\") ")

        if Neustart not in ["J", "j"]:
            print("Vielen Dank")
        else:
            return Temperaturauswahl()
    elif antwort==4:
        kf = float(input("Geben Sie einen Wert ein, welchen Sie von Kelvin nach Fahrenheit umwandeln wollen: "))
        print((kf - 273.15)*(9/5)+32)
        Neustart = input("Wollen Sie eine neue Berechnung durchführen?: (Klicken Sie \"J\") ")

        if Neustart not in ["J", "j"]:
            print("Vielen Dank")
        else:
            return Temperaturauswahl()
    elif antwort==5:
        fc = float(input("Geben Sie einen Wert ein, welchen Sie von Fahrenheit nach Celsius umwandeln wollen: "))
        print((fc - 32)*(5/9))
        Neustart = input("Wollen Sie eine neue Berechnung durchführen?: (Klicken Sie \"J\") ")

        if Neustart not in ["J", "j"]:
            print("Vielen Dank")
        else:
            return Temperaturauswahl()
    elif antwort==6:
        fk = float(input("Geben Sie einen Wert ein, welchen Sie von Fahrenheit nach Kelvin umwandeln wollen: "))
        print((fk - 32)*(5/9)+273.15)
        Neustart = input("Wollen Sie eine neue Berechnung durchführen?: (Klicken Sie \"J\") ")

        if Neustart not in ["J", "j"]:
            print("Vielen Dank")
        else:
            return Temperaturauswahl()

Temperaturauswahl()



1994600

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.