Sequenzen - Listen Sequenzen Listen: Definition Listen: veränderliche Sequenzen Methoden Attribute Eine Liste von ganzen Zahlen Sequenzen Definition Eine Sequenz ist eine Datenstruktur, in der mehrere Objekte stehen, wobei jede einen Index hat, der von 0 bis zur (Länge der Sequenz)-1 geht. Strings und Listen sind Sequenzen. Sequenzen Slicing s[i:j] (Index j ausgeschlossen) (Index i eingeschlossen) s[:j] bis Offset j (ausgeschlossen) ab Offset i (eingeschlossen) s[i:] Listen: Definition Eine Liste ist eine veränderliche geordnete Sammlung beliebiger Objekte Wir können auf ihre Komponenten über ihre Position ( Index) zugreifen Listen: veränderliche Sequenzen Wir können ihre Komponenten an Ort und Stelle ändern – Teilbereich löschen del L[i;j] – Ein Objekt A bei Index n Einfügen L[n:n] = [A] – Ein Objekt bei Index n ersetzen L[n] = A Methoden: Definition Eine Methode ist eine Funktion, die zu einem Objekt ‘gehört’ Code: obj.methodname obj ist irgendein Objekt – methodname ist der Name einer Methode, die vom Objekt-Typ definiert wird. – Methoden ändern Objekte. Methoden einer Liste L.sort() L.reverse() L.append(a) L.remove(a) aufsteigend sortieren umkehren ein einzelnes Element an das Ende heften ein einzelnes Element aus der liste entfernen Attribute: Definition Ein Attribut ist eine Funktion, die zu einem Objekt ‘gehört’ Code: obj.attributname obj ist irgendein Objekt – attributname ist der Name eines Attributes, das vom Objekt-Typ definiert wird. – Attribute geben Eigenschaften des Objektes zurück. Attribut einer Liste L.index(a) gibt das Offset von a in L zurück Eine Liste von ganzen Zahlen erstellen Die Funktion range() erzeugt eine regelmäßige Liste von ganzen Zahlen. Sie kann mit einem, zwei oder mit drei Parametern aufgerufen werden. Die Funktion range() Angabe von drei Parametern: – Die Liste beginnt beim ersten Parameter – Sie endet vor dem zweiten Parameter – Die Schrittweite wird mit dem dritten Parameter angegeben. Angabe von zwei Parametern: Die Liste beginnt beim ersten Parameter – Sie endet vor dem zweiten Parameter – Als Schrittweite wird 1 angenommen. – Angabe von einem Parameter: – Die Liste beginnt bei 0 – Sie endet vor dem angegebenen Parameter – Als Schrittweite wird 1 angenommen. Echten Teiler einer natürlichen Zahl ● ● Die echten Teiler der natürlichen Zahl n sind die Teiler von n ohne die Zahl n selbst. Die echten Teiler von 220 sind 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 und 110. Das Programm echteteiler.py Das Programm echteteiler.py Funktionen und Prozeduren Definitionen Vorteile Eingebaute Funktionen Algorithmus Funktionen herstellen Definitionen ● ● ● ● ● ● Funktionen sind Objekte, die einen Namen besitzen. Funktionen werden in Ausdrücken abgerufen. Sie akzeptieren durchgereichte Werte: die Argumente. Sie geben Ergebnisse zurück. Funktionen sind ein Instrument, das eine Reihe von Anweisungen so zusammenfasst, dass sie mehr als einmal in einem Programm gestartet werden können. Funktionen lassen auch Argumente spezifizieren, die jedes Mal, wenn der Code abläuft, unterschiedlich sein können. Eine Funktion ,die ihre Aufgabe ohne einen sinnvollen Ergebniswert erledigt wird Prozedur genannt. Vorteile ● Codewiederverwendung – Abläufe an mehreren Stellen und mehrere Male verwenden ● Prozedurale Zerlegung – Zerlegen von Systemen in Teile mit wohldefinierten Rollen. – Es ist einfacher, kleinere Aufgaben einzeln zu implementieren. Eingebaute Funktionen ● ● ● ● Input raw_input len min ● ● ● ● max int float str Funktionen in Python ● ● def erstellt ein Funktions-Objekt und weist es einem Namen zu return sendet ein Ergebnis-Objekt zurück zum Aufrufer. Liste der echten Teiler einer natürlichen Zahl Das Programm Die Funktion Summe einer Zahlenliste ● Die Funktion SUMMEVON(LISTE) rechnet die Summe der Zahlen der LISTE Befreundete Zahlen Zwei verschiedene natürliche Zahlen, von denen wechselseitig jeweils eine Zahl gleich der Summe der echten Teiler der anderen Zahl ist, bilden ein Paar befreundeter Zahlen. Das kleinste befreundete Zahlenpaar wird von den Zahlen 220 und 284 gebildet. 220 = 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284 284 = 1 + 2 + 4 + 71 + 142 = 220. Das Programm befreundete Zahlen ECHTETEILERVON(ZAHL) SUMMEVON(LISTE) ISTFREUNDVON(ZAHL) Befreundete Zahlen in einem Intervall Lokale und Globale Variablen Erklärungen Beispiel Lokale und Globale Variablen: Erklärungen ● ● Damit die Schnittstellen einer Funktion überschaubar bleiben, beeinflusst die Manipulation einer Variable innerhalb einer Funktion den Rest des Programms normalerweise nicht. In Python ist das dadurch realisiert, dass jede Funktion einen eigenen Namensraum hat, der beim Aufruf neu erzeugt wird und verschwindet, wenn sie fertig ist. Dieser Namensraum heißt lokal. Lokale und Globale Variablen: Beispiel Zahl: 20 Zahl: 21 Rekursivität Definition Beispiel Algorithmen Rekursivität: Definition ● Eine Funktion (Prozedur), die erneut aufgerufen wird, bevor ein vorheriger Aufruf beendet ist, ist rekursiv Rekursivität: Beispiel ● Die Prozedur zaehlenbis(Zahl) – Falls Zahl dann Zaehlenbis(Zahl-1) – Zahl schreiben Rekursivität: Beispiel 0;1;2;3;4; 0;1;2;3; 0;1;2; 0;1; 0; Algorithmen ggt(Zahl) Fakultaet(Zahl) ggt(Zahl) ● Funktion ggt(Zahl1,Zahl2) – Rest Rest der Division von Zahl1 durch Zahl2 – Falls Rest Dann Zahl2 ggt(Zahl2;Rest) – Rückgabe von Zahl2 fakultaet(Zahl) ● Zahl Produkt Funktion fakultaet(Zahl) 4 1*2*3*4 – Produkt 1 3 1*2*3 – Falls Zahl 2 1*2 1 1*1 0 1 Dann Produkt Zahl*fakultaet(Zahl-1) – Rückgabe von Produkt Übung Das Problem aendert(CodeInZeichen) WiederholungVon(EingegebenerCode) Das Problem ● Ein Bankdirektor stellte auf dem Ziffernschloß zum Tresorraum die Codezahl 1986 ein. Aus Sicherheitsgründen sollte der Code täglich geändert werden. Dazu dachte sich der Direktor folgende Methode aus: Er bildete die Summe der aktuellen vier Ziffern (am ersten Tag also 24) und fügte die Einerstelle dieser Summe (bei 24 also 4) der Codezahl rechts an, dafür wurde die erste linksstehende Ziffer (am ersten Tag die 1) gestrichen. Das Problem ● ● Nun wollte der Bankdirektor wissen, ob bei diesem Vorgehen die Zahl 1986 noch einmal als Code auftreten werde. Als ihm dies ein Computerexperte bestätigte, interessierte er sich brennend dafür, wieviel Tage vergehen werden, bis die Codezahl wieder 1986 lautet. Kannst Du ihm weiterhelfen? Wieviel Tage vergehen, geht man vom Code 2006 aus? aendert(CodeInZeichen) ● ● SummeZiffer 0 CodeInZeichen durchlaufen – Ziffer das Zeichen als Integer – SummeZiffer SummeZiffer +Ziffer CodeInZeichen SummeZiffer Ziffer "1986" 0 1 "1986" 1 9 "1986" 10 8 "1986" 18 6 "1986" 24 aendert(CodeInZeichen) ● ● ● LetztesZeichen Das letzte Zeichen von SummeZiffer Das erste Zeichen von CodeInZeichen entfernen, LetztesZeichen hinzufügen und das Ergebnis in NeuerCode speichern NeuerCode zurückgeben CodeInZeichen SummeZiffer LetztesZeichen NeuerCode "1986" 24 "4" 9864 aendert(CodeInZeichen) WiederholungVon(EingegebenerCode) Beispiele WiederholungVon(EingegebenerCode) ● ● ● ● Tage 0 NeuerCode aendert(EingegebenerCode) Tage Tage + 1 Solange NeuerCode verschieden von EingegebenerCode – NeuerCode aendert(NeuerCode) – Tage Tage + 1 ● Tage zurückgeen WiederholungVon(EingegebenerCode) Algorithmus Eine Funktion die doppelte Einträge in einer Liste löscht Beispiel >>> loeschedoppelte(["a",3, [4,5],"a","3",4,4,4,4,"Jules","Marie","Jules",5]) ['a', 3, [4, 5], '3', 4, 'Jules', 'Marie', 5] Pseudocode Funktion loeschdoppelte(eintraege) neueliste [] eintraege durchlaufen und jedes Element in etwas speichern Falls etwas nicht in neueliste ist Dann etwas am Ende von neueliste hinzufügen neueliste zurückgeben Code Algorithmus Eine Funktion, die das Skalaprodukt von zwei Vektoren berechnet. Beispiel Pseudocode Funktion skalarproduktvon(V1,V2) produkt Zahl bei Index 0 in V1 * Zahl bei Index 0 in V2 + Zahl bei Index 1 in V1 * Zahl bei Index 1 in V2 produkt zurückgeben Code Algorithmus Das versteckte Wort Das versteckte Wort ● ● ● ● Der Anwender soll ein verstecktes Wort raten. Die Anzahl der Buchstaben im Wort bestimmt wie viele Eingaben er machen darf. Die gefundenen Zeichen erscheinen nach jeder Eingabe an der richtigen Stelle im Wort. Der Spieler erfährt am Ende des Spiels ob er das versteckte Wort gefunden hat. Ist es nicht der Fall dann wird ihm das versteckte Wort gezeigt Ausführung Voici le mot caché: ************ Vous proposez la lettre i Voici le mot caché: i*form**i*** Vous proposez la lettre t Voici le mot caché: i*******i*** Vous proposez la lettre f Voici le mot caché: i*form*ti*** Vous proposez la lettre e Voici le mot caché: i*f*****i*** Vous proposez la lettre x Voici le mot caché: i*form*ti**e Vous proposez la lettre a Voici le mot caché: i*f*****i*** Vous proposez la lettre o Voici le mot caché: i*formati**e Vous proposez la lettre n Voici le mot caché: i*fo****i*** Vous proposez la lettre r Voici le mot caché: informati**e Vous proposez la lettre q Voici le mot caché: i*for***i*** Vous proposez la lettre m Voici le mot caché: informatiq*e Vous proposez la lettre u bravo vous avez trouvé le mot caché! Analyse Dialog mit dem Anwender: Eingabe: das, was bis jetzt gefunden worden ist Ausgabe: ein Zeichen Ein gefundenes Zeichen vom versteckten Wort an den richtigen Platz im angezeigten Wort platzieren Eingabe: ein Zeichen Ausgabe: das, was bis jetzt gefunden worden ist Das gefundene Wort mit dem versteckten Wort vergleichen Eingaben: das gefundene Wort das versteckte Wort Ausgabe: wahr oder falsch Analyse DIALOGMITANWAENDER(SchonGefunden) ERSETZEN(InGefunden, Zeichen, VonVersteckt) IST(Gefunden, Versteckt) Dialog mit dem Anwender Dialog mit dem Anwender: Eingabe: das, was bis jetzt gefunden worden ist Ausgabe: ein Zeichen DIALOGMITANWAENDER(SchonGefunden) Schreiben “Voici le mot caché” Schreiben SchonGefunden Schreiben “Vous proposez la lettre: “ Eingabe lesen und in Zeichen speichern Zeichen zurückgeben Ein gefundenes Zeichen platzieren Ein gefundenes Zeichen vom versteckten Wort an den richtigen Platz im angezeigten Wort platzieren Eingabe: ein Zeichen Ausgabe: das, was bis jetzt gefunden worden ist ERSETZEN(InGefunden, Zeichen, VonVersteckt) Index 0 solange Index < Länge von VonVersteckt tue: falls Zeichen sich bei Index in VonVersteckt befindet dann * bei Index in InGefunden durch Zeichen ersetzen Index Index + 1 InGefunden züruckgeben Ein gefundenes Zeichen platzieren ERSETZEN(InGefunden, Zeichen, VonVersteckt) Index 0 solange Index < Länge von VonVersteckt tue: falls Zeichen sich bei Index in VonVersteckt befindet dann * bei Index in InGefunden durch Zeichen ersetzen Index Index + 1 InGefunden züruckgeben Vergleichen Das gefundene Wort mit dem versteckten Wort vergleichen Eingaben: das gefundene Wort das versteckte Wort Ausgabe: wahr oder falsch IST(Gefunden, Versteckt) Falls Gefunden ist Versteckt dann Ausgabe wahr else Ausgabe falsch Ausgabe zurückgeben Pseudocode Spiel Versteckt „INFORMATIK“ Versuche Länge von Versteckt Geraten so viel „*“ wie Zeichen in Versteckt Solange nicht IST(Geraten, Versteckt) und Versuche >0 tue: Zeichen DIALOGMITANWAENDER(Geraten) Geraten ERSETZEN(Geraten, Zeichen, Versteckt) Versuche Versuche - 1 Falls IST(Geraten, Versteckt) Dann schreiben „Bravo vous avez trouvé le mot caché“ Sonst schreiben „Pas de chance le mot caché était: „, Versteckt code Spiel