C语言例题二维数组
例一:转置矩阵
程序:
#include int main (){int a[2][3]={{1, 2, 3}, {4, 5,6}};int b[3][2];int i =0,j;while (i<2){j=0;do{b[j][i] = a[i][j];j =j+ 1; }while(j<3); i =i + 1;}printf ("原矩阵:\n");/*输出原矩阵,即二维数组a的各个元素*/for (i = 0;i<2;i=i+1){for (j= 0;j<3;j=j+1)printf ("%5d", a[i][j] );printf ("\n");/*输出一行数据后,回车到下一行*/}printf ( "转置矩阵:\n");/*输出转置矩阵,即二维数组b的各个元素*/i = 0;while(i<3){j = 0;while(j<2){printf ( "%5d", b[i][j] );j =j+ 1;}printf ("\n");/*输出一行数据后,回车到下一行*/i = i+ 1;}return 0;}
输出:通过b[j][i] = a[i][j];这一步实现了转置
进阶:用6个1~20内的随机数按行的顺序生成一个a[2][3]的矩阵,并输出它的转置矩阵
#include #include#includeint main (){int a[2][3];int m,n;printf("随机产生6个1~20以内的随机数:\n\n");srand(time(NULL)); for(m=0;m<2;m++)for(n=0;n<3;n++){a[m][n]=rand()%20+1;printf("%d",a[m][n]);}printf("\n");int b[3][2];int i =0,j;while (i<2){j=0;do{b[j][i] = a[i][j];j =j+ 1; }while(j<3);i =i + 1;}printf ("原矩阵:\n");/*输出原矩阵,即二维数组a的各个元素*/for (i = 0;i<2;i=i+1){for (j= 0;j<3;j=j+1)printf ("%5d", a[i][j] );printf ("\n");/*输出一行数据后,回车到下一行*/}printf ( "转置矩阵:\n");/*输出转置矩阵,即二维数组b的各个元素*/i = 0;while(i<3){j = 0;while(j<2){printf ( "%5d", b[i][j] );j =j+ 1;}printf ("\n");/*输出一行数据后,回车到下一行*/i = i+ 1;}return 0;}
输出:
例2.登记某班三人的数学、英语两门课程的成绩。
分析:此类问题可以通过使用3个一维数组来解决,也可以通过使用1个二维数组来解决。显然,使用二维数组更加方便。
二维数组可定义为3行(代表3个学生)×2列(代表每个学生的2门课);当然也可以定义成2行×3列。本例使用前者定义形式,定义为float su(3][2)。设定第0列代表数学课程的成绩,第1列代表英语课程的成绩。
程序:
#include # define M 3# define N 2void InputScore (float stu[M] [N]); /*输入函数的函数原型*/void OutputScore (float stu[M] [N]); /*输出函数的西数原型*/int main (){float stu [M] [N];float f;scanf ( "%f", &f);/*以上两行代码对程序本身而言并无意义,专为应付 Turbo C的 bug*/InputScore ( stu );/*调用输入函数,输入3个学生的两门课成绩*/OutputScore ( stu);/*调用输出函数,输出3个学生的两门课成绩*/return 0;}void InputScore ( float stu[] [N] ){int i, j;printf ( "输入成绩:\n");for(i=0; i<M; i++){printf ( "no. %d ",i+1);for (j=0;j<N;j++)scanf ( "%f", &stu[i][j]);}return ;}void OutputScore ( float stu[][N]){int i, j;printf ("\n");for (i=0;i<M;i++){ printf ( "Stu no %d:", 1+1); for (j=0;j<N;j++) printf ( "%7.2f", stu[i][j] );printf ("\n");}return;}
输出:
运行上述程序,在输入正式成绩之前,需要先随意给一个数,这是 因为如果在 Turbo C环境中,避免TurboC环境的 bug 。
在其他环境中,可以去除这两行代码,不用在正式执行前给数
例3.使用数组表示Fibonacii 数列的前20项。
Fibonacii数列f(n)的定义为
程序:
#include int main (){int i;int f[20] ={1, 1};/*数列赋初值:前两项为1,其他项为0*/i= 2;while (i<20 ){f[i]=f[i-2]+f[i-1];/*计算其他项*/i=i+1;}for (i=0;i<20;i++)/*输出数列的所有项*/{if (i % 5 == 0)printf("\n");printf ( "%8d", f[i] );}return 0;}
输出:
注释:i%5==0,printf(“\n”);这一步使前二十项按5个一行输出,%8d是为了使输出各列个位数对齐(右对齐)。
例4.简单矩阵查找
从键盘输入25个整数,组成一个5*5的矩阵,编程按照以下要求输出数据:
查找每行中最大的数,然后查找这5个数中最小的数并输出该数(仅输出该数即可);
代码:
#include #include int main() {int a[5][5], b[5];int i, j, min, max;/*输入矩阵a[5][5]*/for (i = 0; i < 5; i++) {for (j = 0; j < 5; j++)scanf("%d", &a[i][j]);}for (i = 0; i < 5; i++) {max = a[i][0];for (j = 0; j max)max = a[i][j];}b[i] = max;}/*找到每一行的最大值*/min = b[0];for (i = 1; i < 5; i++) {if (b[i] < min)min = b[i];}/*找到这些最大值中的最小值*/printf("%d", min);/*输出结果*/return 0;}
输出:
例5.螺旋数阵
设计一个算法,将连续的自然数1、2、3、…、 n*n-1、n*n,按由小到大、由外向里、顺时针反向, 排成一个 n*n 的螺旋形状的方阵。
如图:
问题的关键是第i圈的描述问题。每一圈可以分成上、 右、下、左四个边
程序:
#include void spiral(int n){int arr[n][n];int i, j, k = 1, m=0;while (k <= n * n) /*进行循环生成螺旋矩阵*/{for (i = m; i < n - m; i++) /*行从左向右*/{arr[m][i] = k++;}for (i = m + 1; i = m; i--) /*行从右到左*/{arr[n - m - 1][i] = k++;}for (i = n - m - 2; i > m; i--) /*列从下到上*/{arr[i][m] = k++;}m++;}for (i = 0; i < n; i++) {for (j = 0; j < n; j++) {printf("%3d", arr[i][j]);/*输出螺旋矩阵*/}printf("\n");}}int main(){int n;printf("请输入n的值:");scanf("%d", &n);spiral(n);return 0;}
输出:
例六.将一个一维数组 a[9] 中各元素的值按行的顺序放入二维数组 b[3][3] 中。
若一维数组确定,可以在定义一维数组的同时,对数组各个元素赋初值,然后执行下面程序放入二维数组中;
int b[3][3];int i, j, k = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {b[i][j] = a[k];k++;printf("b[%d][%d]=%d",i,j,b[i][j]);}printf("\n");}
若一维数组随机,可采用下列程序
程序:
#include#include#includeint main(){int a[9];int n;printf("随机产生9个1~100以内的随机数并赋值给a[9]:\n");srand(time(NULL)); for(n=0;n<9;n++){a[n]=rand()%100+1;printf("a[%d]=%d",n,a[n]);}printf("\n");int b[3][3];int i, j, k = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {b[i][j] = a[k];k++;printf("b[%d][%d]=%d",i,j,b[i][j]);}printf("\n");}return 0;}
输出:
注记:
#include
#include
·················· ·················
srand(time(NULL));
················· ···············
a[n]=rand()%100+1;
printf(“a[%d]=%d “,n,a[n]); 这是C语言生成随机数的一种方法,具体相关知识可以自行了解学习。
制作不易,请各位王子公主点赞。