Donnerstag, 24. Oktober 2013

 

C# Threads (POS1: 4BHIF)

Abgabename: 2013_4bhif_aufgabe3_name_vorname.zip

Im folgenden Code werden Primzahlen berechnet. Ihre Aufgabe ist es aus diesem Code eine Multithreaded Version zu entwickeln. Die Anzahl der Threads und der Höchstwert der Primzahlen soll über Befehlszeilenargumente einstellbar sein. Testen Sie das Programm mit verschiedenen Höchstwerten und Threadanzahlen. (Zumindestens einmal mit einer Anzahl die den Prozessoren des Systems entsprechen) Erzeugen Sie mit den Ergebnissen eine Tabelle die die Zeiten gegen die der Single-Thread-Version vergleicht. (manuell z.B. in Excel oder auch im Programm)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Diagnostics;
 
namespace Primzahlen
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch watch = new Stopwatch();
            int maxPrim = 0;
            int number = 0;
            int tests = 0;
            watch.Start();
            Prim(1600000, out maxPrim, out number, out tests);
            watch.Stop();
            Console.WriteLine("Es wurden {0} Primzahlen gefunden", number);
            Console.WriteLine("Die höchste gefundene Primzahl ist {0}", maxPrim);
            Console.WriteLine("Die Laufzeit betrug {0:F0} Millisekungen",
                              watch.ElapsedMilliseconds);
            Console.WriteLine("Es wurden {0} Vergleiche durchgeführt", tests);
        }
 
        private static void Prim(int max, out int maxPrim, out int number, out int tests)
        {
            List<int> prims = new List<int>();
            int i = 5;
            tests = 0;
            prims.Add(2);
            prims.Add(3);
            while (i < max)
            {
                int maxTeiler = (int)Math.Sqrt(i) + 1;
                int j = 0;
                while (true)
                {
                    int n = prims[j];
                    int rest = (i % n);
                    ++tests;
                    if (rest == 0)
                        break; //keine Primzahl
                    if(n >= maxTeiler)
                    {
                        prims.Add(i);
                        break;
                    }
                    ++j;
                }
                i += 2;
            }
            number = prims.Count;
            maxPrim = prims[number - 1];
        }
    }
}

Beispieltabelle für Ausgabe:

max Primzahl    nr. Primzahlen     ein Thread      zwei Threads      vier Threads
100000          9592               44ms            60ms              80ms
200000          17984              95ms            98ms              104ms
400000          33860              223ms           227ms             230ms
 
...
 
51200000        3068712            106000ms        61300ms           32940ms

Labels: , ,


Montag, 21. Oktober 2013

 

Testen und erweitern von text_analyzer.py (POS1: 2BHIF)

Abgabename: 2013_2bhif_aufgabe5_name_vorname.tgz

Ziel dieser Aufgabe ist es, fremden Code zu testen, zu verstehen und zu erweitern. Dazu werden Sie text_analyzer.py von zwei Mitschülern testen und um unten beschriebene Funktionalität erweitern. Schreiben Sie dazu ein Modul test_text_analyzer, welches die Funktionen vom Modul text_analyzer importiert und testet.

Protokollieren Sie die Testläufe und beschreiben Sie die eventuell gefundenen Fehler in einer Textdatei errors.txt. Haben Sie Fehler entdeckt, so korrigieren Sie diese, sodass die Tests fehlerfrei laufen.

Sollten Ihre Tests Fehler enthalten, so korrigieren sie diese ebenfalls (solche Fehler werden Sie u.U. erst finden, wenn Sie das zweite Programm testen).

Ergänzen Sie die Funktionalität von text_analyzer um die Funktion read_sentences(file), welche aus der geöffneten Datei file (d.h. die Datei muss vor dem Aufruf dieser Funktion geöffnet werden) Zeilen liest und in der selben Form wie die bereits bestehende Funktion input_sentences() liefert.

Ändern/Ergänzen Sie text_analyzer um ein main, welches prüft, ob Dateinamen auf der Kommandozeile angegeben wurden, diese Dateien der Reihe nach öffnet und das (End-)Ergebnis der Funktionen analyze_words(lst) und sort_letters(dic) ausgibt. Weiters sollen auch die Häufigkeiten der Worte, absteigend sortiert nach Häufigkeit (genau wie sort_letters(dic)) ausgegeben werden (braucht man eine neue Funktion?). Dabei soll die Ausgabe formatiert sein (also nicht nur die Listen bzw. Dictionaries ausgeben).
Werden keine Dateinamen angegeben, so ist wieder von der Konsole zu lesen.
Die Option -h gibt eine kurze Hilfe aus.

Die Einteilung der Gruppen finden Sie in der Schule unter
/home/teachers/hp/public/2bhif/2013_2bhif_aufgabe5_gruppeneinteilung.pdf.

Labels: , , ,


Freitag, 11. Oktober 2013

 

Aufgabe newprog.py (POS1: 2BHIF)

Abgabename: 2013_2bhif_aufgabe4_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: , ,


Mittwoch, 9. Oktober 2013

 

Musterlösung zu Aufgabe 2 "Denksport mit Python, erste Anwendung von Mercurial" (POS1: 2BHIF)

Mögliche Lösungen zur Aufgabe 2 "Denksport mit Python, erste Anwendung von Mercurial sind (nur die Python-Scrips):
#!/usr/bin/env python3
"""
 File:    pythagorean_triple.py
 Desc:    Ein Programm zur Bestimmung eines pythagoräischen Tripel (a2+b2=c2
          für a < b < c), wobei a+b+c == 1000.
 Created: 2013-09-23, Harald R. Haberstroh
"""
from sys import argv
from math import sqrt


if __name__ == '__main__':
    summe = 1000
    if len(argv) == 2:
        summe = int(argv[1])
    for a in range(1, summe // 3):
        for b in range(a + 1, summe // 2):
            a2 = a * a
            b2 = b * b
            c2 = a2 + b2
            c = sqrt(c2)
            if a < b < c and a + b + c == summe:
                print(a, b, int(c))
                print(int(a * b * c))
#!/usr/bin/env python3
"""
 File:    sumdigits2pow1000.py
 Desc:    calculate the sum of the digits of 2**1000 (exponent can be changed
          with commandline argument)
 Created: 2013-09-23, Harald R. Haberstroh
"""

from sys import argv

if __name__ == '__main__':
    if len(argv) == 2:
        exponent = int(argv[1])
    else:
        exponent = 1000
    print(sum(list(map(int, list(str(2 ** exponent))))))
#!/usr/bin/env python3
"""
 File:    sumdigitsfact.py
 Desc:    calculate the sum of the digits of 100! (100 can be changed
          with commandline argument)
 Created: 2013-09-23, Harald R. Haberstroh
"""

from sys import argv

def fact(n):
    """n!"""
    f = 1
    for i in range(1, n + 1):
        f *= i
    return f

if __name__ == '__main__':
    if len(argv) == 2:
        n = int(argv[1])
    else:
        n = 100
    print(sum(list(map(int, list(str(fact(n)))))))

Die Palindrom-Beispiele sind ganz ähnlich und wurden daher in ein Programm gepackt, bei dem man als Parameter auf der Kommandozeile die Anzahl der Stellen angeben kann (4, 6, 8). Zusätzlich kann noch '-l' angegeben werden, um eine Liste der Produkte zu erhalten. Die Ergebnisliste ist nicht ganz vollständig, denn es wird das Ergebnis des Produkts als Schlüssel verwendet. Damit gehen Lösungen wie zum Beispiel 111111 = 143 * 777 = 231 * 481 = 259 * 429 verloren.
#!/usr/bin/env python3
"""
 File:    palindrome.py
 Desc:    largest palindrome of product of two n/2-digit numbers with n digits
 Created: 2013-09-23, Harald R. Haberstroh
"""

from sys import argv

def checkPalindrom(s):
    """
    checks whether string is a palindrome
    """
    l = len(s)
    for i in range(l // 2):
        if s[i] != s[l - i - 1]:
            return False
    return True

def genPalindrom(n):
    """
    build palindrome out of products
    """
    # Dictionary only for list of palindromes not for maximum
    palindromes = {}
    products = []
    maxPalindrome = 0
    maxPalindromeFactors = ""
    for i in range(10**((n - 1) // 2), 10 ** (n // 2)):
        for j in range(10**((n - 1) // 2), 10 ** (n // 2)):
            product = str(i * j)
            if checkPalindrom(product):
                if not product in palindromes:
                    palindromes[product] = str(i) + " * " + str(j) + " = " + product
                    products.append(product)
                    if int(product) > maxPalindrome:
                        maxPalindrome = int(product)
                        maxPalindromeFactors = str(i) + " * " + str(j) + " = " + product
    return maxPalindromeFactors, palindromes

if __name__ == '__main__':
    n = 2
    if len(argv) > 1:
        n = int(argv[1])
    maxPalindrome, palindromes = genPalindrom(n)
    if "-l" in argv:
        lstPalindromes = list(palindromes.values())
        lstPalindromes.sort()
        for palindrome in lstPalindromes:
            print(palindrome)
    print("largest palindrome: %s" % maxPalindrome)

Labels: , ,


 

Musterlösung zu Wiederholung Python (POS1: 2BHIF)

Eine mögliche Lösung zur Aufgabe Wiederholung Python (POS1: 2BHIF) ist folgende:
"""
text_analyzer.py
Task 1: Repeat previous material (1st class)
2012-09-10, Harald R. Haberstroh (hp@htlwrn.ac.at)
"""


def input_sentences():
    '''returns al list of sentences/lines'''
    lst = []
    eof = False
    while not eof:
        try:
            line = input("Satz: ")
            lst.append(line)
        except EOFError:
            eof = True
    return lst


def _remove_punctuation(string):
    '''helper removes all punctuation marks within string'''
    for punctuation in '''"',;.:-''':
        string = string.replace(punctuation, " ")
    return string


def split_sentences(lst):
    '''split a list (lst) of sentences into list of list of words'''
    wordlist = []
    for sentence in lst:
        wordlist.append(_remove_punctuation(sentence).split())
    return wordlist


def purge_bad_words(lst):
    '''remove all bad words (length less than 2 chars, words
    containing non alphabetic chars)
    '''
    for sublist in lst:
        idx = 0
        while idx < len(sublist):
            if not len(sublist[idx]) >= 2 or not sublist[idx].isalpha():
                del(sublist[idx])
            else:
                idx += 1
    return lst


def analyze_words(lst):
    '''returns a dictionary of words (with the number of occurrences)
    of the list of list of words'''
    dict = {}
    for sublist in lst:
        for word in sublist:
            word = word.lower()
            if word in dict:
                dict[word] += 1
            else:
                dict[word] = 1
    return dict

def analyze_letters(lst):
    '''returns a dictionary of letters (with the number of occurrences)
    of the list of list of words'''
    dict = {}
    for sublist in lst:
        for word in sublist:
            for char in word.lower():
                if char in dict:
                    dict[char] += 1
                else:
                    dict[char] = 1
    return dict
                

def purge_analyzed_letters(dic):
    '''remove umlauts'''
    for umlaut in "äöüß":
        if umlaut in dic:
            del(dic[umlaut])
    return dic


def _key(tupl):
    '''returns 2nd element of tuple for sorting'''
    return tupl[1]


def sort_letters(dic):
    '''returns a sorted list of tuples of letters, sorted by
    number of letters'''
    tuples = list(dic.items())
    tuples.sort(key=_key, reverse=True)
    return tuples


def test_input():
    '''returns a fixed list of sentences for testing purposes'''
    return ['Maxi und Mini verliefen sich im Wald, aber bald.',
        '10 alte Fledermäuse flogen im Wald',
        'Hat die alte Meisterhexe...',
        "Seid's gewesen. Denn als Geister...",
        'Erst hervor der alte Meister.']


if __name__ == '__main__':
    #lst = input_sentences()
    lst = test_input()
    
    print('split_sentences(lst)')
    wordlist = split_sentences(lst)
    print(wordlist)
    
    print('\npurge_bad_words(wordlist)')
    wordlist = purge_bad_words(wordlist)
    print(wordlist)

    print('\nanalyze_words(wordlist)')
    print(analyze_words(wordlist))

    print('\nanalyze_letters(wordlist)')
    dic = analyze_letters(wordlist)
    print(dic)

    print('\npurge_analyzed_letters(dic)')
    dic = purge_analyzed_letters(dic)
    print(dic)

    print('\nsort_letters(dic)')
    sorted_letters = sort_letters(dic)
    print(sorted_letters)

    print('\n\n*** task 9 ***\n')
    print('''"abcdef".index("c")''') # ValueError: substring not found
    print('''ValueError: substring not found''')
    print('''"abcdef".index("g")''') # ValueError: substring not found
    print('''ValueError: substring not found''')
    print('''"abcdef".index("de")''')
    print("abcdef".index("de"))
    print('''"c" in "abcdef" ''')
    print("c" in "abcdef")
    print('''"g" in "abcdef" ''')
    print("g" in "abcdef")
    print('''"de" in "abcdef" ''')
    print("de" in "abcdef")
    print('''"abcdef"[2:4]''')
    print("abcdef"[2:4])
    print('''"abcdef"[2:]''')
    print("abcdef"[2:])
    print('''"abcdef"[-1]''')
    print("abcdef"[-1])
    print('''"abcdef"[2:-1]''')
    print("abcdef"[2:-1])
    print('''[1, 2, 3, 4, 5].index(3)''')
    print([1, 2, 3, 4, 5].index(3))
    print('''[1, 2, 3, 4, 5].index(9)''') # ValueError: 9 is not in list
    print('''ValueError: 9 is not in list''')
    print('''[1, 2, 3, 4, 5][5]''') # IndexError: list index out of range
    print('''IndexError: list index out of range''')
    print('''[1, 2, 3, 4, 5][2:4]''')
    print([1, 2, 3, 4, 5][2:4])
    print('''[1, 2, 3, 4, 5][-2]''')
    print([1, 2, 3, 4, 5][-2])
    print('''[1, 2, 3, 4, 5][5:9]''')
    print([1, 2, 3, 4, 5][5:9])
    print('''[1, 2, 3, 4, 5][4:]''')
    print([1, 2, 3, 4, 5][4:])
    print('''len("abc") + len(range(3)) + len({1, 2, 3}) + len({1: 2, 2: 3})''')
    print(len("abc") + len(range(3)) + len({1, 2, 3}) + len({1: 2, 2: 3}))

Labels: , ,


Dienstag, 8. Oktober 2013

 

C# programmieren (POS1: 4BHIF)

Abgabename: 2013_4bhif_aufgabe2_name_vorname.zip
Verwenden Sie eine Projektmappe und teilen Sie die Aufgaben in Projekte oder machen Sie ein einziges Projekt, bei dem man aber irgendwie auswählen kann, welche Teilaufgabe gestartet wird.

Sie haben nun schon zwei Jahre Java und ein Jahr Python programmiert. Nun geht es darum das bereits erworbene Können möglichst schnell auf die Sprache C# zu übertragen. Dazu sind kurze einfache Aufgabenstellungen gut geeignet. Es folgt nun eine Liste von Aufgabenstellungen für Konsolenprogramme. Sie dürfen Ihre Progrämmchen auch mit einer GUI versehen, gefordert ist das jedoch nicht.

  1. Hello World
    Richten Sie Ihr Visual Studio so ein, dass alle Ihre Dateien automatisch einen Header mit Ihrem Namen, Klasse usw. enthalten.
    Erstellen Sie dann ein "Hello World"-Programm. Dieses Programm soll "Hello World!" ausgeben, wenn keine Kommandozeilenparameter angegeben wurden, anderenfalls sollen die Parameter als Namen interpretiert werden, die dann gegrüßt werden. Dabei sollen immer zwei Namen paarweise ausgegeben werden (siehe Beispiel).
    Aufruf
    hello.exe Toni Barbara Klaus
    
    Ausgabe
    Hello Toni und Barbara!
    Hello Klaus!
    
  2. ISBN/EAN
    Schreiben Sie eine Methode, welche die Prüfziffern von ISBN (Internationale Standardbuchnummer) bzw. EAN (European Article Number) prüfen kann. Dabei wird die Prüfziffer (als String) eingegeben, von welcher die Prüfziffer als Rückgabewert ausgegeben wird.
    int GetCheckDigit(string isbnWithoutCheckDigit);
    
    Daraus leitet sich eine zweite Methode ab, welche einen String inklusive Prüfziffer prüft:
    bool CheckISBN(string isbn);
    
    Diese Methode entfernt alle Trennzeichen (Leerzeichen, Bindestriche).
    Algorithmus:
    1. s = z1 + z2 * 2 + z3 * 3 + ... + z9 * 9
    2. p = s mod 11
    3. Falls p gleich 10, dann ist die Prüfziffer "X" sonst die Ziffer selbst.
    Schreiben Sie analoge Methoden für EAN, ISBN-13 und EAN-13. Informationen zur Berechnung finden Sie im Internet ;-)
  3. Römische Zahlen
    Schreiben Sie Methoden zum Umrechnen von ganzen Zahlen (1 bis 3000) in Römische Zahlen und umgekehrt. Die römischen Ziffern haben folgende Bedeutung:
    I ...    1
    V ...    5
    X ...   10
    L ...   50
    C ...  100
    D ...  500
    M ... 1000
    
    Beachten Sie, dass nur jeweils drei gleiche Ziffern hintereinander geschrieben werden. Stattdessen wird die nächst größere Einheit benutzt und eine Einheit abgezogen (XC = 90, XCIX = 99, IX = 9, VIII = 8).
    Die Prototypen sollen sein:
    string IntToRoman(int number);
    int RomanToInt(string romanNumber);
    
  4. Unit Tests
    Erstellen Sie für die obigen beiden Aufgaben Unit-Tests. Lesen Sie dazu Verifying Code by Using Unit Tests.
  5. Wörter suchen
    Laden Sie sich die gepackte Wortliste herunter. Die Datei enthält nur eine Textdatei deutsch.txt, welche eine sortierte Liste von Wörtern, jeweils ein Wort in einer Zeile enthält (stammt von Firefox). Achtung: der Zeilenumbruch besteht nur aus '\n' (Unix) und die Kodierung ist UTF-8.
    Schreiben Sie eine Methode GetWordList(string word), welche eine Liste von Worten liefert, die mit dem String word beginnen.
    Implementieren Sie sowohl lineare als auch binäre Suche und vergleichen Sie diese.
    Verwenden Sie unterschiedliche Datenstrukturen (die zwei Typen von C#-Arrays und Collections) und vergleichen Sie die Lösungen punkto Laufzeit und Speicherbedarf.
    Schreiben Sie eine weitere Methode GetWordListEnding(string ending), welche eine Liste von Worten liefert, die mit ending endet. Ist hier binäre Suche möglich?
  6. Unit Tests
    Erstellen sie für die obige Aufgabe passende Unit Tests.
  7. Laufzeitmessungen
    Schreiben Sie ein Programm runtime, welches die Laufzeiten der unterschiedlichen Implementierungen von GetWordList(string word) und GetWordListEnding(string ending) ermittelt. Verwenden Sie die Wortanfänge "Distanz", "Erdbi" und "Finanzind" und die Endungen "gulierung", "dcomputer" und "chsdor".
    Das Programm soll bei jedem Test folgende Informationen ausgeben:
    Anzahl der gefundenen Worte und die Laufzeit.
    Bilden Sie die Mittelwerte für die einzelnen Methoden (binäre/sequentielle Suche) bzw. die Implementierungen mit Arrays oder Collections.
    Wie sind die Ergebnisse zu interpretieren?
  8. 25 im Quadrat
    Auf zwölf quadratischen Kärtchen sind die Zahlen 1 bis 12 gedruckt. Diese Kärtchen sollen so in einem Quadrat angeordnet werden, sodass ein 4x4-Quadrat in der Mitte frei bleibt (die Kantenlänge beträgt also 4).
    1. Ermitteln Sie eine Anordnung der Karten, sodass die Summe aller Karten einer Kante (4 Karten) jeweils den Wert 25 ergibt.
    2. Ermitteln Sie die Anzahl der Lösungen.
    3. Ermitteln Sie alle Lösungen (es sind sehr viele!).
    Hinweis: es gibt 12! (~480.000.000) Möglichkeiten, die Kärtchen anzuordnen. Dennoch sollte es in wenigen Minuten möglich sein.

Labels: , ,


Montag, 7. Oktober 2013

 

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

Abgabename: 2013_2bhif_aufgabe3_name_vorname.tgz (nur Kleinbuchstaben)

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]