Parkzeit und Parkgebühren

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.
Tunc0
User
Beiträge: 5
Registriert: Dienstag 30. Oktober 2018, 17:04

Ich würde gerne ein Programm zu dieser Aufgabenstellung schreiben

Ein Flughafenparkhaus hat folgenden Tarif

Parkdauer bis 2 Stunden ist kostenlos
Jede weitere angefangene Stunde 2€
Höchstgebühr überhaupt 30€
Die Parkzeit wird in vollen geparkten Minuten eingegeben

Entwirf ein Programm zur Berechnung der Parkgebühr

Ich habe es soweit geschafft aber wie muss ich weitervorgehen?

stunden = int(input("Wie lange haben sie geparkt? (Nur die Stundenanzahl angeben): "))
if(stunden<=2):
print("Keine Kosten für Sie")

else:
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Was ist denn, wenn stunden > 2 ist, rechne das doch mal auf Papier von Hand, wie du da vorgehen würdest
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du Minuten eingeben sollst, ist die Abfrage falsch. Wie sähe denn die Rechnung aus, wenn von Anfang an jede Stunde 2€ kostet?
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tunc0: Ansonsten als Tipp vielleicht noch die `max()`-Funktion, die eine Rolle in einer Lösung spielen könnte.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Tunc0
User
Beiträge: 5
Registriert: Dienstag 30. Oktober 2018, 17:04

Sirius3 hat geschrieben: Dienstag 30. Oktober 2018, 20:05 Wenn Du Minuten eingeben sollst, ist die Abfrage falsch. Wie sähe denn die Rechnung aus, wenn von Anfang an jede Stunde 2€ kostet?
Könntest du mir helfen ich bin echt ratlos
Tunc0
User
Beiträge: 5
Registriert: Dienstag 30. Oktober 2018, 17:04

ThomasL hat geschrieben: Dienstag 30. Oktober 2018, 19:16 Was ist denn, wenn stunden > 2 ist, rechne das doch mal auf Papier von Hand, wie du da vorgehen würdest
Ich habe sozusagen es geschafft aber kann man dies vereinfachen?

stunden = int(input("Wie lange haben sie geparkt? (Nur die Stundenanzahl angeben): "))
if(stunden<=2):
print("Keine Kosten für Sie")

else:
if(stunden > 2, stunden <=3):
print("Die kosten betragen 2€")

else:
if(stunden > 3, stunden <=4):
print("Die kosten betragen 4€")

else:
if(stunden > 4, stunden <=5):
print("Die kosten betragen 6€")

else:
if(stunden > 5, stunden <=6):
print("Die kosten betragen 8€")

else:
if(stunden > 6, stunden <=7):
print("Die kosten betragen 10€")

else:
if(stunden > 7, stunden <=8):
print("Die kosten betragen 12€")
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, kann man. Das Geheimnis ist das gute alte geteilt-rechnen. Und plus. Und minus. Mit ganzen Zahlen. Und zerteilen in kleiner Teilaufgaben. Rechne doch mal aus, wieviele bezahlte Stunden eine Zeitdauer x hat. Zb x = 7.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Code: Alles auswählen

while(True):
    print("Geben sie ihre vorraussichtlichen Parkstunden ein: ")
    stunden = int(input())
    print("Info: bis 2h - kostenlos, ansonsten 2€/h, max. 30€")

    if stunden <= 2:
        kosten = 0
        print("Glückwunsch! Sie müssen nichts bezahlen.\n")
    elif stunden == 17:
            kosten = 30
            print("Ihr Kosten betragen "+str(kosten)+"€\n")
    elif stunden > 17:
            print("Ihre Parkzeit wurde überschritten! Folgen: ...\n")
    else:
        kosten = stunden * 2 - 4
        print("Ihr Kosten betragen "+str(kosten)+"€\n")
Ziemlich eindeutig.
Als erstes (solltes) gibst du einen Text an den "Kunden" aus.
Dann gibst du die Stundenanzahl ein, die in int erfolgt - wichtig: hierbei sollte man noch etwas dazu schreiben, um Abstürze zu vermeiden bezüglich wenn man eine Kommazahl eingibt!
Dann öffnest du den Anweisungsblock mit deinen genannten Bedingungen.

PS. "str(kosten)" aus dem Grund, da kosten eine Integer ist, aber es können nur Strings ausgegeben werden. "str()" gibt es sozusagen als String aus.
Zuletzt geändert von xXSkyWalkerXx1 am Dienstag 30. Oktober 2018, 22:18, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ziemlich eindeutig falsch. Du gibst für 3 Stunden kosten von 6€ aus. Sind aber nur 2€. Und deine Bedingungen zur Überschreitung der Parkzeit von 17h (nicht vergessen, ersten zwei umsonst....) sind Murks. Das ist eine deckelung. Kein verbot.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

__deets__ hat geschrieben: Dienstag 30. Oktober 2018, 22:03 Ziemlich eindeutig falsch. Du gibst für 3 Stunden kosten von 6€ aus. Sind aber nur 2€. Und deine Bedingungen zur Überschreitung der Parkzeit von 17h (nicht vergessen, ersten zwei umsonst....) sind Murks. Das ist eine deckelung. Kein verbot.
Stimmt, hab das vergessen, werde es gleich korrigieren! :D

EDIT:
Habe es nun behoben. Was deine Anmerkung zur Überschreitung angeht, man kann es ja nach belieben selbst bearbeiten. Es soll eine Vorlage sein...
Zuletzt geändert von xXSkyWalkerXx1 am Dienstag 30. Oktober 2018, 22:20, insgesamt 1-mal geändert.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Die reine Berechnung geht ziemlich eindeutig als Einzeiler, solange ein Tag nicht überschritten wird. Ist die Parkzeit länger, wird die Aufgabe etwas interessanter, insbesondere wenn Stundensatz, kostenfreie Parkzeit und Tagesmaximum als variable Werte betrachtet werden und, wenn die Aufgabe als Funktion umgesetzt werden soll, die beiden letzten Werte als Parameter optional sein sollen. Dann wird es zu einer schönen Übungsaufgabe für den fortgeschrittenen Anfänger.
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kbr: Wo liest Du in der Aufgabe etwas von Tagen? Da steht nur ein Maximalpreis. Nicht das der pro Tag gilt. Das mag nicht realistisch sein, aber das ist ja auch nur eine Übungsaufgabe. :-)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@__blackjack__: Ich habe die Aufgabenstellung einfach frei erweitert :-)
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@xXSkyWalkerXx1: schön, dass Du hier Hausaufgaben für andere löst. Noch ein paar Anmerkungen: while ist keine Funktion, braucht also auch keine Klammern. Statt Strings mit str und + zusammenzustückeln, benutze Formatierung. Die Einrückungen stimmen nicht. Der Fall stunden == 17 ist schon in einem anderen Zweig abgehandelt.

Die Aufgabenstellung schreibt immer noch, dass man Minuten eingeben soll.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Sirius3 hat geschrieben: Mittwoch 31. Oktober 2018, 09:20 @xXSkyWalkerXx1: schön, dass Du hier Hausaufgaben für andere löst. Noch ein paar Anmerkungen: while ist keine Funktion, braucht also auch keine Klammern. Statt Strings mit str und + zusammenzustückeln, benutze Formatierung. Die Einrückungen stimmen nicht. Der Fall stunden == 17 ist schon in einem anderen Zweig abgehandelt.

Die Aufgabenstellung schreibt immer noch, dass man Minuten eingeben soll.
Naja, wenn er keine Ahnung hat wird er auch mit der HA nicht weit kommen.
Ach stimmt ja! :D Man, ich bin da noch teils bei C++ , wo das mit den Klammern ist. ^^ Aber es tut ja wenigstens kein Syntax error bringen.
Formatierung? War das nicht die Sache mit ".format" etc. ?
Wegen der Einrückung muss ich mal schauen...danke!

In seinem Post schreibt er aber doch von Stunden(?).
EDIT: gesehen, er sagte dazu noch Minuten. :D
Aber siehste! Dann muss er noch was ändern, um die HA vollständig zu
haben. ^^
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tunc0: Du hast das mit dem gezeigten Code sicher nicht geschafft, weil der falsche Ausgaben liefert. Es sind immer Keine Kosten für alles unter oder gleich zwei Stunden und 2€ sonst, egal wie lange man geparkt hat. Zudem fordert die Aufgabe das der Benutzer die Zeit in Minuten und nicht in Stunden angeben soll.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Tunc0
User
Beiträge: 5
Registriert: Dienstag 30. Oktober 2018, 17:04

Habe es nun so gemacht dass die Minuten ausgegeben werden, aber wenn man beispielsweise 2,5 Stunden angibt also 2.5, welches 150 min wären kommen falsche kosten, wie müsste ich es verändern



while(True):
print("Geben sie ihre vorraussichtlichen Parkstunden ein: ")
stunden = float(input())
print("Info: bis 2h - kostenlos, ansonsten 2€/h, max. 30€")
minuten = stunden * 60

if stunden <= 2:

print("Glückwunsch! Sie müssen nichts bezahlen.")
print("Ihre Parkdauer beträgt", stunden*60,"min")

elif stunden > 17:
print("Ihre Kosten betragen 30€")
print(stunden*60,"min")

else:
kosten = stunden * 2 - 4

print("Ihr Kosten betragen "+str(kosten)+"€")
print("Ihre Parkdauer beträgt", stunden*60,"min")
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tunc0: Die Eingabe ist immer noch in Stunden. Die *Eingabe* soll aber laut Aufgabenstellung in *vollen Minuten* sein.

Ansonsten ist die Formel ganz offensichtlich falsch. Du müsstest die also so ändern, das sie richtige Ergebnisse liefert.

Wenn etwas am Anfang oder Ende von jedem Zweig in einem ``if``/``elif``/``else``-Konstrukt steht, dann ist das eine Verletzung des DRY-Prinzips (Don't Repeat Yourself). Die Ausgabe der Parkdauer kann man *einmal* *danach* in den Code schreiben.

Man kann das ganze auch ohne ``if``/``elif``/``else`` in eine einzige Berechnung packen. Hier mal in Ruby, damit ich Dir die Hausaufgaben nicht so ganz komplett löse. :-)

Code: Alles auswählen

#!/usr/bin/env ruby
FEE_PER_HOUR = 2
MAX_FEE = 30

def main
  puts "Bitte die Parkdauer in Minuten angeben:"
  minutes = gets.to_i
  hours = (minutes / 60.0).ceil
  parking_fee = [[hours - 2, 0].max * FEE_PER_HOUR, MAX_FEE].min
  puts "Die Parkgebühr für #{hours} Stunde(n) beträgt #{parking_fee}€."
end

main if __FILE__ == $PROGRAM_NAME
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Tunc0
User
Beiträge: 5
Registriert: Dienstag 30. Oktober 2018, 17:04

Ich habe es versucht zu machen wie du es in ruby gemacht hast, aber kommen trotzdem falsche kosten, woran liegt es?

kostenprostunde = 2
maximalekosten = 30

minuten = int(input("Bitte die Parkdauer in Minuten angeben:"))
stunden = (minuten / 60)
parkkosten = (stunden - 2) * kostenprostunde
print("Die Parkgebühr für", stunden,"Stunden(n) beträgt", parkkosten)
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was heißt denn “falsche Kosten”? Es hilft uns, wenn deine fehlerbeschreibungen etwas aussagekräftiger sind.

Und ich sehe gleich mehrere Ursachen. Was ist denn zb 123 Minuten durch 60? Und was passiert, wenn die Stunden kleiner 2 sind?
Antworten