Benötige Tipps für ein QBasic Programm

Hallo allerseits!

Hoffentlich bin ich hier im richtigen Forum für meine Frage gelandet.

Und zwar:
Ich soll grade mit QBasic ein Programm entwerfen, mit dessen Hilfe es möglich ist, Wörter oder Phrasen zu verschlüsseln. So soll z.B. aus „Julius Caesar“ „Kpmjpt Dbftbs“ (Verschiebung um 1 im Alphabet) werden. (Die Stärke der Verschiebung kann man im Programm bestimmen) Das ganze läuft natürlich über die ASCII-Zeichentabelle.

Mein Problem ist jetzt, dass die VERschlüsselung allgemein ganz gut klappt, nur dass eine ENTschlüsselung, also quasi das Rückgängigmachen der Verschlüsselung, nicht wirklich funktionieren will. Es funktioniert ohnehin bis jetzt nur mit Großbuchstaben.

Mein Programm sieht folgendermaßen aus:

CLS
LOCATE 10
PRINT " Möchten Sie ihren Code:"
PRINT " "
PRINT " (1) Verschlüsseln"
PRINT " (2) Entschlüsseln"
PRINT " "
INPUT " ", z$

IF z$ = „1“ THEN GOTO 10
IF z$ = „2“ THEN GOTO 20
GOTO 0

10 PRINT " "
PRINT " "
INPUT " Wie viele Buchstaben verschieben?"; p
CLS
LOCATE 10
PRINT " Welches Wort möchten Sie verschlüsseln? (Nur Kleinbuchstaben!): "
PRINT " "
PRINT " "
INPUT " ", r$
n = 65
IF p = 3 THEN LET x = 0
IF p = 4 THEN LET x = 1
IF p = 5 THEN LET x = 2

FOR x% = LEN(r$) TO 1 STEP -1
IF MID$(r$, x%, 1) = „a“ THEN MID$(r$, x%, 1) = CHR$(n + p + x)
IF MID$(r$, x%, 1) = „b“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 1)
IF MID$(r$, x%, 1) = „c“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 2)
IF MID$(r$, x%, 1) = „d“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 3)
IF MID$(r$, x%, 1) = „e“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 4)
IF MID$(r$, x%, 1) = „f“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 5)
IF MID$(r$, x%, 1) = „g“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 6)
IF MID$(r$, x%, 1) = „h“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 7)
IF MID$(r$, x%, 1) = „i“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 8)
IF MID$(r$, x%, 1) = „j“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 9)
IF MID$(r$, x%, 1) = „k“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 10)
IF MID$(r$, x%, 1) = „l“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 11)
IF MID$(r$, x%, 1) = „m“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 12)
IF MID$(r$, x%, 1) = „n“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 13)
IF MID$(r$, x%, 1) = „o“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 14)
IF MID$(r$, x%, 1) = „p“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 15)
IF MID$(r$, x%, 1) = „q“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 16)
IF MID$(r$, x%, 1) = „r“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 17)
IF MID$(r$, x%, 1) = „s“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 18)
IF MID$(r$, x%, 1) = „t“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 19)
IF MID$(r$, x%, 1) = „u“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 20)
IF MID$(r$, x%, 1) = „v“ THEN MID$(r$, x%, 1) = CHR$(n + p + x + 21)
IF MID$(r$, x%, 1) = „w“ THEN MID$(r$, x%, 1) = CHR$(n + p + 2 + 22)
IF MID$(r$, x%, 1) = „x“ THEN MID$(r$, x%, 1) = CHR$(n + p + x - 3)
IF MID$(r$, x%, 1) = „y“ THEN MID$(r$, x%, 1) = CHR$(n + p + x - 2)
IF MID$(r$, x%, 1) = „z“ THEN MID$(r$, x%, 1) = CHR$(n + p + x - 1)
NEXT x%
PRINT " "
PRINT " "
PRINT " "; r$

SLEEP 10

GOTO 100

20 PRINT " "
PRINT " "
INPUT " Um wie viele Stellen verschieben?"; p
CLS
LOCATE 10
PRINT " Welches Wort möchten Sie entschlüsseln? (Nur Großbuchstaben!): "
PRINT " "
PRINT " "
INPUT " ", r$

n = 97
IF n > 121 THEN p = p - 26
FOR x% = LEN(r$) TO 1 STEP -1
IF MID$(r$, x%, 1) = „A“ THEN MID$(r$, x%, 1) = CHR$(n - p + 26)
IF MID$(r$, x%, 1) = „B“ THEN MID$(r$, x%, 1) = CHR$(n - p + 1)
IF MID$(r$, x%, 1) = „C“ THEN MID$(r$, x%, 1) = CHR$(n - p + 2)
IF MID$(r$, x%, 1) = „D“ THEN MID$(r$, x%, 1) = CHR$(n - p + 3)
IF MID$(r$, x%, 1) = „E“ THEN MID$(r$, x%, 1) = CHR$(n - p + 4)
IF MID$(r$, x%, 1) = „F“ THEN MID$(r$, x%, 1) = CHR$(n - p + 5)
IF MID$(r$, x%, 1) = „G“ THEN MID$(r$, x%, 1) = CHR$(n - p + 6)
IF MID$(r$, x%, 1) = „H“ THEN MID$(r$, x%, 1) = CHR$(n - p + 7)
IF MID$(r$, x%, 1) = „I“ THEN MID$(r$, x%, 1) = CHR$(n - p + 8)
IF MID$(r$, x%, 1) = „J“ THEN MID$(r$, x%, 1) = CHR$(n - p + 9)
IF MID$(r$, x%, 1) = „K“ THEN MID$(r$, x%, 1) = CHR$(n - p + 10)
IF MID$(r$, x%, 1) = „L“ THEN MID$(r$, x%, 1) = CHR$(n - p + 11)
IF MID$(r$, x%, 1) = „M“ THEN MID$(r$, x%, 1) = CHR$(n - p + 12)
IF MID$(r$, x%, 1) = „N“ THEN MID$(r$, x%, 1) = CHR$(n - p + 13)
IF MID$(r$, x%, 1) = „O“ THEN MID$(r$, x%, 1) = CHR$(n - p + 14)
IF MID$(r$, x%, 1) = „P“ THEN MID$(r$, x%, 1) = CHR$(n - p + 15)
IF MID$(r$, x%, 1) = „Q“ THEN MID$(r$, x%, 1) = CHR$(n - p + 16)
IF MID$(r$, x%, 1) = „R“ THEN MID$(r$, x%, 1) = CHR$(n - p + 17)
IF MID$(r$, x%, 1) = „S“ THEN MID$(r$, x%, 1) = CHR$(n - p + 18)
IF MID$(r$, x%, 1) = „T“ THEN MID$(r$, x%, 1) = CHR$(n - p + 19)
IF MID$(r$, x%, 1) = „U“ THEN MID$(r$, x%, 1) = CHR$(n - p + 20)
IF MID$(r$, x%, 1) = „V“ THEN MID$(r$, x%, 1) = CHR$(n - p + 21)
IF MID$(r$, x%, 1) = „W“ THEN MID$(r$, x%, 1) = CHR$(n - p + 22)
IF MID$(r$, x%, 1) = „X“ THEN MID$(r$, x%, 1) = CHR$(n - p + 23)
IF MID$(r$, x%, 1) = „Y“ THEN MID$(r$, x%, 1) = CHR$(n - p + 24)
IF MID$(r$, x%, 1) = „Z“ THEN MID$(r$, x%, 1) = CHR$(n - p + 25)
NEXT x%
PRINT " "
PRINT " "
PRINT " "; r$

SLEEP 10

GOTO 100

100 CLS
LOCATE (10)
PRINT " Neustart?"
PRINT " "
PRINT " (1) Ja"
PRINT " (2) Nein"
PRINT " "
INPUT " ", l$
IF l$ = „1“ THEN GOTO 0
IF l$ = „2“ THEN END
GOTO 100

Das mit den ganzen IF so-und-so Befehlen ist mir bis jetzt nicht besser gelungen, da ich nicht weiss, wie ich das ganze auch noch in eine Schleife packen soll, wenn es schon auf DIESE Weise nicht funktioniert. -.-

Wenn jemand die Mühe aufbringt, den Fehler zu finden, wäre ich wirklich sehr dankbar. Ich weiss nämlich wirklich nicht mehr weiter mit dem Programm… ^^

Danke im Vorraus. Gruß, Michl!

Hallo Michl,

mit qbasic kenne ich mich net aus. Ich selbst programmiere mit VB.

Aber ich würde es so machen.
Du hast die anzahl um wieviel stellen das wort verschoben werden soll.
Jedes Zeichen hat einen Ascii Code
Das kleine a ist da 97 das b =98 etc z =122, die Grossbuchstaben sind immer 32 weniger, also „a“ = 65 etc.
Wenn du nun das wort / ein buchstaben um bsp. 5 zeichen verschieben willst, so addiere die einfach darauf. Also aus „a“ = 97 --> 97+5 = 102. somit hast du den neuen buchstaben. Dazu musst du nicht die ganzen if abfragen stellen, sondern kannst dies in einer sch´leife wo du buchstaben für buchstaben einliesst aendern.
Die geaenderten Wert kannst du ja in einer variablen speichern und mit dieser dann arbeiten :smile:

Unter VB würde das so aussehen

bsp.

Private Sub codieren(s As String, faktor As Byte) 'Unter s ist die zeichenfolge die verschluesselt werden soll 
Dim i As Byte
Dim wert
For i = 1 To Len(s) 
'Schleife wird durchlaufen , len(s) =länge des strings
 wert = wert + Chr(Asc(Mid(s, i, 1)) + faktor) 
'unter faktor wird angegeben um wieviel stellen das zeichen verschoben werden soll
'asc(buchstabe) gibt den ascii code des zeichens zurueck
'chr(zahl) gibt das zeichen des ascii codes zurueck
'mid(zeichenfolge, start, länge) gibt aus der zeichenfolge ab position start eine anzahl an zeichen zurueck die unter länge angegeben sind
' Also es wird von jedem buchstaben der ascii code ermittelt, dann der faktor dazugerechnet und wieder in eine zeichenfolge gewandelt 
diese zeichenfolge wird dann an wert drangehangen
Next i
 'An dieser stelle hast du nun in der variablen wert die geaenderte zeichenfolge
End Sub

Private Sub decodieren(s As String, faktor As Byte)
Dim i As Byte
Dim wert
For i = 1 To Len(s)
 wert = wert + Chr(Asc(Mid(s, i, 1)) - faktor)
Hier passiert das selbe wie oben nur das subtrahiert wird :wink:
Next i
a = wert
End Sub

Diese ganze sache hat den Vorteile das es alle zeichen unleserlich macht. Also Zahlen und sonderzeichen auch!

Ich hoffe ich konnt dir ein wenig helfen.

MFG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

  1. solltest du anfangen, mit Funktionen zu arbeiten
  2. solltest du keine GOTOs benutzen
  3. machst du dir viel zu viel arbeit mit den ganzen if-Anweisungen.

Ich hab jahrelang kein Basic mehr geschrieben, und hab auch keinen Interpreter zum testen da, aber so ungefähr sollte es gehen:

FUNCTION decrypt$(char$)
 IF char$ = "a" THEN
 decrypt$ = "z"
 ENDIF
 IF char$ = "A" THEN
 decrypt$ = "Z"
 ENDIF
 decrypt$ = CHR$(ASC(char$) - 1)
END FUNCTION

Und das Hauptprogramm (a$ wird entschlüsselt)

FOR i=1 TO LEN($a)
 $c = MID$($a, i, 1)
 IF "a" 

Und die Verschlüsselung geht ensprechend.

Soweit alles klar?

Grüße,
Moritz

Hallo Michl,

mit qbasic kenne ich mich net aus. Ich selbst programmiere mit
VB.

Aber ich würde es so machen.
Du hast die anzahl um wieviel stellen das wort verschoben
werden soll.
Jedes Zeichen hat einen Ascii Code
Das kleine a ist da 97 das b =98 etc z =122, die
Grossbuchstaben sind immer 32 weniger, also „a“ = 65 etc.
Wenn du nun das wort / ein buchstaben um bsp. 5 zeichen
verschieben willst, so addiere die einfach darauf. Also aus
„a“ = 97 --> 97+5 = 102. somit hast du den neuen
buchstaben.

Darauf beruht mein Programm ja bereits.

Dazu musst du nicht die ganzen if abfragen
stellen, sondern kannst dies in einer schleife wo du
buchstaben für buchstaben einliesst aendern.
Die geaenderten Wert kannst du ja in einer variablen speichern
und mit dieser dann arbeiten :smile:

Jo, das müsste ich hinbekommen. Ich war bisher eher zu faul dazu, mich um Schleifen zu kümmern. ^^

Unter VB würde das so aussehen

bsp.

Private Sub codieren(s As String, faktor As Byte) 'Unter s ist
die zeichenfolge die verschluesselt werden soll
Dim i As Byte
Dim wert
For i = 1 To Len(s)
'Schleife wird durchlaufen , len(s) =länge des strings
wert = wert + Chr(Asc(Mid(s, i, 1)) + faktor)
'unter faktor wird angegeben um wieviel stellen das zeichen
verschoben werden soll
'asc(buchstabe) gibt den ascii code des zeichens zurueck
'chr(zahl) gibt das zeichen des ascii codes zurueck
'mid(zeichenfolge, start, länge) gibt aus der zeichenfolge ab
position start eine anzahl an zeichen zurueck die unter länge
angegeben sind
’ Also es wird von jedem buchstaben der ascii code ermittelt,
dann der faktor dazugerechnet und wieder in eine zeichenfolge
gewandelt
diese zeichenfolge wird dann an wert drangehangen
Next i
'An dieser stelle hast du nun in der variablen wert die
geaenderte zeichenfolge
End Sub

Private Sub decodieren(s As String, faktor As Byte)
Dim i As Byte
Dim wert
For i = 1 To Len(s)
wert = wert + Chr(Asc(Mid(s, i, 1)) - faktor)
Hier passiert das selbe wie oben nur das subtrahiert wird :wink:
Next i
a = wert
End Sub

Diese ganze sache hat den Vorteile das es alle zeichen
unleserlich macht. Also Zahlen und sonderzeichen auch!

Ich hoffe ich konnt dir ein wenig helfen.

Klar! Vielen Dank auch!
Ich habe leider kein Visual Basic, aber danke, deine Hilfsbereitschaft hoch in Ehren!

  1. solltest du anfangen, mit Funktionen zu arbeiten
  2. solltest du keine GOTOs benutzen

Funktionen kenne ich noch garnicht, das mit den GOTOs ist eben Gewöhnungssache.

  1. machst du dir viel zu viel arbeit mit den ganzen
    if-Anweisungen.

Wie gesagt, das ist immer erstmal die „Holzhammermethode“. ^^
Schleifen und so sind dann der Feinschliff.

Ich hab jahrelang kein Basic mehr geschrieben, und hab auch
keinen Interpreter zum testen da, aber so ungefähr sollte es
gehen:

FUNCTION decrypt$(char$)
IF char$ = „a“ THEN
decrypt$ = „z“
ENDIF
IF char$ = „A“ THEN
decrypt$ = „Z“
ENDIF
decrypt$ = CHR$(ASC(char$) - 1)
END FUNCTION

Und das Hauptprogramm (a$ wird entschlüsselt)

FOR i=1 TO LEN($a)
$c = MID$($a, i, 1)
IF „a“

Und die Verschlüsselung geht ensprechend.

Soweit alles klar?

Jo, ich denke schon. Sind halt einige Befehle drinne, die ich nicht kenne, z.B. „decrypt“. Bin eben noch ein Lernender QBasicer ^^.
Mal schauen, ob das funktioniert. Das ist ja klasse! Auch dir vielen Dank!

Hi Michael,
ich habe dir was in Excelvba gebastelt, wenn du Excel hast lass es mall laufen (Alt+F11, Einfügen Modul, dort den Code hineinkopieren und den Cursor beliebig in den Codebereich von Auswahl() stellen und mit F5 starten.
Oder Fenster schliessen und in Excel über Extras Makros Makro auswahl ausführen
Es geht bis jetzt nur verschlüsseln, wenn ich das entschlüsseln auch machen soll, dann melde dich.
Vielleicht kannst du auch so einige Codeteile gebrauchen.
Gruß
Reinhard

Sub auswahl()
z$ = InputBox(" Möchten Sie ihren Code: " & vbCr & " (1) Verschlüsseln" & vbCr & " (2) Entschlüsseln")
If z$ "1" And z$ "2" Then Exit Sub
If z$ = "1" Then Call verschlüsseln
If z$ = "2" Then Call entschlüsseln
End Sub

Sub verschlüsseln()
r$ = InputBox(" Welches Wort möchten Sie verschlüsseln? (Nur Kleinbuchstaben!): ")
p = InputBox(" Wie viele Buchstaben verschieben? 3 4 5 ")
x = p - 3 ' wofür das??
For t = Len(r$) To 1 Step -1
 Mid$(r$, t, 1) = Chr(Asc(Mid$(r$, t, 1)) + p)
Next t
MsgBox r$
End Sub

Sub entschlüsseln()

End Sub

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]