Autor Beitrag
[deya]
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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.

ausblenden 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 user profile iconGausi: Delphi-Tags hinzugefügt
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 :-)

ausblenden 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 
  ; //hier endet deine FOR-Schleife
 K := Ord(edit1.Text[I]);
 V := StrToInt(edit2.Text); //wie lang ist denn dein 
                            //string und aus was besteht er?
                            //normal dann zugriff wie 
                            // v := ord(edit2.text[i]); //wert des zeichens zurückliefern
 K := K + V;
 edit3.Text := CHAR(K); //hier am besten edit3.text := chr(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] Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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



BeitragVerfasst: 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] Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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



BeitragVerfasst: Fr 02.03.07 22:53 
user profile icon[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] Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 02.03.07 23:35 
ok, werd ich morgen mal probieren.

hab delphi7

routine?
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 03.03.07 00:03 
user profile icon[deya] hat folgendes geschrieben:
routine?
=funktion/procedure/codeaussschnitt, welcher probleme macht.
LorenzS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
BeitragVerfasst: Do 20.12.07 10:54 
ausblenden 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);    //Zeichenverschiebung
 edit3.Text := '';                           //Auagabe löschen
 FOR I := 1 TO Length(edit1.Text) DO
 BEGIN   
  K          := Ord(edit1.Text[I]);          //Zeichen Auslesen  
  K          := K + V;                       //Verschieben
  edit3.Text := edit3.Text + CHR(K and 255); //Verschlüsseltes Zeichen an Aufgabe anhängen
 END;
END;

Das kommt einer Verschlüsslung schon näher
Tarry
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 213
Erhaltene Danke: 1



BeitragVerfasst: 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 :)

ausblenden volle Höhe 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:
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       // Lines
  Begin
    j := 1;
    aktuelleZeileA := memA.Lines.Strings[k];          // ZeileA setzten
    aktuelleZeileB := '';                            // ZeileB leeren
    if aktuelleZeileA= '' then aktuelleZeileB := '';      // Wenn Zeile Leer.
 //   cancel := false;
    While j <= length(memA.Lines.Strings[k]) Do                // Einzelne Buchstaben
      Begin
        i := 0;
        cancelB := false;
        cancelZ := false;
        While (cancelB= false) and (cancelZ= false) do       // Buchstaben checken wenn kein cancel aktiv ist
        Begin
          if aktuelleZeileA[j]= ' '        // Wenn Leerzeichen, dann sofort cancelZeichen aktivieren
          then Begin
                 cancelZ := True;
                 aktuelleZeileB := aktuelleZeileB + ' ';
               End;
          if i <= length(AlphaA)
          then i := i+ 1
          else Begin                              //Kein Buchtabe
                aktuelleZeileB := aktuelleZeileB + aktuelleZeileA[j];  // Zeichen übernehmen
                cancelZ := true;                 // cancelZeichen aktivieren
               End;
          if aktuelleZeileA[j] = AlphaA[i]       // Ist ein Buchstabe?
          then cancelB := true;                  // Wenn, dann cancelBuchstaben aktivieren
        End;
        if cancelB= True                     // Wenn wegen cancelBuchtabe beendet
        then Begin
               aktuelleZeileB := aktuelleZeileB + AlphaB[i];   // Dann Key übernehmen
             End;
        j := j+ 1;
      End;
  memB.Lines.Add(aktuelleZeileB);           // Zeile hinzufügen
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 213
Erhaltene Danke: 1



BeitragVerfasst: Fr 21.12.07 00:10 
Ja, da hast du Recht :oops:
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, :oops: Hab grade erst gemerkt, dass der Thread hier noch aus Anfang März stammt, tut mir leid den wieder ausgegraben zu haben. :oops:
LorenzS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76

Win 2000, Win XP Pro
Delphi 7 Architect
BeitragVerfasst: Mi 26.12.07 02:43 
user profile icon[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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 213
Erhaltene Danke: 1



BeitragVerfasst: Di 01.01.08 19:43 
So, hab den Code nochmal umschreiben müssen, jetzt verschlüsselt er einfach einen eingegebenen String:

ausblenden 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 := '';      // Wenn Zeile Leer.
    While j <= length(Folge) Do                // Einzelne Buchstaben
      Begin
        i := 0;
        cancelB := false;
        cancelZ := false;
        While (cancelB= false) and (cancelZ= false) do       // Buchstaben checken wenn kein cancel aktiv ist
        Begin
          if i <= length(AlphaB)
          then i := i+ 1
          else Begin                              //Kein Buchtabe
                result := result + Folge[j];  // Zeichen übernehmen
                cancelZ := true;                 // cancelZeichen aktivieren
               End;
          if Folge[j] = AlphaA[i]       // Ist ein Buchstabe?
          then cancelB := true;                  // Wenn, dann cancelBuchstaben aktivieren
        End;
        if cancelB= True                     // Wenn wegen cancelBuchtabe beendet
        then Begin
               result := result + AlphaB[i];   // Dann Key übernehmen
             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:
ausblenden 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