中南大学算法实验报告
中南大学大一下学期c++程序设计实验报告1.0

中南大学本科生课程设计(实践)任务书、设计报告(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)

“离散数学”实验报告(实验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 转换为关系矩阵的形式。
中南大学自动化专业离散数学实验报告2

“离散数学”实验报告(实验二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++程序设计报告一、前言我认为安排此次课程设计的目的,是让同学们在独立完成设计、编写、调试应用程序及编写文档的任务的过程中,及时巩固已学的知识,补充未学但是非常重要的知识,提高程序设计的能力。
针对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(线性表)

实验一线性表的操作算法一、实验目的: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;}}}四、实验结果:顺序表链表。
中南大学计算机实践报告.doc

中南大学计算机实践报告中南大学计算机实践报告中南大学本科生课程设计(实践)任务书、设计报告(计算机程序设计基础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)的结果直观化,更直观明显的表现了病态方程的特点与定义。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析基础——实验报告姓名:周建权学号: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正走在回家的小径上,忽然天上掉下大把大把的馅饼。