Falsche Ausgabe

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
Akmida
User
Beiträge: 2
Registriert: Donnerstag 25. Dezember 2014, 01:42

Nabend,

ich habe folgendes Problem mit Python:


Code: Alles auswählen

from math import *

f=print("Eingabe der Zone mit der Zahl 1,2 oder 3:")
z=(float(input()))

if z==float(1):
    print("Zone 1 oder Zone 1a?")
    print("Geben Sie hierzu entweder nur eine 1 oder ein a ein:")
    a=(input())
    if a==int(1):
        print("Der sk-Wert der Zone 1 beträgt 0,65kN/m²")
        a=0.65
    elif a==str(a):
        print("Der sk-Wert der Zone 1a beträgt 0,81kN/m²")
        a=0.81
    else:
        print("Bitte die Zahl 1 eingeben oder den kleinen Buchstaben a")
Wieso gibt mir Python nicht Zone 1 aus, wenn die Eingaben übereinsgtimmen? Kann mir das Jemand bitte erklären.
Entschuldigt mich bitte wenn ich wie der letzte Vollhorst grad rüberkomme, benutze Python momentan für ein Fach...

PS:Verbesserungen sind erwünscht :D
Zuletzt geändert von Anonymous am Donnerstag 25. Dezember 2014, 02:07, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Akmida: Probier doch einfach mal die Teilausdrücke aus. Was ist `a` wenn der Benutzer eine 1 eingibt und womit vergleichst Du das? Das kann niemals gleich sein (Python 3 vorausgesetzt). Und ``a==str(a)`` ist auch ziemlich sinnfrei in dem Zusammenhang. Was hast Du Dir bei ``int(1)`` gedacht? Was soll die `int()`-Funktion hier bewirken? Das sieht alles arg geraten aus.
Akmida
User
Beiträge: 2
Registriert: Donnerstag 25. Dezember 2014, 01:42

Arg geraten trifft den Nadel ganz schön auf dem Kopf würd ich mal sagen :?

Meine Intention beim schreiben war, dass Python die Eingabe des Benutzers erkennt und ihm darauf die richtige Ausgabe gibt. Zudem noch die Variable "a" als entsprechende Zahl gleichsetzt.
Ich bin da in Sachen Python und programmieren noch ein echter Anfänger und leider grad auf mich allein gestellt.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Akmida: Computer können (noch) nicht raten, was man eigentlich machen will, sondern sind darauf angewiesen, dass man es in exakt der Art und Weise sagt, wie sie es verstehen.
Es gibt verschiedene Typen (String, Int, Float) und ein Objekt vom Typ String ist nie gleich einem Objekt vom Typ Int, dagegen ist ein Objekt vom Typ String zu sich selbst immer gleich.

Noch weitere Fragen: Was für einen Wert hat f und für was brauchst Du ihn? Warum ist z ein float obwohl doch nur ganze Zahlen sinnvolle Eingaben sind? Was bewirken die Klammern um komplette Ausdrücke herum?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Um es mal grob aufzuräumen (Python 3):

Code: Alles auswählen

def main():
    zone = input('Eingabe der Zone mit der Zahl 1,2 oder 3:')

    if zone == '1':
        print('Zone 1 oder Zone 1a?')
        zone_type = input('Geben Sie hierzu entweder nur eine 1 oder ein a ein:')
        if zone_type == '1':
            print('Der sk-Wert der Zone 1 beträgt 0,65kN/m²')
            a = 0.65
        elif zone_type == ('a'):
            print('Der sk-Wert der Zone 1a beträgt 0,81kN/m²')
            a = 0.81
        else:
            print('Bitte die Zahl 1 eingeben oder den kleinen Buchstaben a')


if __name__ == '__main__':
    main()
Du hast bei dir lustig Datentypen gemischt. Das funktioniert erstens so nicht und ist zweitens auch nicht erforderlich. Du kannst alle deine Eingaben als Strings behandeln.
BlackJack

@/me: Psst, die Klammern um 'a' in Zeile 10 sind überflüssig. :-)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:@/me: Psst, die Klammern um 'a' in Zeile 10 sind überflüssig. :-)
Gründlich aufräumen ist bei mir noch immer schief gegangen ...

Abgesehen davon habe ich mal versucht ein komplettes Refactoring hinzubekommen, aber dazu fehlen mir einfach noch ein paar Daten. Die Zonen und ihre Daten sollte man in einer geeigneten Datenstruktur speichern. Das könnte dann so aussehen.

Code: Alles auswählen

ZONE_DATA = {
    '1': {
        '': 0.65,
        'a': 0.81
    },
    '2': {
        '': 1.2,
        'a': 1.44,
        'b': 1.69
    }
}
Die Eingabe der Zone nimmt man dann in einer eigenen Funktion vor.

Code: Alles auswählen

def get_zone(zones):
    while True:
        zone = input('Eingabe der Zone ({}):'.format(', '.join(sorted(zones))))
        if zone in zones:
            return zone
Die Ausgabe kann man dann auch vereinheitlichen.

Code: Alles auswählen

print('Der sk-Wert der Zone 1 beträgt {0:.2f}kN/m²'.format(sk_value))
Aber wie gesagt, so lange nicht mehr Informationen vorliegen kann man eine sinnvolle Struktur nur raten.
BlackJack

Mal mit den Daten heraus gezogen und der Formel nur *einmal* im Code (Python 2):

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
from functools import partial

ZONE_VALUES = [
    (0.65, 0.19, 0.91, True), (0.85, 0.25, 1.91, True), (1.1, 0.31, 2.91, False)
]
ZONE_A_FACTOR = 1.25


def _calculate_snow_load(minimum, base, factor, a_factor, altitude):
    return max(
        minimum, (base + factor * ((altitude + 140) / 740)**2) * a_factor
    )


def _create_zone_functions():
    result = dict()
    for i, (minimum, base, factor, has_a_zone) in enumerate(ZONE_VALUES, 1):
        name = str(i)
        result[name] = partial(_calculate_snow_load, minimum, base, factor, 1)
        if has_a_zone:
            result[name + 'a'] = partial(
                _calculate_snow_load,
                round(minimum * ZONE_A_FACTOR, 2),
                base,
                factor,
                ZONE_A_FACTOR
            )
    return result


NAME_TO_ZONE_FUNCTION = _create_zone_functions()


def calculate_snow_load(zone_name, altitude):
    return NAME_TO_ZONE_FUNCTION[zone_name](altitude)


def ask_zone_name():
    prompt = 'Welche Zone ({0}): '.format(
        ', '.join(sorted(NAME_TO_ZONE_FUNCTION))
    )
    while True:
        result = raw_input(prompt)
        if result in NAME_TO_ZONE_FUNCTION:
            return result
        else:
            print('Fehler! Bitte eine der vorhandenen Zonen wählen.')


def ask_altitude():
    while True:
        try:
            result = float(raw_input('Höhe über dem Meeresspiegel (in m): '))
        except ValueError:
            print('Fehler! Bitte eine Zahl eingeben.')
        else:
            if result < 0:
                print('Fehler! Die Höhe muss eine positive Zahl sein.')
            else:
                return result


def main():
    zone_name = ask_zone_name()
    altitude = ask_altitude()
    snow_load = calculate_snow_load(zone_name, altitude)
    print(
        'Der sk-Wert der Zone {0} beträgt {1:.2f} kN/m²'.format(
            zone_name, snow_load
        )
    )


if __name__ == '__main__':
    main()
Antworten