西电软件学院算法实验报告

合集下载

西电软院西电软院计组上机报告下

西电软院西电软院计组上机报告下
四、实验过程
1、导入工程 DM2_KX8051,编绎工程。设计原理图如图 7.3 所示。
2、连接下载 JTAG 口,进行下载,点击工具条上的 图标,进行下载。点 Hardware Setup 选择下载器,只勾上 program/configure,其 它不选,选 start 进行下载,如图 7.4 所示。
实验二 键盘扫描,中断实验 一、实验题目
键盘扫描,中断实验。
二、实验环境
Windows 操作系统,Quartus II,FPGA 开发板。
三、实验内容
本实验主要进行对 4*4 键盘原理分析,实现对键盘扫描码的判断。分别利用查询及 中断方式进行扫描键盘。
四、实验过程
1、导入工程 DM2_KX8051,编绎工程。设计原理图如图 7.3 所示。
4、打开 Quartus II 中工具下的系统内存数据编缉器。操作如图 7.5 所示。
5、点击窗口右侧的 setup 进行 JTAG 口查找,查找后能找到一个 RAM,一个 ROM。 6、ROM内的数据既为程序的目标代码,右击ROM选import data from file 选择生成 的.hex目标文件,将文件写入开发板。
图 6.8 打开系统内存数据编缉器 6、点击窗口右侧的 setup 进行 JTAG 口查找,查找后能找到一个 RAM,一个 ROM。 7、 ROM 内的数据既为程序的目标代码,右击 ROM 选 import data from file 选择生 成的.hex 目标文件,如图 6.9 所示,按复位键运行程序。
图 7.3 设计原理图 2、连接下载 JTAG 口,进行下载,点击工具条上的 图标,进行下载。点 Hardware Setup 选择下载器,只勾上 program/configure,其 它不选,选 start 进行下载,如图 7.4 所示。

算法设计与分析实验报告三篇

算法设计与分析实验报告三篇

算法设计与分析实验报告一实验名称统计数字问题评分实验日期2014 年11 月15 日指导教师姓名专业班级学号一.实验要求1、掌握算法的计算复杂性概念。

2、掌握算法渐近复杂性的数学表述。

3、掌握用C++语言描述算法的方法。

4.实现具体的编程与上机实验,验证算法的时间复杂性函数。

二.实验内容统计数字问题1、问题描述一本书的页码从自然数1 开始顺序编码直到自然数n。

书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。

例如,第6 页用数字6 表示,而不是06 或006 等。

数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2, (9)2、编程任务给定表示书的总页码的10 进制整数n (1≤n≤109) 。

编程计算书的全部页码中分别用到多少次数字0,1,2, (9)三.程序算法将页码数除以10,得到一个整数商和余数,商就代表页码数减余数外有多少个1—9作为个位数,余数代表有1—余数本身这么多个数作为剩余的个位数,此外,商还代表1—商本身这些数出现了10次,余数还代表剩余的没有计算的商的大小的数的个数。

把这些结果统计起来即可。

四.程序代码#include<iostream.h>int s[10]; //记录0~9出现的次数int a[10]; //a[i]记录n位数的规律void sum(int n,int l,int m){ if(m==1){int zero=1;for(int i=0;i<=l;i++) //去除前缀0{ s[0]-=zero;zero*=10;} }if(n<10){for(int i=0;i<=n;i++){ s[i]+=1; }return;}//位数为1位时,出现次数加1//位数大于1时的出现次数for(int t=1;t<=l;t++)//计算规律f(n)=n*10^(n-1){m=1;int i;for(i=1;i<t;i++)m=m*10;a[t]=t*m;}int zero=1;for(int i=0;i<l;i++){ zero*= 10;} //求出输入数为10的n次方int yushu=n%zero; //求出最高位以后的数int zuigao=n/zero; //求出最高位zuigaofor(i=0;i<zuigao;i++){ s[i]+=zero;} //求出0~zuigao-1位的数的出现次数for(i=0;i<10;i++){ s[i]+=zuigao*a[l];} //求出与余数位数相同的0~zuigao-1位中0~9出现的次数//如果余数是0,则程序可结束,不为0则补上所缺的0数,和最高位对应所缺的数if(yushu==0) //补上所缺的0数,并且最高位加1{ s[zuigao]++;s[0]+=l; }else{ i=0;while((zero/=10)>yushu){ i++; }s[0]+=i*(yushu+1);//补回因作模操作丢失的0s[zuigao]+=(yushu+1);//补回最高位丢失的数目sum(yushu,l-i-1,m+1);//处理余位数}}void main(){ int i,m,n,N,l;cout<<"输入数字要查询的数字:";cin>>N;cout<<'\n';n = N;for(i=0;n>=10;i++){ n/=10; } //求出N的位数n-1l=i;sum(N,l,1);for(i=0; i<10;i++){ cout<< "数字"<<i<<"出现了:"<<s[i]<<"次"<<'\n'; }}五.程序调试中的问题调试过程,页码出现报错。

软件算法展示实验报告(3篇)

软件算法展示实验报告(3篇)

第1篇一、实验目的1. 理解并掌握软件算法的基本概念和原理。

2. 掌握常见软件算法的设计与实现方法。

3. 通过实验,提高算法分析、设计、实现和优化能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验内容本次实验主要展示了以下软件算法:1. 冒泡排序2. 快速排序3. 二分查找4. 线性查找5. 简单链表操作6. 二叉树遍历四、实验步骤1. 冒泡排序(1)编写冒泡排序算法的代码实现。

(2)测试代码,验证算法的正确性。

2. 快速排序(1)编写快速排序算法的代码实现。

(2)测试代码,验证算法的正确性。

3. 二分查找(1)编写二分查找算法的代码实现。

(2)测试代码,验证算法的正确性。

4. 线性查找(1)编写线性查找算法的代码实现。

(2)测试代码,验证算法的正确性。

5. 简单链表操作(1)实现链表的创建、插入、删除和遍历等基本操作。

(2)测试代码,验证链表操作的正确性。

6. 二叉树遍历(1)实现二叉树的创建、插入、遍历等基本操作。

(2)测试代码,验证二叉树遍历的正确性。

五、实验结果与分析1. 冒泡排序实验结果:```pythondef bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]测试代码arr = [64, 34, 25, 12, 22, 11, 90]bubble_sort(arr)print("Sorted array is:", arr)```分析:冒泡排序算法是一种简单的排序算法,其基本思想是通过相邻元素的比较和交换,将待排序的序列逐步变成有序序列。

实验结果显示,冒泡排序算法能正确地将输入数组排序。

西安电子科技大学算法上机报告

西安电子科技大学算法上机报告

西安电子科技大学(2018年度)算法分析实验报告实验名称:渗透实验班级:1603012*名:**学号:***********实验一:渗透问题(Percolation)一、实验题目使用合并-查找(union-find)数据结构,编写程序通过蒙特卡罗模拟(Monte Carlo simulation)来估计渗透阈值的值。

给定由随机分布的绝缘材料和金属材料构成的组合系统:金属材料占多大比例才能使组合系统成为电导体?给定一个表面有水的多孔渗水地形(或下面有油),水将在什么条件下能够通过底部排出(或油渗透到表面)?科学家们已经定义了一个称为渗透(percolation)的抽象过程来模拟这种情况。

模型:我们使用N×N网格点来模型一个渗透系统。

每个格点或是open格点或是blocked格点。

一个full site是一个open格点,它可以通过一连串的邻近(左,右,上,下)open格点连通到顶行的一个open格点。

如果在底行中有一个full site格点,则称系统是渗透的。

(对于绝缘/金属材料的例子,open格点对应于金属材料,渗透系统有一条从顶行到底行的金属路径,且full sites格点导电。

对于多孔物质示例,open格点对应于空格,水可能流过,从而渗透系统使水充满open格点,自顶向下流动。

)问题:在一个著名的科学问题中,研究人员对以下问题感兴趣:如果将格点以空置概率p 独立地设置为open格点(因此以概率1-p被设置为blocked格点),系统渗透的概率是多少?当p = 0时,系统不会渗出; 当p=1时,系统渗透。

下图显示了20×20随机网格和100×100随机网格的格点空置概率p与渗滤概率。

当N足够大时,存在阈值p*,使得当p <p*,随机N⨯N网格几乎不会渗透,并且当p> p*时,随机N⨯N网格几乎总是渗透。

尚未得出用于确定渗滤阈值p*的数学解。

你的任务是编写一个计算机程序来估计p*。

西电软院网络多媒体上机报告讲解

西电软院网络多媒体上机报告讲解

网络多媒体上机实验报告目录实验一哈夫曼编码实验二算术编码实验三LZW编码实验四WAV文件的读取附录对应的四个源程序 实验一哈夫曼编码算法分析:哈夫曼编码采用自底向上的描述方式。

哈夫曼编码运用了贪心算法,每次都取权值最小的两个节点合并成一个节点,该合并节点的权值记为两者权值之和,然后继续上述操作直到最后合并成一个节点,在建成树的过程中,就记下了相应的哈夫曼编码。

通过已经构造出的哈夫曼树,自底向上,由频率节点开始向上寻找parent,直到parent为树的顶点为止。

每个频率都会有一个01编码与之唯一对应,并且任何编码没有前部分是同其他完整编码一样的。

程序设计:构造最优二叉树:输入入N个叶子节点的权值,找出所有结点中权值最小、无父结点的两个结点,并合并成一个结点,继续在剩下的结点中寻找权值最小的叶子结点,循环合并结点操作,并最终生成最优二叉树,节点在二叉树的深度的编码既是对此组字符的哈夫曼编码。

我们将用自己定义的结构体来表示各个节点,其中结构体中包含权值,左右孩子和父节点,然后用一个select函数来寻找当前最小的两个节点,合并成一个节点,然后继续直到全部合并为一个节点,然后顺着树来将其01编码储存在一个一个字符数组中。

调试过程:由于之前做过哈夫曼编码问题。

因此问题不大,未遇到较难处理的问题。

运行结果:这是实验的截图,从中可以看出,权值比较大的用到的编码的位数比较少,而权值较小的节点则远离根节点。

而且,我们可以从上图看出哈弗曼是一种前缀编码。

实验二算术编码算法分析:算数编码是一种更现代的编码方法,算术编码把整个消息看做一个单元。

在实际的应用中,输入数据同城被分割成块以避免错误传播。

他只传输一个区间的值,从而可以通过迭代得知相应的信息,性能比较好。

程序设计:我们将整个信息的概率设置为1,各个信号的概率给出,则一个字符一个字符的取,当取到某个自腐蚀,则将其限制在{low,high}之间,然后在在这个区间内继续往下细分,不断迭代,最后生成一个数,我们可以寻找在最后区间内的一个最短的二进制码字,记得到编码,解码同样是不断的看在那个范围中。

2021年西安电子科技大学计组实验报告

2021年西安电子科技大学计组实验报告

西安电子科技大学计算机组织与体系结构 课程试验汇报试验名称 计算机组织与体系结构计算机 学院 1503013 班姓名 陈宁 学号 同作者 罗超试验日期 年 9 月 24 日试验地点 E-II-311 试验批次 第二批一.试验目1.深入了解基础模型计算机功效、组成知识;2.深入学习计算机各类经典指令实施步骤;3.学习微程序控制器设计过程和相关技术, 掌握LPM_ROM配置方法。

4.在掌握部件单元电路试验基础上, 深入将单元电路组成系统, 结构一台基础模型计算机。

5.定义五条机器指令, 并编写对应微程序, 上机调试, 掌握计算机整机概念。

掌握微程序设计方法, 学会编写二进制微指令代码表。

6.经过熟悉较完整计算机设计, 全方面了解并掌握微程序控制方法计算机设计方法。

二.试验原理1.在部件试验过程中, 各部件单元控制信号是人为模拟产生, 而本试验将能在微过程控制下自动产生各部件单元控制信号, 实现特定功效。

试验中, 计算机数据通路控制将由微过程控制器来完成, CPU 从内存中取出一条机器指令到指令实施结束一个指令周期, 全部由微指令组成序列来完成, 即一条机器指令对应一个微程序。

2.指令格式 (1)指令格式采取寄存器直接寻址方法, 其格式以下:其中, OP -CODE 为操作码, rs 为源寄存器, rd 为目寄存器, 并要求:1,存放器读操作(KRD): 下载试验程序后按总清除按键(CLR)后, 控制台SWA、SWB为“0 0”时, 可对RAM连续手动读入操作。

2,存放器写操作(KWE): 下载试验程序后按总清除按键(CLR)后, 控制台SWA、SWB为“0 1”时, 可对RAM连续手动写操作。

3、开启程序(RP): 下载试验程图6-1 数据通路框图序后按总清除按键(CLR)后, 控制台SWA、SWB为“1 1”时, 即可转入到微地址“01”号“取指令”微指令, 开启程序运行。

依据以上要求设计数据通路框图, 如图5-1所表示。

西安邮电大学java类与对象实验报告

西安邮电大学java类与对象实验报告

西安邮电⼤学java类与对象实验报告西安邮电⼤学(计算机学院)Java程序设计课内实验报告实验名称:类与对象专业名称:软件⼯程班级:学⽣姓名:学号(8位):指导教师:实验⽇期:2014年4⽉2⽇⼀. 实验⽬的及实验环境理解类与对象的概念,掌握Java 类的定义(域、⽅法)、创建对象和使⽤对象。

理解包的概念,会创建包,引⼊包。

掌握访问权限规则。

环境:eclipse⼆. 实验内容1. 设计Point 类⽤来定义平⾯上的⼀个点,⽤构造⽅法传递坐标位置。

默认构造⽅法创建坐标原点,带参数构造⽅法根据指定坐标创建⼀个点对象。

提供get、set ⽅法返回和设置坐标。

distance 返回两个点之间距离或当前点到指定坐标之间的距离。

同时设计应⽤类进⾏测试。

2. 设计⼀个三⾓形类,能判断给定三边是否构成三⾓形,能判断三⾓形的类型(普通、等腰、等边、直⾓,⽤枚举类型(参见第六章))能计算周长与⾯积。

并在应⽤类中演⽰。

3.定义⼀个Line 类,该类包含两个Point 类型的实例变量,⽤以表⽰线段的两个端点。

提供以下⽅法:计算线段长度;判断线段是否⽔平、判断是否为垂直、计算线段斜率、计算线段中点、判断两条线段是否相等。

并在应⽤类中演⽰。

4.定义两个包p1、p2,三个类C1、C2、C3.其中C1、C2 位于p1 中,C3 位于p2 中。

在C1 中定义四个不同访问控制修饰类型的变量,在C2、C3 中进⾏访问测试。

并练习在JDK 命令⾏下⽣成包。

三.⽅案设计对于第⼀题,⽤了staticstatic double distance(Point p1,Point p2){return Math.sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}对于第⼆题,采⽤if –else,严谨的判断三⾓形的形状public void judge(){if(a==b || b==c || c==a){if(a==b && b==c)System.out.println("该三⾓形为等边三⾓形。

西电软院数据结构实验报告-迷宫问题

西电软院数据结构实验报告-迷宫问题

实验报告:迷宫问题题目:编写一个求解迷宫通路的程序一、需求分析:1)采用二维数组maze[M][N]来表示迷宫,其中:maze[0][j]和maze[M-1][j](0≤j≤N-1)及maze[i][0]和maze[i][N-1](0≤i≤M-1)为添加在迷宫外围的一圈障碍。

数据元素值0表示通路,1表示障碍。

限定迷宫的大小M≤8,N≤10.2)本次实验直接在主程序中输入表示迷宫的二维数组。

另外,迷宫的入口和出口位置都将在主程序中直接设置。

3)实验中求出的迷宫通路用“-”表示,迷宫的障碍用“#”表示,已走过但未能求出通路的路径用“@”表示。

4)本程序只求出一条成功的通路。

5)本次实验将直接输出构建迷宫的二维数组、初始化的二维数组和求解后的迷宫数组。

二、概要设计:数据结构及其抽象数据类型的定义。

(1)栈的抽象数据类型ADT Stack{数据对象:D={ai| ai∈CharSet,i=1,2…n,n>=0}数据关系:R1={<ai-1, ai >| ai-1, ai∈D,i=2,…n}基本操作:InitStack(&S)操作结果:构造一个空栈S。

DestroyStack(&S)初始条件:栈S已存在。

操作结果:销毁栈S。

ClearStack(&S)初始条件:栈S已存在。

操作结果:将S清为空栈。

StackLength(S)初始条件:栈S已存在。

操作结果:返回栈S的长度。

StackEmpty(S)初始条件:栈S已存在。

操作结果:若S为空栈,则返回TRUE,否则返回FALSE。

GetTop(S,&e)初始条件:栈S已存在。

操作结果:若栈S不空,则以e返回栈顶元素。

Push(&S, e)初始条件:栈S已存在。

操作结果:在栈S的栈顶插入新的栈顶元素e。

Pop(&S,&e)初始条件:栈S已存在。

操作结果:删除S的栈顶元素,并以e返回其值。

StackTraverse(S,visit())初始条件:栈S已存在。

(超详细)西电软院操作系统实验报告DOC

(超详细)西电软院操作系统实验报告DOC

操作系统课程设计实验报告册班级:1313012学号:...姓名:lan教师:杜军朝目录实验1 Linux(虚拟机)安装及Linux常用命令使用实验2 makefile的编写及Linux内核编译实验3 Linux的进程和线程实验4 同步与互斥实验5 文件系统重要提示:1.实验正文建议使用小四号或五号宋体。

2.若附加图形,则请直接嵌入到实验手册相应位置。

3.各实验的源程序,请按实验分目录存放,如第一个实验的源程序存放在目录lab1下,第二个实验的源程序存放在目录lab2下等等,依次类推。

4.可互相讨论,但严禁抄袭网络或同学的实验结果。

实验编号 1 题目Linux(虚拟机)安装及Linux常用命令使用实验目的1、掌握至少一种Linux系统的安装2、掌握虚拟机平台(Vmware Workstation)的使用和配置3、掌握至少一种配置Vmware中Linux系统与宿主机Windows系统的文件交换的方法4、掌握常用的Linux命令5、了解Linux的帮助系统实验内容1、Linux(虚拟机)安装及Linux常用命令使用报告1、目录操作命令正文2、文件操作命令3、文本文件查看命令4、用户系统命令5、网络相关命令6、U盘的使用方法7、用户管理命令8、用户组账号管理9、文件权限设置10、设置文件属主和属组实验编号 2 题目makefile的编写及Linux内核编译实验目的1、掌握Linux中makefile文件的编写2、理解Linux内核的Makefile3、掌握至少一个版本Linux内核的编译步骤4、了解Linux内核的配置过程实验内容1、准备工作:相关软件的获取与安装(源代码,软件包)2、编译工作:配置,编译3、修改启动配置文件:修改grub2启动项4、能够正确的编译源代码5、能够用编译出的内核启动系统报告内容要求(1) 实现方法和思路(2) 测试及结果报告正文内核编译过程1、拷贝源代码到/usr/src目录下将文件添加共享文件夹中,然后在terminal输入以下命令:cd /mnt/hgfscp -r packages /usr/srccp linux-2.6.32.60 /usr/src2、在usr/src目录下解压源码:cd /usr/srctar xvf linux-2.6.32.60.tar.bz23、拷贝packages到“~”目录下:cd /usr/srccp -r packages ~4、安装软件包:dpkg –i *.deb5、转到内核源代码所在的目录“/usr/src/linux-2.6.32.60”:cd /usr/src/linux-2.6.32.606、输入make menuconfig,进入general setup选项,进入local version 菜单,添加版本标示:lan,保存并退出。

关于算法的实验报告(3篇)

关于算法的实验报告(3篇)

第1篇一、实验目的1. 理解快速排序算法的基本原理和实现方法。

2. 掌握快速排序算法的时间复杂度和空间复杂度分析。

3. 通过实验验证快速排序算法的效率。

4. 提高编程能力和算法设计能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验原理快速排序算法是一种分而治之的排序算法,其基本思想是:选取一个基准元素,将待排序序列分为两个子序列,其中一个子序列的所有元素均小于基准元素,另一个子序列的所有元素均大于基准元素,然后递归地对这两个子序列进行快速排序。

快速排序算法的时间复杂度主要取决于基准元素的选取和划分过程。

在平均情况下,快速排序的时间复杂度为O(nlogn),但在最坏情况下,时间复杂度会退化到O(n^2)。

四、实验内容1. 快速排序算法的代码实现2. 快速排序算法的时间复杂度分析3. 快速排序算法的效率验证五、实验步骤1. 设计快速排序算法的C++代码实现,包括以下功能:- 选取基准元素- 划分序列- 递归排序2. 编写主函数,用于生成随机数组和测试快速排序算法。

3. 分析快速排序算法的时间复杂度。

4. 对不同规模的数据集进行测试,验证快速排序算法的效率。

六、实验结果与分析1. 快速排序算法的代码实现```cppinclude <iostream>include <vector>include <cstdlib>include <ctime>using namespace std;// 生成随机数组void generateRandomArray(vector<int>& arr, int n) {srand((unsigned)time(0));for (int i = 0; i < n; ++i) {arr.push_back(rand() % 1000);}}// 快速排序void quickSort(vector<int>& arr, int left, int right) { if (left >= right) {return;}int i = left;int j = right;int pivot = arr[(left + right) / 2]; // 选取中间元素作为基准 while (i <= j) {while (arr[i] < pivot) {i++;}while (arr[j] > pivot) {j--;}if (i <= j) {swap(arr[i], arr[j]);i++;j--;}}quickSort(arr, left, j);quickSort(arr, i, right);}int main() {int n = 10000; // 测试数据规模vector<int> arr;generateRandomArray(arr, n);clock_t start = clock();quickSort(arr, 0, n - 1);clock_t end = clock();cout << "排序用时:" << double(end - start) / CLOCKS_PER_SEC << "秒" << endl;return 0;}```2. 快速排序算法的时间复杂度分析根据实验结果,快速排序算法在平均情况下的时间复杂度为O(nlogn),在最坏情况下的时间复杂度为O(n^2)。

西安邮电大学体系结构Tomasulo算法实验报告

西安邮电大学体系结构Tomasulo算法实验报告

实验4 Tomasulo算法1 实验目的(1)加深对指令级并行性及开发的理解。

(2)加深对Tomasulo算法的理解。

(3)掌握Tomasulo算法在指令流出、执行、写结果各阶段对浮点操作指令以及load和store指令进行了什么处理。

(4)掌握采用了Tomasulo算法的浮点处理部件的结构。

(5)掌握保留站的结构。

(6)给定被执行的程序片段,对于具体某个时钟周期,能够写出保留站、指令状态表以及浮点寄存器状态表内容的变化情况。

2 实验平台采用Tomasulo算法模拟器。

3 实验内容和步骤首先要掌握Tomasulo算法模拟器的使用方法(见随附的ppt)。

1)、假设浮点功能部件的延迟时间为:加减法2个时钟周期,乘法10个时钟周期,除法40个时钟周期,Load部件2个时钟周期。

(1) 对于下面的代码段,给出当指令MUL.D写结果时,保留站、Load缓冲器以及寄存器状态表中的内容。

L.D F6,24(R2)L.D F2,12(R3)MUL.D F0,F2,F4SUB.D F8,F6,F2DIV.D F10,F0,F6ADD.D F6,F8,F2当指令MUL.D写结果时,保留站中内容如下表所示:当指令MUL.D写结果时,load缓冲器中内容如下表所示:当指令MUL.D写结果时,寄存器状态表中的内容如下表所示:(2) 按单步方式执行上述代码,利用模拟器的对比显示功能,观察每一个时钟周期前后各信息表中内容的变化情况。

观察分析:周期1:取出第一条指令L.D F6, 24(R2),地址偏移量24写入LOAD1,LOAD1名存入寄F6。

周期2:取出第二条指令L.D F2, 12(R3),地址偏移量12写入LOAD2,LOAD2名存入寄器F2,同时第一条指令开始执行,LOAD1上写入绝对地址。

周期3:取出第三条指令MUL.D F0, F2,F4,第一条指令完成,第二条指令开始执行,LOAD2上写入绝对地址。

保留站中存入待运算的操作数和操作。

西电软院操作系统实验报告

西电软院操作系统实验报告

西电软院操作系统实验报告(总23页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--操作系统实验报告实验报告册班级:学号:姓名:教师:褚华目录实验说明重要提示实验1 Linux(虚拟机)安装及Linux常用命令使用实验2 makefile的编写及Linux内核编译实验3 Linux的进程和线程实验4 同步与互斥实验5文件系统实验说明1.实验做为学习的重要促进手段,是为了深化对理论的理解,锻炼实践动手能力。

2.实验同时也作为考核的手段。

3.实验内容会在课程进行中下达,并且会分次地、部分地被抽查。

4.课程结束时,要求把所有的实验整理成一个完整的电子文档并上交,做为最后成绩的评定依据。

5.如果有兴趣的合适的题目,也可自己选题目。

格式说明1.本文档文件名命名为“学号-姓名”,如“_小王”。

2.留白部分不足的自己调整长度,也可加页(增加内容应在表格内)。

3.每次的实验报告都要在这个文件中(按照实验次序依次)增加,而不是每次一个新的word文件。

4.本文档保存为doc格式(请勿用Word2007的docx格式)。

重要提示:1.实验正文建议使用小四号或五号宋体。

2.若附加图形,则请直接嵌入到实验手册相应位置。

3.各实验的源程序,请按实验分目录存放,如第一个实验的源程序存放在目录lab1下,第二个实验的源程序存放在目录lab2下等等,依次类推。

4.可互相讨论,但严禁抄袭网络或同学的实验结果。

实验编号 1 题目Linux(虚拟机)安装及Linux常用命令使用实验目的1.安装虚拟机2.学习linux基本操作实验内容1.安装虚拟机2.熟悉linux操作报告内容要求(1) 实现方法和思路(2) 测试及结果报告正文实验一: 安装虚拟机由于我一直使用linux物理机在本系列实验中我将使用的是我自己的linux物理机,所以就不用安装虚拟机了实验二: 熟悉linux操作Linux的基本操作有一: 目录操作ls pwd mkdir rmdir其中1.ls是查看当前目录内容使用方法ls -l ls -al2.pwd是显示当前所在目录的绝对路径使用方法 pwd3.mkdir是创建一个新目录使用方法mkdir dirname4. rmdir是删除一个空目录使用方法 rmdir dirname 注意dirname一定要是空目录才行二: 文件操作touch使用方法 touch filename 如果文件不存在则新建文件,否则不处理cp使用方法 cp oldfilename newfilename 拷贝oldfilename为newfilename rm使用方法 rm filename 删除filename文件mv使用方法 mv oldfilename newfilename 将oldfilename移动到newfilenamefind使用方法 find pathname -name filename 在pathname路径下寻找文件filename三: 文本文件查看命令cat使用方法 cat filename 查看filename文件more使用方法 more filename 也是查看filename不过不是一次将文件全部显示less使用方法 less filenamehead -n n filename 查看filename文件的前n行tail使用方法 tail -n n filename 查看filename文件的后n行实验编号 2 题目makefile的编写及Linux内核编译实验目的1.通过自己编译linux内核的过程,理解并掌握linux内核的编译方法,以及linux启动过程2.了解linux的makefile文件的编写,明白make在linux工程中的重要作用实验内容1.自己用源代码编译linux内核2.学习并熟悉linux的makefile语法及编写方法报告内容要求(1) 实现方法和思路(2) 测试及结果报告正文内容一: 编译linux内核Ubuntu 版本号1.当前linux内核版本待编译内核版本首先解压内核源码压缩包2.cd进入内核源码所在目录3.make menuconfig进入图形配置界面4.在图形配置界面并设置版本号5.执行make 进入编译步骤,等待不短的时间直到编译完成6.执行make module进行内核模块的编译7.执行make install安装内核8.执行make modules_install安装内核模块9.执行 sudo mkinitramfs -o/boot/更新grub执行update-grub210.重启即可实验编号 3 题目Linux的进程和线程实验目的1.通过自己动手编写进程创建等函数,了解linux中进程的概念以及基本使用方法2.通过自己动手编写线程的一系列函数,连接linux中线程的概念以及基本使用方法实验内容1.掌握常用的进程函数 fork wait signal pause kill exit等2.了解进程的3.了解线程与进程的区别和联系4.掌握常用的线程函数5.学会线程的创建,同步,互斥,退出报告内容要求(1) 实现方法和思路(2) 测试及结果报告正文1.通过几个示例程序来掌握linux的进程概念以及基本进程函数示例一:通过这个示例进程可以知道如何获得进程号,父进程号以及群组号运行结果为示例二:通过这个例程,明白如何利用创建一个子进程,并且如何区分两个进程同时理解了僵尸进程的概念,并且知道父进程和子进程的运行顺序是不确定的,也明白了wait函数的使用方法以及作用运行结果如下可以看到父子进程的运行是没有特定的先后顺序的,而由于wait函数父进程要等待子进程结束才能结束,否则子进程可能成为僵尸进程示例三:运行结果如下通过了这个程序,明白了linux如何通过注册信号句柄来实现信号机制先通过signal函数注册句柄,但是此时句柄函数不会运行,知道本进程接收到了在signal中指定的信号才会执行该句柄函数在本例中的信号是外部键盘中断,也就是Ctrl + C示例四:这个示例程序也是说明linux的信号机制的运作方式的,本程序通过调用fork函数,创建出一个子进程,随后在父进程中注册了一个接受SIGUSR1信号的函数,usr1_handler,接着休眠,直到接受到信号然后在子进程中使用kill函数向父进程发送一个SIGUSR1信号,唤醒父进程随后父进程醒来,并因为wait函数等待子进程结束运行结果如下示例五:本示例通过函数pthread_create()函数创建了一个线程,这个函数节后一个pthread_t的线程号类型,以及函数名作为参数,执行完该函数后myThread函数就作为一个新的线程开始执行了,但是要注意,线程的开始要有一段时间,而不是立即结束,所以如果进程中没有用join或者sleep一段时间的话,可能会看不到线程的开始实验编号 4 题目同步与互斥实验目的1.学习理解并发中的互斥原理2.掌握peterson算法的原理及实现方法3.实现生产者消费者模型实验内容1.实现peterson算法2.利用peterson算法的原理,实现生产者消费者模型报告内容要求(1) 实现方法和思路(2) 测试及结果报告正文一: 本实验利用软件方法实现同步互斥,也就是通过peterson算法,不通过中断等物理机制实现同步互斥Peterson算法特点:使用两个全局变量(flg[]和turn)Flg[]表示哪个进程正在占用临界区及临界区的状态Turn表示能进入临界区的进程序号。

软件学院 算法分析与设计 课程实验报告

软件学院   算法分析与设计   课程实验报告

实验五 回溯法实验目的和要求(1)掌握回溯法的设计思想;(2)掌握解空间树的构造方法,以及在求解过程中如何存储求解路径; (3)考察回溯法求解问题的有效程度。

(4)设计可能解的表示方式,构成解空间树; (5)设计回溯算法完成问题求解;(6)设计测试数据,统计搜索空间的结点数;实验内容给定n 种物品和一个容量为C 的背包,物品i 的重量是wi ,其价值为vi ,0/1背包问题是如何选择装入背包的物品(物品不可分割),使得装入背包中物品的总价值最大。

实验环境VC++数据结构与算法递归法: 1, X={}; 2, flag=false; 3, advance(1); 4, if(flag)输出解X;else 输出“无解”;advance(int k)1,对每一个x ∈S k 循环执行下列操作 1.1 x k =x; 1.2将x k 加入X;1.3if(X 是最终解)flag=true;return; 1.4else if(X 是部分解) advance(k+1); 迭代法: 1, X={}; 2, Flag=false; 3, K=1; 4, While(k>=1)∑=jik k a4.1当(Sk没有被穷举)循环执行下列操作4.1.1xk=Sk 中的下一个元素;4.1.2将xk加入X;4.1.3if(X为最终解)flag=true;转步骤5;4.1.4else if(X是部分解)k=k+1;转步骤4;4.2 重置Sk,使得下一个元素排在第一位;4.3 k=k-1;5,if(flag)输出解X;else输出“无解”;核心源代码递归法:#include<stdio.h>#include<string.h>int w[20];int v[20];int x[20];int bx[20];int wc;int vc;int n;int c;int max;void dfs(int m){int j,i;if(m>n){if(vc>max){max=vc;for(i=1;i<=n;i++){bx[i]=x[i];}}}else{for(j=0;j<2;j++){x[m]=j;if((wc+w[m]*j)<=c){wc+=w[m]*j;vc+=v[m]*j;dfs(m+1);wc-=w[m]*j;vc-=v[m]*j;}}}}int main(){int i;freopen("inm.txt","r",stdin);while(scanf("%d%d",&n,&c)!=EOF){for(i=1;i<=n;i++)scanf("%d",&w[i]);for(i=1;i<=n;i++)scanf("%d",&v[i]);max=0;memset(x,0,sizeof(x));wc=0;vc=0;dfs(1);printf("%d\n",max);for(i=1;i<=n;i++){printf("%d ",bx[i]);}printf("\n");}}输入数据:运行结果:迭代法:#include<stdio.h>#include<string.h>int check(int n,int vt[],int xt[],int m) {int i,s;s=0;for(i=1;i<=n;i++){if(xt[i]==1){s+=vt[i];}}if(s>m)return 0;elsereturn 1;}int main(){int i,j,k,w[20],v[20],x[20],bx[20],n,c,V,sum;freopen("inm.txt","r",stdin);while(scanf("%d%d",&n,&c)!=EOF){for(i=1;i<=n;i++)scanf("%d",&w[i]);for(i=1;i<=n;i++)scanf("%d",&v[i]);sum=0;memset(x,-1,sizeof(x));V=0;k=1;while(k>=1){while(x[k]<1){x[k]++;if(check(k,w,x,c)&& k==n){for(i=1; i<=n; i++){if(x[i] == 1)sum += v[i];}if(sum>V){for(i=0; i<=n; i++)bx[i] = x[i];V=sum;sum=0;}}else if(check(k,w,x,c)){k++;}}x[k]=0;;k--;}printf("%d\n",V);for(i=1;i<=n;i++){printf("%d ",bx[i]);}printf("\n");}}输入数据:运行结果:物品情况搜索结点数 递归法 n=3 w=20,15,10; c=25 v=20,30,25;迭代法 递归法 n=3 w=20,16,10; c=25 v=20,30,25; 迭代法 递归法n=4 w=10,20,30,40;c=30 v=4,3,2,1; 迭代法 递归法n=4 w=30,25,10,35c=40 v=7,9,3,6 迭代法 递归法n=4 w=7,3,4,5c=10 v=42,12,40,25 迭代法。

西电软院算法上机报告

西电软院算法上机报告

算法上机报告学号:13121234姓名:陈恒实验一一、实验内容1.编写程序实现书上2.3.7:运行时间为nlgn的算法确定n个整数的集合中是否存在两个数的和刚好为x。

先对n个整数的集合进行排序。

使用快速排序,时间复杂度即是nlgn,然后计算两数之和,可以知道快速排序(从小到大)后第一个元素begin为最小,最后一个元素end最大。

所以用最小和最大相加和x比较,大于x即是end太大,小于x就是begin太小。

一直循环直到begin==end时还没有就不存在了。

2.实现优先级队列。

用堆排序和一个结构体实现即可。

Java实现用类代替结构体。

并未编写测试用例。

3.实现快速排序。

问题1就是快速排序。

最大数比较是有序的数组,例如123456789.最小的比较是每次partition都能分成恰好两半,例如132。

n个相同的数快排比较计算次数n*(n-1)/2.原理:每次分一半都要从头到尾(比较n-1次)比较一次,最后分到每组只有2个为止(即是分n/2次)。

4.找两个已排序不同数组之间第k大的数。

有a,b两个数组。

把 A ,B平均分为前后两个部分,前部分有 x 个元素,后部分有 n-x 个元素(比如,由于 A 是有序的,所以后一部分的所有元素大于前一部分)。

A[x] = A的后一部分的第一个元素)。

然后使用分枝-限界法和递归。

每次比较k和a.size/2+b.size/2以及a[x]于b[x]的大小。

进而缩小其中一个数组一半大小。

实验截图:第一个:题目1和3 第二个:题目4,优先级队列没有写主方法二、实验心得本次实验对排序几个关键算法进行了实现,还练习了别的几个问题。

本来算法是很简单的,但是由于数组下标的原因总是出现越界问题。

说明在具体编程的时候还缺乏思考,需要多加训练。

还有就是选择分支的时候需要写下来不然光去想是很难把情况完全列出来的。

实验二一、实验内容以动态规划算法解决以下几个问题动态规划思想是找到并求解问题的最优子结构,然后递归定义最优子结构,再用自底向上的方法去构建一张表,最后用查表找到解。

西电软件学院算法实验研究报告_New

西电软件学院算法实验研究报告_New

西电软件学院算法实验研究报告————————————————————————————————作者:————————————————————————————————日期:第二次试验一、问题:Matrix-chain product分析:本题是矩阵链乘问题,需要求出最优括号化方案。

即在矩阵的乘法链上添加括号来改变运算顺序以使矩阵链乘法的代价降低。

可以分析该链乘的一个子段总结一些结论。

假设m[i,j]表示A i*…*A j的链成需要进行的乘法次数(假设j-i足够大),我们可以将A i*…*A j分为两段进行计算:(A i*…*A k)*(A k+1*…*A j)可以得出m[i,j]的递推公式可以得出,当i=j的时候,m[i,j]=0。

当i<j的时候。

k的取值范围是i到j-1,对于k的每一个取值都可以得到一个m[i,j]的值,取出最小值即时m[i,j]的最优化方案。

递推公式如下:可以根据上式得到一个递归算法。

本题即是求m[1,n]的值。

用二维数组m存储m[i,j]的值,用二维数组s来储存应当分割的位置。

以本题中第一个矩阵a) <3, 5, 2, 1,10>为例,可以得出如下矩阵:通过m数组可以得出最少的乘法次数,通过s数组可以输出最优方案。

遇到的问题:在输出s数组的结果的时候仍然需要递归调用,需要合适的控制递归的条件。

总结:在矩阵链乘问题中可以看出,动态规划结合递归的思想可以快捷的解决很多问题。

本题中,重点是归纳出m[i,j]的递推公式。

二、问题:Longest Common Subsequence分析:本题即是最长公共子序列问题。

假设有序列A[m]和序列B[n],显然,对于每一个[i,j],都对应着一个公共子序列的长度。

假设长度为c,就可以得到一个二维数组c[m,n]。

对于c[i,j],当Ai=Bj的时候,问题就转变为求A[1..i-1]和B[1..j-1]的公共子序列长度的问题,所以c[i,j]的长度就是c[i-1,j-1] + 1;同理,当Ai != Bj的时候,c[i,j]应该在c[i-1,j]与c[i,j-1]中取最大值。

算法设计技术与方法报告_西电公茂果老师授课

算法设计技术与方法报告_西电公茂果老师授课

西安电子科技大学作业题目算法设计技术与方法实验报告专业名称计算机系统结构班级学生姓名学生学号二0一四年十二月● 1.分别实现多项式求值的四种运算,若针对不同规模的输入值a,各算法的运行时间,问题规模n分别取10,50,100,150,200,300,400,500,10000,20000,50000,100000时绘制四种算法运行时间的比较图。

实验代码:num=[10 50 100 150 200 300 400 500 10000 20000 50000 100000];x=input('please enter x:')for m=1:12a=rand(1,num(m)+1);tic;p1(m)=polyval(a,x);t1(m)=toc;tic;p2(m)=0;for i=1:num(m)+1p2(m)=p2(m)+a(i)*x^(i-1);t2(m)=toc;endtic;p3(m)=a(1);q=1;for j=2:num(m)+1q=q*x;p3(m)=p3(m)+a(j)*q;t3(m)=toc;endtic;p4(m)=a(num(m)+1);for k=1:num(m);p4(m)=x*p4(m)+a(num(m)+1-k);t4(m)=toc;endendsemilogx(num,t1,'b+',num,t2,'gx',num,t3,'r*',num,t4,'ko');xlabel('num=10,50,100,150,200,300,400,500,10000,20000,50000,100000' ) ;ylabel('time');title('The comparison chart of four different methods for polyval')运行结果:结果分析:运行结果途中蓝色“+”代表采用MATLAB自带的多项式求值函数polyval实现时的时间开销。

西电DSP实验报告

西电DSP实验报告

西安电子科技大学数字信号处理(DSP)课程实验报告实验名称 VISUAL DSP++的使用入门电子工程学院 1402071 班同作者崔健孟智超杨伟祺实验日期 2017 年 5 月 16 日实验一:VISUAL DSP++的使用入门一、实验目的:熟悉VISUAL DSP++的开发环境二、实验内容:练习一:启动Visual DSP++,建立一个用C源代码的工程(Project),同时用调试器来评估用C语言所编写代码的性能;练习二:创立一个新的工程,修改源码来调用一个汇编(asm)程序,重新编译工程,用调试器来评估用汇编语言所写程序的性能;练习三:利用调试器的绘图(plot)功能来图形显示一个卷积算法中的多个数据的波形;练习四:利用调试器的性能统计功能(Statistical profile)来检查练习三中卷积算法的效率。

利用所收集到的性能统计数据就能看出算法中最耗时的地方。

三、实验步骤及实验结果:练习一:1)新建工程进入 Visual DSP++,显示Visual DSP++的集成开发和调试环境窗口,选择菜单File 中Open 打开文件:…\unit_1\dot_product_c \dotprodc.dpj。

2)编译 dotprodc工程在菜单 Project中选择 Build Project来对工程进行编译。

在本例子中,编译器会检测到一个未定义的错误,显示为:“.\dotprod_main.c”,line 115:error #20:identifier“itn”is undefined itn i;将该错误改正后,保存并重新编译,没有错误出现,编译成功。

3)运行VsualDSP++调试器在编译完成后,环境将自动进入调试状态,对于初次进入debugger,将显示对象选择对话框,在其中指定对象和处理器信息。

4)运行dotprod.c从 Debug菜单中选择 Run项,程序将被执行,其输出结果在 Output window中显示。

算法实验总结(6篇)

算法实验总结(6篇)

算法实验总结第1篇我不会忘记这难忘的几个月的时间。

毕业论文的制作给了我难忘的回忆。

在我徜徉书海查找资料的日子里,面对无数书本的罗列,最难忘的是每次找到资料时的激动和兴奋;亲手设计电路图的时间里,记忆最深的是每一步小小思路实现时那幸福的心情;为了论文我曾赶稿到深夜,但看着亲手打出的一字一句,心里满满的只有喜悦毫无疲惫。

这段旅程看似xxx布,实则蕴藏着无尽的宝藏。

我从资料的收集中,掌握了很多单片机、LED显示屏的知识,让我对我所学过的知识有所巩固和提高,并且让我对当今单片机、LED显示屏的最新发展技术有所了解。

在整个过程当中,我学到了新知识,增长了见识。

在今后的日子里,我仍然要不断地充实自己,争取在所学领域有所作为。

脚踏实地,认真严谨,实事求是的学习态度,不怕困难、坚持不懈、吃苦耐劳的精神是我在这次设计中最大的收益。

我想这是一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助。

在这次毕业设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。

在此更要感谢我的导师和专业老师,是你们的细心指导和关怀,使我能够顺利的完成毕业论文。

在我的学业和论文的研究工作中无不倾注着老师们辛勤的汗水和心血。

老师的严谨治学态度、渊博的知识、无私的奉献精神使我深受启迪。

从尊敬的导师身上,我不仅学到了扎实、宽广的专业知识,也学到了做人的道理。

在此我要向我的导师致以最衷心的感谢和深深的敬意。

算法实验总结第2篇根据县委《关于开展“联村联户、为民富民”行动的实施方案》的要求,我及时深入“双联”行动联系点――洛门镇石坪村开展实地调研,在走访贫困家庭、详细了解全村发展现状的基础上,与村“两委”班子讨论研究,开展了“联村联户、为民富民”行动,现将半年来工作情况总结如下:一、进村入户,开展调研,摸清了基本情况与发展现状。

县上双联动员会议之后,先后两次组织单位全体党员,进村入户,调查研究,和困难户互建了帮扶联系关系。

DSP实验报告 西电

DSP实验报告 西电

实验一算法:dot_product实验目的针对ADSP-Blacfin609DSP,利用简单的C程序实现矩阵的相乘,熟悉CCES编程环境实验装置计算机,电源,信号发生器,开发板,仿真器,示波器。

和debug调试功能。

实验步骤启动CCES,建立一个工程(Project);添加文件,编写程序,编译程序,如有错误,进行调整修改;用调试器来评估用C语言所编写代码的性能。

实验效果在console窗口可以看到两个矩阵相乘的结果。

实验心得通过本次试验让我掌握了利用简单的C程序实现俩个矩阵相乘的详细操作过程以及从中发现了自己还存在的一些问题。

实验过程中,在实验老师和同学的帮助下克服了许多困难,从中也有了自己的收获。

实验加深了我对CCES编程环境的熟悉度同时让我熟练掌握debug调试功能的操作方法。

总之,这是一次非常有意义有价值的实验,在实验中我获益良多。

下次如果有机会希望多参加这样的试验,尤其是实验老师很耐心很负责,不厌其烦的给我们讲解实验过程中不懂的细节。

实验二算法:fir滤波实验目的加深对fir滤波这种滤波方法的理解。

实验装置计算机,电源,信号发生器,开发板,仿真器,示波器。

实验任务1对信号的采集和输出2对信号进行滤波处理实验步骤1启动CCES,建立一个工程(Project),编写程序;2对给定的数据文件dsp2.dat数据文件(带噪声)并调用已给的fir相关函数进行fir滤波;3滤波结束后生成新的dsp2New.dat文件,在matlab中进行plot操作可看到滤波效果是否实现。

实验原理1,Fir滤波器原理Fir滤波器又叫有限长单位冲击响应滤波器。

输入序列X(n),输出序列Y(n),fir 滤波器的实现在于序列的卷积算法:Y(n)=h(n)*X(n)2,Fir滤波器的设计方法设计方法有俩种:窗函数设计法和频率抽样设计法实验结果正确连接器件之后,启动CCES,建立一个工程后,加入实验程序,然后进行调试,确定没有错误之后运行程序,利用信号发生器产生输入信号,并对所得图像进行采集,调用已给的fir相关函数进行fir滤波,滤波之后得到一个新的数据文件。

西电软件学院c++上机实验报告

西电软件学院c++上机实验报告

C++实验报告XX:妍学院:软件学院学号:一、实验要求•完成一个完整的简化系统:一卡通乘车系统。

•一卡通乘车系统主要完成的功能是,支持一卡通刷卡乘车;对每一卡通的使用情况及费用进行统计;对每辆班车的运行情况进行统计。

•在实现该系统的功能时,不要现图形界面,控制台输出即可。

•必须采用面向对象程序设计的方式实现。

二、程序中所设计的类class StuCard;Class People;class bus;三、类中的关键数据成员和成员函数1、StuCard类class StuCard{public:void pay();//上车刷卡时调用此函数,根据卡的类型扣除上车费用并给出相应提示int GetRest();//获取卡余额StuCard(string name,string id,int money,int type,int count);string get_name(){return name; }string get_id(){return id;}int get_type(){return type;}int get_money(){return money;}int get_count(){return count;}//乘车次数private:string name;//持卡人string id;//卡号int money;//余额int type;//卡的类型(type=1,学生卡;type=2,教师卡;type=3,限制卡)int count; //乘车次数} ;//定义了一个StuCard的类,用type来区分卡的类型,用get_X函数在主函数中来获得数据成员的值2、bus类struct time{int hour;int minute;};class bus{string bnumber;//车牌号string xnumber;//型号int people;//载乘人数string name;//驾驶员struct time stime;//发车时间struct time etime;//到站时间struct time t_stime;//实际发车时间struct time t_etime;//实际到站时间public:bus(string bn,string xn,int p,string n,int sh,int sm,int eh,int em){ bnumber=bn;xnumber=xn;people=p;name=n;stime.hour=sh;stime.minute=sm;etime.hour=eh;etime.minute=em;}//构造函数string get_b(){return bnumber;}//获得车牌号string get_x(){return xnumber;}//获得车的型号int get_p(){return people;}//获取上车人数string get_n(){return name;}//获取驾驶员void Stime(int a,int b);//获取预计发车时间void Etime(int c,int d);//获取预计到站时间void show(string bnumber,string xnumber,int people,string name);void T_stime(int ta,int tb);//获取实际发车时间void T_etime(int tc,int td);//获取实际到站时间float peoplebi(float e,float f);//载乘人数比int get_sthour(); //获得发车时间的小时int get_stminute();//获得发车时间的分钟int get_ethour();//获得到站时间的小时int get_etminute();//获得到站时间的分钟void stshow(int p,int q);void etshow(int x,int y);};3、people类class People{string name;//string sex;//性别string work;//职务string office;//所属单位string number;//学号/工号public:People(string n,string s,string w,string o,string b);//构造函数void readPeople();//用于在主函数中读入人的信息void show(string name,string sex,string work,string office,string number);void addPeople();//申请一新卡void deletePeople();//注销一卡通string get_name(){return name;}string get_sex(){return sex;}string get_work(){return work;}string get_office(){return office;}string get_number(){return number;}};四、运行流程的说明主程序分为两个系统:乘车系统和一卡通管理系统。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第二次试验一、问题:Matrix-chain product分析:本题是矩阵链乘问题,需要求出最优括号化方案。

即在矩阵的乘法链上添加括号来改变运算顺序以使矩阵链乘法的代价降低。

可以分析该链乘的一个子段总结一些结论。

假设m[i,j]表示A i*…*A j的链成需要进行的乘法次数(假设j-i足够大),我们可以将A i*…*A j分为两段进行计算:(A i*…*A k)*(A k+1*…*A j)可以得出m[i,j]的递推公式可以得出,当i=j的时候,m[i,j]=0。

当i<j的时候。

k的取值范围是i到j-1,对于k的每一个取值都可以得到一个m[i,j]的值,取出最小值即时m[i,j]的最优化方案。

递推公式如下:可以根据上式得到一个递归算法。

本题即是求m[1,n]的值。

用二维数组m存储m[i,j]的值,用二维数组s来储存应当分割的位置。

以本题中第一个矩阵a) <3, 5, 2, 1,10>为例,可以得出如下矩阵:通过m数组可以得出最少的乘法次数,通过s数组可以输出最优方案。

遇到的问题:在输出s数组的结果的时候仍然需要递归调用,需要合适的控制递归的条件。

总结:在矩阵链乘问题中可以看出,动态规划结合递归的思想可以快捷的解决很多问题。

本题中,重点是归纳出m[i,j]的递推公式。

二、问题:Longest Common Subsequence分析:本题即是最长公共子序列问题。

假设有序列A[m]和序列B[n],显然,对于每一个[i,j],都对应着一个公共子序列的长度。

假设长度为c,就可以得到一个二维数组c[m,n]。

对于c[i,j],当Ai=Bj的时候,问题就转变为求A[1..i-1]和B[1..j-1]的公共子序列长度的问题,所以c[i,j]的长度就是c[i-1,j-1] + 1;同理,当Ai != Bj的时候,c[i,j]应该在c[i-1,j]与c[i,j-1]中取最大值。

另外,当i或者j等于0的时候,显然c的值为0。

由上面所述,可以得到递推公式如下:为了解决这个问题,还如要定义另一个数组用于存放c数组中每一个元素的来源。

这个来源其实就反映了公共子串。

可以通过箭头表示来源,相连的箭头序列中指向左上方的箭头最多的一串对应的就是最长公共子序列。

比如对于题目中给出的第一个例子X: xzyzzyx Y: zxyyzxz可以用一个矩阵表示计算的过程:遇到的问题:在算法中,‘=’是属于‘<’还是‘>’会给结果带来不同。

在输出子序列的时候,最长公共子序列可能不止一个,但是最终未能解决还是只能输出一个。

总结:最长公共子序列问题可以利用动态规划很好的解决。

动态规划的思想就是根据规律获得推导公式,然后解决问题。

三、问题:Longest Common Substring分析:最长公共子序列问题就是和最长公共子串问题差不多,就是当当Ai != Bj 的时候,对应的c[i,j]置为0。

推导公式如下:最终c数组的最大值max对应的就是最长公共子串,只需要将从本位置向前述max-1个的子串即是所求子串。

总结:本题就是第二题的一种特殊的情况,即c数组中的值不能从左和上两个方向获取,其他基本相同。

在代码上,只需要修改小部分代码就可以实现该问题。

四、问题:Max Sum分析:求和最大的子串。

这个问题和第三题很像,不过这次不用二维数组而是使用两个标记来标志所求子串的起始位置(maxb)结束位置(maxe)。

思路是,对于第i个元素,如果当前元素与目前选中的序列的sum小于0,那么这么序列不会被选择,更新sumb与sume的值;如果sum仍然大于0,则sum可以选中。

比较sum与max的值,如果sum>max,则更新maxb与maxe的值。

递推公式如下:遇到的问题:在全是负数时出现问题,后来讲max的初始值设置为第一个元素的值后就能正常了。

总结:动态规划能解决很多问题,找到递推公式非常重要。

五、问题:Shortest path in multistage graphs. Find the shortest path from 0 to 15 for the following graph.分析:观察本题图的特点,发现可以将图分解为7个部分,以此可以计算到每一个节点的最短的路径。

即可求出最终的最短路径。

总结:结合本题中的特殊情况,可以采用适当的方法来处理。

第三次实验一、问题:Knapsack Problem. There are 5 items that have a value and weight list below, the knapsack can contain at most 100 Lbs. Solve the problem both as fractional knapsack and 0/1 knapsack.分析:本题是背包问题的两个解法。

对于部分背包来说比较简单,就是将单位价值大的物品优先放置到背包中,这样就能在背包中获取最大的价值。

但是对于0/1背包问题来说,就相对复杂了。

可以通过贪心算法解决。

经过分析,我们转化这个问题为将n件物品放置到容量为w的容器中。

这里,每件物品只可能有一个状态:放入/不放入,我们用0/1来对应。

用v[i,w]来表示前i 件物品选出重量不超过w的物品,并且构成的最大的价值。

那么,可以分析得出v[i,w]的递推式。

如果i=0或者w=0,显然v[I,w] = 0;如果第i件物品的重量wi>w则i不可能放入容器中;如果i能够放入容器(即wi<w)则在vi+v[i-1,w-wi] > v[i-1,w]时才可能会放入。

关系式如下这样,我们可以认为,每一次都恰到好处的选择了放或者不放一个物品。

直到最后一个物品,我们得到的一定就是最好的结果总结:背包问题是一个典型的贪心算法的例子。

在解决问题的时候可以将当前步骤做到最好,然后通过推导,有可能得到一个关系式,这样就能使问题得到解决。

在本题中,我们可以通过第i件物品是否应该放在容量的w的背包中进行分析,最终得到了一个递推式。

二、问题:A simple scheduling problem. We are given jobs j1, j2…jn, all with knownrunning times t1, t2…tn, respectively. We have a single processor. What is the best way to schedule these jobs in order to minimize the average completion time. Assume that it is a nonpreemptive scheduling: once a job is started, it must run to completion. The following is an instance。

分析:这是一个线程调度问题,通过操作系统课程的学习,我们了解到应当采用短作业优先的调度方式。

可以采用快速排序对进程顺序进行排序即可得到调度时间。

总结:在进程调度问题中,如果想获取最短的平均周转时间(单线程)应当使用短作业优先的算法。

三、问题:单源点最短路径分析:本题中,因为路径中存在负边,所以应当使用bellman-ford算法。

为了方便的使用该算法,需要首先创建合适的边的数据结构。

这样,在遍历边的时候比较快捷。

首先需要初始化每一个节点的d值,源点的d值为0,其他点的d值的初始值为max(一个足够大的数)。

表示在初始时,源点到各点都不可达。

然后,对每条边进行松弛操作,进行|V|-1次松弛之后,可以得到结果。

随后,检测结果,如果依然存在可松弛的节点的话,说明存在权重为负的环路。

表明结果不存在。

总结:该算法并没有在一开始就计算是否存在权值为负的环路。

而是通过结果来分析,如果没有负环路,一定能在松弛循环结束后便不能继续被松弛。

由此,可以判断是否存在最短路径。

所以,该算法不仅可以判断一个图是否存在最短路径,还能得到最短路径。

四、问题:All-pairs shortest paths分析:所有节点对的最短路径问题,应当使用Johnson算法。

Johnson算法需要用dijkstra和bellman-ford算法作为子程序。

如果图G=(V,E)中所有的边权重都为非负值,可以通过在每一个节点使用dijkstra算法求出所有节点虹之间的最短路径;如果该图包含权值为负的边,但是没有权重为负的环路,那么只要计算一组新的非负权重值,然后使用同样的方法即可。

总结:Johnson算法相当于是对dijkstra算法和bellman-ford算法的应用,结合这两个算法,通过使用重新赋值权重来生成非负权重,最终得到所有节点对之间的最短路径。

第四次实验一、题目:0/1 Knapsack Problem. There are 5 items that have a value and weight list below, the knapsack can contain at most 100 Lbs. Solve the problem using back-tracking algorithm and try to draw the tree generated.分析:使用回溯法解决0/1背包问题。

可以用一个数组来记录“选中”物品的情况。

首先,选择第一件物品,如果超重的话不选择该物品;如果没有超重,继续添加下一个物品,这样选择下去,最终一定可以选择完全部的物品。

计算目前选择物品的totalValue值。

继续回溯,如果的到新的totalValue值,如果大于前一个值,那么更新该值,并且更新保存选择的数组中。

总结:从8皇后问题可以发现回溯法的一般方法。

经过代入到这个问题中,发现确实可行。

回溯法需要一个合理的递归函数,这个函数的终止条件也需要认真的分析。

比如这一题和8皇后问题都可以使用元素的个数作为一个结束条件,另外还需要注意导致“回溯”的位置。

二、题目:Solve the 8-Queen problem using back-tracking algorithm.分析:8皇后问题是回溯法的一个典型的例题。

假设目前已经在奇葩的前i(i<8)行放置了i和皇后并且位置合法。

然后我们放置第j(j=i+1)个皇后,先将j 放置在第一列,如果合法就放置第j+1个皇后;如果放置在当前列不合法,就将j皇后放置在第二列……以此类推,如果全部不行,将会返回调用该函数的上一层函数。

如果i的值等于8,说明已经完全摆放成功,就可以输出结果,输出后返回上一层调用,继续查找其他的符合题意的皇后摆放。

相关文档
最新文档