西北工业大学数据结构试验报告DS03
- 格式:doc
- 大小:198.50 KB
- 文档页数:16
数字电路技术实验报告一、学号: 姓名: 日期:实验目的:(1).用数码显示管实现0.1.2.3.4.0.3.0.3.4;(2).用74LS90,5421BCD码实现模十计数;二、实验设备:(1).数字电路试验箱;(2).数字双踪示波器;(3).函数信号发生器;(4).集成电路: 74LS90;(5).集成电路: 74LS00;三、实验原理:计数是一种最简单的基本运算计数器在数字系统中主要是对脉冲的个数进行计数以实现测量、计数和控制的功能同时兼有分频功能。
计数器按计数进制分为二进制计数器十进制计数器和任意进制计数器按计数单元中触发器所接收计数脉冲和翻转顺序分为异步计数器同步计数器按计数功能分有加法计数器减法计数器可逆双向计数器等。
异步清零2-5-10进制异步计数器74LS9074LS90是一块2-5-10进制异步计数器它由四个主从JK触发器和一些附加门电路组成其中一个触发器构成一位二进制计数器另三个触发器构成异步五进制计数器。
在74LS90计数器电路中设有专用置0端R01 R02和置9端S91 S92 当R1=R2=S1=S2=0时时钟从CP1引入Q0输出为二进制时钟从CP2引入Q3输出为五进制时钟从CP1引入Q0接CP2即二进制的输出与五进制的输入相连则Q3Q2Q1Q0输出为十进制8421BCD 码时钟从CP2引入而Q3接CP1即五进制的输出与二进制的输入相连Q0Q3Q2Q1输出为十进制5421BCD码。
74LS90管脚定义74LS00管脚定义74LS90功能表四、实验内容:(1).用74LS90实现0123403034 (2).用5421BCD实现计数;五、实验结果:(1).列出真值表;(2).画出卡诺图;(3).按化简结果连接图;(循环数字列表)(1).F8=0;.四变量卡诺图:F 2=Q .Q .Q .Q 1020;F 1=Q 1;(5).把F 8接地;F 4接Q3;F 2与相接Q .Q .Q .Q 1020;F 1与Q 1链接;六、心得体会:这次实验综合性较强, 主要考察了我们从实际问题中抽象出逻辑函数的能力。
一、实验名称数据结构实验二:链表的基本操作二、实验目的1. 理解链表的基本概念和结构。
2. 掌握链表的创建、插入、删除、查找等基本操作。
3. 提高编程能力,巩固数据结构知识。
三、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019四、实验原理链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
链表具有以下特点:1. 无固定长度,可以根据需要动态地添加或删除节点。
2. 链接方式灵活,便于实现各种操作。
3. 适合存储具有动态变化的数据。
本实验主要实现以下功能:1. 创建链表:根据用户输入的数据,创建一个单链表。
2. 插入节点:在链表的指定位置插入一个新节点。
3. 删除节点:删除链表中的指定节点。
4. 查找节点:在链表中查找一个指定的节点。
5. 打印链表:遍历链表并打印所有节点数据。
五、实验步骤1. 创建链表```cppstruct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(nullptr) {}};ListNode createList() {ListNode head = nullptr, tail = nullptr;int data;cout << "请输入链表数据(输入-1结束):" << endl; while (cin >> data && data != -1) {ListNode node = new ListNode(data);if (head == nullptr) {head = node;tail = node;} else {tail->next = node;tail = node;}}return head;}```2. 插入节点```cppvoid insertNode(ListNode head, int data, int position) { ListNode node = new ListNode(data);if (position == 0) {node->next = head;head = node;} else {ListNode current = head;for (int i = 0; i < position - 1; ++i) {if (current == nullptr) {cout << "插入位置超出链表长度!" << endl; return;}current = current->next;}node->next = current->next;current->next = node;}}```3. 删除节点```cppvoid deleteNode(ListNode head, int position) {if (head == nullptr) {cout << "链表为空!" << endl;return;}if (position == 0) {ListNode temp = head;head = head->next;delete temp;} else {ListNode current = head;for (int i = 0; i < position - 1; ++i) {if (current == nullptr) {cout << "删除位置超出链表长度!" << endl; return;}current = current->next;}if (current->next == nullptr) {cout << "删除位置超出链表长度!" << endl;return;}ListNode temp = current->next;current->next = temp->next;delete temp;}}```4. 查找节点```cppListNode findNode(ListNode head, int data) { ListNode current = head;while (current != nullptr) {if (current->data == data) {return current;}current = current->next;}return nullptr;}```5. 打印链表```cppvoid printList(ListNode head) {ListNode current = head;while (current != nullptr) {cout << current->data << " ";current = current->next;}cout << endl;}```六、实验结果与分析通过以上步骤,成功实现了链表的基本操作。
1.ODBC配置以及程序调试:(50分)(1)配置一个ODBC数据源,要求数据源名称:student,其中包含s(学生信息)表。
用系统工具配置ODBC,点击“添加”:出现以下对话框,选中SQL Sever,点击完成:在出现的对话框中设置属性,如图,点击下一步:点击下一步后出现如下,更改默认数据库,点击下一步:在出现的对话框中点击测试连接后出现测试成功的对话框:点击确定退出ODEC数据源管理器。
(2)阅读并运行实验给出的例子程序,理解ODBC编程,要求简单写出自己对这段程序的理解或者流程图,并且请给出程序运行结果示例图。
对程序的流程:1.定义句柄和变量(句柄包括环境句柄,连接句柄,语句句柄)2.初始化环境(1).分配环境句柄(2).设置管理环境属性(3).连接数据库3.建立连接(1)分配连接句柄(2)连接失败则返回错误值4.初始化语句句柄5.执行语句6.处理结果集合7.中止处理(1).释放语句句柄(2).断开数据源(3).释放连接句柄(3).释放环境句柄结果显示:2.参考给出的ODBC编程示例,使用ODBC技术,编写一个简单的程序,包含对数据库SPJ的连接,查询,插入,修改和删除。
(50分)插入数据:insert into s values('S6','胜利','47','北京')检验数据库内:删除数据:Delete from s where sno=‘S1’查询数据:Select pno,pname from P更新数据:update s set status='100' where sno='S33.用JDBC实现对数据库student的连接,查询,插入,修改和删除。
(选做实验)二.实验中出现的问题以及解决方案(对于未解决问题请将问题列出来)除了标题内容以外,该部分内容中还可以写对于实验的一些感受,建议,意见等。
题目:1、修改udp实验程序完成两台电脑通讯2、修改tcp实验程序完成两台电脑通讯3、修改IP源代码实现只调用一个函数**: ***学号:**********班号:10011303时间:2015-12-25计算机学院目录摘要1 目的 .................................................... 错误!未定义书签。
2 要求 (1)3 相关知识 (1)4 实验内容及过程................................. 错误!未定义书签。
5参考文献 .. (4)1、实验目的1.学习UDP和TCP及IP的通讯原理。
2.掌握Socket的编程方法。
3.培养学生自己的创新实验的能力。
4、训练修改实验代码能力。
2、实验要求1、熟悉UDP和TCP通讯的原理及socket编程。
2、自己修改UDP和TCP协议代码中的错误部分,完成两台电脑之间通讯。
3、修改IP源代码使所有外部调用函数都放在一个主函数里面。
3、相关知识1、UDP协议UDP协议[2]的全称是用户数据包协议[3],在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。
在OSI模型中,在第四层——传输层,处于IP协议的上一层。
UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
UDP用来支持那些需要在计算机之间传输数据的网络应用。
包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。
UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在现在,UDP仍然不失为一项非常实用和可行的网络传输层协议。
与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。
根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。
UDP协议的主要作用是将网络数据流量压缩成数据包的形式。
《数据结构与算法统计》实验报告——实验三一、实验目的1. 熟悉VC环境,掌握对二叉树的基本操作。
2. 在上机、调试的过程中,加强对二叉树的理解和运用。
3. 复习线性链表和递归4. 锻炼动手编程和独立思考的能力。
二、实验内容遍历二叉树。
请输入一棵二叉树的扩展的前序序列,经过处理后生成一棵二叉树,然后对于该二叉树输出前序、中序和后序遍历序列。
三、程序设计1、概要设计本程序包含三个模块:1.构造二叉树模块2.遍历二叉树模块3.主程序模块采用二叉链表作为存储结构。
(1)二叉树的抽象数据类型定义为:ADT BinaryTree {数据对象D:D是具有相同特性的数据元素的集合。
数据关系R:若D=Φ,则R=Φ,称BinaryTree为空二叉树;若D≠Φ,则R={H},H是如下二元关系;(1)在D中存在惟一的称为根的数据元素root,它在关系H下无前驱;(2)若D-{root}≠Φ,则存在D-{root}={D1,Dr},且D1∩Dr =Φ;(3)若D1≠Φ,则D1中存在惟一的元素x1,<root,x1>∈H,且存在D1上的关系H1 ⊆H;若Dr≠Φ,则Dr中存在惟一的元素xr,<root,xr>∈H,且存在上的关系Hr ⊆H;H={<root,x1>,<root,xr>,H1,Hr};(4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树;(Dr,{Hr})是一棵符合本定义的二叉树,称为根的右子树。
基本操作:CreatBiTree(BiTree &T)操作结果:按先序次序建立二叉链表表示的二叉树TPreOrderTraverse(BiTree T,int (*visit)(char e))初始条件:二叉树T已经存在,visit是对结点操作的应用函数操作结果:先序遍历二叉树T ,对每个结点调用visit函数仅一次;一旦visit()失败,则操作失败。
西北工业大学计算机学院计算机操作系统实验指导张羽谷建华王海鹏编2009-3一、操作系统课内实验目的:计算机操作系统课内实验作为操作系统课堂理论教学的辅助部分是加强计算机科学与技术专业实践的重要环节之一。
由于操作系统自身的庞大和复杂,造成学生在学过操作系统课程后,总有一种“雾里看花”的感觉,即只是支离破碎的了解了一些操作系统局部知识,而很难将这些知识融会贯通,对于运用操作系统知识从事设计和应用更是无从谈起。
本实验课的目的就是力图解决上述问题。
二、操作系统实验整体安排和要求:1.课内实验将按以下三个方面进行:对常用的系统调用命令的使用方式有一个较熟练的掌握;对典型操作系统的编程基础知识和机制进行学习和了解;运用一些重要的系统调用编写程序模块,对操作系统中的一些重要概念和典型算法进行实现或验证。
实验内容如下:实验一 Linux操作系统的安装及使用实验二 Linux Shell程序实验三 vi编辑器的学习和使用实验四 观察进程的并发性实验五 构造进程家族树实验六 理解进程的独立空间实验七 请求分页存储管理设计操作系统的课内实验共7个,根据具体上机条件和学时选做2~3个,其中实验2、3中必选1个,实验4~6必选,实验7可选做。
由于所有实验均在Linux环境下工作,用C语言编程,因此学生要具备一定的C语言编程能力,同时要求在充分预习实验内容中相关知识后,再进行实验的上机环节。
另外由于操作系统实验有些题目具有一定的难度和规模,建议采用分组方式进行。
2.操作系统课内实验考核:预习报告30%,上机实验35%,实验报告35%。
3.预习报告内容包括两部分,一是对相关知识学习的书面总结(知识综述和参考文献);二是对本次实验的分析报告(主要针对涉及算法的题目)。
实验报告内容主要包括本次实验的上机结果(数据结构、程序框图、源程序文档和运行情况)以及实验中难点分析和心得。
4.实验软、硬件环境要求:80386DX以上兼容机,可以使用Intel、AMD、CRIX处理器,对80386或80486SX的CPU建议具有数字协处理器。
《数据结构》实验报告一、题目要求有输入界面(图形或文字界面都可),能区分加法、减法、乘法和转置;能处任意输入的典型数据和进行出错数据处理(例如乘法,当第一个矩阵的列数不等于第二个矩阵的行数时);必须采用三元组作存储结构,不能采用数组等形式;输出要求用矩阵的形式输出(即习题集136页的形式),当第一个矩阵的行数不等于第二个矩阵的行数时,注意如第三个乘法的形式输出二、算法实现在本次实验中,算法比较简单,所涉及的函数比较少,一共有:创建稀疏矩阵、输出稀疏矩阵、矩阵的乘法、矩阵的加法、矩阵的减法、矩阵的转置。
因为是稀疏矩阵要求以三元组的方式输入,节约了很多时间和空间,只需输入行列下标和非零元即可。
在输出矩阵时,通常以方阵的形式输出。
基本操作:CreateSMatrix(&M); //操作结果:创建稀疏矩阵M.Print SMatrix(M);//初始化条件: 稀疏矩阵M存在.//操作结果:输出稀疏矩阵M.AddSMatrix(M,N,&Q);//初始化条件: 稀疏矩阵M与N的行数和列数对应相等.//操作结果:求稀疏矩阵的和Q=M+N.SubSMatrix(M,N,&Q);//初始化条件: 稀疏矩阵M与N的行数和列数对应相等.//操作结果:求稀疏矩阵的差Q=M-N.MultSMatrix(M,N,&Q);//初始化条件: 稀疏矩阵M的列数等于N的行数.//操作结果:求稀疏矩阵的乘积Q=M*N.TransposeSMatrix(M ,&Q);//初始化条件:存在稀疏矩阵M//操作结果:将稀疏矩阵行列互换输出。
功能模块调用关系图三、详细设计1、元素类型 主程序模块 创建稀疏矩阵模块调用矩阵运算模块输出矩阵方阵模块稀疏矩阵运算器 矩阵加法 矩阵减法 矩阵乘法 矩阵转置输入矩阵M 输入矩阵N输出运算结输入矩阵M 输入矩阵N 输出运算结输入矩阵M 输入矩阵N 输出运算结输入矩阵M 输出运算结果typedef struct{int i,j;//该非零元素的列下标和行下标ElemType e;}Triple;typedef struct{Triple data[MAXSIZE+1];//非零元三元组表,data[0]未用int mu,nu,tu;}TSMatrix;2、矩阵运算器void AddSMatrix(M ,N , &Q)void SubSMatrix(M ,N , &Q)void MultSMatrix(M ,N , &Q)void TransposeSMatrix(M ,&T)四、调试分析1、此程序的算法结构比较简单,只要理解了三元组,设计矩阵运算器的方法很简单。
《数据库原理》实验报告题目:实验二基本表的数据操作学号姓名班级日期2014302692 孟玉军16.10.13一. 实验内容、步骤以及结果1.在图形用户界面中对表中的数据进行更新。
(6分,每小题2分)(1)按照实验一图2.1-图2.4中所示数据,输入SPJ数据库所含四张表中的数据。
S表:P表:J表:SPJ表:(2)修改S表的任意一条数据把S表中S1的status数据进行了修改(3)删除S表的任意一条数据。
删除了S3的数据2.针对SPJ数据库,用SQL语句完成下面的数据更新。
(12分,每小题3分)(1)第五版教材第三章第5题的8-11小题。
红色零件颜色修改为蓝色:⑧UPDATE PSET COLOR=’蓝’WHERE SNO=’红’⑨由S5供给J4的零件P6改为由S3提供:Update SPJSet sno=’S3’Where sno=’S5’and pno=’P6’and jno=’J4’⑩从供应商关系中删除S2的记录,从供应关系表中删除相应的记录:DeleteFrom SWhere sno=’S2’DeleteFrom SPJWhere sno=’S2’11.请将(S2,J6,P4,200)插入供应情况关系:Insert into SPJValues (‘S2’,’ P4’,’J6’,200)3.针对SPJ数据库,用SQL语句完成下面的数据查询。
(52分,每小题4分) (1)第五版教材第三章第4题。
(5道小题)①:select distinct snofrom SPJwhere jno=’J1’②:select distinct snofrom SPJwhere jno='J1'and pno='P1'③:select snofrom SPJ,Pwhere jno='J1'and SPJ.pno=P.pno and color='红'④:select distinct jnofrom SPJwhere jno not in(select jnofrom SPJ,P,Swhere SPJ.sno=S.sno and city='天津'and SPJ.pno=P.pno and color ='红')⑤:select jnofrom SPJwhere pno in(select pno from SPJ where sno='S1' )group by jnohaving count(pno)=(select count(pno) from SPJ where sno ='J1')(2)第五版教材第三章第5题的1-7小题。
数字电子技术基础第三次实验报告、描述Quartusll 软件基本使用步骤① 编写Verilog 代码,用文本编辑器正确编写源文件,并经modelsim 仿真确认该电路设计正确。
② 打开Quartusll 软件,新建工程New project (注意工程名和设计文件的module 名保持一致),选择和开发板一致的 FPGA 器件型号。
■■pww n④编译,Start Compilation ,编译源文件(如有错误修改后,重新编译)。
I —f 1 UuM-JI 工 HfiaMi■sm •MITmHL 1 】it A**5KiiatiT^u^ri :i&1 u■审3T1H・”峠if-Ik r irM "小"=③添加文件,点击file->open,之后选择要添加的文件,并勾选 Add file to currentproject.■ 5r-w in¥ 口X.I M■tWIR fetawej. MtamM* E«Maa4inrv*nn♦ 1 Tl n .■EGvi I IPHIWIVE RHF 4- xsfflECA-ihaW MniWmUAf⑤查看电路结构,使用 Tool->RTL viewer 工具查看电路图结构,是否和预期设计一致。
rp M. Oi* >1 JiMiMdaOML <j| Al-O*ih| La ■D/»i -ii !Hbi.urmpM-羽r 嘴U 电Of■ >lir¥i-*U ■屮剑 f*lM W"M*h 1 $TW<tEQuartus Primer*rfw 杠 w* ■ « ■■! I Q » i 恆G|4OV :I4J ■忙ffl草* F■*■1.设计一款时钟上升沿触发的 D 寄存器TilbfilUL.X.■I:(■■i!|*ij JHft* I i ■i E. duqa.,卜r|il.A, -K^'M la^34r vf (r«i H >«ra w wl as-Kif i*d mich Wp CMIM* e faharwl HKhinu. 3.' thd d&a ip*H¥l: MW mRM_LEL HDCTE^DIS' *ih tnvr 05T tc- r vtw. llivl 4 nt* 111 Hi >4 -Mji lltf ¥111 4 igf IhB 4■Z.7UZ - unri J ■»I fi i■- w rnr I U I FIV J mtnt- , ■ w ^aanr* fi Ir ■KdP-ir'iiH/prnrlM*!1I, *.题目代码以及波形分析a)编写模块源码module flipflop(D,Clock,Q);in put D,Clock;output reg Q;always@(posedge Clock) Q=D;en dmoduleb) 测试模块'timescale 1n s/1psmodule tb_flipflop;reg Clock_test;reg D_test;wire Q_test; in itial Clock_test=0;always #20 Clock_test=~Clock_test; in itial D_test=0;always #77 D_test=~D_test;flipflop UUT_flipflop(.CIock(Clock_test),.D(D_test),.Q(Q_test)); en dmodulec) 仿真后的波形截图 input D0,D1,Sel,Clock;output reg Q;d) 综合后的RTL 图形2. 设计一款4bBit 具有并行加载功能的移位寄存器编写模块源码a) 编写模块源码module muxdff(D0,D1,Sel,Clock,Q);每当时钟上升沿到来时,触发器把 D 的信号传给Q1 -MlB ! L IVh :> 柏"甲^革曲神甲 翹甘I 『■申 £^4HtfTAiw i||jI ** E - - M ■ < J ■: < '«Ihl^fcp :- *□-refDwire D;assign D=Sel?D1:D0;always@(posedge Clock)Q<=D;endmodulemodule shift4(R,L,w,Clock,Q);input [3:0]R;input L,w,Clock;output wire [3:0]Q;muxdff Stage3(w,R[3],L,Clock,Q[3]);muxdff Stage2(Q[3],R[2],L,Clock,Q[2]);muxdff Stage1(Q[2],R[1],L,Clock,Q[1]);muxdff Stage0(Q[1],R[0],L,Clock,Q[0]); endmodule b) 测试模块'timescale 1n s/1psmodule tb_shift4;reg Clock_test;reg L_test;reg w_test;reg [3:0]R_test;wire [3:0]Q_test;initialClock_test=0;always #10 Clock_test=~Clock_test;initialbeginL_test=1;#14L_test=0;//always #14 L_test=~L_test; endinitialw_test=0;always #13 w_test=~w_test;initialR_test=4'b1010;shift4 UUT_shift4(.CIock(Clock_test),.L(L_test),.w(w_test),.R(R_test),.Q(Q_test)); en dmoduleL 为0时并行加载,数组 R 为加载时的输入。
2018--2018数据结构课程设计实验报告学院:班级:姓名:学号:邮箱:日期:2018年1月17日《数据结构》实验报告◎实验题目:单词<词组)检索◎实验内容:现在有一个英文字典<每个单词都是由小写的'a'-'z'组成),单词量很大,达到100多万的单词,而且还有很多重复的单词。
此外,我们现在还有一些 Document,每个Document 包含一些英语单词。
针对这个问题,请你选择合适的数据结构,组织这些数据,使时间复杂度和空间复杂度尽可能低,并且解决下面的问题和分析自己算法的时间复杂度。
1)基本型问题<必须采用字符串哈希,hash散列算法)<1)将所有的英文单词生成一个字典Dictionary。
<2)给定一个单词,判断这个单词是否在字典Dictionary中。
如果在单词库中,输出这个单词总共出现的次数。
否则输出NO。
<3)输出Dictionary中出现次数最高的10个单词。
<必须采用快速排序或堆排序算法)2)扩展型问题<可选择合适的数据结构)<4)给定一个单词,按字典序输出字典Dictionary 中所有以这个单词为前缀的单词。
例如,如果字典 T={a,aa, aaa, b, ba}, 如果你输入 a,那么输出应该为{a, aa, aaa}。
<5)给定一个单词,输出在Dictionary 中以这个单词为前缀的单词的出现频率最高的10个单词,对于具有相同出现次数的情况,按照最近<即最后)插入的单词优先级比较高的原则输出。
对于以下问题,需采用2种不同的数据结构<hash散列与Trie树,并针对以下题目,比较两种数据结构的优缺点。
)3)高级型问题<6)现在我们有一些Document,每个Document 由一些单词组成,现在的问题就是给你一个word,检索出哪些Document包含这个word,输出这些Document的DocumentID<就如同搜索引擎一样,即输入一些关键字,然后检索出和这些关键字相关的文档)。
《数据结构》实验报告一、题目要求有输入界面(图形或文字界面都可),能区分加法、减法、乘法和转置;能处任意输入的典型数据和进行出错数据处理(例如乘法,当第一个矩阵的列数不等于第二个矩阵的行数时);必须采用三元组作存储结构,不能采用数组等形式;输出要求用矩阵的形式输出(即习题集136页的形式),当第一个矩阵的行数不等于第二个矩阵的行数时,注意如第三个乘法的形式输出二、算法实现在本次实验中,算法比较简单,所涉及的函数比较少,一共有:创建稀疏矩阵、输出稀疏矩阵、矩阵的乘法、矩阵的加法、矩阵的减法、矩阵的转置。
因为是稀疏矩阵要求以三元组的方式输入,节约了很多时间和空间,只需输入行列下标和非零元即可。
在输出矩阵时,通常以方阵的形式输出。
基本操作:CreateSMatrix(&M); //操作结果:创建稀疏矩阵M.Print SMatrix(M);//初始化条件: 稀疏矩阵M存在.//操作结果:输出稀疏矩阵M.AddSMatrix(M,N,&Q);//初始化条件: 稀疏矩阵M与N的行数和列数对应相等.//操作结果:求稀疏矩阵的和Q=M+N.SubSMatrix(M,N,&Q);//初始化条件: 稀疏矩阵M与N的行数和列数对应相等.//操作结果:求稀疏矩阵的差Q=M-N.MultSMatrix(M,N,&Q);//初始化条件: 稀疏矩阵M的列数等于N的行数.//操作结果:求稀疏矩阵的乘积Q=M*N.TransposeSMatrix(M ,&Q);//初始化条件:存在稀疏矩阵M//操作结果:将稀疏矩阵行列互换输出。
功能模块调用关系图三、详细设计1、元素类型 主程序模块 创建稀疏矩阵模块调用矩阵运算模块输出矩阵方阵模块稀疏矩阵运算器 矩阵加法 矩阵减法 矩阵乘法 矩阵转置输入矩阵M 输入矩阵N输出运算结输入矩阵M 输入矩阵N 输出运算结输入矩阵M 输入矩阵N 输出运算结输入矩阵M 输出运算结果typedef struct{int i,j;//该非零元素的列下标和行下标ElemType e;}Triple;typedef struct{Triple data[MAXSIZE+1];//非零元三元组表,data[0]未用int mu,nu,tu;}TSMatrix;2、矩阵运算器void AddSMatrix(M ,N , &Q)void SubSMatrix(M ,N , &Q)void MultSMatrix(M ,N , &Q)void TransposeSMatrix(M ,&T)四、调试分析1、此程序的算法结构比较简单,只要理解了三元组,设计矩阵运算器的方法很简单。
2、在设计算法的过程中对于矩阵的输出有一定的困扰,三元组的输入给我们节约了时间和储存空间,但是对于把三元组的形式转化为方阵的形式输出有一定的困难。
3、在矩阵运算方面的算法比较简单,调试的过程中遇到的困难比较小。
4、由于稀疏矩阵的内容比较好理解,调用的函数也比较简单,所以此次实验的算法在设计中比较顺利。
但是在刚开始设计的时候对加法和减法的把握不是很好,出现了一点错误。
五、用户操作说明1、本实验在vc++6.0上编译2、输出界面3、选择需要的运算并输入矩阵三元组4、输入第二个矩阵如上所示5、输出运算结果六、源代码#include<stdio.h>#include<string.h>#include<math.h>#define MAXSIZE 12500typedef int ElemType;typedef struct{int row,col;ElemType e;}Triple;typedef struct{Triple data[MAXSIZE];int m,n,t;}TriTable;void AddSMatrix(TriTable *A,TriTable *B,TriTable *C) //矩阵的加法 { int i,j,k;if(A->m!=B->m||A->n!=B->n){printf("错误");return;}C->m=A->m;C->n=A->n;C->t=0;if(A->t==0&&B->t==0)return;i=j=k=1;while(i<=A->t&&j<=B->t){if(A->data[i].row<B->data[j].row){C->data[k]=A->data[i];i++;k++;}else{if(A->data[i].row>B->data[j].row){C->data[k]=B->data[j];j++;k++;}else{if(A->data[i].col<B->data[j].col) {C->data[k]=A->data[i];i++;k++;}else{if(A->data[i].col>B->data[j].col) {C->data[k]=B->data[j];j++;k++;}else{if(A->data[i].e+B->data[j].e!=0){C->data[k].row=A->data[i].row;C->data[k].col=A->data[i].col;C->data[k].e=A->data[i].e+B->data[j].e;k++;}i++;j++;}}}}}while(i<A->t){C->data[k]=A->data[i];i++;k++;}while(j<B->t){C->data[k]=B->data[j];j++;k++;}C->t=k;}void SubSMatrix(TriTable *A,TriTable *B,TriTable *C) //矩阵的减法 {int i,j,k;if(A->m!=B->m||A->n!=B->n){printf("错误");return;}C->m=A->m;C->n=A->n;C->t=0;if(A->t==0&&B->t==0)return;i=j=k=1;while(i<=A->t&&j<=B->t){if(A->data[i].row<B->data[j].row){C->data[k]=A->data[i];i++;k++;}else{if(A->data[i].row>B->data[j].row) {C->data[k]=B->data[j];j++;k++;}else{if(A->data[i].col<B->data[j].col){C->data[k]=A->data[i];i++;k++;}else{if(A->data[i].col>B->data[j].col){C->data[k]=B->data[j];j++;k++;}else{if(A->data[i].e+B->data[j].e!=0){C->data[k].row=A->data[i].row;C->data[k].col=A->data[i].col;C->data[k].e=A->data[i].e-B->data[j].e; k++;}i++;j++;}}}}}while(i<A->t){C->data[k]=A->data[i];i++;k++;}while(j<B->t){C->data[k]=B->data[j];j++;k++;}C->t=0-k;}void MultSMatrix(TriTable *A,TriTable *B,TriTable *C)//矩阵的乘法 {int k,p,crow,brow,q,ccol;int num[MAXSIZE],pos[MAXSIZE],ctemp[MAXSIZE];if (A->n==B->m){for(k=1;k<=B->m;k++)num[k]=0;for(k=1;k<=B->t;k++)num[B->data[k].row]++;pos[1]=1;for(k=2;k<=B->t;k++)pos[k]=pos[k-1]+num[k-1];pos[1+B->t]=pos[B->t]+1;C->m=A->m; C->n=B->n; C->t=0; p=1;while(p<=A->t){crow=A->data[p].row;for(k=1;k<=C->n;k++)ctemp[k]=0;while (p<=A->t&&A->data[p].row==crow){brow=A->data[p].col;for(q=pos[brow];q<=pos[brow+1]-1;q++) {ccol=B->data[q].col;ctemp[ccol]=ctemp[ccol]+A->data[p].e*B->data[q].e;}p=p+1;}for(ccol=1;ccol<=B->n;ccol++)if(ctemp[ccol]!=0){C->t=C->t+1;C->data[C->t].row=crow;C->data[C->t].col=ccol;C->data[C->t].e=ctemp[ccol];}}}elseprintf("错误");return;}void TransposeSMatrix(TriTable *A,TriTable *B)//矩阵的转置{int col,i,p,q;int num[MAXSIZE],position[MAXSIZE];B->t=A->t;B->m=A->n; B->n=A->m;if(B->t){for(col=1;col<=A->n;col++)num[col]=0;for(i=1;i<=A->t;i++)num[A->data[i].col]++;position[1]=1;for(col=2;col<=A->n;col++)position[col]=position[col-1]+num[col-1];for(p=1;p<=A->t;p++){col=A->data[p].col;q=position[col];B->data[q].row=A->data[p].col;B->data[q].col=A->data[p].row;B->data[q].e=A->data[p].e;position[col]++;}}}void creatarrey(TriTable *A)//创建新矩阵{ int i;printf("行数:");scanf("%d",&A->m);printf("列数:");scanf("%d",&A->n);printf("非零元的个数:");scanf("%d",&A->t);for(i=1;i<=A->t;i++){printf("输入入第%d非零元,按照行、列和数值的顺序输入:",i);scanf("%d,%d,%d",&A->data[i].row,&A->data[i].col,&A->data[i].e);}}void output(TriTable *A)//矩阵的输出{ int i,j,t,k=0;t=1;printf(" 运算结果是:\n");for(i=1;i<=A->m;i++){for(j=1;j<=A->n;j++){if(A->data[t].row==i&&A->data[t].col==j){printf("%4d",A->data[t].e);t++;}elseprintf("%4d",k);}printf("\n");}}void main( ){int i=0;TriTable A,B,C;while(i<4){printf("\n");printf(" ** 稀疏矩阵运算器** \n");printf(" 1.加法 2.减法 3.转置 4.乘法5.退出 \n");printf("____________________________________________________________________ \n\n");scanf("%d",&i);switch(i){case 1:creatarrey(&A);output(&A);creatarrey(&B);output(&B);AddSMatrix(&A,&B, &C);output(&C);break;case 2:creatarrey(&A);output(&A);creatarrey(&B);output(&B);SubSMatrix(&A,&B, &C);output(&C);break;case 3:creatarrey(&A);output(&A);TransposeSMatrix(&A,&B);output(&B);break;case 4:creatarrey(&A);output(&A);creatarrey(&B);output(&B);MultSMatrix(&A,&B ,&C);output(&C);break;case 5: break;}}getch();}教师评语:实验成绩:指导教师签名:批阅日期:。