Auf dieser Seite befinden sich Beispielprogramme in Python zur Vorlesung "Grundzüge der Wirtschaftsinformatik" von Prof. Dr. Martin Hepp an der Universität der Bundeswehr München.
Aufgabe: Schreiben Sie ein Python-Programm, das einen Rechnungsbetrag und einen Zahlbetrag vom Benutzer erfragt und berechnen Sie dann die kleinste Wechselgeld-Kombination (auf Basis der Stückelung im Euro-Raum: 1, 2, 5, 10, 20, 50 Cent, 1, 2, 5, 10, 20, 50, 100, 200 Euro).
Lösung:
# change.py
= [20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1]
COINS_NOTES
= input ("Amount due? (Example 5.45) ")
amount_due = input ("Amount paid? (Example 6.00) ")
amount_paid = amount_paid - amount_due
change print "Change due: ", change
= change * 100 # convert to cents
change = int(round(change,0))
change # int(change) does not work properly in here!
for amount in COINS_NOTES:
if amount <= change:
= change/amount
quantity = change - quantity * amount
change print amount/100.0," EUR :",quantity, "times"
Einige Erläuterungen:
Wir erledigen die eigentliche Berechnung mit Ganzzahlen, die Cent-Beträge repräsentieren. Dadurch sparen wir uns Probleme durch die begrenzte Repräsentation von Werten als Gleitkommazahlen.
Die Liste der verfügbaren Schein- und Münzbeträge ist bereits absteigend sortiert. Wenn man sich darauf nicht verlassen kann, kann man sie wie folgt sortieren:
COINS_NOTES.sort()
```
``` {.python} COINS_NOTES.reverse()
Die Umwandlung des Wechselgeldbetrages aus einer Float-Zahl (55.0) in eine Ganzzahl geschieht durch: {.python} change = int(round(change,0))
Dabei wird erst zuverlässig gerundet und dann in den Datentyp int umgewandelt. So vermeidet man Überraschungen.
Aufgabe:
Lösung Teil 1:
= 4.0 # price per km
PRICE1 = 2.50 # base price per ride
PRICE_BASE
for distance in range(25):
= PRICE_BASE + distance * PRICE1
fare print "Distance: ", distance, "km ==> taxi fare: ", fare
Lösung Teil 2:
= 4.0 # price per 0..10 km
PRICE1 = 3.0 # price per km, km > 10
PRICE2 = 2.50 # base price per ride
PRICE_BASE
for distance in range(25):
if distance <= 10.0:
= PRICE_BASE + distance * PRICE1
fare else:
= PRICE_BASE + 10 * PRICE1 + (distance - 10) * PRICE2
fare print "Distance: ",distance,"km ==> taxi fare: ", fare
Lösung Teil 3:
= 4.0 # price per 0..10 km
PRICE1 = 3.0 # price per km, km > 10
PRICE2 = 2.50 # base price per ride
PRICE_BASE = 0.1 # metering unit in km (0.1 = 100 m)
METERING_UNIT
= raw_input("Distance of the ride in km? ")
distance_raw = float(distance_raw)
distance_raw = distance_raw/METERING_UNIT
distance
# rounding up to the next metering unit
if int(distance) != distance:
= int(distance) + 1
distance
= int(distance) * METERING_UNIT
distance
if distance <= 10.0:
= PRICE_BASE + distance * PRICE1
fare else:
= PRICE_BASE + 10 * PRICE1 + (distance - 10) * PRICE2
fare
print "Actual distance: ", distance_raw, "km"
print "Charged distance: ", distance, "km"
print "Taxi fare: ", fare
Aufgabe: Schreiben Sie ein Programm, das aus folgenden Verbindungsdaten eine Telefonrechnung erstellt:
# format: (destination phone number, duration in seconds)
= [
connection_data '+49896004-0',30),
('+4969123456',120),
('+43152000',50),
('+352989104-7',30),
('+49896004-0',68)
( ]
Lösung:
# phonebill.py
# connection data (destination phone number, duration in seconds)
= [
connection_data '+49896004-0',30),
('+4969123456',120),
('+43152000',50),
('+352989104-7',30),
('+49896004-0',68)
(
]
# constants
= "+4989"
LOCAL_PREFIX = "+49"
NATIONAL_PREFIX = 0.01 # cents per second
LOCAL_RATE = 0.03
NATIONAL_RATE = 0.12
INTL_RATE
= 0
total
for connection in connection_data:
= connection
destination, duration = 0
fee if destination.startswith(LOCAL_PREFIX):
= LOCAL_RATE * duration
fee elif destination.startswith(NATIONAL_PREFIX):
= NATIONAL_RATE * duration
fee else:
= INTL_RATE * duration
fee
= total + fee
total
print "Total: ", total
Hinweis: In der Vorlesung wurde die Methode str.startswith() nicht behandelt, die es erlaubt zu testen, ob eine Zeichenkette mit einer gegebenen Zeichenkette beginnt. Wenn Sie lediglich Konstrukte verwenden möchten, die in der Vorlesung explizit erklärt wurden, können Sie
if destination.startswith(LOCAL_PREFIX):
durch
if destination[0:len(LOCAL_PREFIX)] == LOCAL_PREFIX::
und
elif destination.startswith(NATIONAL_PREFIX):
durch
elif destination[0:len(NATIONAL_PREFIX)] == NATIONAL_PREFIX:
ersetzen.
Aufgabe: Nehmen Sie an, dass die bekannte Python-Funktion 'range(a,b)' nicht existiert. Implementieren Sie eine 'my_range(x,y)'-Funktion, die die Aufgabe der 'range(a,b)'-Funktion übernimmt. Sie soll folgendermaßen funktionieren:
print my_range(1,2)
# Ausgabe: [1]
print my_range(3,5)
# Ausgabe [3,4]
Lösung:
# Hier wird die Funktion definiert
def my_range(von,bis):
# leere liste
= []
ergebnis while von < bis:
ergebnis.append(von)= von + 1
von return ergebnis
# Ab hier folgt das Programm, das die Funktion my_range verwendet
= 0
summe for p in my_range(3,8):
print p
= summe + p
summe
print "Summe",summe
Aufgabe: Entwerfen Sie ein Programm, das aus einer Liste von Klausurergebnissen
# Klausurdaten als Liste von Tupeln
= [("Klaus",20), ("Maria", 45), ("Katharina", 34), ("Judith", 59), ("Marcus", 60)] klausur_ergebnisse
das arithmetische Mittel ("den Durchschnitt") der Punktzahl berechnet und eine Liste der besten drei Studierenden erzeugt, die nach abnehmender Punktezahl sortiert sein soll.
Hinweis: Es ist aus didaktischen Gründen ausdrücklich eine Lösung "zu Fuß", also ohne Verwendung mächtiger Python-Funktionen für Mittelwert und Sortierung erwünscht.
= 0
summe for ergebnis in klausur_ergebnisse:
= summe + ergebnis[1]
summe
= len(klausur_ergebnisse)
anzahl = summe / float(anzahl)
avg # Hinweis: Ganzzahlige Division
print "Durchschnittliche Punkteanzahl:",avg
print
= []
top_scorer
while len(klausur_ergebnisse) > 0:
= klausur_ergebnisse[0]
ergebnis_max for ergebnis in klausur_ergebnisse:
= ergebnis[1]
punkte = ergebnis_max[1]
punkte_max if (punkte > punkte_max):
= ergebnis
ergebnis_max
for ergebnis in klausur_ergebnisse:
if ergebnis == ergebnis_max:
klausur_ergebnisse.remove(ergebnis_max)
top_scorer.append(ergebnis_max)
print "Top 3"
print top_scorer[0:3]
print
print "Herzlichen Glueckwunsch Gruppe 1, Sie haben den Sortier-Algorithmus 'Selectionsort' erfunden."
print "Mehr Infos unter http://de.wikipedia.org/wiki/Selection_Sort"
= 0
zwischen_summe for ergebnis in klausur_ergebnisse:
= zwischen_summe + ergebnis[1]
zwischen_summe
= zwischen_summe
summe = float(summe) / len(klausur_ergebnisse)
avg # Kontrollfrage: Warum float(summe) und nicht summe?
# Tip: Programm aendern und ausprobieren
print "Durchschnitt: ", avg
print
# top_scorer = ?
for i in range(len(klausur_ergebnisse)):
for position in range(1, len(klausur_ergebnisse) - i): # len(klausur_ergebnisse) - i ist eine Optimierung,
# man kann auch die innere Schleife immer bis len(klausur_ergebnisse)
# laufen lassen (Warum?)
= klausur_ergebnisse[position-1]
erg1 = erg1[1]
punkte1 = klausur_ergebnisse[position]
erg2 = erg2[1]
punkte2
if (punkte1<punkte2):
= erg1
klausur_ergebnisse[position] -1] = erg2
klausur_ergebnisse[position# else: Leer, faellt alsp weg
= klausur_ergebnisse
top_scorer print "Top 3"
print top_scorer[0:3]
print
print "Herzlichen Glueckwunsch Gruppe 2, Sie haben den Sortier-Algorithmus 'Bubblesort' erfunden."
print "Mehr Infos unter http://de.wikipedia.org/wiki/Bubble_Sort"
# Teil 1
= 0
summe for ergebnis in klausur_ergebnisse:
= ergebnis
name,punktzahl = summe + punktzahl
summe
# len(liste) liefert die Anzahl der Elementen in der Liste
# Probieren Sie es aus!
# print klausur_ergebnisse
= float(summe) / len(klausur_ergebnisse)
durchschnitt # Kontrollfrage: Warum float(summe)? Warum nicht einfach summe?
print "Durchschnitt ",durchschnitt
print
# Teil 2
= []
top_scorer # Wir nehmen an, dass die Liste immer mindestens zwei Ergebnisse enthaelt.
= klausur_ergebnisse[0]
ergebnis1 # Kontrollfrage: Was steht jetzt in der Variable ergebnis1?
= ergebnis1[1]
punkte1
= klausur_ergebnisse[1]
ergebnis2 = ergebnis2[1]
punkte2
if punkte1 < punkte2 :
top_scorer.append(ergebnis2)
top_scorer.append(ergebnis1)else:
top_scorer.append(ergebnis1)
top_scorer.append(ergebnis2)
= len(klausur_ergebnisse)
anzahl_ergebnisse # eine Schleife um die restlichen Elementen in "klausur_ergebnisse" abzuarbeiten
for ergebnis in klausur_ergebnisse[2:anzahl_ergebnisse]:
= ergebnis[1]
punkte # wir finden die Position in der Liste "top_scorer", die ein Ergebnis enthaelt,
# dessen Punkteanzahl nicht mehr groeßer als "punkte" ist.
# An dieser Position muessen wir das aktuelle Ergebnis einfuegen
= 0
pos while (pos < len(top_scorer)) and (top_scorer[pos][1] > punkte):
= pos + 1
pos # liste.insert(pos,element) -> fuegt ein Element an der position "pos" in die Liste ein!
top_scorer.insert(pos,ergebnis)
print "Top-Scorer"
print top_scorer
print
print "Herzlichen Glueckwunsch Gruppe 3, Sie haben den Sortier-Algorithmus 'Insertionsort' erfunden."
print "Mehr Infos unter http://de.wikipedia.org/wiki/Insertion_Sort"
Professur für Allgemeine BWL, insbesondere E-Business
Univ.-Prof. Dr. Martin Hepp
Universität der Bundeswehr
Werner-Heisenberg-Weg 39
D-85579 Neubiberg, Germany
Email: mhepp@computer.org
Telefon: +49 89 6004-4217