Напишем простенький консольный калькулятор, производящий базовые арифметические операции. Сначала мы задаем ему числа, с которыми мы хотим проводить операции при помощи команды add <число>
(можно задать несколько чисел). Затем мы можем использовать команды inc
, acc
, sub
, mul
, div
, mod
; чтобы производить вычисления: нужно ввести индекс числа, с которым нужно работать, а затем аргументы оператора. Show
может быть использована для отображения введенных ранее чисел; exit
, чтобы выйти из программы.
Пример вывода:
add 42 13
Operands: 42 13
inc 0 1
[43 13]
mod 1 3
[43 1]
exit
Код:
package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func main() { r := bufio.NewReader(os.Stdin) var numbers []int fmt.Println("Enter nums with 'add' and then use calc commands:") fmt.Println("inc, acc, sub, mul, div, mod, show, exit") for { str, err := r.ReadString('\n') if err != nil { panic(err) } str = strings.TrimSpace(str) if str == "exit" { break } // str to slice; separate each word by " " to get command lines strSlice := strings.Split(str, " ") // command (add, inc, etc) cmd := strSlice[0] // numerical args args := []int{} for _, val := range strSlice[1:] { num, err := strconv.Atoi(val) if err != nil { panic(err) } args = append(args, num) } if cmd == "add" { numbers = append(numbers, args...) fmt.Println("Operands:", strings.Trim(fmt.Sprint(numbers), "[]")) } else if cmd == "show" { fmt.Println("Operands: ", numbers) // operations } else if args[0] >= len(numbers) { fmt.Println("Wrong index") } else if cmd == "inc" { numbers[args[0]]++ fmt.Println(numbers) } else if len(args) < 2 { fmt.Println("Should be 2 args") // fix `add 1 2` -> `acc 1` panic } else { switch cmd { case "acc": numbers[args[0]] += args[1] case "sub": numbers[args[0]] -= args[1] case "mul": numbers[args[0]] *= args[1] case "div": if args[1] == 0 { fmt.Println("Don't divide by 0") } else { numbers[args[0]] /= args[1] } case "mod": numbers[args[0]] %= args[1] default: fmt.Println("Enter valid command") } fmt.Println(numbers) } } }