Подскажите что не так с этим кодом GOLANG - PullRequest
0 голосов
/ 19 февраля 2019
package main

import (
    "fmt"
    "math"
)

func main() {

    distencecalc()
}

func distencecalc() {

    fmt.Println("X1 :")
    var x1 float64
    fmt.Scanf("%f", &x1)
    fmt.Print("")
    fmt.Println("Y1 :")
    var y1 float64
    fmt.Scanf("%f", &y1)
    fmt.Print("")
    fmt.Println("Z1 :")
    var z1 float64
    fmt.Scanf("%f", &z1)
    fmt.Print("")
    fmt.Println("X2 :")
    var x2 float64
    fmt.Scanf("%f", &x2)
    fmt.Print("")
    fmt.Println("Y2 :")
    var y2 float64
    fmt.Scanf("%f", &y2)
    fmt.Print("")

    fmt.Println("Z2 :")
    var z2 float64
    fmt.Scanf("%f", &z2)
    fmt.Print("")

    var Xcalc = x2 - x1
    var Ycalc = y2 - y1
    var Zcalc = z2 - z1



    var calcX = math.Pow(Xcalc, 2)
    var calcY = math.Pow(Ycalc, 2)
    var calcZ = math.Pow(Zcalc, 2)


    var allcalc = calcX + calcZ + calcY
    fmt.Println("the result is :")
    fmt.Println(math.Sqrt(allcalc))
}

Проблема в том, что я компилирую, а затем запускаю программу, которая спрашивает о x1. Я ввожу значение, и он спрашивает о y1 и z1 одновременно.

1 Ответ

0 голосов
/ 19 февраля 2019

На самом деле рассматриваемый код работает на Unix-системах, но обычно проблема заключается в том, что вызовы типа fmt.Scanf("%f", &x1) не потребляют переводы строки, а заключают в кавычки из пакета документов fmt: Scanning:

Scan, Fscan, Sscan обрабатывают символы новой строки во вводе как пробелы.

И в Windows символ новой строки представляет собой не один \n символ, а \r\n, поэтому последующий fmt.Scanf()Вызов будет продолжен немедленно, не ожидая дальнейшего ввода от пользователя.

Таким образом, вы должны добавить новую строку в строку формата, чтобы избежать последующего вызова fmt.Scanf() для продолжения:

fmt.Scanf("%f\n", &x1)

Нопроще было бы просто использовать fmt.Scanln() и пропустить всю строку формата:

fmt.Scanln(&x1)

Scanln, Fscanln и Sscanln прекращают сканирование на новой строке и требуют, чтобы элементы былис последующим переводом строки или EOF.

Функции сканера (fmt.ScanXXX()) возвращают количество успешно отсканированных элементов и error.Чтобы определить, успешно ли выполнено сканирование, необходимо проверить его возвращаемое значение, например:

if _, err := fmt.Scanln(&x1); err != nil {
    fmt.Println("Scanning failed:", err)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...