Skip to content
This repository was archived by the owner on Aug 22, 2025. It is now read-only.

Commit 7abfb6f

Browse files
author
Holger Lösken
committed
Add task3 in go
1 parent 6314750 commit 7abfb6f

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed

src/go/t3/s1.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"strconv"
6+
"strings"
7+
)
8+
9+
func Calculate(input string) (float64, error) {
10+
result := 0.0
11+
12+
if len(input) < 1 {
13+
return result, nil
14+
}
15+
16+
splitted := strings.Split(input, " ")
17+
18+
if isNumeric(splitted[len(splitted)-1]) {
19+
return strconv.ParseFloat(splitted[len(splitted)-1], 64)
20+
}
21+
22+
var numbers []string
23+
validOperations := []string{"+", "-", "*", "/"}
24+
25+
for _, element := range splitted {
26+
if !IsValidElement(element, validOperations) {
27+
return -1, fmt.Errorf("invalid syntax")
28+
}
29+
30+
if isNumeric(element) {
31+
numbers = append(numbers, element)
32+
} else {
33+
number1, numbers := numbers[len(numbers)-1], numbers[:len(numbers)-1]
34+
number2, numbers := numbers[len(numbers)-1], numbers[:len(numbers)-1]
35+
36+
op1, _ := strconv.ParseFloat(number1, 64)
37+
op2, _ := strconv.ParseFloat(number2, 64)
38+
39+
switch element {
40+
case "+":
41+
result = op2 + op1
42+
case "-":
43+
result = op2 - op1
44+
case "*":
45+
result = op2 * op1
46+
case "/":
47+
result = op2 / op1
48+
}
49+
50+
numbers = append(numbers, strconv.FormatFloat(result, 'E', -1, 64))
51+
}
52+
53+
54+
}
55+
56+
return result, nil
57+
}
58+
59+
func Find(slice []string, val string) (int, error) {
60+
for i, item := range slice {
61+
if item == val {
62+
return i, nil
63+
}
64+
}
65+
return -1, fmt.Errorf("cannot find element '%s'", val)
66+
}
67+
68+
func isNumeric(s string) bool {
69+
_, err := strconv.ParseFloat(s, 64)
70+
return err == nil
71+
}
72+
73+
func IsValidElement(element string, validOperations []string) bool {
74+
_, err := Find(validOperations, element)
75+
if !isNumeric(element) && err != nil {
76+
return false
77+
}
78+
79+
return true
80+
}
81+
82+
func main() {
83+
r, _:= Calculate("6 3 /")
84+
85+
fmt.Printf("ergebnis: %v", r)
86+
}

src/go/t3/s1_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package main
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func TestCalculate(t *testing.T) {
9+
type test struct {
10+
input string
11+
want float64
12+
}
13+
14+
tests := []test{
15+
{input: "2 5 +", want: 7},
16+
{input: "5 3 -", want: 2},
17+
{input: "4 5 *", want: 20},
18+
{input: "12 4 /", want: 3},
19+
{input: "", want: 0},
20+
{input: "4 7-", want: -1},
21+
{input: "9 8 7.5", want: 7.5},
22+
{input: "4 5 6", want: 6},
23+
}
24+
25+
for _, tc := range tests {
26+
got, err := Calculate(tc.input)
27+
if !reflect.DeepEqual(tc.want, got) {
28+
t.Fatalf("input: %v, expected: %v, got: %v, err: %v", tc.input, tc.want, got, err)
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)