算法与程序设计实验指导书.docx
《算法与程序设计实验指导书.docx》由会员分享,可在线阅读,更多相关《算法与程序设计实验指导书.docx(76页珍藏版)》请在冰豆网上搜索。
![算法与程序设计实验指导书.docx](https://file1.bdocx.com/fileroot1/2023-2/23/814511c7-8109-4f59-8af1-dc2b72f828d3/814511c7-8109-4f59-8af1-dc2b72f828d31.gif)
算法与程序设计实验指导书
《算法与程序设计实验》
实验指导书
适用专业:
信息工程
通信工程
电信工程
自动化
信息与通信工程学院
2011年5月
前言
一、课程性质
本课程是电信工程、通信工程、信息工程和自动化专业必修的专业实验课程,独立开课。
本课程是专业基础课,既有理论性,也要求实践性。
通过完成一系列的实验项目,巩固基础理论知识,同时培养学生分析问题、解决的能力。
熟悉和巩固面向对象程序设计初步能力。
主要培养学生进行复杂问题程序设计的能力。
为进一步提高、深造打下基础。
二、项目设置
本课程总学时为32,开设的具体实验项目如下:
●实验1员工信息系统中结构体设计与实现(4学时,必修)
●
●实验2多项式加法的链表设计与实现(4学时,必修)
●
●实验3归并排序分治策略的设计与实现(2学时,必修)
●
●实验4二分检索的递归与迭代算法设计(4学时,必修)
●
●实验5最小生成树算法的设计与实现(4学时,必修)
●
●实验6背包问题的算法设计与实现(4学时,必修)
●
●实验7子集和问题的回溯算法设计与实现(4学时,选修)
●
●实验8多段图问题的动态规划算法设计与实现(4学时,选修)
●
●实验9作业调度问题的算法设计与实现(4学时,选修)
●
●实验10哈夫曼编码和译码的算法设计与实现(4学时,选修)
●
●实验11启发式搜索算法设计与实现(4学时,选修)
●
●实验12蛇和梯子问题的算法设计与实现(4学时,选修)
●
●实验13游戏中寻址算法的设计与实现(4学时,选修)
●
●实验14旅行商问题的算法设计与实现(4学时,选修)
●
●实验15骑士游历算法设计与实现(4学时,选修)
●
●实验16输油管道问题的算法设计与实现(2学时,选修)
●
●实验17会场安排问题的设计与实现(4学时,选修)
●
●实验18最少演员问题的设计与实现(4学时,选修)
●
其中,实验1~实验18均为设计性实验。
三、专业安排
信息与通信工程学院本科专业共开设18个实验,6个必修(共22课时),12个选修(12选2~5,共10课时)。
其中实验1~6为必修实验;信息工程可选修全部选修实验,通信工程、电信工程和自动化专业选修实验7~10,实验16~17。
四、本书特点
本指导书的特点是引入工程项目机制来管理实验项目,着重培养学生的方案设计、算法分析和现场调试能力,为将来成为卓越工程师打下坚实的基础。
第一章实验开发平台1
第二章考核平台7
第三章实验项目13
实验1员工信息系统中结构体设计与实现13
实验2多项式加法的链表设计与实现16
实验3归并排序分治策略的设计与实现18
实验4二分检索的递归与迭代算法设计20
实验5最小生成树算法的设计与实现23
实验6背包问题的算法设计与实现26
实验7子集和问题的回溯算法设计与实现29
实验8多段图问题的动态规划算法设计与实现32
实验9作业调度问题的算法设计与实现35
实验10哈夫曼编码和译码的算法设计与实现39
实验11启发式搜索算法设计与实现41
实验12蛇和梯子问题的算法设计与实现44
实验13游戏中寻址算法的设计与实现49
实验14旅行商问题的算法设计与实现52
实验15骑士游历算法设计与实现55
实验16输油管道问题的算法设计与实现59
实验17会场安排问题的设计与实现61
实验18最少演员问题的设计与实现63
附录:
实验(设计)报告参考格式65
第一章实验开发平台
首先要打开VC6.0界面,一般用得较多的是Win32控制台应用程序(源程序,扩展名.cpp)步骤是:
(先工程—后文件—编译—连接---运行)
1、建立一个工程,“文件”——“新建”,出现下面界面:
选择“Win32ConsoleApplication”(控制台应用程序,左边倒数第三个),命名工程名称,选择保存位置,点击“确定”,进入下一步,看到如下提示界面:
建立一个空工程,对应其他需要的你一可以建立别的工程;点击“完成”,之后:
显示你创建的工程的信息。
2、再在有一个的工程的条件下,我们再建立一个源文件;
“文件”——“新建”(快捷键Ctri+N),出现:
建立源文件,选择“C++Source”,一般都是建立这种文件的(适用在当文件中适用)如果要建立头文件的话,选择“C/C++HeaderFile”,(适用在多文件工程中使用)命名,文件名称,点击“确定”,之后:
进入编辑区,在主界面编写代码,如编写完之后:
可以按编译按钮
调试程序,看看有没有错误,有的话改正,没有的话就可以再按连接按钮
检查连接(多文件工程时常用,检查文件间是否正常连接),最后,点运行按钮
,就可以运行了。
如果代码如:
cpp文件,或.h文件,想添加都VC6.0里来测试的话,可以这样做:
首先,文件扩张名是.h,代表的是头文件,一般是书写一些函数原型,以及一些在整个程序中常用到的结构体,频繁使用的函数说明,定义等等;
文件扩张名为,cpp的,是C++中的源文件,也是最常用到的文件,每建立一个工程都要至少一个源文件(至少要有一个函数入口——主函数main()),包含了核心代码;
建立与运行说明:
(以VC6.0编译器为例,其他编译器类似)
首先,打开VC6.0编译环境;
在菜单栏——文件(的下拉菜单中选择“新建”),在弹出的选择窗口中,选择
Win32ConsoleApplication(控制台应用程序),在填写工程名称,选择一个程序保存路径,点击“完成”,查看工程信息。
在点击“确定”,就建立一个简单的工程了。
再点击左边的工程信息右下角的“FileView”选项;
可以看到你新建的工程,再双击你新建的工程名可以查看工程的信息。
在双击工程文件,在这里是777.files,可以看到该工程的包含的文件。
:
其中,SourceFiles为包含所有工程的源文件
HeaderFiles为包含所有工程的头文件
在源文件选项“SourceFiles”,右键单击中的“添加目录到工程”,添加你要打开的扩展名为.cpp的源文件。
在头文件选项“HeaderFiles”,右键单击中的“添加目录到工程”,添加你要打开的扩展名为.h的头文件。
添加完你所有的头文件和源文件之后,检查一下是否添加完毕,之后就可以编译了。
其中第一个按钮
为编译按钮,可以找出工程的错误信息,有错误修改,没错误就可以跳到连接,编译右边的按钮
,即第三个按钮(多文件工程一定要连接,查看文件是否准确相连接),当编译,连接都没有错误时,可以按运行按钮
,即可以运行了。
第二章考核平台
PC2客户端是编程竞赛中参赛队员使用的客户端程序,具有提交题目答案(源代码)、测试答案、查看评判结果、提问等功能。
2.1启动客户端
进入文件夹X:
\pc2\,打开文件pc2team.bat,启动程序后可看到登录界面:
在登录界面上输入用户名和密码,请注意区别大小写。
用户名和密码在比赛前由主办方提供。
登录成功后则进入主界面,如下图所示:
若比赛还未开始、比赛中止、比赛已结束,则在主界面上方会提示红色大字体“STOPPEDCONTESTISNOTRUNNING.”。
如果比赛正在进行,则在左上方提示剩余时间。
客户端主界面一共有四个页面:
(1)“Submit”页面:
用于提交题目的源代码答案和本地编译测试源代码。
(2)
(3)“Clarification”页面:
向裁判提问,沟通交流。
(4)
(5)“Runs”页面:
查看每次提交答案的评判结果。
Status为“Yes”表示答案正确,解题成功。
(6)
(7)“Setting”页面:
修改用户密码。
(8)
2.2提交答案
在主界面“Submit”页面上,您可以提交对某道比赛题目的解答情况,上传源代码文件。
系统会自动帮您编译源代码,运行编译后的程序,验证运行结果,以确定源代码是否正确。
必要时裁判人员会帮您手工评判。
提交答案的步骤如下:
在“Problem”下拉框中选择您要解答的题目。
在“Language”下拉框中选择您使用的编程语言,默认提供C++、GNUC++、GNUC、Java四种选项。
这里的语言指的是系统所采用的编译平台,C++使用VisualC++2005编译器,GNUC++使用G++编译器,GNUC使用GCC编译器,Java使用Javac编译器。
C/C++编译器支持C99标准语法,Java编译器使用的JDK是JDK1.6。
您应根据源代码语言选择对应的选项(编译器):
C++语言:
选择“C++”或“GNUC++”。
C语言:
选择“C++”或“GNUC”。
(VisualC++2005编译器支持C语言)
Java语言:
选择“Java”。
点击“Select”按钮,选择您要提交的源代码文件(对应所选题目)。
如果您的源代码文件有多个,请先用“Select”按钮选择包含应用程序入口函数(main)的主文件,再点击左下角的“Add”按钮添加其余文件。
“Remove”按钮可以移除附加文件。
注意不能提交任何数据文件或编译后的可执行程序文件。
点击“Submit”按钮,提交源代码。
提交前系统会弹出提交提示框(“RunSubmissionConfirmation”),请您确认您要提交的内容:
若您确认无误,则点击“Submit”按钮,否则按下“Cancel”按钮取消提交。
提交成功系统会返回一个消息提示:
成功提交后,系统会尽快评判您的答案,包括编译代码、运行程序、验证结果等过程,然后以消息提示框的方式通知评判结果。
若答题通过,则返回的结果(Judge’sresponse)为“Yes”,否则返回其他错误提示(以“No”开头)。
评判结果一般可分为四种:
评判结果
说明
Yes
解题正确
No-CompilationError
错误原因:
编译错误
No-Run-timeError
错误:
程序运行错误
No-Time-limitExceeded
错误:
运行超时(每道题都有运行时间限制)
No-WrongAnswer
错误:
运行结果与标准答案不一致
No-ExcessiveOutput
错误:
程序运行占用内存空间超出要求
No-OutputFormatError
错误:
输出格式错误
No-Other-ContactStaff
未知错误
系统并不限制每道题的提交次数,若您提交某道题的答案后系统返回错误提示,您可修改源代码后继续提交,但一般情况下请尽量保证您提交的代码是正确无误的(可使用“Test”功能在本地测试一下)。
因为提交的错误次数将会影响您的最终排名。
2.3查看每次做题情况
在“Run”页面可以查看每次提交答案对应的评判结果:
上图的表显示了每次提交的ID(RunId)、题目(Problem)、解题时间(Time,从比赛开始算起,单位分钟)、评判结果(Status)、编程语言(Language)。
2.4“Test”功能
若您想在正式提交答案前模拟一下系统评判的编译环境,测试一下您的代码,您可以使用“Test”功能。
“Test”功能将使用与裁判端一致的编译环境编译您的代码,在本地机子运行编译后的可执行程序,并输出运行结果。
“Test”功能使用如下:
在“Submit”页面选定题目、语言、源代码文件后,点击“Test”按钮,在弹出的对话框选择测试所用的输入数据文件:
该测试数据文件是一个Ansi格式编码文本文件,其内容要求与题目输入数据格式一致,一般需要参赛人员自己编写。
一个简单快速的方法是您将题目描述中的“SampleInput”(输入示例)“拷贝”到一个txt文件中,然后选择该txt文件。
若比赛官方有说明,则会在一个URL地址(比如)中提供这些测试数据样例的下载。
选定测试数据文件后,系统会帮您编译代码,并给出输出结果或错误内容提示:
2.5提问功能
若您对某次评判结果有疑问,可以在“Clarification”页面中提交您的问题,裁判或主席团将酌情给予解答。
“提问”使用过程:
点击“RequstChar”按钮,在提问窗口选择题目,编写您的问题后提交。
您需要在问题中说明具体某次提交的RunId,详细地说明问题内容,否则裁判难以帮您解答。
一般情况下,若返回的评判结果是“No-Other-ContactStaff”,才建议您使用提问功能(其他结果能很明确地说明您的答案有问题)。
2.6退出客户端
点击主界面右上角“X”按钮或“Exit”按钮。
第三章实验项目
实验1员工信息系统中结构体设计与实现
实验学时:
4
实验类型:
设计
实验要求:
必修
一、实验目的
1、掌握结构体类型变量的定义和使用;
2、掌握结构体类型数组的概念和应用;
3、针对具体实际定义和使用结构体;
4、掌握文件的基本读写操作;
5、掌握链表的概念,初步学会对结构体链表的操作。
二、预习与参考
1、认真阅读程序设计教程关于结构体的内容,熟悉结构体的操作;
2、针对一些简单实例学会设计结构体;
3、查找一些关于函数参数传值与传地址的实例,掌握函数传参的方法;
4、参考教材,学会怎样建立一个新的链表;
三、实验要求
上机实验时,一人一组,独立上机。
[实验题]
有公司,每个员工的数据包括员工号、姓名、所在部门、工资、电话号码等,从文件中读入员工数据,要求输出平均工资,以及最高工资员工的数据。
1、要求应用结构体数组设计,用input函数输入数据,用average函数求平均工资,用max函数求最高工资,用output函数按要求输出。
structStaffInfor{
charID[12];
charName[10];
charDepart[20];
intSalary;
charPhoneNo[13];
};
voidinput(structStaffInforPerson){初始化一个结构体信息}
intaverage(structStaffInforP[],intn){求平均值并返回}
structStaffInforMaxStaff(structStaffInforP[],intn){找到工资最高值,返回结构体}
voidoutput(structStaffInforPerson){输出一个结构体信息}
voidmain(){
freopen(“input.txt”,”r”,stdin);//读指定文件
freopen(“output.txt”,”w”,stdout);//输出到指定文件
…………….
}
2、对问题应用单链表设计并实现。
四、实验步骤
1、进入环境,设计好程序结构;
2、编写程序,并调试;
3、运行程序并分析运行结果;
4、提交至PC2系统,测试程序的正确性和完整性。
五、测试
建立input文件,输入数据,如:
10101王建
10102李小
10103陈晓
输出平均工资,以及最高工资员工数据:
5000
六、实验报告要求
1、阐述实验目的和实验内容;
2、阐述求解问题的算法原理;
3、提交实验程序的功能模块;
4、记录最终测试数据和测试结果。
七、思考题实验
1、将问题用链表实现;
2、插入一个员工的信息,查找某个员工的信息;
3、比较2种方法的优劣。
实验2多项式加法的链表设计与实现
实验学时:
4
实验类型:
设计
实验要求:
必修
一、实验目的
1、掌握链表的灵活运用;
2、学习链表初始化和建立一个新的链表;
3、知道怎样去实现链表删除结点操作与插入结点;
4、理解链表的基本操作(包括数据域数据的相加)并能灵活运用。
二、预习与参考
1、认真阅读数据结构教材和算法设计教材内容,熟悉链表的操作;
2、针对线性结构设计出实现多项式加法的算法;
3、建立两个链表为稀疏多项式,将他们每项按项相加,最后将得到的链表打印出来;
[算法或程序设计参考]
要解决多项式相加,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表,所以我将结点结构体定义为
序数coef
指数exp
指针域next
运用尾插法建立两条单链表,以单链表polya和polyb分别表示两个一元多项式A和B,A+B的求和运算等同于单链表的插入问题(将单链表polyb中的结点插入到单链表polya中),因此“和多项式”中的结点无须另生成。
为了实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q结点的指数项,由此得到下列运算规则:
1、若p->expexp,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。
2、若p->exp==q->exp,则将两个结点中的系数相加,当和不为0时修改结点p的系数。
3、若p->exp>q->exp,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。
三、实验要求
上机实验时,一人一组,独立上机。
1、设计一个一元多项式的简单计算器,其基本功能有①输入并建立多项式;②输出多项式;③多项式相加。
可利用单链表或单循环链表实现之。
2、运用单链表来存储多项式,并且结果链表要用原来的链表空间,空间复杂度为O
(1)。
四、实验步骤
1、进入环境,设计好程序结构;
2、编写程序,并调试;
3、运行程序并分析运行结果;
4、提交至PC2系统,测试程序的正确性和完整性。
五、测试
分别输入(任意)两个多项式,
如:
5X3+4X2+3X+2和X2+X+1,
然后输出正确结果5X3+5X2+4X+3。
六、实验报告要求
1、阐述实验目的和实验内容;
2、阐述求解问题的算法原理;
3、提交实验程序的功能模块;
4、记录最终测试数据和测试结果。
七、思考题
1、怎样实现多项式乘法;
2、怎样用循环链表实现。
实验3归并排序分治策略的设计与实现
实验学时:
2
实验类型:
设计
实验要求:
必修
一、实验目的
1、熟悉分治法求解问题的抽象控制策略;
2、熟悉在顺序存储表示下求解分类问题的递归算法设计;
3、通过实例转换,掌握分治法应用。
二、预习与参考
1、认真阅读算法设计教材和数据结构教材内容,熟悉不分治方法的原理;
2、针对分类问题设计递归算法;
3、参考教材和课堂教学内容,根据分治法求解问题的抽象控制策略简单实现应用。
[算法或程序设计参考]
voidMerge(intA[],intlow,intmid,intheigh)
{实现数组中的已分好类的两部分进行合并}
voidM_sort(intA[],intlow,intheigh)
{对数组中从下标low开始到heigh结束的部分进行分类}
三、实验要求
上机实验时,一人一组,独立上机。
给定任意多组数据,用归并排序对每组数据进行非降排序。
四、实验步骤
1、进入环境,设计好程序结构;
2、编写程序,并调试;
3、运行程序并分析运行结果;
4、提交至PC2系统,测试程序的正确性和完整性。
五、测试
Input:
10
101126974135
Output:
12345678911
六、实验报告要求
1、阐述实验目的和实验内容;
2、提交实验程序的功能模块;
3、阐述将递归算法改写成迭代算法的一般方法;
4、用类C语言阐述分治法递归抽象控制策略。
七、思考题
1、应用分治法抽象控制策略实现快速分类。
2、应用快速分治中的划分函数实在查找第k小元素。
实验4二分检索的递归与迭代算法设计
实验学时:
4
实验类型:
设计
实验要求:
必修
一、实验目的
1、熟悉二分检索问题的线性结构表示和二分检索树表示;
2、熟悉不同存储表示下求解二分检索问题的递归算法设计;
3、通过实例转换,掌握将递归算法转换成迭代算法的方法;
4、掌握应用递归或迭代程序设计实现分治法求解问题的抽象控制策略.
二、预习与参考
1、认真阅读算法设计教材和数据结构教材内容,熟悉不同存储表示下求解二分检索问题的原理或方法;
2、针对线性结构表示和二分检索树表示设计递归算法;
3、参考教材和课堂教学内容,根据将递归算法转换成迭代算法的一般步骤将二分检索递归算法转换成相应的迭代算法.
[算法或程序设计参考]
线性结构
intdata[10]={/*10个互异的、无序的原始整数*/};
typedefstruct{ints[100];inttop;}STACK;
intPartition(int*data,intlow,inthigh)
功能:
将data[low,high]进行快速分类划分,返回枢轴记录关键字的位置索引.
intQSort1(int*data,intlow,inthigh)
功能:
将data[low,high]进行快速分类的递归算法.
intQSort2(int*data,intlow,inthigh)
功能:
将data[low,high]进行快速分类的迭代算法.
intBSearch1(int*data,intkey)
功能:
在data数组中检索key的二分检索递归算法,成功时返回位置索引,否则返回-1.
intBSearch2(int*data,intkey)
功能:
在data数组中检索key的二分检索迭代算法,成功时返回位置索引,否则返回-1.
树结构
typedefstructNODE{intkey;structNODE*lch,*rch;}TNODE,*BT;
typedefstructParameters{BT*t;intkey;BTf;BT*p}PARA;
typedefstruct{PARAs[100];inttop;}STACK;
intInsertBT(BT*t,intkey)
功能:
在二分检索树t中插入关键字为key的元素,成功时返回1,否则返回0.
intTSearch1(BT*t,intkey,BTf,BT*p)
功能:
用递归算法在二分检索树t中查找关键字为key的元素,成功时返回1,p指向该元素节点,否则p指向查找路径上最后一个节点并返回0,f指向t的双亲,其初始调用值为NULL.
intTSearch2(BT*t,intkey,BTf,BT*p)
功能:
用迭代算法在二分检索树t中查找关键字为key的元素,成功时返回1,p指向该元素节点,否则p指向查找路径上最后一个节点并返回0,f指向t的双亲,其初始调用值为NULL.
三、实验要求
上机实验时,一人一组,独立上机。
能对树进行非递归遍历。
四、实验步骤
1.调试线性