【一Go到底】第三十二天---二维数组

80 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第32天,点击查看活动详情

一、二维数组入门

1.1 入门案例

//二维数组介绍

package main

import "fmt"

func main() {

	// 声明二维数组

	var mulArray [5][5]int
	// [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
	fmt.Println(mulArray)
	// 对数组赋值
	mulArray[0][0] = 5
	mulArray[1][1] = 5
	mulArray[2][2] = 5
	mulArray[3][3] = 5
	mulArray[4][4] = 5
	// [[5 0 0 0 0] [0 5 0 0 0] [0 0 5 0 0] [0 0 0 5 0] [0 0 0 0 5]]
	fmt.Println(mulArray)

	// 遍历二维数组

	for i := 0; i < len(mulArray); i++ {
		for j := 0; j < len(mulArray); j++ {
			// 或者
			// fmt.Printf("%v\t", mulArray[i][j])

			// 5 0 0 0 0
			// 0 5 0 0 0
			// 0 0 5 0 0
			// 0 0 0 5 0
			// 0 0 0 0 5
			fmt.Printf("%v ", mulArray[i][j])
		}
		fmt.Println()
	}

}

1.2 语法

1.2.1 使用语法一(先声明,再赋值),详见 1.1入门案例

var 数组名 [size][size] 类型
// 例
var IntArr [5][5]int
// 赋值
IntArr [0][0] = 1
.....

1.2.2 使用语法二,声明赋值

var 数组名 [size][size]类型 = [size][size]类型{{x,x,x}.....{x,x,x}}
// 例

var intArr [2][2]int = [2][2]int{{1,1},{1,}}

1.2.3 语法三

var 数组名 [size][size]类型 = [...][size]类型{{x,x,x}.....{x,x,x}}
// 例

var intA [2][2]int = [...][2]int{{1, 1}, {1, 1}}

1.2.4 语法四

var 数组名 = [size][size]类型{{x,x,x}{x,x,x}}
// 例

var intA = [2][2]int{{1, 1}, {1, 1}}

1.2.5 语法五

var 数组名 = [...][size]类型{{x,x,x}{x,x,x}}
// 例

var intA = [...][2]int{{1, 1}, {1, 1}}

1.3 在内存中的地址

案例

// 二维数组在内存中的地址
package main

import "fmt"

func main() {
	// 定义数组
	var intArr [5][5]int

	// 查看数组内存地址
	// intArr[0]地址 = 0xc000110000
	// intArr[1]地址 = 0xc000110028
	// 相差 0x28 也就是 16+16+8 = 40字节
	// 每个数组中的元素又有5个元素,每个元素占8字节 5*8 = 40字节
	fmt.Printf("intArr[0]地址 = %p\n", &intArr[0])
	fmt.Printf("intArr[1]地址 = %p\n", &intArr[1])

	// 查看内层元素地址
	// intArr[0][0]地址 = 0xc000110000
	// intArr[0][1]地址 = 0xc000110008
	fmt.Printf("intArr[0][0]地址 = %p\n", &intArr[0][0])
	fmt.Printf("intArr[0][1]地址 = %p\n", &intArr[0][1])

}

二、二维数组遍历

2.1 for循环遍历

package main

import "fmt"

func main() {
	// 定义二维数组

	var intArr = [2][5]int{{1, 2, 3, 4, 5}, {5, 4, 3, 2, 1}}

	// for循环遍历
	for i := 0; i < len(intArr); i++ {
		for j := 0; j < len(intArr[i]); j++ {
			// 1       2       3       4       5
			// 5       4       3       2       1
			fmt.Printf("%v\t", intArr[i][j])
		}
		fmt.Println()
	}
}

2.2 for-range数组遍历

package main

import "fmt"

func main() {
	// 定义二维数组

	var intArr = [2][5]int{{1, 2, 3, 4, 5}, {5, 4, 3, 2, 1}}

	// for循环遍历
	for i := 0; i < len(intArr); i++ {
		for j := 0; j < len(intArr[i]); j++ {
			// 1       2       3       4       5
			// 5       4       3       2       1
			fmt.Printf("%v\t", intArr[i][j])
		}
		fmt.Println()
	}

	// for-range循环遍历
	// 外层循环的v 是一个一维数组
	for i, v := range intArr {
		for j, v2 := range v {
			//intArr[0][0] = 1        intArr[0][1] = 2        intArr[0][2] = 3        intArr[0][3] = 4        intArr[0][4] = 5
			// intArr[1][0] = 5        intArr[1][1] = 4        intArr[1][2] = 3        intArr[1][3] = 2        intArr[1][4] = 1
			fmt.Printf("intArr[%v][%v] = %v \t", i, j, v2)
		}
		fmt.Println()
	}

}

三、二维数组案例

3.1 案例一,求分数

定义二维数组,用于保存三个班,每个班五名同学的成绩。同时求每个班平均分,所有班级的平均分

package main

import "fmt"

func main() {
	// 定义数组
	var class [3][5]float64

	score_sum := 0.0
	stu_sum := 0
	for i := 0; i < len(class); i++ {
		for j := 0; j < len(class[i]); j++ {
			fmt.Printf("请输入%v个班第%v名同学的成绩: ", i+1, j+1)
			fmt.Scanln(&class[i][j])
		}
	}

	for i := 0; i < len(class); i++ {
		class_sum := 0.0
		for j := 0; j < len(class[i]); j++ {
			class_sum += class[i][j]
			stu_sum += 1
		}
		fmt.Printf("%v班的总成绩 = %v, 平均成绩 = %v\n", i, class_sum, class_sum/float64(len(class[i])))
		score_sum += class_sum
	}
	fmt.Printf("所有班的总成绩 = %v, 平均成绩 = %v", score_sum, score_sum/float64(stu_sum))

}