版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、程序设计艺术与方法实验一 STL 的熟悉与使用1 实验目的 (1) 掌握 C+中 STL 的容器类的使用。 (2) 掌握C+中 STL 的算法类的使用。2 试验设备 硬件环境:PC 计算机 软件环境: 操作系统:Windows 2000 / Windows XP / Linux 语言环境:Dev cpp / gnu c+ 3 试验内容 (1) 练习 vector 和 list 的使用。 定义一个空的 vector,元素类型为 int,生成 10 个随机数插入到 vector 中,用迭代 器遍历 vector 并输出其中的元素值。在 vector 头部插入一个随机数,用迭代器遍历 vector
2、并输出其中的元素值。用泛型算法 find 查找某个随机数,如果找到便输出,否则将此数 插入 vector 尾部。用泛型算法 sort 将 vector 排序,用迭代器遍历 vector 并输出其中的元 素值。删除 vector 尾部的元素,用迭代器遍历 vector 并输出其中的元素值。将 vector 清 空。 定义一个 list,并重复上述实验,并注意观察结果。 (2) 练习泛型算法的使用。 - 149 定义一个 vector,元素类型为 int,插入 10 个随机数,使用 sort 按升序排序,输出 每个元素的值,再按降叙排序,输出每个元素的值。练习用 find 查找元素。用 min 和
3、 max 找出容器中的小元素个大元素,并输出。源代码:#include #include #include#include #include using namespace std;vector myV;bool sortup(int v1,int v2)return v1v2; int main(int argc, char *argv) srand(time(NULL); for (int i=0;i10;i+) myV.push_back(rand(); sort(myV.begin(),myV.end(),sortup); vector:iterator it1; for (it1=m
4、yV.begin();it1!=myV.end();it1+) cout(*it1)setw(6); coutendl; int min=myV0; for (it1=myV.begin()+1;it1!=myV.end();it1+) if(*it1)min)min=(*it1); cout最小元素为 minmax)max=(*it1); cout最大元素为 maxendl; coutendl; int value=rand(); it1=find(myV.begin(),myV.end(),value); if(*it1)=value) cout找到了这个随机数endl ; else co
5、ut没有找到这个随机数endl; myV.insert(myV.end(),value); cout插入尾部的随机数为valueendl; for (it1=myV.begin();it1!=myV.end();it1+) cout(*it1)setw(6); coutnendl; int t=rand(); myV.insert(myV.begin(),t); cout插入头部的随机数为 tendl; for (it1=myV.begin();it1!=myV.end();it1+) cout(*it1)setw(6); coutendl; myV.pop_back (); for (it1
6、=myV.begin();it1!=myV.end();it1+) cout(*it1)setw(6); coutendl; myV.clear(); if(myV.empty() cout Its empty! endl; system(PAUSE); return 0;运行截图:2 练习泛型算法的使用:源代码:#include#include/#incluedusing namespace std;typedef list lin;int value=1,2,3,4,5; void print(lin &l)int i;lin:iterator lit; for(lit=l.begin()
7、;lit!=l.end();lit+)cout(*lit) ; coutv2; int main()lin lin2; lin2.push_front(3); lin2.push_front(4); lin2.insert(lin2.begin(),value,value+5);coutlin2内的元素为:;print(lin2);lin2.sort();cout排序后的lin2: ;print(lin2);lin2.push_front(10); cout在list头部插入10之后的结果:; print(lin2);lin2.remove(6);cout删除一个数后的lin1:; print
8、(lin2); system(PAUSE); return 0;运行截图:实验二 搜索算法的实现1. 实验目的 (1) 掌握宽度优先搜索算法。 (2) 掌握深度优先搜索算法。 2. 试验设备 硬件环境:PC 计算机 软件环境: 操作系统:Windows 2000 / Windows XP / Linux 语言环境:Dev cpp / gnu c+ 3. 试验内容 (1) 将书上的走迷宫代码上机运行并检验结果,并注意体会搜索的思想。 (2) 八皇后问题:在一个国际象棋棋盘上放八个皇后,使得任何两个皇后之间不相互攻击,求出所有的布棋方法。上机运行并检验结果。 思考:将此题推广到 N 皇后的情况,检
9、验在 N 比较大的情况下,比方说 N=16 的时 候,你的程序能否快速的求出结果,如果不能,思考有什么方法能够优化算法。 (3) 骑士游历问题: 在国际棋盘上使一个骑士遍历所有的格子一遍且仅一遍,对于任意给定的顶点, 输出一条符合上述要求的路径。 (4) 倒水问题:给定 2 个没有刻度容器,对于任意给定的容积,求出如何只用两个瓶装出 L 升 的水,如果可以,输出步骤,如果不可以,请输出 No Solution。(2)八皇后问题源代码:#include using namespace std;#include int sum = 0;int upperlimit = 1;void compare
10、(int row,int ld,int rd)if(row!=upperlimit)int pos=upperlimit&(row|ld|rd); while(pos!=0)int p=pos&-pos;pos-=p;compare(row+p,(ld+p)1);elsesum+;int main()int n;coutn;upperlimit = (upperlimitn)-1;compare(0,0,0);cout问题的解如下:sumendl;return 0;运行截图:(4)倒水问题源代码:4.倒水问题:#includestdio.hint main() int ca,cb,cc,x,y
11、; while(scanf(%d%d%d,&ca,&cb,&cc)!=EOF) if(cb=cc) printf(fill Bn); else if(ca=cc) printf(fill An); printf(pour A Bn); else x=y=0; if(caca-x) /如果b中的水大于a中的剩余容积,就把a灌满/ y-=ca-x; x=ca; printf(pour B An); else /如果b中的水小于a中的剩余容积,那么把b中的水全加入a/ x+=y; y=0; printf(pour B An); if(y=cc) /如果b中的水已经和cc相等,那就结束/ break;
12、 if(ca=x) /如果a中的水满了,就把a倒空/ x=0; printf(empty An); else while(1) if(x=0) x=ca; printf(fill An); if(xcb-y) /如果a中的水大于b中的剩余容积,就把b灌满/ x-=cb-y; y=cb; printf(pour A Bn); else /如果a中的水小于b中的剩余容积,那么把a中的水全加入b/ y+=x; x=0; printf(pour A Bn); if(y=cc) /如果b中的水已经和cc相等,那就结束/ break; if(y=cb) /如果b中的水满了,就把b倒空/ y=0; prin
13、tf(empty Bn); printf(successn); return 0;运行截图:实验三 计算几何算法的实现1. 实验目的 (1) 理解线段的性质、叉积和有向面积。 (2) 掌握寻找凸包的算法。 (3) 综合运用计算几何和搜索中的知识求解有关问题。 2. 试验设备 硬件环境:PC 计算机 软件环操作系统:Windows 2000 / Windows XP / Linux 语言环境:Dev cpp / gnu c+ 3. 试验内容 (1) 将讲义第三章第三节中的凸包代码上机运行并检验结果。 (2) 完成讲义第三章的课后习题,上机运行并检验结果。 (3) 思考: 判线段相交时,如果有个线
14、段的端点在另一条线段上,注意可能与另一条线段上的 端点重合,思考这样的情况怎么办。 (4) 房间短路问题: 给顶一个内含阻碍墙的房间,求解出一条从起点到终点的短路径。房间的边界 固定在 x=0,x=10,y=0 和 y=10。起点和重点固定在(0,5)和(10,5)。房间里还有 0 到 18 个 墙,每个墙有两个门。输入给定的墙的个数,每个墙的 x 位置和两个门的 y 坐标区间, 输出最短路的长度。(4)房间短路问题源代码: #include #include #include #include using namespace std; typedef pair POINT;/线段 doubl
15、e direction(POINT p,POINT p1,POINT p2) POINT v1,v2; v1.first=p2.first-p1.first; v1.second=p2.second-p1.first; v2.first=p1.first-p.first; v2.second=p1.second-p.second; return v1.first*v2.second-v1.second*v2.second; bool on_segment(POINT p,POINT p1,POINT p2) double min_x=p1.firstp2.first?p1.first:p2.f
16、irst; double min_y=p1.secondp2.second?p1.second:p2.second; if(p.first=min_x&p.first= min_y&p.second=max_y) return true; else return false; POINT startPoint; bool sortByPolorAngle(const POINT &p1,const POINT &p2) double d=direction(startPoint,p1,p2); if(d0)return false; if(d=0&on_segment(startPoint,p
17、1,p2)return true; if(d=0&on_segment(p2,startPoint,p1)return true; return false; void find_convex_hull(vector&point) POINT p0=point0; int k=0; for(int i=0;ipoint.size();i+) if(pointi.secondp0.second| pointi.second=p0.second&pointi.firstp0.first) p0=pointi; k=i; point.erase(point.begin()+k); point.ins
18、ert(point.begin(),p0); vectorconvex_hull; do convex_hull.push_back(point0); startPoint=point0; point.erase(point.begin(); sort(point.begin(),point.end(),sortByPolorAngle); if(point0=convex_hull0)break; point.push_back(convex_hullconvex_hull.size()-1); while(1); for(int j=0;jconvex_hull.size();j+) co
19、utconvex_hullj.first convex_hullj.secondendl; int main() vector pv; double x,y; int i; cout请输入10个点:endl; for(i=1;i=10;i+) coutNo.ixy;pv.push_back(make_pair(x,y); coutendl; find_convex_hull(pv); system(Pause); return 0; 运行截图:实验四 动态规划算法的实现1. 实验目的 (1) 理解动态规划的基本思想、动态规划算法的基本步骤。 (2) 掌握动态规划算法实际步骤。 2. 试验设备
20、硬件环境:PC 计算机 软件环境: 操作系统:Windows 2000 / Windows XP / Linux 语言环境:Dev cpp / gnu c+ 3. 试验内容 (1) 求两个字符串的最长公共子序列。 X 的一个子序列是相应于 X 下标序列1, 2, , m的一个子序列,求解两个序列的所有 子序列中长度大的,例如输入:pear, peach 输出:pea。 (2) 给定两个字符串 a 和 b,现将串 a 通过变换变为串 b,可用的操作为,删除串 a 中的一 个字符;在串 a 的某个位置插入一个元素;将串 a 中的某个字母换为另一个字母。对于 任意的串 a 和串 b,输出少多少次能够
21、将串变为串 b。 思考:输出变换的步骤。 (3) 输入一个矩阵,计算所有的子矩阵中和的大值。 例如,输入 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 输出为:15 思考:当矩阵很大时,比如 100*100 的矩阵,你的程序还能够很快的得出结果吗,如果 不能,请思考如何用动态规划的思想解决(1) 求两个字符串的最长公共子序列源代码:#include#include#define N 100using namespace std;/str1存储字符串x,str2存储字符串ychar str1N,str2N;/lcs存储最长公共子序列char lcsN;/cij存储str11.i与str21.j的最长公共子序列的长度int cNN;/flagij=0为str1i=str2j/f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 婚庆行业前台工作总结
- 定制家具设计师工作要点
- 《美丽的海洋世界》课件
- 购物服务员工作总结
- 前台文员情绪智力提升方案计划
- 《苗木霜害怎么预防》课件
- 2024年广东省汕尾市公开招聘警务辅助人员辅警笔试自考题2卷含答案
- 2021年甘肃省嘉峪关市公开招聘警务辅助人员辅警笔试自考题2卷含答案
- 2023年四川省雅安市公开招聘警务辅助人员辅警笔试自考题1卷含答案
- 2021年云南省楚雄自治州公开招聘警务辅助人员辅警笔试自考题1卷含答案
- 护理给药制度课件
- 基于单片机的火灾报警系统设计
- 培智三年级上册生活语文期末测试卷(A)
- GB/T 13296-2023锅炉、热交换器用不锈钢无缝钢管
- JCT2381-2016 修补砂浆标准
- 新加坡学习汇报
- 人工智能与机器学习基础课程
- 高速公路隧道工程施工方案
- 中国营养科学全书
- 针灸推拿试题(附参考答案)
- 《机械制图》说课课件-画组合体视图的方法和步骤
评论
0/150
提交评论