Cäsar verschlüsselung hilfe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

Hallo erstmal ,

ich bin relativ neu in Python und habe die Cäsar verschlüsselung ausprobiert und das hat ganz gut geklappt aber ein zwei Problemchen habe ich trotzdem noch

Code: Alles auswählen


print("Willkommen zur Caesarchiffre!")


MAX_KEY_SIZE = 26

def getMode():
    while True:
        print('Wollen sie verschlüsseln(v) oder entschlüsseln(e) ?')
        mode = input().lower()
        if mode in 'verschlüsseln v entschlüsseln e'.split():
            return mode
        else:
            print('Bitte geben sie entweder "v" zum verschlüsseln oder "e" zum entschlüsseln ein .')

def getMessage():
    print('Geben sie ihre Nachricht ein:')
    return input()

def getKey():
    key = 0
    while True:
        print('Geben sie die Zahl der Verschiebung(en) an. (1-%s)' % (MAX_KEY_SIZE))
        key = int(input())
        if (key >= 1 and key <= MAX_KEY_SIZE):
            return key
        
def getTranslatedMessage(mode, message, key):
    if mode[0] == 'e':
        key = -key
    translated = ''

    for symbol in message:
        if symbol.isalpha():
            num = ord(symbol)
            num += key

            if symbol.isupper():
                if num > ord('Z'):
                    num -= 26
                elif num < ord('A'):
                    num += 26
            elif symbol.islower():
                if num > ord('z'):
                    num -= 26
                elif num < ord('a'):
                    num += 26

            translated += chr(num)
        else:
            translated += symbol
    return translated

mode = getMode()
message = getMessage()
key = getKey()

print('Ihr Text lautet:')
print(getTranslatedMessage(mode, message, key))
print("Noch einmal ? J/N")

again = input().lower()
if again in 'ja j'.split():
    getMode
else:
    quit


Mein erstes Problem ist das ich gerne das ganze Programm wiederholen würde sprich am ende gefragt wird ob nochmal und wenn ja dann halt von vorne und wenn nein dann beenden , aber das habe ich nicht geschafft ... ich habe meine Versuche aus dem Code rausgenommen weil peinlich und so :D

Mein zweites Problem ist das wenn der User die Anzahl der Verschiebungen eingeben soll und was falsches eingibt das Programm natürlich crasht das krieg ich leider auch nicht hin...
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

astrionn hat geschrieben: Mein erstes Problem ist das ich gerne das ganze Programm wiederholen würde sprich am ende gefragt wird ob nochmal und wenn ja dann halt von vorne und wenn nein dann beenden , aber das habe ich nicht geschafft ... ich habe meine Versuche aus dem Code rausgenommen weil peinlich und so :D
Du brauchst halt eine Endlosschleife - genau das hast Du an anderer Stelle ja bereits geschafft :K
astrionn hat geschrieben: Mein zweites Problem ist das wenn der User die Anzahl der Verschiebungen eingeben soll und was falsches eingibt das Programm natürlich crasht das krieg ich leider auch nicht hin...
Du musst die Exception abfangen, die geworfen wird, wenn der Benutzer z.B. einen Buchstaben bzw. alles, was sich nicht in einen Integer wandeln lässt!

Ich habe leider keine Zeit für größere Anmerkungen, die man eigentlich zu dem Code machen sollte.

Ein Tipp aber: Lagere alle ausführbaren Code auf Modulebene in eine ``main``-Funktion aus; diese rufst Du dann über folgenden Code auf:

Code: Alles auswählen

if __name__ == "__main__":
    main()
Und versuche Dich mehr an PEP8 zu halten; ``getMode`` sieht nach Java aus, aber nicht nach Python. Hier würde man es ``get_mode`` nennen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

Hyperion hat geschrieben:
astrionn hat geschrieben: Mein erstes Problem ist das ich gerne das ganze Programm wiederholen würde sprich am ende gefragt wird ob nochmal und wenn ja dann halt von vorne und wenn nein dann beenden , aber das habe ich nicht geschafft ... ich habe meine Versuche aus dem Code rausgenommen weil peinlich und so :D
Du brauchst halt eine Endlosschleife - genau das hast Du an anderer Stelle ja bereits geschafft :K
astrionn hat geschrieben: Mein zweites Problem ist das wenn der User die Anzahl der Verschiebungen eingeben soll und was falsches eingibt das Programm natürlich crasht das krieg ich leider auch nicht hin...
Du musst die Exception abfangen, die geworfen wird, wenn der Benutzer z.B. einen Buchstaben bzw. alles, was sich nicht in einen Integer wandeln lässt!

Ich habe leider keine Zeit für größere Anmerkungen, die man eigentlich zu dem Code machen sollte.

Ein Tipp aber: Lagere alle ausführbaren Code auf Modulebene in eine ``main``-Funktion aus; diese rufst Du dann über folgenden Code auf:

Code: Alles auswählen

if __name__ == "__main__":
    main()
Und versuche Dich mehr an PEP8 zu halten; ``getMode`` sieht nach Java aus, aber nicht nach Python. Hier würde man es ``get_mode`` nennen.

Mit Endlosschleifen meinst du if - abfragen?
Wir fange ich die exceptions den ab ? mit else ?
Nimm dir ruhig später Zeit dafür :)

das mit der main function probier ich mal aus
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

astrionn hat geschrieben:Mit Endlosschleifen meinst du if - abfragen?
Mit einer Schleife. Du hast doch schon eine programmiert.
astrionn hat geschrieben:Wir fange ich die exceptions den ab ? mit else ?
Mit except.

Vielleicht solltest du mal das Tutorial gründlich durcharbeiten, deine Fragen sind alle sehr grundlegender Natur und werden dort erläutert.

Die Übersetzung geht übrigens einfacher:

Code: Alles auswählen

import string

def encrypt(message, key, alphabet=string.ascii_lowercase):                     
    key = key % len(alphabet)
    translation = dict(zip(alphabet, alphabet[key:]+alphabet[:key]))
    return "".join(translation.get(char, char) for char in message)
Warum fangen deine Funktionen eigentlich alle mit "get" an? Bei der Gelegenheit könntest du auch gleich noch einen Blick auf den Style Guide von Python, PEP8, werfen.
Das Leben ist wie ein Tennisball.
Antworten