GO学习笔记 二维数组

一.二维数组

1.二维数组入门

请用二维数组输出如下图形:

0 0 0 0 0 0

0 0 1 0 0 0

0 2 0 3 0 0

0 0 0 0 0 0

代码实现:

package main

import "fmt"

func main(){
    // 二维数组例子
    /*
    0 0 0 0 0 0
    0 0 1 0 0 0
    0 2 0 3 0 0
    0 0 0 0 0 0
    */
    // 声明二维数组
    var arr [4][6]int
    // 赋初值
    // fmt.Println(arr)

    arr[1][2] = 1
    arr[2][1] = 2
    arr[2][3] = 3
    // 遍历二维数组,按照要求输出图形
    for i :=0;i<4; i++ {
        for j :=0; j < 6; j++ {
            fmt.Print(arr[i][j]," ")
        }
        fmt.Println()
    }

2.使用二维数组

使用方式1:先声明/定义,再赋值

(1)语法:var 数组名 [大小][大小] 类型

二维数组里面的内存地址相邻。

相差的地址相差为数据类型 * 数组长度

比如int:8个字节

如果 arr [2][2]

这样第一个数组第一个元素的内存地址和第二个元素的内存地址相差16个字节。

使用方式2:直接初始化

1)声明: var 数组名 [大小][大小] = [大小][大小]类型{{初值}}{{初值}}

2)赋值 (有默认值,比如int 类型就是0)

package main

import "fmt"

func main()  {
    //
    var arr2 [2][3]int = [2][3]int {{1,2,22},{12,23,45}}
    fmt.Println("arr2=",arr2)
}

3.二维数组的遍历

(1)双层for循环遍历

(2)for_range 方式遍历

例:

package main

import "fmt"

func main()  {
    //二维数组的遍历
    var arr [2][3]int = [2][3]int {{1,2,22},{12,23,45}}
    // 方法一: for循环遍历
    for i := 0; i < len(arr); i++ {
        for j := 0; j < len(arr[i]); j++ {
            fmt.Printf("%v\t",arr[i][j])
        }
        fmt.Println()
    }

    // for-range来遍历二维数组
    for i,v := range arr {
        for j,v2 := range v {
            fmt.Printf("arr[%v][%v]=%v",i,j,v2)
        }
        fmt.Println()
    }

}

二维数组的应用案例

题目:定义二维数组,用于保存三个班,每个班五名同学成绩,并求出每个班级平均分,以及所有班级平均分。

package main

import "fmt"

func main(){
    // 题目:定义二维数组,用于保存三个班,每个班五名同学成绩,
    // 并求出每个班级平均分,以及所有班级平均分。

    // 定义一个二维数组
    var scores [3][5] float64 
    // 循环输入成绩
    for i := 0 ; i < len(scores); i++ {
        for j:= 0; j < len(scores[i]); j++ {
            fmt.Printf("请输入第%d班的第%d个学生的成绩:",i+1,j+1)
            fmt.Scanln(&scores[i][j])
        }
    }

    fmt.Println(scores)
    // 遍历输出成绩的二维数组,统计平均分
    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("第%v班级总分为%v,平均分为%v\n",i+1,sum,sum /float64(len(scores[i])))
    }
    fmt.Printf("所有班级的总分%v,所有班级的分均分%v\n",totalSum,totalSum / float64(15))
}

二.数组的练习

1.随机生成10个整数(1-10的范围)保存到数组,并倒序打印以及求平均值、求最大值和最大值的下标、并查找里面是否有55。

2.已知有个排序好(升序)的数组,要求插入一个元素,最后打印该数组,顺序依然要升序

3.定义一个3行4列的二维数组,逐个从键盘输入值,编写程序将四周的数据清0

4.定义一个4行4列的二维数组,逐个从键盘输入值,然后将第1行和第4行的数据进行交换,将第2行和第3行的数据进行交换。

5.试保存1 3 5 7 9五个奇数到数组,并倒序打印

6.写出实现查找的核心代码,比如已知数组 arr[10]string ; 里面保存了十个元素,现要查找”AA” 在其中是否存在,打印提示,如果有多个”AA”,也要找到对应的下标。

7.随机生成10个整数(1-100之间),使用冒泡排序法进行排序,然后使用二分查找法,查找是都有90这个数,并显示其下标,如果没有则提示”找不到该数”。

8.编写一个函数,可以接收一个数组,该数组有5个数,请找出最大和最小的数和对应的数组下标是多少?

9.定义一个数组,并给出8个整数,求改数组中大于平均值的个数,和小于平均值的数的个数。

10.跳水比赛打分,运动员的成绩8个成绩,去掉一个最高分和一个最低分,剩下的6个分数的平均分就是最后得分。使用一维数组实现如下功能。

(1)请把打分最高分的评委和最低分的评委找出来

(2)找出最佳评委和最差评委。最佳评委就是打分和最后得分最接近的评委。最差评委就是打分和最后得分相差最大的。