C语言之数组(二)

本文适合初学者,通过本文你可以迅速了解二维数组的相关的一系列知识点。为了让读者更好的巩固理解本文所学知识,在文章末尾也是提供了多个案例以供练手,参考。

这篇文章的大体内容,是半年前就写完了,然后就一直仍在草稿箱吃灰,今天加以补充完善,但是因为时间过的太久,所以风格可以略有不同(比如编辑器的使用),还望谅解。再补充一句,现在CSDN好像引入了AI检测,要求加上前言,不然就会给我弹出改进质量这个标签。读过我往期的文章就知道我一般是直接上干货的,也许我才识浅陋,但我对写文章的态度还是很认真的,所以我不想被AI赋予这个标签。以后文章可能都会加入前言,帮助读者快速明确,本文是否匹配自己需求。

一.二维数值数组的定义

定义形式:

类型说明符 数组名[常量表达式1][常量表达式2];

二维数值数组的理解:

二维数值数组从逻辑上可理解为行-列矩阵。二维数值数组可以看成是一种特殊的一维数值数组:即它的元素又是一个一维数值数组。

例如,二维数组a[3][4],可以看成一个一维数组,它有3个元素a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组。

13560d096ea74ad29c0229c467bad1ad.jpg

 二.二维数值数组元素的引用

数组名[下标1][下标2];

  • 下标可以是整型表达式,如:a[2-1][2*2-1]
  • 下标可以是已经有值的变量或数组元素,如: a[2*x-1][b[3][1]]

PS:引用数组元素时,数组元素的下标应在已定义数组的大小范围内

三.二维数值数组的存储

99328dcea9304536a8d62f121c1ea95a.jpg

存放顺序:按行连续存放先顺序存放第0行的元素再存放第1行的元素。

四.二维数值数组的初始化

  1. 按行给二维数组赋初值,如:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12]

  2. 按排列顺序对各元素赋初值,如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

  3. 按行赋值,可对部分元素赋初值,其余自动取0值,如:int a[3][4]={{1},{5,6},{9}};

 PS:

  • 若对全部元素赋初值,则定义数组时可不说明第一维的长度(一对方括号不能省),第二维的长度必须指明。如:int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};

  • (2)在按行赋初值时,也可以省略第一维的长度说明。如:int a[ ][4]={{1,2,3},{0},{0,10}];

五.二维数值数组的输入和输出

例如对int a[2][3]进行操作。

输入方法:        

输入第i行第j列元素
scanf("%d",&a[i][jD);
输入所有数组元素
for (i=0;i<2;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][jD);

输出方法:

输出第i行第j列元素
printf("%d",a[i]lj]);
输出所有数组元素
for (i=0;i<2;i++)
for(j=0;j<3;j++)
printf("%d",a[i][j]);

原则:只能逐个对数组元素进行操作。

六.二维数值数组的应用

例1.将一个二维数组a中的行和列的元素互换,存到另一个二维数组b中(转置)后输出。

8833c37e8df64275b5b6249eedff09a2.jpg

 问题分析:

  1. 定义数组a为2行3列,并初始化。
  2. 定义数组b为3行2列。
  3. 用二重循环进行转置。
  4. b[j][i]=a[i]Lj]。
  5. 输出b数组,且需要每输出两数换行一次。

0ed6ad2cff3c4e8a87970fc6916a83b1.jpg

代码如下:

#include<stdio.h>
void main()
{
   int a[2][3]={1,2,3,4,5,6},b[3][2],i,j,n=0;
   for(i=0;i<2;i++)
       for(j=0;j<3;j++)
           b[j][i]=a[i][j];
   for(i=0;i<3;i++)
       for(j=0;j<2;j++)
          {
           printf("%d",b[i][j]);
           n++;
           if(n%2==0)
             printf("\n");
           }
}

例2.已知N名同学M门课程的成绩,求每门课程的平均成绩。

问题分析:

1.定义一个M行N列的二维数组score,用来存放M门课程N名同学的成绩;
2.再定义一个长度为M的一维数组ave,存放每门课程的平均成绩;
3.利用双层循环求出每门课程的平均成绩,并存入ave中;
4.输出一维数组ave中的各元素的值。

代码如下:

#include <stdio.h>
#define M 2
#define N 3
int main()
{
    int score[M][N];
    float ave[M];
    int i = 0, j = 0;
    printf("请输入学生的成绩:");
    for (i = 0;i < M;i++)
        for (j = 0;j < N;j++)
        {
            scanf_s("%d", &score[i][j]);
        }
    for (i = 0;i < M;i++)
    {
        float sum = 0;
        float avrage = 0;
        for (j = 0;j < N;j++)
        {
            sum += score[i][j];
        }
        avrage = sum / (j + 1);
        ave[i] = avrage;
    }
    for (i = 0;i < M;i++)
    {
        printf("第%d门课的平均分是:%.2f\n", i + 1, ave[i]);
    }
    return 0;
}

例3.有一个3×4的二维数组a,要求编程求出其最大值以及其所在的行号和列号。

问题分析:

采用“打擂台算法

①将a[0][0]作为参考赋给max,将其行列下标分别赋给b和c。
②然后将其它元素依次与max比较,遇到比max大的就将其赋给max,行列下标分别赋给b=i、c=j。
③全部比较完毕,则max便是最大元素,b、c就是其所在行列值。

代码如下:

#include <stdio.h>
int main()
{
    int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
    int i, j, b,c;
    int max = a[0][0];
    for (i = 0;i < 3;i++)
        for (j = 0;j < 4;j++)
        {
            if (a[i][j] > max)
            {
                max = a[i][j];
                b = i;
                c = j;
            }
        }
    printf("max=%d,行号是:%d,列号是:%d",max,b,c);
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值