Golang计算器程序运行故障排查指南
Golang计算器程序运行故障排查指南 这个程序是一个计算程序。用于计算在4米长的材料上可以切割出多少根棒材,以及需要购买多少根。然而,程序运行到第20行之后,它询问我需要多少根棒材,无论我输入什么数字(比如21),在最后一行应该显示结果的地方,我都不知道我哪里做错了。
package main
import (
"fmt"
"math"
)
func main() {
for {
fmt.Println("what is your cut length? In cm: ")
var cutlength int
fmt.Scan(&cutlength)
barlength := 400
lengtheverybar := barlength / cutlength
cutbars := math.Floor(float64(lengtheverybar))
fmt.Println("You will get", cutbars, "every 4 meters bar.")
fmt.Println("How many cut bars do you need? In pieces: ")
var lengthpercut int
fmt.Scan(&lengthpercut)
totallength := lengthpercut * cutlength
fmt.Println(totallength)
barstobuy := totallength / cutlength
fmt.Println(barstobuy)
roundbarstobuy := math.Ceil(float64(barstobuy))
fmt.Println("You have to buy", roundbarstobuy, "4 meters bars.")
}
}
更多关于Golang计算器程序运行故障排查指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html
搞定了,原来是字符串搞混了。
这是正确的解决方案。
barstobuy := math.Ceil((float64(cutsneeded) * float64(cutlength)) / float64(barlength))
更多关于Golang计算器程序运行故障排查指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在这些行之后:
totallength := lengthpercut * cutlength
fmt.Println(totallength)
barstobuy := totallength / cutlength
那么 barstobuy 就等于 lengthpercut
是的,我得到的就是这个结果。但程序跳过了这两行:
barstobuy := totallength / cutlength
roundbarstobuy := math.Ceil(float64(barstobuy))
如果不跳过这些行,最终结果应该类似于“您需要购买 2 根 4 米长的钢筋。”
为什么?barstobuy 不应该等于这两个数相除的结果吗?
totallength / cutlength
因为这就是我写这行代码的初衷:首先计算 totallength,然后计算 barstobuy,在显示最终结果之前,应该将其向上取整,并用 roundbarstobuy 显示结果。
嗨, 这是我的错。我原本用Python写了这个程序,现在正尝试将其转换为Go语言以进行学习。
它应该除以barlength。所以公式应该是这样的:
lengtheverybar * cutsneeded / barlength
我尝试了以下代码,但得到了错误的结果。
barstobuy := math.Ceil(float64(lengtheverybar) * float64(cutsneeded) / float64(barlength))
所以,要计算 totallength,你需要将 lengthpercut 乘以 cutlength。
然后,要计算 barstobuy,你需要用那个 totallength 除以 cutlength。你可以重写:
totallength := lengthpercut * cutlength
barstobuy := totallength / cutlength
为
barstobuy := (lengthpercut * cutlength) / cutlength
因此,先乘以 cutlength 再除以 cutlength 是没有意义的。你可以直接写成 barstobuy := lengthpercut。
我认为你可能需要的是类似这样的东西:
var cutsneeded int
fmt.Scan(&cutsneeded)
barstobuy := math.Ceil(float64(cutsneeded)/float64(lengtheverybar))
你的程序存在几个逻辑问题,导致计算结果不正确。主要问题在于第20行之后的计算逻辑错误,特别是barstobuy := totallength / cutlength这一行,这实际上是在重复计算。
以下是修正后的代码:
package main
import (
"fmt"
"math"
)
func main() {
for {
fmt.Println("what is your cut length? In cm: ")
var cutlength int
fmt.Scan(&cutlength)
if cutlength <= 0 || cutlength > 400 {
fmt.Println("切割长度必须在1-400cm之间")
continue
}
barlength := 400
cutbarsPerBar := barlength / cutlength
fmt.Println("每根4米材料可以切割出", cutbarsPerBar, "根棒材")
fmt.Println("需要多少根切割后的棒材?请输入数量: ")
var neededBars int
fmt.Scan(&neededBars)
if neededBars <= 0 {
fmt.Println("需求数量必须大于0")
continue
}
// 正确计算需要购买的材料数量
barsToBuy := math.Ceil(float64(neededBars) / float64(cutbarsPerBar))
fmt.Println("需要购买", int(barsToBuy), "根4米长的材料")
fmt.Println()
}
}
关键修改点:
- 移除了不必要的
math.Floor调用:整数除法barlength / cutlength已经自动向下取整 - 修正了购买数量的计算公式:
barsToBuy := math.Ceil(float64(neededBars) / float64(cutbarsPerBar))- 这个公式正确计算了:需求数量 ÷ 每根材料的产出数量
- 使用
math.Ceil确保向上取整,因为不能购买部分材料
- 添加了输入验证:确保切割长度和需求数量是合理的
- 改进了变量命名:使代码更易读
示例运行:
what is your cut length? In cm:
50
每根4米材料可以切割出8根棒材
需要多少根切割后的棒材?请输入数量:
21
需要购买3根4米长的材料
这样计算是正确的:每根4米材料(400cm)切割50cm的棒材,可以得到8根。需要21根棒材,21 ÷ 8 = 2.625,向上取整需要购买3根材料。


