计算机软件应用结课作业.docx
- 文档编号:16510622
- 上传时间:2023-07-14
- 格式:DOCX
- 页数:36
- 大小:28.59KB
计算机软件应用结课作业.docx
《计算机软件应用结课作业.docx》由会员分享,可在线阅读,更多相关《计算机软件应用结课作业.docx(36页珍藏版)》请在冰点文库上搜索。
计算机软件应用结课作业
《软件技术基础》结课大作业
姓名:
院振召
学号:
120611335
日期:
2014年6月20日
2014软件技术基础期末作业
说明与要求:
1.开放式考试不仅考察知识,同时考察学生查阅文献的能力;学生可以使用Google、XX等搜索引擎,图书馆数字资源,如同方CNKI(中国学术期刊全文数据库)查阅资料,寻找答案和解题思路;
2.可以使用各种工具帮助自己解题,可以相互讨论,但是不允许拷贝、复制、剽窃他人结果。
如果发现雷同,按雷同人数,每次雷同从成绩中扣除10分。
因不存在完美雷同标准,因此将根据批改教师的个人识别,进行雷同确认,因此为避免雷同,请自己设计代码或解题;
3.每个编程问题都要首先说明思路,然后给出代码;程序以及求解方法描述的编辑应该美观;程序代码应该有层次缩进,以便阅读;
4.每个编程问题的C/C++代码的每一行必须有清晰的注释,说明改行中变量和语句的作用,如果注释和C/C++语句不符,则视为剽窃。
5.根据自己的情况,采用C或C++语言中德一种作为编程语言,不能使用两种以上的语言;
6.编辑排版时,采用汉字五号宋体,英语和代码采用10号或五号TimesNewRoman字体,打印时采用双面打印,连同填写好的封面一起装订,在最后一堂课时上交;禁止使用更大号字;
2014软件技术基础期末作业
1.利用减半递推技术,写出求长度为n的数组中最大元素的递归算法(10分)。
2.编写用回溯法求解n皇后的算法(10分)。
3.给定n个城市间的距离,求从一个城市0出发经过其他城市一次且一次的一条最短路径(15分)。
4.将单链表看做二叉树,编写递归程序打印单链表(10分)。
5.编写二叉树的层次遍历算法(15分)。
6.自底向上实现归并排序算法(10分)。
7.实现堆排序算法(15分)。
8.实现迪杰斯特拉最短路径算法(15分)
1、利用减半递推技术,写出求长度为n的数组中最大元素的递归算法
解释说明:
解决实际问题的复杂程度往往与问题的规模有着密切的关系,因此,降低问题的规模是算法设计的关键,而减半递推技术是降低问题国模的一种有效方法。
所谓的“减半”,是指将问题的规模减半,而问题的性质不变。
所谓的“递推”是指重复“减半”的过程。
算法如下:
#include
usingnamespacestd;
intmax(inta[],intleft,intright)
{
intmid=(left+right)>>1;
intx,y;
if(left==right-1)returna[left];
x=max(a,leftmid);
y=max(a,mid,right);
returnx>y?
x:
y;
}
voidmain()
{
intn,i;
inta[1000];
cin>>n;
for(i=0;i
cout< } 2、编写用回溯法求解n皇后的算法 解释说明: n个皇后在n元棋盘上的布局有n的n次方种,用回溯发求解问题。 假设定义一个长度为n的一维数组q,其中的每一个元素q[i](i=1,2,...,n)随时记录第n行上的皇后所在的序列号。 初始时,先将各皇后放在各行的第一列。 即数组q的初值为|q[i]-q[j]|=|i-j| 而它们在同一列上的条件为q[i]=q[j] 算法如下: #include #include usingnamespacestd; classNQueen { private: intnumOfQueen;//thenumberofqueens intnumOfanswer;//thenumberofanswers int*queen; public: NQueen(); NQueen(intm); ~NQueen(); boolplace(intk); voidbacktrack(intt); voidshowQueen(); }; NQueen: : NQueen() { numOfQueen=0; numOfanswer=0; queen=newint[1]; } NQueen: : NQueen(intm) { numOfQueen=m; numOfanswer=0; queen=newint[m+1]; for(inti=0;i<=m;i++) { queen[i]=0; } } NQueen: : ~NQueen() { delete[]queen; cout<<"queensaredeleted! "< } voidNQueen: : showQueen() { for(inti=1;i<=numOfQueen;i++) cout< cout< } boolNQueen: : place(intk)//theconstraintfunction { for(intj=1;j if((fabs(k-j)==fabs(queen[j]-queen[k]))||(queen[j]==queen[k])) returnfalse; returntrue; } voidNQueen: : backtrack(intt) { inti=0; if(t>numOfQueen) { numOfanswer++; showQueen(); } else { for(i=1;i<=numOfQueen;i++) { queen[t]=i; if(place(t)) backtrack(t+1); } } } voidbacktrack(intt) { if(t>n) output(x); else { for(i=f(n,t);i<=g(n,t);i++) { x[t]=h(i); if(constraint(t)&&bound(t)) backtrack(t+1); } } } voiditerativeBack() { intt=1; while(t>0) { if(f(n,t) for(i=f(n,t);i<=g(n,t);i++) { x[t]=h(i); if(constraint(t)&&bound(t)) { if(solution(t)) output(x); elset++; } elset--; } } } voidbacktrack(intt) { if(t>n) output(x); else { for(i=0;i<=1;i++) { x[t]=i; if(constraint(t)&&bound(t)) backtrack(t+1); } } } voidbacktrack(intt) { if(t>n) output(x); else { for(i=t;i<=n;i++) { swap(x[t],x[i]); if(constraint(t)&&bound(t)) backtrack(t+1); swap(x[t],x[i]); } } } intmain() { intm1=4,m2=8; NQueenQ1(m1); cout<<"thenumberofqueensare: "< Q1.backtrack (1); NQueen*Q2=newNQueen(m2); cout<<"thenumberofqueensare: "< Q2->backtrack (1); return0; } 3、给定n个城市间的距离,求从一个城市0出发经过其他城市一次且一次的一条最短路径(15分)。 解释说明: 从理论上讲,可以计算出最短路径,但要借助计算机,计算量较大,人力难以胜任。 方法如下: 假定出发城市编号为0,其他城市编号为1~n-1,将1~n-1号城市排列,按排列顺序计算每种排列从排头城市到排尾城市的距离和X,实际距离D=X+0和排头城市的距离+0和排尾城市的距离,这样共得到A 个距离D,从中选出最小的一个即可。 编一段简单程序,把n个城市间的距离输入进去,就能轻易算出最短距离 算法如下: #include intmain() { intG[100][100]={0};//一个记录图的邻接矩阵 inta,b,w;//输入一共有7条边,5个点 inti,j,k; for(i=1;i<=5;i++) for(j=1;j<=5;j++) G[i][j]=9999999; for(i=1;i<=7;i++) { scanf("%d%d%d",&a,&b,&w);//输入每条边的信息,a和b代表这条边的两个顶点w代表两个点的距离 G[a][b]=w; G[b][a]=w; } for(k=1;k<=5;k++) for(i=1;i<=5;i++) for(j=1;j<=5;j++) if(G[i][j]>G[i][k]+G[k][j]) G[i][j]=G[i][k]+G[k][j]; printf("%d",G[1][4]);//输出两点之间的最短路,这里的两个点是3和5 return0; }//G[i][j]代表i到j的距离,甲,乙,丙,丁,戊用1,2,3,4,5代替 4、将单链表看做二叉树,编写递归程序打印单链表 解释说明: 建立和遍历二叉树的程序都比较简单,关键在于按要求打印二叉树。 起初一直找不到合适的方法按题目要求打印二叉树,在和同学讨论了很久之后终于有了思路。 打印的格式中,最上层的节点是右子树层次最高的,于是就可以用递归调用的方式实现。 递归次数最高的就是输出最顶置的节点。 在调试程序的时候也出现了问题,起初没有在意输入方式对程序运行结果的影响,导致程序无法运行,在检查了很久之后终于找到了问题的所在,对输入进行了改正,得到了正确的结果。 在建立二叉树时,输入的格式一定要正确,没有孩子的要用空格表示,在测试用例中,F没有孩子,要用两个空格表示,如果输入“AB#D##CE#F”则没有输出结果。 算法如下: #include #include #include #include #defineNUM_NODE12 #defineMOST_DEPTH10 typedefstructBiTree{ intdata; BiTree*lchild; BiTree*rchild; }BiTree; typedefstructAnswear{ intDegree0; intDegree1; intDegree2; intDepth; }Answear; BiTree*CreateTree(intn) { BiTree*t; if(n<=0||n>NUM_NODE)returnNULL; if(! (t=(BiTree*)malloc(sizeof(BiTree)))) returnNULL; t->data=n; printf("%d",t->data); t->lchild=CreateTree(2*n); t->rchild=CreateTree(2*n+1); returnt; } voidFreeTree(BiTree*t) { if(t) { if(t->lchild) FreeTree(t->lchild); if(t->rchild) FreeTree(t->rchild); printf("%d",t->data); free(t); } } //中序遍历 voidInOrder(BiTree*t) { BiTree**stack,**top,*p; //创建堆栈 if(! (stack=(BiTree**)malloc(NUM_NODE*sizeof(BiTree)))) { printf("InOrderfailedformemery\n"); return; } //初始化堆栈 top=stack; p=t; while(p||top>stack)//p不为NULL,堆栈不空 if(p) { *top++=p;//p入堆栈 p=p->lchild; } else { p=*--top;//p出栈 if(p)printf("%d",p->data); p=p->rchild; } } //前序遍历 voidPreOrder(BiTree*t) { BiTree**stack,**top,*p; if(! (stack=(BiTree**)malloc(NUM_NODE*sizeof(BiTree)))) { printf("InOrderfailedformemery\n"); return; } top=stack; p=t; while(p||top>stack) if(p) { *top++=p; if(p)printf("%d",p->data); p=p->lchild; } else { p=*--top; p=p->rchild; } } //后序遍历 voidPostOrder(BiTree*t) { BiTree**stack,**top,*p,*p_old,*p_new; intFlag; if(! (stack=(BiTree**)malloc(NUM_NODE*sizeof(BiTree)))) { printf("InOrderfailedformemery\n"); return; } top=stack; Flag=0; *top++=t; while(top>stack) { p=*(top-1); if(p->lchild&&! Flag) *top++=p->lchild; else { if(p->rchild) { *top++=p->rchild; Flag=0; } else { p_old=*--top; printf("%d",p_old->data); while(top>stack) { p_new=*(top-1); if(p_old==p_new->lchild) { Flag=1; break; } else { p_new=*--top; printf("%d",p_new->data); p_old=p_new; Flag=0; } } } } } } //中序遍历求结点的深度和度为0,1,2的结点数,结果保存在pAns指的。 。 。 voidInOrderDO(BiTree*t,Answear*pAns) { //遍历用的数据 BiTree**stack,**top,*p; //求深度的数据 intcurDeep,MostDeep; //创建堆栈 if(! (stack=(BiTree**)malloc(NUM_NODE*sizeof(BiTree)))) { printf("InOrderfailedformemery\n"); return; } //初始化堆栈 top=stack; p=t; //初始化数据 curDeep=MostDeep=0; pAns->Degree0=pAns->Degree1=pAns->Degree2=0; //遍历循环 while(p||top>stack)//p不为NULL,堆栈不空 if(p) { *top++=p;//p入堆栈 p=p->lchild; curDeep++; if(MostDeep } else { p=*--top;//p出栈 curDeep--; //if(p)printf("%d",p->data);//Visit结点 //计算个结点的度 if(p->lchild&&p->rchild)pAns->Degree2++; elseif(p->lchild||p->rchild)pAns->Degree1++; elsepAns->Degree0++; p=p->rchild; } //得到深度 pAns->Depth=MostDeep; return; } //前序递归求广度 voidPre(BiTree*T,int*woed,intdepth) { woed[depth]++; if(T->lchild)Pre(T->lchild,woed,depth+1); if(T->rchild)Pre(T->rchild,woed,depth+1); } //求广度的程序,返回值为广度 intGetTreeWidth(BiTree*root) { inti,WidthOfEachDepth[MOST_DEPTH]={0}; Pre(root,WidthOfEachDepth,0); for(i=1;i if(WidthOfEachDepth[0] WidthOfEachDepth[0]=WidthOfEachDepth[i]; returnWidthOfEachDepth[0]; } intmain() { BiTree*root; Answearans; printf("CreateTree\n"); root=CreateTree (1); printf("\nInOrder\n"); InOrder(root); printf("\nPreOrder\n"); PreOrder(root); printf("\nPostOrder\n"); PostOrder(root); InOrderDO(root,&ans); printf("\nTheMostDepthis: %d\n",ans.Depth); printf("TheMostWidthis: %d\n",GetTreeWidth(root)); printf("EachDegree(0,1,2)is: (%d,%d,%d)\n", ans.Degree0,ans.Degree1,ans.Degree2); printf("\nFreeTree\n"); FreeTree(root); return0; } 5、编写二叉树的层次遍历算法 解释说明: 二叉树结构是一种非常重要的非线性数据结构,在遍历的过程中先遍历左子数,后遍历右子树。 在先左后右的原则下,根据访问根结点的次序,最后根据二叉树的三种遍历方法,即前序遍历、中序遍历、后序遍历,进行算法的书写。 算法如下: //二叉树层次遍历算法 #include #include #defineMaxSize1000 typedefcharElemType; typedefstructnode { ElemTypedata; structnode*lchild; structnode*rchild; }BTNod
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机软件 应用 作业