Pythonskripte Inf4St. Teil II

UML-Entwurf der Klasse „Stack“ in Modelio:

Übertragen der UML-Datei in Pycharm:

Methodensignaturen ohne Rückgabewerte

class Stack:
    def __init__(self):
        pass

    def pop(self):
        pass

    def peek(self):
        pass

    def push(self, inhalt):
        pass

    def getStacklistenlaenge(self):
        pass

    def istLeer(self):
        pass
Vollständige Implementierung des Stacks:
class Stack:
    def __init__(self):
        self.stackliste = []
        self.stacklistenlaenge = 0

    def pop(self):
        if self.istLeer() == False:
            self.stacklistenlaenge = self.stacklistenlaenge -1
            return self.stackliste.pop()

    def peek(self):
        if self.istLeer() == False:
            return self.stackliste[self.stacklistenlaenge-1]

    def push(self, inhalt):
        self.stackliste.append(inhalt)
        self.stacklistenlaenge = self.stacklistenlaenge + 1

    def getStacklistenlaenge(self):
        return self.stacklistenlaenge

    def istLeer(self):
        if self.stacklistenlaenge <= 0:
            return True
        else:
            return False

UML-Entwurf Browser-Funktionalität „Vorwärts / Rückwärts“

Vollständige Implementierung der Funktionalität:
class Stack:
    def __init__(self):
        self.stackliste = []
        self.stacklistenlaenge = 0

    def pop(self):
        if self.istLeer() == False:
            self.stacklistenlaenge = self.stacklistenlaenge -1
            return self.stackliste.pop()

    def peek(self):
        if self.istLeer() == False:
            return self.stackliste[self.stacklistenlaenge-1]

    def push(self, inhalt):
        self.stackliste.append(inhalt)
        self.stacklistenlaenge = self.stacklistenlaenge + 1

    def getStacklistenlaenge(self):
        return self.stacklistenlaenge

    def istLeer(self):
        if self.stacklistenlaenge <= 0:
            return True
        else:
            return False

class Browsersimulation:
    def __init__(self):
        self.vorwaertsStack = Stack()
        self.rueckwaertsStack = Stack()

    def vorwaertsKnopf(self):
        self.temp = self.vorwaertsStack.peek()
        self.rueckwaertsStack.push(self.temp)
        self.vorwaertsStack.pop()

    def rueckwaertsKnopf(self):
        self.temp = self.rueckwaertsStack.peek()
        self.vorwaertsStack.push(self.temp)
        self.rueckwaertsStack.pop()
        # self.vorwaertsStack.push(self.rueckwaertsStack.pop())

    def nutzereingabe(self, userinput):
        self.rueckwaertsStack.push(userinput)
        # nach jeder Nutzereingabe muss der Vorwaertsstack gelöscht werden
        self.vorwaertsStack.stackliste = [] # Verletzung der OOP-Regeln!!

    def ausgabe(self):
        print("------------------")
        print("vorwaertsStack:", self.vorwaertsStack.stackliste)
        print("rückwärtsStack:", self.rueckwaertsStack.stackliste)

test = Browsersimulation()
test.nutzereingabe("http://www.spiegel.de/")
test.nutzereingabe("http://www.zeit.de/")
test.nutzereingabe("http://www.n-tv.de/")
test.ausgabe()
test.rueckwaertsKnopf()
test.ausgabe()
test.vorwaertsKnopf()
test.ausgabe()

Die Instanz „test“ ist hier ein Testobjekt, um die Funktionalität zu überprüfen


UML-Entwurf der Klasse „Queue“ in Modelio:

Vollständige Implementierung der Queue:
class Queue:
    def __init__(self):
        self.queueListe = []
        self.queueListeLaenge = 0

    def enqueue(self, wert):
        self.queueListe.append(wert)
        self.queueListeLaenge+=1

    def dequeue(self):
        if not self.istLeer():
            self.queueListeLaenge-= 1
            return self.queueListe.pop(0)
        else:
            print("Queue leer!")
            return None

    def peek(self):
        if not self.istLeer():
            return self.queueListe[0]
        else:
            print("Queue leer!")
            return None

    def getQueueListenLaenge(self):
        return self.queueListeLaenge

    def istLeer(self):
        return self.queueListeLaenge == 0

Erweiterung der Queue auf eine Queue mit maximaler Länge:

Python-Code mit Vererbung:
class LaengeQueue(Queue):
    def __init__(self):
        super().__init__()
        self.maxQueueListenLaenge = 5

    def enqueue(self, wert):
        if self.queueListeLaenge < self.maxQueueListenLaenge:
            self.queueListe.append(wert)
            self.queueListeLaenge+=1
        else:
            print("maximale Laenge erreicht:", self.queueListe)

Übung zur Vererbung: UML von Minecraft-Charakteren

(beispielhafter Entwurf einiger Klassen; nach einer Einzelstunde noch unvollständig)


Binary-Tree Datentyp als Klasse

class BTNode:
    def __init__(self, wert):
        self.wert = wert
        self.Zeigerlinks = None
        self.Zeigerrechts = None

    def insert(self, wert):
        if wert<self.wert:
            if self.Zeigerlinks is None:
                self.Zeigerlinks = BTNode(wert)
            else:
                self.Zeigerlinks.insert(wert)
        if wert>self.wert:
            if self.Zeigerrechts is None:
                self.Zeigerrechts = BTNode(wert)
            else:
                self.Zeigerrechts.insert(wert)

    def delete(self, wert):
        pass

    def findeWert(self, wert):
        pass

    def printTree(self):
        print(self.wert)
        if self.Zeigerrechts != None:
            print("nach rechts:" )
            self.Zeigerrechts.printTree()
        if self.Zeigerlinks != None:
            print("nach links:" )
            self.Zeigerlinks.printTree()

test = BTNode(13)
test.printTree()
test.insert(5)
test.insert(20)
test.insert(4)
test.insert(7)
test.insert(15)
test.insert(24)
print("-------------------------")
test.printTree()