数据结构矩阵相关操作的课程设计
- 格式:doc
- 大小:313.50 KB
- 文档页数:25
计算机科学技术学院学生课程设计(论文)题目:学生姓名:学号:所在院(系):专业:班级:指导教师:职称:年月日计算机科学技术学院本科学生课程设计任务书注:任务书由指导教师填写。
课程设计(论文)指导教师成绩评定表稀疏矩阵的操作1.课程设计的目的本课程设计是为了配合《数据结构》课程的开设,通过设计一完整的程序,使学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并用TC上机调试的基本方法。
利用三元组实现稀疏矩阵的有关算法。
2.问题描述2.1稀疏矩阵采用三元组表示,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C。
2.2求出A的转置矩阵D,输出D。
3. 基本要求稀疏矩阵是指那些多数元素为零的矩阵。
利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。
实现一个能进行稀疏矩阵基本运算的运算器。
以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。
稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。
4.结构设计4.1.以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。
4.2.稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。
4.3.首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。
可设矩阵的行数和列数均不超过20。
4.4.程序可以对三元组的输入顺序加以限制,例如,按行优先。
注意研究教材的算法,以便提高计算效率。
5.在用三元组表示稀疏矩阵时,相加或相减所得结果矩阵应该另生成,乘积矩阵也可用二维数组存放5.算法思想5.1.主函数设置循环和选择语句进行运算循环和选择,进行稀疏矩阵的加法,减法,乘法,转置和是否继续运算5个分支开关进行运算选择。
5.2.设置函数分别实现稀疏矩阵的输入,输出,加法,减法,乘法。
5.3.在数组结构体中设置存放每行第一个非零元在其数组存储结构单元的位置的存储单元,若该行无非零元,则存为06.模块划分6.1typedef struct存放各行第一个非零元在存储数组中的位置,若该行无非零元,则其rpos[]值为零6.2 createsmatrix(rlsmatrix *M) 矩阵输入函数,输入各行非零元及其在矩阵中的行列数6.3 FasttransposeRLSMatrix(RLSMatrix M,RLSMatrix *Q) 矩阵快速转置6.4 HeRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) 矩阵求和6.5 ChaRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) 矩阵求差6.6 JiRLSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q) 矩阵求积7.算法实现7.1首先定义非零元个数的最大值和存放各行第一个非零元在存储数组中的位置#include<stdio.h>#define MAXSIZE 100 /* 非零元个数的最大值*/typedef struct triple{int i,j; /* 行下标,列下标*/int e; /* 非零元素值*/}triple;typedef struct tsmatrix{triple data[MAXSIZE+1]; /* 非零元三元组表,data[0]未用*/int mu,nu,tu; /* 矩阵的行数、列数和非零元个数*//* 各列第一个非零元的位置表rpos[0]未用*/}rlsmatrix;7.2创建稀疏矩阵矩阵的行数,列数,和非零元素的个数并按行序顺序输入第%d 个非零元素所在的行(1~%d),列(1~%d),元素值。
数据结构课程设计报告题目:专业:班级:学号:姓名:指导老师:时间:一、课程设计题目及所涉及知识点设计题目是“矩阵的运算”;所涉及的知识点主要是:1、利用数组的形式来储存数据,在main函数里面,实现对于数据的输入操作,利用switch语句进行选择来执行操作,利用for语句与do……while语句来实现功能的循环操作。
2、矩阵的加法、减法、乘法、数乘、转置的基本算法方式。
3、通过switch语句进行选择来执行操作,来实现每个算法的功能。
二、课程设计思路及算法描述设计思路:用程序实现矩阵能够完成矩阵的转置运算;矩阵的数乘运算;矩阵的加法运算;矩阵的减法运算;矩阵的乘法运算;这几种矩阵的简单的运算。
用数组把将要运算的矩阵储存起来,然后实现矩阵的这几种运算。
在main函数里面,来实现对于数据的输入操作,利用switch语句进行选择来执行操作,利用for语句来实现功能的循环操作。
算法:算法1:矩阵的转置运算;首先是把将要运算的矩阵存放在数组中,矩阵的转置运算,就是把你将要进行运算的A矩阵的行ar和列ac,把A矩阵的行ar作为B矩阵的bc,A矩阵的列ac作为B矩阵的br,这样得到的新矩阵B的行br和列bc就是矩阵A的转置。
算法如下:for(i=0;i<ar;i++)for(j=0;j<ac;j++)B[j][i]=A[i][j];算法2:矩阵的数乘运算;首先是把将要运算的矩阵存放在数组中,矩阵的数乘运算,就是实现用一个实数k 去A矩阵。
实数k去乘矩阵的每一行和每一列,得到的一个新的矩阵B,这样就解决了矩阵的数乘运算。
算法如下:for(i=0;i<ar;i++)for(j=0;j<ac;j++)B[i][j]=k*A[i][j];算法3:矩阵的加法运算;首先是把将要运算的矩阵存放在数组中,矩阵的加法运算,就是要实现A矩阵与B 矩阵进行加法运算。
事实上就是A矩阵的每一行ar与B矩阵的每一行br进行加法运算,而得到的一个新的矩阵C的每一行cr就是A矩阵的ar行与B矩阵的br行的和;A矩阵的每一列ac与B矩阵的每一列bc进行加法运算,而得到的一个新的矩阵C的每一列cc 就是A矩阵的ac列与B矩阵的bc列的和。
c 课程设计矩阵运算一、教学目标本节课的教学目标是让学生掌握矩阵的基本运算,包括矩阵的加法、减法、数乘以及矩阵的乘法。
通过学习,学生应能理解矩阵运算的定义和规则,并能运用这些运算解决实际问题。
此外,学生还应掌握矩阵运算的数学原理,提高逻辑思维和数学运算能力。
在情感态度价值观方面,学生应培养对数学学科的兴趣,增强自信心,培养团队合作精神。
二、教学内容本节课的教学内容主要包括矩阵的基本运算和数学原理。
首先,介绍矩阵的加法、减法、数乘和矩阵的乘法,通过举例说明这些运算的定义和规则。
然后,讲解矩阵运算的数学原理,包括线性方程组的解法、行列式的计算以及矩阵的逆矩阵。
最后,通过实际案例让学生运用矩阵运算解决实际问题,提高学生的应用能力。
三、教学方法为了激发学生的学习兴趣和主动性,本节课将采用多种教学方法。
首先,采用讲授法,清晰地讲解矩阵运算的定义和规则,以及数学原理。
其次,采用讨论法,让学生分组讨论矩阵运算的应用案例,培养学生的思考和表达能力。
此外,还采用案例分析法,让学生分析实际问题,运用矩阵运算解决问题。
最后,通过实验法,让学生动手实践,加深对矩阵运算的理解。
四、教学资源为了支持教学内容和教学方法的实施,本节课将准备以下教学资源。
首先,教材和相关参考书,为学生提供系统的学习资料。
其次,多媒体资料,如PPT、教学视频等,用于直观地展示矩阵运算的过程和应用案例。
此外,还将提供实验设备,如计算器、电脑等,让学生进行实际操作,提高实践能力。
通过丰富多样的教学资源,丰富学生的学习体验,提高学习效果。
五、教学评估本节课的教学评估将采用多元化的评估方式,以全面、客观地评价学生的学习成果。
评估方式包括平时表现、作业、考试等。
平时表现主要评估学生的课堂参与度、提问回答等,通过观察学生的表现来了解他们的学习状态。
作业方面,将布置适量的练习题,要求学生在规定时间内完成,通过批改作业了解学生对矩阵运算的理解和掌握程度。
考试方面,将设置期中考试和期末考试,考试内容涵盖本节课的全部知识点,通过考试来检验学生的学习成果。
矩阵运算的课程设计一、课程目标知识目标:1. 理解矩阵的定义,掌握矩阵的基本元素和结构特点;2. 学会矩阵的加、减、乘运算,并能够运用这些运算解决实际问题;3. 掌握矩阵的转置、逆矩阵的概念及其运算方法;4. 了解矩阵运算在现实生活中的应用,如线性方程组求解、图像处理等。
技能目标:1. 能够熟练运用矩阵运算公式进行计算,提高解题速度和准确性;2. 能够运用矩阵运算解决实际问题,培养分析问题和解决问题的能力;3. 能够运用矩阵软件(如MATLAB)进行矩阵运算,提高计算效率。
情感态度价值观目标:1. 培养学生对矩阵运算的兴趣,激发学习热情;2. 培养学生的团队协作精神,学会与他人共同探讨问题;3. 引导学生认识到矩阵运算在科学技术发展中的重要性,增强学生的国家使命感和社会责任感。
课程性质:本课程为高中数学选修课程,适用于对数学有一定基础的学生。
学生特点:学生具备一定的代数基础,对矩阵概念有一定了解,但对矩阵运算尚不熟悉。
教学要求:结合学生特点,注重启发式教学,通过实例分析、问题解决等方法,使学生掌握矩阵运算的基本技能,并培养其运用矩阵运算解决实际问题的能力。
在教学过程中,关注学生的情感态度价值观的培养,提高学生的学习兴趣和积极性。
最终实现课程目标的分解与达成。
二、教学内容1. 矩阵的定义与基本概念:回顾矩阵的定义,讨论矩阵的行、列、元素等基本属性。
教材章节:第二章第一节2. 矩阵的加、减运算:讲解矩阵加、减法的规则,通过例题演示运算方法。
教材章节:第二章第二节3. 矩阵的乘法运算:介绍矩阵乘法法则,分析矩阵乘法与实数乘法的异同。
教材章节:第二章第三节4. 矩阵的转置与逆矩阵:阐述转置矩阵的概念,探讨逆矩阵的定义及性质。
教材章节:第二章第四节5. 矩阵的应用:介绍矩阵在解决线性方程组、图像处理等方面的应用。
教材章节:第二章第五节6. 矩阵运算软件实践:指导学生使用MATLAB软件进行矩阵运算,提高计算效率。
c 课程设计矩阵类一、教学目标本章节的教学目标旨在让学生掌握矩阵类的基本概念、性质和运算方法。
知识目标要求学生能够理解矩阵的定义、矩阵的元素运算、矩阵的转置和逆矩阵的概念。
技能目标要求学生能够运用矩阵的运算法则进行矩阵的加减乘除运算,以及求解线性方程组。
情感态度价值观目标则是培养学生的团队合作意识和问题解决能力。
二、教学内容本章节的教学内容主要包括矩阵的基本概念、矩阵的运算、矩阵的转置和逆矩阵。
首先,介绍矩阵的定义和矩阵的元素运算,让学生理解矩阵的基本性质。
然后,教授矩阵的加减乘除运算规则,并通过示例让学生掌握这些运算方法。
接着,讲解矩阵的转置和逆矩阵的概念,并教授如何求解线性方程组。
三、教学方法为了激发学生的学习兴趣和主动性,将采用多种教学方法。
首先,通过讲授法,向学生介绍矩阵的基本概念和运算方法。
其次,利用案例分析法,通过具体的例子让学生理解和应用矩阵的运算规则。
然后,采用讨论法,让学生分组讨论并解决线性方程组的问题。
最后,进行实验法,让学生亲自动手进行矩阵的运算实验,加深对矩阵的理解。
四、教学资源为了支持教学内容和教学方法的实施,将选择和准备适当的教学资源。
教材将是主要的教学资源,用于提供矩阵类的基本概念和运算方法的理论知识。
参考书将提供更多的例题和习题,帮助学生巩固所学知识。
多媒体资料将用于展示矩阵的运算过程和实验结果,增加学生的学习兴趣。
实验设备将用于进行矩阵的运算实验,让学生亲身体验矩阵的运算过程。
五、教学评估本章节的教学评估将采用多元化的评估方式,以全面、客观地评价学生的学习成果。
评估方式包括平时表现、作业和考试。
平时表现将根据学生在课堂上的参与度、提问和回答问题的积极性进行评估。
作业将包括课后习题和项目任务,以巩固学生对矩阵类的理解和应用能力。
考试将包括期中考试和期末考试,以检验学生对矩阵类的掌握程度。
此外,还将在课堂上进行小组讨论和口头报告,以评估学生的团队合作和口头表达能力。
稀疏矩阵应用摘要本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘操作,最后输出运算后的结果。
在程序设计中,考虑到方法的难易程度,采用了先用三元组实现稀疏矩阵的输入,输出,及其转置,相加,相乘操作的方法,再在十字链表下实现。
程序通过调试运行,结果与预期一样,初步实现了设计目标。
关键词程序设计;稀疏矩阵;三元组;十字链表1 引言1.1课程设计任务本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘操作,最后输出运算后的结果。
稀疏矩阵采用三元组和十字链表表示,并在两种不同的存储结构下,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C;求出A的转置矩阵D,输出D;求两个稀疏矩阵A和B的相乘矩阵E,并输出E。
1.2课程设计性质数据结构课程设计是重要地实践性教学环节。
在进行了程序设计语言课和《数据结构》课程教学的基础上,设计实现相关的数据结构经典问题,有助于加深对数据结构课程的认识。
本课程设计是数据结构中的一个关于稀疏矩阵的算法的实现,包括在三元组和十字链表下存储稀疏矩阵,并对输入的稀疏矩阵进行转置,相加,相乘等操作,最后把运算结果输出。
此课程设计要求对数组存储结构和链表存储结构非常熟悉,并能熟练使用它们。
1.3课程设计目的其目的是让我们在学习完C、数据结构等课程基础上,掌握多维数组的逻辑结构和存储结构、掌握稀疏矩阵的压缩存储及转置,相加,相乘等基本操作,并用不同的方法输出结果,进一步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。
2需求分析2.1设计函数建立稀疏矩阵及初始化值和输出稀疏矩阵的值本模块要求设计函数建立稀疏矩阵并初始化,包括在三元组结构下和十字链表结构下。
首先要定义两种不同的结构体类型,在创建稀疏矩阵时,需要设计两个不同的函数分别在三元组和十字链表下创建稀疏矩阵,在输入出现错误时,能够对错误进行判别处理,初始化稀疏矩阵都为空值,特别注意在十字链表下,对变量进行动态的地址分配。
数据结构课程设计报告题目:_____________________________________专业:_____________________________________班级:_____________________________________学号:_____________________________________姓名:_____________________________________指导老师:__________________________________时间:_____________________________________、课程设计题目及所涉及知识点设计题目是“矩阵的运算” ,所涉及的知识点主要是:1、数据结构中的对于结构体的定义,用typedef struct 来实现,根据所设计的问题在结构体里面定义数据类型及其变量,用define 定义数组的大小,然后利用typedef 来实现对于变量的未知类型确定正确的类型。
2、利用数组的形式来储存数据,在实现不同操作过程中,有的用一维结构体数组(三元组顺序表)来存储,有的用二维数组来储存。
3、转置的过程中利用的是快速转置的方法,附设了num 和cpot 两个辅助变量。
4、矩阵的加法、减法、乘法、逆运算的基本算法方式。
5、通过调用每个函数,来实现每个算法的功能。
、课程设计思路及算法描述设计思路:1、首先是对于转置的考虑,要运用快速转置的方法实现,必须用三元组顺序表来储存数据,所以在第一个结构体中存在int 类型的行数(mu )列数(nu )以及非零元素的个数(tu );然后第二个结构体中分别有非零元素的行下标(i)、列下标(j)和元素数值(e),最后在第一个结构体中实现对第二个结构体成为数组结构体类型。
2、对于其余加法、减法、乘法和逆运算则是运用另一个结构体来实现,里面只有矩阵的行数、列数和一个二维数组(用float 来定义类型)。
实验4 矩阵实验目的:1、掌握特殊线性结构数组。
2、掌握二维数组的简单应用。
3、掌握矩阵的三元组表示方法4、掌握矩阵的转置。
实验内容:1、对一个稀疏矩阵而言,按提示输入其行号、列号及每一个元素值,程序将建立稀疏矩阵的三元组存储结构,并将三元组存储结构的稀疏矩阵转置,程序还将显示转置前后稀疏矩阵的三元组结构。
答:#include <malloc.h>#include <stdio.h>#define MAXLEN 40typedef struct{ int i, j;int v;}NODE;typedef struct{ int m, n, t;NODE data[MAXLEN];}SPMA TRIX;SPMA TRIX transpose(SPMA TRIX a){/*稀疏矩阵(三元组存储结构)转置算法*/int p, q, col;SPMA TRIX b;b.m=a.n; b.n=a.m; b.t=a.t;if(a.t!=0){q = 1;for (col=1; col<=a.n; col++) //访问b三元组的每一行for (p=1; p<=a.t; p++) //访问a三元组的每一行if(a.data[p].j==col) //如果b三元组的行对应a数组的列,就进行转置{ b.data[q].j=a.data[p].i;b.data[q].i=a.data[p].j;b.data[q].v=a.data[p].v;q++;}}return b;}void printmatrix(SPMA TRIX c){/*稀疏矩阵(三元组存储结构)显示*/int n,i;n=c.t;for(i=1;i<=n;i++)printf("[%d]行号=%d 列号=%d 元素值=%d\n",i,c.data[i].i,c.data[i].j,c.data[i].v);}void main(){ SPMA TRIX a;SPMA TRIX b;int i,j,r,c,t,n;n=1;printf("\n\n输入矩阵行号数: ");scanf("%d",&r);printf("\n\n输入矩阵列号数: ");scanf("%d",&c);a.m=r; a.n=c;printf("\n\n");for(i=0;i<r;i++) /*输入矩阵元素值*/for(j=0;j<c;j++){printf("输入元素[%d,%d]值: ",i+1,j+1);scanf("%d",&t);if(t!=0) {a.data[n].i=i+1; /*非零元素存入稀疏矩阵三元组存储结构中*/a.data[n].j=j+1; a.data[n].v=t; n=n+1;}}n=n-1; a.t=n; /*a.t中为稀疏矩阵非零元素个数*/printf("\n\n稀疏矩阵三元组表示: \n\n");printmatrix(a); /*稀疏矩阵(三元组存储结构)转置*/b=transpose(a);printf("\n\n转置后稀疏矩阵三元组表示: \n\n");printmatrix(b);printf("\n\n");}文- 汉语汉字编辑词条文,wen,从玄从爻。
一、问题描述十字链表实现稀疏矩阵的加法1、功能要求:根据用户输入的矩阵,实现稀疏矩阵的求和运算,并输出结果。
2、输入要求:矩阵的数据在程序运行的时候由用户提供,先由用户输入稀疏矩阵的行数、列数和非零元个数。
再根据非零元个数,输入这些非零元,还需要用户为这些非零元输入行、列和非零元的值。
这样,一个稀疏矩阵就输入完成。
若输入4 3 2则表示这个稀疏矩阵有4行3列2个非零元然后用户需要为这两个非零元输入行、列、非零元的值如:1 2 24 1 1表示第一个非零元行为1,列为2,,值为2;第二个非零元行为4,列为1,值为1。
此过程输入的稀疏矩阵为:0 2 00 0 00 0 01 0 03、输出要求:输出按矩阵输出,按行列依次输出,非零元则输出非零元的值,不是非零元则输出“0”。
各元素之间用空格隔开。
最后输出完整的矩阵。
二、概要设计1.稀疏矩阵的抽象数据类型定义如下:ADT SparseMatrix {数据对象: D={a ij|i=1,2,3……m,j=1,2,3……n;a ij属于ElemSet,m和n分别是稀疏矩阵的行数和列数}数据关系: R={ Row, Col }Row={<a ij,a ij+1>|1<=i<=m,1<=j<=n-1}Col={<a ij,a i+1j>|1<=i<=m-1,1<=j<=n}基本操作:CreateSMatrix(&M);//建立稀疏矩阵MDestroySMatrix(&M);//销毁稀疏矩阵M;TransposeSMatrix(M);//求稀疏矩阵的转置矩阵AddSMatrix(&M,&N);//求稀疏矩阵M和N之和MulSMatrix(&M,&N);//求稀疏矩阵M和N之积}ADT SparseMatrix2、存储结构选择采用十字链表存储稀疏矩阵,它是稀疏矩阵链式表示的一种较好的表示方法。
课程设计题目矩阵乘法教学院计算机学院专业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 流程图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,并弹出结果的TXT7)最后选择4,进行矩阵转置的调试转置后的结果8)选择N程序结束7 总结课程设计终于做完了,虽然有些疲劳和困倦,但也让我收获了很多。
数据结构已经学了一个学期,有许多知识都存在似懂非懂的现象,这种现象通过实际的上机操作,实际应用,已经减少了许多。
对这些知识也有了更深的理解和很好的掌握。
许多困惑,有许多已经通过实际操作解决了,并能够深刻认识。
通过课程设计,明白到了原来开发一个小小的实用系统,是需要考虑到很多方面的问题的,这些都是要在实践中摸索的,这与平时做练习是不同的,但也因为平时有许多的练习基础,会使你做起程序来,更加得心应手。
另外就是要把错误总结,有许多错误是平时自己一手制造的,因此很深刻,但也有些错误是自己还没有接触的,这就应该看多些有关的书记以及别人的总结,使自己不犯这些错误。
这样长期总结,会对自己有很大的帮助。
附录实现的程序代码:#include<iostream>#include <stdio.h>#include <stdlib.h>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<<"无此选项请确定后再输入!"<<endl;break;}cout<<"是否继续操作?(y/n)"<<endl;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<row_a;i++){for(j=0;j<col_a;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);//输出矩阵bprintf("***** 矩阵B *****\n");for(i=0;i<row_b;i++){for(j=0;j<col_b;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<row_a;i++){for(j=0;j<col_b;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<row_a;i++){for(j=0;j<col_a;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);//输出矩阵bprintf("***** 矩阵B *****\n");for(i=0;i<row_b;i++){for(j=0;j<col_b;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<row_a;i++){for(j=0;j<col_b;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) //判断能否相乘{//矩阵aFILE *fpa;printf("请输入矩阵A的元素\n");system("cheng-a.txt");fpa=fopen("cheng-a.txt","r"); //读文件cheng-a.txtif(fpa==NULL){printf("文件写打开失败");exit (0);}double **a=NULL;/*二级指针用来代表一个二维数组,在声明指针的时候将其赋值为NULL;释放后再赋值为NULL在一些进行有效性判断的地方用a==NULL来判断指针是否为空指针*/a=(double**)malloc(m*sizeof(double*));/*这句是动态定义二维数组的行数。