C语言课程设计论文矩阵乘法_第1页
C语言课程设计论文矩阵乘法_第2页
C语言课程设计论文矩阵乘法_第3页
C语言课程设计论文矩阵乘法_第4页
C语言课程设计论文矩阵乘法_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、学 号: 课 程 设 计题 目矩阵乘法教 学 院计算机学院专 业09计算机科学与技术班 级09计科(1)班姓 名指导教师 2010年12月25日课程设计任务书 (20102011学年第一学期)学生姓名: 专业班级:09计算机科学与技术(1)班 指导教师: 工作部门: 计算机学院 一、课程设计题目矩阵乘法二、课程设计内容1矩阵的存储2矩阵的乘法3矩阵的的加法与减法三、进度安排1分析问题,给出数学模型,选择数据结构.2设计算法,给出算法描述3给出源程序清单4. 编辑、编译、调试源程序5. 撰写课程设计报告四、基本要求1用c语言实现矩阵的运算.2利用链表实现矩阵运算的存储.3该程序具有加法、减法、乘

2、法基本运算功能.4. 程序的各个功能模块要求用函数的形式实现.5. 完成设计任务并书写课程设计报告。 教研室主任签名: 年 月 日目 录一、 作品及人员信息3二、 概述3三、 设计目的3四、 运行/开发环境 3五、 流程图4六、 功能介绍5七、 算法分析5八、测试过程中所用过的数据及说明9九、使用价值及优点11十、总结11附录(一):参考文献 11附录(二):成绩评定表12 一、作品及人员信息1、开发项目的名称: 矩阵乘法2、本项目的提出者: 祈文青3、本项目的开发者: 张祥、张宁、黄小强、龚江华二、 概述 数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁只有进行实

3、际操作,将理论应用于实际中,才能确实掌握书中的知识点。通过课程设计,不仅可以加深学生对数据结构基本概念的了解,巩固学习成果,还能够提高实动手力。为学生后继课程的学习打下良好的基础。三、设计目的1. 使学生能够较全面地巩固和应用课堂中所学的的基本理论和程序设计方法,能够较熟练地完成程序的设计和调试。2. 培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。3. 培养了我们的攻克难关的斗志以及团队合作精神,在一个团队里,每

4、个成员都不同程度地存在着优缺点,成员之间应该积极去认真总结团队其他成员的特长和优点,并向他人学习,扬长避短,不断提高自己的综合能力。让我们携手牢记“信任与尊重、团结与友爱、合作与创新”的团队精神。4. 对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。四、运行/开发 环境1、运行环境:windows xp及其以上版本2、 开发环境: vc+6.0五、流程图能否加减乘功能选择定义字符串型辅助变量在转化为整型变量 2相减1相加3相乘4转置释放矩阵内存 定义字符串型辅助变量在转化为整型变量 释放矩阵内存 开始输入矩阵a、b输出矩阵c输入矩阵a输出矩阵

5、c请按任意键继续 请按任意键继续 能否加减乘 否否 能 能 0结束六、功能介绍1矩阵的加法2矩阵的的减法3.矩阵的的乘法4.矩阵的的转置七、算法分析1. 用.h文件的调用代码#include"void menu.h"#include"void jia.h"#include"void jian.h"#include"void cheng.h"#include"void zhuanzhi.h" 2. 控制界面的前景背景system("color 0a"); 3. (1)设置符串型

6、辅助变量,再将字符串型转换为整型 (2)判断是否为数字 (1)和(2)增强程序的健壮性(1)char c110; /辅助变量int c=0;cin>>c1;j=strlen(c1); for(i=j-1,j=0;i>=0;i-,j+)c=c+(int)(c1i-'0')*pow(10,j) ;(2)if( strcmp(c1,"0")>=0&&strcmp(c1,"5")<0) 4. 使程序暂停和清屏功能cout<<"tttt"system("paus

7、e"); system("cls"); 5. 判断能否相加以及行列是否为数字 if(m=f&&g=n&&strcmp(m1,"0")>0&&strcmp(m1,"9")<=0&& strcmp(n1,"0")>0 && strcmp(n1,"9")<=0) 6. 定义矩阵 double *a=null;(释放后再赋值为null在一些进行有效性判断的地方用a=null来判断指针是否为空

8、指针) a=(double*)malloc(m*sizeof(double*);(这句是动态定义二维数组的行数新的标准ansi c规定malloc函数的返回值类型为void型,所以需要强制转化为double型的指针后才能赋给a) for(i=0;i<m;i+)ai=(double*)malloc(g*sizeof(double); (这句是动态定义二维数组的列数) 7. 从 .txt文件输入数据file *fpa;printf("请输入矩阵a的元素nnn");system("input-a.txt"); fpa=fopen("input-

9、a.txt","r"); /读文件input-a.txtif(fpa=null)printf("文件写打开失败");exit (0);for(i=0;i<m;i+) for(j=0;j<g;j+)fscanf(fpa,"%lf",&aij); /从文件读取数据fclose(fpa); 8. 屏幕输出,用%g格式,可以输出小数for(i=0;i<m;i+)for(j=0;j<g;j+)printf("%gt",aij); /实数格式printf("n");

10、 9. 矩阵加法,减法类似。 for(i=0;i<m;i+) for(j=0;j<g;j+)resultij=aij+bij; 10.初始化为0,矩阵乘法for(i=0;i<m;i+)for(j=0;j<n;j+)resultij=0;/*初始化为0*/for(i=0;i<m;i+)for(j=0;j<n;j+)for(k=0;k<g;k+)resultij+=aik*bkj; 11. 矩阵的转置 for(i=0;i<g;i+) for(j=0;j<m;j+)resultij=aji; 12. 文件输出( .txt)file *fpc; f

11、pc=fopen("output-c.txt","wb");if(fpc=null) printf("文件打开失败");exit(0);for(i=0;i<m;i+)for(j=0;j<n;j+)fprintf(fpc,"%gt",resultij);fprintf(fpc,"rn" );fclose(fpc); 13. 打开 .txt文件 system("output-c.txt"); 14. 内存空间的释放 for(i=0;i<m;i+)/*释放之前分配

12、的空间是一个好习惯*/free(ai); ai=null;free(resulti);resulti=null; /*将之前分配的内存空间释放后,把指针置0是一个好的习惯*/free(a);a=null;free(result);result=null;for(i=0;i<f;i+)free(bi);bi=null;free(b);b=null; 16. 菜单函数void menu()cout<<""<<endl;cout<<endl;cout<<"t=矩阵的简单运算="<<endl;co

13、ut<<"tttttttt "<<endl;cout<<"tttt 1 矩阵加法tt "<<endl;cout<<"tttt 2 矩阵减法ttt "<<endl;cout<<"tttt 3 矩阵乘法ttt "<<endl;cout<<"tttt 4 矩阵转置ttt "<<endl;cout<<"tttt 0 退出ttt "<<endl

14、;cout<<"tttttttt "<<endl;cout<<"t=矩阵的简单运算="<<endl;cout<<endl;cout<<"ttt 请选择: " 8、 测试过程中所用过的数据及说明 1.菜单 : 2. 容错及暂停: 3. 矩阵从文件输入:4. 矩阵屏幕输出及文件输出:9、 使用价值及优点 可以当作简单的矩阵计算器使用,具有一定的容错性10、 总结 课程设计结束了,带给我很多的收获。c程序设计、数据结构已经学完了,有许多知识都存在似懂非懂的现象,这种现象

15、通过实际的上机操作,实际应用,已经减少了许多。对这些知识也有了更深的理解和很好的掌握。通过课程设计,明白到了原来开发一个项目,是需要考虑到很多方面的问题的,这些都是要在实践中摸索的,这与平时做练习是不同的,但也因为平时有许多的练习基础,会使你做起程序来,更加得心应手。我们要不断发现问题、提出问题,解决问题。附录(一)参考文献【1】c程序设计(第三版) 谭浩强 著 【2】c+面向对象程序设计 谭浩强 著【3】数据结构(c语言版) 严蔚敏 吴伟民 著【4】附录(二): 数据结构 课程设计成绩评定表姓 名张祥性 别男专业班级09计算机科学与技术(1)班课程设计题目:矩阵乘法课程设计答辩或质疑记录:

16、成绩评定依据:最终评定成绩(以优、良、中、及格、不及格评定) 指导教师签字: 年 月 日源代码: #include<stdio.h>#include<math.h>#include<stdlib.h>#include <iostream>using namespace std;void jia()char m110,g110,f110,n110; /辅助变量int m=0,g=0,f=0,n=0;int i,j;printf("n请输入矩阵a的行数和列数( >0 ):n");cin >>m1>>g

17、1; printf("请输入矩阵b的行数和列数( >0 ):n");cin >>f1>>n1;/字符数组型转换为整型j=strlen(m1); for(i=j-1,j=0;i>=0;i-,j+) m=m+(int)(m1i-'0')*pow(10,j) ; j=strlen(g1); for(i=j-1,j=0;i>=0;i-,j+) g=g+(int)(g1i-'0')*pow(10,j) ;j=strlen(f1); for(i=j-1,j=0;i>=0;i-,j+) f=f+(int)(f

18、1i-'0')*pow(10,j) ;j=strlen(n1); for(i=j-1,j=0;i>=0;i-,j+) n=n+(int)(n1i-'0')*pow(10,j) ; if(m=f&&g=n&&strcmp(m1,"0")>0 && strcmp(m1,"9")<=0 && strcmp(n1,"0")>0 && strcmp(n1,"9")<=0) /判断能否相

19、加以及行列是否为数字/矩阵a file *fpa;printf("请输入矩阵a的元素nnn");system("input-a.txt"); fpa=fopen("input-a.txt","r"); /读文件input-a.txtif(fpa=null)printf("文件写打开失败");exit (0);double *a=null;/*二级指针用来代表一个二维数组,在声明指针的时候将其赋值为null;释放后再赋值为null在一些进行有效性判断的地方用a=null来判断指针是否为空指针*/a

20、=(double*)malloc(m*sizeof(double*);/*这句是动态定义二维数组的行数。新的标准ansi c规定malloc函数的返回值类型为void型,所以需要强制转化为double型的指针后才能赋给a。*/for(i=0;i<m;i+)ai=(double*)malloc(g*sizeof(double);/*这句是动态定义二维数组的列数。*/for(i=0;i<m;i+) for(j=0;j<g;j+)fscanf(fpa,"%lf",&aij); /从文件读取数据fclose(fpa);/输出矩阵a printf("

21、;* 矩阵a *n");for(i=0;i<m;i+)for(j=0;j<g;j+)printf("%gt",aij); /实数格式printf("n");/矩阵bfile *fpb;printf("请输入矩阵b的元素nnn");system("input-b.txt"); fpb=fopen("input-b.txt","r");if(fpb=null)printf("文件写打开失败");exit (0);double *b=nul

22、l;b=(double*)malloc(g*sizeof(double *);for(i=0;i<f;i+)bi=(double*)malloc(n*sizeof(double);for(i=0;i<f;i+)for(j=0;j<n;j+)fscanf(fpb,"%lf",&bij);fclose(fpb);/输出矩阵bprintf("* 矩阵b *n");for(i=0;i<f;i+)for(j=0;j<n;j+)printf("%gt",bij); /实数格式printf("n&qu

23、ot;);/矩阵加法printf("* 矩阵加法 *n");double *result=null;/*存放计算结果的二维数组*/result=(double*)malloc(m*sizeof(double*);for(i=0;i<m;i+)resulti=(double*)malloc(n*sizeof(double);for(i=0;i<m;i+)for(j=0;j<n;j+)resultij=0;/*初始化为0*/for(i=0;i<m;i+)for(j=0;j<g;j+)resultij=aij+bij;/屏幕输出矩阵加法for(i=0

24、;i<m;i+) for(j=0;j<n;j+)printf("%gt",resultij); /实数格式printf("n");/文件输出矩阵加法file *fpc; fpc=fopen("output-c.txt","wb"); if(fpc=null) printf("文件打开失败"); exit(0); for(i=0;i<m;i+) for(j=0;j<n;j+)fprintf(fpc,"%gt",resultij);fprintf(fpc,

25、"rn" );fclose(fpc);system("output-c.txt"); /释放for(i=0;i<m;i+)/*释放之前分配的空间是一个好习惯*/free(ai);ai=null;free(resulti);resulti=null;/*将之前分配的内存空间释放后,把指针置0是一个好的习惯*/free(a);a=null;free(result);result=null;for(i=0;i<f;i+)free(bi);bi=null;free(b);b=null;else printf("nttt* 输入有误! *nn

26、");void jian()char m110,g110,f110,n110; /辅助变量int m=0,g=0,f=0,n=0;int i,j;printf("n请输入矩阵a的行数和列数( >0 ):n");cin >>m1>>g1; printf("请输入矩阵b的行数和列数( >0 ):n");cin >>f1>>n1;/字符数组型转换为整型j=strlen(m1); for(i=j-1,j=0;i>=0;i-,j+) m=m+(int)(m1i-'0')*p

27、ow(10,j) ; j=strlen(g1); for(i=j-1,j=0;i>=0;i-,j+) g=g+(int)(g1i-'0')*pow(10,j) ;j=strlen(f1); for(i=j-1,j=0;i>=0;i-,j+) f=f+(int)(f1i-'0')*pow(10,j) ;j=strlen(n1); for(i=j-1,j=0;i>=0;i-,j+) n=n+(int)(n1i-'0')*pow(10,j) ;if(m=f&&g=n&&strcmp(m1,"0

28、")>0 && strcmp(m1,"9")<=0 && strcmp(n1,"0")>0 && strcmp(n1,"9")<=0) /判断能否相加以及行列是否为数字 /矩阵a file *fpa;printf("请输入矩阵a的元素nnn");system("input-a.txt"); fpa=fopen("input-a.txt","r"); /读文件input-a.t

29、xtif(fpa=null)printf("文件写打开失败");exit (0);double *a=null;/*二级指针用来代表一个二维数组,在声明指针的时候将其赋值为null;释放后再赋值为null在一些进行有效性判断的地方用a=null来判断指针是否为空指针*/a=(double*)malloc(m*sizeof(double*);/*这句是动态定义二维数组的行数。新的标准ansi c规定malloc函数的返回值类型为void型,所以需要强制转化为double型的指针后才能赋给a。*/for(i=0;i<m;i+)ai=(double*)malloc(g*si

30、zeof(double);/*这句是动态定义二维数组的列数。*/for(i=0;i<m;i+) for(j=0;j<g;j+)fscanf(fpa,"%lf",&aij); /从文件读取数据fclose(fpa);/输出矩阵aprintf("* 矩阵a *n");for(i=0;i<m;i+)for(j=0;j<g;j+)printf("%gt",aij); /实数格式printf("n");/矩阵bfile *fpb;printf("请输入矩阵b的元素nnn")

31、;system("input-b.txt"); fpb=fopen("input-b.txt","r");if(fpb=null)printf("文件写打开失败");exit (0);double *b=null;b=(double*)malloc(g*sizeof(double *);for(i=0;i<f;i+)bi=(double*)malloc(n*sizeof(double);for(i=0;i<f;i+)for(j=0;j<n;j+)fscanf(fpb,"%lf"

32、,&bij);fclose(fpb);/输出矩阵bprintf("* 矩阵b *n");for(i=0;i<f;i+)for(j=0;j<n;j+)printf("%gt",bij); /实数格式printf("n");/矩阵减法printf("* 矩阵减法 *n");double *result=null;/*存放计算结果的二维数组*/result=(double*)malloc(m*sizeof(double*);for(i=0;i<m;i+)resulti=(double*)mall

33、oc(n*sizeof(double);for(i=0;i<m;i+)for(j=0;j<n;j+)resultij=0;/*初始化为0*/for(i=0;i<m;i+)for(j=0;j<g;j+)resultij+=aij-bij; /屏幕输出矩阵减法for(i=0;i<m;i+)for(j=0;j<n;j+)printf("%gt",resultij); /实数格式printf("n");/文件输出矩阵减法file *fpc; fpc=fopen("output-c.txt","wb

34、");if(fpc=null)printf("文件打开失败");exit(0); for(i=0;i<m;i+)for(j=0;j<n;j+)fprintf(fpc,"%gt",resultij);fprintf(fpc,"rn" );fclose(fpc);system("output-c.txt"); /释放for(i=0;i<m;i+)/*释放之前分配的空间是一个好习惯*/free(ai);ai=null;free(resulti);resulti=null;/*将之前分配的内存空

35、间释放后,把指针置0是一个好的习惯*/free(a);a=null;free(result);result=null;for(i=0;i<f;i+)free(bi);bi=null;free(b);b=null;else printf("ntt* 输入有误,请重新输入 *nn");void cheng()char m110,g110,f110,n110; /辅助变量int m=0,g=0,f=0,n=0;int i,j,k;printf("n请输入矩阵a的行数和列数( >0 ):n");cin >>m1>>g1; pr

36、intf("请输入矩阵b的行数和列数( >0 ):n");cin >>f1>>n1;/字符数组型转换为整型j=strlen(m1); for(i=j-1,j=0;i>=0;i-,j+) m=m+(int)(m1i-'0')*pow(10,j) ; j=strlen(g1); for(i=j-1,j=0;i>=0;i-,j+) g=g+(int)(g1i-'0')*pow(10,j) ;j=strlen(f1); for(i=j-1,j=0;i>=0;i-,j+) f=f+(int)(f1i-&#

37、39;0')*pow(10,j) ;j=strlen(n1); for(i=j-1,j=0;i>=0;i-,j+) n=n+(int)(n1i-'0')*pow(10,j) ;if(m=f&&g=n&&strcmp(m1,"0")>0 && strcmp(m1,"9")<=0 && strcmp(n1,"0")>0 && strcmp(n1,"9")<=0) /判断能否相加以及行列是

38、否为数字/矩阵a file *fpa;printf("请输入矩阵a的元素nnn");system("input-a.txt"); fpa=fopen("input-a.txt","r"); /读文件cheng-a.txtif(fpa=null)printf("文件写打开失败");exit (0);double *a=null;/*二级指针用来代表一个二维数组,在声明指针的时候将其赋值为null;释放后再赋值为null在一些进行有效性判断的地方用a=null来判断指针是否为空指针*/a=(doub

39、le*)malloc(m*sizeof(double*);/*这句是动态定义二维数组的行数。新的标准ansi c规定malloc函数的返回值类型为void型,所以需要强制转化为double型的指针后才能赋给a。*/for(i=0;i<m;i+)ai=(double*)malloc(g*sizeof(double);/*这句是动态定义二维数组的列数。*/for(i=0;i<m;i+) for(j=0;j<g;j+)fscanf(fpa,"%lf",&aij); /从文件读取数据fclose(fpa);/输出矩阵a printf("* 矩阵a

40、 *n");for(i=0;i<m;i+)for(j=0;j<g;j+)printf("%gt",aij); /实数格式printf("n");/矩阵bfile *fpb;printf("请输入矩阵b的元素nnn");system("input-b.txt"); fpb=fopen("input-b.txt","r");if(fpb=null)printf("文件写打开失败");exit (0);double *b=null;b=(d

41、ouble*)malloc(g*sizeof(double *);for(i=0;i<f;i+)bi=(double*)malloc(n*sizeof(double);for(i=0;i<f;i+)for(j=0;j<n;j+)fscanf(fpb,"%lf",&bij);fclose(fpb);/输出矩阵bprintf("* 矩阵b *n");for(i=0;i<f;i+)for(j=0;j<n;j+)printf("%gt",bij); /实数格式printf("n");/

42、矩阵相乘printf("* 矩阵乘法 *n");double *result=null;/*存放计算结果的二维数组*/result=(double*)malloc(m*sizeof(double*);for(i=0;i<m;i+)resulti=(double*)malloc(n*sizeof(double);for(i=0;i<m;i+)for(j=0;j<n;j+)resultij=0;/*初始化为0*/for(i=0;i<m;i+)for(j=0;j<n;j+)for(k=0;k<g;k+)resultij+=aik*bkj;/屏幕

43、输出矩阵乘法for(i=0;i<m;i+)for(j=0;j<n;j+)printf("%gt",resultij); /实数格式printf("n");/屏幕输出矩阵乘法file *fpc;fpc=fopen("output-c.txt","wb");if(fpc=null)printf("文件打开失败");exit(0);for(i=0;i<m;i+) for(j=0;j<n;j+)fprintf(fpc,"%gt",resultij);fprin

44、tf(fpc,"rn" ); /文件中换行fclose(fpc);system("output-c.txt"); /释放for(i=0;i<m;i+)/*释放之前分配的空间是一个好习惯*/free(ai);ai=null;free(resulti);resulti=null;/*将之前分配的内存空间释放后,把指针置0是一个好的习惯*/free(a);a=null;free(result);result=null;for(i=0;i<f;i+)free(bi);bi=null;free(b);b=null;else printf("n

45、tt* 输入有误,请重新输入 *nn");void zhuanzhi()char m110,g110; /辅助变量int m=0,g=0;int i,j,k;printf("n请输入矩阵a的行数和列数( >0 ):n");cin >>m1>>g1; /字符数组型转换为整型j=strlen(m1); for(i=j-1,j=0;i>=0;i-,j+) m=m+(int)(m1i-'0')*pow(10,j) ; j=strlen(g1); for(i=j-1,j=0;i>=0;i-,j+) g=g+(int)

46、(g1i-'0')*pow(10,j) ;if( strcmp(m1,"0")>=0&&strcmp(m1,"9")<=0)/矩阵 file *fpa;printf("请输入矩阵的元素nnn");system("input-a.txt"); fpa=fopen("input-a.txt","r"); /读文件zhuanzhi-a.txtif(fpa=null)printf("文件写打开失败");exit (0);

47、double *a=null;/*二级指针用来代表一个二维数组,在声明指针的时候将其赋值为null;释放后再赋值为null在一些进行有效性判断的地方用a=null来判断指针是否为空指针*/a=(double*)malloc(m*sizeof(double*);/*这句是动态定义二维数组的行数。新的标准ansi c规定malloc函数的返回值类型为void型,所以需要强制转化为double型的指针后才能赋给a。*/for(i=0;i<m;i+)ai=(double*)malloc(g*sizeof(double);/*这句是动态定义二维数组的列数。*/for(i=0;i<m;i+)

48、for(j=0;j<g;j+)fscanf(fpa,"%lf",&aij); /从文件读取数据fclose(fpa);/屏幕输出矩阵 printf("* 矩阵 *n");for(i=0;i<m;i+)for(j=0;j<g;j+)printf("%gt",aij); /实数格式printf("n");/转置矩阵printf("* 转置矩阵 *n");double *result=null;/*存放计算结果的二维数组*/result=(double*)malloc(m*sizeof(double*);for(i=0;i<g;i+)resulti=(double*)malloc(g*sizeof(double);for(i=0;i<g;i+)for(j=0;j<m;j+)resultij=0;/*初始化为0*/for(i=0;i<g;i+) for(j=0;j<m;j+)resultij=aji;/屏幕输出转置矩阵for(i=0;i<g;i+)for(j=0;j<m;j+

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论