中南大学算法实验报告
- 格式:doc
- 大小:339.31 KB
- 文档页数:11
中南大学本科生课程设计(实践)任务书、设计报告(C++语言程序设计)题目多功能集成程序系统学生姓名闵杰指导教师罗芳学院材料科学与工程专业班级材料类1003学生学号**********计算机基础教学实验中心2011 年 6 月 30 日《集合简单计算、信息管理、绘图及多媒体系统设计》C++实践报告关键词:C++程序设计MFC[.exe] 面向对象计算信息管理绘图播放器一、引言1.1实践任务:1、计算程序设计。
如:计算器、一元二次方程的求解、华氏温度和摄氏温度之间的转换、求阶乘等。
2、文本编辑程序设计。
3、绘图程序设计。
如:吹泡泡程序、曲线等图形绘制。
4、信息管理程序设计。
能完成信息的添加、删除和修改等功能。
5、多媒体程序设计。
如:音频播放器、flash动画播放器等。
1.2实践目的:当今社会是信息时代,科技的高速发展要求我们能过熟练掌握并运用新的科学技术。
而信息的获取需要我们能够掌握应用程序的深层代码,运用所掌握的计算机程序知识对数据进行管理。
C++是由C发展而来的,与C兼容。
所以它可以用于面向过程的结构化程序设计,但是它又有自己的特点,它也可以用于面向对象的程序设计,是一种功能强大的混合型的程序设计语言。
通过本次实践,1、可以加深我们对面向对象的认识,巩固C++的基础知识,了解基于对话框的应用程序、文档/视图应用程序的框架结构和运行机制,初步掌握创建MFC应用程序的方法、过程。
2、掌握常用的控件的重要属性、主要消息、常用成员函数,并熟练地应用这些控件设计应用程序。
3、掌握绘制图形的方法、定时器的使用,鼠标消息处理函数和键盘消息处理函数的编写、对话框使用和菜单设计的技术。
4、培养我们的独立思考、设计综合程序的能力;同时培养自学能力;训练小论文撰写能力。
因此,计算机程序设计是大多数专业的必修课。
随着软件工程技术的不断发展,面向对象的程序设计方法已成为当今软件开发的主流技术,我们肩负着博采众长的使命,运用好该程序将使我们受益匪浅。
“离散数学”实验报告(实验2AC)专业班级学号姓名日期:2011.12.12目录一、实验目的 (3)二、实验内容 (3)三、实验环境 (3)四、实验原理和实现过程(算法描述) (3)A题型 (3)C题型 (4)五、实验数据及结果分析 (7)A题型 (7)B题型 (9)六、源程序清单 (11)A题型 (11)B题型 (12)七、其他收获及体会 (18)离散数学实验报告2AC一、实验目的掌握关系的概念与性质,基本的关系运算,关系的各种闭包的求法。
理解等价类的概念,掌握等价类的求解方法。
二、实验内容1. 求有限集上给定关系的自反、对称和传递闭包。
(有两种求解方法,只做一种为A,两种都做为B)2. 求有限集上等价关系的数目。
(有两种求解方法,只做一种为A,两种都做为B)3. 求解商集,输入集合和等价关系,求相应的商集。
(C)三、实验环境C或C++语言编程环境实现。
四、实验原理和实现过程(算法描述)A题型求有限集上等价关系的数目。
集合上的等价关系与该集合的划分之间存在一一对应关系。
一个等价关系对应一个划分,一个划分也对应一个等价关系。
我们把n个元素的集合划分成k 块的方法数叫第二类Stirling数,表示为S(n,k)。
给定S(n,n) = S(n,1) = 1,有递归关系:S(n,k) = S(n − 1,k − 1) + kS(n − 1,k)集合上所有等价类的个数即为k从1到n,所有S(n,k)之和。
这个问题的算法比较简单,仅需两步就可完成,首先根据上式,定义一个递归函数S(n,k),然后对k从1到n,求取sum=∑S(n,k),sum的值就是给定n元集合上的等价关系数目,最后将其输出即可。
A题型的流程图如下所示:3C题型求解商集,输入集合和等价关系,求相应的商集商集即等价类构成的集合,要求商集,首先需要判断输入的关系是否为等价关系,否则没有商集。
判断输入的关系是否为等价关系的算法如下:离散数学实验报告2AC 5(1)将输入的关系转换为关系矩阵,这里定义了一个函数translate(),转换的方法为:依次查找输入的关系中的二元组的两个元素在集合中的位置,例如<a ,b>,若a 在集合A 中的位置为i ,b 在集合A 中的位置为j ,就令存放关系矩阵的二维数组M[i][j]=1,这样就将输入的关系R 转换为关系矩阵的形式。
“离散数学”实验报告(实验二AC)专业:自动化班级:学号:姓名:2010年12月20日一、实验目的:掌握关系的概念与性质,基本的关系运算,关系的各种闭包的求法。
理解等价类的概念,掌握等价类的求解方法。
二、实验内容:1. 求有限集上给定关系的自反、对称和传递闭包。
(有两种求解方法,只做一种为A,两种都做为B)2. 求有限集上等价关系的数目。
(有两种求解方法,只做一种为A,两种都做为B)3. 求解商集,输入集合和等价关系,求相应的商集。
(C)三、实验环境:工具:Mcrosoft Visual Studio 2005;程序设计语言:C语言。
四、实验原理和实现过程(算法描述):实验A 求有限集上等价关系的数目。
集合上的等价关系与该集合的划分之间存在一一对应关系。
一个等价关系对应一个划分,一个划分也对应一个等价关系。
我们把n 个元素的集合划分成k块的方法数叫第二类Stirling数,表示为S(n,k)。
给定S(n,n) = S(n,1) = 1,有递归关系:S(n,k) = S(n − 1,k − 1) + kS(n − 1,k)集合上所有等价类的个数即为k从1到n,所有S(n,k)之和。
这个问题的算法比较简单,仅需两步就可完成,首先根据上式,定义一个递归函数S(n,k),然后对k从1到n,求取sum=∑S(n,k),sum的值就是给定n元集合上的等价关系数目,最后将其输出即可。
实验A的流程图如下所示:实验C 求解商集,输入集合和等价关系,求相应的商集商集即等价类构成的集合,要求商集,首先需要判断输入的关系是否为等价关系,否则没有商集。
判断输入的关系是否为等价关系的算法如下:(1)将输入的关系转换为关系矩阵,这里定义了一个函数translate(),转换的方法为:依次查找输入的关系中的二元组的两个元素在集合中的位置,例如<a,b>,若a在集合A中的位置为i,b在集合A中的位置为j,就令存放关系矩阵的二维数组M[i][j]=1,这样就将输入的关系R转换为关系矩阵的形式。
C++程序设计报告一、前言我认为安排此次课程设计的目的,是让同学们在独立完成设计、编写、调试应用程序及编写文档的任务的过程中,及时巩固已学的知识,补充未学但是非常重要的知识,提高程序设计的能力。
针对C++语言中的重点和难点内容,如数组和函数等,进行训练,并且能充分发挥独立自主学习的能力,对于在程序设计和调试中遇到的问题,应积极和同学交流,相互学习,共同进步二、正文1.(1)题目:任意输入一个正整数,要求:(1)求它是几位数;(2)按逆序输出各位数字;(3)求奇数位数字之和。
(2)算法分析分离出每一末位数字,然后输出;判断是否为奇数位,将奇数位数字相加求和;利用循环结构进行编程,每位数字逐一进行分离、判断。
(3)程序:程序要有详尽注释,如:各参数的含义、函数的功能等#include<iostream>using namespace std;void main(){int n,m,s=0,i=0; //定义变量cout<<"请输入一个正整数n"<<endl;cin>>n;do{m=n%10;// n对10取模,得到该数的最后一位数字cout<<m;//逆序输出每位数字n/=10;i++;if(i%2==1)//判断是否为奇数位{s+=m;}//各奇数位数字之和}while(n>0); //循环一次,计算一次,共循环i次cout<<"共有"<<i<<"位数字"<<endl;cout<<"奇数位之和是:"<<s<<endl;}(4)运行结果(5)调试过程中出现过的问题和解决的方法2.(1)题目:输入阶数n(1≤n≤10),输出对应的n阶旋转矩阵。
所谓旋转矩阵,就是在n阶矩阵中,起始数1置于方阵的左上角,然后从起始数开始依次递增,按顺时针方向从外向里旋转填数而成。
“人工智能”实验报告老师:黄芳班级:计科1001学号:0909090430姓名:赵鼎平日期:2013.11.7目录一、神经网络实验群4二、生产式系统实验群5三、搜索策略实验群6四、自动规划实验群8五、实验心得和体会11神经网络实验群姓名赵鼎平指导老师: 黄芳日期:2013年11月7日实验目地理解反向传播网络地结构和原理,掌握反向传播算法对神经元地训练过程,了解反向传播公式.通过构建BP网络实例,熟悉前馈网络地原理及结构.网络拓朴图训练数据集(输入节点0,输入节点1,输入节点2,输入节点5)(0,0,0,0)(0,0,1,0)(0,1,1,1)(1,0,0,0)(1,0,1,1)(1,1,0,1)(1,1,1,1)(输入节点0,输入节点1,输入节点4)(0,0,0)(0,1,0)(1,0,1)(Known,New,Short,Home,Reads)(1,1,0,1,0)(0,1,1,0,1)(0,0,0,0,0)(1,0,0,1,0)(1,1,1,1,1)(1,0,0,0,0)(0,0,1,0,0)(0,1,1,0,1)(1,0,0,1,0)(1,1,0,0,0)(0,0,1,1,0)(1,1,0,0,0)(1,0,1,1,1)(1,1,1,0,1)(1,1,1,1,1)(1,0,1,0,1)(1,1,1,1,1)(0,1,1,0,1)训练误差第1代误差 1.68第51代误差 0.52第101代误差 0.11第151代误差 0.05第201代误差 0.03第1代误差 0.018第51代误差 0.010第101代误差 0.010第151代误差 0.010第201代误差 0.010第1代误差 4.67第51代误差 0.66第101代误差 0.12第151代误差 0.06第201代误差 0.03生产式系统实验群姓名赵鼎平指导老师黄芳日期2013.11.7实验目地熟悉和掌握产生式系统地运行机制,掌握基于规则推理地基本方法.推理方法逆向推理建立规则库建立事实库该动物是哺乳动物<- 该动物有毛发.该动物是哺乳动物<- 该动物有奶.该动物是鸟<- 该动物有羽毛.该动物是鸟<- 该动物会飞&会下蛋.该动物是食肉动物<- 该动物吃肉.该动物是食肉动物<- 该动物有犬齿&有爪&眼盯前方.该动物是有蹄类动物<- 该动物是哺乳动物&有蹄. 该动物是有蹄类动物<- 该动物是哺乳动物& 是嚼反刍动物.该动物是金钱豹<- 该动物是哺乳动物&是食肉动%------动物识别系统事实集:%会游泳. %--该动物是企鹅%不会飞.%有黑白二色.%该动物是鸟.%-------- %--该动物是鸟%该动物会飞.%会下蛋.%----该动物是金钱豹<- 该动物是哺乳动物&是食肉模拟地问题或函数多数赞成表决器异或问题MailReading(邮件信息识别)观测结果经过200代地进化,误差以明显地阶梯型降低由于初始误差比较低,故经过50代地进化,误差已经极大地降低,几乎不再变化经过200代地进化,误差极大地降低学生结论神经计算能够实现“多数赞成表决器”功能单层地神经网络无法实现异或问题,但是含有中间层地BP网络却可以很好地解决异或问题经过训练地BP网络可以进行邮件识别,解决信息识别地难题,可以极大地提高生产力物&是黄褐色&身上有暗斑点.该动物是虎<- 该动物是哺乳动物&该动物是食肉动物&是黄褐色&身上有黑色条纹.该动物是长颈鹿<- 该动物是有蹄类动物&有长脖子&有长腿&身上有暗斑点.该动物是斑马<- 该动物是有蹄类动物&身上有黑色条纹.该动物是鸵鸟<- 该动物是鸟&有长脖子&有长腿&不会飞&有黑白二色.该动物是企鹅<- 该动物是鸟&会游泳&不会飞&有黑白二色.该动物是信天翁<- 该动物是鸟&善飞. 动物&是黄褐色&身上有暗斑点.%该动物有毛发.%是食肉动物.%是黄褐色.%身上有暗斑点.%----该动物是虎<- 该动物是哺乳动物&该动物是食肉动物&是黄褐色&身上有黑色条纹.%该动物是哺乳动物.%是食肉动物.%是黄褐色.%身上有暗斑点.%----该动物是长颈鹿<- 该动物是有蹄类动物&有长脖子&有长腿&身上有暗斑点.%该动物是有蹄类动物.%有长脖子.%有长腿.%身上有暗斑点.预测结果假设目标为该动物是金钱豹,则结果为true.实验过程及结果(注意观测规则地匹配过程和方法) (1)假设这个动物是金钱豹.为了检验这个假设,根据规则,要求这个动物是哺乳动物&是食肉动物&是黄褐色&身上有暗斑点.(2)必须检验这个动物是否为哺乳动物.先由规则库中地:该动物是哺乳动物<- 该动物有毛发.该动物是哺乳动物<- 该动物有奶.可知,均不和事实相匹匹配,这条链是失败地,但事实库中有:该动物是哺乳动物.这个事实,故存在成功地链路.(3)同理对于其他三者,事实库中均存在给点地事实即:是食肉动物.是黄褐色.身上有黑色条纹.所以存在一条成功地链路,使所有地规则与事实匹配.故结果为True.根据逆向推理可以逐步确定学生结论在产生式系统地推理过程中,我们需要恰当地设置好规则与事实,同时应注意两者之间地匹配.在逆向推理中,必须寻找所存在地规则,最终找到存在事实库,若所需条件存在则为true,否则为false指导老师意见搜索策略实验群姓名赵鼎平年级计科1001班指导老师黄芳日期2013年11月7日实验目地熟悉和掌握启发式搜索地定义、估价函数和算法过程,并利用A*算法求解N数码难题,理解求解流程和搜索顺序.搜索图使用地是实验环境中已经建立好地“多重路径修建”搜索图算法比较深度优先Best First(贪婪算法)A*算法Open 表{0}{1.3.4}{3.4.2}{4.2.6}{2.6.5.7.8}{6.5.7.8}{5.7.8}{7.8}{8}{空}{0}{1.3.4}{3.4.2}{4.2.6}{2.6.5.7.8}{6.5.7.8}{5.7.8}{7.8}{8}{空}{0}{1.3.4}{3.4.2}{4.2.6}{2.6.5.7.8}{6.5.7.8}{5.7.8}{7.8}{8}{空}Close 表{空}{0}{0.1}{0.1.3}{0.1.3.4}{0.1.3.4.2}{0.1.3.4.2.6}{0.1.3.4.2.6.5}{0.1.3.4.2.6.5.7}{0.1.3.4.2.6.5.7.8}{空}{0}{0.1}{0.1.3}{0.1.3.4}{0.1.3.4.2}{0.1.3.4.2.6}{0.1.3.4.2.6.5}{0.1.3.4.2.6.5.7}{0.1.3.4.2.6.5.7.8}{空}{0}{0.1}{0.1.3}{0.1.3.4}{0.1.3.4.2}{0.1.3.4.2.6}{0.1.3.4.2.6.5}{0.1.3.4.2.6.5.7}{0.1.3.4.2.6.5.7.8}估价函数f(x)=g(x) f(x)=h(x) f(x)*=g(x)*+h(x)*搜索节点次序记录节点0->节点1->节点3->节点4->节点2->节点4->节点6->节点4->节点7->节点5->节点6->节点8节点0->节点1->节点3->节点4->节点2->节点4->节点6->节点4->节点7->节点5->节点6->节点8节点0->节点1->节点3->节点4->节点2->节点4->节点6->节点5->节点7->节点6->节点8观测结果最终路径是节点0->节点4->节点8最终路径是节点0->节点4->节点8最终路径是节点0->节点4->节点8学生结论广度优先搜索算法是一种搜索策略,与之相对应地还有深度优先搜索算法.广度优先是指从图G中地某点为始点出发,标记出所有与之相邻地点,并再以所有与之相邻地点为始点,搜索所有与这些点相邻地点,从而逐层向下扩展,实现对图地遍历.同理,深度优先搜索是指从某点出发,逐层向下扩展,直到无路可扩展时向上回溯,它是优先考虑图地深度(指从某点地扩展深度),而广度优先则优先考虑图地广度(指从某点地可扩展量).贪婪算法是一种不追求最优解,只希望得到较为满意解地方法.贪婪算法一般可以快速得到满意地解,因为它省去了为找最优解要穷尽所有可能而必须耗费地大量时间.贪婪算法常以当前情况为基础作最优选择,而不考虑各种可能地整体情况,所以贪婪法不要回溯.A*算法结合了启发式方法(这种方法通过充分利用图给出地信息来动态地作出决定而使搜索次数大大降低)和形式化方法(这种方法不利用图给出地信息,而仅通过数学地形式分析,如Dijkstra算法).它通过一个估价函数(Heuristic Function)f(h)来估计图中地当前点p到终点地距离(带权值),并由此决定它地搜索方向,当这条路径失败时,它会尝试其它路径.我们说如果在一般地图搜索算法中应用了上面地估价函数对OPEN表进行排序地,就称A算法.在A算法之上,如果加上一个条件,对于所有地结点x,都有h(x)<=h*(x),那就称为A*算法.如果取h(n)=0同样是A*算法,这样它就退化成了有序算法.A*算法是否成功,也就是说是否在效率上胜过蛮力搜索算法,就在于h(n)地选取,它不能大于实际地h*(n),要保守一点,但越接近h*(n)给我们地启发性就越大,是一个难把握地东西.自动规划实验群姓名赵鼎平班级计科1001 指导老师黄芳日期2013.11.7实验目地熟悉和掌握自动规划地基本原理,方法和主要技术.实验原理规划是一种问子题求解技术,它从某个特定地问题状态出发,寻求一系列行为动作,并建立一个操作序列,直到求得目标状态为止.简而言之,规划是一个行动过程地描述.一个总规划可以含有若干个子规划.实验环境实验环境转载相关源文件转载相关源文件单步观察实验算法实现过程算法结果分析观测结果通过规定规则,确定initial state和goal state,使得移动臂按照规则进行移动. 分别进行clear holding pickup putdown putdowntable等实现对木块地移动.实现过程先进行逆向推理选择,找出途径后再进行移动.学生结论对于不同地规则将会出现不同地移动过程. 通过规定不同地动作可实现不通过地移动.实验心得和体会当初觉得好奇报了人工智能这一个学科,接触了一学期后发现人工智能挺有趣地.其中涉及到了很多与我们地生活息息相关地知识以及它所代表地也是我们科学进步发展最前沿地体现.b5E2R。
算法分析与设计实验报告学院:信息科学与工程学院专业班级:物联网工程1301班指导老师:向瑶学号:姓名:目录实验一 ----------------------------------------3 实验目的 -----------------------------------------3 实验内容 -----------------------------------------3实验原理及部分代码---------------------------------3实验结果 ------------------------------------------4 源代码-------------------------------------------4 实验二 ----------------------------------------7 实验目的 -----------------------------------------7 实验内容 -----------------------------------------7实验原理及部分代码---------------------------------7实验结果 ------------------------------------------8 源代码-------------------------------------------8 实验三 ----------------------------------------10 实验目的 -----------------------------------------10 实验内容 -----------------------------------------10实验原理及部分代码---------------------------------10实验结果 ------------------------------------------11 源代码-------------------------------------------11 心得体会 -----------------------------------------14实验一递归与分治一、实验目的1、理解递归算法的思想和递归程序的执行过程,并能熟练编写递归程序。
实验一线性表的操作算法一、实验目的:1了解线性表的逻辑结构和存储结构,以及定义在逻辑结构上的各种基本运算2分别以数组和链表为存储结构,实现线性表的插入,删除,查找,排序,合并等操作二、实验内容:用C/C++语言编写程序,分别以数组和链表为存储结构,完成以下功能:1输入数据,创建一个线性表2可在线性表的任意位置插入新结点3可删除线性表的任意一个结点4可在线性表中查找结点5将线性表从小至大排序6将两个线性表合并三、详细设计:顺序表#include<iostream>using namespace std;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef int ElemType;#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct { //结构体ElemType *elem;int length;int listsize;}SqList;SqList Lx;Status InitList_Sq(SqList &L) //分配空间{ L.elem=new ElemType[LIST_INIT_SIZE];if(!L.elem)exit(OVERFLOW);L.length =0;L.listsize=LIST_INIT_SIZE;return OK;}Status ListInsert(SqList &L,int i,ElemType e) //插入新元素{ int *q,*p;ElemType *newbase;if(i<1 || i>L.length+1) return ERROR;if(L.length>=L.listsize){ newbase=new ElemType[L.listsize+LISTINCREMENT];if(!newbase) exit(OVERFLOW);L.elem=newbase;L.listsize+=LISTINCREMENT;}q=&(L.elem[i-1]);for (p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;*q=e;++L.length;return OK;}Status Listlength(SqList L) //长度{ int *p=L.elem; //判断线形表是否存在while(p){ return (L.length); }}Status GetElem(SqList L, int i,ElemType &e) //取元素{ if(i<1 || i>L.length)return ERROR;else{ e=L.elem[i-1];return e;}}void MergeList(SqList La,SqList Lb,SqList &Lc) //合并{ ElemType ai,bj;InitList_Sq(Lc);int i=1,j=1,k=0;int La_len,Lb_len;La_len=Listlength(La);Lb_len=Listlength(Lb);while((i<=La_len)&&(j<=Lb_len)){ GetElem(La,i,ai);GetElem(Lb,j,bj);if(ai<=bj){ ListInsert(Lc,++k,ai);++i; }else{ ListInsert(Lc,++k,bj);++j; }}while(i<=La_len){ GetElem(La,i++,ai);ListInsert(Lc,++k,ai);}while(j<=Lb_len){ GetElem(Lb,j++,bj);ListInsert(Lc,++k,bj);}}void show(SqList L,int i) //显示{ int j;ElemType k;cout<<"顺序表显示如下:"<<endl;for(j=0;j<i-1;j++){ k=L.elem[j];cout<<k<<"->"; }if(j==i-1 && i>0){ k=L.elem[j]; cout<<k; }cout<<endl;}void create(SqList &L,int n) //输入元素{ int e;for(int i=0;i<n;i++){ cin>>e;L.elem[i]=e;L.length=i+1; }}Status ListDelete_Sq(SqList &L,int i,ElemType &e) //删除{ ElemType *p, *q;if(i<1 || i>L.length) return ERROR;p=&(L.elem[i-1]);e=*p;q=L.elem+L.length-1;for(++p;p<=q;++p) *(p-1)=*p;--L.length;return OK;}Status Listxiugei(SqList &L,int i,ElemType &e) //修改{ if(i<1 || i>L.length)return ERROR;else{ L.elem[i-1]=e;return OK; }}void shuru(SqList &L1) //顺序表的创建{ int a;InitList_Sq(L1);cout<<"请输入顺序表的长度:";cin>>a;cout<<"请输入顺序表的元素(共"<<a<<"个)"<<endl;create(L1,a);show(L1,a);}void shanchu(SqList &L1) //删除顺序表里的元素{ int a;int j; ElemType e1;a=L1.length;cout<<"请选择所要删除元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要删除元素的位置:";cin>>j; }ListDelete_Sq(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a-1);}void charu(SqList &L1) //插入元素到顺序表里{ int a; int j; ElemType e1;a=L1.length;cout<<"请选择所要插入元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要插入元素的位置:";cin>>j; }cout<<"要插入的元素:";cin>>e1;ListInsert(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a+1);}void hebing(SqList &L3) //合并两个顺序表{ SqList L1,L2;int a,b;InitList_Sq(L1); InitList_Sq(L2);cout<<"请输入第一个有序表的长度:"; cin>>a;cout<<"请输入第一个有序表的元素(共"<<a<<"个)"<<endl;create(L1,a);show(L1,a);cout<<"请输入第二个有序表的长度:"; cin>>b;cout<<"请输入第二个有序表的元素(共"<<b<<"个)"<<endl;create(L2,b);show(L2,b);MergeList(L1,L2,L3);cout<<"合并后的有序表如下:"; show(L3,a+b);}void main() //主菜单{ int choice;for(;;){ cout<<"顺序表的基本操作"<<endl;cout<<"1.顺序表的创建"<<endl;cout<<"2.顺序表的显示"<<endl;cout<<"3.顺序表的长度"<<endl;cout<<"4.插入元素到顺序表里"<<endl;cout<<"5.删除顺序表里的元素"<<endl;cout<<"6.合并两个顺序表"<<endl;cout<<"7.退出系统"<<endl;cout<<"请选择:";cin>>choice;switch(choice){ case 1: shuru(Lx);break;case 2: show(Lx,Lx.length);break;case 3: cout<<"顺序表的长度:"<<Listlength(Lx)<<endl;break;case 4: charu(Lx);break;case 5: shanchu(Lx);break;case 6: hebing(Lx);break;case 7: cout<<"退出系统!"<<endl;exit(0);break;default : cout<<"输入有误,请重新选择"<<endl;break; }}}链表#include<iostream>using namespace std;#define true 1#define false 0#define ok 1#define error 0#define overflow -2typedef int Status;typedef int ElemType;typedef struct LNode //存储结构{ ElemType data;struct LNode *next;}LNode,*LinkList;void CreateList(LinkList &L,int n) //尾插法创建单链表{ LinkList p;L=new LNode;L->next=NULL; //建立一个带头结点的单链表LinkList q=L; //使q指向表尾for(int i=1;i<=n;i++){ p=new LNode;cin>>p->data;p->next=NULL;q->next=p;q=p; }}Status GetElem(LinkList L,int i,ElemType &e)//取第i个元素{ LinkList p=L->next;int j=1;while(p&&j<i){ p=p->next;++j; }if(!p||j>i) return error; //第i个元素不存在e=p->data;return ok;}Status LinkInsert(LinkList &L,int i,ElemType e) //插入{ LinkList p=L;int j=0;while(p&&j<i-1){ p=p->next;++j; } //寻找第i-1个结点 if(!p||j>i-1)return error; //i小于1或者大于表长加1 LinkList s=new LNode; //生成新结点s->data=e;s->next=p->next; //插入L中p->next=s;return ok;}Status ListDelete(LinkList &L,int i,ElemType &e) // 删除{ LinkList p=L;LinkList q;int j=0;while(p->next&&j<i-1){ //寻找第i个结点,并令p指向其前驱 p=p->next;++j; }if(!(p->next)||j>i-1) return error; //删除位置不合理q=p->next;p->next=q->next; //删除并释放结点e=q->data;delete(q);return ok;}void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) { //合并两个顺序链表LinkList pa,pc,pb;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){ if(pa->data<=pb->data){ pc->next=pa;pc=pa;pa=pa->next; }else{ pc->next=pb;pc=pb;pb=pb->next; }}pc->next=pa?pa:pb;delete(Lb);}void show(LinkList L) //显示{ LinkList p;p=L->next;while(p){ cout<<p->data<<"-->";p=p->next; }cout<<endl;}int Length(LinkList L,int i) //表长{ i=0;LinkList p=L->next;while(p){ ++i;p=p->next; }return i;}void xiugai(LinkList L) //修改{ int i,j=1;ElemType k;ElemType e,m;LinkList p=L->next;cout<<"请输入要修改的元素位置(0<i<length):";cin>>i;GetElem(L,i,e);cout<<"该位置的元素:"<<e<<endl;cout<<"修改后的元素值:";cin>>k;while(p&&j<i){ p=p->next;++j; }m=p->data;p->data=k;cout<<"修改后的单链表显示如下:"<<endl;show(L);}void hebing() //合并两个单链表{ int a,b;LinkList La,Lb,Lc;cout<<"请输入第一个有序链表的长度:"<<endl;cin>>a;cout<<"请输入第一个有序链表的元素共("<<a<<"个):"<<endl;CreateList(La,a);show(La);cout<<"请输入第二个有序链表的长度:"<<endl;cin>>b;cout<<"请输入第二个有序链表的元素共("<<b<<"个):"<<endl;CreateList(Lb,b);show (Lb);MergeList(La,Lb,Lc);cout<<"合并后的有序链表如下:"<<endl;show(Lc);}void main() //主函数{ int select;int x;ElemType y;LinkList list;for(;;){ cout<<"单链表的基本操作"<<endl;cout<<"1.单链表的创建"<<endl;cout<<"2.单链表的显示"<<endl;cout<<"3.单链表的长度"<<endl;cout<<"4.插入元素到单链表里"<<endl;cout<<"5.删除单链表里的元素"<<endl;cout<<"6.合并两个单链表"<<endl;cout<<"7.退出系统"<<endl;cout<<"请选择:";cin>>select;switch(select){ case 1:cout<<"请输入单链表的长度:"<<endl;cin>>x;cout<<"请输入"<<x<<"个元素"<<endl;CreateList(list,x);break;case 2: cout<<"单链表显示如下:"<<endl;show(list);break;case 3: int s;cout<<"单链表的长度为:"<<Length(list,s)<<endl;break;case 4: cout<<"请选择要插入的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要插入元素的位置:";cin>>x; }cout<<"要插入的元素值:";cin>>y;LinkInsert( list,x,y);cout<<"插入后单链表显示如下:"<<endl;show(list);break;case 5: cout<<"请选择要删除的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要删除元素的位置:";cin>>x; }ListDelete(list,x,y);cout<<"要删除的元素值:"<<y<<endl;cout<<"删除后的单链表显示如下:"<<endl;show(list);break;case 6: hebing();break;case 7: exit(0);break;default : cout<<"输入有误,请重新输入"<<endl;break;}}}四、实验结果:顺序表链表。
中南大学计算机实践报告中南大学计算机实践报告中南大学本科生课程设计(实践)任务书、设计报告(计算机程序设计基础FORTRAN)题目线性方程组求解问题学生姓名指导教师学院专业班级学生学号刘卫国土木工程学院土建类班计算机基础教学实验中心202*年6月29日一、实践目的通过本课程设计,培养程序设计能力以及综合解决实际问题的能力。
通过自己分析问题、寻求算法、编写、调试程序的过程,掌握FORTRAN程序设计与调试方法,提高灵活运用所学知识解决问题的能力。
二、设计任务线性病态方程组问题:1/21/31/4x10.951/31/41/5x0.6721/41/51/6x30.52(1)求方程的解。
(2)将方程右边向量元素b3改为0.53,再求解,并比较b3的变化和解的相对变化。
(3)计算系数矩阵A的条件数并分析结论。
提示:矩阵A的条件数等于A的范数与A的逆矩阵的范数的乘积,即cond(A)AA1。
这样定义的条件数总是大于1的。
条件数越接近于1,矩cond(A)AA1阵的性能越好,反之,矩阵的性能越差。
矩阵A的条件数Amax{aij}1jni1m,其中,aij系矩阵A的元素。
要求:(1)方程的系数矩阵、常数向量均从文件中读入。
(2)定义求解线性方程组Ax=b的子程序,要求该子程序能求解任意线性方程组。
(3)在主程序中调用子程序,并对求解结果进行对比分析。
(4)绘制常数向量修改前后所求得的方程解的数据分布图。
三系统坏境系统开发环境为CONSOLEAPPLICAT三.系统功能及系统详细设计四系统功能及系统详细设计。
系统功能分析针对题目要求,我设计的系统主要为了解决题目中所提出并要求的问题。
子程序则各尽其用,不仅可以作为整体系统的重要部分,还可以使用于通用问题。
如三角分解法,可以解决线性方程组的求解问题。
求范数和矩阵求逆的子程序,可以解决相应的问题。
再如绘图程序,将问题(2)的结果直观化,更直观明显的表现了病态方程的特点与定义。
中南大学自动化专业离散数学实验报告2离散数学作为计算机科学与技术专业的基础课程之一,对于培养学生的逻辑思维和抽象思维能力具有重要意义。
本次实验是关于离散数学中的图论部份,通过实际操作和计算来理解和应用图的相关概念和算法。
实验一开始,我们首先学习了图的基本概念和术语,例如顶点、边、路径、回路等。
然后,我们学习了图的表示方法,包括邻接矩阵和邻接表。
通过实际操作,我们发现邻接矩阵适合表示稠密图,而邻接表适合表示稀疏图。
这种不同的表示方法对于图的遍历和搜索算法有着重要的影响。
接下来,我们进行了图的遍历实验。
通过深度优先搜索和广度优先搜索算法,我们可以遍历图中的所有节点,并找到特定节点之间的路径。
深度优先搜索算法通过递归的方式进行,它会首先访问一个节点的所有邻接节点,然后再递归地访问这些邻接节点的邻接节点。
广度优先搜索算法则是通过队列的方式进行,它会首先访问一个节点的所有邻接节点,然后将这些邻接节点按照访问的顺序加入队列中,再逐个出队进行访问。
通过实验,我们发现深度优先搜索算法更适适合于寻觅路径,而广度优先搜索算法更适适合于寻觅最短路径。
在实验的后半部份,我们学习了最小生成树和最短路径算法。
最小生成树算法用于找到一个连通图的最小生成树,其中包含了连接图中所有节点的最短路径。
我们学习了Prim算法和Kruskal算法,它们分别基于贪心算法和并查集来实现。
通过实验,我们发现Prim算法适适合于稠密图,而Kruskal算法适适合于稀疏图。
最短路径算法用于找到两个节点之间的最短路径,我们学习了Dijkstra算法和Floyd算法。
Dijkstra算法通过贪心策略逐步更新节点之间的最短路径,而Floyd算法则通过动态规划的方式计算所有节点之间的最短路径。
通过实验,我们发现Dijkstra算法适适合于稀疏图,而Floyd算法适适合于稠密图。
总结起来,本次实验让我们深入了解了离散数学中的图论部份,并通过实际操作和计算来应用图的相关概念和算法。
算法分析与设计实验报告学院:信息科学与工程学院专业班级:物联网工程1301班指导老师:向瑶学号:姓名:目录实验一 ----------------------------------------3 实验目的 -----------------------------------------3 实验内容 -----------------------------------------3实验原理及部分代码---------------------------------3实验结果 ------------------------------------------4 源代码-------------------------------------------4实验二 ----------------------------------------7 实验目的 -----------------------------------------7 实验内容 -----------------------------------------7实验原理及部分代码---------------------------------7实验结果 ------------------------------------------8 源代码-------------------------------------------8实验三 ----------------------------------------10实验目的 -----------------------------------------10实验内容 -----------------------------------------10实验原理及部分代码---------------------------------10实验结果 ------------------------------------------11源代码-------------------------------------------11心得体会 -----------------------------------------14实验一递归与分治一、实验目的1、理解递归算法的思想和递归程序的执行过程,并能熟练编写递归程序。
“离散数学”实验报告(实验1ABC>专业班级学号姓名日期:2018.12.05目录一、实验目的3二、实验内容3三、实验环境3四、实验原理和实现过程<算法描述)31、实验原理32、实验过程4五、实验数据及结果分析7A题型7B、C题型9六、源程序清单13A题部分源代码13B、C题部分源代码14七、其他收获及体会22一、实验目的熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
二、实验内容1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。
<A)2. 求任意一个命题公式的真值表<B,并根据真值表求主范式<C))三、实验环境C或C++语言编程环境实现。
四、实验原理和实现过程<算法描述)1.实验原理<1)合取:二元命题联结词。
将两个命题P、Q联结起来,构成一个新的命题P∧Q, 读作P、Q的合取, 也可读作P与Q。
这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = T, Q = T时方可P∧Q =T, 而P、Q只要有一为F则P∧Q = F。
这样看来,P∧Q可用来表示日常用语P与Q, 或P并且Q。
<2)析取:二元命题联结词。
将两个命题P、Q联结起来,构成一个新的命题P∨Q, 读作P、Q的析取, 也可读作P或Q。
这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = F, Q = F时方可P∨Q =F, 而P、Q只要有一为T则P∨Q = T。
这样看来,P∨Q可用来表示日常用语P或者Q。
<3)条件:二元命题联结词。
将两个命题P、Q联结起来,构成一个新的命题P→Q, 读作P条件Q, 也可读作如果P,那么Q。
这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = T, Q = F时方可P→Q =F, 其余均为T。
<4)双条件:二元命题联结词。
实验七1.需求分析本实验目的是使读者,掌握常用排序方法的基本思想,通过实验加深理解各种排序算法,通过实验掌握各种排序方法的时间复杂度分析,了解各种排序方法的优缺点及适用范围。
1.排序算法的实现(设计性实验)问题描述排序是计算机领域的一项重要技术,是程序设计中的一种重要运算。
它的功能是将一个数据元素的任意序列重新排列成一个按键有序的序列。
学习和研究各种排序方法是计算机工作者的一项重要工作课题。
基本要求随机产生n个整数(依次为n赋值100、200、300、1 000和2 000),将其存于数组A[1..n]中。
对主要算法(顺序查找、插入排序、归并排序、堆排序和快速排序)进行实验比较,计算出平均比较次数c n、平均移动次数m n及执行时间t n。
c n和m n由程序自动计算,t n由系统时间计算。
对实验结果数据进行对比分析。
测试数据由随机数生成器决定。
实现提示(1) 设计一个驱动程序,其任务是,随机输入一组原始数据A[1..n],对于查找还需准备一个键码值(可以随机产生,也可在A[1..n]中按索引号挑选若干有代表性的数据)。
对每组原始数据,分别调用查找或排序算法过程。
(2) 为了自动计算c n和m n需要在每个算法过程中的适当位置插入计数操作。
手工计算每个算法的执行时间t n时,为了减少计时误差,删除所插入的计数操作,并按n的大小确定一个K,对每个查找或排序算法过程反复调用K次,在调用开始前设置一个计时起点t0,在K次调用执行后可打印信息。
设计时的终点为t1,则(t1t0)/K便是算法的大致执行时间。
选作内容对不同的输入表长做试验,观察含义相同的变量相对于表长的变化关系,还可以对稳定性做验证。
2.统计成绩(综合性实验)问题描述给出n个学生的m门考试的成绩表,每个学生的信息由学号、姓名及各科成绩组成。
对学生的考试成绩进行有关统计,并打印统计表。
基本要求(1) 按总数高低次序,打印出名次表,分数相同的为同一名次。
人工智能实验报告学院:专业班级:指导老师:学号:姓名:第一次实验:搜索策略1.节点静态图(Node1为起点,Node0为终点)2.DFS搜索策略:当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。
这一过程一直进行到已发现从源节点可达的所有节点为止。
如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
属于盲目搜索。
搜索结果前四步open表和close表的变化3.BFS搜索策略:BFS并不使用经验法则算法。
从算法的观点,所有因为展开节点而得到的子节点都会被加进一个先进先出的队列中。
依次对出队的结点进行搜索,直至找到目标节点搜索结果前四步open表和close表的变化4.Lowest cost first搜索策略:类似于BFS,但在搜索结点时,并不按照队列的顺序进行搜索,而选取队列中与起始结点距离最近的结点进行搜索。
搜索结果前四步open表和close表的变化5.best first搜索策略:最佳优先搜索通过扩展最有可能到达目标节点的节点,根据指定的规则,探索一个图。
搜索结果前四步open表和close表的变化6.层次深度优先搜索策略:令k=1,进行k层的深度优先搜索,如果没有找到目标,则k+1,进行k+1层的深度优先搜索,以此类推。
搜索结果前四步open表和close表的变化7.A*算法搜索策略:A*[1](A-Star)算法是一种静态路网中求解最短路最有效的直接搜索方法。
公式表示为:f(n)=g(n)+h(n),其中f(n) 是从初始点经由节点n到目标点的估价函数,g(n) 是在状态空间中从初始节点到n节点的实际代价,h(n) 是从n到目标节点最佳路径的估计代价。
保证找到最短路径(最优解的)条件,关键在于估价函数f(n)的选取:估价值h(n)<= n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低。
计算机体系结构课程设计学院:信息科学与工程学院专业班级:指导老师:学号:姓名:.目录实验1 对指令操作码进行霍夫曼编码 (3)一、实验目的 (3)二、实验内容 (3)三、设计思路 (4)四、关键代码 (4)五、实验截图 (5)六、源代码 (5)实验2 使用LRU 方法更新Cache (8)一、实验目的 (8)二、实验内容 (8)三、设计思路 (9)四、程序截图 (9)五、实验代码 (9)实验总结 (16)参考文献 (16).实验1 对指令操作码进行霍夫曼编码一、实验目的了解和掌握指令编码的基本要求和基本原理二、实验内容1. 使用编程工具编写一个程序,对一组指令进行霍夫曼编码,并输出最后的编码结果以及对指令码的长度进行评价。
与扩展操作码和等长编码进行比较。
2. 问题描述以及问题分析举例说明此问题,例如:P1 P2 P3 P4 P5 P6 P70.45 0.30 0.15 0.05 0.03 0.01 0.01下表所示:对此组指令进行 HUFFMAN 编码正如下图所示:最后得到的HUFFMAN 编码如下表所示:最短编码长度为:H=0.45*1+0.30*2+0.15*3+0.05*4+0.03*5+0.01*6+0.01*6=-1.95.要对指令的操作码进行 HUFFMAN 编码,只要根据指令的各类操作码的出现概率构造HUFFMAN 树再进行 HUFFAM 编码。
此过程的难点构造 HUFFMAN 树,进行 HUFFAM 编码只要对你所生成的 HUFFMAN 树进行中序遍历即可完成编码工作。
三、设计思路观察上图,不难看出构造 HUFFMAN 树所要做的工作:1、先对各指令操作码的出现概率进行排序,构造一个有序链表。
2、再取出两个最小的概率节点相加,生成一个生的节点加入到链表中,同时从两表中删除此两个节点。
3、在对链表进行排序,链表是否只有一个节点,是则 HUFFAN 树构造完毕,否则继续做 2 的操作。
实验机构创意组合实验
一、实验目的。
1、加深学生对平面机构的组成原理认识,进一步了解机构组成及运动特性。
2、训练学生的工程实践动手能力,培养学生创新意识及综合设计的能力。
二、仪器设备。
ZBS-C平面机构创意组合分析测试实验台。
三、机构运动简图。
四、计算机构的自由度(列出算式,并給出答案)。
解:活动构件数=5,低副P L=6,高副P H=2, 无虚约束。
F =3n-2P L-P H=3×5-2×6-2=1
即机构的自由度为1
五、指出在机构中自己有所创新之处。
答:创新之处在于,在不改变齿轮部分和凸轮部分的前提下,通过改变杆的长度,以满足杆长条件,并将最短杆从与凸轮通过高副接触的地方换成另一个连架杆的地方。
从而将之前留下来的双摇杆机构变成曲柄摇杆机构。
六、指出机构的设计存在的不足之处,简述进一步改进的设想。
答:不足之处:由于提供的杆的长度有限制,难以轻松的满足杆长条件,再加上受上课时长的限制,所以未将曲柄摇杆机构组合成功。
改进设想:由于有一处连架杆是通过与凸轮高副连接,不好做周转运动,可以考虑将其与齿轮作用,再通过设置最短杆的位置以及满足杆长条件,从而将双摇杆机构变成双曲柄机构。
中南大学《计算机网络》实验报告学生姓名学号专业班级指导教师桂劲松学院信息科学与工程学院完成时间 2011年1月模拟路由算法的实现一、实验内容1.模拟距离向量路由算法的路由表交换过程,演示每轮交换后路由表的变化。
2.实现链路状态路由算法中的最短路径算法。
二、实验目的及要求本实验是计算机网络课程的实践性锻炼环节。
通过实验,帮助学生更好地掌握网络通信协议的实现技术,锻炼学生应用高级编程语言完成通信编程的能力,使学生加深对网络协议本质的理解,巩固课堂所学的理论知识。
要求实验者利用路由选择算法模拟软件提供的通信功能,模拟链路状态路由选择算法的初始化、路由信息扩散过程和路由计算方法;掌握链路状态算法的路由信息扩散过程;掌握链路状态算法的路由计算方法。
三、实验原理编程语言: JAVA编程工具: MyEclipse实验实现方式:单机模拟实现核心方法:dijkstra算法计算最短路径分析:布置好各个模拟路由,以及路由的路程权值如何获取。
接着就是核心算法的实现,如何计算任意两个路由之间的最短路径问题。
用到的是dijkstra算法。
Dijkstra算法按照从给定起点到图中顶点的距离,顺序求出最短的路径,首先,它求出从起点到最接近起点的顶点之间的最短路径,然后求出第二近的,一次类推,推而广之,再第i次迭代开始之前,算法已经确定了i-1条连接起点和离起点最近顶点之间的最短路径。
这些顶点、起点和从起点到顶点的路径上的边,构成了给定图的一颗子树Ti,因为所有边的权值都是非负数,可以从与Ti的顶点相邻的顶点中找到下一个和起点最接近的顶点。
和Ti的顶点相邻的顶点的集合称为“边缘顶点”,以他们为候选对象,Dijkstra算法可以从中选出一个最接近起点的顶点。
为了确定第I个最接近的顶点,对于每一个边缘顶点u,该算法求出它到最近的树中顶点v的距离以及从起点到v得最短路径长度dv的和,再从中选出具有最小和的顶点。
此次实验主要是运用路由算法来处理路由当中的一些问题,利用Dijkstra 算法处理最短路径的问题,在实验中这点已经得到了充分地体现。
算法设计与分析基础——实验报告姓名:学号:0909122824班级:信安1202实验一分治—最近点对一.问题ProblemHave you ever played quoit in a playground? Quoit is a game in which flat rings are pitched at some toys, with all the toys encircled awarded.In the field of Cyberground, the position of each toy is fixed, and the ring is carefully designed so it can only encircle one toy at a time. On the other hand, to make the game look more attractive, the ring is designed to have the largest radius. Given a configuration of the field, you are supposed to find the radius of such a ring.Assume that all the toys are points on a plane. A point is encircled by the ring if the distance between the point and the center of the ring is strictly less than the radius of the ring. If two toys are placed at the same point, the radius of the ring is considered to be 0.InputThe input consists of several test cases. For each case, the first line contains an integer N (2 <= N <= 100,000), the total number of toys in the field. Then N lines follow, each contains a pair of (x, y) which are the coordinates of a toy. The input is terminated by N = 0.OutputFor each test case, print in one line the radius of the ring required by the Cyberground manager, accurate up to 2 decimal places.二.分析思路题目是给n个点的坐标,求距离最近的一对点之间距离的一半。
“离散数学”实验报告(实验3ABC)专业班级学号姓名日期: 2011.12.19目录一、实验目的 (3)二、实验内容 (3)三、实验环境 (3)四、实验原理和实现过程(算法描述) (3)1实验原理 (3)2实验过程 (5)五、实验数据及结果分析 (6)六、源程序清单 (10)七、其他收获及体会 (16)一、实验目的理解图论的基本概念, 图的矩阵表示, 图的连通性, 图的遍历, 以及求图的连通支方法。
二、实验内容以偶对的形式输入一个无向简单图的边, 建立该图的邻接矩阵, 判断图是否连通(A)。
并计算任意两个结点间的距离(B)。
对不连通的图输出其各个连通支(C)。
三、实验环境C或C++语言编程环境实现。
四、实验原理和实现过程(算法描述)1.实验原理(1)建立图的邻接矩阵, 判断图是否连通根据图的矩阵表示法建立邻接矩阵A, 并利用矩阵的乘法和加法求出可达矩阵, 从而判断图的连通性。
连通图的定义: 在一个无向图G 中, 若从顶点vi到顶点vj有路径相连(当然从vj到vi也一定有路径), 则称vi和vj是连通的。
如果G 是有向图, 那么连接vi 和vj的路径中所有的边都必须同向。
如果图中任意两点都是连通的, 那么图被称作连通图。
判断连通图的实现:在图中, 从任意点出发在剩余的点中, 找到所有相邻点循环, 直到没有点可以加入为止, 如果有剩余的点就是不连通的, 否则就是连通的。
或者也可用WallShell算法, 由图的邻接矩阵判断图是否连通。
(2)计算任意两个结点间的距离图中两点i, j间的距离通过检验Al中使得aij为1的最小的l值求出。
路径P中所含边的条数称为路径P的长度。
在图G<V,E>中, 从结点Vi到Vj最短路径的长度叫从Vi到Vj的距离, 记为d<Vi, Vj>。
设图的邻接矩阵是A, 则所对应的aij的值表示, 点Vi到点Vj距离为n的路径有aij条。
若aij(1), aij(2), …, aij(n-1), 中至少有一个不为0, 则可断定Vi与Vj可达, 使aij(l)≠0的最小的l即为d(Vi, Vj)。
中南大学c 课程设计实践报告一、教学目标本课程的教学目标是使学生掌握中南大学C课程的核心知识,包括基本概念、原理和应用。
具体目标如下:1.知识目标:学生能够准确理解并掌握C语言的基本语法、数据类型、运算符、控制结构、函数等基本知识。
2.技能目标:学生能够熟练运用C语言进行程序设计,包括编写、调试和运行C程序。
3.情感态度价值观目标:培养学生对计算机科学的兴趣和热情,提高学生的问题解决能力和创新意识。
二、教学内容根据教学目标,本课程的教学内容主要包括以下几个方面:1.C语言的基本语法和数据类型,包括变量、常量、数据类型、运算符等。
2.控制结构,包括条件语句、循环语句等。
3.函数,包括函数的定义、声明、调用和返回值等。
4.指针和数组,包括指针的概念、指针的运算、数组的基本操作等。
5.结构体和文件操作等高级内容。
三、教学方法为了达到教学目标,本课程将采用多种教学方法,包括:1.讲授法:通过教师的讲解和演示,使学生掌握C语言的基本知识和技能。
2.讨论法:通过小组讨论和课堂讨论,激发学生的思考和问题解决能力。
3.案例分析法:通过分析实际案例,使学生了解C语言在实际应用中的作用和意义。
4.实验法:通过编写和调试C程序,培养学生的实际编程能力和问题解决能力。
四、教学资源为了支持教学内容和教学方法的实施,本课程将使用以下教学资源:1.教材:选择一本适合学生水平的C语言教材,作为学生学习的主要参考资料。
2.参考书:提供一些相关的参考书籍,供学生进一步深入学习和参考。
3.多媒体资料:制作一些教学PPT、视频等多媒体资料,帮助学生更好地理解和掌握知识。
4.实验设备:提供计算机实验室,让学生能够进行实际编程和实验操作。
五、教学评估本课程的评估方式包括平时表现、作业和考试等。
具体评估方式如下:1.平时表现:通过学生的课堂参与、提问、回答问题等方式评估学生的学习态度和理解程度。
2.作业:布置适量的作业,包括编程练习和理论题目,以巩固学生对知识的理解和应用能力。
算法设计与分析基础——实验报告姓名:周建权学号:0909122820班级:信安1202实验一分治—最近点对一.问题ProblemHave you ever played quoit in a playground? Quoit is a game in which flat rings are pitched at some toys, with all the toys encircled awarded.In the field of Cyberground, the position of each toy is fixed, and the ring is carefully designed so it can only encircle one toy at a time. On the other hand, to make the game look more attractive, the ring is designed to have the largest radius. Given a configuration of the field, you are supposed to find the radius of such a ring.Assume that all the toys are points on a plane. A point is encircled by the ring if the distance between the point and the center of the ring is strictly less than the radius of the ring. If two toys are placed at the same point, the radius of the ring is considered to be 0.InputThe input consists of several test cases. For each case, the first line contains an integer N (2 <= N <= 100,000), the total number of toys in the field. Then N lines follow, each contains a pair of (x, y) which are the coordinates of a toy. The input is terminated by N = 0.OutputFor each test case, print in one line the radius of the ring required by the Cyberground manager, accurate up to 2 decimal places.二.分析思路题目是给n个点的坐标,求距离最近的一对点之间距离的一半。
第一行是一个数n表示有n个点,接下来n行是n个点的x坐标和y坐标。
首先,假设点是n个,编号为1到n。
找一个中间的编号mid,先求出1到mid点的最近距离设为d1,还有mid+1到n的最近距离设为d2。
如果说最近点对中的两点都在1-mid 集合中,或者mid+1到n集合中,则d就是最小距离了。
但是还有可能的是最近点对中的两点分属这两个集合,若存在,则把这个最近点对的距离记录下来,去更新d。
这样就得到最小的距离d了。
三.源代码#include<stdio.h>#include<math.h>#include<algorithm>using namespace std;#define N 1000010struct point{double x;double y;}p1[N],p2[N];double dis ( point a , point b ){return sqrt( pow (a.x-b.x,2) + pow ( a.y-b.y,2 ) );}double min ( double a , double b ){return a<b?a:b;}bool cpx ( point a , point b ){return a.x < b.x ;}bool cpy ( point a , point b ){return a.y < b.y ;}double mindis ( int l , int r ){if( l + 1 == r )return dis ( p1[l] ,p1[r] );if( l + 2 == r )return min ( dis ( p1[l] , p1[l+1] ) , min ( dis ( p1[l+1] , p1[r] ) , dis ( p1[l] , p1[r] ) ) ); else{int mid , count=0 ;double mini;mid = ( l + r) /2 ;mini = min ( mindis ( l , mid ) , mindis ( mid+1 , r ) );for( int i = l ; i <= r ; i++ ){if ( fabs ( p1[i].x - p1[mid].x ) <= mini )p2[count++]=p1[i];}sort ( p2 , p2+count , cpy );for ( int i=0 ; i < count ; i++ ){for ( int j = i+1; j < count ;j++){if ( p2[j].y-p2[i].y>=mini)break;elseif(dis (p2[j],p2[i])<mini)mini=dis(p2[j],p2[i]);}}return mini;}}int main(){int n ;double dia ;while(scanf("%d",&n)==1&&n) {for(int i=0;i<n;i++)scanf("%lf%lf",&p1[i].x,&p1[i].y); sort ( p1 , p1 + n-1 , cpx );dia = mindis ( 0 , n-1 );printf("%.2f\n", dia / 2 );}return 0;}四.运行结果实验二回溯—堡垒问题一.问题Problem DescriptionSuppose that we have a square city with straight streets. A map of a city is asquare board with n rows and n columns, each representing a street or apiece of wall.A blockhouse is a small castle that has four openings through which to shoot.The four openings are facing North, East, South, and West, respectively.There will be one machine gun shooting through each opening.Here we assume that a bullet is so powerful that it can run across any distance and destroy a blockhouse on its way. On the other hand, a wall is so strongly built that can stop the bullets.The goal is to place as many blockhouses in a city as possible so that no two can destroy each other. A configuration of blockhouses is legal provided that no two blockhouses are on the same horizontal row or vertical column in a map unless there is at least one wall separating them. In this problem we will consider small square cities (at most 4x4) that contain walls through which bullets cannot run through.InputThe input file contains one or more map descriptions, followed by a line containing the number 0 that signals the end of the file. Each map description begins with a line containing a positive integer n that is the size of the city; n will be at most 4. The next n lines each describe one row of the map, with a '.' indicating an open space and an uppercase 'X' indicating a wall. There are no spaces in the input file.OutputFor each test case, output one line containing the maximum number of blockhouses that can be placed in the city in a legal configuration.二.分析思路对于每个点,若能放置大炮则能选择放或者不放两种情况,若不能放置大炮则就只有一种情况。
直接搜索,回溯的时候把点的状态恢复.三.源代码#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX_SIZE 10char map[MAX_SIZE][MAX_SIZE];int d[4][2]={0,1,0,-1,1,0,-1,0};int N,cnt;int ok(int x, int y){if(map[x][y]!='.')return 0;int i,xx,yy;for(i=0;i<4;i++){xx=x+d[i][0];yy=y+d[i][1];while(xx>=0 && xx<N && yy>=0 && yy<N && map[xx][yy]!='X'){if(map[xx][yy]=='o')return 0;xx+=d[i][0];yy+=d[i][1];}}return 1;}int search(int x, int y, int c){int i,j;for(j=y;j<N;j++)if(ok(x,j)){map[x][j]='o';search(x,j+1,c+1);map[x][j]='.';}for(i=x+1;i<N;i++)for(j=0;j<N;j++)if(ok(i,j)){map[i][j]='o';search(i,j+1,c+1);map[i][j]='.';}if(c>cnt)cnt=c;return 0;}int main()int i;while(scanf("%d",&N)&&N){for(i=0;i<N;i++)scanf("%s",map[i]);cnt=0;search(0,0,0);printf("%d\n",cnt);}return 0;}四.运行结果实验三动态规划—免费馅饼一.问题Problem Description都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。