开发者学堂课程【Go语言核心编程 - 基础语法、数组、切片、Map:二维数组应用实例】与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/625/detail/9654
二维数组应用实例
内容介绍
一、二维数组应用实例要求
二、实现功能分析
一、二维数组应用实例要求
要求:定义二维数组,用于保存三个班,每个班五名同学成绩,定义一维数组是没办法区分那个班级的,所以这里要定义二维数组。并求出每个班级平均分、以及所有班级平均分。
输出结果为:
请输入:第1班的第1个学生的成绩1
请输入:第1班的第2个学生的成绩1
请输入:第1班的第3个学生的成绩1
请输入:第1班的第4个学生的成绩1
请输入:第1班的第5个学生的成绩1
请输入:第2班的第1个学生的成绩2
请输入:第2班的第2个学生的成绩2
请输入:第2班的第3个学生的成绩2
请输入:第2班的第4个学生的成绩2
请输入:第2班的第5个学生的成绩1
请输入:第3班的第1个学生的成绩3
请输入:第3班的第2个学生的成绩3
请输入:第3班的第3个学生的成绩3
请输入:第3班的第4个学生的成绩3
请输入:第3班的第5个学生的成绩3
从输出结果来看应该是要动态的给每个班学生赋值,循环的从控制台来输入同学的成绩,下面来完成案例。
二、实现功能分析
新建 main.go,分析如下:
1、定义一个二维数组 scores[3][5],第一个3表示3个一维数组,第二个5表示每个一维数组里面有5个元素,然后数据类型 float64。
2、循环输入成绩,要循环输入成绩就要用到遍历,for 循环i初始值为0,i小于len,算出 scores 的大小,然后i++,再进行二次遍历一维数组,因为每个学生都要输入成绩,for 循环 j 等于0,后面 j 小于 len,len 中值为 scores[i],然后 j++。最后打印出“请输入第%d班的第%d个学生的成绩\n”,第一个%d 应该是 i+1,再+1是因为数组下标是从0开始,但不能打印第0个班,第二个%d 代表第几个学生。输出后 Scanln 进行接收,通过学生成绩 scores[i][j]地址进行接收,这时所有学生成绩应该都计算出来了,可以打印观察,代码如下:
package main
import (
”
fmt"
)
func main() {
//1.定义一个二维数组
var scores [3][5]float64
//2.循环的输入成绩
for i := 0; i < len(scores);
i
++ {
for j := e; j < len(scores[1]); j++ {
fmt. Printf
("请输入第%d班的第%d个学生的成绩\n", i+1, j+1)
fmt. ScanIn(&scores[i][j])
}
}
fmt. Println(scores
)
}
通过管理员命令进行运行:
>cd
exercise
>
go run main.go
这时会提示输入第一个班的第一个学生成绩,接下来分别快速输入第一个班五名学生成绩都为1.1,第二个班五名学生成绩都为3,第三个班五名学生成绩都为4,输入完毕后会看到三个班的五名学生成绩如下:
[[1.1 1.1 1.1 1.1 1.1]
[3 3 3 3 3] [4 4 4 4 4]
接下面开始进行求出每个班的平均分。
3、遍历输出成绩后的二维数组,统计平均分。首先要统计平均分,就要知道总分,要想得到总分可以定义 sum 为0.0,因为进行 for 循环就是在遍历每个班级的成绩了,所以在这里定义一个变量,用于累计各个班级的总分,累计总分则是sum +=scores[i][j]即可,然后输出第几班为%d,取值为i+1,总分为%v,就按原值输出,平均分为%v,总分为 sum,平均分就为 sum 除以总人数5,但这里为除以 len,人数写固定死了不好,班级总人数写 len(scores[i])更合理,scores[i]表示当前班级有几个学生,保存时 sum/ len(scores[i])会出现错误,因为 sum 是 float64的类型,而后面 len(scores[i])是 int 类型,需要在len前面转化为 float64类型,前面提过 Golang 在进行运算的时候要进行强制转化,不会默认的进行隐式转化,这时每个班的平均分就完成了。
但还要完成所有班级的平均分,而要求所有班级的平均分,就要累计出每一次的sum,所以在for循环外面再定义一个变量 totalSum,等于0.0,这一步就是定义一个变量,用于累计所有班级的总分,在第二次for循环后将每次 sum 值累计到totalSum 中,如 totalSum +=sum,意味着双循环完成后 totalSum 就是所有班级总分,以上功能完成后再次输出所有班级的总分%v,平均分%v,第一个%v的sum就该为 totalSum,第二个%v为 totalSum/15,总人数直接写15,如果要使用len(scores[i])每个班级总人数,就要进行累加每个班人数,可以再定义一个变量,把各个班级总人数统计出来再写到这里。
这里有一个小技巧,如果输出太长可以换行处理,但在要换行位置前一个必须是”,”号,如果“,”在换行之后会报错,而且这样的代码看着更简洁。
代码:
…
//3.遍历输出成绩后的二维数组,统计平均分
totalsum := 0.0
//定义一个变量,用于累计所有班级的总分
for
i
:= 0;
i
< len(scores); i++ {
sum := 0.0
//定义一个变量,用于累计各个班级的总分
for j := 0; j< len(scores[i]); j++ {
sum += scores [i][j]
totalsum += sum
fmt.Printf("第%d班级的总分为%v,平均分%v\n", i+1, sum,
sum / float64(len(scores[i])))
}
fmt. Printf("所有班级的总分为%v,所有班级平均分%v\n",
totalSum, totalSum /15 )
}
下面进行运行:
D: \goproject\src\go_code\chapter08\exercise
>
go run main.go
再快速输入值,第一个班级五名学生成绩都为1,第二个班级五名学生成绩都为2,第三个班级五名学生成绩都为3,此时运行结果为:
第1班级的总分5,平均分1
第2班级的总分10,平均分2
第3班级的总分15,平均分3
所有班级的总分为30,所有班级平均分2
以上结果与输入值计算后应得值相同,是正确的,所以功能实现成功。