学号:
课程设计
题目矩阵乘法
教学院计算机学院
专业09计算机科学与技术
班级
姓名
指导教师
年月日
课程设计(论文)
目录
1 概述 (3)
2 设计目的 (3)
3 设计功能说明 (3)
4 详细设计说明 (3)
5 流程图 (4)
6 调试及结果 (5)
1程序调试 (5)
2运行编译连接过程………………………………………………… 5-8
7 总结 (9)
附录…………………………………………………………………10-24
参考文献 (25)
成绩评定表 (26)
1 概述
数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁只有进行实际操作,将理论应用于实际中,才能确实掌握书中的知识点。通过课程设计,不仅可以加深学生对数据结构基本概念的了解,巩固学习成果,还能够提高实动手力。为学生后继课程的学习打下良好的基础。
2 设计目的
《数据结构》课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化和提高。因此,要求学生能综合应用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验的基本技能方面上进行一次全面的训练。通过程序的编译掌握对程序的调试方法及思想,并且让学生学会使用一些编程技巧。促使学生养成良好的编程习惯。
1.使学生能够较全面地巩固和应用课堂中所学的的基本理论和程序设计方法,能够较熟练地完成程序的设计和调试。
2.培养学生综合运用所学知识独立完成程序课题的能力。
3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的素质。
5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
6.对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。
3 设计功能分析
本设计的功能如下:
1、对于用户给定的矩阵相乘可以进行存储,并且用户可以更改
2、根据用户的要求可以选择相应的功能加减乘及转置
3、然后显示用户输入的矩阵进行运算并得到结果后保存到文件
课程设计(论文)
4 详细设计说明
本程序用数据存储的方式建立矩阵。然后用相加,减,乘,转置的方式计算出最终的矩阵
5 流程图
选择功能
相加、相减
相乘
转置
以只读方式打开输入文件 in.txt
创建并读入矩阵
a 、b,然后分别再屏幕输出
判断两个矩阵能否相加、减
矩阵的加法,输出结果矩阵C ,关闭输入、输出文件,释放矩阵
关闭输入文件,并以写入方式打开输出文件 out.txt
创建并初始化结果矩阵c
从文件写入并输
出屏幕矩阵a 、b
结果输出到文件并输出屏幕矩阵c 释放内存,并判断是否继续
判断两矩阵能否相乘 从文件写入并输出屏幕矩阵a
释放内存,并判断是否继续
结果输出到文件并输出屏幕矩阵c
结束
判断是否继续
6 调试及运行结果
1、程序调试
1)使用Microsoft visual c++ 编辑软件进行源程序的编写。
2)使用Microsoft visual c++软件进行编译,步骤:单击“组建”选择“编译”。3)使用Microsoft visual c++运行程序并调试,步骤:单击“组建”选择“执行”。
2、运行及编译连接过程
1)现在进行调试
2)下面进行编译
3)开始运行程序
课程设计(论文)
4)首先进行选择,先选1号进行加法运算
这时候系统会弹出TXT文本
5)做完加法以后,进行选择,选“Y”继续,然后进行减法运行
同样,程序接着把两个YXT文本弹出来
6)同样上面的操作,选择3,进行乘法运行
在弹出的TXT文本里面输入矩阵A,关闭后,在另一个弹出的TXT中输入矩阵B
课程设计(论文)
最后输出矩阵B,并弹出结果的TXT
7)最后选择4,进行矩阵转置的调试
转置后的结果
8)选择N程序结束
课程设计(论文)
7 总结
课程设计终于做完了,虽然有些疲劳和困倦,但也让我收获了很多。数据结构已经学了一个学期,有许多知识都存在似懂非懂的现象,这种现象通过实际的上机操作,实际应用,已经减少了许多。对这些知识也有了更深的理解和很好的掌握。许多困惑,有许多已经通过实际操作解决了,并能够深刻认识。通过课程设计,明白到了原来开发一个小小的实用系统,是需要考虑到很多方面的问题的,这些都是要在实践中摸索的,这与平时做练习是不同的,但也因为平时有许多的练习基础,会使你做起程序来,更加得心应手。另外就是要把错误总结,有许多错误是平时自己一手制造的,因此很深刻,但也有些错误是自己还没有接触的,这就应该看多些有关的书记以及别人的总结,使自己不犯这些错误。这样长期总结,会对自己有很大的帮助。
附录
实现的程序代码:
#include
#include
#include
using namespace std;
#include"void Transposition.h"
#include"void MatrixMutiply.h"
/* 给int 类型定义别名datatype */
typedef int datatype;
/* 函数声明部分*/
datatype** Create(int m, int n);
void Reset(datatype**, int, int);
void Input(datatype**, int, int);
void Output(datatype**, int, int);
void Summation(datatype**, datatype**, datatype**); void Subtraction(datatype**, datatype**, datatype**); void MatrixFree(datatype** , int);
/* 定义三个矩阵的行列大小*/
int row_a, col_a;
int row_b, col_b;
int row_c, col_c;
/* 定义文件指针*/
FILE *fp;
int main()
{
课程设计(论文){
system("color 1c");
}
datatype **a, **b, **c, **d;
printf(" ###########################################\n");
printf(" ##### 欢迎您使用矩阵系统######\n");
printf(" ##### 系统功能: ######\n");
printf(" ##### 计算两个矩阵相加,相减; ######\n");
printf(" ##### 矩阵相乘;矩阵转置######\n");
printf("
###########################################\n");
printf(" ## 请选择您需要的运算,按回车键结束##\n");
printf("
###########################################\n");
printf(" ########### 1:矩阵相加###########\n");
printf(" ########### 2:矩阵相减###########\n");
printf(" ########### 3:矩阵相乘###########\n");
printf(" ########### 4:矩阵转置###########\n");
printf("
###########################################\n");
char flag;
do
{
int x;
cout<<" 请输入要操作的选项(1--4):";
cin>>x;
switch (x)
{
case 1:
{
/* 进行矩阵加法运算*/
Summation(a, b, c);
};break;
case 2:
{
/* 进行矩阵减法运算*/
Subtraction(a, b, c);
};break;
case 3:
{
/* 进行矩阵乘法运算*/
MatrixMutiply();
};break;
case 4:
{
/* 进行矩阵转置运算*/
Transposition();
};break;
default : cout<<"无此选项请确定后再输入!"< break; } cout<<"是否继续操作?(y/n)"< cin>>flag; }while (flag=='y'||flag=='Y'); } /* 为矩阵动态分配内存的函数*/ datatype** Create(int m, int n) { int i; datatype **Matrix; Matrix = (datatype **) malloc(sizeof(datatype *) * m); for(i = 0; i < m; i++) { Matrix[i] = (datatype *) malloc(sizeof(datatype) * n); } return Matrix; } /* 初始化矩阵函数*/ void Reset(datatype** Matrix, int m, int n) { int i,j; for(i = 0; i < m; i++) 课程设计(论文){ for(j = 0; j < n; j++) { Matrix[i][j] = 0; } } } /* 读入数据函数*/ void Input(datatype** Matrix, int m, int n) { int i,j; for(i = 0; i < m; i++) { for(j = 0; j < n; j++) { fscanf(fp,"%d", &Matrix[i][j]); } } } /* 输出数据函数*/ void Output(datatype** Matrix, int m, int n) { int i,j; for(i = 0; i < m; i++) { for(j = 0; j < n; j++) { fprintf(fp,"%4d ", Matrix[i][j]); } fprintf(fp,"\n"); } } /* 释放矩阵内存函数*/ void MatrixFree(datatype** Matrix, int m) { int i; for(i = 0; i < m; i++) { free(Matrix[i]); } free(Matrix); } /* 矩阵加法运算函数*/ void Summation(datatype** a, datatype** b, datatype** c) { int i,j; /* 以只读方式打开输入文件in.txt */ if((fp = fopen("in.txt","r")) == NULL) { printf("Cannot open this file.\n"); exit(0); } /* 创建并读入矩阵a */ fscanf(fp,"%d%d", &row_a, &col_a); a=Create(row_a, col_a); Input(a,row_a, col_a); printf("***** 矩阵A *****\n"); for(i=0;i { for(j=0;j printf("%4d",a[i][j]); //实数格式printf("\n"); } /* 创建并读入矩阵b */ fscanf(fp,"%d%d", &row_b, &col_b); b = Create(row_b, col_b); Input(b,row_b, col_b); //输出矩阵b printf("***** 矩阵B *****\n"); for(i=0;i { for(j=0;j printf("%4d",b[i][j]); //实数格式printf("\n"); 课程设计(论文)} /* 判断两个矩阵能否相加*/ if(row_a == row_b && col_a == col_b) { row_c = row_a; col_c = col_b; } else { printf("Matrix Can't Mutiply !\n"); fprintf(fp,"Matrix Can't Mutiply !\n"); exit(0); } /* 关闭输入文件*/ fclose(fp); /* 以写入方式打开输出文件out.txt */ if((fp = fopen("out.txt","w")) == NULL) { printf("Cannot open this file.\n"); exit(0); } /* 创建并初始化结果矩阵c */ c = Create(row_c, col_c); Reset(c, row_c, col_c); for(i=0;i { for(j=0;j { c[i][j]=a[i][j]+b[i][j]; } } //矩阵加法 printf("***** 矩阵加法*****\n"); for(i=0;i { for(j=0;j printf("%4d",c[i][j]); //实数格式printf("\n"); } /* 输出结果矩阵C */ Output(c, row_c, col_c); /* 关闭输入文件*/ fclose(fp); system("in.txt"); /* 关闭输出文件*/ fclose(fp); system("out.txt"); /* 释放矩阵内存*/ MatrixFree(a,row_a); MatrixFree(b,row_b); MatrixFree(c,row_c); } /* 矩阵减法运算函数*/ void Subtraction(datatype** a, datatype** b, datatype** c) { int i,j; /* 以只读方式打开输入文件in.txt */ if((fp = fopen("in.txt","r")) == NULL) { printf("Cannot open this file.\n"); exit(0); } /* 创建并读入矩阵a */ fscanf(fp,"%d%d", &row_a, &col_a); a=Create(row_a, col_a); Input(a,row_a, col_a); printf("***** 矩阵A *****\n"); for(i=0;i 课程设计(论文){ for(j=0;j printf("%4d",a[i][j]); //实数格式 printf("\n"); } /* 创建并读入矩阵b */ fscanf(fp,"%d%d", &row_b, &col_b); b = Create(row_b, col_b); Input(b,row_b, col_b); //输出矩阵b printf("***** 矩阵B *****\n"); for(i=0;i { for(j=0;j printf("%4d",b[i][j]); //实数格式 printf("\n"); } /* 判断两个矩阵能否相减*/ if(row_a == row_b && col_a == col_b) { row_c = row_a; col_c = col_b; } else { printf("Matrix Can't Mutiply !\n"); fprintf(fp,"Matrix Can't Mutiply !\n"); exit(0); } /* 关闭输入文件*/ fclose(fp); /* 以写入方式打开输出文件out.txt */ if((fp = fopen("out.txt","w")) == NULL) { printf("Cannot open this file.\n"); exit(0); } /* 创建并初始化结果矩阵c */ c = Create(row_c, col_c); Reset(c, row_c, col_c); for(i = 0; i < row_c; i++) { for(j = 0; j < col_c; j++) { c[i][j] = a[i][j] - b[i][j]; } } //矩阵减法 printf("***** 矩阵减法*****\n"); for(i=0;i { for(j=0;j printf("%4d",c[i][j]); //实数格式 printf("\n"); } /* 输出结果矩阵C */ Output(c, row_c, col_c); system("in.txt"); /* 关闭输出文件*/ fclose(fp); system("out.txt"); /* 释放矩阵内存*/ MatrixFree(a,row_a); MatrixFree(b,row_b); MatrixFree(c,row_c); } 课程设计(论文) 矩阵乘法的分代码: #include "stdio.h" void MatrixMutiply() { int m,g,f,n; int i,j,k; printf("\n请输入矩阵A的行数和列数( >0 ):\n"); scanf("%d%d",&m,&g); printf("请输入矩阵B的行数和列数( >0 ):\n"); scanf("%d%d",&f,&n); if(f==g) //判断能否相乘 { //矩阵a FILE *fpa; printf("请输入矩阵A的元素\n"); system("cheng-a.txt"); fpa=fopen("cheng-a.txt","r"); //读文件cheng-a.txt if(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 a[i]=(double*)malloc(g*sizeof(double));/*这句是动态定义二维数组的列数。*/ for(i=0;i for(j=0;j