Nur mal so zum Spaß: hier ist noch ein anderer Ansatz:
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
$term = '((1 + 2) * (2 -1) + 7 / 5) + (2 * 3) + 5';
printf("TERM : $term\n");
$term =~ s/\s+//g;
$idx = 1;
#-----------------------------------------------------------------------------#
sub evalSubTerm {
my($op1, $op, $op2) = @_;
if ( $op eq '*' ) { return($op1 * $op2); }
elsif ( $op eq '/' ) { return($op1 / $op2); }
elsif ( $op eq '+' ) { return($op1 + $op2); }
else { return($op1 - $op2); }
}
#-----------------------------------------------------------------------------#
sub resolveOps {
my($op) = @_;
for $subTerm ( values(%subTerms) ) {
while ( ($subTerm =~ s!^(.*?[+-].*?)(T?\d+(?:\.\d*)?${op}T?\d+(?:\.\d*)?)(.*?)$!$1T$idx$3!) ||
($subTerm =~ s!^(.*?)(T?\d+(?:\.\d*)?${op}T?\d+(?:\.\d*)?)(.*?[+-].*?)$!$1T$idx$3!) ) {
$subTerms{"T$idx"} = $2; $idx++;
}
}
}
#-----------------------------------------------------------------------------#
sub rearrangeTerms {
my($subTerm, $value) = @_;
my($tmpSubTerm, $retVal);
for $tmpSubTerm ( keys(%subTerms) ) {
$subTerms{$tmpSubTerm} =~ s!$subTerm!$value!g;
}
$retVal = $subTerms{$subTerm};
delete($subTerms{$subTerm});
return($retVal);
}
#-----------------------------------------------------------------------------#
sub resolveTerms {
my($subTerm, $retVal);
my($modified) = 0;
while ( scalar(%subTerms) >= 1 ) {
for $subTerm ( keys(%subTerms) ) {
if ( $subTerms{$subTerm} =~ m(^(\d+(?:\.\d*)?)([+\-\*/])(\d+(?:\.\d*)?)$) ) {
$subTerms{$subTerm} = evalSubTerm($1, $2, $3);
$retVal = rearrangeTerms($subTerm, $subTerms{$subTerm});
}
}
}
return($retVal);
}
#-----------------------------------------------------------------------------#
while ( $term =~ s/^(.*?)\(([^\(\)]+)\)(.*?)$/$1T$idx$3/ ) {
$subTerms{"T$idx"} = $2; $idx++;
}
$subTerms{"T0"} = $term;
for $op ( ('\*', '/', '\+', '-') ) { resolveOps($op) };
printf("RESULT: %s\n", resolveTerms());
Gruß, Doc\n\n
<!--EDIT|docsnyder|1170257524-->