Temperaturumrechner

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Astenbein
User
Beiträge: 1
Registriert: Mittwoch 27. November 2019, 14:11

Guten Tag,
und zwar soll ich einen Temperaturumrechner mit python machen, aber nicht wie es im Internet überall steht mit input, sondern wor sollen über eine Datei mit Celsius und Fahrenheit Werten in Kelvin umrechnen. Hier die Aufgabenstellung :Die Datei temperatures.txt enthält Temperaturen in Celsius (enden mit C) und in Fahrenheit (enden mit F). Schreiben Sie ein Programm, das die Temperaturen in Kelvin umwandelt: 𝑇𝐾=𝑇𝐶+273.15 und 𝑇𝐾=(𝑇𝐹+459.67)⋅5/9 ; und dann zeilenweise auf zwei Stellen gerundet ausgibt. Die ersten Zeilen der Ausgabe sind:297.27 306.5 305.58 285.39 293.0 268.36

Dies ist mein Ansatz:
f = open("temperatures.txt", encoding="utf-8")
text = f.read()
f.close()
def convert_f():
f = float(fahrenheit)
f = 𝑇𝐹+459.67)⋅5/9
return(f)

def convert_c():
c = float(celsius)
c = 𝑇𝐶+273.15
return(c)
l = []

for number in text.split():
number = float(number)
l.append(float(number)
print(l)
Mein erstes Problem liegt darin, dass ich nicht mit den Werten rechnen kann, da ich diese nur als string habe und sie irgendwie nicht in floats konvertieren kann.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

"Irgendwie" ist keine gute Fehlerbeschreibung. Gibt es eine Fehlermeldung? Wenn ja, welche?

Der Code funktioniert gar nicht, weil er illegale Zeichen enthält und Klammern fehlen.

Funktionen brauchen Parameter, sonst ist fahrenheit oder celsius gar nicht definiert.
`return` ist keine Funktion, die Klammern gehören also weg.
`l` oder `f` sind schlechte Variablennamen. Sie sollten aussagekräftig sein, einbuchstabige Namen sind das aber nie.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Astenbein: In den Konvertierungsfunktionen sollte kein `float()`-Aufruf mehr vorkommen, die sollten schon Zahlen als Argument(e) bekommen. Und es macht auch keinen Sinn `float()` zwei mal hintereinander anzuwenden. Eine Gleitkommazahl wird nicht ”zahliger” je öfter man `float()` aufruft.

Die Kovertierungsfunktionen haben dann auch nur eine Zeile und man bindet das Ergebnis nicht erst an einen Namen. Vorteil: Man kann dann auch keinen schlechten Namen wählen wenn man gar keinen hat. 😜

Alles sollte in Funktionen stehen. Und insbesondere sollte man nicht Code vom Hauptprogramm und Funktionsdefinitionen vermischen. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Ich würde nicht die gesamte Datei auf einmal einlesen — man kann über die einzelnen Zeilen eines Dateiobjekts iterieren, zum Beispiel in einer ``for``-Schleife. Oder man sollte zumindest beim einlesen schon die Zeilen in eine Liste einlesen in dem man einfach `list()` mit dem Dateiobjekt aufruft.

Beim öffnen von Dateien sollte die ``with``-Anweisung verwendet werden wenn das möglich ist. Hier ist das möglich.

Du sagst Du kannst die Zeichenketten nicht in Zahlen umwandeln — was hättest Du denn erwartet was passiert wenn Du eine Zahldarstellung mit irgendeinen Buchstaben dahinter in eine Zahl umwandelst?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Wenn die Datei so aussieht:

Code: Alles auswählen

10.456C
22.134C
33.7C
10.456F
22.134F
33.7F
Würde ich das so lösen:

Code: Alles auswählen

with open("temperatures.txt", "r") as temp_file:
    # Alle Zeilen der Datei in eine Liste einlesen
    lines = temp_file.readlines()


# über alle Zeilen der Liste iterieren
for line in lines:

    # \n vom Ende der Zeile
    line = line.strip("\n")

    # all Zeichen bis auf des letzt sind die Temperaturangabe
    temperatur = line[:-1]

    # string in float umwandeln
    temperatur = float(temperatur)

    # die Einheit ist das letzte Zeichen einer Zeile
    einheit = line[-1]

    # Fallunterscheidung ob Celsius oder Fahrenheit
    if einheit == 'C':
        𝑇𝐾 = temperatur + 273.15

    if einheit == 'F':
        𝑇𝐾 = (temperatur + 459.67) *5 / 9

    # Ausgabe auf zwei Stellen gerundet
    print("Temperatur: {0:6.2f}K".format(TK))
Die Ausgabe:

Code: Alles auswählen

Temperatur: 283.61K
Temperatur: 295.28K
Temperatur: 295.28K
Temperatur: 261.18K
Temperatur: 267.67K
Temperatur: 274.09K
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@rogerb: Ich würde das einlesen in eine Liste wie gesagt nicht machen. Man kann stattdessen direkt über das geöffnete Dateiobjekt iterieren.

Beim `strip()` würde ich kein Argument angeben. Das ist dann robuster gegen eventuelle Leerzeichen oder falls es da noch "\r"-Zeichen am Zeilenende geben sollte.

Falls weder ein C noch ein F nach der Zahl steht, arbeitet das Programm fehlerhaft. Falls das nach der ersten Zeile passiert, merkt der Benutzer das vielleicht nicht einmal!

Da `einheit` nicht gleichzeitig "C" *und* "F" sein kann, sollte das zweite ``if`` ein ``elif`` sein. Und wenn so ein Konstrukt mit einem ``elif`` endet, sollte man entweder noch ein ``else`` dazu schreiben das den Fall behandelt das vorher keine Bedingung gegriffen hat, oder mit einem Kommentar begründen warum es okay ist den Fall einfach zu ignorieren. Da es hier ein Fehler in den Eingabedaten wäre, sollte man es nicht ignorieren.

Die Kommentare sind alle überflüssig. Ausgenommen vielleicht den bei der Fallunterscheidung, aber auch nur wenn da die Umrechnung direkt gemacht wird und nicht Funktionen aufgerufen werden, an deren Namen man die Information ablesen kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ich würde für Bezeichner ja ASCII-Zeichen verwenden. 𝑇𝐾 ist im Code sehr schwer von TK zu unterscheiden.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Hallo @__blackjack__
in einigen Punkten hast du Recht, aber es ging mir erstmal nur darum das ursprüngliche Problem zu lösen.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Hallo /me

die kursiven Variablennamen werden nur im Browser so angezeigt und weil ich es aus der Aufgabenstellung kopiert habe. Man sollte natürlich aussagekräftigigere Namen verwenden, aber um den Bezug zur Frage herzustellen habe ich die gleichen wie dort verwendet.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@rogerb: Die kursiven mathematischen Grossbuchstaben werden bei mir nicht nur im Browser so dargestellt. Was ich interessant finde ist das Python da ”normale” Zeichen draus macht. Ich hätte da ja einen `NameError` erwartet wenn man 𝐴 etwas zuweist und dann auf A zugreift:

Code: Alles auswählen

In [17]: 𝐴 = 42

In [18]: A                                                                      
Out[18]: 42

In [19]: who                                                                    
A        df      pd

In [20]: 𝐴                                                                    
Out[20]: 42
Faszinierend!
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Identifiers werden in Python NFKC-normalisiert. Und da ein kursives A ein A ist wird daraus A.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Sirius3 hat geschrieben: Donnerstag 28. November 2019, 09:37 Identifiers werden in Python NFKC-normalisiert.
Das hatte mich beim Test sehr irritiert. Finde ich auch merkwürdig.
Antworten