Интерфейсы: Напишите программу 2

Сообщения
1,547
Реакции
271
Веб-сайт
tehadm.ru
Пришло время для задач, где вы сможете применить полученные знания на практике.

Обязательные условия выполнения: данные со стандартного ввода читаются функцией readTask(), которая возвращает 3 значения типа пустой интерфейс. Эта функция использует пакеты encoding/json, fmt, и os - не удаляйте их из импорта. Скорее всего, вам понадобится пакет "fmt", но вы можете использовать любой другой пакет для записи в стандартный вывод не удаляя fmt.

Итак, вы получаете 3 значения типа пустой интерфейс: если все удачно, то первые 2 значения будут float64. Третье значение в идеальном случае будет строкой, которая может иметь значения: "+", "-", "*", "/" (определенная математическая операция). Но такие идеальные случаи будут не всегда, вы можете получить значения других типов, а также строка в третьем значении может не относится к одной из указанных математических операций.

Результат выполнения программы должен быть таков:

в штатной ситуации вы должны напечатать в стандартный вывод результат выполнения математической операции с точностью до 4 цифры после запятой (fmt.Printf(%.4f));
если первое или второе значение не является типом float64, вы должны напечатать сообщение об ошибке вида: value=полученное_значение: тип_значения (например: value=true: bool)
если третье значение имеет неверный тип или передан знак, не относящийся к указанным выше математическим операциям, сообщение об ошибке должно иметь вид: неизвестная операция
Гарантируется, что ошибка в аргументах может быть только одна, поэтому если вы при проверке первого значения увидели, что оно содержит ошибку - печатайте сообщение об ошибке и завершайте работу программы, проверка остальных аргументов значения уже не имеет, а проверяющая система воспримет 2 сообщения об ошибке как нарушение условия выполнения задания.

Удачи!

C-like:
package main

import (
    "encoding/json" // пакет используется для проверки ответа, не удаляйте его
    "fmt"           // пакет используется для проверки ответа, не удаляйте его
    "os"            // пакет используется для проверки ответа, не удаляйте его
)



func main() {
    value1, value2, operation := readTask() // исходные данные получаются с помощью этой функции
                                            // все полученные значения имеют тип пустого интерфейса
}
 
C-like:
package main

import (
    "encoding/json"
    "fmt"         
    "os"
)

func main() {
    value1, value2, operation := readTask()
    
    _, ok := value1.(float64)
    if !ok {
        fmt.Printf("value=%v: %T\n", value1, value1)
        return
    }

    _, ok = value2.(float64)
    if !ok {
        fmt.Printf("value=%v: %T\n", value2, value2)
        return
    }

    op, ok := operation.(string)
    if !ok || (op != "+" && op != "-" && op != "*" && op != "/") {
        fmt.Println("неизвестная операция")
        return
    }

    result := 0.0
    switch op {
    case "+":
        result = value1.(float64) + value2.(float64)
    case "-":
        result = value1.(float64) - value2.(float64)
    case "*":
        result = value1.(float64) * value2.(float64)
    case "/":
        result = value1.(float64) / value2.(float64)
    }

    fmt.Printf("%.4f\n", result)
}
 
C-like:
package main

import (
    "encoding/json" // пакет используется для проверки ответа, не удаляйте его
    "fmt"           // пакет используется для проверки ответа, не удаляйте его
    "os"            // пакет используется для проверки ответа, не удаляйте его
)



func main() {
    value1, value2, operation := readTask() // исходные данные получаются с помощью этой функции
                                            // все полученные значения имеют тип пустого интерфейса
    var a, b  float64
    var s = operation.(string)

    if value, ok := value1.(float64); ok {
        a = value
    } else {
        fmt.Print("value=", value1, ": ")
        fmt.Printf("%T", value1)
        return
    }

    if value, ok := value2.(float64); ok {
        b = value
    } else {
        fmt.Print("value=", value2, ": ")
        fmt.Printf("%T", value2)
        return
    }

    if s != "+" && s != "-" && s != "*" && s != "/" {
        fmt.Printf("неизвестная операция")
        return
    }

    switch {
    case s == "+":
        z := a + b
        fmt.Printf("%.4f" , z)
    case s == "-":
        z := a - b
        fmt.Printf("%.4f" , z)
    case s == "*":
        z := a * b
        fmt.Printf("%.4f" , z)
    case s == "/":
        z := a / b
        fmt.Printf("%.4f" , z)
    }
}
 
C-like:
package main

import (
    "encoding/json" // пакет используется для проверки ответа, не удаляйте его
    "fmt"           // пакет используется для проверки ответа, не удаляйте его
    "os"            // пакет используется для проверки ответа, не удаляйте его
)



func main() {
    value1, value2, operation := readTask() // исходные данные получаются с помощью этой функции
    // все полученные значения имеют тип пустого интерфейса
    calc(value1, value2, operation)
}

func calc(i1, i2, i3 interface{}) {
    switch i1.(type) {
    case float64:

        switch i2.(type) {
        case float64:
            switch i3.(string) {
            case "+":
                result := i1.(float64) + i2.(float64)
                fmt.Printf("%.4f", result)
            case "-":
                result := i1.(float64) - i2.(float64)
                fmt.Printf("%.4f", result)
            case "/":
                result := i1.(float64) / i2.(float64)
                fmt.Printf("%.4f", result)
            case "*":
                result := i1.(float64) * i2.(float64)
                fmt.Printf("%.4f", result)
            }
        default:
            fmt.Printf("value=%v: %T", i2, i2)
        }
    default:
        fmt.Printf("value=%v: %T", i1, i1)
    }
}
 
Назад
Сверху Снизу