C语言:二维数组应用示例(班级平均分)

二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。

类型说明符 数组名[常量表达式][常量表达式]。

——百度百科

二维数组又称为矩阵,但实际在储存时仍是一维数组的存储形式。

我们将采用例题的形式进行二维数组相关常见系统的理解。


假如一个学习小组有6名同学,每人有三门必修课(数学、语文和英语),成绩如下表所示,求每门课的平均分和每个人的平均分。

课程王笑李鹏吴欣张平赵明张晓娜
数学859384859586
语文7995958010098
英语809193759790

此类题目一般我们都会设行为i,列为j。

可设一个二维数组a[3][6]存储3门课程6个人的成绩。

然后再设一个一维数组v[3]存储每门课的平均分,设一个一维数组w[6]存储每个人的平均分。

代码实现

#include<stdio.h>
int main()
{
	/*
	v[0]+=a[0][j];//数学 
	v[1]+=a[1][j];//语文 
	v[2]+=a[2][j];//英语 
	
	w[0]+=a[i][0];//王笑 
	w[1]+=a[i][1];//李鹏 
	w[2]+=a[i][2];//吴欣 
	w[3]+=a[i][3];//张平 
	w[4]+=a[i][4];//赵明 
	w[5]+=a[i][5];//张晓娜 
	*/

	float v[3]={},w[6]={};//因为一般的平均数都不是整数,所以我们用float类型
	int i,j;
	
	int a[3][6]={{85,93,84,85,95,86},{79,95,95,80,100,98},{80,91,93,75,97,90}};
	
	
	for(i=0;i<3;i++)//行
	{  
		for(j=0;j<6;j++)//列
		{
			v[i]+=a[i][j]; 
			
		}
		v[i]/=6;
		printf("v[%d]=%.3lf\n",i,v[i]);	//%.3lf意思就是取小数点后三位
	}
		
		for(j=0;j<6;j++)//列 
	{  
		for(i=0;i<3;i++)//行 
		{
			w[j]+=a[i][j];
		}
		w[j]/=3;
		printf("w[%d]=%.3lf\n",j,w[j]);
	}
	
	return 0;
} 

值得说明的是,其实int a[3][6] 的储存也可以是如下样式。

int a[3][6]={85,93,84,85,95,86,79,95,95,80,100,98,80,91,93,75,97,90};

前提过 实际在储存时仍是一维数组的存储形式。

采用for双循环嵌套模型对3行6列进行遍历 ,以下为代码详解。


每门课的平均分(就是每一行的相加,再除6)

课程王笑李鹏吴欣张平赵明张晓娜每课平均分
数学859384859586
语文7995958010098
英语809193759790

找其特点然后构思代码,每一行相加,就是行数i不变,而列数j在变,然后每一列的数相加。

第一行的数据都相加,第二行的数据都相加...。每一行互不干扰。

(其实行不变,列改变的更容易理解,我们初学者大多常见的就是这种行不变,列改变的基础题型,如9*9乘法表)

实现代码如下

	for(i=0;i<3;i++)//行
	{  
		for(j=0;j<6;j++)//列
		{
			v[i]+=a[i][j]; 	
		}
		v[i]/=6;
		printf("v[%d]=%.3lf\n",i,v[i]);	
	}

 数组的下标是从0开始。

然后第一个for中i循环,i就从0变为1,而在重复第二个for的j循环。j依次遍历。

此时的v[i]就是v[1]=a[1][0]+a[1][1]+a[1][2]+a[1][3]+a[1][4]+a[1][5] 。然后再/6。

然后第一个for中i循环,i就从1变为2,而在重复第二个for的j循环。j依次遍历。

此时的v[i]就是v[2]=a[2][0]+a[2][1]+a[2][2]+a[2][3]+a[2][4]+a[2][5] 。然后再/6。


而每个人的平均分(就是每一列的相加,再除3)

课程王笑李鹏吴欣张平赵明张晓娜
数学859384859586
语文7995958010098
英语809193759790
每人平均分

找其特点然后构思代码,每一列相加,就是列不变,而行数在变,然后每一行的数相加。

第一列的数据都相加,第二列的数据都相加...。每一列互不干扰。

实现代码如下

		for(j=0;j<6;j++)//列 
	{  
		for(i=0;i<3;i++)//行 
		{
			w[j]+=a[i][j];
		}
		w[j]/=3;
		printf("w[%d]=%.3lf\n",j,w[j]);
	}

我们可以与上文的核心代码进行对比发现。是两次for循环的嵌套位置发生了改变。但其核心的理念是不变的。

然后第一个for中j循环,i就从0变为5,而在重复第二个for的i循环。i依次遍历。

此时的w[j]就是v[0]=a[0][0]+a[1][0]+a[2][0]+a[3][0]+a[4][0]+a[5][0] 。然后再/3。

然后第一个for中j循环,i就从0变为5,而在重复第二个for的i循环。i依次遍历。

此时的w[j]就是v[1]=a[0][1]+a[1][1]+a[2][1]+a[3][1]+a[4][1]+a[5][1] 。然后再/3。

......依次直到j=5结束。

输出结果如下

 

既然没有终点,那在何处又何妨呢。


希望对你有帮助,语言学习贵在坚持输入和输出!

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值