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

8 回复

搞定了,原来是字符串搞混了。

这是正确的解决方案。

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))

你好,@Michael_taradus

当我运行你的程序时,我得到:

PS C:\Users\skillian\source\repos\gopath\src\forum.golangbridge.org\my-calculator-program-isnt-working_19921> go run .
what is your cut length? In cm: 
40
You will get 10 every 4 meters bar.
How many cut bars do you need? In pieces:
16
640
16
You have to buy 16 4 meters bars.
what is your cut length? In cm:

你得到的是这个结果吗?如果不是,你能贴出你得到的输出吗?如果是,你能提供一个你期望看到的输出示例吗?

所以,要计算 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()
    }
}

关键修改点:

  1. 移除了不必要的math.Floor调用:整数除法barlength / cutlength已经自动向下取整
  2. 修正了购买数量的计算公式barsToBuy := math.Ceil(float64(neededBars) / float64(cutbarsPerBar))
    • 这个公式正确计算了:需求数量 ÷ 每根材料的产出数量
    • 使用math.Ceil确保向上取整,因为不能购买部分材料
  3. 添加了输入验证:确保切割长度和需求数量是合理的
  4. 改进了变量命名:使代码更易读

示例运行:

what is your cut length? In cm: 
50
每根4米材料可以切割出8根棒材
需要多少根切割后的棒材?请输入数量: 
21
需要购买3根4米长的材料

这样计算是正确的:每根4米材料(400cm)切割50cm的棒材,可以得到8根。需要21根棒材,21 ÷ 8 = 2.625,向上取整需要购买3根材料。

回到顶部