Montag, 22. Oktober 2012

 

Aufgabe newprog.py (POS1: 2BHIF)

Abgabename: 2012_2bhif_aufgabe5_Name_Vorname.tgz

Neue Programmdateien haben im Allgemeinen eine ziemlich fixe (Anfangs-)Struktur. So wird immer ein Programmkopf (Kommentar) benötigt, der den Namen des Autors und andere Informationen enthält. Für Python sieht das z.B. so aus:

"""
author: Maier Maria
matnr:  d84123
file:   newprog.py
desc:   Erstellen eines Programmgerüsts aus einer Vorlage.
date:   2010-10-22
class:  5AHDVK
catnr:  23
"""

Schreiben Sie ein Pythonprogramm newprog.py, welches aus einer Vorgabedatei so ein Programmgerüst erzeugt. In dieser Vorgabedatei gibt es Wörter, die dann von newprog.py durch die entsprechenden Werte ersetzt werden. Obiges Gerüst ist aus folgender Vorgabedatei entstanden:

"""
author: AUTOR
matnr:  EVIDENZNUMMER
file:   DATEINAME
desc:   ZWECK
date:   DATUM
class:  KLASSE
catnr:  KATALOGNUMMER
"""

if __name__ == '__main__':
    pass

Für die Ersetzungen soll ein Dictionary verwendet werden, z.B.:

ersetzungen = {
    "DATEINAME": progname,
    "ZWECK": zweck,
    "DATUM": datum,
    "AUTOR": "Maier Maria",
    "KATALOGNUMMER": "23",
    "EVIDENZNUMMER": "d84123",
    "KLASSE": "5AHDVK"
}

progname, zweck, datum müssen natürlich vorher bestimmt werden (eingegeben).

Zur Bestimmung des Datums verwenden Sie strftime():

from time import strftime
datum = strftime("%F")

strftime() kennt verschiedenste Formatangaben und liefert die aktuelle Uhrzeit bzw. Datum formatiert zurück. Hilfe mit help(strftime) in Python bzw. man strftime von der Shell (liefert die Beschreibung der C-Funktion, aber die Formatangaben gelten auch für Python).

Die Vorgabedatei und der Name der zu erzeugenden Datei sind auf der Kommandozeile anzugeben, z.B.:

~/work/tmp > python newprog.py vorgabe.py meinNeuesProgramm.py
~/work/tmp >

Wird keine Vorgabedatei angegeben, so wird eine Standardvorgabedatei verwendet:

~/work/tmp > python newprog.py meinNeuesProgramm.py
~/work/tmp >

Falls meinNeuesProgramm.py schon existiert, dann darf diese Datei nicht überschrieben werden:

~/work/tmp > python newprog.py meinNeuesProgramm.py
'meinNeuesProgramm.py' already exists!
~/work/tmp >

Sie können dazu folgende Funktion verwenden (Aufrufbeispiel im Home-Verzeichnis):

>>> from os.path import exists
>>> exists(".bashrc")
True
>>> exists(".bashrc__")
False
>>> 

Labels: , ,


Donnerstag, 18. Oktober 2012

 

Aufgabe Unit-Tests (POS1: 3BHIF)

Abgabename: 2012_3bhif_aufgabe3_Name_Vorname.tgz

In einem Online-Shop wird unter anderem ein Warenkorb benötigt. Schreiben Sie Unit-Tests zu folgendem Interface (welches Sie natürlich auch implementieren müssen):
import java.util.Iterator;

/**
 * @author (c) 2012, Harald R. Haberstroh 18.10.2012
 */
public interface ShoppingCart {

    /**
     * legt die übergebene Anzahl von Elementen in den Warenkorb
     *
     * @param anItem
     *          Element
     * @param quantity
     *          Anzahl
     * @throws NegativeCountException
     *           negative Anzahl gibt's nicht
     */
    public void addItems(Item anItem, int quantity) throws NegativeCountException;

    /**
     * entfernt die Anzahl von Elementen vom Warenkorb.
     *
     * @param anItem
     *          welches Element
     * @param quantity
     *          Anzahl
     * @throws NegativeCountException
     *           negative Anzahl gibt's nicht
     * @throws NoSuchItemException
     *           das Element existiert nicht im Warenkorb
     */
    public void deleteItems(Item anItem, int quantity)
        throws NegativeCountException, NoSuchItemException;

    /**
     * wieviele Element gibt's überhaupt
     *
     * @return Anzahl Elemente
     */
    public int itemCount();
   
    /**
     * Iterator für alle Elemente (siehe Collection-API).
     *
     * @return Iterator über alle Elemente
     */
    public Iterator<Item> iterator();
}
Denken Sie bei der Erstellung der Tests an Grenzfälle, Sonderfälle und erst dann an den "Normalfall".

Labels: , ,


Montag, 15. Oktober 2012

 

Python: Lesen von Datei oder Standardeingabe

Üblicherweise arbeiten Unix-Kommandos sowohl mit der Standardeingabe (Tastatur oder Eingabeumlenkung) als auch mit Dateien. Damit der Algorithmus für die Bearbeitung der gelesenen Eingabe nicht doppelt programmiert werden muss, kann man sich folgenden Tricks bedienen:
from sys import stdin
from sys import argv
if len(argv) > 1:
   file = open(argv[1])
else:
   file = stdin
lines = file.readlines()
print("gelesen:")
print(lines)
Das Beispiel-Script liest alle Zeilen der Eingabe mit file.readlines() in eine Liste. Dabei ist es unerheblich, ob die Eingabe von einer Datei kommt, die auf der Kommandozeile angegeben wurde, oder von der Standardeingabe kommt (kein Dateiname).
sys.stdin verhält sich wie eine Datei, die nur zum Lesen geöffnet wurde, jedoch nur einmal gelesen werden kann (kein sys.stdin.seek(0) möglich).
Variable file verweist also entweder auf die geöffnete Datei oder eben die Standardeingabe. Der Algorithmus zur Bearbeitung der Daten (hier nur Lesen in eine Liste und Ausgeben der Liste) ist identisch.

Beispielaufruf ohne Parameter:
hp@if211l $ python3 stdin.py 
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie 
consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan
et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis 
dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet
gelesen:
['Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie \n',
'consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan\n',
'et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis \n',
'dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet\n']
hp@if211l $ 
Beispielaufruf mit Parameter:
hp@if211l $ python3 stdin.py stdin.py 
gelesen:
['from sys import stdin\n', 'from sys import argv\n', 'if len(argv) > 1:\n',
'   file = open(argv[1])\n', 'else:\n', '   file = stdin\n',
'lines = file.readlines()\n', 'print("gelesen:")\n', 'print(lines)\n']
hp@if211l $

Labels: ,


Sonntag, 7. Oktober 2012

 

Aufgabe Python Kommandozeile, Textdateien lesen (POS1: 2BHIF)

Abgabename: 2012_2bhif_aufgabe4_Name_Vorname.tgz

Schreiben Sie folgendes Pythonprogramm: cut.py, welches einen bestimmten Zeilenbereich der Eingabe (Text) ausgibt (und den Rest unterdrückt). Die Eingabe kann aus beliebig vielen Dateien, die als Kommandozeilenparameter angegeben werden, oder aus der Standardeingabe (Tastatur oder Eingabe umlenkung mit <) bestehen.

Für jede Datei soll dann der als Optionen angegebene Zeilenbereich ausgegeben werden.

Aufruf

cut.py [-f N] [-t N] [-h] [file]...
Falls keine Optionen angegeben werden, dann sollen die ersten 10 Zeilen jeder Datei (oder Standardeingabe) ausgegeben werden.

Optionen

-f N
Der Zeilenbereich beginnt ab Zeile N. Entfällt diese Option, dann beginnt die Ausgabe bei der ersten Zeile.
-t N
Der Zeilenbereich endet bei Zeile N (inklusive). Entfällt diese Option, dann endet die Ausgabe bei der Zeile 10.
-h
Es soll eine kurze Hilfe mit ihrem Namen ausgegeben werden. Zum Beispiel:
cut.py [-f N] [-t N] [file]...
  -f N ... from line N (default 1)
  -t N ... to line N (default 10)
Print given lines of each file.

(c) 2012, Harald R. Haberstroh
Es soll keine weitere Ausgabe erfolgen!

Beispiel

Gegeben sei die Datei 1.txt mit dem Inhalt (Zeilennummern nur zur Orientierung, nicht Inhalt der Datei):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,
no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit 
amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut 
labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam 
et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata 
sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur 
sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore 
magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo 
dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est 
Lorem ipsum dolor sit amet.   
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie 
consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan
et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis 
dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet,
hh@knuth:~$ cut.py -h
cut.py [-f N] [-t N] [file]...
  -f N ... from line N (default 1)
  -t N ... to line N (default 10)
Print given lines of each file.

(c) 2012, Harald R. Haberstroh
hh@knuth:~$ cut.py 1.txt
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,
no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit 
amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut 
labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam 
et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata 
sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur 
sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore 
magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo 
hh@knuth:~$ cut.py -f 3 -t 12 1.txt
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,
no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit 
amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut 
labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam 
et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata 
sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur 
sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore 
magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo 
dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est 
Lorem ipsum dolor sit amet.
hh@knuth:~$ cut.py -t 3 1.txt
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,
Überlegen Sie, was das Programm bei fehlerhaften Angaben machen soll!

Beispiele für fehlerhafte Angaben

Eine ungültige Option wird angegeben:
hh@knuth:~$ cut.py -x 23 1.txt
Es fehlt der Parameter bei den Optionen, hier bei -t:
hh@knuth:~$ cut.py -f 23 -t 1.txt
"To" ist kleiner als "From":
hh@knuth:~$ cut.py -f 23 -t 12 1.txt
Datei existiert nicht:
hh@knuth:~$ cut.py doesntexist.txt

Labels: , ,


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

Abonnieren Posts [Atom]