Kurs:Python/LG/Py2009/Aufgaben (Pape)
Webquelle
[Bearbeiten]- Christian Pape: Java-Programmieraufgaben (Website)
Mit Lösungen
Datentypen und Ausdrücke
[Bearbeiten]Boolescher Ausdruck zur Definition einer Metropole
[Bearbeiten]# Eigenschaften der Stadt
istHaupstadt = True
anzahlEinwohner = 100001
steuernProEinwohner = 8000000.0
# Ausgabe
if istHaupstadt == True and anzahlEinwohner > 100000 or anzahlEinwohner > 200000 and steuernProEinwohner >= 720000000:
print "Diese Stadt ist eine Metropole."
else:
print "Diese Stadt ist keine Metropole."
...
[Bearbeiten]Berechnen Sie den elektrischen Widerstand eines Drahtes
[Bearbeiten]Background: Siehe Zylinder (Geometrie), Kreis (Geometrie), speziell Kreisfläche.
import math
# E I N G A B E
laenge = 1
d = 0.001
Widerstand_Kuper = 1.78 * 10 ** -8
Widerstand_Silizium = 2300
# Formeln
# Widerstand: R = P * ( Laenge / Flaeche des Durchschnitts)
# Flaeche des Durchschnitts = d * d * math.pi / 4
flaeche = d * d * math.pi / 4
print flaeche
# Teilaufgabe 1
# B E R E C H N U N G K U P F E R
R_KupferDraht = Widerstand_Kuper * (laenge / flaeche)
print "Der Widerstand fuer einen Kupferdrath (1 m lang, 1 mm im Durchmesser) betraegt", R_KupferDraht, "Ohm."
# B E R E C H N U N G S I L I Z I U M
R_SiliziumDraht = Widerstand_Silizium * (laenge / flaeche)
print "Der Widerstand fuer einen Siliziumdrath (1 m lang, 1 mm im Durchmesser) betraegt", R_SiliziumDraht, "Ohm."
# Teilaufgabe 2
# Nach dem Ohmschen Gesetz ist Strom I proportional zur Spannung U. Oder als Formel: U = R * I.
# Wieviel Spannung muss an dem Draht angelegt werden, damit 25 Ampere Strom durchfliessen?
U_KupferDraht = R_KupferDraht * 25
U_SiliziumDraht = R_SiliziumDraht * 25
print "An den Kupferdraht muss eine Spannung von", U_KupferDraht, "Volt angelegt werden, damit 25 Ampere Strom hindurchfliessen."
print "An den Siliziumdraht muss eine Spannung von", U_SiliziumDraht, "Volt angelegt werden, damit 25 Ampere Strom hindurchfliessen."
Protokoll:
7.85398163397e-07
Der Widerstand fuer einen Kupferdrath (1 m lang, 1 mm im Durchmesser) betraegt 0.0226636638963 Ohm.
Der Widerstand fuer einen Siliziumdrath (1 m lang, 1 mm im Durchmesser) betraegt 2928450952.89 Ohm.
An den Kupferdraht muss eine Spannung von 0.566591597407 Volt angelegt werden, damit 25 Ampere Strom hindurchfliessen.
An den Siliziumdraht muss eine Spannung von 73211273822.3 Volt angelegt werden, damit 25 Ampere Strom hindurchfliessen.
Eher unsicher, ob alle Berechnungen stimmen. --Python-Clown 16:56, 26. Apr. 2009 (CEST)
Formatieren Sie überlange Ausdrücke
[Bearbeiten]print "Programmieren!"
...
[Bearbeiten]Addieren Sie 10 mal 0,1 auf eine double-Variable
[Bearbeiten]Was ist eine Variable vom Typ Double? - Siehe unter: Doppelte Genauigkeit.
Wir vergleichen:
variable1 = 0.0
variable2 = 0.1
variable1 = variable1 + variable2 + variable2 + variable2 + variable2 + variable2 + variable2 + variable2 + variable2 + variable2 + variable2
print variable1
if variable1 == 1.0:
print "True"
else:
print "Ueberraschung."
...und erhalten beim Protokoll:
1.0
Ueberraschung.
Ergebnis: „Berechnungen zeigt, warum man Gleitkommazahlen nie mit dem Identitätsoperator vergleichen darf.“ (Quelle). Auf die Kommentare in der Lösung (Quelltext) achten. Es ist zu merken, dass „0,1 nicht genau als Gleitkommazahl im Speicher repräsentiert werden kann und auf diesen Wert beruhende Berechnungen falsch werden können“.
Vorschlag zur Problemlösung: „Gleitkommazahlen dürfen nie mit der Identität vergliechen werden. Statt dessen den Abstand der Zahlen daraufhin überprüfen, ob er sehr klein ist. Der sehr kleine Wert hängt von der Anwendung ab. Bei Bankanwendungen reicht 5-8 Stellen Genauigkeit hinter dem Komma.“
Ohne Schleife:
variable1 = 0.0
variable2 = 0.1
variable1 = variable1 + variable2 + variable2 + variable2 + variable2 + variable2 + variable2 + variable2 + variable2 + variable2 + variable2
print variable1
Protokoll:
1.0
Mit Schleife:
variable = 0.0
for i in range (1, 11):
variable += 0.1
print variable
Protokoll:
1.0
Kontrollanweisungen
[Bearbeiten]Drei Zahlen sortieren
[Bearbeiten]Mögliche Ausgangsbasis
1 2 3 2 1 3 2 3 1 3 2 1 3 1 2 1 3 2
Lösung:
tauscher = 0
while True:
print "Geben Sie die Zahlen 1, 2, 3 in einer beliebigen Reihenfolge ein. 0 zum Abbrechen."
a = input ("Geben Sie die erste Zahl ein: ")
b = input ("Geben Sie die zweite Zahl ein: ")
c = input ("Geben Sie die dritte Zahl ein: ")
if a == 0 or b == 0 or c == 0:
print "Abbruch."
break
if a > b:
tauscher = a
a = b
b = tauscher
print "1. Ausgabe zur Kontrolle: ", a, b, c
if b > c:
tauscher = b
b = c
c = tauscher
print "2. Ausgabe zur Kontrolle: ", a, b, c
if a > b:
tauscher = a
a = b
b = tauscher
print "3. Ausgabe zur Kontrolle: ", a, b, c
if a < b < c:
print "Sortierung abgeschlossen."
else:
print "Es hat nicht geklappt."
Der Quelltext kommt mir arg lang vor. Das ist sicher nicht sehr elegant, funktioniert aber. --Michael Reschke 23:30, 21. Apr. 2009 (CEST)
Ein-mal-Eins auf dem Bildschirm ausgeben
[Bearbeiten]for i in range (1, 11):
print i, 2*i, 3*i, 4*i, 5*i, 6*i, 7*i, 8*i, 9*i, 10*i
Die Java-Lösung. Ich hatte zunächst auch an eine weitere Schleife gedacht, weiß allerdings nicht, wie ich dann bei Python die Ausgabe in einer Zeile herstellen kann.
Berechnen von Noten aus Punktzahlen
[Bearbeiten]def notenberechnung (punkte):
if punkte < 50:
note = 5.0
elif punkte >= 50 and punkte < 55:
note = 4.7
elif punkte >= 55 and punkte < 65:
note = 4.0
elif punkte >= 65 and punkte < 70:
note = 3.7
elif punkte >= 70 and punkte < 75:
note = 3.3
elif punkte >= 75 and punkte < 80:
note = 3.0
elif punkte >= 80 and punkte < 85:
note = 2.7
elif punkte >= 85 and punkte < 90:
note = 2.3
elif punkte >= 90 and punkte < 95:
note = 2.0
elif punkte >= 95 and punkte < 100:
note = 1.7
elif punkte >= 100 and punkte < 105:
note = 1.3
elif punkte >= 105 and punkte < 120:
note = 1.0
return (note)
punkte = input ("Bitte geben Sie die Punktzahl (0-120) ein: ")
if punkte <= 0 or punkte > 120:
print "Ungueltige Eingabe."
else:
print notenberechnung(punkte)
Wird leider nur über endlos-If-Schachtelung gelöst. Ich hatte auf eine Formel gehofft. --Python-Clown 02:11, 27. Apr. 2009 (CEST)
Die Funktion muss sich übrigens oberhalb ihres Aufrufs befinden, sonst kommt es zum Fehler.
Berechnen des Wochentags eines Datums
[Bearbeiten]/Berechnen des Wochentags eines Datums
###
# P R O G R A M M - B E R E C H N E T D E N W O C H E N T A G
# Aufgabe: Fuer einen Tag (1 - 31), den Monat (1 - 12) und ein Jahr soll der zugehoerige Wochentag berechnet werden.
###
# V A R I A B L E N
januar = 31
februar = 28
maerz = 31
april = 30
mai = 31
juni = 30
juli = 31
august = 31
september = 30
oktober = 31
november = 30
dezember = 31
# E I N G A B E
tag = input ("Bitte geben Sie den Tag (1 bis 31) ein: ")
monat = input ("Bitte geben Sie den Monat (1 bis 12) ein: ")
jahr = input ("Bitte geben Sie das Jahr ein: ")
# Pruefung der Eingabe - NICHT IMPLEMENTIERT
print "Protokoll: Pruefung nicht implementiert"
# B E R E C H N U N G
anzahl_tage = ( jahr - 1900 ) * 365 + ( jahr - 1900 ) // 4
print anzahl_tage
if monat <= 2 and (jahr-1900) % 4 == 0:
anzahl_tage -= 1
print "Protokoll: Schaltjahr, Anzahl Tage minus 1."
if monat == 1:
anzahl_tage += tag
elif monat == 2:
anzahl_tage += januar + tag
elif monat == 3:
anzahl_tage += januar + februar + tag
elif monat == 4:
anzahl_tage += januar + februar + maerz + tag
elif monat == 5:
anzahl_tage += januar + februar + maerz + april + tag
elif monat == 6:
anzahl_tage += januar + februar + maerz + april + mai + tag
elif monat == 7:
anzahl_tage += januar + februar + maerz + april + mai + juni + tag
elif monat == 8:
anzahl_tage += januar + februar + maerz + april + mai + juni + juli + tag
elif monat == 9:
anzahl_tage += januar + februar + maerz + april + mai + juni + juli + august + tag
elif monat == 10:
anzahl_tage += januar + februar + maerz + april + mai + juni + juli + august + september + tag
elif monat == 11 :
anzahl_tage += januar + februar + maerz + april + mai + juni + juli + august + september + oktober + tag
elif monat == 12:
anzahl_tage += januar + februar + maerz + april + mai + juni + juli + august + september + oktober + november + tag
print anzahl_tage
wochentag = anzahl_tage % 7
print "Protokoll:", wochentag
# A U S G A B E
if wochentag == 0:
print "Sonntag"
elif wochentag == 1:
print "Montag"
elif wochentag == 2:
print "Dienstag"
elif wochentag == 3:
print "Mittwoch"
elif wochentag == 4:
print "Donnerstag"
elif wochentag == 5:
print "Freitag"
elif wochentag == 6:
print "Samstag"
else:
print "Fehler"
Gewinnstrategie beim Roulette
[Bearbeiten]Unfertig, erste Version
kapital = 1
for i in range (0, 1000000):
kapital = kapital * 2
print kapital
Obiger Code hat etwas von einer Endlos-Schleife.
Anzahl Bytes in passende metrische Einheit umwandeln
[Bearbeiten]while True:
print "Geben Sie 0 ein, um das Programm zu beenden."
byte = input("Geben Sie eine Anzahl Bytes ein: ")
if byte >= 1024 * 1024 * 1024:
print byte, "Byte sind", byte * 1.0 / (1024 * 1024 * 1024), "GByte."
elif byte >= 1024 * 1024:
print byte, "Byte sind", byte * 1.0/ (1024 * 1024), "MByte."
elif byte >= 1024:
print byte, "Byte sind", byte * 1.0 / (1024), "KByte."
else:
print byte, "Byte sind", byte * 1.0, "Byte."
Durchaus interessante Musterlösung, allerdings halte ich 1024 für den Umrechnungswert!?