VB6 Chiffre Code

Servus Leute ich bin ein absoluter VB Anfänger und soll folgendes Programm realisieren

Die Verschlüsselung von Informationen (Kryptographie) spielt im heutigen Internetzeitalter eine wesentliche Rolle. Durch einen Verschlüsselungsalgorithmus wird ein „Klartext“ in einen „Geheimtext“ transformiert, der dann von einem Sender zu einem Empfänger (z.B. über das Internet) übertragen wird, und anschließend wieder entschlüsselt wird.
Ein einfacher Verschlüsselungsalgorithmus (Chiffrieralgorithmus) ist das Cäsar-Chiffre, das für Nummern (z.B. Kreditkartennummern) folgendermaßen funktioniert:
Zu jeder Ziffer der Nummer wird die Zahl 3 dazuaddiert. Wird dabei die Zahl 9 überschritten, fängt man wieder bei 0 an.
Beispiel: Nummer: 6 7 5 8 3 9 2 4 1
Verschlüsselte Nummer: 9 0 8 1 6 2 5 7 4
Aus der ersten Ziffer 6 wird die 9, da 6 + 3 = 9.
Aus der zweiten Ziffer 7 wird die 0, da 7 + 3 = 10 (9 ist überschritten).
Aus der dritten Ziffer 5 wird die 8, da 5 + 3 = 8.
Aus der vierten Ziffer 8 wird die 1, da 8 + 3 = 11 (9 ist überschritten) usw.
Aufgabe:
Für eine maximal 9-stellige Nummer soll nach dem obigen Verfahren die verschlüsselte Nummer berechnet werden.

Das Programm soll mit den simpelsten VB Variablen umgesetzt werden d.h. sachen wie Len, Mid, Asc Unterfunktionen usw. darf ich nicht benutzen, kenne ich aber auch gar nicht
Ich soll das ganze in einer Schleife lösen und ich weiss auch das ich mit Mod und \ arbeiten muss.
Ich weiss aber leider wirklich gar nicht wie ich anfangen soll… :frowning:
ich bitte hier nicht darum meine Hausaufgabe zu lösen
aber wenn mir jemand von euch so ein bisschen auf die Sprünge helfen könnte wäre ich wirklich sehr sehr sehr dankbar

ich danke schonmal im vorraus
alena

Moin,

Nun offensichtlich musst du jede einzelne Position deiner Zahl durchlaufen.

Also z.B. eine Schleife, welche die jeweils aktuelle Ziffer in eine Variable liest, diese der Verarbeitung übergibt, das Ergebnis zurückschreibt und dann die nächste Runde dreht. Ausstieg ist dann einfach das Ende der Zahlenreihe.

Verarbeitung: nun, hier kannst du 2 Wege einschlagen: 1. du prüfst vorher ob deine Rechnung ein 2 stelliges Ergebnis hat, also die eingelesene Zahl =7 ist und dann entsprechend verzweigen. Oder 2. halt einfach die letzte Ziffer des Ergebnisses zurückschreiben.

All das lässt sich recht simpel mit Vergleichen + und - umsetzen.

Anregung genug?

Gruß
Daniel

Moin,

Nun offensichtlich musst du jede einzelne Position deiner Zahl
durchlaufen.

Also z.B. eine Schleife, welche die jeweils aktuelle Ziffer in
eine Variable liest, diese der Verarbeitung übergibt, das
Ergebnis zurückschreibt und dann die nächste Runde dreht.
Ausstieg ist dann einfach das Ende der Zahlenreihe.

Das hab ich soweit verstanden aber wie durchlaufe ich jede einzelne position?

Hi,

Das hab ich soweit verstanden aber wie durchlaufe ich jede
einzelne position?

wenn Du keinen String zerlegen sollst, ist die Ziffernfolge ja eine Zahl. Die kannst Du durch Zehnerpotenzen teilen und die Nackommastellen wegwerfen. Dafür verwendest Du einfach \ statt / als Rechenzeichen.

123456789 \ 10 ^ 1 = 12345678

123456789 \ 10 ^ 2 = 1234567

12345678 - 10 * 1234567 = 8

Das ist erst mal nur Mathematik. das musst Du nun nur noch in Code umsetzen und in eine Schleife bringen.

Wenn Du nicht darauf kommst, scroll mal ganz nach unten. :smile:

Gruß Rainer

Option Explicit

Private Sub Command1\_Click()
 Dim a As Long, e As Integer, i As Integer
 a = 123456789
 For i = 0 To 8
 e = ((a \ (10 ^ i)) - (10 \* (a \ (10 ^ (i + 1)))) + 3)
 If e \> 9 Then e = e - 10
 List1.AddItem e
 Next
End Sub

Wenn Du nicht darauf kommst, scroll mal ganz nach unten. :smile:

Hallo Rainer,

ich erlebte knallharte Lehrer, da kriegste für deinen Code Null Punkte :smile:
Denn das Ergebnis ist falschrum. 475261809 anstatt 908162574.

Dazu kommt, in der Aufgabenstellung steht:
„Für eine maximal 9-stellige Nummer soll…“
D.h. die Zahl kann auch nur 4-stellig sein.
Dann klappt der Code auch nicht.

Übrigens scheint da der Lehrer jedes Semester neu mit der gleichen Aufgabe zu quälen, siehe:
http://forum.vb-paradise.de/programmieren/grundlagen…

„ich weiss auch das ich mit Mod und \ arbeiten muss.“ ist mir nicht eindeutig, bedeutet das, man muß Mod UND \ benutzen?

Gruß
Reinhard

Hallo Reinhard,

ich erlebte knallharte Lehrer, da kriegste für deinen Code
Null Punkte :smile:

daß das noch nicht fertig ist, weiß ich auch. :smile: Ich habe die Zahl noch nicht wieder zusammengesetzt. Die richtige Abbruchbedingung für i zu errechnen, ist auch nicht schwer, habe ich mir ebenfalls gespart.

„ich weiss auch das ich mit Mod und \ arbeiten muss.“ ist mir
nicht eindeutig, bedeutet das, man muß Mod UND \ benutzen?

Kann sein, dann wird die Ziffer eben mit Mod statt durch Subtraktion ermittelt. :smile:

Die Frage, auf die ich geantwortet habe lautete: ‚Wie komme ich an die einzelnen Stellen‘. Eine Note wollte ich für den Code gar nicht haben. :smile: Brauch ich nicht mehr, der Job fpr meinen Nachfolger ist schon ausgeschreiben. Ich bin fast schon Rentner. *gg*

Gruß Rainer

„ich weiss auch das ich mit Mod und \ arbeiten muss.“ ist mir
nicht eindeutig, bedeutet das, man muß Mod UND \ benutzen?

Gruß
Reinhard

das hat mir mein tutor zumindestens gesagt
und ja mit der aufgabe haben sich die semester davor auch schon abquälen müssen :smiley:
momentan ist eine cd im umlauf mit allen aufgaben aber das ist ja auch nicht der sinn der sache

und rainer danke für den beispiel-code ich probiere mich mal die tage an der ganzen geschichte und melde mich dann nochmal

gruß alena

hey reinhard und rainer
so ich habs mal probiert…
eure vorschläge konnte ich leider alle nicht umsetzen
ich kann einfach kein passenden alhorithmus bilden
deswegen hab ich mal alle nummer durch deklariert
sieht halt wirklich fürchterlich aus … :frowning:

Option Explicit

Private Sub Command1_Click()
Dim Nummer, Nummer2, Nummer3, Nummer4, Nummer5, Nummer6, Nummer7, Nummer8, Nummer9, AnzahlZiffer, i As Long
Nummer = Text1.Text
AnzahlZiffer = Len(Nummer)
Text2.Text = AnzahlZiffer
If Nummer > 999999999 Then
MsgBox („Ziffernfolge zu lange“)
Else
For i = 1 To AnzahlZiffer
Nummer2 = Nummer Mod 10 + 3 & Nummer3 Mod 10 + 3 & Nummer4 Mod 10 + 3 & Nummer5 Mod 10 + 3 & Nummer6 Mod 10 + 3 & Nummer7 Mod 10 + 3 _
& Nummer8 Mod 10 + 3 & Nummer9 Mod 10 + 3 & Nummer10 Mod 10 + 3
Nummer3 = Nummer \ 10
Nummer4 = Nummer3 \ 10
Nummer5 = Nummer4 \ 10
Nummer6 = Nummer5 \ 10
Nummer7 = Nummer6 \ 10
Nummer8 = Nummer7 \ 10
Nummer9 = Nummer8 \ 10
Next i
Text3.Text = Nummer2
End If
End Sub

grüße alena

Hallo,

ich schreib’ mal ein paar Kommentare dazu …

Option Explicit

Private Sub Command1_Click()
Dim Nummer, Nummer2, Nummer3, Nummer4, Nummer5, Nummer6,
Nummer7, Nummer8, Nummer9, AnzahlZiffer, i As Long

Fehler in der Deklaration.
i ist als Long dekariert, müsste nur Integer sein.
Alle anderen Variablen sind als Variant deklariert. Wenn die alle Long sein sollen dann sieht das so aus:

Dim Nummer As Long, Nummer2 As Long, Nummer3 As Long …

Aber Du brauchst die Variablen natürlich nicht alle. So wird das Deinem Lehrer nicht gefallen.

Nummer = Text1.Text

Besser wäre:
Nummer = CLng(Text11.Text)

AnzahlZiffer = Len(Nummer)

Das ist falsch. Das geht nur, wenn Nummer als String deklariert ist, aber mit Strings wolltest Du ja nicht arbeiten.

Text2.Text = AnzahlZiffer

Die Anzahl Ziffern willst Du auch ausgeben? OK, aber sicher nicht so.

If Nummer > 999999999 Then
MsgBox („Ziffernfolge zu lange“)
Else

OK, einverstanden. :smile:

For i = 1 To AnzahlZiffer
Nummer2 = Nummer Mod 10 + 3 & Nummer3 Mod 10 + 3 & Nummer4 Mod
10 + 3 & Nummer5 Mod 10 + 3 & Nummer6 Mod 10 + 3 & Nummer7 Mod
10 + 3 _
& Nummer8 Mod 10 + 3 & Nummer9 Mod 10 + 3 & Nummer10 Mod 10 +
3
Nummer3 = Nummer \ 10
Nummer4 = Nummer3 \ 10
Nummer5 = Nummer4 \ 10
Nummer6 = Nummer5 \ 10
Nummer7 = Nummer6 \ 10
Nummer8 = Nummer7 \ 10
Nummer9 = Nummer8 \ 10
Next i

Wozu die Zählschleife? Das i verwendest Du gar nicht.

Wenn Du nicht weißt, wieviele Schleifendurchläufe Du brauchst, ist eine andere Schleife als ausgerechnet eine Zählschleife eventuell besser. Do Loop und While Wend kennst Du?

Text3.Text = Nummer2
End If
End Sub

Das solltest Du noch einmal gründlich überarbeiten. Das wird Deinem Leherer so nicht gefallen.

Noch einmal ein Code als Dekanstoß, aber wieder, ohne das Ergebnis zusammenzuschrauben. Das ist nur ein Hinweis, wie Du den ‚Spaghetticode‘ vermeiden kannst.

Gruß Rainer

Option Explicit

Private Sub Command1\_Click()
 Dim a As Long, b As Integer, n As Integer
 a = CLng(Text1.Text)
 While a \> 0
 b = a Mod 10 'b ist letzte Ziffer
 a = a \ 10
 n = n + 1
 Wend
 Label1.Caption = n 'Anzahl Ziffern
End Sub

AnzahlZiffer = Len(Nummer)

Hallo Alena,

ich dachte Len() wäre verboten?

Option Explicit
'
Private Sub Form\_Load()
Text1.Text = 675839241
Text2.Text = ""
Text3.Text = ""
Command2.Enabled = False
End Sub
'
Private Sub Command1\_Click()
'Chiffrieren
Dim a As Long, e As Long
a = CLng(Text1.Text)
Do
 e = a Mod 10 + 3
 a = Int(a / 10)
 If e \> 9 Then e = e - 10
 Text2.Text = e & Text2.Text
Loop While a \> 0
Command2.Enabled = True
End Sub
'
Private Sub Command2\_Click()
'Dechiffrieren
Dim a As Long, e As Integer
a = CLng(Text2.Text)
Do
 e = a Mod 10 - 3
 a = Int(a / 10)
 If e 0
End Sub

GRuß
Reinhard

Hallo Reinhard,

ich muss auch mal einen Einspruch einlegen. :smile:

Do
e = a Mod 10 + 3
a = Int(a / 10)
If e > 9 Then e = e - 10
Text2.Text = e & Text2.Text

Da baust Du das Ergebnis aber als String zusammen und überlässt VB die Konvertierung. Das ist nicht ganz sauber.

Aber die Anzahl soll ja auch ausgegeben werden, das kann bei einer sauberen Lösung helfen. :smile:

Gruß Rainer

Hallo Reinhard,

a = Int(a / 10)

ist zwr richtig, aber …

a = a \ 10

macht das Selbe.

Gruß Rainer

Hallo Rainer,

ich muss auch mal einen Einspruch einlegen. :smile:

schön, sowas ist immer gut :smile:

Da baust Du das Ergebnis aber als String zusammen und
überlässt VB die Konvertierung. Das ist nicht ganz sauber.

Wußt ja nicht daß der Lehrer ein Sauberkeitsfanatiker ist *gg*

Aber die Anzahl soll ja auch ausgegeben werden, das kann bei
einer sauberen Lösung helfen. :smile:

Ja, aber Len() ist doch verboten, also damit nicht.
Abgesehen davon ergibt Len(a) immer 4, egal wie groß a ist.
Es werden nur die Bytes gezählt, die sind halt bei Long 4.
Dim a as long
a=123456789
msgbox len(a)

Ich hab jetzt was gebastelt. Die Msgbox zeigt korrekt an, aber in Text2 wird 99 angezeigt anstatt 9!?
Das war aber nicht so im vorigen Code von mir, da wurde da korrekt 9 angezeigt.

Jedenfalls kann der Lehrer jetzt nicht groß meckern, \ ist drin und Mod auch.

Private Sub Form\_Load()
Text1.Text = 6 '75839241
Text2.Text = ""
Text3.Text = ""
Command2.Enabled = False
End Sub
'
Private Sub Command1\_Click()
'Chiffrieren
Dim a As Long, e As Long, ErgebnisFalsch As Long
Dim Anzahl As Integer, ErgebnisRichtig As Long
a = CLng(Text1.Text)
Do
 e = a Mod 10 + 3
 a = a \ 10
 If e \> 9 Then e = e - 10
 ErgebnisFalsch = ErgebnisFalsch \* 10 + e
 Text2.Text = e & Text2.Text
 Anzahl = Anzahl + 1
Loop While a \> 0
Command2.Enabled = True
'MsgBox ErgebnisFalsch 'ahlen in falscher Reihenfolge
Do
 e = ErgebnisFalsch Mod 10
 ErgebnisFalsch = ErgebnisFalsch \ 10
 ErgebnisRichtig = ErgebnisRichtig \* 10 + e
 Text2.Text = e & Text2.Text
Loop While ErgebnisFalsch \> 0
MsgBox Anzahl & " " & ErgebnisRichtig
End Sub

Gruß
Reinhard

Hallo Reinhard,

ErgebnisFalsch = ErgebnisFalsch * 10 + e

Drehst Du damit nicht die Reihenfolge um? Ich kann gerade nicht testen, mein Rechner ist ausgelastet mit einem Programm, das noch ein paar Tage zu rechnen hat. :smile: Ich tipp mal einfach hier.

Ich dachte an …

While a \> 0
 b = (a MOD 10) + 3 'Du hast da keine Klammer ... 
 If b \> 9 then b = b - 10
 e = e + (b \* (10 ^ n)) 'Ergebnis
 n = n + 1 'Anzahl Stellen
Wend

Ob die Klammern alle gebraucht werden mag ich nicht nachdenken. :smile:

Gruß Rainer

Hallo Rainer,

ErgebnisFalsch = ErgebnisFalsch * 10 + e

Drehst Du damit nicht die Reihenfolge um?

irgendwie schon, aber ging nicht anders *nicht sicher bin*

Ich kann gerade
nicht testen, mein Rechner ist ausgelastet mit einem Programm,
das noch ein paar Tage zu rechnen hat. :smile:

Schau an, Brute Force Attack auf die Bundesbank o.ä., nicht schlecht :smile:

While a > 0
b = (a MOD 10) + 3 'Du hast da keine Klammer …
If b > 9 then b = b - 10
e = e + (b * (10 ^ n)) 'Ergebnis
n = n + 1 'Anzahl Stellen
Wend

Aha, eine Endlosschleife *gg* Okay, das kann man ja korrigieren. Mal den Codeansatz testen…

Ob die Klammern alle gebraucht werden mag ich nicht
nachdenken. :smile:

Mache ich genauso, wenn ich nicht sofort genau weiß Klammer oder nicht, setze ich erstmal Klammern. Wenn alles läuft teste ich aus Lerngründen Zug um Zug wie es ohne Klammern klappt oder nicht.

Gruß
Reinhard

Hallo Reinhard,

Schau an, Brute Force Attack auf die Bundesbank o.ä., nicht
schlecht :smile:

*gg* nur eine Spielerei mit Lottozahlen. :smile:

While a > 0
b = (a MOD 10) + 3 'Du hast da keine Klammer …
If b > 9 then b = b - 10
e = e + (b * (10 ^ n)) 'Ergebnis
n = n + 1 'Anzahl Stellen
Wend

Aha, eine Endlosschleife *gg* Okay, das kann man ja
korrigieren. Mal den Codeansatz testen…

a = a \ 10 hab’ ich vergessen. Immer wenn ich nicht teste … :frowning:

Ob die Klammern alle gebraucht werden mag ich nicht
nachdenken. :smile:

Mache ich genauso, wenn ich nicht sofort genau weiß Klammer
oder nicht, setze ich erstmal Klammern. Wenn alles läuft teste
ich aus Lerngründen Zug um Zug wie es ohne Klammern klappt
oder nicht.

Ich lass’ die dann immer stehen, eine zu viel schadet ja nicht und der Zusammenhang ist dann leichter zu lesen. :smile:

Gruß Rainer

servus jungs
also heute nochmal eine vb vorlesung gehabt
ich kenne jetzt len , mid , right , usw… :smiley:

hab den ganzen plan nochmal umgeworfen
und das ganze sieht jetzt so aus

Option Explicit

Private Sub Command1_Click()

Dim Nummer As Long
Dim Zahl As Long
Dim i As Byte
Dim ergebnis As Long
Dim Anzahl As Integer

Nummer = (Text1.Text)

Anzahl = Len(Text1.Text)
Text2.Text = Anzahl
If Anzahl > 9 Then
MsgBox „Fehler“
Else
For i = 1 To Anzahl
Zahl = Mid(Nummer, i, 1)
If Zahl

1 Like

Witzbold(in)
Hallo alena,

also heute nochmal eine vb vorlesung gehabt
ich kenne jetzt len , mid , right , usw… :smiley:
hab den ganzen plan nochmal umgeworfen
und das ganze sieht jetzt so aus

da es mir Spass gemacht hat diese Aufgabe ohn Stringfunktionen zu lösen und auch der Gedankenaustausch mit Rainer machte mir (wie immer)Freude, will ich ja mal großzügiegerweise Gnade vor Recht ergehen lassen.

Du stellst hier eine Anfrage mit Vorgaben was beim Lösungsweg nicht enthalten sein darf. Man versucht dir zu helfen dies zu erfüllen.
Und auf einmal, naach vielen Beiträgen, =zeit,=Aufwand,=Mühe, kommste an mit Bätschi bätschi, die Vorgaben müssen gar nicht erfüllt sein.

Kannst du dir vorstellen, daß man sich da verarscht vorkommen kann?

Nur mal so als Gedanke.

Gruß
Reinhard

Option Explicit

Private Sub Command1_Click()

Dim Nummer As Long
Dim Zahl As Long
Dim i As Byte
Dim ergebnis As Long
Dim Anzahl As Integer

Nummer = (Text1.Text)

Anzahl = Len(Text1.Text)
Text2.Text = Anzahl
If Anzahl > 9 Then
MsgBox „Fehler“
Else
For i = 1 To Anzahl
Zahl = Mid(Nummer, i, 1)
If Zahl

Moin, Reinhard,

Kannst du dir vorstellen, daß man sich da verarscht vorkommen
kann?

seit geraumer Zeit schwirrt hier ein kluger Satz durchs Forum: Wende für die Antwort niemals mehr Zeit auf als der Fragesteller für die Frage :wink:

Ganz nebenbei gefragt: Was bedeutet in VB eigentlich der Backslash ()?

Gruß Ralf

Ganz nebenbei gefragt: Was bedeutet in VB eigentlich der
Backslash ()?

Moin Ralf,

nachstehend aus der VB-Hilfe.

Gruß
Reinhard

\ Operator
Dient zur Division zweier Zahlen und gibt ein ganzzahliges Ergebnis 
zurück.

Syntax

Ergebnis = Operand1 \ Operand2

Die Syntax des Operators \ besteht aus folgenden Teilen:

Teil Beschreibung
Ergebnis Erforderlich. Eine beliebige numerische Variable.
Operand1 Erforderlich. Ein beliebiger numerischer Ausdruck. 
Operand2 Erforderlich. Ein beliebiger numerischer Ausdruck. 

Bemerkungen

Vor der Division werden die numerischen Ausdrücke in Ausdrücke der 
Typen Byte, Integer oder Long gerundet.
Ergebnis hat im allgemeinen den Datentyp Byte, Integer oder Long bzw. 
bei einem Variant den Untertyp Byte, Integer oder Long, auch wenn 
Ergebnis keine ganze Zahl ist. Alle Nachkommastellen werden 
abgeschnitten. Wenn jedoch mindestens ein Ausdruck ein Null-Ausdruck 
ist, enthält Ergebnis ebenfalls Null. Wenn ein Ausdruck den Wert 
Empty hat, wird er als 0 interpretiert.

In diesem Beispiel wird der Operator \ verwendet, um eine
 Ganzzahldivision durchzuführen.

Dim Wert1
Wert1 = 11 \ 4 ' Liefert 2.
Wert1 = 9 \ 3 ' Liefert 3. 
Wert1 = 100 \ 3 ' Liefert 33.
1 Like