1. 课程设计目的
《软件设计基础-C++》课程设计是这门课程的实践性教学环节之一,本次设计结合实际应用的要求,使课程设计既覆盖C++的知识点,又接近工程实际需要。目的是通过课程设计的综合训练,培养学生实际分析问题、解决问题的能力,以及编程和动手能力,最终目标是通过课程设计这种形式,帮助学生系统掌握C++这门课程的主要内容,养成良好的编程习惯,更好的完成教学任务。
2. 课程设计任务与要求
要求:
本次课程设计利用《软件设计基础-C++》课程中所学到的编程知识和编程技巧,完成具有一定难度和工作量的程序设计题目,帮助学生掌握编程、调试的基本技能,独立完成所布置的任务。
要求:
- 对系统进行功能需求分析
- 设计合理的数据结构和系统框架
- 界面设计美观、清楚、合理
- 编程简练,程序功能齐全,能正确运行
- 具有一定的创新性
- 说明书、流程图要清楚
- 课题完成后必须按要求提交课程设计报告
任务:
- 解决著名的约瑟夫问题:
- 解决五渔夫分鱼问题
- 解决猴子吃桃子问题
3. 课程设计说明书
⑴功能描述
- 约瑟夫问题: N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。
例如只有三个人,把他们叫做A、B、C,他们围成一圈,从A开始报数,假设报2的人被杀掉,最终胜利者是C - A,B,C,D,E五个渔夫夜间合伙捕鱼,,第二天清A先醒来,他把鱼均分五份,把多余的一条扔回湖中,便拿了自己的一份回家了,B醒来后,也把鱼均分五份,把多余的一条扔回湖中,便拿了自己的一份回家了,C,D,E也按同样方法分鱼。问5人至少捕到多少条鱼?
- 猴子吃桃子问题一只小猴子一天摘了许多桃子,第一天吃了一半,然后忍不住又吃了一个;第二天又吃了一半,再加上一个;后面每天都是这样吃。到第10天的时候,小猴子发现只有一个桃子了。问小猴子第一天共摘了多少个桃子。
⑵概要设计
模块结构图:
本次课设分为3个模块。分别是约瑟夫问题的求解、五渔夫吃鱼问题的求解、猴子吃桃问题的求解,使用模块结构图可以如下来表示:
⑶详细设计
总体流程图:
⑷代码实现
本系统总共3个子问题,详细如下:
求解约瑟夫问题
作用:根据用户输入的约瑟夫问题,进行求解。
设计思路:首先判断用户输入的数据是否合理,在合理的情况下。使用Joseph(,m,k)表示第M个人报数,每报到K时出圈,其中核心递归两层之间的公式为Joseph(m, k)=(Joseph(m-1,k)+k)%m:
代码如下:
int Joseph(int m,int k)
{
if(m<=0||k<=0)
{
cout<<"error!"<<endl;
return -1;
}else
{
if(m==1)
{
return 0;
}else
{
return ((Joseph(m-1,k)+k)%m);
}
}
}
void slove_Joseph(){
int m,k;
cout<<"请输入总人数和淘汰数字:"<<endl;
cin>>m>>k;
cout<<"胜利者为:"<<Joseph(m,k) + 1<<endl;
}
求解五渔夫分鱼问题
作用:求解五渔夫分鱼问题。
设计思路:使用递归技术解决,递归的终止条件是1,然后不断的向上递推,递推规则是fish(i)=fish(i-1)*5+1;最终解决了该问题。
代码如下:
int fish(int i){
if(i == 0)
return 1;
else{
i--;
return 5*fish(i) + 1;
}
}
求解猴子吃桃问题
作用:求解猴子吃桃问题
设计思路:使用递归技术解决,递归的终止条件是1,其他天吃的桃子都是昨天吃的桃子的数目+1的2倍.
代码如下:
int monkey(int i){
if(i == 1)
return 1;
else{
i--;
return 2*(monkey(i)+1);
}
}
4. 课程设计成果
运行结果
在运行的过程中,我们依次选择问题列表中的问题。然后进行进行求解。
5. 程序调试过程
在程序调试的过程中,我先逐步调试每一个小问题,对于约瑟夫问题,通过添加断点,我才发现深入的找出了问题的所在。调试完三个小问题之后,最终我将程序结合起来,最终程序完美的运行。
6. 设计问题的不足和改进方案
设计问题的不足:
递推有一个不足,当递推层数大于1000时,就是容易发生栈的溢出,而且效率比较低,可能会有重复计算的现象。
改进方案
针对递归情况过深的问题,可使用一个数组,来存储中间的计算结果,也就是动态规划算法,可解决栈溢出和重复计算的问题。
7. 课程设计心得
经过这次课设,进一步加深了我对递推的理解,递推实际上是一个很难的东西,经过在这次课设中的三道递推题目,也许3道题目和很少,但是当我深深的吃透了这三道题,我便对递推有了新的见解。当然在这次实验中,我也犯了不少的错误,但是在写程序中,犯错也是一种成功。最后,这次课程设计让我对递推有了更深的理解。
8. 参考文献
- 啊哈磊.啊哈!算法.北京:人民邮电出版社社,2014
- 啊哈磊 李嘉浩.算法神探.北京:电子工业出版社,2017.2
- 秋叶拓哉 岩田阳一 北川宜稔.挑战程序设计竞赛(第2版).北京:人民邮电出版社,2013.7
- [[美]Jesse Liberty](https://book.douban.com/search/Jesse Liberty)/[[美] Siddhartha Rao](https://book.douban.com/search/Siddhartha Rao)/[[美] Bradley Jones](https://book.douban.com/search/Bradley Jones).21天学通C++.北京:人民邮电出版社,2009.8
iddhartha Rao](https://book.douban.com/search/Siddhartha Rao)/[[美] Bradley Jones](https://book.douban.com/search/Bradley Jones).21天学通C++.北京:人民邮电出版社,2009.8 - 张德富.算法设计与分析.北京:国防工业出版社,2009.1