Golang程序遇到问题请求帮助

Golang程序遇到问题请求帮助 我的程序

package main

import (
    "fmt"
)

const max = 10

func main() {
    var plat, dan, zdanenie float64

    var n int

    var polecisla [max]int

    pokus := 1

    sanca := 4

    a := 0

    sumacisla := 0

    fmt.Printf("Zadajte pocet platov,ktore chcete vlozit.\n (min.1 a max.%d)\nPotom postupne zadavajte platy.\nJednotlive platy potvrzujte enterom.\n!!! Mozu byt aj desatine cisla !!!\t\t", max)

    fmt.Scanf("%d", &n)

    for (n <= 0) || (n > max) {

        if n <= 0 {

            fmt.Printf("\nMin.pocet platov je 1!!\n\nZadajte pocet platov ktore chcete vlozit.\n")

        }

        if n > max {

            fmt.Printf("\nMax.pocet platov je %d !!\n\nZadajte pocet platov ktore chcete vlozit.\n", max)

        }

        fmt.Printf("(Toto bol %d.pokus,zostavaju %d)\t", pokus, sanca)

        fmt.Scanf("%d", &n)

        pokus++

        sanca--

        if sanca == 0 {

            break

        }

    }

    if (n > 0) && (n <= max) {

        fmt.Printf("\n")

    }

    for a < n {

        fmt.Scanf("%d", &polecisla[a])

        sumacisla += polecisla[a]

        a++

        fmt.Scanf("%f", &plat)

        if plat > 2400 {

            dan = 0.22 * plat

            zdanenie = plat - dan

        }

        if plat <= 2400 {

            dan = 0.19 * plat

            zdanenie = plat - dan

        }

        fmt.Printf("plat %.2f \t\n", plat)

        plat++

        fmt.Printf("plat po zdaneni je:%.2f", zdanenie)

        fmt.Printf("\n")

    }
}

为什么我的程序在输入错误时,会连续两次将我抛入控制台?什么时候它才会只触发一次?

image

只增加一次而不是两次

感谢您的帮助


更多关于Golang程序遇到问题请求帮助的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

既然问题是英文的,为什么代码不是呢?尝试添加一些打印语句来检查错误具体发生在哪里,并进行一些修改,直到定位到导致问题的代码行。

更多关于Golang程序遇到问题请求帮助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


为什么当我输入错误时,我的程序会连续两次将我抛入控制台?什么时候它才会只抛出一次?

我完全不明白,但这似乎能工作?

Go Playground - The Go Programming Language

如果使用简单的英语会更容易些 🙂

你的程序存在几个问题,导致输入验证循环出现重复提示。主要问题是 fmt.Scanf 在读取输入后没有正确处理换行符,以及循环逻辑中的条件判断。

以下是修复后的代码:

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

const max = 10

func main() {
    var plat, dan, zdanenie float64
    var n int
    var polecisla [max]int
    pokus := 1
    sanca := 4
    a := 0
    sumacisla := 0

    reader := bufio.NewReader(os.Stdin)

    fmt.Printf("Zadajte pocet platov,ktore chcete vlozit.\n (min.1 a max.%d)\nPotom postupne zadavajte platy.\nJednotlive platy potvrzujte enterom.\n!!! Mozu byt aj desatine cisla !!!\t\t", max)

    // 使用 bufio.Reader 读取整行输入
    input, _ := reader.ReadString('\n')
    input = strings.TrimSpace(input)
    n, _ = strconv.Atoi(input)

    for (n <= 0) || (n > max) {
        if n <= 0 {
            fmt.Printf("\nMin.pocet platov je 1!!\n\nZadajte pocet platov ktore chcete vlozit.\n")
        }
        if n > max {
            fmt.Printf("\nMax.pocet platov je %d !!\n\nZadajte pocet platov ktore chcete vlozit.\n", max)
        }
        fmt.Printf("(Toto bol %d.pokus,zostavaju %d)\t", pokus, sanca)
        
        input, _ := reader.ReadString('\n')
        input = strings.TrimSpace(input)
        n, _ = strconv.Atoi(input)
        
        pokus++
        sanca--
        if sanca == 0 {
            break
        }
    }

    if (n > 0) && (n <= max) {
        fmt.Printf("\n")
    }

    for a < n {
        fmt.Printf("Zadajte plat %d: ", a+1)
        
        // 读取工资输入
        input, _ := reader.ReadString('\n')
        input = strings.TrimSpace(input)
        plat, _ = strconv.ParseFloat(input, 64)
        
        polecisla[a] = int(plat)
        sumacisla += polecisla[a]
        a++

        if plat > 2400 {
            dan = 0.22 * plat
            zdanenie = plat - dan
        } else {
            dan = 0.19 * plat
            zdanenie = plat - dan
        }
        
        fmt.Printf("plat %.2f \t\n", plat)
        fmt.Printf("plat po zdaneni je:%.2f", zdanenie)
        fmt.Printf("\n")
    }
}

主要修改:

  1. 使用 bufio.NewReader 替代 fmt.Scanf,这样可以一次性读取整行输入,避免换行符问题
  2. 移除了不必要的 plat++ 操作
  3. 将两个 if 语句改为 if-else 结构
  4. 添加了更清晰的输入提示
  5. 使用 strings.TrimSpace() 清理输入中的换行符和空格

这些修改解决了输入验证循环重复执行的问题,现在程序会按预期只提示一次。

回到顶部