Golang项目开发遇到问题,求大神帮忙解决
Golang项目开发遇到问题,求大神帮忙解决 编写一个Go程序,实现以下功能:
实现一个基于数组/切片的电子表格程序:
- 包含5个数组或切片,每个包含5个float64值 - 这些是电子表格的行
- 包含1个操作数组或切片,包含5个字符串值 - 这些是每行对应的操作
- 包含1个计算数组或切片,包含5个float64值 - 这些是每行基于操作计算得出的值
- 必需的操作 - 行值求和、行值平均值、行中最小值、行中最大值
- 必需的功能 - 编辑指定行中的指定单元格、更改行的操作、清空单行所有数据、清空所有行数据、退出程序
- 实现健壮的用户输入处理(即防止用户输入无效值)
运行程序时应展示以下功能:
- 循环直到用户选择退出程序
- 显示所有行的数据,包括每行的计算值和操作
- 显示所有选项菜单(编辑/更改操作、清空单行、清空所有行、退出程序)
- 允许用户从菜单选项中选择并执行所需功能
这是我目前的代码,虽然不多,但任何帮助都将不胜感激! 我的主要问题是如何为每一行执行操作。不太确定如何累加整行
抱歉代码有点乱
package main
import ("fmt"
"os"
"os/exec"
"runtime"
)
func ClearScreen() {
cmd := exec.Command("cmd", "/c", "cls")
switch runtime.GOOS {
case "linux":
cmd = exec.Command("clear")
case "darwin":
cmd = exec.Command("clear")
}
cmd.Stdout = os.Stdout
cmd.Run()
}
func PrintRow(rowNum int, theRow [5]float64, calc float64, op string){
fmt.Printf("%d:", rowNum)
for _, value := range theRow {
fmt.Printf("%8.2f ", value)
}
fmt.Printf(" | %.2f(%s)",calc, op)
fmt.Printf("\n")
}
func editcell(row []float64, index int){
//ClearScreen()
fmt.Printf("Enter new value(current=%.2f): ", row[index])
fmt.Scanln(&row[index])
}
func main() {
var row1, row2, row3, row4, row5 [5]float64
var calc [5]float64
var ops [5] string
var quit bool
for quit ==false{
ClearScreen()
PrintRow(1, row1, calc[0], ops [0])
PrintRow(2, row2, calc[1], ops [1])
PrintRow(3, row3, calc[2], ops [2])
PrintRow(4, row4, calc[3], ops [3])
PrintRow(5, row5, calc[4], ops [4])
fmt.Printf("[1] Edit cell\n")
fmt.Printf("[2] Change operation for row\n")
fmt.Printf("[3] Clear one row\n")
fmt.Printf("[4] Clear all rows\n")
fmt.Printf("[5] Exit Program\n")
var choice int
fmt.Printf("\n Your choice: ")
fmt.Scanln(&choice)
//menuChoice :=1
switch choice {
case 1:
fmt.Printf("Row number? (1-5)")
var rowNumber int
fmt.Scanln(&rowNumber)
fmt.Printf("Column number (0-4)? ")
var columnNumber int
fmt.Scanln(&columnNumber)
if rowNumber ==1 {
editcell (row1[:],columnNumber)
//use row1
}else if rowNumber ==2{
//use row2
editcell(row2[:],columnNumber)
}else if rowNumber ==3{
//use row3
editcell(row3[:],columnNumber)
}else if rowNumber ==4{
editcell(row4[:],columnNumber)
//use row4
} else if rowNumber ==5{
editcell(row5[:],columnNumber)
//
}
case 2:
fmt.Printf("Row number? (1-5)?")
var row int
fmt.Scanln(&row)
if row ==1{
fmt.Printf("Which operation would you like? 1: SUM , 2 :AVERAGE , 3 : MINIMUM , 4: MAX \n")
var op int
fmt.Scanln(&op)
}
程序运行效果示例

更多关于Golang项目开发遇到问题,求大神帮忙解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
我已经完成了菜单部分,现在能够编辑任意行/列的值,目前正在尝试实现行数值的运算功能。
更多关于Golang项目开发遇到问题,求大神帮忙解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你的程序目前实现了哪些功能?已经完成了哪些需求?
以下是基于您需求的完整Go程序实现。我重构了代码结构,使用切片替代固定数组,并实现了所有必需功能:
package main
import (
"fmt"
"math"
"os"
"os/exec"
"runtime"
)
type Spreadsheet struct {
rows [][]float64
ops []string
calc []float64
}
func NewSpreadsheet(rows, cols int) *Spreadsheet {
s := &Spreadsheet{
rows: make([][]float64, rows),
ops: make([]string, rows),
calc: make([]float64, rows),
}
for i := range s.rows {
s.rows[i] = make([]float64, cols)
s.ops[i] = "SUM" // 默认操作
}
return s
}
func (s *Spreadsheet) calculateRow(rowIndex int) {
row := s.rows[rowIndex]
switch s.ops[rowIndex] {
case "SUM":
sum := 0.0
for _, val := range row {
sum += val
}
s.calc[rowIndex] = sum
case "AVERAGE":
sum := 0.0
for _, val := range row {
sum += val
}
if len(row) > 0 {
s.calc[rowIndex] = sum / float64(len(row))
} else {
s.calc[rowIndex] = 0
}
case "MIN":
min := math.MaxFloat64
for _, val := range row {
if val < min {
min = val
}
}
if min == math.MaxFloat64 {
s.calc[rowIndex] = 0
} else {
s.calc[rowIndex] = min
}
case "MAX":
max := -math.MaxFloat64
for _, val := range row {
if val > max {
max = val
}
}
if max == -math.MaxFloat64 {
s.calc[rowIndex] = 0
} else {
s.calc[rowIndex] = max
}
}
}
func (s *Spreadsheet) PrintAll() {
for i := range s.rows {
s.PrintRow(i)
}
}
func (s *Spreadsheet) PrintRow(rowIndex int) {
fmt.Printf("%d:", rowIndex+1)
for _, value := range s.rows[rowIndex] {
fmt.Printf("%8.2f ", value)
}
fmt.Printf(" | %8.2f (%s)\n", s.calc[rowIndex], s.ops[rowIndex])
}
func (s *Spreadsheet) EditCell(rowIndex, colIndex int) {
if rowIndex < 0 || rowIndex >= len(s.rows) || colIndex < 0 || colIndex >= len(s.rows[0]) {
fmt.Println("无效的行或列索引")
return
}
fmt.Printf("输入新值 (当前值=%.2f): ", s.rows[rowIndex][colIndex])
var newValue float64
_, err := fmt.Scanln(&newValue)
if err != nil {
fmt.Println("无效输入,请输入数字")
var discard string
fmt.Scanln(&discard)
return
}
s.rows[rowIndex][colIndex] = newValue
s.calculateRow(rowIndex)
}
func (s *Spreadsheet) ChangeOperation(rowIndex int) {
if rowIndex < 0 || rowIndex >= len(s.ops) {
fmt.Println("无效的行索引")
return
}
fmt.Println("选择操作:")
fmt.Println("1: SUM (求和)")
fmt.Println("2: AVERAGE (平均值)")
fmt.Println("3: MIN (最小值)")
fmt.Println("4: MAX (最大值)")
fmt.Print("你的选择 (1-4): ")
var choice int
_, err := fmt.Scanln(&choice)
if err != nil || choice < 1 || choice > 4 {
fmt.Println("无效选择")
var discard string
fmt.Scanln(&discard)
return
}
switch choice {
case 1:
s.ops[rowIndex] = "SUM"
case 2:
s.ops[rowIndex] = "AVERAGE"
case 3:
s.ops[rowIndex] = "MIN"
case 4:
s.ops[rowIndex] = "MAX"
}
s.calculateRow(rowIndex)
}
func (s *Spreadsheet) ClearRow(rowIndex int) {
if rowIndex < 0 || rowIndex >= len(s.rows) {
fmt.Println("无效的行索引")
return
}
for i := range s.rows[rowIndex] {
s.rows[rowIndex][i] = 0
}
s.calculateRow(rowIndex)
fmt.Printf("行 %d 已清空\n", rowIndex+1)
}
func (s *Spreadsheet) ClearAll() {
for i := range s.rows {
for j := range s.rows[i] {
s.rows[i][j] = 0
}
s.calculateRow(i)
}
fmt.Println("所有行已清空")
}
func ClearScreen() {
var cmd *exec.Cmd
switch runtime.GOOS {
case "windows":
cmd = exec.Command("cmd", "/c", "cls")
default:
cmd = exec.Command("clear")
}
cmd.Stdout = os.Stdout
cmd.Run()
}
func getValidIntInput(prompt string, min, max int) int {
for {
fmt.Print(prompt)
var input int
_, err := fmt.Scanln(&input)
if err != nil || input < min || input > max {
fmt.Printf("无效输入,请输入 %d 到 %d 之间的数字\n", min, max)
var discard string
fmt.Scanln(&discard)
continue
}
return input
}
}
func main() {
spreadsheet := NewSpreadsheet(5, 5)
for {
ClearScreen()
fmt.Println("=== 电子表格程序 ===")
spreadsheet.PrintAll()
fmt.Println("\n菜单选项:")
fmt.Println("[1] 编辑单元格")
fmt.Println("[2] 更改行操作")
fmt.Println("[3] 清空单行")
fmt.Println("[4] 清空所有行")
fmt.Println("[5] 退出程序")
choice := getValidIntInput("\n你的选择: ", 1, 5)
switch choice {
case 1:
row := getValidIntInput("行号? (1-5): ", 1, 5) - 1
col := getValidIntInput("列号? (0-4): ", 0, 4)
spreadsheet.EditCell(row, col)
case 2:
row := getValidIntInput("行号? (1-5): ", 1, 5) - 1
spreadsheet.ChangeOperation(row)
case 3:
row := getValidIntInput("行号? (1-5): ", 1, 5) - 1
spreadsheet.ClearRow(row)
case 4:
spreadsheet.ClearAll()
case 5:
fmt.Println("程序退出")
return
}
fmt.Print("按回车键继续...")
fmt.Scanln()
}
}
主要改进点:
- 使用结构体封装:创建了
Spreadsheet结构体来管理所有数据 - 动态计算:实现了
calculateRow方法,根据操作类型计算每行的结果 - 输入验证:添加了
getValidIntInput函数处理无效输入 - 完整的操作支持:实现了所有必需的操作(求和、平均值、最小值、最大值)
- 健壮的错误处理:防止数组越界和无效输入
程序运行时会显示5行数据,每行包含5个单元格,右侧显示基于选定操作的计算结果。用户可以通过菜单进行各种操作,所有输入都经过验证以确保程序稳定性。

