正弦波振荡电路设计课程设计(完整版)实用资料.doc

上传人:知****量 文档编号:91800475 上传时间:2023-05-27 格式:DOC 页数:69 大小:1.49MB
返回 下载 相关 举报
正弦波振荡电路设计课程设计(完整版)实用资料.doc_第1页
第1页 / 共69页
正弦波振荡电路设计课程设计(完整版)实用资料.doc_第2页
第2页 / 共69页
点击查看更多>>
资源描述

《正弦波振荡电路设计课程设计(完整版)实用资料.doc》由会员分享,可在线阅读,更多相关《正弦波振荡电路设计课程设计(完整版)实用资料.doc(69页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、正弦波振荡电路设计课程设计(完整版)实用资料(可以直接使用,可编辑 完整版实用资料,欢迎下载)正弦波振荡电路设计1 技术指标设计一个正弦波振荡电路,使它能输出频率一定的正弦波信号,振荡频率测量值与理 论值的相对误差小于5%,电源电压变化1V 时,振幅基本稳定,振荡波形对称,无明显 非线性失真。2 设计方案及其比较通过查阅资料可以知道所谓的正弦波振荡电路是指一个没有输入信号,依靠自激振荡 产生正弦波输出信号的电路。正弦波电路由放大电路,正反馈电路和选频网络组成。正弦 波振荡电路的实质是放大器引正反馈的结果。正弦波振荡电路主要有 RC 振荡电路, LC 振荡电路和石英晶体振荡电路。 本次试验中 我

2、主要设计的方案是 RC 正弦波振荡电路。 RC 正弦波振荡电路是由电阻 R 和电容 C 元件 作为选频和正反馈网络的振荡器, RC 作为选频网络的正弦波振荡器有桥式振荡电路, 双 T 网络和相移式振荡电路。根据桥式振荡电路和相移式振荡电路的工作原理,我设计了如下三个方案。 2.1 方案一 图一本方案主要采用一个文式桥式振荡电路作为正反馈,一个由两个二极管反相并联组成 的稳幅电路作为负反馈。其中当w =w 0=1/RC 时, RC 选频网络的相移为零,这样, RC 串 并联选频网络送到运算放大器同向输入端的信号电压与输出电压同相。满足相位平衡条件 有可能发生震荡。 这是一个 RC 相移式电路,正

3、弦波信号发生器由反相输入比例放大器,电压跟随器和 三节 RC 相移网络构成。对于三节 RC 电路,其最大相移可以接近于二百七十度。有可能 在某一特定的频率下使其相移为一百八十度,满足相位平衡条件,合理的选取元件及元件 参数,满足产生振荡条件和幅度平衡条件的电路就会产生振荡。 图三这是一个 RC 文式桥正弦波振荡电路。振荡原理与方案一相似。2. 4方案比较主要来比较一下方案一和方案二,两种方案都 1 1MHz的低频信号。方案一采用的是 RC 文式桥正弦波振荡电路,它主要由一个文式桥振荡电路和一个由两个反向并联的二极 管组成的稳幅电路组成。方案二采用的是一个反相比例输入放大器和电压跟随器以及三节

4、RC 相移网络组成的 RC 相移式电路。振荡和稳幅公用一条线路。 RC 文式桥电路的特点有 输出幅度稳定,非线性失真比较小,频率变化易调节,输出波形比较好,但是线路相对复 杂。相移式电路的线路相对简单,但是频率不易调节,输出波形也不够稳定。因此在最终 的实现方案中还是选择了 RC 文式桥振荡电路。3实现方案最终的实现方案采用的是 RC 文式桥正弦波振荡电路,电路图如下: 图四 实现方案由图可见这个电路由 R 1和 C 1组成的振荡电路以及D 1和D 2反相并联组成的稳幅电 路构成。振荡电路的作用是使反馈网络形成正反馈,产生振荡。稳幅电路的作用是利用了 电流增大时二极管动态电阻减小,电流减小时二

5、极管动态电阻增大的特性,加入非线性环 节,从而使输出电压稳定,此时闭环电压增益为 A F =1+(R 2+RV1 R 4,通过计 算可得 A F 约为 3;当输出电压信号较小时,二极管的工作电流较小,电路的增益较大,引起增幅振荡过程。当输出幅度达到一定程度,二极管工作电流大,动态电阻小,电路的增 益下降,电路的输出电压幅值不再上升,电路为等幅度振荡,最后达到稳定幅度的目的。 由此可见,通过一个振荡电路及稳幅电路,这个电路图的实现是可能的。RV 1的作用是调节输出波形,使输出波形无非线性失真。通过计算及联合所得到的元件的阻止或者电容大小等,我们最终采用的电容大小均为 0. 033uF, R 1和

6、 R 4均为 10K, R 2为 20K,R 3为 15K, 测量 RV 1可以知道它所能达到的最大的阻值是 50K.以下是测试电路的布线图 图五 布线图4调试过程及结论我们是在三十号早上进行调试的,在此之前,我们通过计算和联系手中的元件,确定 了各个部分元件值的大小,并且已经连好了线路,通过多番检查,可以确定线路无误。调 试的那天由于我们去的不算早,而电流源和示波器都有限,所以刚到的时候我们没有电源 和示波器可用。最后采用的办法是与别人共用一个电流源进行调试。但是两个或者多个电 路并联在一个电流源上是不被允许的,估计也会对电路的调试结果造成一定的影响。在最 后的时候我们使用的还是独立的一台直

7、流电流源和一台示波器。刚开始调试的时候毫无进 展,示波器始终都无法显示出波形,最后检查发现我们的集成块接反了,幸好由于负端没 有连上,并没有使得正负极都接反,所以集成块没有损坏。正确连接集成块以后,示波器出现不稳定的小波形,但是调节滑动变阻器波形不改变,且形状与我们预计所应该得到的 波形不同,幅度与频率都过小,通过观察知道,这个波形并不是电路的输出正弦波,而是 干扰波,也就是说我们是试验还未成功。我们再次检查了线路,发现线路并没有问题,利 用万用表来测量电阻和电容及导线,发现这些也并没有损坏,由此我们怀疑是否是面包板 存在问题,所以我们决定改变位置重新连一次线路。这次连线力求简单明了,少用线,

8、以 防止接触不良等问题给我们的测试造成阻碍的可能性,最终的连线图即如上面的布线图所 示。检查线路无误以后重新开始试验,发现,波形仍然不能出现,或者出现的是空气中的 干扰波。这时候指导试验的学长提出一个问题,即面包板横着的一排有可能是不导通的, 即我们用于接地的一排可能并不等电位。我们利用万用表测电阻的部分去测试,即若是两 点间导通则电阻为零,不导通则电阻无穷大来判定两点间是否是等电位的。通过测试,果 然发现接地端并不等电位,我们于是用导线将不导通的地方连接起来。同时,学长指出我 们的集成块的负端没有连接到接地端。出现这样的错误令我们都觉得很懊恼。改正了以上 所提到的两个问题以后,我们再次进行测

9、试。通过不断的调节,最终我们得到了比较理想 的波形(如下所示 ,波形不失真,频率大约为 450HZ, 而通过计算可以知道理论上 得到的输出波应该大致为 483HZ, 由此可见试验结果大致符合理论,而误差产生的原 因是因为元件误差,如电阻阻值和标明或者是测试的不完全符合,导线存在着电阻,元器 件之间接触不良。 导线和面包板之间接触不良。 直流电源输出不稳定, 也不一定就是 12V , 这些问题都有可能出现,也使得正弦波并不一定没有失真。但是最终的调试结果是我们得 到的最好的结果,由下图也可以看出还算比较完美,所以在老师检查以后我们最终确定试 验成功。武汉理工大学专业课程设计(一) 课程设计说明书

10、 图六 波形图 心得体会 这一次试验可以说是我们第一次做课程设计, 从选题到预答辩到完成分组, 连接线路, 调试和写报告,时间并不完全是充分的,但是完成各个环节的任务还是绰绰有余。选题的 时候我们认为这个题目比较有意义,并且大概符合我们的能力,所以就选择了它。这个课 题任课老师在上课的时候并没有仔细完全的讲解过,要想理解这部分的内容,我们必须通 过自己的努力再次好好的去看课本资料。预答辩之前要自己设计方案,当时并没有对于老 师的“越多越好”做出更多的理解,并且由于选题的时候我们得到的题目是 RC 正弦波振 荡电路,所以在自行设计实验方案的时候,我就局限在了 RC 正弦波振荡电路中进行设计, 仅

11、仅只做了桥式振荡电路和相移式振荡电路两种形式的电路。直到预答辩的时候才发现了 这一问题。但是已经来不及去寻找设计其余的电路了。我选择的电路都是比较具有代表性 的电路。重点还是放在了理解它的实现原理上了。所幸的是最后得到的试验方案也是 RC 正弦波振荡电路,并没有使我措手不及。拿到电路图以后我们就可是兴致勃勃的连电路, -6- 武汉理工大学专业课程设计(一) 课程设计说明书 但是是第一次使用面包板,我对于它的实现原理并不了解,所以得到的电路虽然简单却还 是下不了手,只能在了解了面包板的工作原理以后才开始连电路。我们总结出连电路的要 点是:第一点,尽量使线路最简单,因为面包板经过多次使用可能有一些

12、问题,导线也会 因为各种原因出现问题或者是使电路出现问题,所以要使线路尽量简单,减少这些问题出 现的可能性。第二点,导线剥出来连接面包板的部分应该稍稍长一点,这样才能使面包板 和导线之间接触良好。第三点,导线或者说是线路要尽量避免交叠,因为交叠的部分会对 输出波形产生干扰,影响实验。第四点,线路的各部分应该要比较明显易判断,这样在之 后的实验中如果出现问题的话可以比较容易的检查出来,不至于浪费时间。连接好线路以 后当然要注意检查, 因为只有在确定线路无误之后, 如果出现问题我们才能大胆的去假设。 在调试过程中我们也出现了很多问题,直到调试快要结束的时候才调出了波形,由此 可见,虽然电路简单,原

13、理也不会很难理解,但是真正在操作的时候还会有很多问题出现, 我们所要做的是尽量减少这些问题出现的可能性,尽量避免某些可能出现的问题的出现。 试验过程中一旦出现了问题,很容易让人心烦气躁,所以耐心仔细的去发现问题就非常重 要,同时也要知道,在试验过程中可能出现的问题是多种多样的,也不一定是完全可以预 知并且可以通过观察就能够发现的,所以在调试过程中如果出现问题的话我们就应该要大 胆的去假设,在确定线路连接这些人力可以控制的问题不会有误以后,由小到大的去确定 自己的错误假设是否正确。我认为我们在试验中不应该过早的去否定自己的线路,选择重 新连接的时候要慎重,因为重新连接有可能会出现其它的问题,且浪

14、费时间,但是在确定 了其它问题出现的可能性为零或者很小时, 重新连接时最好的选择, 通过两次线路的对比, 可以让我们更容易的去发现问题。 这次试验让我知道了,试验时建立在理论的基础上的,只有足够扎实的理论知识能够 更深切的领会试验内容,更容易的发现问题,因此要想在试验中比较顺利,我们必须要学 会理论知道。但是我也知道了全面深刻的理论知识并不是一切,因为在试验中出现的很多 问题不是单单靠理论知识就能够解决的,我们在试验中药培养自己发现问题,应对问题, 解决问题的心态和能力。这些能力的获得和培养超越一切的结果,反而结果如何并没有那 么重要了。我觉得在解决问题之前出现的所有问题都不是问题,所有我们大

15、可不必抱着烦 躁的心态去面对它们。因为在之后的试验中,我们还将面对更多的问题,我们该拥有的应 该是应对更多问题的能力。 -7- 安徽理工大学数据结构课程设计说明书题目: 稀疏矩阵的运算院 系: 计算机科学与工程学院 专业班级: 计算机10-*班 学 号: 202130* 学生姓名: * 指导教师:2021年 12 月 28 日安徽理工大学课程设计(论文)任务书计算机科学与工程 学院2021年 11 月 8 日安徽理工大学课程设计(论文)成绩评定表目 录1 问题描述 . 12 需求分析 . 13 总体设计 . 23.1 Matrix结构的定义 . 23.2 系统流程图 . 34 详细设计 . 4

16、4.1 “菜单”界面 . 44.2 建立矩阵. 44.3 显示矩阵. 64.4 矩阵的转置 . 74.5 矩阵的加法运算 . 84.6 矩阵的减法运算 . 94.7 矩阵的乘法运算 . 95 程序运行 . 115.1 输入矩阵. 115.2 矩阵转置. 115.3 矩阵加法. 125.4 矩阵减法. 125.5 矩阵乘法. 125.6 退出及错误提示 . 136 总结 . 13参考文献 . 14I1 问题描述(1) 题目内容:设计稀疏矩阵运算系统实现两个稀疏矩阵的加法、减法、乘法以及转置操作。(2) 基本要求: 存储结构选择三元组存储方式; 实现一个稀疏矩阵的转置运算; 实现两个稀疏矩阵的加法

17、运算; 实现两个稀疏矩阵的减法运算; 实现两个稀疏矩阵的乘法运算。(3) 设计目的:通过本次课程设计,了解稀疏矩阵的一些基本运算操作,并通过相关的程序代码实现。2 需求分析经过本次的课程设计,我认为稀疏矩阵运算系统主要实现的功能如下:(1) 建立矩阵:只有先建立了矩阵,才能够对矩阵进行运算操作,包括建立矩阵A和矩阵B;(2) 转置运算操作:对矩阵A或者矩阵B进行转置运算,输出相应的转置矩阵;(3) 四则运算操作:该步骤由两个矩阵同时参与,对其进行加法运算(A+B)、减法运算(A-B)以及乘法运算(A*B和B*A);(4) 退出:当做完矩阵的运算操作之后,就可以点击它退出该界面。在这次设计中用到

18、了一些变量和函数,例如:void Display(Matrix M);int Max(int i,int j);Matrix Zero(Matrix M)等,下面会做进一步详细的介绍。13 总体设计3.1 Matrix结构的定义struct Matrix;操作集合:(1) Matrix Enter(Matrix M); /建立矩阵M(2) void Display(Matrix M); /显示矩阵M(3) void Transpose(Matrix M); /M矩阵的转置/求和运算 A+B/求差运算 A-B int H; int L; /矩阵的行数 /矩阵的列数 int fly; /矩阵中的非

19、零元个数 int zhiMaxsizeMaxsize;/非零元值所在行所在列 (4) void Add(Matrix M,Matrix N); (5) void Sub(Matrix M,Matrix N);(5) void Multi(Matrix M,Matrix N); /求积运算 A*B(6) int Max(int i,int j); /求最大值(7) Matrix Zero(Matrix M); /矩阵所有元素赋值为023.2 系统流程图该运算系统的系统流程图如图1所示:图1 系统流程图34 详细设计4.1 “菜单”界面进入稀疏矩阵运算系统后的“菜单”界面如图2所示。图2 “菜单”

20、界面4.2 建立矩阵矩阵在建立之后才能够进行运算操作,建立矩阵A和矩阵B,调用函数Enter(M),首先根据所输入的矩阵M的行数H和列数L,建立H*L的矩阵M,并且调用函数Zero(M)将其所有元素均赋值为0;其次再根据所输入矩阵M的非零元个数fly做循环控制变量,按提示输入非零元所在的行h和列l以及非零元的值,如果输入的行h或者列l大于矩阵M的行H或列L,则提示输入错误;最后将非零元的值保存在矩阵M中的相应位置。程序如下: Matrix Enter(Matrix M) /建立矩阵4coutM.HM.L;coutM.fly;cout(M.H*M.L)M=Zero(M);int h;int l;

21、for(int n=1;n=M.fly;n+) cout请输入第nhl; if(hM.H|lM.L) / 行列输入错误提示 5 cout非零元个数多于矩阵元素总数,请重新输入!endl; coutM.fly; /输入非零元所在的行、列和值 cout行列输入错误,请重新输入:endl; cout请重新输入第nhl; coutM.zhihl; coutendl;return M;注:该函数中调用的Zero()函数的功能为将矩阵M根据行数H和列数L把所有的元素赋值为0,代码如下:Matrix Zero(Matrix M)/矩阵所有元素赋值为0for(int i=1;i=M.H;i+)for(int

22、j=1;j=M.L;j+) M.zhiij=0;return M;4.3 显示矩阵建立好矩阵以后,为了验证所建立的矩阵是否成功,以及在后期运算时矩阵的显示,设计该函数,能更直观的看到输入以及输出的矩阵,代码如下: void Display(Matrix M) /显示矩阵int count=0; cout矩阵为:endl; for(int i=1;i=M.H;i+)6 for(int j=1;j=M.L;j+) printf(%-4d,M.zhiij); count+; if(count=M.L) coutendl; count=0; coutendl;4.4 矩阵的转置该函数实现的是矩阵A或矩

23、阵B的转置操作,通过对矩阵的行和列进行调换,利用for()循环语句实现对矩阵A或矩阵B的转置,其代码如下:void Transpose(Matrix M) /矩阵转置C.H=M.L; C.L=M.H; cout原来的; Display(M); for(int i=1;i=M.L;i+) for(int j=1;j=M.H;j+)7 C.zhiij=M.zhiji; cout转置后的; Display(C);4.5 矩阵的加法运算实现两个矩阵之间的加法运算,即A+B,其代码如下: void Add(Matrix M,Matrix N)8 /A+B int n1=Max(M.H,N.H); int

24、 n2=Max(M.L,N.L); C.H=n1; C.L=n2; C=Zero(C); for(int i=1;i=n1;i+) for(int j=1;j=n2;j+) C.zhiij=M.zhiij+N.zhiij; cout A+B 的运算结果; Display(C);4.6 矩阵的减法运算实现两个矩阵之间的减法运算,即AB,其代码如下:void Sub(Matrix M,Matrix N) int n1=Max(M.H,N.H); int n2=Max(M.L,N.L); C.H=n1; C.L=n2; C=Zero(C); for(int i=1;i=n1;i+) for(int

25、j=1;j=n2;j+) C.zhiij=M.zhiij-N.zhiij; /A-B cout A-B 的运算结果; Display(C);4.7 矩阵的乘法运算实现两个矩阵之间的乘法运算,即A*B,如果矩阵A的列数和矩阵B的行数不相同,则无法进行乘法运算,系统会提示错误,其代码如下: void Multi(Matrix M,Matrix N) /A*B9 if(M.L!=N.H) else C.H=M.H; C.L=N.L; C=Zero(C); for(int i=1;i=Maxsize;i+) for(int j=1;j=Maxsize;j+) for(int k=1;k=Maxsize

26、;k+) C.zhiij+=M.zhiik*N.zhikj; if(M.L=N.H) cout矩阵A的列数和矩阵B的行数不相同,无法进行乘法运算!n; cout运算结果; Display(C);105 程序运行5.1 输入矩阵运行该运算系统,进入“菜单”选项以后,输入“1”,选择“输入矩阵A”,运算结果如图3所示;输入“2”,选择“输入矩阵B”,运算结果如图4所示:图3 输入矩阵A 图4 输入矩阵B5.2 矩阵转置输入矩阵A和矩阵B以后,在“菜单”提示下,输入“3”,进行矩阵A的转置,运算结果如图5所示;输入“4”,进行矩阵B的转置,运算结果如图6所示:图5 矩阵A的转置 图6 矩阵B的转置1

27、15.3 矩阵加法在“菜单”提示下,输入“5”,进行两个矩阵的加法运算,即A+B,运算结果如图7所示:图7 矩阵加法5.4 矩阵减法在“菜单”提示下,输入“6”,进行两个矩阵的加法运算,即A-B,运算结果如图8所示:图8 矩阵减法5.5 矩阵乘法在“菜单”提示下,输入“7”,进行两个矩阵的第一种乘法运算,即A*B,12运算结果如图9所示;输入“8”,进行两个矩阵的第二种乘法运算,即B*A,运算结果如图10所示:图9 矩阵乘法1(A*B) 图10 矩阵乘法2(B*A)5.6 退出及错误提示算法在运行时还有退出及错误提示功能,在“菜单”提示下,输入“0”则退出系统,如图11所示;若输入08以外的数

28、字,则会出现错误提示,如图12所示:图11 退出 图12 错误提示6 总结通过对数据结构这门课的学习,我了解到:“数据结构”在计算机科学中是一门综合性的专业基础课。而我们现在所学的数据结构是C语言版的,是建立在C语言基础之上的,若是C语言基础知识不牢固,要想学好数据结构这门课程是有一定的困难的。所以在学习数据结构这门课程的时候,也顺便复习了C语言的相关内容,加深了我对C语言的理解和应用,并且也深深体会到了数据结构这门课程的重要性。13在本次课程设计过程中,我体会到自己所学的东西太少了,很多都不知道,也遇到了不少实际问题,使我发现了在学习过程中的不足。这次课程设计,我本来打算做的是MFC可视化的

29、人机友好界面,但是由于在程序设计以及运行时出现了太多目前无法解决的问题,只好退而求其次,应用了DOS界面来完成本次课程设计。在代码设计时,也出现了一些基本的C语言语法错误,如函数的嵌套定义等,在老师和同学的帮助下都一一解决了,这也反映了我C语言基础知识的不扎实,以后应在学习过程中加强这方面的学习。通过本次课程设计,我对数据结构这门课有了进一步的理解。数据结构这门课最主要的内容在于算法思想,而程序编写次之。在编写程序时,如果算法思想 是正确的,那么这个程序就已经成功了一多半。算法思想在数据结构中占有重要地位,如果说C语言是数据结构这座程序大厦的根基的话,那么算法思想就是构成大厦的一砖一瓦,再好的

30、根基离了砖瓦也构不成大厦。所以,要想学好数据结构这门课程,平时不只要加强程序的编写,更要多思考算法思想,加强对算法思想的锻炼和理解。本次课程设计得到了老师和很多同学的帮助,在此一并表示感谢。参考文献1秦锋.数据结构(C语言版).北京:清华大学出版社,20212温秀梅,丁学均.Visual C+面向对象程序设计.北京:清华大学出版社,20213何钦铭,颜晖.C语言程序设计.北京:高等教育出版社,202114攀枝花学院学生课程设计(论文)题 目:学生姓名: 学 号: 所在院(系): 专 业: 班 级: 指 导 教 师: 职称:年 月 日攀枝花学院教务处制攀枝花学院本科学生课程设计任务书注:任务书由

31、指导教师填写。课程设计(论文)指导教师成绩评定表稀疏矩阵的操作1.课程设计的目的本课程设计是为了配合数据结构课程的开设,通过设计一完整的程序,使学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并用TC上机调试的基本方法。利用三元组实现稀疏矩阵的有关算法。2问题描述2.1稀疏矩阵采用三元组表示,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C。2.2求出A的转置矩阵D,输出D。3. 基本要求稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。以“带行逻辑链接信息”的三元组顺序表表示稀

32、疏矩阵,实现两个矩阵相加、相减和相乘的运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。4.结构设计4.1.以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。4.2.稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。4.3.首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。可设矩阵的行数和列数均不超过20。4.4.程序可以对三元组的输入顺序加以限制,例如,按行优先。注意研究教材的算法,以便提高计算效率。5.在用三元组表示稀疏矩阵时,相加或相减所得结果矩阵应该另生成,乘积矩

33、阵也可用二维数组存放5.算法思想5.1主函数设置循环和选择语句进行运算循环和选择,进行稀疏矩阵的加法,减法,乘法,转置和是否继续运算5个分支开关进行运算选择。5.2设置函数分别实现稀疏矩阵的输入,输出,加法,减法,乘法。5.3在数组结构体中设置存放每行第一个非零元在其数组存储结构单元的位置的存储单元,若该行无非零元,则存为06.模块划分6.1typedef struct存放各行第一个非零元在存储数组中的位置,若该行无非零元,则其rpos值为零6.2 createsmatrix(rlsmatrix *M) 矩阵输入函数,输入各行非零元及其在矩阵中的行列数6.3 FasttransposeRLSM

34、atrix(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#define MAXSIZE 100 /* 非零元个数的最大值

35、 */typedef struct tripleint i,j; /* 行下标,列下标 */int e; /* 非零元素值 */triple;typedef struct tsmatrixtriple dataMAXSIZE+1; /* 非零元三元组表,data0未用 */int mu,nu,tu; /* 矩阵的行数、列数和非零元个数 */* 各列第一个非零元的位置表rpos0未用 */rlsmatrix;7.2创建稀疏矩阵矩阵的行数,列数,和非零元素的个数并按行序顺序输入第%d个非零元素所在的行(1%d),列(1%d),元素值。createsmatrix(rlsmatrix *M) /* 创

36、建稀疏矩阵M */int e,i,m,n;M-data0.i=0; /* 为以下比较顺序做准备 */printf(请输入矩阵的行数,列数,和非零元素的个数:);scanf(%d,&M-mu);scanf(%d,&M-nu);scanf(%d,&M-tu);for(i=1;itu;i+)printf(请按行序顺序输入第%d个非零元素所在的行(1%d),列(1%d),元素值:,i,M-mu,M-nu); scanf(%d,&m);scanf(%d,&n);scanf(%d,&e);if(mM-mu|nM-nu) /*行或列超出范围 */printf(行或列超出范围);getch();exit();

37、if(mdatai-1.i|m=M-datai-1.i&ndatai-1.j) /*行或列的顺序有错*/printf(行或列的顺序有错);getch();exit();M-datai.i=m;M-datai.j=n;M-datai.e=e;7.3求矩阵的快速转置cpos为存放每列的第一个非零元素的地址,temp为中间变量对cpos对初始化,判断初值为0则为cpos赋值,然后进行转置。void transposesmatrix(rlsmatrix M,rlsmatrix *T) /* cpos存放每列的第一个非零元素的地址,temp中间变量 */int i,m,*cpos,*temp,k=0;T

38、-mu=M.nu;T-nu=M.mu;T-tu=M.tu;cpos=(int *)malloc(M.mu*sizeof(int);if(cpos=NULL)exit();temp=(int *)malloc(M.mu*sizeof(int);if(temp=NULL)exit();/* 对cpos对初始化,初值为0 */*(cpos+1)=0;for(i=1;i=M.nu;i+)for(m=1;m1)*(cpos+i)=*(temp+i-1)+1;free(temp);for(i=1;idata*(cpos+M.datai.j).i=M.datai.j;T-data*(cpos+M.datai

39、.j).j=M.datai.i;T-data*(cpos+M.datai.j).e=M.datai.e;(*(cpos+M.datai.j)+;free(cpos);7.3矩阵的相乘设置两个指针,分别指向M,N的第一个非零元位置,移动指针进行比较,得出相加后的新矩阵非零元。定义Qe为矩阵Q的临时数组,矩阵Q的第i行j列的元素值存于*(Qe+(M.datai.i-1)*N.nu+N.dataj.j)中,初值为0,结果累加到Qe,*Qe矩阵中,因为M的每一行和N的每一列相乘都是T的一个元素,不管它是零或非零,当M的第一行和N的第一列相乘则得T的第一个元素;当M的第一行和N的第二列相乘则得T的第二个

40、元素,M的第i行和N的第j列相乘则得T的第p个元素;根据归纳法得p=(i-1)*N的列数+j。multsmatrix(rlsmatrix M,rlsmatrix N,rlsmatrix *T)int i,j,Qn=0;int *Qe;if(M.nu!=N.mu)printf(两矩阵无法相乘);getch();exit();T-mu=M.mu;T-nu=N.nu;Qe=(int *)malloc(M.mu*N.nu*sizeof(int); /* Qe为矩阵Q的临时数组*/for(i=1;i=M.mu*N.nu;i+)*(Qe+i)=0;/* 矩阵Q的第i行j列的元素值存于*(Qe+(M.dat

41、ai.i-1)*N.nu+N.dataj.j)中,初值为0 */ for(i=1;i=M.tu;i+) /* 结果累加到Qe */for(j=1;j=N.tu;j+)if(M.datai.j=N.dataj.i)*(Qe+(M.datai.i-1)*N.nu+N.dataj.j)+=M.datai.e*N.dataj.e;for(i=1;i=M.mu;i+) /*Qe矩阵中,因为M的每一行和N的每一列相乘都是T的一个元素,不管它是零或非零 */for(j=1;jdataQn.e=*(Qe+(i-1)*N.nu+j);T-dataQn.i=i;T-dataQn.j=j;free(Qe);T-tu=Qn;return ;7.4矩阵的相加编写一个求两个对称矩阵相加运算的函数。设对称矩阵的数据元素为整数类型,对称矩阵采用压缩存储方法存储,要求和矩阵采用非压缩方法存储。设置两个指针,分别指向M,N的第一个非零元位置,移动指针进行比较,得出相加后的新矩阵非零元计算各行第一个非零元素在存储数组中的位置,若该行无非零元,则rpos值为零。HeRLSMatrix(RLSMatrix *M,RLSMatr

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com