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")
}
}
为什么我的程序在输入错误时,会连续两次将我抛入控制台?什么时候它才会只触发一次?

只增加一次而不是两次
感谢您的帮助
更多关于Golang程序遇到问题请求帮助的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
既然问题是英文的,为什么代码不是呢?尝试添加一些打印语句来检查错误具体发生在哪里,并进行一些修改,直到定位到导致问题的代码行。
更多关于Golang程序遇到问题请求帮助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你的程序存在几个问题,导致输入验证循环出现重复提示。主要问题是 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")
}
}
主要修改:
- 使用
bufio.NewReader替代fmt.Scanf,这样可以一次性读取整行输入,避免换行符问题 - 移除了不必要的
plat++操作 - 将两个
if语句改为if-else结构 - 添加了更清晰的输入提示
- 使用
strings.TrimSpace()清理输入中的换行符和空格
这些修改解决了输入验证循环重复执行的问题,现在程序会按预期只提示一次。


