《C程序设计C程序设计 (56).pdf》由会员分享,可在线阅读,更多相关《C程序设计C程序设计 (56).pdf(33页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C C程序设计程序设计Programming in CProgramming in C批量数据的遍历与访问批量数据的遍历与访问1、矩阵运算C C程序设计程序设计程序设计程序设计3 36.2.3 6.2.3 多维数组的引用多维数组的引用(2)矩阵应用二维数组、三维数组经常用于数学的行列式、矩阵、立体几何等问题求解上。4 4【例6.4】求矩阵A的转置矩阵 AT6.2.3 6.2.3 多维数组的引用多维数组的引用141232545636TAA5 56.2.3 6.2.3 多维数组的引用多维数组的引用例6.41#include#include2 intint mainmain()()3 4 intin
2、t A A 2 23 3=1 1,2 2,3 3,4 4,5 5,6 6,ATAT 3 32 2,i i,j j;5 forfor(i i=0 0;i i 2 2;i i+)+)/求矩阵A的转置/求矩阵A的转置6 forfor(j j=0 0;j j 3 3;j j+)+)ATAT j ji i=A A i ij j;7 printfprintf(A=(A=nn););8 forfor(i i=0 0;i i 2 2;i i+)+)/输出矩阵A/输出矩阵A9 forfor(j j=0 0;j j 3 3;j j+)+)printfprintf(%d,(%d,A A i ij j););10 p
3、rintfprintf(nn););11 12 printfprintf(AT=(AT=nn););13 forfor(i i=0 0;i i 3 3;i i+)+)/输出转置矩阵AT/输出转置矩阵AT14 forfor(j j=0 0;j j 2 2;j j+)+)printfprintf(%d,(%d,ATAT i ij j););15 printfprintf(nn););6 66.2.3 6.2.3 多维数组的引用多维数组的引用例6.416 17 returnreturn 0 0;18 7 76.2.3 6.2.3 多维数组的引用多维数组的引用例6.41#include#include
4、2 int main()int main()3 4 int A23=1,2,3,4,5,6,AT32,i,j;int A23=1,2,3,4,5,6,AT32,i,j;5 for(i=0;i2;i+)/求矩阵A的转置for(i=0;i2;i+)/求矩阵A的转置6 for(j=0;j3;j+)ATji=Aij;for(j=0;j3;j+)ATji=Aij;7 printf(A=n);printf(A=n);8 for(i=0;i2;i+)/输出矩阵Afor(i=0;i2;i+)/输出矩阵A9 for(j=0;j3;j+)printf(%d,Aij);for(j=0;j3;j+)printf(%d
5、,Aij);10 printf(n);printf(n);11 12 printf(AT=n);printf(AT=n);13 for(i=0;i3;i+)/输出转置矩阵ATfor(i=0;i3;i+)/输出转置矩阵AT14 for(j=0;j2;j+)printf(%d,ATij);for(j=0;j2;j+)printf(%d,ATij);15 printf(n);printf(n);A=1 2 34 5 6AT=1 42 53 6程序运行屏幕8 8【例6.5】已知A、B矩阵如下,求矩阵乘法AB。6.2.3 6.2.3 多维数组的引用多维数组的引用13321,5423536AB 9 96.
6、2.3 6.2.3 多维数组的引用多维数组的引用例题分析根据矩阵乘法的定义有:这里m nm pp nCAB1(1,2,1,2,)pijikkjkCA Bimjn,2,2,3mnk10106.2.3 6.2.3 多维数组的引用多维数组的引用例6.51#include#include 2 intint mainmain()()3 4 intint A A 2 23 3=3 3,2 2,-,-1 1,2 2,-,-3 3,5 5;5 intint B B 3 32 2=1 1,3 3,-,-5 5,4 4,3 3,6 6;6 intint C C 2 22 2,i i,j j,k k;7 forfo
7、r(i i=0 0;i i 2 2;i i+)+)/求矩阵乘法/求矩阵乘法8 forfor(j j=0 0;j j 2 2;j j+)+)9 C C i ij j=0 0;10 forfor(k k=0 0;k k 3 3;k k+)+)C C i ij j=C C i ij j+A A i ik k*B B k kj j;11 12 printfprintf(C=(C=nn););13 forfor(i i=0 0;i i 2 2;i i+)+)/输出C矩阵/输出C矩阵14 forfor(j j=0 0;j j 2 2;j j+)+)printfprintf(%3d,(%3d,C C i i
8、j j););15 printfprintf(nn););11116.2.3 6.2.3 多维数组的引用多维数组的引用例6.516 17 returnreturn 0 0;18 12126.2.3 6.2.3 多维数组的引用多维数组的引用例6.51#include#include 2 int main()int main()3 4 int A23=3,2,-1,2,-3,5;int A23=3,2,-1,2,-3,5;5 int B32=1,3,-5,4,3,6;int B32=1,3,-5,4,3,6;6 int C22,i,j,k;int C22,i,j,k;7 for(i=0;i2;i+
9、)/求矩阵乘法for(i=0;i2;i+)/求矩阵乘法8 for(j=0;j2;j+)for(j=0;j2;j+)9 Cij=0;Cij=0;10 for(k=0;k3;k+)Cij=Cij+Aik*Bkj;for(k=0;k3;k+)Cij=Cij+Aik*Bkj;11 12 printf(C=n);printf(C=n);13 for(i=0;i2;i+)/输出C矩阵for(i=0;i2;i+)/输出C矩阵14 for(j=0;j2;j+)printf(%3d,Cij);for(j=0;j2,n阶魔方阵都存在。目前填写魔方阵的方法,把魔方阵分成了三类:(1)奇数(n=2K+1)阶魔方阵;(
10、2)双偶(n=4K)阶魔方阵;(3)单偶(n=4K+2)阶魔方阵;每类又有各种各样的填写方法。16166.2.3 6.2.3 多维数组的引用多维数组的引用例题分析奇数(n=2K+1)阶魔方阵的经典填法是罗伯特法。步骤为:(a)把1(或最小的数)放在第一行正中;a17176.2.3 6.2.3 多维数组的引用多维数组的引用例题分析(b)每一个数放在前一个数的右上格;(c)如果这个数所要放的格已经超出了顶行则把它放在底行,且仍然要放在右一列;18186.2.3 6.2.3 多维数组的引用多维数组的引用例题分析(d)如果这个数所要放的格已经超出了最右列则把它放在最左列,且仍然要放在上一行;19196
11、.2.3 6.2.3 多维数组的引用多维数组的引用例题分析(e)如果这个数所要放的格已经有数填入,则把它放在前一个数的下一行同一列的格内;20206.2.3 6.2.3 多维数组的引用多维数组的引用例题分析(b)每一个数放在前一个数的右上格;21216.2.3 6.2.3 多维数组的引用多维数组的引用例题分析(f)如果这个数所要放的格已经超出了顶行且超出了最右列,则把它放在前一个数的下一行同一列的格内。22226.2.3 6.2.3 多维数组的引用多维数组的引用例题分析这种写法总是先向“右上”的方向,像是在爬楼梯,故也称为楼梯法。23236.2.3 6.2.3 多维数组的引用多维数组的引用例题
12、分析奇数阶魔方阵的罗伯特法。24246.2.3 6.2.3 多维数组的引用多维数组的引用例6.551#include#include 2#define N 100#define N 100/定义足够大的数组/定义足够大的数组3 intint mainmain()()4 /求解2k+1阶魔方阵(奇数阶幻方)/求解2k+1阶魔方阵(奇数阶幻方)5 intint MAMA N NN N=0 0;6 intint i i,j j,m m,n n,L L,S S;7 intint x x,y y,oxox,oyoy;8 scanfscanf(%d,&(%d,&n n););/输入n阶(n=3,且为奇数)
13、/输入n阶(n=3,且为奇数)9 ifif(n n=3 3&n n N N&n n%2 2=1 1)/超过13列显示不下/超过13列显示不下10 m m=0 0;/从1开始填写n阶魔方阵/从1开始填写n阶魔方阵11 L L=m m+n n*n n;12 x x=n n/2 2;13 oxox=oyoy=y y=0 0;14 forfor(i i=m m+1 1;i i=L L;i i+)+)15 MAMA oyoy+y yoxox+x x=i i;25256.2.3 6.2.3 多维数组的引用多维数组的引用例6.551#include#include 2#define N 100#define
14、 N 100/定义足够大的数组/定义足够大的数组3 intint mainmain()()4 /求解2k+1阶魔方阵(奇数阶幻方)/求解2k+1阶魔方阵(奇数阶幻方)5 intint MAMA N NN N=0 0;6 intint i i,j j,m m,n n,L L,S S;7 intint x x,y y,oxox,oyoy;8 scanfscanf(%d,&(%d,&n n););/输入n阶(n=3,且为奇数)/输入n阶(n=3,且为奇数)9 ifif(n n=3 3&n n N N&n n%2 2=1 1)/超过13列显示不下/超过13列显示不下10 m m=0 0;/从1开始填写
15、n阶魔方阵/从1开始填写n阶魔方阵11 L L=m m+n n*n n;12 x x=n n/2 2;13 oxox=oyoy=y y=0 0;14 forfor(i i=m m+1 1;i i=L L;i i+)+)15 MAMA oyoy+y yoxox+x x=i i;26266.2.3 6.2.3 多维数组的引用多维数组的引用例6.551#include#include 2#define N 100#define N 100/定义足够大的数组/定义足够大的数组3 intint mainmain()()4 /求解2k+1阶魔方阵(奇数阶幻方)/求解2k+1阶魔方阵(奇数阶幻方)5 int
16、int MAMA N NN N=0 0;6 intint i i,j j,m m,n n,L L,S S;7 intint x x,y y,oxox,oyoy;8 scanfscanf(%d,&(%d,&n n););/输入n阶(n=3,且为奇数)/输入n阶(n=3,且为奇数)9 ifif(n n=3 3&n n N N&n n%2 2=1 1)/超过13列显示不下/超过13列显示不下10 m m=0 0;/从1开始填写n阶魔方阵/从1开始填写n阶魔方阵11 L L=m m+n n*n n;12 x x=n n/2 2;13 oxox=oyoy=y y=0 0;14 forfor(i i=m
17、m+1 1;i i=L L;i i+)+)15 MAMA oyoy+y yoxox+x x=i i;27276.2.3 6.2.3 多维数组的引用多维数组的引用例6.5516 ifif(i i%n n=0 0)y y+;+;17 elseelse x x+,+,y y-;-;/Hourse法/Hourse法18 x x=(=(x x%n n+n n)%)%n n;19 y y=(=(y y%n n+n n)%)%n n;20 21 forfor(i i=0 0;i i n n;i i+)+)/输出魔方阵/输出魔方阵22 S S=0 0;/S累计一行之和/S累计一行之和23 printfprin
18、tf();();24 forfor(j j=0 0;j j n n;S S=S S+MAMA i ij j,j j+)+)25 printfprintf(%4d,(%4d,MAMA i ij j););26 printfprintf(=%4d(=%4dnn,S S););/输出一行之和/输出一行之和27 28 printfprintf(=);(=);29 forfor(j j=0 0;j j n n;j j+)+)/输出魔方阵列之和/输出魔方阵列之和30 S S=0 0;28286.2.3 6.2.3 多维数组的引用多维数组的引用例6.5516 ifif(i i%n n=0 0)y y+;+;
19、17 elseelse x x+,+,y y-;-;/Hourse法/Hourse法18 x x=(=(x x%n n+n n)%)%n n;19 y y=(=(y y%n n+n n)%)%n n;20 21 forfor(i i=0 0;i i n n;i i+)+)/输出魔方阵/输出魔方阵22 S S=0 0;/S累计一行之和/S累计一行之和23 printfprintf();();24 forfor(j j=0 0;j j n n;S S=S S+MAMA i ij j,j j+)+)25 printfprintf(%4d,(%4d,MAMA i ij j););26 printfpr
20、intf(=%4d(=%4dnn,S S););/输出一行之和/输出一行之和27 28 printfprintf(=);(=);29 forfor(j j=0 0;j j n n;j j+)+)/输出魔方阵列之和/输出魔方阵列之和30 S S=0 0;29296.2.3 6.2.3 多维数组的引用多维数组的引用例6.5516 ifif(i i%n n=0 0)y y+;+;17 elseelse x x+,+,y y-;-;/Hourse法/Hourse法18 x x=(=(x x%n n+n n)%)%n n;19 y y=(=(y y%n n+n n)%)%n n;20 21 forfor
21、(i i=0 0;i i n n;i i+)+)/输出魔方阵/输出魔方阵22 S S=0 0;/S累计一行之和/S累计一行之和23 printfprintf();();24 forfor(j j=0 0;j j n n;S S=S S+MAMA i ij j,j j+)+)25 printfprintf(%4d,(%4d,MAMA i ij j););26 printfprintf(=%4d(=%4dnn,S S););/输出一行之和/输出一行之和27 28 printfprintf(=);(=);29 forfor(j j=0 0;j j n n;j j+)+)/输出魔方阵列之和/输出魔方阵
22、列之和30 S S=0 0;30306.2.3 6.2.3 多维数组的引用多维数组的引用例6.5531 forfor(i i=0 0;i i n n;i i+)+)S S=S S+MAMA i ij j;32 printfprintf(%4d,(%4d,S S););/输出一列之和/输出一列之和33 34 L L=S S=0 0;35 forfor(i i=0 0;i i n n;i i+)+)S S=S S+MAMA i ii i,L L=L L+MAMA i in n-1 1-i i;36 printfprintf(=%4d=%4d(=%4d=%4dnn,S S,L L););/输出对角线
23、与反对角线之和/输出对角线与反对角线之和37 38 elseelse printfprintf(error input:n=2k+1(error input:n=2k+1nn););39 returnreturn 0 0;40 31316.2.3 6.2.3 多维数组的引用多维数组的引用例6.5531 forfor(i i=0 0;i i n n;i i+)+)S S=S S+MAMA i ij j;32 printfprintf(%4d,(%4d,S S););/输出一列之和/输出一列之和33 34 L L=S S=0 0;35 forfor(i i=0 0;i i n n;i i+)+)S
24、 S=S S+MAMA i ii i,L L=L L+MAMA i in n-1 1-i i;36 printfprintf(=%4d=%4d(=%4d=%4dnn,S S,L L););/输出对角线与反对角线之和/输出对角线与反对角线之和37 38 elseelse printfprintf(error input:n=2k+1(error input:n=2k+1nn););39 returnreturn 0 0;40 若输入的n值不满足奇数(n=2K+1)阶魔方阵,提示输入错误信息。32326.2.3 6.2.3 多维数组的引用多维数组的引用例6.551#include#include
25、2#define N 100/定义足够大的数组#define N 100/定义足够大的数组3 int main()int main()4 /求解2k+1阶魔方阵(奇数阶幻方)/求解2k+1阶魔方阵(奇数阶幻方)5 int MANN=0;int MANN=0;6 int i,j,m,n,L,S;int i,j,m,n,L,S;7 int x,y,ox,oy;int x,y,ox,oy;8 scanf(%d,&n);/输入n阶(n=3,且为奇数)scanf(%d,&n);/输入n阶(n=3,且为奇数)9 if(n=3&n=3&nN&n%2=1)/超过13列显示不下10 m=0;/从1开始填写n阶魔方阵m=0;/从1开始填写n阶魔方阵11 L=m+n*n;L=m+n*n;12 x=n/2;x=n/2;13 ox=oy=y=0;ox=oy=y=0;14 for(i=m+1;i=L;i+)for(i=m+1;i=L;i+)15 MAoy+yox+x=i;MAoy+yox+x=i;17 24 1 8 15 =6523 5 7 14 16 =654 6 13 20 22 =6510 12 19 21 3 =6511 18 25 2 9 =65=65 65656565=65=655程序运行屏幕结束结束
限制150内