Benötige Tipps für ein QBasic Programm

Von: (abgemeldet) , Frage gestellt am Mi, 20. Apr 2005
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!

4 Antworten zu dieser Frage

  1. Antwort von nach 2 Stunden 0 hilfreich
    Re: Benötige Tipps für ein QBasic Programm
    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" <= $c AND $c <= "z" OR "A" <= $c AND $c <= "Z" THEN
            $b = $b + decrypt($c)
        ELSE
            $b = $b + $c
        ENDIF
    NEXT i
    


    Und die Verschlüsselung geht ensprechend.

    Soweit alles klar?

    Grüße,
    Moritz
    • Antwort von (abgemeldet) nach 4 Stunden 0 hilfreich
      Re^2: Benötige Tipps für ein QBasic Programm
      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 :-)
      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 ;-)
      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. 3) 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" <= $c AND $c <= "z" OR "A" <= $c AND $c
      <= "Z" THEN
              $b = $b + decrypt($c)
          ELSE
              $b = $b + $c
          ENDIF
      NEXT i
      


      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!
  2. Antwort von nach 2 Stunden 0 hilfreich
    Re: Benötige Tipps für ein QBasic Programm
    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 :-)

    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 ;-)
    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]
  3. Antwort von nach 6 Tagen 0 hilfreich
    Re: Benötige Tipps für ein QBasic Programm
    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]
Keine passende Antwort gefunden? Jetzt eigene Frage stellen!