User since
2003-08-04
14371
Artikel
ModeratorIn
[quote=ASDS,29.01.2007, 13:02]*dummbin* meinst du mit geschachtelten Klammern folgendes:
1* (2+ ( 3*4) - 4) / 3
oder etwas anderes.
[...][/quote]
Ja, genau das meinte ich...
User since
2007-01-29
115
Artikel
BenutzerIn
ja okay...
aber renee ( ich hoff ich hab deinen Namen jetzt nicht falsch geschriebe)
hast du jetzt Tipps für mich
@all: mir helfen die funktionen nichts... ich muss mehr oder weniger die eval funktion selbst nachtippseln.. und deshalb sagt mal String oder Array.. und wie mach ih das dann mit eben den Klammern?
User since
2004-03-22
5730
Artikel
ModeratorIn + EditorIn
ohne eval wird es zwar etwas mehr code aber vom prinzp bleibt das gleiche wie im vorgestellten code
User since
2007-01-29
115
Artikel
BenutzerIn
[quote=lichtkind,29.01.2007, 13:51]ohne eval wird es zwar etwas mehr code aber vom prinzp bleibt das gleiche wie im vorgestellten code[/quote]
wo? Code häää? ich seh keinen Code.
und falls du meinen meinst....
heißt es jetzt, dass ich strings verweden soll?
gut... wenn es das heißt, hab ich ja noch das problem, wie ich erm sag... so und DA steht jetzt eine Klammer... lies zuerst den Klammeraudruck, berechne ihn, merk ihn dir und rechne dann weiter...
ihr versteh nicht was ich mein oder.. toll und ich kanns nicht erklären *schnief* hmmm
sorry, bei solchen Dingen kann ich mich selten klar audrücken.
User since
2007-01-29
115
Artikel
BenutzerIn
[quote=renee,29.01.2007, 14:22]
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
#!/usr/bin/perl
use strict;
use warnings;
my $formula = '((1 + 2) * 2) + (2 * 3)';
my %hash = ('*' => \&mal,
'-' => \&minus,
'+' => \&plus,
'/' => \&div,);
while($formula =~ s/\(([^\(]*?)\)/calc($1)/eg){
}
print calc($formula);
sub calc{
my ($part) = @_;
my ($op1,$op,$op2) = $part =~ m!(\d+)\s*([\*\+\/\-])\s*(\d+)!;
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;
}
[/quote]
wwwwwwwwwaaaah wie cool danke, und das funzt sogar...sorry.. okay, werd mal versuchen den zu überreisen.
eine frage hätte ich schon mal
bedeutet?
User since
2003-08-04
14371
Artikel
ModeratorIn
Hier eine verbesserte Version (die erste kann nichts mit Termen wie
1 + 2 + 3 anfangen):
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
#!/usr/bin/perl
use strict;
use warnings;
my $formula = '((1 + 2) * (2 -1)) + (2 * 3) + 5';
my %hash = ('*' => \&mal,
'-' => \&minus,
'+' => \&plus,
'/' => \&div,);
while($formula =~ s/\(([^\(]*?)\)/calc($1)/eg){
}
print 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;
}
Mit
my ($part) = @_ speichere ich die Übergabeparameter (in dem Fall
$1 aus dem Regulären Ausdruck) in einer Variablen.
Für Dich dürfte das hier ganz interessant sein:
perlintro
perlsub
User since
2003-08-21
2614
Artikel
ModeratorIn
[quote=ASDS,29.01.2007, 11:57]Soll ihn das als Stringt ode Array einlesen?[/quote]
Wenn Du das hier mit Einlesen als Array meinst:
Das macht ja nur dann Sinn, wenn man mehrere Zeilen einliest, weil in jedem Element des Arrays dann eine Zeile steht.
User since
2007-01-29
115
Artikel
BenutzerIn
hm sag mal: #print ("%.2f\n", calc($ergebnis));
geht nicht, oder?
ich mein.. nein ich weiß, dass es nicht funkt, aber warum nicht?
Ich muss ja auch noch kommazahlen ausgeben... und bei 3*4 z.B kommt 12 raus und nicht 12,00 ...
die angegeben Links guck ich mir gleich mal an. DANKE , war sehr sehr hilfreif.. der hash tipp... ich hab mich immer gscheut diese zu verwenden, weil ich mir gedacht hab das is voll kompliziert und so... aber is eigentlich voll cool, wenn das print mit float noch funzen würd...
ich guck mal im Inet nach ob ich dazu noch was find.
User since
2003-08-04
14371
Artikel
ModeratorIn
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...