Index erhöhen

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
StevenB99
User
Beiträge: 33
Registriert: Donnerstag 4. Juni 2020, 23:12

Hallo, ich komme grade nicht weiter. Ich will ,dass das Programm sich um den Index erhöht + um irgendeinen anderen Wert, den man eintippt.

z.B gebe ich "abc" ein. Dann soll sich "a" von selber auf sein Index erhöhen, also 1, das wäre dann der Buchstabe "b" und um den Werte den ich eingebe, sagen wir ich gebe auch 1 ein. Dann soll "a" auf "c" springen. b soll dann auf e, weil mein eingegebener Werte war 1 + den Index von "b" also 2 u.s.w

"abc" soll dann auf "ceg"

Code: Alles auswählen

def verschlüsselung(cäsar):
    verschiebewert=int(input("Gib den Verschiebewert ein"))
    buchstabe=len(cäsar)
    buchstabe=buchstabe-3
    zähler=0
    while zähler<=buchstabe:
        zähler=zähler+1
    for zeichen in cäsar: 
        if zeichen.isupper(): 
            print(chr((ord(zeichen)+verschiebewert-65)%26+65+zähler),end="") 
        else:
            print(chr((ord(zeichen)+verschiebewert-97)%26+97+zähler),end="") 
            
eingabe=input("Geben sie eine Zeichenkette ein: ")
verschlüsselung(eingabe)
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Was soll die Variante buchstabe tun? Die ist ja gar kein Buchstabe sondern die Länge eines Wortes. Und was glaubst du macht die while- Schleife? Warum nicht gleich zähler = len(cäsar) - 2?
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@StevenB99: `cäsar` ist ein komischer Name für eine Zeichenkette. `verschlüsselung()` sollte `verschlüssele()` heissen. Funktionen und Methoden werden nach Tätigkeiten benannt, damit man sie leicht von eher ”passiven” Werten unterscheiden kann.

Die Funktion macht zu viel. Die verschlüsselt nicht nur sondern fragt den Benutzer sogar noch nach einer Eingabe und gibt etwas aus. Warum wird der Text als Argument an die Funktion übergeben, der Verschiebewert aber nicht?

Der Code geht mit Zeichen die keine ASCII-Buchstaben sind falsch um würde ich mal behaupten.

Die 65 und die 97 sind ziemlich magische Zahlen. Die sollte man als Konstanten definieren und zwar so, dass man am Namen der Konstanten die Bedeutung dieser Werte erkennen kann.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
StevenB99
User
Beiträge: 33
Registriert: Donnerstag 4. Juni 2020, 23:12

Es kommt immer der error "string indices must be integers"

Code: Alles auswählen

def verschlüsseln(eingabe):
    verschiebewert=int(input("Gib hier einen Verschiebewert ein"))
    länge=len(eingabe)
    for i in eingabe:
        if i.isupper():
            print (chr(ord(eingabe[i])+(i+1)+verschiebewert-65)%26+65)
        else:
            print(chr(ord(eingabe[i])+(i+1)+verschiebewert-97)%26+97)
eingabe=input("Gib hier einen Wert ein:")
verschlüsseln(eingabe)

was meinst du ich soll daraus konstante machen? Weiß grade nicht weiter.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann vergleich mal deinen ersten Code mit dem jetzigen. Warum glaubst du, dass es jetzt besser ist?
StevenB99
User
Beiträge: 33
Registriert: Donnerstag 4. Juni 2020, 23:12

Weil er jetzt eigentlich um die Höher des Indexes springen sollte + den verschiebewert. Bei der Zeichenkette "Hallo" . Jetzt klappt aber garnichts mehr.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@StevenB99: Welcher Index?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn du einen Index zusätzlich zu dem Zeichen brauchst, dann musst du enumerate verwenden.
StevenB99
User
Beiträge: 33
Registriert: Donnerstag 4. Juni 2020, 23:12

Code: Alles auswählen

eingabe=input("Gib hier einen Wert ein:")
verschiebeWert=int(input("Gib hier ein Verschiebewert ein:"))
länge=len(eingabe)
output=[]
i=0
ausgabe=[(chr(ord(eingabe[i])+(i+1)+verschiebeWert)) for i in range(länge)]
print(ausgabe)
So meine ich das. Ich kriege einigermaßen das richtige raus , allerdings nur bis den Buchstaben Z. Ab Z zählte es weiter ohne das er sich im Alphabet befindet. Das Programm soll aber das ab den Buchstaben Z von den Buchstaben A wieder anfangen und weiter zählen. Nämlich so "Z"+den Index von Z also "26" + den verschiebeWert. Es soll sich nur im Alphabet befinden. Wenn ich das so mache ,dann funktioniert das aber mit der 65 und 97 nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@StevenB99: Zerlege Dein Problem in kleinere Teilprobleme und löse die in eigenen Funktionen. Ein Teilproblem wäre beispielsweise *ein* Zeichen zu kodieren. Also eine Funktion die ein Zeichen bekommt und einen Verschiebewert und dieses eine Zeichen damit kodiert. Dann hast Du am Ende nicht einen riesigen Ausdruck der alles macht, bei dem Du durcheinanderkommen kannst.

Die Zuweisungen an `output` und `i` sind in dem letzten Beitrag unsinnig. Beide Werte werden nirgends verwendet.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
StevenB99
User
Beiträge: 33
Registriert: Donnerstag 4. Juni 2020, 23:12

Gibt es in Python eigentlich so eine Art integrierten Debugger, mit dem ich ein Programm zeilenweise ausführen lassen kann und ich dann sehen kann was genau passiert?
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Pdb?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

@StevenB99: `breakpoint()` ist auch einen Blick wert. IMHO sollte man aber eher lernen, den Code, den man schreibt, ohne Debugger zu verstehen.
Antworten