Buchstaben im Text ersetzen

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
diefragerin
User
Beiträge: 10
Registriert: Samstag 8. Dezember 2018, 14:20

Hallo zusammen,

ich bin eine Schülerin und muss ein Programm schreiben, mit dem ich einen Text, der mit dem Ersetzungsverfahren verschlüsselt ist, entschlüsseln kann.
Dafür brauche ich ja zunächst eine Häufigkeitsanalyse, die hab ich auch schon, jetzt hänge ich allerdings bei dem Ersetzen der Buchstaben fest.
Hier ein Schnipsel aus meinem Programm:

##Ersetzungstabelle
print (text)
print ()
print ("Hier ist die Hauefigkeit von deutschen Texten vom meist genutzen Buchstabe, zum wenigsten benutzten Buchstabe sortiert. Benutze diese, um Deinen Text gut zu übersetzen!")
print (haeufigkeit)
print ()

for buchstabe in text.upper():
w = input ("Möchtest du etwas ersetzen? (ja oder nein): " )
if w.lower() == "ja":
def ersetzen(j, n):
text = text.replace(j, n)
return text
print ("Verwende die Funktion 'ersetzen(j, n)'! ")
input ()
print ()
print ("Ihr übersetzter Text lautet: ")
print (text)

elif w.lower() == "nein":
print ()
print ("Ihr fertiger Text lautet: ")
print()
print (text)
break

Der Benutzer soll durch die Funktion 'ersetzen' manuell eingeben können, welche Buchstabe er durch welche ersetzen möchte.
Damit man die ersetzten Buchstaben erkennen kann, habe ich den Originaltext komplett groß geschrieben und möchte die übersetzten Buchstaben mit kleinen ersetzen.
Statt mir den veränderten Text zu "printen", "printet" python mir nur meinen alten Text.
Über Hinweise, wie's vielleicht klappen könnte, oder was ich verbessern könnte, würde ich mich sehr freuen :)

Liebe Grüße
diefragerin
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du scheinst nicht die einzige Schuelerin mit genau diesem Problem zu sein - schau mal auf die auch recht neue Userin pleasehelp!, welche das gleiche Problem hier diskutiert hat:

memberlist.php?mode=viewprofile&u=21057

Vielleicht sitzt sie in der Klasse neben dir & kann dir helfen ;) Und natuerlich kannst du mal in ihren Beitragen und den Antworten darauf stoebern, und da sollte sich zu deinen Fragen etwas finden.
diefragerin
User
Beiträge: 10
Registriert: Samstag 8. Dezember 2018, 14:20

Hallo, erstmal danke, das kann gut sein, dass das eine Klassenkameradin von mir ist, aber bitte bedenke, dass wir unterschiedliche Sachen abgeben müssen, da ich sonst abgeschrieben habe :(
Gäbe es eventuell noch eine andere Lösung?
Schonmal vielen Dank ! :)
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

nur so auf die Schnelle
du definierst innerhalb einer for-Schleife eine Funktion, das ist schon mal nicht richtig
Funktionen definiert man/frau einmal und gut ist
aber zusätzlich rufst du die Funktion überhaupt nicht auf,
kein Wunder das da dann nichts passiert.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
diefragerin
User
Beiträge: 10
Registriert: Samstag 8. Dezember 2018, 14:20

ok, also das mit der Funktionsdefiniton habe ich geändert. Ich wollte den Benutzer die Funktion aufrufen lassen mit:

print ("Verwende die Funktion 'ersetzen(j, n)'! ")
input ()
print ()
print ("Ihr übersetzter Text lautet: ")
print (text)

oder geht das nicht, weil replace nicht mit Variablen, die vom Benutzer gefüllt werden funktioniert?
Danke aufjedenfall schonmal für die Antwort :)
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

wo gibst du denn ein, welcher Buchstabe mit welchem anderen ersetzt werden soll?
Du brauchst eine Variable in der der "alte" und eine Variable in der der "neue" Buchstabe enthalten ist
und mit diesen Variablen rufst du deine Funktion auf
diese Funktionalität ist in deinem Code nicht vorhanden
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
diefragerin
User
Beiträge: 10
Registriert: Samstag 8. Dezember 2018, 14:20

Ich wollte, dass der Benutzer in input():
ersetzung("L", "e")
zum Beispiel eingibt.
Dann würde das L im Text mit einem e ersetzt werden.
Wenn ich das ohne das restliche Programm eingebe funktioniert es, mit dem Programm aber leider nicht.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Benutzer soll wirklich jede moegliche Ersetzung selbst eingeben? Das kann ich mir nicht wirklich vorstellen, dass das gefragt ist. Neben der Fehleranfaelligkeit ist das doch total muehsam.

Aber wenn es wirklich so sein soll - dann solltest du den ersten und zweiten Buchstaben per input einzeln abfragen vom Benutzer, und dann selbst

Code: Alles auswählen

ersetzung(von, zu)
aufrufen. Die Eingabe so zu analysieren, dass du quasi eine beliebige Funktion aufrufen kannst - das uebersteigt das Wissen auch von fortgeschritteneren Semestern.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

diefragerin hat geschrieben: Samstag 8. Dezember 2018, 18:07 Ich wollte, dass der Benutzer in input():
ersetzung("L", "e")
zum Beispiel eingibt. Dann würde das L im Text mit einem e ersetzt werden.
Wenn ich das ohne das restliche Programm eingebe funktioniert es, mit dem Programm aber leider nicht.
Zuerst einmal muss das was von der Funktion input() zurück geliefert wird, in einer Variable gespeichert werden. eingabe = input()
Die Variable eingabe ist dann ein Textstring, den du z.B. mit print(eingabe) wieder ausgeben kannst.
Python funktioniert nicht so, das du da etwas eingibst und der Pythoninterpreter führt das als Befehl aus,
da hast du komplett falsche Vorstellungen wie das alles funktioniert.
Das was in der Variable eingabe enthalten ist, muss von dir weiterverarbeitet werden.
Wenn z.B. eine Ziffer "1" eingegeben wird, ist das zuerst ein String
erst durch Umwandlung zahl = int(eingabe) wird in der Variable zahl der Wert 1 gespeichert.
Ich empfehle dir mal hier https://py-tutorial-de.readthedocs.io/de/python-3.3/ reinzuschauen
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
diefragerin
User
Beiträge: 10
Registriert: Samstag 8. Dezember 2018, 14:20

super, danke!
Die Aufgabenstellung ist ziemlich offen gelassen, ich dachte einfach, dass das die einfachste Variante ist, da das Programm nur funktionieren soll und einen zuvor chiffrierten Text am Ende dechiffrieren soll. Damit der Benutzer es ein bisschen einfacher hat, habe ich ja eine Häufigkeitsanalyse zuvor durchgeführt und eine Liste printen lassen, die die Häufigkeitsverteilung der Buchstaben in Deutschen Texten der Häufigkeit nach zeigt. Ist also z. B. das "L" der meistbenutzte Buchstabe in meinem Text, würde der Benutzer das "L" mit dem "e" tauschen.
diefragerin
User
Beiträge: 10
Registriert: Samstag 8. Dezember 2018, 14:20

Also ich habe hier jetzt nochmal mein ganzes Programm, ich habe das mit dem Benutzer eingeben versucht, allerdings klappt das auch nicht :(

Code: Alles auswählen

##Projekt Kryptologie

##strings
alphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K" ,"L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
haeufigkeit = ["e", "n", "d", "s", "r", "a", "t", "i", "h", "u", "l", "c", "g", "m", "o", "b", "w", "f", "k", "z", "p", "v", "j", "y", "x", "q"]

##Datei einlesen  
x = input ("Bitte geben Sie Ihre zu entschlüsselnde Datei an: ")
text = open(x).read()
text = text.upper()
print ()
print ("Ihr verschlüsselter Text: ")
print()
print (text)

##Häufigkeitsanalyse
anzahl = [["A", 0],["B", 0],["C", 0],["D", 0],["E", 0],["F", 0],["G", 0],["H", 0],["I", 0],["J", 0],["K", 0],["L", 0],["M", 0],["N", 0],["O", 0],["P", 0],["Q", 0],["R", 0],["S", 0],["T", 0],["U", 0],["V", 0],["W", 0],["X", 0],["Y", 0], ["Z", 0]]

b = 0
for buchstabe in alphabet:
    a = 0
    for buchstabe in text.upper():
        if buchstabe == alphabet[b]:
            anzahl[b][1] = anzahl[b][1] + 1
        a += 1
    b += 1
    
##Zahlen nach Häufigkeit sortieren
def bubblesort(anzahl): #bubblesort definieren 
    #Daten enthält eine Liste von vergleichbaren Objekten, d.h. man kann Anzahl nach Größe sortieren
    anfang = 0
    ende = len(anzahl)-1
    
    durchlauf = 0
    while durchlauf < ende:
        #i entspricht aktuell
        i = 0
        while i < ende:
            if anzahl[i][1]<anzahl[i+1][1]:
                x = anzahl[i]
                anzahl[i] = anzahl[i+1]
                anzahl[i+1] = x
            i += 1
        durchlauf += 1
    return anzahl

print()    
print (bubblesort(anzahl))
print ("Buchstaben ingesamt: ", a)

##Ersetzungstabelle
def ersetzen(text):
    tneu = text.replace(alt, neu)
    return tneu
    
print ()
print ("Hier ist die Hauefigkeit von deutschen Texten vom meist genutzen Buchstabe, zum wenigsten benutzten Buchstabe sortiert. Benutze diese, um Deinen Text gut zu übersetzen!")
print (haeufigkeit)
print ()
alt = input("Bitte gebe den zu Buchstabe, den du ersetzen willst ein: ")
alt = alt.upper()
neu = input("Bitte gebe den Buchstabe ein, den du statt dem alten Buchstaben haben möchtest: ")
neu = neu.lower()
print ()
ersetzen(text)
print ("Ihr ersetzter Text: ")
print ()
print (tneu)
Als Fehlermeldung wird mir angezeigt, dass 'tneu' nicht definiert sei, aber das habe ich ja eigentlich mit:
tneu = text.replace(alt, neu)
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wen du einen Rueckgabewert einer Funktion hast, dann musst du den auch einer Variablen zuweisen. Von alleine passiert da nichts. Das waere ja auch der Horror: wenn du ein Programm schreibst, das eine Variable "hausnummer" hat, und dann tief verborgen in irgendeiner Funktion gibt es auch eine Variable mit dem Namen - und deine Werte werden einfach ueberschrieben.

Und ich habe auch nicht gesagt, du sollst genau ihren Code nehmen - aber viele Probleme, die sie mit der Aufgabe hatte, sind hier auch schon diskutiert worden. Davon laesst sich also lernen. Das Problem ist auch nur beschraenkt kompliziert. Die Loesungen aehneln sich so oder so also zwangslaeufig.
diefragerin
User
Beiträge: 10
Registriert: Samstag 8. Dezember 2018, 14:20

Danke für den Tipp, ich habs mir mal durchgelesen. Das mit der Variablen hat mir sehr geholfen :lol:
Mittlerweile habe ich noch eine while-Schleife drum herum gebaut, damit nicht nur ein Buchstabe ersetzt werden kann und auch das ersetzen eines Buchstabens hat funktioniert :)
Jetzt habe ich allerdings das Problem, dass ich zwar einen Buchstaben ändern kann, die Änderung aber irgendwie nicht gespeichert werden kann und ich so den Text, der schon übersetzt war nicht weiter übersetzen kann. ich habe versucht ihn in einer anderen Variablen zu speichern, aber es gibt sicher eine weniger komplizierte Weise, als jeden weiteren Text in einer anderen Variablen zu speichern...

Code: Alles auswählen

##Projekt Kryptologie

##strings
alphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K" ,"L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
haeufigkeit = ["e", "n", "d", "s", "r", "a", "t", "i", "h", "u", "l", "c", "g", "m", "o", "b", "w", "f", "k", "z", "p", "v", "j", "y", "x", "q"]

##Datei einlesen  
x = input ("Bitte geben Sie Ihre zu entschlüsselnde Datei an: ")
text = open(x).read()
text = text.upper()
print ()
print ("Ihr verschlüsselter Text: ")
print()
print (text)

##Häufigkeitsanalyse
anzahl = [["A", 0],["B", 0],["C", 0],["D", 0],["E", 0],["F", 0],["G", 0],["H", 0],["I", 0],["J", 0],["K", 0],["L", 0],["M", 0],["N", 0],["O", 0],["P", 0],["Q", 0],["R", 0],["S", 0],["T", 0],["U", 0],["V", 0],["W", 0],["X", 0],["Y", 0], ["Z", 0]]

b = 0
for buchstabe in alphabet:
    for buchstabe in text.upper():
        if buchstabe == alphabet[b]:
            anzahl[b][1] = anzahl[b][1] + 1
    b += 1
    
##Zahlen nach Häufigkeit sortieren
def bubblesort(anzahl): #bubblesort definieren 
    #Daten enthält eine Liste von vergleichbaren Objekten, d.h. man kann Anzahl nach Größe sortieren
    anfang = 0
    ende = len(anzahl)-1
    
    durchlauf = 0
    while durchlauf < ende:
        #i entspricht aktuell
        i = 0
        while i < ende:
            if anzahl[i][1]<anzahl[i+1][1]:
                x = anzahl[i]
                anzahl[i] = anzahl[i+1]
                anzahl[i+1] = x
            i += 1
        durchlauf += 1
    return anzahl

print()    
print (bubblesort(anzahl))

##Ersetzungstabelle
print ()
print ("Hier ist die Hauefigkeit von deutschen Texten vom meist genutzen Buchstabe, zum wenigsten benutzten Buchstabe sortiert. Benutze diese, um Deinen Text gut zu übersetzen!")
print (haeufigkeit)
print ()

print ("Möchten Sie Buchstaben durch andere ersetzen? (ja oder nein): ")
eingabe = input()
eingabe = eingabe.lower()

def ersetzen(text):
    tneu = text.replace(alt, neu)
    return tneu

while eingabe == "ja":
    
    if eingabe == "ja":
        alt = input("Bitte gebe den zu Buchstabe, den du ersetzen willst ein: ")
        alt = alt.upper()
        neu = input("Bitte gebe den Buchstabe ein, den du statt dem alten Buchstaben haben möchtest: ")
        neu = neu.lower()
        tneu = text.replace (alt, neu)
        print ()
        ersetzen(text)
        print ("Ihr ersetzter Text: ")
        print ()
        print (tneu)
        
        print ()
        print ("Möchten Sie Buchstaben durch andere ersetzen? (ja oder nein): ")
        eingabe = input()
        eingabe = eingabe.lower()
Soweit bin ich mittlerweile, es wird auch kein Fehler angezeigt, ich kann die Buchstaben so oft ändern wie ich möchte, aber halt leider nur getrennt :roll:
Vielen Dank für die bisherigen Tipps! :P
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Da es anscheinend noch niemand angesprochen hat: Sortieren schreibt man sich nicht selbst. Listen haben eine `sort()`-Methode und es gibt die eingebaute `sorted()`-Funktion.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich denke mal die Sortierung ist Teil der Aufgabe.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Kann natürlich sein. Andererseits gib's diese Aussage: „Die Aufgabenstellung ist ziemlich offen gelassen, […]“. Ich wollte es auf jeden Fall mal erwähnt haben, dass man da Code sparen und das Programm effizienter machen kann, ohne wirklich grossen Aufwand. :-)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
diefragerin
User
Beiträge: 10
Registriert: Samstag 8. Dezember 2018, 14:20

ja genau, das erleichtert natürlich einiges :lol:
danke!
Antworten