Schrift
[thread]6741[/thread]

Zeichen auf Skala verschieben: hin und zurück - will nicht



<< >> 6 Einträge, 1 Seite
pktm
 2005-02-25 17:09
#52145 #52145
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Ich möchte die Cäsar-Verschlüsselung propgrammieren, bei der ein Zeichen durch verschiebung im Alphabet codiert wird.
Als Alphabet möchte ich erstmal den Skalar von Perl nehmen :)
Das sieht dann so aus:
Code: (dl )
1
2
3
my $verschiebung = 1;
my $z = 'a';
my $nz = chr((ord($z)+$verschiebung));


Wenn ich da jetzt ein
Code: (dl )
$verschiebung *= -1;
dazu nehme um die Verschiebung in umgekehrter Richtung vorzunehmen will das aber nicht funktionieren.
Wo aber bitte ist mein Fehler? Bei negativer Verschiebung wird der Wert auf der Zeichenskala doch runtergezählt (4+-1 = 3?).

mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
betterworld
 2005-02-25 17:22
#52146 #52146
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Doch, das sollte wunderbar funktionieren.. An welcher Stelle fuegst Du denn das $verschiebung *= -1; ein? Zeig doch mal genau den Code, der nicht funktioniert\n\n

<!--EDIT|betterworld|1109344948-->
pktm
 2005-02-25 18:46
#52147 #52147
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Der COde funktioniert, nur noch nicht perfekt :-D
Code: (dl )
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/Perl/bin/perl

use strict;
use warnings;
use Data::Dumper;
use Tk;
use Tk::ToolBar;
use Tk::ROText;

my $VERSION = 0.1;

my $mw = Tk::MainWindow->new(-width=>640,-height=>480);
$mw->packPropagate(0);
$mw->update();

# User-Interface:
# Eine große Box die den zu untersuchenden Text enthält
# Buttons für das das Verschieben der Zeichen auf der Skala
# Entry für die Anzahl der Verschiebungen
# Checkbox für whitespaces
# reset-button für Text (Text in variable zwischenspeichern)
# ----
# Optional:
# event. merken welche verschiebung durchgeführt wurde um die rücksicherung nicht
# durch eine Variable erledigen zu lassen
# die häufigsten Zeichen des Textes und Kombinationen
# ----
# Textfeld auslesen: get('1.0', 'end')
# Textfeld löschen: delete('1.0','end');

# -- [ GUI ] -- #

my %window = (); # Kontainer für alle Fenster-Elemente (anstatt Variablen)

$window{text} = $mw->Scrolled('Text',-scrollbars=>'se',);
$window{debugCaption} = $mw->Label(-text=>'Debug:',-justify=>'left',);
$window{debug} = $mw->Scrolled(
'ROText',
-scrollbars=>'se',
-height=>6,
-bg => 'black',
-fg => 'orange',
-wrap => 'word',
);

$window{text}->pack(-side=>'top',-fill=>'x',-anchor=>'w',);
#$window{debugCaption}->pack(-side=>'top',-fill=>'x',-anchor=>'w',);
#$window{debug}->pack(-side=>'top',-fill=>'x',-anchor=>'w',);

$window{ToolBar} = $mw->ToolBar(-movable => 1, -side => 'bottom');

$window{ToolBarLeft} = $window{ToolBar}->ToolButton(
-image => 'navback22',
-tip => 'back',
-command => sub{
forward(
$window{text},
$window{ToolBarEntry}->get(),
-1,
), # /&forward
}, # /sub, -command
);

$window{ToolBarEntry} = $window{ToolBar}->ToolLabEntry(
-label => '',
-labelPack => [-side => "left",
-anchor => "w"],
);
$window{ToolBarEntry}->insert('0.0', 1); # verscheibung vordefinieren

$window{ToolBarRight} = $window{ToolBar}->ToolButton(
-image => 'navforward22',
-tip => 'forward',
-command => sub{
forward(
$window{text},
$window{ToolBarEntry}->get(),
1,
), # /&forward
}, # /sub, -command
);
MainLoop;

sub forward {
my $textfeld = shift;
my $verschiebung = shift;
my $ignWhitespaces = shift;

my $altText = $textfeld->get('0.0','end');
my $neuText = undef; # neuer Text komm thier rein

foreach my $z ( split("", $altText) ) {
# sollen whitespaces ignoriert werden? (und ist das aktuelle zeichen eins?)
if ( $ignWhitespaces and $z =~ m/\s/ ){
$neuText .= $z;
}else{
$neuText .= chr((ord($z)+$verschiebung));
}
} # /foreach @text
chop $neuText; # letztes Leerzeichen wegmachen, da die Textarea beim insert immer eines dran hängt

# textfeld löschen
$textfeld->delete('0.0', 'end');

# neuen, codierten Text einfügen
$textfeld->insert('0.0', $neuText);

} # /forward

sub back {
my $textfeld = shift;
my $verschiebung = shift;
my $ignWhitespaces = shift;

$verschiebung *= -1;

forward($textfeld, $verschiebung, $ignWhitespaces);

} # /back
http://www.intergastro-service.de (mein erstes CMS :) )
Dubu
 2005-02-25 23:52
#52148 #52148
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Du rufst in beiden Callbacks die Funktion forward() auf, aber nie back(). Der Unterschied zwischen den Aufrufen ist nur im Parameter $ignWhitespaces.
pktm
 2005-02-26 02:04
#52149 #52149
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ah, scheiß copy&paste, und dazu auch noch den falschen Wert negiert :angry:

EDIT: thx!\n\n

<!--EDIT|pktm|1109376326-->
http://www.intergastro-service.de (mein erstes CMS :) )
pktm
 2005-02-26 02:41
#52150 #52150
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
So, vorerst mal fertig:
Code: (dl )
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/Perl/bin/perl

use strict;
use warnings;
use Data::Dumper;
use Tk;
use Tk::ToolBar;
use Tk::ROText;

my $VERSION = 0.1;

my @whitespaceOptions = (
[ 'Whitespaces ignorieren'=>1],
['Whitespaces verschieben'=>0],
);
my $bindWhitespaceValue = undef;
my $_debug = 0;

my $mw = Tk::MainWindow->new(-width=>640,-height=>480);
$mw->packPropagate(0);
$mw->update();

# User-Interface:
# Eine große Box die den zu untersuchenden Text enthält
# Buttons für das das Verschieben der Zeichen auf der Skala
# Entry für die Anzahl der Verschiebungen
# Checkbox für whitespaces
# reset-button für Text (Text in variable zwischenspeichern)
# ----
# Optional:
# event. merken welche verschiebung durchgeführt wurde um die rücksicherung nicht
# durch eine Variable erledigen zu lassen
# die häufigsten Zeichen des Textes und Kombinationen
# ----
# Textfeld auslesen: get('1.0', 'end')
# Textfeld löschen: delete('1.0','end');

# -- [ GUI ] -- #

my %window = (); # Kontainer für alle Fenster-Elemente (anstatt Variablen)

$window{text} = $mw->Scrolled('Text',-scrollbars=>'se',);
$window{debugCaption} = $mw->Label(-text=>'Debug:',-justify=>'left',);
$window{debug} = $mw->Scrolled(
'ROText',
-scrollbars=>'se',
-height=>6,
-bg => 'black',
-fg => 'orange',
-wrap => 'word',
);

$window{text}->pack(-side=>'top',-fill=>'x',-anchor=>'w',);
if( $_debug ){
$window{debugCaption}->pack(-side=>'top',-fill=>'x',-anchor=>'w',);
$window{debug}->pack(-side=>'top',-fill=>'x',-anchor=>'w',);
}

$window{ToolBar} = $mw->ToolBar(-movable => 1, -side => 'bottom');

$window{ToolBarLeft} = $window{ToolBar}->ToolButton(
-image => 'navback22',
-tip => 'back',
-command => sub{
back(
$window{text},
$window{ToolBarEntry}->get(),
$bindWhitespaceValue,
), # /&forward
}, # /sub, -command
);

$window{ToolBarEntry} = $window{ToolBar}->ToolEntry();
$window{ToolBarEntry}->insert('0.0', 1); # verscheibung vordefinieren

$window{ToolBarRight} = $window{ToolBar}->ToolButton(
-image => 'navforward22',
-tip => 'forward',
-command => sub{
forward(
$window{text},
$window{ToolBarEntry}->get(),
$bindWhitespaceValue,
), # /&forward
}, # /sub, -command
);
$window{ToolBarSeparator1} = $window{ToolBar}->separator();
$window{ToolBarOptionmenu} = $window{ToolBar}->ToolOptionmenu(
-options => \@whitespaceOptions,
-variable => \$bindWhitespaceValue,
);
#$checkbutton->select

MainLoop;

sub forward {
my $textfeld = shift;
my $verschiebung = shift;
my $ignWhitespaces = shift;

my $altText = $textfeld->get('0.0','end');
my $neuText = undef; # neuer Text komm thier rein

foreach my $z ( split("", $altText) ) {
# sollen whitespaces ignoriert werden? (und ist das aktuelle zeichen eins?)
if ( $ignWhitespaces and $z =~ m/\s/ ){
$neuText .= $z;
}else{
$neuText .= chr((ord($z)+$verschiebung));
}
} # /foreach @text
chop $neuText; # letztes Leerzeichen wegmachen, da die Textarea beim insert immer eines dran hängt

# textfeld löschen
$textfeld->delete('0.0', 'end');

# neuen, codierten Text einfügen
$textfeld->insert('0.0', $neuText);

} # /forward

sub back {
my $textfeld = shift;
my $verschiebung = shift;
my $ignWhitespaces = shift;

$verschiebung *= -1;

forward($textfeld, $verschiebung, $ignWhitespaces);

} # /back


Änderungen / Verbesserungsvorschläge?
Sollen wir das Script noch ein bischen ausarbeiten und unter die GPL stellen?
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
<< >> 6 Einträge, 1 Seite



View all threads created 2005-02-25 17:09.