Teaching/GWI/Beispiele

From Wiki of the E-Business and Web Science Research Group
< Teaching‎ | GWI
Jump to: navigation, search

Python-Beispielprogramme zur Vorlesung

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.

Wechselgeld

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

COINS_NOTES = [20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1]


amount_due = input ("Amount due? (Example 5.45)   ")
amount_paid = input ("Amount paid? (Example 6.00) ")
change = amount_paid - amount_due
print "Change due: ", change
change = change * 100 # convert to cents
change = int(round(change,0))
# int(change) does not work properly in here!

for amount in COINS_NOTES:
	if amount <= change:
		quantity = change/amount
		change = change - quantity * amount
		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()
    
    COINS_NOTES.reverse()
    
  • Die Umwandlung des Wechselgeldbetrages aus einer Float-Zahl (55.0) in eine Ganzzahl geschieht durch:
    change = int(round(change,0))
    
    Dabei wird erst zuverlässig gerundet und dann in den Datentyp int umgewandelt. So vermeidet man Überraschungen.

Taxi

Aufgabe:

  1. Schreiben Sie ein Python-Programm, das eine Preistabelle für alle Strecken zwischen 1 und 25 km ausgibt. Nehmen Sie dabei an, dass der Preis für ein Taxi aus
    • einem Grundpreis von 2,50 Euro und
    • einem kilometerabhängigen Preis von 4 Euro pro Kilometer besteht.
  2. Erweitern Sie das Programm derart, dass der kilometerabhängige Preis ab dem 10. Kilometer auf 3 Euro pro Kilometer sinkt.
  3. Verändern Sie das Programm so, dass die Länge der Fahrt vom Programmbenutzer erfragt wird und der kilometerabhängige Preis nur in Einheiten von 100 m – mit Aufrunden – berechnet wird (Beispiel: Bei 3,25 km werden 3,3 km berechnet).

Lösung Teil 1:

PRICE1 = 4.0 # price per km
PRICE_BASE = 2.50 # base price per ride

for distance in range(25):
	fare = PRICE_BASE + distance * PRICE1
	print "Distance: ", distance, "km ==> taxi fare: ", fare

Lösung Teil 2:

PRICE1 = 4.0 # price per 0..10 km
PRICE2 = 3.0 # price per km, km > 10
PRICE_BASE = 2.50 # base price per ride

for distance in range(25):
	if distance <= 10.0:
		fare = PRICE_BASE + distance * PRICE1
	else:
		fare = PRICE_BASE + 10 * PRICE1 + (distance - 10) * PRICE2
	print "Distance: ",distance,"km ==> taxi fare: ", fare

Lösung Teil 3:

PRICE1 = 4.0 # price per 0..10 km
PRICE2 = 3.0 # price per km, km > 10
PRICE_BASE = 2.50 # base price per ride
METERING_UNIT = 0.1 # metering unit in km (0.1 = 100 m)

distance_raw = raw_input("Distance of the ride in km? ")
distance_raw = float(distance_raw)
distance = distance_raw/METERING_UNIT

# rounding up to the next metering unit
if int(distance) != distance:
	distance = int(distance) + 1	
	
distance = int(distance) * METERING_UNIT
	
if distance <= 10.0:
	fare = PRICE_BASE + distance * PRICE1
else:
	fare = PRICE_BASE + 10 * PRICE1 + (distance - 10) * PRICE2
	
print "Actual distance: ", distance_raw, "km"
print "Charged distance: ", distance, "km"
print "Taxi fare: ", fare

Telefonrechnung

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)
		]
  • Alle Gespräche im Ortsbereich (beginnend mit "+4989") kosten 0,01 Euro pro Sekunde.
  • Alle Gespräche innerhalb Deutschlands (beginnend mit "+49") kosten 0,03 Euro pro Sekunde.
  • Alle übrigen Gespräche sind internationale Verbindungen und kosten 0,12 Euro pro Sekunde.

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		
LOCAL_PREFIX = "+4989"
NATIONAL_PREFIX = "+49"
LOCAL_RATE = 0.01		# cents per second
NATIONAL_RATE = 0.03
INTL_RATE = 0.12

total = 0

for connection in connection_data:
	destination, duration = connection
	fee = 0
	if destination.startswith(LOCAL_PREFIX):
		fee = LOCAL_RATE * duration
	elif destination.startswith(NATIONAL_PREFIX):		
		fee =  NATIONAL_RATE * duration
	else:
		fee = INTL_RATE * duration
	
	total = total + fee

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.

MyRange.py

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 = von + 1    
    return ergebnis

# Ab hier folgt das Programm, das die Funktion my_range verwendet
summe = 0
for p in my_range(3,8):
    print p
    summe = summe + p
    
print "Summe",summe

Sortierverfahren

Aufgabe: Entwerfen Sie ein Programm, das aus einer Liste von Klausurergebnissen

# Klausurdaten als Liste von Tupeln
klausur_ergebnisse = [("Klaus",20), ("Maria", 45), ("Katharina", 34), ("Judith", 59), ("Marcus", 60)]

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.

Lösungsansatz 1: Selection Sort

summe = 0
for ergebnis in klausur_ergebnisse:
    summe = summe + ergebnis[1]

anzahl = len(klausur_ergebnisse)
avg = summe / float(anzahl)
# Hinweis: Ganzzahlige Division
print "Durchschnittliche Punkteanzahl:",avg
print

top_scorer = []

while len(klausur_ergebnisse) > 0:
    ergebnis_max = klausur_ergebnisse[0]
    for ergebnis in klausur_ergebnisse:
        punkte = ergebnis[1]
        punkte_max = ergebnis_max[1]
        if (punkte > punkte_max):
            ergebnis_max = ergebnis

    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"

Lösungsansatz 2: Bubble Sort

zwischen_summe = 0
for ergebnis in klausur_ergebnisse:
    zwischen_summe = zwischen_summe + ergebnis[1]
    
summe = zwischen_summe
avg = float(summe) / len(klausur_ergebnisse)
# 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?)
        erg1 = klausur_ergebnisse[position-1]
        punkte1 = erg1[1]
        erg2 = klausur_ergebnisse[position]
        punkte2 = erg2[1]
    
        if (punkte1<punkte2):
            klausur_ergebnisse[position] = erg1
            klausur_ergebnisse[position-1] = erg2
        # else: Leer, faellt alsp weg
            
top_scorer = klausur_ergebnisse
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"

Lösungsansatz 3: Insertion Sort

# Teil 1
summe = 0
for ergebnis in klausur_ergebnisse:
    name,punktzahl = ergebnis
    summe = summe + punktzahl

# len(liste) liefert die Anzahl der Elementen in der Liste
# Probieren Sie es aus!
# print klausur_ergebnisse

durchschnitt = float(summe) / len(klausur_ergebnisse)
# 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.
ergebnis1 = klausur_ergebnisse[0]
# Kontrollfrage: Was steht jetzt in der Variable ergebnis1?
punkte1 = ergebnis1[1]

ergebnis2 = klausur_ergebnisse[1]
punkte2 = ergebnis2[1]

if  punkte1 < punkte2 :
    top_scorer.append(ergebnis2)
    top_scorer.append(ergebnis1)
else:
    top_scorer.append(ergebnis1)
    top_scorer.append(ergebnis2)


anzahl_ergebnisse = len(klausur_ergebnisse)
# eine Schleife um die restlichen Elementen in "klausur_ergebnisse" abzuarbeiten
for ergebnis in klausur_ergebnisse[2:anzahl_ergebnisse]:
    punkte = ergebnis[1]
    # 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
    pos = 0
    while (pos < len(top_scorer)) and (top_scorer[pos][1] > punkte):
        pos = pos + 1 
    # 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"

Kontakt

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