Schrift
[thread]8693[/thread]

Anfänger Frage Taschenrechner: Erstellung einen Taschenrechners Anfänge (Seite 3)



<< |< 1 2 3 4 5 >| >> 45 Einträge, 5 Seiten
ASDS
 2007-01-29 16:42
#73782 #73782
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
mah du bist a wirklicher schatz:
so hab ichs eh auch gehabt..muss gucken, vielleicht hab ich nen fehler gemacht... jedenfalls hat er 0 ausgegeben.

while($formula =~ s/\(([^\(]*?)\)/calc($1)/eg)

verrätst du mir jetz noch was das bedeutet? eg ...hat was mit gleichheit zu tun.
das andere hab ich jetzt auf die gachn nicht gefunden?
ASDS
 2007-01-29 16:47
#73783 #73783
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
[quote=renee,29.01.2007, 15:38]Das muss dann print sprintf("%.2f\n",calc($ergebnis)) heißen...

Warum es nicht funktioniert? Weil die print-Funktion anders programmiert ist. Dafür gibt's eben printf bzw. sprintf...[/quote]
hm.... das mit dem print funzt leider nicht. er schreit irgendas mit der submethode. ich habs jetzt in deinem orginalprogramm ausprobiert, da funzt es auch nicht.
renee
 2007-01-29 16:58
#73784 #73784
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Also das hier funktioniert:
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
#!/usr/bin/perl

use strict;
use warnings;

my $formula = '((1 + 2) * (2 -1)) + (2 * 3) + 5+3';

my %hash = ('*' => \&mal,
'-' => \&minus,
'+' => \&plus,
'/' => \&div,);


while($formula =~ s/\(([^\(]*?)\)/calc($1)/eg){
}

# FORMATIERT AUSGEBEN
print sprintf("%.2f\n", calc($formula));

sub calc{
my ($part) = @_;
while($part =~ s!(\d+)\s*([\*\/])\s*(\d+)!subcalc($1,$2,$3)!eg){};
while($part =~ s!(\d+)\s*([\+\-])\s*(\d+)!subcalc($1,$2,$3)!eg){};
return $part;
}

sub subcalc{
my ($op1,$op,$op2) = @_;
return 0 unless exists($hash{$op});
return $hash{$op}->($op1,$op2);
}

sub mal{
my ($op1,$op2) = @_;
return $op1 * $op2;
}

sub minus{
my ($op1,$op2) = @_;
return $op1 - $op2;
}

sub plus{
my ($op1,$op2) = @_;
return $op1 + $op2;
}

sub div{
my ($op1,$op2) = @_;
return $op1 / $op2;
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ASDS
 2007-01-29 17:07
#73785 #73785
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
aaaaaaaaah ich trottel hab den ; vergessen, mei so dumm musst mal sein. und er schreibts bei mi ja net... *gr*
DANKE DIR....

jetzt is noch die Frage was m! bedeutet UND... $formula =~ s/\(([^\(]*?)\)/calc($1)/eg) der teil..
wie gesagt...das eg gleichheit bedeutet, weiß ich schon.
renee
 2007-01-29 17:23
#73786 #73786
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Nein, eq würde "gleich" bedeuten. Hier handelt es sich um Reguläre Ausdrücke und Operatoren dazu (und das eg sind Modifier). Die sind zu komplex, um sie in drei,vier Zeilen zu beschreiben.

Vielleicht liest Du Dir mal perlop durch, da wird erklärt, was das m!! (bzw. m//) und das s/// machen...\n\n

<!--EDIT|renee|1170084250-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ASDS
 2007-01-29 18:15
#73787 #73787
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
while($formula =~ s/\(([^\(]*?)\)/calc($1)/eg){
}


ich checks trotzdem nicht.
e Evaluate the right side as an expression.
g Replace globally, i.e., all occurrences.
das hab ich begriffen.
aber was macht der ganze ausdruck. Hab noch nie ein {} gesehen.
weißt was ich mein. der ganze ausdruck stößt mich vor den kopf und ich würds gerne verstehen. so is es ja nicht...

aber was ich jetzt schon sagen kann.. perl macht mehr spass als java.
renee
 2007-01-29 18:41
#73788 #73788
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das {} ist der leere Block der while-Schleife...

Vielleicht hilft Dir die Ausgabe von CPAN:YAPE::Regex::Explain weiter:
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
(?-imsx:\(([^\(]*?)\))

matches as follows:

NODE EXPLANATION
----------------------------------------------------------------------
(?-imsx: group, but do not capture (case-sensitive)
(with ^ and $ matching normally) (with . not
matching \n) (matching whitespace and #
normally):
----------------------------------------------------------------------
\( '('
----------------------------------------------------------------------
( group and capture to \1:
----------------------------------------------------------------------
[^\(]*? any character except: '\(' (0 or more
times (matching the least amount
possible))
----------------------------------------------------------------------
) end of \1
----------------------------------------------------------------------
\) ')'
----------------------------------------------------------------------
) end of grouping
----------------------------------------------------------------------


Durch die Bedingung wird mehrmals über die Formel gegangen und es werden immer die innersten Klammerpaare ersetzt.

Ich habe mal eine Test-Ausgabe noch eingebaut, die dann folgende Ausgabe produziert...
Code: (dl )
1
2
3
4
5
C:\community>perl  calc.pl

(3 * 1) + 6 + 5+3
3 + 6 + 5+3
17.00
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
lichtkind
 2007-01-29 18:50
#73789 #73789
User since
2004-03-22
5708 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
asds: ich meinte den wxperl code unter dem link den ich postete an dem ich die verwendung von eval störte
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
ASDS
 2007-01-29 18:56
#73790 #73790
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
danke lichtkind, hab verstanden.

Code: (dl )
return $hash{$y}->($x1,$x2);


sagt mal und wenn ich alles richtig verstanden habe, dann weise ich hier die eigenschaften x1 und x2 y zu oder is es genau umgekehrt. Wenn es umgekehrt wäre würde es der Pfeil bedeute.
also y wird zu x 1 und x2
renee
 2007-01-29 19:28
#73791 #73791
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Weder noch. in $hash{$y} steht eine Codereferenz. Durch den Pfeil wird es quasi dereferenziert und mit () starte ich Subroutine und $x1,$x2 sind die Übergabeparameter.

Ich hätte das auch so machen können:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub subcalc{
my ($op1,$op,$op2) = @_;
if($op eq '*'){
return mal($op1,$op2);
}
elsif($op eq '/'){
return div($op1,$op2);
}
elsif($op eq '+'){
return plus($op1,$op2);
}
elsif($op eq '-'){
return minus($op1,$op2);
}
else{
return 0;
}
}


Aber mit dem Hash als "Dispatcher" ist es schöner...

Mehr zu Referenzen unter perlreftut (deutsch)...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 3 4 5 >| >> 45 Einträge, 5 Seiten



View all threads created 2007-01-29 12:57.