2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > C语言二维数组定义 赋值 按要求遍历操作 输出以及函数调用

C语言二维数组定义 赋值 按要求遍历操作 输出以及函数调用

时间:2024-07-01 05:12:28

相关推荐

C语言二维数组定义 赋值 按要求遍历操作 输出以及函数调用

一、建立二维数组并赋值

程序1:

#include <stdio.h>int main(){int a[6][6],i,j; //定义一个六行六列的二维数组for(i=1;i<6;i++)for(j=1;j<6;j++)a[i][j] = (i/j)*(j/i); //对除第一行以及第一列的所有元素赋值,i/j保留整数值for(i=1;i<6;i++){for(j=1;j<6;j++)printf("%2d",a[i][j]); //对已经赋值的部分全部输出printf("\n");}return 0;}

第一个主for循环对二维数组的部分元素赋值

第二个for循环对二维数组的赋值部分进行输出

结果为:

程序2:

#include <stdio.h>int main(){int a[3][3]={{1,3,5},{7,9,11},{13,15,17}},sum=0,i,j; //对二维数组初始化赋值for(i=0;i<3;i++)for(j=0;j<3;j++){if(i==j)sum += a[i][j]; //将二维数组的所有对角线元素相加,1+9+17}printf("sum = %d",sum);return 0;}

for循环对二维数组的行列数相等的位置进行输出,即输出1,9,17的和,即27

程序3:

#include <stdio.h>int main(){int a[5][5]={0},i,j,k=1; //定义一个初始化全为0的二维数组for(i=0;i<5;i++) //对每一层遍历for(j=i;j>=0;j--)a[j][i-j] = k++; //观察i,j每次循环指代的位置for(i=0;i<5;i++){for(j=0;j<5-i;j++)printf("%4d",a[i][j]); //下三角形式输出全部元素printf("\n");}return 0;}

因为k的值,每次都是k++递增的,所有k的值反应了a[ i ][ j ]的赋值顺序,可以验证参考

二、程序设计

1. 输出行、列号之和为3的数组元素

#include <stdio.h>int main( ){char ss[4][3]= {'A','a','f','c','B','d','e','b', 'C','g','f','D'};//从第一行开始按顺序对全部元素赋值int x,y,z;for (x=0;x<4; x++)for (y=0;y<3; y++) //按顺序遍历{z=x+y; //z表示行、列号之和if (z==3)printf("%c\n",ss[x][y]); //z等于3,则输出}return 0;}

行列号为3,也就是a[1][2] ; a[2][1] ; a[3][0],注意二维数组的四行三列的

**2. 分别求一个 5×5 矩阵(5阶魔方阵)的所有行之和、列之和、两条对角线上的元素之和。 **

#include <stdio.h>#define N 5//定义N代表值5int main( ){int i, j;int x[N][N] = {{17,24,1,8,15},{23,5,7,14,16}, {4,6,13,20,22}, {10,12,19,21,3}, {11,18,25,2,9}};//对二维数组中的元素进行初始化int rowSum, colSum, diagSum; //行的和;列的和;对角线的和for (i=0; i<N; i++)//行求和{rowSum = 0; //每求一行需要先置零for (j=0; j<N; j++){rowSum += x[i][j];}printf("第%d行的和为:%d\n",i,rowSum); //输出每一行的和}printf("\n");for (j=0; j<N; j++)//列求和{colSum = 0; //每求一列需要先置零for (i=0; i<N; i++){colSum += x[i][j];}printf("第%d列的和为:%d\n",j,rowSum); //输出每一列的和}printf("\n");diagSum = 0; //主对角线可以在循环外置零,中间不需要清零for (i=0; i<N; i++) //主对角线求和{diagSum = diagSum + x[i][i]; //x[i][i]即主对角元素}printf("主对角线求和为:%d\n",diagSum);diagSum = 0;for (j=0; j<N; j++) //次对角线求和{diagSum = diagSum + x[j][N-1-j]; //x[j][N-1-j]动态表示次对角元素}printf("次对角线求和为:%d\n",diagSum);return 0;}

运行:

3. 数组的应用

创建一个5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后:

通过键盘输入,使后两列的10个元素获得值;按行序优先输出数组元素;将所有元素值乘以3后保存在数组中;按列序优先输出(输出的第一行是数组中的第一列……,其实输出的就是“转置”);将数组“倒”着输出(即最后一行最后一列的最先输出,第0行第0列的最后输出);输出数组中的所有偶数;输出所有行列下标之和为3的倍数的元素值。

注意:完成本题可采用按要求,在主程序中分别完成所有功能也可以采用将每个可独立的功能按函数的方式进行编写,在主程序中进行调用。

这里全部采用函数实现,主函数调用

#include <stdio.h>#include <conio.h>void hang(int a[][4],int m,int n)//按行序输出所有元素,int a[][4]接收实参数组,m,n表示数组大小参数{int i,j,k=0;for(i=0;i<m;i++)for(j=0;j<n;j++){printf("%d ",a[i][j]);k++;if(k%4==0)printf("\n"); //四个一换行}}void chen(int a[][4],int m,int n,int k)//对所有元素乘积倍扩大函数,传入二维数组,数组大小参数,以及扩大的倍数k{int i,j;for(i=0;i<m;i++)for(j=0;j<n;j++)a[i][j]=a[i][j]*k; //遍历所有元素 ×k扩大}void lie(int a[][4],int m,int n)//列序优先输出{int i,j,k=0;for(j=0;j<n;j++) //外层循环是n,也就是列数for(i=0;i<m;i++) //外层循环是m,也就是行数,输出每列所有元素{printf("%d ",a[i][j]);k++;if(k%5==0)printf("\n");//五个一换行,因为有5行}}void dao(int a[][4],int m,int n)//数组“倒”着输出{int i,j,k=0;for(i=m-1;i>=0;i--) //从对后一行开始遍历for(j=n-1;j>=0;j--) //从对后一行最后一列开始遍历{printf("%d ",a[i][j]);k++;if(k%4==0)printf("\n");}}void ou(int a[][4],int m,int n)//输出数组中的所有偶数{int i,j,k=0;for(i=0;i<m;i++)for(j=0;j<n;j++) //按序遍历每一个元素if(a[i][j]%2==0){printf("%d ",a[i][j]);k++;if(k%5==0)printf("\n");//可以被2整除就输出,并且满5个一换行}printf("\n");}void xia(int a[][4],int m,int n)//输出所有行列下标之和为3的倍数的元素值{int i,j,k=0;for(i=0;i<m;i++)for(j=0;j<n;j++) //按序遍历每一个元素if((i+j)==3) //下标和由i+j表示{printf("%d ",a[i][j]);k++;if(k%4==0)printf("\n");//下标和可以被3整除就输出,并且满4个一换行}printf("\n");}int main(){int a[5][4]={{1,2},{5,6},{9,10},{13,14},{17,18}},i,j;printf("<1>已创建一个5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值(回车继续)\n");getch(); //接收键盘回车符printf("<2>请通过键盘输入,使后两列的10个元素获得值(回车继续)\n");for(i=0;i<5;i++)for(j=2;j<4;j++)scanf("%d",&a[i][j]);getch(); //接收键盘回车符printf("<3>按行序优先输出数组元素(回车继续)\n");hang(a,5,4); //调用行输出函数getch();printf("<4>已将所有元素乘以3后保存在数组中(回车继续)\n");chen(a,5,4,3); //调用扩大函数getch();printf("<5>按列序优先输出数组元素(回车继续)\n");lie(a,5,4); //调用列输出函数getch();printf("<6>倒着输出数组元素(回车继续)\n");dao(a,5,4); //调用倒序输出函数getch();printf("<7>输出数组的所有偶数元素(回车继续)\n");ou(a,5,4); //调用偶数输出函数getch();printf("<8>输出所有行列下标之和为3的倍数的元素值\n");xia(a,5,4); //调用下表和函数return 0;}

运行:(按序补充所有元素1-20)

4. 编程,现有10位同学4门课程的成绩

要求:

分别计算每门课程的平均分分别计算每位同学4门课程的平均分;要求最后以列表方式输出所有成绩和平均分;

分析:

采用二维数据存储课程成绩,并且注意数组定义的大小;为了减少程序调试过程中,频繁输入数据,可以在程序中定义二维数组的同时提供初始化数据作为课程成绩;在主程序中分别完成所有功能,也可以采用将每个可独立的功能按函数的方式进行编写,在主程序中进行调用。

#include <stdio.h>#include <conio.h>//函数声明void kave(int a[][4],int m,int n,float *p);//计算每门课程的平均分void tave(int a[][4],int m,int n,float *p);//计算每位同学4门课程的平均分int print(int a[][4],float b[],float c[],int m,int n);//以列表方式输出所有成绩和平均分int main(){int a[10][4]={{60,70,80,90},{61,71,81,91},{62,72,82,92},{63,73,83,93},{64,74,84,94},{65,75,85,95},{66,76,86,96},{67,77,87,97},{68,78,88,98},{69,79,89,99}};//定义10位同学的四门课分数float b[4]={},c[10]={};//浮点型数组,b数组存储四个课程平均分,c数组存储10位同学平均分,全部初始化为0printf("<1>完成计算每门课程的平均分(回车继续)\n");kave(a,10,4,b); //将b数组地址传给kave函数的p指针,指代b数组,用于函数内赋值getch();printf("<2>完成计算每位同学4门课程的平均分(回车继续)\n");tave(a,10,4,c); //将c数组地址传给tave函数的p指针,指代c数组,用于函数内赋值getch();printf("<3>以列表方式输出所有成绩和平均分:\n");print(a,b,c,10,4); //三个数组,m,n表示a二位数组大小return 0;}void kave(int a[][4],int m,int n,float *p){int i,j;for(j=0;j<n;j++){for(i=0;i<m;i++)*p=*p+a[i][j]; //计算一列(同一科目)所有成绩之和*p=*p/m; //取单科成绩平均数,赋值给b数组的p位置处p++; //p指针调整至b数组的下一个元素位置}}void tave(int a[][4],int m,int n,float *p){int i,j;for(i=0;i<m;i++){for(j=0;j<n;j++)*p=*p+a[i][j]; //计算一行(同一学生)四种科目成绩之和*p=*p/n; //取四科成绩平均数,赋值给c数组的p位置处p++; //p指针调整至c数组的下一个元素位置}}int print(int a[][4],float b[],float c[],int m,int n){int i,j,k;//输出全部学生的所有科目成绩信息for(i=0;i<m;i++){printf("学生%d的成绩:",i+1);for(j=0;j<n;j++)printf("%d ",a[i][j]);printf("\n");}printf("每门课程的平均分为:\n");for(k=0;k<n;k++)printf("课程%d\t\t",k+1);printf("\n");for(k=0;k<n;k++)printf("%f\t",b[k]);printf("\n");printf("每位同学4门课程的平均分为:\n");for(k=0;k<m;k++)printf("%f ",c[k]);return 0;}

运行:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。