Montag, 10. Oktober 2011
Java -> Python (POS1: 2B)
Wandeln Sie folgendes Java-Programm in ein Python Programm um:
public class Dreiecksbestimmung { public static void main(String[] args) { dreiecksbestimmung(3.0, 4.0, 5.0); dreiecksbestimmung(3.0, 3.0, 3.0); dreiecksbestimmung(3.0, 3.0, 5.0); dreiecksbestimmung(3.0, 4.5, 5.0); dreiecksbestimmung(1.0, 2.0, 3.0); } private static void dreiecksbestimmung(double a, double b, double c) { System.out.printf("a = %.2f, b = %.2f, c = %.2f: ", a, b, c); if (dreieck(a, b, c)) { if (gleichseitig(a, b, c)) { System.out.print("gleichseitiges "); } else if (gleichschenkelig(a, b, c)) { System.out.print("gleichschenkeliges "); } if (rechtwinkelig(a, b, c)) { System.out.print("rechtwinkeliges "); } System.out.println("Dreieck"); } else { System.out.println("kein gültiges Dreieck"); } } private static boolean rechtwinkelig(double a, double b, double c) { double a2 = a * a; double b2 = b * b; double c2 = c * c; return a2 + b2 == c2 || a2 + c2 == b2 || b2 + c2 == a2; } private static boolean gleichschenkelig(double a, double b, double c) { return a == b || a == c || b == c; } private static boolean gleichseitig(double a, double b, double c) { return a == b && b == c; } private static boolean dreieck(double a, double b, double c) { return a + b > c && a + c > b && b + c > a; } }Ergänzen Sie Ihr Programm um geeignete Doc-Strings und Kommentare!
Labels: Aufgabe, Java, POS1-2, Python
Mittwoch, 5. Oktober 2011
Abgaben am CVS (POS1: 2., 3. Klassen)
Nennen Sie Projekte klasse-name-projekt
, wobei klasse "2a" für 2AHIF, "2c" für 2CHIF, "3b" für 3BHIF usw. und name Ihr Familienname sein soll (bei Namensgleichheit machen Sie bitte klasse-name-vorname-projekt
daraus). Checken Sie die Projekte am CVS (cvs.htlwrn.ac.at, Pfad /cvs/user - user ist Ihr Login) ein.
Den Source Code müssen Sie auch in gedruckter Form abliefern. Dieses Listing sollte dann etwa so aussehen:
Das Listing sollte folgende Eigenschaften aufweisen:
Das Listing sollte folgende Eigenschaften aufweisen:
- Autor und Dateiname ist sofort ersichtlich
- Seitennummern werden gedruckt
- Syntax-Hilighting: Schlüsselworte, Kommentare usw. sollten unterschiedlich formatiert sein
- Querformat mit zwei Spalten, um Papier zu sparen (Zwei Seiten auf eine drucken)
- Es muss ein "fixed font" (z.B. Courier) verwendet werden, d.h. jedes Zeichen hat die selbe Breite (ausgenommen String-Konstante)
- Optional sollen Zeilennummern gedruckt werden (siehe Beispiele unten).
Beispiel mit Zeilennummern:
Beispiel mit Zeilennummern, nur jede 5. Zeile bekommt eine Nummer:
Unter Linux können Sie den Befehl
a2ps
(ASCII to PostScript, 2 = two = to, daher a2ps
) verwenden.
Beispiele:
a2ps -Phpg1 dreieck.py
Die Datei
dreieck.py
wird auf dem Drucker hpg1
ohne Zeilennummern gedruckt.a2ps --line-numbers=1 -Phpg2 dreieck.py newprog.py
Die Dateien
dreieck.py
und newprog.py
werden am Drucker hpg2
mit Zeilennummern gedruckt.a2ps --line-numbers=5 -Phpg3 dreieck.py newprog.py
Die Dateien
dreieck.py
und newprog.py
werden am Drucker hpg3
mit Zeilennummern gedruckt, wobei nur jede fünfte Zeilennummer gedruckt wird.
Weitere Optionen zu
Die meisten IDEs (z.B. eclipse oder netbeans) und viele Editoren bieten ähnliche Möglichkeiten, jedoch passt bei
a2ps
finden Sie in der man
-Page (man a2ps
).Die meisten IDEs (z.B. eclipse oder netbeans) und viele Editoren bieten ähnliche Möglichkeiten, jedoch passt bei
a2ps
der Ausdruck praktisch immer, abgesehen davon, dass a2ps
nur ASCII-versteht und damit Probleme mit Umlauten hat. Sind Umlaute im Source Code (nur in Kommentaren erlaubt), so kann man mit dem Tool iconv
das Encoding für a2ps
anpassen. Obiges Beispiel würde dann so aussehen:iconv -f utf8 -t latin1 dreieck.py -o - | a2ps --stdin=dreieck.py --line-numbers=5 -Phpg3
a2ps
benötigt noch einen Titel für stdin (Option --stdin=title
), weil die Standardausgabe von iconv
von a2ps
gelesen wird.Labels: allgemeines, Aufgabe, POS1-2, POS1-3
Samstag, 1. Oktober 2011
Überlauf mit C-Datentypen in Python
Wenn man z.B. ganze Zahlen mit nur einem Byte (8bit) darstellen will, so hat man den Bereich -128 (-28 - 1) bis +127 (28 - 1 - 1) zur Verfügung, weil üblicherweise die negativen Zahlen im Zweierkomplement dargestellt werden. Hat eine ein Byte große Variable var den Wert 127, so entspricht das binär 011111112. Zählt man 1 dazu, so erhält man binär 100000002. Dieser Wert entspricht aber der Zahl -12810.
-110 entspricht der binären Zahl 111111112 im Zweierkomplement (ansonsten wäre es 28 - 1 also 255). Zählt man zu 111111112 1 dazu, erhält man 1000000002. Da der Einser ganz vorne die 9. Stelle wäre, die in 8bit nicht mehr dargestellt werden kann, so fliegt sie raus und wir bekommen 000000002, also 0.
Das folgende Bespiel zeigt die Verwendung eines C-Datentypen für ein Byte, wo tatsächlich immer nur 8bit verwendet werden. Allerdings kann man nicht unmittelbar mit den Werten rechnen, da diese Werte sonst einfach in den entsprechenden Python-Typ int umgewandelt werden würde und es nicht zu einem Überlauf käme.
Im folgenden Video wird das auch ganz schön erklärt:
-110 entspricht der binären Zahl 111111112 im Zweierkomplement (ansonsten wäre es 28 - 1 also 255). Zählt man zu 111111112 1 dazu, erhält man 1000000002. Da der Einser ganz vorne die 9. Stelle wäre, die in 8bit nicht mehr dargestellt werden kann, so fliegt sie raus und wir bekommen 000000002, also 0.
Das folgende Bespiel zeigt die Verwendung eines C-Datentypen für ein Byte, wo tatsächlich immer nur 8bit verwendet werden. Allerdings kann man nicht unmittelbar mit den Werten rechnen, da diese Werte sonst einfach in den entsprechenden Python-Typ int umgewandelt werden würde und es nicht zu einem Überlauf käme.
import ctypes # see help(ctypes) def inc(var): """increment var by one""" return type(var)(var.value + 1) def dec(var): """decrement var by one""" return type(var)(var.value - 1) if __name__ == '__main__': var = ctypes.c_byte(126) # var = 126 - one byte var = inc(var) # var = 127 print(var.value) var = inc(var) # var = -128 (10000000 binary) print(var.value) var = ctypes.c_byte(-1) # var = -1 - one byte (11111111 binary) var = inc(var) # var = 0 print(var.value)
Im folgenden Video wird das auch ganz schön erklärt:
Labels: allgemeines, Informatik, POS1-2, Python
Abonnieren Posts [Atom]