Autor |
Beitrag |
[deya]
Hält's aus hier
Beiträge: 4
|
Verfasst: Fr 02.03.07 16:04
hallo.
Hab ein kleines Problem. In der Schule hab ich das Cäsar Programm super hinbekommen + funktioniert auch. Wollte es jetzt zuhause noch mal neu programmieren und verbessern, hab dabei allerdings das Programm n bisschen geändert. Ich versteh nur nicht, was ich die ganze zeit falsch mache.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button1Click(Sender: TObject); var I,K,V:integer; begin for I:=1 to length(edit1.text) do; K:=ord(edit1.text[I]); V:=strtoint(edit2.text); K:=K+V; edit3.text:=char(K); end; |
K=Klartext
V=verschiebefaktor
I=Glieder der Zeichenkette
hier mal der programm text. Weiß nur nicht was hier falsch ist. Hab überlegt ob man es nicht als "length(edit1.text[I])" schreibt. Ich weiß es nicht. Ich suche Hilfe und ich hoffe die finde ich hier!
Dann noch eine weitere frage:
wenn ich z um zb 2 verschieben will, dann fängt er ja bei dem o.g. programm nicht bei a wieder an.
hatte nun gedacht, dass mit einer if-schleife zu machen.. also ungefähr:
if K:=90 then
K:=63 (oder 64,65... ich weiß nicht mehr genau wann der ascii code für a anfängt  )
und dann mit dem weiter machen wie oben. aber auch das hat in der schule nicht geklappt..
Ich hoffe ich finde hier Hilfe, bedanke mich schonmal im Vorraus!
lg,
deya
Moderiert von Gausi: Delphi-Tags hinzugefügt
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 02.03.07 19:50
also, ich würd dir empfehlen
a) deinen quelltext ordentlich zu formatieren. wenn du es dir angewöhnst, wirst du gleich viel weniger probleme haben
b) würde an deiner stelle, den quelltext hier im forum in delphi tags (Bereiche --> delphi) einschliessen, dann siehts gleich viel ordentlicher aus
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| PROCEDURE TForm1.Button1Click(Sender: TObject); VAR I, K, V: INTEGER; BEGIN FOR I := 1 TO Length(edit1.Text) DO ; K := Ord(edit1.Text[I]); V := StrToInt(edit2.Text); K := K + V; edit3.Text := CHAR(K); END; |
wenn du nicht jedes zeichen prozessieren möchtest, kannst dir auch mal die while oder repeat schleife ansehen. ich denke, dein grösstes problem war, deine leerschleife...
<HTH>
|
|
[deya] 
Hält's aus hier
Beiträge: 4
|
Verfasst: Fr 02.03.07 21:29
also irgendwie versteh ichs nicht. vielleicht bin ich einfach zu doof? was mach ich falsch?! habe jetzt das programm nochmals neu geschrieben genauso wie o.g. und jetzt sagt er mir bei dem neuen und beim alten programm "Project raised exception dass EConverterror with message " is not a valid integer value'. Process stopped. Use step or run to continue"
ich verzweifel noch daran. das schlimme ist: ich hab es ja schon komplett laufen in der Schule 
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 02.03.07 21:46
wenn du mit step dann durchgehst, dann zeigt er dir doch genau die stelle, welche er nicht abkann. wo meckert er denn?
PS: warum soll das schlimm sein, wenn du 'n wenig übung bekommst? irgendwann musst du eh alle fehler mal machen, und besser heut und jetzt, als dann in einer prüfung oder unter zeitdruck  , dann kannst du lernen was es zu vermeiden oder besser zu machen gibt 
|
|
[deya] 
Hält's aus hier
Beiträge: 4
|
Verfasst: Fr 02.03.07 22:26
das ist es ja: er zeigt mir keinen Fehler! .. Das Programm läuft. Wenn ich dann den Klartext eingebe zb "Hallo" dann "verschlüsseln" drücken und dann bringt er diese Meldung. Heute mittag hat er einfach immer nur den ersten buchstaben verschlüsselt. Nun funktioniert es gar nicht mehr.
Ja, stimmt schon. Aber mich frustriert es immer so, wenn es nciht klappt  Noch müssen wir in Arbeiten keine Programme vorlegen. Nur welche schreiben und sachen abgefragt bekommen (in dieser arbeit sortiersysteme, datentyp char, ..)
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 02.03.07 22:53
[deya] hat folgendes geschrieben: | das ist es ja: er zeigt mir keinen Fehler! .. Das Programm läuft. Wenn ich dann den Klartext eingebe zb "Hallo" dann "verschlüsseln" drücken und dann bringt er diese Meldung. Heute mittag hat er einfach immer nur den ersten buchstaben verschlüsselt. Nun funktioniert es gar nicht mehr. |
dann geb doch mal 'n zwei zeichen langes wort zum verschlüsseln vor und setze breakpoints und steppe mit F7, F8 durch und lass dir dabei die variablen im watch fenster anzeigen, so kannst du mit 'n paar minuten aufwand genau sehen was passiert.... :-) und keine panik, auch debuggen will gelernt sein :-) PS: was hast denn für 'ne delphi version? PS: poste doch mal deine routine, dann kann ich oder ein anderer hier im forum noch mal drüberschaun, ...
|
|
[deya] 
Hält's aus hier
Beiträge: 4
|
Verfasst: Fr 02.03.07 23:35
ok, werd ich morgen mal probieren.
hab delphi7
routine?
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 03.03.07 00:03
[deya] hat folgendes geschrieben: | routine? |
=funktion/procedure/codeaussschnitt, welcher probleme macht.
|
|
LorenzS
      
Beiträge: 128
MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
|
Verfasst: Do 20.12.07 10:54
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| PROCEDURE TForm1.Button1Click(Sender: TObject); VAR I, K, V: INTEGER; BEGIN V := StrToIntDef(edit2.Text,0); edit3.Text := ''; FOR I := 1 TO Length(edit1.Text) DO BEGIN K := Ord(edit1.Text[I]); K := K + V; edit3.Text := edit3.Text + CHR(K and 255); END; END; |
Das kommt einer Verschlüsslung schon näher
|
|
Tarry
      
Beiträge: 213
Erhaltene Danke: 1
|
Verfasst: Do 20.12.07 23:48
Hi,
ich habe in der Schule auch mal ne Caesar verschlüsselung gemacht, diese aber allerdings noch seeeeehr  kompliziert gelöst, also erschick nicht
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| procedure verschluesseln (AlphaA, AlphaB: String); var i,j,k,AnzZeichen,: Integer; aktuelleZeileA,aktuelleZeileB: String; cancelB, cancelZ: Boolean; begin With Hauptfenster do Begin For k := 0 to memA.Lines.Count do Begin j := 1; aktuelleZeileA := memA.Lines.Strings[k]; aktuelleZeileB := ''; if aktuelleZeileA= '' then aktuelleZeileB := ''; While j <= length(memA.Lines.Strings[k]) Do Begin i := 0; cancelB := false; cancelZ := false; While (cancelB= false) and (cancelZ= false) do Begin if aktuelleZeileA[j]= ' ' then Begin cancelZ := True; aktuelleZeileB := aktuelleZeileB + ' '; End; if i <= length(AlphaA) then i := i+ 1 else Begin aktuelleZeileB := aktuelleZeileB + aktuelleZeileA[j]; cancelZ := true; End; if aktuelleZeileA[j] = AlphaA[i] then cancelB := true; End; if cancelB= True then Begin aktuelleZeileB := aktuelleZeileB + AlphaB[i]; End; j := j+ 1; End; memB.Lines.Add(aktuelleZeileB); End; End; end; |
Hab die Statistik mal schnell rausgelöscht, wenn da noch ne Variable rumschwirrt die dort nichts zu suchen h
AlphaA ist das ursprüngliche Alphabet (oder Sonderzeichen)---> 'ABCDEFG'
AlphaB das verschobene ---> 'BCDEFGA'
Und die procedure geht halt für jede Zeile Zeichen für Zeichen ab.
Hoffe ich konnte dir helfen, wenn du fragen hast ---> PN an mich.
Gruß
Tarry
PS: Habs mir gerade nochmal angesehen, AZ ist das selbe wie alphaA, nur die globale Variabel, wie gesagt das war nen bissle her  aber immerhin hats funktioniert.
Edit: Was ich noch loswerden wollte, durch meine AlphaB Methode kann man das Alphabet natürlich auch wild durcheinander vertauschen (in unserem Beispiel also 'BGFCAD').
Zuletzt bearbeitet von Tarry am Fr 21.12.07 00:14, insgesamt 2-mal bearbeitet
|
|
LorenzS
      
Beiträge: 128
MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
|
Verfasst: Fr 21.12.07 00:04
ja, dein algo verarbeitet gleich einen ganzen text, und hat einige extra abbruch bedingungen
sieh einen sehr oft umgebauten source aus
|
|
Tarry
      
Beiträge: 213
Erhaltene Danke: 1
|
Verfasst: Fr 21.12.07 00:10
Ja, da hast du Recht
Aber die verschiedenen Abbruchkriterien waren nötig um zu erkennen ob er den Buchstaben jetzt verschlüsseln kann oder es ein Zeichen war, welches nicht in AlphaA vorhanden war.
Insgesamt sieht der Text jetzt nur wegen der Statistik so böse aus das werde ich gleich mal überarbeiten.
Gruß
Tarry
EDIT: Sorry,  Hab grade erst gemerkt, dass der Thread hier noch aus Anfang März stammt, tut mir leid den wieder ausgegraben zu haben. 
|
|
LorenzS
      
Beiträge: 128
MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
|
Verfasst: Fr 21.12.07 00:25
gibt es ne zeit begrenzung für threads? habe mich gestern erst angemeldet und bin die threads alle mal durchgegangen
|
|
Zorro
      
Beiträge: 76
Win 2000, Win XP Pro
Delphi 7 Architect
|
Verfasst: Mi 26.12.07 02:43
[deya] hat folgendes geschrieben: | hallo.
Hab ein kleines Problem. In der Schule hab ich das Cäsar Programm super hinbekommen + funktioniert auch. Wollte es jetzt zuhause noch mal neu programmieren und verbessern, hab dabei allerdings das Programm n bisschen geändert. Ich versteh nur nicht, was ich die ganze zeit falsch mache.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button1Click(Sender: TObject); var I,K,V:integer; begin for I:=1 to length(edit1.text) do; K:=ord(edit1.text[I]); V:=strtoint(edit2.text); K:=K+V; edit3.text:=char(K); end; |
|
Was da falsch ist? Ganz einfach, hier wird "Chr" und "Char" verwechselt...
Das eine ist die "Gegenfunktion" zu "Ord", das andere ist ein Typecasting.
Des weiteren scheint in der Zeile 8 die Änderung auf "edit3.text[I]" angebracht.
Und als Kosmetik reicht es vermutlich, die Umwandlung des Verschiebefaktors auf Integer EINmal ausserhalb der Schleife zu erledigen.
Greetz
Zorro
|
|
Tarry
      
Beiträge: 213
Erhaltene Danke: 1
|
Verfasst: Di 01.01.08 19:43
So, hab den Code nochmal umschreiben müssen, jetzt verschlüsselt er einfach einen eingegebenen String:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| function verschluesseln (Folge, AlphaA, AlphaB: String): String; var i,j: integer; cancelB, cancelZ: Boolean; begin j := 1; if Folge= '' then result := ''; While j <= length(Folge) Do Begin i := 0; cancelB := false; cancelZ := false; While (cancelB= false) and (cancelZ= false) do Begin if i <= length(AlphaB) then i := i+ 1 else Begin result := result + Folge[j]; cancelZ := true; End; if Folge[j] = AlphaA[i] then cancelB := true; End; if cancelB= True then Begin result := result + AlphaB[i]; End; j := j+ 1; End; end; |
AlphaA ist das Alphabet also 'ABCDEFG...abcdefg...'
AlphaB das gegenstück also z.B. 'BCDEFG...bcdefg...'
Das i-te Zeichen von AlphaA wird einfach durch das i-te Zeichen in AlphaB ersetzt.
Ein Beispiel:
Delphi-Quelltext 1: 2: 3:
| AZ := 'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜabcdefghijklmnopqrstuvwxyzäöü'; Schluessel := 'FZäÄHkYNDEzemJPKjbÖORQLgCGuXxlwhpMsWBftoüUTAÜIiqVdröycanvS'; Edit2.Text := verschluesseln(Edit1.Text, AZ, Schluessel); |
...ist zwar nicht ganz im Sinne von Caesar, da hier das Alphabet nicht verschoben sondern "durcheinandergewürfelt" wurde, aber so ist es deutlich sicherer. Ne "echte" Caesar Verschlüsselung lässt sich natürlich trotzdem durchführen.
Gruß
Tarry
_________________ "Es gibt zwei Dinge, die unendlich sind. Das Universum und die menschliche Dummheit. Beim Universum bin ich mir noch nicht ganz sicher." -Albert Einstein
|
|