1、算法与程序设计实验指导书算法与程序设计实验实验指导书适用专业: 信息工程 通信工程 电信工程 自动化 信息与通信工程学院2011年5月前 言一、课程性质本课程是电信工程、通信工程、信息工程和自动化专业必修的专业实验课程,独立开课。本课程是专业基础课,既有理论性,也要求实践性。通过完成一系列的实验项目,巩固基础理论知识,同时培养学生分析问题、解决的能力。熟悉和巩固面向对象程序设计初步能力。主要培养学生进行复杂问题程序设计的能力。为进一步提高、深造打下基础。二、项目设置本课程总学时为32,开设的具体实验项目如下: 实验1 员工信息系统中结构体设计与实现(4学时,必修) 实验2 多项式加法的链表设计
2、与实现(4学时,必修) 实验3 归并排序分治策略的设计与实现(2学时,必修) 实验4 二分检索的递归与迭代算法设计(4学时,必修) 实验5 最小生成树算法的设计与实现(4学时,必修) 实验6 背包问题的算法设计与实现(4学时,必修) 实验7 子集和问题的回溯算法设计与实现(4学时,选修) 实验8 多段图问题的动态规划算法设计与实现(4学时,选修) 实验9 作业调度问题的算法设计与实现(4学时,选修) 实验10 哈夫曼编码和译码的算法设计与实现(4学时,选修) 实验11 启发式搜索算法设计与实现(4学时,选修) 实验12 蛇和梯子问题的算法设计与实现(4学时,选修) 实验13 游戏中寻址算法的设
3、计与实现(4学时,选修) 实验14 旅行商问题的算法设计与实现(4学时,选修) 实验15 骑士游历算法设计与实现(4学时,选修) 实验16 输油管道问题的算法设计与实现(2学时,选修) 实验17 会场安排问题的设计与实现(4学时,选修) 实验18 最少演员问题的设计与实现(4学时,选修) 其中,实验1实验18均为设计性实验。三、专业安排信息与通信工程学院本科专业共开设18个实验,6个必修(共22课时),12个选修(12选25,共10课时)。其中实验16为必修实验;信息工程可选修全部选修实验,通信工程、电信工程和自动化专业选修实验710,实验1617。四、本书特点本指导书的特点是引入工程项目机制
4、来管理实验项目,着重培养学生的方案设计、算法分析和现场调试能力,为将来成为卓越工程师打下坚实的基础。第一章 实验开发平台 1第二章 考核平台 7第三章 实验项目 13实验1 员工信息系统中结构体设计与实现 13实验2 多项式加法的链表设计与实现 16实验3 归并排序分治策略的设计与实现 18实验4 二分检索的递归与迭代算法设计 20实验5 最小生成树算法的设计与实现 23实验6 背包问题的算法设计与实现 26实验7 子集和问题的回溯算法设计与实现 29实验8 多段图问题的动态规划算法设计与实现 32实验9 作业调度问题的算法设计与实现 35实验10 哈夫曼编码和译码的算法设计与实现 39实验1
5、1 启发式搜索算法设计与实现 41实验12 蛇和梯子问题的算法设计与实现 44实验13 游戏中寻址算法的设计与实现 49实验14 旅行商问题的算法设计与实现 52实验15 骑士游历算法设计与实现 55实验16 输油管道问题的算法设计与实现 59实验17 会场安排问题的设计与实现 61实验18 最少演员问题的设计与实现 63附录:实验(设计)报告参考格式 65第一章 实验开发平台 首先要打开VC6.0界面,一般用得较多的是Win32控制台应用程序(源程序,扩展名.cpp)步骤是:(先工程后文件编译连接-运行)1、建立一个工程,“文件”“新建”,出现下面界面:选择“Win32 Console Ap
6、plication”(控制台应用程序,左边倒数第三个),命名工程名称,选择保存位置,点击“确定”,进入下一步,看到如下提示界面:建立一个空工程,对应其他需要的你一可以建立别的工程;点击“完成”,之后:显示你创建的工程的信息。2、再在有一个的工程的条件下,我们再建立一个源文件;“文件”“新建”(快捷键Ctri+N),出现:建立源文件,选择“C+ Source ”,一般都是建立这种文件的(适用在当文件中适用)如果要建立头文件的话,选择“C/C+ Header File”,(适用在多文件工程中使用)命名,文件名称,点击“确定”,之后:进入编辑区,在主界面编写代码,如编写完之后:可以按编译按钮调试程序
7、,看看有没有错误,有的话改正,没有的话就可以再按连接按钮检查连接(多文件工程时常用,检查文件间是否正常连接),最后,点运行按钮,就可以运行了。如果 代码如:cpp文件,或 .h 文件,想添加都VC6.0里来测试的话,可以这样做:首先,文件扩张名是.h,代表的是头文件,一般是书写一些函数原型,以及一些在整个程序中常用到的结构体,频繁使用的函数说明,定义等等;文件扩张名为,cpp的,是C+中的源文件,也是最常用到的文件,每建立一个工程都要至少一个源文件(至少要有一个函数入口主函数main() ),包含了核心代码;建立与运行说明:(以VC 6.0编译器为例,其他编译器类似)首先,打开VC 6.0编译
8、环境;在菜单栏文件(的下拉菜单中选择“新建”),在弹出的选择窗口中,选择 Win32 Console Application(控制台应用程序) ,在填写工程名称,选择一个程序保存路径,点击“完成”,查看工程信息。在点击“确定”,就建立一个简单的工程了。再点击左边的工程信息右下角的“FileView”选项; 可以看到你新建的工程,再双击你新建的工程名 可以查看工程的信息。在双击工程文件,在这里是 777.files,可以看到该工程的包含的文件。: 其中,Source Files 为包含所有工程的源文件Header Files 为包含所有工程的头文件 在源文件选项“Source Files ”,右
9、键单击中的“添加目录到工程”,添加你要打开的扩展名为 .cpp的源文件。在头文件选项“ Header Files”,右键单击中的“添加目录到工程”,添加你要打开的扩展名为 . h的头文件。添加完你所有的头文件和源文件之后,检查一下是否添加完毕,之后就可以编译了。其中第一个按钮为编译按钮,可以找出工程的错误信息,有错误修改,没错误就可以跳到连接 ,编译右边的按钮,即第三个按钮(多文件工程一定要连接,查看文件是否准确相连接),当编译,连接都没有错误时,可以按运行按钮,即可以运行了。第二章 考核平台PC2客户端是编程竞赛中参赛队员使用的客户端程序,具有提交题目答案(源代码)、测试答案、查看评判结果、
10、提问等功能。2.1 启动客户端进入文件夹X:pc2,打开文件pc2team.bat,启动程序后可看到登录界面:在登录界面上输入用户名和密码,请注意区别大小写。用户名和密码在比赛前由主办方提供。登录成功后则进入主界面,如下图所示:若比赛还未开始、比赛中止、比赛已结束,则在主界面上方会提示红色大字体“STOPPED CONTEST IS NOT RUNNING.”。如果比赛正在进行,则在左上方提示剩余时间。客户端主界面一共有四个页面:(1) “Submit”页面:用于提交题目的源代码答案和本地编译测试源代码。(2) (3) “Clarification”页面:向裁判提问,沟通交流。(4) (5)
11、“Runs”页面:查看每次提交答案的评判结果。Status为“Yes”表示答案正确,解题成功。(6) (7) “Setting”页面:修改用户密码。(8) 2.2 提交答案在主界面“Submit”页面上,您可以提交对某道比赛题目的解答情况,上传源代码文件。系统会自动帮您编译源代码,运行编译后的程序,验证运行结果,以确定源代码是否正确。必要时裁判人员会帮您手工评判。提交答案的步骤如下:在“Problem”下拉框中选择您要解答的题目。在“Language”下拉框中选择您使用的编程语言,默认提供C+、GNU C+、GNU C、Java四种选项。这里的语言指的是系统所采用的编译平台,C+使用Visua
12、l C+ 2005编译器,GNU C+使用G+编译器,GNU C使用GCC编译器,Java使用Javac编译器。C/C+编译器支持C99标准语法,Java编译器使用的JDK是JDK 1.6。您应根据源代码语言选择对应的选项(编译器):C+语言:选择“C+”或“GNU C+”。C语言:选择“C+”或“GNU C”。(Visual C+ 2005编译器支持C语言)Java语言:选择“Java”。点击“Select”按钮,选择您要提交的源代码文件(对应所选题目)。如果您的源代码文件有多个,请先用“Select”按钮选择包含应用程序入口函数(main)的主文件,再点击左下角的“Add”按钮添加其余文件
13、。“Remove”按钮可以移除附加文件。注意不能提交任何数据文件或编译后的可执行程序文件。点击“Submit”按钮,提交源代码。提交前系统会弹出提交提示框(“Run Submission Confirmation”),请您确认您要提交的内容:若您确认无误,则点击“Submit”按钮,否则按下“Cancel”按钮取消提交。提交成功系统会返回一个消息提示:成功提交后,系统会尽快评判您的答案,包括编译代码、运行程序、验证结果等过程,然后以消息提示框的方式通知评判结果。若答题通过,则返回的结果(Judges response)为“Yes”,否则返回其他错误提示(以“No”开头)。 评判结果一般可分为四
14、种:评判结果说明Yes解题正确No - Compilation Error错误原因:编译错误No - Run-time Error错误:程序运行错误No - Time-limit Exceeded错误:运行超时(每道题都有运行时间限制)No - Wrong Answer错误:运行结果与标准答案不一致No - Excessive Output错误:程序运行占用内存空间超出要求No - Output Format Error错误:输出格式错误No - Other - Contact Staff未知错误系统并不限制每道题的提交次数,若您提交某道题的答案后系统返回错误提示,您可修改源代码后继续提交,但
15、一般情况下请尽量保证您提交的代码是正确无误的(可使用“Test”功能在本地测试一下)。因为提交的错误次数将会影响您的最终排名。2.3 查看每次做题情况在“Run”页面可以查看每次提交答案对应的评判结果:上图的表显示了每次提交的ID(Run Id)、题目(Problem)、解题时间(Time,从比赛开始算起,单位分钟)、评判结果(Status)、编程语言(Language)。2.4 “Test”功能若您想在正式提交答案前模拟一下系统评判的编译环境,测试一下您的代码,您可以使用“Test”功能。“Test”功能将使用与裁判端一致的编译环境编译您的代码,在本地机子运行编译后的可执行程序,并输出运行结
16、果。“Test”功能使用如下:在“Submit”页面选定题目、语言、源代码文件后,点击“Test”按钮,在弹出的对话框选择测试所用的输入数据文件:该测试数据文件是一个Ansi格式编码文本文件,其内容要求与题目输入数据格式一致,一般需要参赛人员自己编写。一个简单快速的方法是您将题目描述中的 “Sample Input”(输入示例)“拷贝”到一个txt文件中,然后选择该txt文件。若比赛官方有说明,则会在一个URL地址(比如 )中提供这些测试数据样例的下载。选定测试数据文件后,系统会帮您编译代码,并给出输出结果或错误内容提示:2.5 提问功能若您对某次评判结果有疑问,可以在“Clarificati
17、on”页面中提交您的问题,裁判或主席团将酌情给予解答。“提问”使用过程:点击“Requst Char”按钮,在提问窗口选择题目,编写您的问题后提交。您需要在问题中说明具体某次提交的Run Id,详细地说明问题内容,否则裁判难以帮您解答。一般情况下,若返回的评判结果是“No - Other - Contact Staff”,才建议您使用提问功能(其他结果能很明确地说明您的答案有问题)。2.6 退出客户端点击主界面右上角“X”按钮或“Exit”按钮。第三章 实验项目实验1 员工信息系统中结构体设计与实现实验学时:4实验类型:设计实验要求:必修一、实验目的1、掌握结构体类型变量的定义和使用;2、掌握
18、结构体类型数组的概念和应用;3、针对具体实际定义和使用结构体;4、掌握文件的基本读写操作;5、掌握链表的概念,初步学会对结构体链表的操作。二、预习与参考1、认真阅读程序设计教程关于结构体的内容, 熟悉结构体的操作;2、针对一些简单实例学会设计结构体;3、查找一些关于函数参数传值与传地址的实例,掌握函数传参的方法;4、参考教材,学会怎样建立一个新的链表;三、实验要求上机实验时,一人一组,独立上机。实验题有公司,每个员工的数据包括员工号、姓名、所在部门、工资、电话号码等,从文件中读入员工数据,要求输出平均工资,以及最高工资员工的数据。1、要求应用结构体数组设计,用input函数输入数据,用aver
19、age函数求平均工资,用max函数求最高工资,用output函数按要求输出。struct StaffInforchar ID12;char Name10;char Depart20;int Salary;char PhoneNo13; ;void input(struct StaffInfor Person) 初始化一个结构体信息 int average(struct StaffInfor P,int n) 求平均值并返回 struct StaffInfor MaxStaff(struct StaffInfor P,int n) 找到工资最高值,返回结构体 void output(struct
20、 StaffInfor Person) 输出一个结构体信息 void main()freopen(“input.txt”,”r”,stdin); /读指定文件freopen(“output.txt”,”w”,stdout); /输出到指定文件.2、对问题应用单链表设计并实现。四、实验步骤1、进入环境,设计好程序结构;2、编写程序,并调试;3、运行程序并分析运行结果;4、提交至PC2系统,测试程序的正确性和完整性。五、测试建立input文件,输入数据,如:10101 王建 10102 李小 10103 陈晓 输出平均工资,以及最高工资员工数据:5000六、实验报告要求1、阐述实验目的和实验内容;
21、2、阐述求解问题的算法原理;3、提交实验程序的功能模块;4、记录最终测试数据和测试结果。七、思考题实验1、将问题用链表实现;2、插入一个员工的信息,查找某个员工的信息;3、比较2种方法的优劣。实验2 多项式加法的链表设计与实现实验学时:4实验类型:设计实验要求:必修一、实验目的1、掌握链表的灵活运用;2、学习链表初始化和建立一个新的链表;3、知道怎样去实现链表删除结点操作与插入结点;4、理解链表的基本操作(包括数据域数据的相加)并能灵活运用。二、预习与参考1、认真阅读数据结构教材和算法设计教材内容, 熟悉链表的操作;2、针对线性结构设计出实现多项式加法的算法;3、建立两个链表为稀疏多项式,将他
22、们每项按项相加,最后将得到的链表打印出来;算法或程序设计参考要解决多项式相加,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表,所以我将结点结构体定义为序数coef指数exp指针域next运用尾插法建立两条单链表,以单链表polya和polyb分别表示两个一元多项式A和B,A+B的求和运算等同于单链表的插入问题(将单链表polyb中的结点插入到单链表polya中),因此“和多项式”中的结点无须另生成。为了实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q结点的指数项,由此得到下列运算规则:1、若p-expexp,则结点p所指的结点应是“和多项式”
23、中的一项,令指针p后移。2、若p-exp=q-exp,则将两个结点中的系数相加,当和不为0时修改结点p的系数。3、若p-expq-exp,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。三、实验要求上机实验时,一人一组,独立上机。1、设计一个一元多项式的简单计算器,其基本功能有输入并建立多项式;输出多项式;多项式相加。可利用单链表或单循环链表实现之。2、运用单链表来存储多项式,并且结果链表要用原来的链表空间,空间复杂度为O(1)。四、实验步骤1、进入环境,设计好程序结构;2、编写程序,并调试;3、运行程序并分析运行结果;4、提交至PC2系统,
24、测试程序的正确性和完整性。五、测试分别输入(任意)两个多项式,如: 5X3+4X2+3X+2和X2+X+1,然后输出正确结果5X3+5X2+4X+3。六、实验报告要求1、阐述实验目的和实验内容;2、阐述求解问题的算法原理;3、提交实验程序的功能模块;4、记录最终测试数据和测试结果。七、思考题1、怎样实现多项式乘法;2、怎样用循环链表实现。实验3 归并排序分治策略的设计与实现实验学时:2实验类型:设计实验要求:必修一、实验目的1、熟悉分治法求解问题的抽象控制策略;2、熟悉在顺序存储表示下求解分类问题的递归算法设计;3、通过实例转换, 掌握分治法应用。二、预习与参考1、认真阅读算法设计教材和数据结
25、构教材内容, 熟悉不分治方法的原理 ;2、针对分类问题设计递归算法;3、参考教材和课堂教学内容, 根据分治法求解问题的抽象控制策略简单实现应用。算法或程序设计参考 void Merge(int A,int low,int mid,int heigh) 实现数组中的已分好类的两部分进行合并 void M_sort(int A,int low,int heigh) 对数组中从下标low开始到heigh结束的部分进行分类 三、实验要求上机实验时,一人一组,独立上机。给定任意多组数据,用归并排序对每组数据进行非降排序。四、实验步骤1、进入环境,设计好程序结构;2、编写程序,并调试;3、运行程序并分析运
26、行结果;4、提交至PC2系统,测试程序的正确性和完整性。五、测试Input:1010 11 2 6 9 7 4 1 3 5 Output:1 2 3 4 5 6 7 8 9 11 六、实验报告要求1、阐述实验目的和实验内容;2、提交实验程序的功能模块;3、阐述将递归算法改写成迭代算法的一般方法;4、用类C语言阐述分治法递归抽象控制策略。七、思考题1、应用分治法抽象控制策略实现快速分类。2、应用快速分治中的划分函数实在查找第k小元素。实验4 二分检索的递归与迭代算法设计实验学时:4实验类型:设计实验要求:必修一、实验目的1、熟悉二分检索问题的线性结构表示和二分检索树表示;2、熟悉不同存储表示下求
27、解二分检索问题的递归算法设计;3、通过实例转换, 掌握将递归算法转换成迭代算法的方法;4、掌握应用递归或迭代程序设计实现分治法求解问题的抽象控制策略.二、预习与参考1、认真阅读算法设计教材和数据结构教材内容, 熟悉不同存储表示下求解二分检索问题的原理或方法;2、针对线性结构表示和二分检索树表示设计递归算法;3、参考教材和课堂教学内容, 根据将递归算法转换成迭代算法的一般步骤将二分检索递归算法转换成相应的迭代算法.算法或程序设计参考 线性结构int data10= /* 10个互异的、无序的原始整数 */ ;typedef struct int s100; int top; STACK; int
28、 Partition(int *data, int low, int high)功能: 将datalow, high进行快速分类划分, 返回枢轴记录关键字的位置索引.int QSort1(int *data, int low, int high)功能: 将datalow, high进行快速分类的递归算法.int QSort2(int *data, int low, int high)功能: 将datalow, high进行快速分类的迭代算法.int BSearch1(int *data, int key)功能: 在data数组中检索key的二分检索递归算法, 成功时返回位置索引, 否则返回-1
29、.int BSearch2(int *data, int key)功能: 在data数组中检索key的二分检索迭代算法, 成功时返回位置索引, 否则返回-1.树结构typedef struct NODE int key; struct NODE *lch, *rch; TNODE, *BT; typedef struct Parameters BT *t; int key; BT f; BT *p PARA;typedef struct PARA s100; int top; STACK; int InsertBT(BT *t, int key) 功能: 在二分检索树t中插入关键字为key的元
30、素, 成功时返回1, 否则返回0. int TSearch1(BT *t, int key, BT f, BT *p)功能: 用递归算法在二分检索树t中查找关键字为key的元素, 成功时返回1, p指向该元素节点, 否则p指向查找路径上最后一个节点并返回0, f指向t的双亲, 其初始调用值为NULL. int TSearch2(BT *t, int key, BT f, BT *p)功能: 用迭代算法在二分检索树t中查找关键字为key的元素, 成功时返回1, p指向该元素节点, 否则p指向查找路径上最后一个节点并返回0, f指向t的双亲, 其初始调用值为NULL.三、实验要求上机实验时,一人一组,独立上机。能对树进行非递归遍历。四、实验步骤1. 调试线性
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1