C课程设计分油问题由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c课程设计分油问题”。
《程序设计课程设计》报告
设计题目:分油问题
分油问题。现有3斤、7斤、10斤的油桶三个,前2个是空桶,10斤的油桶装满了油,现要求借助这些桶分出二个5斤的油于油桶中,问:
1、应如何倒法?
2、将油从一个桶倒入另一个桶称为一次操作,如果限制倒油的总次数为N,程序怎么编写?
3、能否找出所需的最少次数?
注意倒油的规则:
1、只能使用这些油桶;
2、倒油时,要么把自己倒空,要么把目标桶倒满。
一、设计任务
写明设计题目的具体任务内容及要求。
二、设计目的本课程设计主要训练学生在C/C++语言迭代递归方面应用能力。
三、功能描述
简要给出程序的几个模块功能的文字说明及总体结构图。
四、总体设计
1、功能模块设计
具体介绍主函数及各个模块的构成及功能
2、数据结构设计
具体介绍本程序中关键的数据结构
3、函数功能描述
对自定义函数给出返值形式的简介。
五、程序实现
1、源码分析
对预处理、主函数、主菜单、各模块的程序代码列出,适当给与行尾注释 #include using namespace std;
#define Max 100
struct Total { int Array[Max];//倒油路径
int number;//倒油次数
};
int values[Max];//状态数组
int Species[Max][Max];int N=0;int M=0;Total Poiblity[Max];
int min(int a,int b)//比较两者大小并返回最小值
{ if(a>b)return b;else return a;}
int ContainN(int n,int i)//判断values数组中是否含有n { for(int j=0;j
return 1;} return 0;}
void Strcpy(int a[],int b[],int n)//拷贝a到b { for(int i=0;i
void f(int a,int b,int c,int d[],int M)//获得倒油过程
{ int x;int e[Max];int n=a*100+b*10+c;if(n==55){
for(int j=0;j
Species[N][j]=d[j];//拷贝
N++;} else if(ContainN(n,M))//遇到有相同状态就返回重新选择
return;else {
桶
values[M]=n;d[M]=n;M++;Strcpy(d,e,M);if(a
//a桶容量为3,b桶容量为7,c桶容量为10 { if(b>0)//若a,b桶内油体积大于3,则将b桶内油倒出使a桶满
{
x=min(3-a,b);//若a,b桶内油体积小于3,则将b桶内油全部倒出,倒进a桶
f(a+x,b-x,c,e,M);} if(c>0)//若a,c桶内油体积大于3,则将b桶内油倒出使a桶满
{
x=min(3-a,c);//若a,c桶内油体积小于3,则将b桶内油全部倒出,倒进a桶
f(a+x,b,c-x,e,M);} } if(b0)//若a,b桶内油体积大于7,则将a桶内油倒出使b桶满
{
x=min(7-b,a);//若a,b桶内油体积小于7,则将a桶内油全部倒出,倒进b桶
f(a-x,b+x,c,e,M);} if(c>0)//若b,c桶内油体积大于7,则将c桶内油倒出使b桶满
{
x=min(7-b,c);//若b,c桶内油体积小于7,则将c桶内油全部倒出,倒进b桶
f(a,b+x,c-x,e,M);
} } if(c0)//若a,c桶内油体积大于10,则将a桶内油倒出使c桶满
{ x=min(10-c,a);//若a,c桶内油体积小于10,则将a桶内油全部倒出,倒进c桶
f(a-x,b,c+x,e,M);} if(b>0)//若b,c桶内油体积大于10,则将b桶内油倒出使c桶满
{ x=min(10-c,b);//若b,c桶内油体积小于10,则将b桶内油全部倒出,倒进c
} } f(a,b-x,c+x,e,M);
} }
void DispAll()//输出各种可能的情况
{ int i;for(i=0;i
{
Poiblity[M].Array[j]=Species[i][j];
cout
j++;} Poiblity[M].number=j;M++;} }
int Disp(int a)//符合限制条件的输出
{ int m=0;cout
cout
for(int j=0;j
cout
m++;} } if(!m)cout
int LeastNumber()//求倒油次数最少的步骤
{ int a[M];for(int i=0;i
int Min=Poiblity[0].number;for(int m=1;m
Min=Poiblity[m].number;} return Min;}
void DispLeast()//最少倒油次数的输出 { int m=LeastNumber();cout
for(int j=0;j
cout
p[i]=0;f(0,0,10,p,0);cout>a;Disp(a);DispLeast();}
2、运行结果及界面介绍
设计输入数据,给出输出结果及界面反映