矩阵问题.docx
- 文档编号:2069089
- 上传时间:2022-10-26
- 格式:DOCX
- 页数:18
- 大小:35.79KB
矩阵问题.docx
《矩阵问题.docx》由会员分享,可在线阅读,更多相关《矩阵问题.docx(18页珍藏版)》请在冰豆网上搜索。
矩阵问题
二、矩阵问题
1.318.121.125.129.133.334.343.1
48.158.359.360.366.278.379.380.3
82.282.383.184.185.187.389.190.1
90.291.1
例题讲解:
18.1
下列给定程序中,函数fun的功能是:
有N×N矩阵,根据给定的m(m<=N)值,将每行元素中的值均向右移动m个位置,左位置为0。
例如,N=3,m=2,有下列矩阵
1 2 3
4 5 6
7 8 9
程序执行结果为
0 0 1
0 0 4
0 0 7
请在下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。
注意:
部分源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
#defineN4
voidfun(int(*t)[N],intm)
{inti,j;
/**********found**********/
for(i=0;i {for(j=N-1-m;j>=0;j--) /**********found**********/ t[i][j+___2___]=t[i][j]; /**********found**********/ for(j=0;j<___3___;j++) t[i][j]=0; } } main() {intt[][N]={21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10},i,j,m; printf("\nTheoriginalarray: \n"); for(i=0;i {for(j=0;j printf("%2d",t[i][j]); printf("\n"); } printf("Inputm(m<=%d): ",N);scanf("%d",&m); fun(t,m); printf("\nTheresultis: \n"); for(i=0;i {for(j=0;j printf("%2d",t[i][j]); printf("\n"); } } 【参考答案】 (1)i++ (2)m (3)m 【考点分析】 本题考查: for循环语句;数组元素的引用。 【解题思路】 填空1: 循环语句中,循环变量i增量为1。 填空2: 将每行元素中的值均右移m个位置,所以数组元素的下标是t[i][j+m]。 填空3: 此for循环语句实现左边元素置0操作,所以j的取值范围是0到m。 29.1 下列给定程序中,函数fun的功能是: 有N×N矩阵,以主对角线为对称线,对称元素相加并将结果存放在左下三角元素中,右上三角元素置为0。 例如,若N=3,有下列矩阵: 1 2 3 4 5 6 7 8 9 计算后结果为 1 0 0 6 5 0 10 14 9 请在程序的下画线处填入正确的内容并把下画线删除。 使程序得出正确的结果。 注意: 部分源程序在文件BLANK1.C中。 不得增行或删行,也不得改程序的结构! #include #defineN4 /**********found**********/ voidfun(int(*t)___1___) {inti,j; for(i=1;i {for(j=0;j { /**********found**********/ ___2___=t[i][j]+t[j][i]; /**********found**********/ ___3___=0; } } } main() {intt[][N]={21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10},i,j; printf("\nTheoriginalarray: \n"); for(i=0;i {for(j=0;j printf("\n"); } fun(t); printf("\nTheresultis: \n"); for(i=0;i {for(j=0;j printf("\n"); } } 【参考答案】 (1)[N] (2)t[i][j] (3)t[j][i] 【考点分析】 本题考查: 有参函数定义,需要根据题目要求和给定程序确定函数参数。 N×N矩阵中如何表示左下角和右上角元素。 【解题思路】 填空1: 主函数中调用函数的参数为二维数组,所以此处形参应定义为指针数组。 填空2: 根据题意可知,对称元素相加的和存放在左下三角元素中,那么应填入的是t[i][j]。 填空3: 右上三角元素置0,应填入t[j][i]。 33.3 编写函数fun,其功能是: 实现B=A+A',即将矩阵A加上A的转置,存放在矩阵B中。 计算结果在main函数中输出。 例如,输入下面的矩阵: 其转置矩阵为: 程序输出: 注意: 部分源程序在文件PROG1.C中。 请勿请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 #include voidfun(inta[3][3],intb[3][3]) { } main()/*主程序*/ {inta[3][3]={{1,2,3},{4,5,6},{7,8,9}},t[3][3]; inti,j; voidNONO(); fun(a,t); for(i=0;i<3;i++){ for(j=0;j<3;j++) printf("%7d",t[i][j]); printf("\n"); } NONO(); } voidNONO() {/*本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。 */ inti,j,k,a[3][3],t[3][3]; FILE*rf,*wf; rf=fopen("in.dat","r"); wf=fopen("out.dat","w"); for(k=0;k<5;k++){ for(i=0;i<3;i++) fscanf(rf,"%d%d%d",&a[i][0],&a[i][1],&a[i][2]); fun(a,t); for(i=0;i<3;i++){ for(j=0;j<3;j++)fprintf(wf,"%7d",t[i][j]); fprintf(wf,"\n"); } } fclose(rf); fclose(wf); } oidfun(inta[3][3],intb[3][3]) { inti,j; for(i=0;i<3;i++) for(j=0;j<3;j++) b[i][j]=a[i][j]+a[j][i];/*把矩阵a加上a的转置,存放在矩阵b中*/ } 【考点分析】 本题考查: 矩阵的操作,如何表示矩阵及其转置矩阵的各个元素。 【解题思路】 行列数相等的二维数组的转置就是行列互换,即转置后的第i行第j列正好对应原矩阵的第j行第i列。 本题使用双层循环实现矩阵的转置,并将计算结果存入矩阵B中,外层循环控制矩阵的行下标,内层循环控制矩阵的列下标。 【解题宝典】 若要将矩阵a转置后还存入a中,可用程序: inti,j,t; for(i=0;i for(j=i;j {t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;} 注意第2个循环的初值。 若要将矩阵a转置后存入c中: inti,j; for(i=0;i for(j=0;j c[i][j]=a[j][i]; 34.3 请编写函数fun,该函数的功能是: 将M行N列的二维数组中的数据,按列的顺序依次放到一维数组中。 一维数组中数据的个数存放在形参n所指的存储单元中。 例如,若二维数组中的数据为 33333333 44444444 55555555 则一维数组中的内容应是: 334455334455334455334455 注意: 部分源程序在文件PROG1.C中。 请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 #include voidfun(int(*s)[10],int*b,int*n,intmm,intnn) { } voidmain() { intw[10][10]={{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j; inta[100]={0},n=0; FILE*out; printf("Thematrix: \n"); for(i=0;i<3;i++) {for(j=0;j<4;j++) printf("%3d",w[i][j]); printf("\n"); } fun(w,a,&n,3,4); /******************************/ out=fopen("out.dat","w"); printf("TheAarray: \n"); for(i=0;i {printf("%3d",a[i]); fprintf(out,"%d",a[i]); } printf("\n\n"); fclose(out); /******************************/ } 【参考答案】 voidfun(int(*s)[10],int*b,int*n,intmm,intnn) { inti,j; for(j=0;j for(i=0;i { b[*n]=*(*(s+i)+j); *n=*n+1;/*通过指针返回元素个数*/ } } 【解题思路】 题目要求实现将二维数组元素存入一维数组,需使用for循环语句来控制二维数组元素的下标,同时使用指针变量配合操作。 可以用两个循环来处理问题,由于是按列的顺序取出,所以第1个循环用于控制列下标,第2个循环用于控制行下标。 58.3 程序定义了N×N的二维数组,并在主函数中自动赋值。 请编写函数fun(inta[][N],intn),该函数的功能是: 使数组左下半三角元素中的值乘以n。 例如,若n的值为3,a数组中的值为: 则返回主程序后a
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 矩阵 问题