Caesar-Verschlüsselung

Code-Stücke können hier veröffentlicht werden.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

cofi hat geschrieben:Also: Was willst du hoeren?
Ich denke mal, es geht um grundlegende Entscheidungen bereits bei ganz kleinen Programmen:
- Wie entscheide ich, was ich in eine Funktion hineinpacke?
- Bei objektorientierten Entwürfen: Welche Klassen baue ich etc.?

Meine Empfehlung wäre: Mach es so wie mit dem Cäsar-Snippet. Entwickle deinen Code so wie du ihn für gut hältst und lass dir von anderen, die schon mehr Erfahrung mit der Programmierung haben, dazu etwas sagen. Wenn man das dann nicht einfach unkritisch übernimmt ("Hauptsache es läuft"), sondern sich damit beschäftigt, lernt man dazu.
marlene
User
Beiträge: 26
Registriert: Montag 13. September 2010, 12:11

Ich denke mal, es geht um grundlegende Entscheidungen bereits bei ganz kleinen Programmen:
- Wie entscheide ich, was ich in eine Funktion hineinpacke?
- Bei objektorientierten Entwürfen: Welche Klassen baue ich etc.?

Meine Empfehlung wäre: Mach es so wie mit dem Cäsar-Snippet. Entwickle deinen Code so wie du ihn für gut hältst und lass dir von anderen, die schon mehr Erfahrung mit der Programmierung haben, dazu etwas sagen. Wenn man das dann nicht einfach unkritisch übernimmt ("Hauptsache es läuft"), sondern sich damit beschäftigt, lernt man dazu.
Das hab ich damit gemeint, ob ich vorher schon festlegen sollte wie viele Funktionen, ob OOP etc. Sozusagen Vorbereitungen treffen bevor ich anfange was zu programmieren(auch bei so kleinen Sachen wie mit dem Cäsar-Snippet).
Aber auch Grundlegende Sachen wie z.B. soll ich den Code immer so klein halten wie möglich etc.

@numerix Ich werde mich an deine Empfehlung halten, und von anderen korrigieren lassen und hoffentlich dazu lernen.
BlackJack

@marlene: Wie viele Funktionen man schreiben will, kann man vorher ja gar nicht *genau* festlegen, weil es ja immer passieren kann, dass eine Funktion so lang wird, dass man sie besser aufteilt. Eine grobe Idee was man so braucht kann man sich vorher überlegen, bei Verschlüsselung zum Beispiel eine für die Ver- und eine für die Entschlüsslung. Aber wieviele Hilfsfunktionen man letztendlich schreibt, kann man auch während des Programmierens entscheiden. Wenn Funktionen zu lang werden, kann man sie aufteilen und wenn man irgendwo sich wiederholende Muster im Quelltext entdeckt, kann man die als Funktion herausziehen.

Bei so klein wie möglich ist die Frage was "klein" bedeutet. Ich würde sagen so einfach wie möglich ist ein gutes Ziel. Wobei das natürlich auch zu einem Teil subjektiv ist. Aber das "KISS"-Prinzip -- "Keep It Simple & Stupid" -- wird öfter empfohlen.

Dabei kann "test driven development" (TDD) helfen, bzw. wenn man das nicht konsequent durchhält, zumindest die Funktionen und Klassen so schreiben, dass man sie gut einzeln und isoliert auch automatisiert testen kann. Da würde dann zum Beispiel auch die Vermischung von Programmlogik und Ein-/Ausgabe oder die Endlosrekursion gar nicht erst passieren, denn das lässt sich ja überhaupt nicht gut testen.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

marlene hat geschrieben:Das hab ich damit gemeint, ob ich vorher schon festlegen sollte wie viele Funktionen, ob OOP etc. Sozusagen Vorbereitungen treffen bevor ich anfange was zu programmieren(auch bei so kleinen Sachen wie mit dem Cäsar-Snippet).
Aber auch Grundlegende Sachen wie z.B. soll ich den Code immer so klein halten wie möglich etc.
Wie soll dass den klappen? Ich denke nicht dass es überhaupt möglich ist bei einem nicht-trivialem Projekt soweit voraus zu planen, Software Design ist keine Architektur.

Das einzige was meiner Meinung nach Sinn macht ist dass grundlegende Design zu kennen, man sollte relativ unabhängig von der Sprache erklären können wie die Anwendung aufgebaut sein sollen sowie dessen Funktionsweise erklären können. Wenn man diese Fragen ohne Probleme und ohne groß nachzudenken beantworten kann sind alles andere Details.

Vorallem weil Ich mich auch durchaus oft dabei wieder finde mehrere Implementation eines bestimmten Designs auszuprobieren oder Teile des Designs während der Entwicklung zu ändern. Wenn man sich nicht die Flexibilität nimmt auf zukünftige Erfahrungen oder neues Wissen zu reagieren ist ein Projekt zum scheitern verurteilt, den am Ende weiß man es immer besser als vorher ;)
marlene
User
Beiträge: 26
Registriert: Montag 13. September 2010, 12:11

Zur Zusatzaufgabe:

Hab hier einen Code geschrieben , der Cesar Verschlüsselungen ohne die "Verschiebezahl" zu kennen entschlüsselt.

Code: Alles auswählen

import string

#Datei mit Codierten-Daten vorher erstellen(.txt), und als Parameter(Dateipfad) angeben.
#Das Zeichen, das am haufigsten vorkommt wird ausgegeben.
def einlesen(dateipfad):
    datei = open(dateipfad)
    text = datei.read()
    text.lower()
    dic = {}
    for z in text:
        i = text.count(z)
        dic[i] = z
    buchstabe_max = max(dic.keys())
    print dic[buchstabe_max]
    datei.close()

#Der Index(Buchstabe der am haufigsten vorkommt als Parameter angeben) zum verschieben zu 'e' wird ermittelt.
def index(buchstabe_max):
    buchstabe_max = buchstabe_max
    verschiebe_index = string.ascii_lowercase.index('e')-string.ascii_lowercase.index(buchstabe_max)
    print verschiebe_index

#Eingelesene Textdatei(Parameter) wird um den als Parameter angegebenen Wert verschoben und ausgegeben.    
def verschieben(verschiebe_index, dateipfad):
    datei = open(dateipfad)
    text = datei.read()
    text.lower()
    verschiebe_index = verschiebe_index
    text_ausgabe = []
    for z in text:
        if z not in string.ascii_lowercase:
            text_ausgabe.append(z)
        else:
            a = string.ascii_lowercase.index(z)
            b = a + verschiebe_index
            b = b % len(string.ascii_lowercase)
            text_ausgabe.append(string.ascii_lowercase[b])
    print ''.join(text_ausgabe)
    datei.close()
nja so toll is er wahrscheinlich nicht, über Kritik freu ich mich immer.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

`text.lower()` gibt eine Kopie des Strings wieder. Und es ist sehr unperformant bei jedem Buchstaben von neuem zu zählen. Anbieten würde sich da ein defaultdict.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Den am häufigsten Buchstaben als "e" zu identifizieren dürfte in der Regel wohl nicht ausreichen.
Abgesehen davon werden in der Funktion einlesen() auch zwei Dinge vermischt, die eigentlich nichts miteinander zu tun haben. Das Ermitteln des am häufigsten vorkommenden Buchstabens hat mit dem Einlesen der Datei nichts zu tun.

Die Ermittlung des häufigsten Buchstabens lässt sich gut auch in 1 Zeile lösen. Eine Möglichkeit wäre diese:

Code: Alles auswählen

from string import ascii_lowercase as abc
s = "Das ist ein Test, ob es klappt"
print max(zip(map(s.lower().count,abc),abc))[1]
Sollten mehrere Buchstaben mit gleicher Häufigkeit vorkommen, würde so nur der im Alphabet am weitesten hinten stehende zurückgeliefert.
marlene
User
Beiträge: 26
Registriert: Montag 13. September 2010, 12:11

Den am häufigsten Buchstaben als "e" zu identifizieren dürfte in der Regel wohl nicht ausreichen
.
Bei meinen Testobjekten hats bis jetzt immer funktioniert, was könnt ich denn noch mit einbauen?
print max(zip(map(s.lower().count,abc),abc))[1]
darauf wär ich nicht gekommen, is cool und echt gut, ich galube ich habs soweit auch verstanden was du da treibst.

Hab meinen Code auch so umgebaut, ist es in ordnung wenn def einlesen def haufigkeit_buchstabe aufruft und den text als Prameter übergibt?

Code: Alles auswählen

from string import ascii_lowercase as abc

#Datei mit Codierten-Daten vorher erstellen(.txt), und als Parameter(dateipfad) angeben.
#Das Zeichen, das am haufigsten vorkommt wird ausgegeben.
def einlesen(dateipfad):
    datei = open(dateipfad)
    text = datei.read()
    datei.close()
    haufigkeit_buchstabe(text)

[code=python]#Das Zeichen, das am haufigsten im Text vorkommt wird ausgegeben.
def haufigkeit_buchstabe(text):
    print max(zip(map(text.lower().count, abc), abc))[1]
    
#Der Index(Buchstabe der am haufigsten vorkommt als Parameter angeben) zum verschieben zu 'e' wird ermittelt.
def index(buchstabe_max):
    buchstabe_max = buchstabe_max
    verschiebe_index = abc.index('e') - abc.index(buchstabe_max)
    print verschiebe_index

#Eingelesene Textdatei(Parameter) wird um den als Parameter angegebenen Wert verschoben und ausgegeben.    
def verschieben(verschiebe_index, dateipfad):
    datei = open(dateipfad)
    text = datei.read()
    verschiebe_index = verschiebe_index
    text_ausgabe = []
    for z in text.lower():
        if z not in abc:
            text_ausgabe.append(z)
        else:
            a = abc.index(z)
            b = a + verschiebe_index
            b = b % len(abc)
            text_ausgabe.append(abc[b])
    print ''.join(text_ausgabe)
    datei.close()
Antworten