Was muss ich hinzufügen damit die Cäsar-Verschlüsselung mit einer zusätzlichen Verschiebung um den Index des Zeichens geschieht? Das erste Zeichen soll also zusätzlich um eine Position verschoben werden, das zweite Zeichen zusätzlich um zwei Positionen und so weiter.
""" ************************************************
Cäsar Verschlüsselung mit Indexverschiebung
************************************************"""
# die Funktion zur Cäsar-Verschlüsselung
def caesar(kette):
# zwei leere Zeichenketten vereinbaren
teil1 = ""
teil2 = ""
# die Länge der ursprünglichen Zeichenkette ermitteln
laenge = len(kette)
# für den Index
zaehler = 0
# die Zeichen verteilen
while zaehler < laenge:
# Zeichen mit einem geraden Index kommen in die Zeichenkette teil1
if zaehler == 0:
teil1 = teil1 + kette[zaehler]
# bei einem ungeraden Index werden die Zeichen in der Zeichenkette teil2 abgelegt
else:
teil2 = teil2 + kette[zaehler]
zaehler = zaehler + 1
print("Cäsar-Verschlüsselung")
verschiebung = int(input("Bitte geben Sie den Verschiebewert ein: "))
# jedes Zeichen um den angegebenen Wert verschieben
for zeichen in kette:
# ist es ein großer Buchstabe?
if zeichen.isupper():
print(chr((ord(zeichen) + zaehler + verschiebung - 65) % 26 + 65), end = " ")
else:
print(chr((ord(zeichen) + zaehler + verschiebung - 97) % 26 + 97), end = " ")
print("\n")
# die ursprüngliche Zeichenkette einlesen
eingabe = input("Bitte geben Sie eine Zeichenkette ein: ")
print("Die ursprüngliche Zeichenkette ist:", eingabe, "\n")
# die Verschlüsselungen durchführen
caesar(eingabe)
Cäsar-Verschlüsselung - Indexverschiebung how to?
@alfi-techno: Der String vor der Funktionsdefinition gehört als Docstring in die Funktion, dann aber ohne die vielen Sternchen und mit einer etwas ausführlicheren Erklärung.
Überigens Erklärung: Kommentare sind dazu da, zu erklären, was gemacht wird, nicht wie, denn das steht ja schon im Code.
Als richtige Funktion sollte in ihr auch kein input und print vorkommen, sondern das sollte beim Aufrufer passieren, ergo `verschiebung` sollte auch ein Argument sein und das Ergebnis per `return` zurückgegeben werden.
`teil1` und `teil2` werden nie verwendet, zumal die Kommentare nicht zum Code passen. Denn in teil1 steht nur das erste Zeichen und der Rest landet in teil2.
Das geht auch ohne while-Schleife (die wie sie hier steht auch eine for-Schleife sein sollte).
sollte dagegen der Kommentar stimmen, wäre das
Oh nein, jetzt habe ich die Einrückungen erst gesehen, die while-Schleife beendet sich nie und teil1 wird immer mehr mit dem ersten Zeichen von kette gefüllt.
Der zweite Teil der Funktion funktioniert auch nur, wenn in kette nur Groß oder Kleinbuchstaben stehen. Das sollte man zumindest vorher prüfen.
Überigens Erklärung: Kommentare sind dazu da, zu erklären, was gemacht wird, nicht wie, denn das steht ja schon im Code.
Als richtige Funktion sollte in ihr auch kein input und print vorkommen, sondern das sollte beim Aufrufer passieren, ergo `verschiebung` sollte auch ein Argument sein und das Ergebnis per `return` zurückgegeben werden.
`teil1` und `teil2` werden nie verwendet, zumal die Kommentare nicht zum Code passen. Denn in teil1 steht nur das erste Zeichen und der Rest landet in teil2.
Das geht auch ohne while-Schleife (die wie sie hier steht auch eine for-Schleife sein sollte).
Code: Alles auswählen
teil1 = kette[0]
teil2 = kette[1:]
Code: Alles auswählen
teil1, teil2 = kette[::2], kette[1::2]
Der zweite Teil der Funktion funktioniert auch nur, wenn in kette nur Groß oder Kleinbuchstaben stehen. Das sollte man zumindest vorher prüfen.
Code: Alles auswählen
def encode_caesar(kette, verschiebung):
"""
Cäsar Verschlüsselung mit Indexverschiebung
"""
# jedes Zeichen um den angegebenen Wert verschieben
ergebnis = []
for zaehler, zeichen in enumerate(kette, verschiebung):
if zeichen.isupper():
# ist es ein großer Buchstabe?
ergebnis.append(chr((ord(zeichen) + zaehler - 65) % 26 + 65))
elif zeichen.islower():
# ist es ein kleiner Buchstabe?
ergebnis.append(chr((ord(zeichen) + zaehler - 97) % 26 + 97))
else:
# TODO: was passiert hier
pass
return "".join(ergebnis)