投入产出问题(矩阵求差、矩阵与数乘)
二、设计思路
⒈ 总体设计
1)程序的功能:利用数组操作,根据总投入=总产出的原则计算投入产出问题。
2)系统总体结构:建立一个工作空间bai.dsw,设计了十个.cpp文件:如orgna.cpp:
算各部门中间产品矩阵a;orgn.cpp:计算总投入与固定资产折旧的差;orgnz.cpp:计算各部门新创造价值;orgny.cpp:计算各部门最终产品;orgny2.cpp:计算各部门最终产品y的转置矩阵 ;sum1.cpp:计算a矩阵各列和 ;sum2.cpp:对a转置矩阵各列求和 ;cin.cpp:输入; cout.cpp输出;main.cpp主函数和一个头文件 leader.h:进行函数原型声明。
⒉ 各功能模块的设计:
orgna.cpp利用矩阵数乘实现;orgn.cpp和orgnz.cpp利用矩阵求差实现;sum1.cpp对矩阵各列求和;sum2.cpp对矩阵先进行转置再对各列求和;input.cpp直接输入数据;out.cpp通过函数进行输出;
⒊ 设计中的主要困难及解决方案
在这部分论述设计中遇到的主要困难及解决方案:
困难:建立各个不同的源程序文件和头文件以及对其进行连接运行;
解决方案:先建立一个工作空间,再在这个空间中建立各个源程序文件即.cpp和一个头文件.h,将各个函数分成不同的模块分别加到不同的.cpp中,将函数声明加到头文件中,以便使其能运行连接。
⒋ 设计的程序最终完成的功能
1)编制的程序能完成的功能:通过输入的数据可以计算并输出各部门中间产品矩阵及其转置矩阵,各部门新创造价值,和各部门最终产品及其矩阵的转置矩阵,从而可以观察总投入和总产出是否平衡,解决投入产出问题。
2)准备的测试数据及运行结果:
任务中提供数据运行结果:
请输入直接消耗系数矩阵b0 0.15 0.55 0 0.25 0.05 0.1 0.25 0.15 0 0.05 0.35 0.1 0.1
5 0.15 0.1
请输入总投入矩阵x360 240 180 300
请输入固定资产折旧d5 15 10 20
225 45 12 171 ----y的转置矩阵---
---各部门最终产品y---
225
45
12
171
-----各部门中间产品(aij)---
0 36 99 0
90 12 18 75
54 0 9 105
36 36 27 30
----各部门新创造价值z---
175 141 17 70
----a的转置矩阵---
0 36 99 0
90 12 18 75
54 0 9 105
36 36 27 30
Press any key to continue
三、程序清单
该程序包含orgna.cpp,orgn.cpp,orgnz.cpp,orgny.cpp,orgny2.cpp,sum1.cpp,sum2.cpp,cin.cpp,cout.cpp,main.cpp 和leader.h十一个文件。
⒈ main.cpp文件清单
#include #include "leader.h" void main() { const int N=4; double a[N][N],b[N][N],x[N],d[N],A1[N],a3[N],a2[N][N],A2[N],y[N],z[N]; input(b,x,d); //各部门新创造价值 z[N] ;各部门中间产品 a [N][N] orgna(a,b,x); // 固定资产折旧d[N]; 直接消耗系数矩阵b[N][N]; sum1(a,A1); //总投入矩阵x[N];各部门最终产品y[N]; orgn(a3,x,d); //总投入与固定资产折旧的差 a3[N]; orgnz(A1,a3,z); //各部门中间产品 a [N][N]的转置矩阵 a2[N][N]; sum2(a2,a,A2); //各部门中间产品 a [N][N]各列和 A1[N]; orgny(y,x,A2); //各部门中间产品 a[N][N]的转置矩阵 a2[N][N]的各列和A2[N]; orgny2(y); cout(a,z,y); } ⒉ orgn.cpp文件清单 const int N=4; void orgn(double a3[N],double x[N],double d[N]) { for(int i=0;i } ⒊ orgnz.cpp文件清单 const int N=4; void orgnz(double A1[N],double a3[N],double z[N]) { for(int i=0;i } ⒋ orgny.cpp文件清单 const int N=4; void orgny(double y[N],double x[N],double A2[N]) { for(int i=0;i } ⒌ orgny2.cpp文件清单 #include const int N=4; void orgny2(double y[N]) { for(int i=0;i ⒍ sum1.cpp文件清单 const int N=4; void sum1(double a[N][N],double A1[N]) { for(int i=0;i A1[i]=0; for(int j=0;j } } ⒎ sum2.cpp文件清单 const int N=4; void sum2(double a2[N][N],double a[N][N],double A2[N]) { for(int i=0;i A2[i]=0; for(int j=0;j a2[j][i]=a[i][j]; //对矩阵a[N][N]进行转置 A2[i]+=a2[j][i]; //对转置矩阵a2[N][N]各列求和 } } } ⒏ input.cpp文件清单 #include const int N=4; void input(double b[N][N],double x[N],double d[N]) { cout<<"请输入直接消耗系数矩阵b"; for(int i=0;i cout<<"请输入总投入矩阵x"; for(i=0;i cout<<"请输入固定资产折旧d"; for(i=0;i } ⒐ out.cpp文件清单 #include const int N=4; void out(double a[N][N],double z[N],double y[N]) { cout<<"----y的转置矩阵---"< for(int j=0;j for(int j=0;j cout<<"----各部门新创造价值z---"< } } ⒑ orgna.cpp文件清单 const int N=4; void orgna(double a[N][N],double b[N][N],double x[N]) { for(int i=0;i } ⒒ leader.h文件清单 const int N=4; void input(double b[N][N],double x[N],double d[N]); void sum2(double a2[N][N],double a[N][N],double A2[N]); void sum1(double a[N][N],double A1[N]); void orgnz(double A1[N],double a3[N],double z[N]); void orgny2(double y[N]); void orgny(double y[N],double x[N],double A2[N]); void orgna(double a[N][N],double b[N][N],double x[N]); void orgn(double a3[N],double x[N],double d[N]); void out(double a[N][N],double z[N],double y[N]); 四、对该设计题目提出的方案 1、对自己完成程序进行自我评价: 基本实现使用模块化设计和C++的思想来完成程序设计,并且通过矩阵求和、转置和求列和的操作解决了投入产出的实际问题.进行设计时总是有操作错误,运行不出正确的结果,导致效率很低,编写的程序不是很完美,但还是坚持下去了。经过一周的努力,不仅将基本要求完成,也基本完成了创新要求,顺利完成任务,使我增加了对C++的信心,有了更大的提高。 2、对课题提出更完善的方案 应设法实现同种函数多次调用。对所有调用函数分别建立不同的.cpp文件,对主函数和头文件(即.h文件)分别建立不同的文件,以便使程序简洁明了,我们更好理解程序的过程。 五、收获及心得体会 1、在本次课程设计中,我通过对课本的学习、上网查资料、问同学等多种途径,解决了这次的问题,顺利完成了任务,提高了自学能力,增加了我对C++的兴趣,对我以后的学习有很大的帮助。 2、 收获和心得体会 通过本次课程设计,我学会了如何建立不同的.cpp文件和头文件,并且还学会如何把它们连接运行,达到自己的输出要求,对定义数组和调用函数的知识更了解,清楚和明白,编程过程中也锻炼了自己的耐心和增强了做事的信心,使我懂得了做事情要有耐心,虽然进行了很长时间,但我感觉受益匪浅。本次计算机软件课程设计使我更加系统地理解和掌握了C++语言的函数间参数传递方法、数组等的运用,学会了函数的调用、运行,一、二维数组的操作,提升了我归纳、总结、创新等能力。 日期: 2010年 6 月 28日 未进行创新的基本程序 #include const int N=4; void orgna(double a[N][N],double b[N][N],double x[N]); void sum1(double a[N][N],double A1[N]); void orgn(double a3[N],double x[N],double d[N]); void orgnz(double A1[N],double x[N],double d[N]); void sum2(double a2[N][N],double a[N][N],double A2[N]); void orgny(double y[N],double x[N],double A2[N]); void orgny2(double y[N]); void main() { 请输入直接消耗系数矩阵b"; 请输入总投入矩阵x"; 请输入固定资产折旧d"; 各部门中间产品(aij)---"< 各部门新创造价值z---"< cout<<"----a的转置矩阵---"< cout<<"---各部门最终产品y---"< 的转置矩阵---"< } void orgna(double a[N][N],double b[N][N],double x[N])//用于求中间产品矩阵a[i,j]=b[i,j]*x[j] { } void sum1(double a[N][N],double A1[N])//用于求A1=sum(A), 即A 矩阵各列的和 { } void orgn(double a3[N],double x[N],double d[N]) { } void orgnz(double A1[N],double a3[N],double z[N]) { } void sum2(double a2[N][N],double a[N][N],double A2[N])//用于求A2=sum(A') { { } void orgny(double y[N],double x[N],double A2[N])//用于计算Y1=X-A2 { } void orgny2(double y[N]) { } 进行创新后的程序中各个文件总括: #include #include "leader.h" void main() { const int N=4; double a[N][N],b[N][N],x[N],d[N],A1[N],a3[N],a2[N][N],A2[N],y[N],z[N]; input(b,x,d); //各部门新创造价值 z[N] ;各部门中间产品 a [N][N] orgna(a,b,x); // 固定资产折旧d[N]; 直接消耗系数矩阵b[N][N]; sum1(a,A1); //总投入矩阵x[N];各部门最终产品y[N]; orgn(a3,x,d); //总投入与固定资产折旧的差 a3[N]; orgnz(A1,a3,z); //各部门中间产品 a [N][N]的转置矩阵 a2[N][N]; sum2(a2,a,A2); //各部门中间产品 a [N][N]各列和 A1[N]; orgny(y,x,A2); //各部门中间产品 a[N][N]的转置矩阵 a2[N][N]的各列和A2[N]; orgny2(y); out(a,z,y); } const int N=4; void input(double b[N][N],double x[N],double d[N]); void sum2(double a2[N][N],double a[N][N],double A2[N]); void sum1(double a[N][N],double A1[N]); void orgnz(double A1[N],double a3[N],double z[N]); void orgny2(double y[N]); void orgny(double y[N],double x[N],double A2[N]); void orgna(double a[N][N],double b[N][N],double x[N]); void orgn(double a3[N],double x[N],double d[N]); void out(double a[N][N],double z[N],double y[N]); #include const int N=4; void input(double b[N][N],double x[N],double d[N]) { cout<<"请输入直接消耗系数矩阵b"; for(int i=0;i cout<<"请输入总投入矩阵x"; for(i=0;i cout<<"请输入固定资产折旧d"; for(i=0;i } const int N=4; void orgn(double a3[N],double x[N],double d[N])//用于计算Y1=X-A2 { for(int i=0;i } const int N=4; void orgna(double a[N][N],double b[N][N],double x[N]) { for(int i=0;i } const int N=4; void orgny(double y[N],double x[N],double A2[N]) { for(int i=0;i } #include const int N=4; void orgny2(double y[N]) { for(int i=0;i const int N=4; void orgnz(double A1[N],double a3[N],double z[N]) { for(int i=0;i } const int N=4; void sum1(double a[N][N],double A1[N])//用于求A1=sum(A), 即A 矩阵各列的和 { for(int i=0;i A1[i]=0; for(int j=0;j } } const int N=4; void sum2(double a2[N][N],double a[N][N],double A2[N])//用于求A2=sum(A') { for(int i=0;i A2[i]=0; for(int j=0;j a2[j][i]=a[i][j]; A2[i]+=a2[j][i]; } } } #include const int N=4; void out(double a[N][N],double z[N],double y[N]) { cout<<"----y的转置矩阵---"< cout<<"---各部门最终产品y---"< for(int j=0;j cout<<"----各部门新创造价值z---"< for(int j=0;j }