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: , , ,


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:
  • 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 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: , , ,


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.
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: , , ,


This page is powered by Blogger. Isn't yours?

Abonnieren Posts [Atom]