Thread Anfänger Frage Taschenrechner: Erstellung einen Taschenrechners Anfänge (44 answers)
Opened by ASDS at 2007-01-29 12:57

docsnyder
 2007-01-31 17:28
#73804 #73804
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Nur mal so zum Spaß: hier ist noch ein anderer Ansatz:

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
$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-->

View full thread Anfänger Frage Taschenrechner: Erstellung einen Taschenrechners Anfänge