一、建立二维数组并赋值
程序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代表值5
int 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位同学平均分,全部初始化为0
printf("<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;
}
运行: