狼羊白菜实验报告.docx
- 文档编号:12919391
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:22
- 大小:297.55KB
狼羊白菜实验报告.docx
《狼羊白菜实验报告.docx》由会员分享,可在线阅读,更多相关《狼羊白菜实验报告.docx(22页珍藏版)》请在冰点文库上搜索。
狼羊白菜实验报告
南京邮电大学通达学院
程序设计(上机)报告
题目:
R004M,P005H
专业网络工程
学生姓名
班级学号
指导教师
日期
评分细则
评分项
优秀
良好
中等
及格
不及格
遵守机房规章制度
上机表现
学习态度
基础知识水平
程序设计能力
课题功能实现情况
算法设计合理性
用户界面友好性
报告书写认真程度
报告内容完整性
文字表达清楚程度
问题回答准确性
评分等级
教师签名:
年月日
备注
注:
评分等级分为五种:
优秀、良好、中等、及格、不及格
狼羊白菜过河程序实验报告
1.问题描述
一个人带着一只羊,一条狼和一颗白菜想过河,假设他每次只能带一只羊,或者一条狼,或者一颗白菜过河,并限定人不在场时,狼和羊,或羊和白菜不能单独在一起,试编写程序求出他带一只羊,一条狼和一颗白菜过河的办法。
2.结构图
三、结构设计
1、狼和羊、羊和白菜不能单独在一起,涉及对象较多,而且运算步骤方法较为复杂,要用程序语言实现,需要将具体实例数字化。
针对实现整个过程需要多步,不同步骤中各个事物所处位置不同的情况,可定义一个二维数组或者结构体来实现对四个对象狼、羊、白菜和一个人的表示。
对于岸的两侧可以用0或者1来表示,以实现在程序设计中的简便性。
2、对狼羊白菜的过河步骤,没有顺序的约束,因此需要给各个事物依次进行编号,然后依次尝试,若成功,进行下一步,使用循环或者递归算法进行程序
3、程序使用递归算法,为了方便将各个实例数字化。
定义二维数组inta[M][4]存储每一步中各个对象所处的位置,用0-3分别表示二维数组的一维下标。
具体对应为:
wolf-0goat-1cabbage-2people-3
将本岸和对岸数字化,其对应为:
本(东)岸-0对(西)岸-1
具体对应实例比如在第3步之后狼在本岸,羊在对岸,白菜在本岸,农夫在对岸,则其存储结果为:
a[3][0]a[3][1]a[3][2]a[3][3]
0101
最初存储状态为:
a[0][0]a[0][1]a[0][2]a[0][3]
0000
成功渡河之后,二维数组存储应为:
a[istep][0]a[istep][1]a[istep][2]a[istep][3]
1111
因此a[iStep][0]+a[iStep][1]+a[iStep][2]+a[iStep][3]==4。
题目要求狼和羊、羊和白菜不能在一起,即出现以下情况:
a[iStep][1]!
=a[iStep][3]&&(a[iStep][2]==a[iStep][1]||a[iStep][0]==a[iStep][1])则出现错误,应返回操作。
同时定义一维数组b[M]来存储每一步中人是如何过河的。
设计程序中实现递归操作部分的核心程序为:
for(i=-1;i<=2;i++)
{b[iStep]=i;
memcpy(a[iStep+1],a[iStep],16);a[iStep+1][3]=1-a[iStep+1][3];
if(i==-1)
{
search(iStep+1);
}
elseif(a[iStep][i]==a[iStep][3])
{a[iStep+1][i]=a[iStep+1][3];
search(iStep+1);
}
}
每次循环从-1到2依次代表渡河时为一人、带狼、带羊、带白菜通过,利用语句“b[iStep]=i”分别记录每一步中渡河方式,“a[iStep+1][i]=a[iStep+1][3]”即利用赋值方式使狼或羊或白菜与人一同到对岸或者回到本岸。
若渡河成功,则依次输出渡河方式。
“i<=2”即为操作的限制,当若i=2时仍无符合条件的方式,则渡河失败。
在递归的过程中每进行一步都需要判断是否需要继续进行此次操作,具体的判断为:
(1)若该步骤能使各值均为1,则渡河成功,输出结果。
if(a[iStep][0]+a[iStep][1]+a[iStep][2]+a[iStep][3]==4){……return}
(2)若该步与以前步骤相同,返回操作。
if(memcmp(a[i],a[iStep],16)==0){return;}
(3)若羊和人不在一块而狼和羊或者羊和白菜在一块,则返回操作。
if(a[iStep][1]!
=a[iStep][3]&&(a[iStep][2]==a[iStep][1]||a[iStep][0]==a[iStep][1])){return;}
四、处理流程图:
Y
Y
N
Y
N
Y
N
N
Y
5、源程序
#include
#include
#include
#defineM10
inta[M][4];
intb[M];
char*name[]={"","andwolf","andgoat","andcabbage"};
voidsearch(intiStep)
{
inti;
if(a[iStep][0]+a[iStep][1]+a[iStep][2]+a[iStep][3]==4)
{for(i=0;i<=iStep;i++)
{printf("本岸:
");
if(a[i][0]==0)
printf("wolf");
if(a[i][1]==0)
printf("goat");
if(a[i][2]==0)
printf("cabbage");
if(a[i][3]==0)
printf("people");
if(a[i][0]&&a[i][1]&&a[i][2]&&a[i][3])
printf("none");
printf("");
printf("对岸:
");
if(a[i][0]==1)
printf("wolf");
if(a[i][1]==1)
printf("goat");
if(a[i][2]==1)
printf("cabbage");
if(a[i][3]==1)
printf("people");
if(!
(a[i][0]||a[i][1]||a[i][2]||a[i][3]))printf("none");
printf("\n\n\n");
if(i printf("the%dtime\n",i+1); if(i>0&&i {if(a[i][3]==0) {printf("------>people"); printf("%s\n",name[b[i]+1]); } else{printf("<-----people"); printf("%s\n",name[b[i]+1]); } } } printf("\n\n\n\n"); return; } for(i=0;i {if(memcmp(a[i],a[iStep],20)==0) {return; } } if(a[iStep][1]! =a[iStep][3]&&(a[iStep][2]==a[iStep][1]||a[iStep][0]==a[iStep][1])) { return; } for(i=-1;i<=2;i++) { b[iStep]=i; memcpy(a[iStep+1],a[iStep],sizeof(a[iStep+1])); a[iStep+1][3]=1-a[iStep+1][3]; if(i==-1) { search(iStep+1); } elseif(a[iStep][i]==a[iStep][3]) { a[iStep+1][i]=a[iStep+1][3]; search(iStep+1); } } } intmain() {printf("\n\n人过河问题解决方案如下: \n\n\n"); search(0); return0; } 6、程序测试记录 第一次: Wolfgoatcabbbagepeoplenone The1time Wolfcabbagegoatpeople The2time Wolfcabbagepeoplegoat The3time Cabbagewolfgoatpeople The4time Goatcabbagepeoplewolf The5time Goatwolfcabbagepeople ............... 第二次: Wolfgoatcabbbagepeoplenone The1time Wolfcabbagegoatpeople The2time <------people Wolfcabbagepeoplegoat The3time -------->peopleandwolf Cabbagewolfgoatpeople The4time <-------peopleandgoat Goatcabbagepeoplewolf The5time ------>peopleandcabbage Goatwolfcabbagepeople The6time <-------peopleandgoat Wolfgoatpeoplecabbage The7time -------->peopleandwolf Goatwolfcabbagepeople The8time <-------people Goatpeoplewolfcabbage The9time --------->peopleandgoat Nonewolfgoatcabbagepeople Pressanykeytocontinue 第三次: 本岸: Wolfgoatcabbbagepeople对岸: none The1time 本岸: Wolfcabbage对岸: goatpeople The2time <------people 本岸: Wolfcabbagepeople对岸: goat The3time -------->peopleandwolf 本岸: Cabbage对岸: wolfgoatpeople The4time <-------peopleandgoat 本岸: Goatcabbagepeople对岸: wolf The5time ------>peopleandcabbage 本岸: Goat对岸: wolfcabbagepeople The6time <-------peopleandgoat 本岸: Wolfgoatpeople对岸: cabbage The7time -------->peopleandwolf 本岸: Goat对岸: wolfcabbagepeople The8time <-------people 本岸: Goatpeople对岸: wolfcabbage The9time --------->peopleandgoat 本岸: None对岸: wolfgoatcabbagepeople Pressanykeytocontinue 第四次: 人过河问题解决方案如下: 本岸: Wolfgoatcabbbagepeople对岸: none The1time 本岸: Wolfcabbage对岸: goatpeople The2time <------people 本岸: Wolfcabbagepeople对岸: goat The3time -------->peopleandwolf 本岸: Cabbage对岸: wolfgoatpeople The4time <-------peopleandgoat 本岸: Goatcabbagepeople对岸: wolf The5time ------>peopleandcabbage 本岸: Goat对岸: wolfcabbagepeople The6time <------people 本岸: Goatpeople对岸: wolfcabbage The7time -------->peopleandgoat 本岸: None对岸: wolfgoatcabbagepeople 本岸: Wolfgoatcabbbagepeople对岸: none The1time 本岸: Wolfcabbage对岸: goatpeople The2time <------people 本岸: Wolfcabbagepeople对岸: goat The3time -------->peopleandcabbage 本岸: wolf对岸: goatcabbagepeople The4time <-------peopleandgoat 本岸: wolfgoatpeople对岸: cabbagae The5time ------>peopleandwolf 本岸: Goat对岸: wolfcabbagepeople The6time <------people 本岸: Goatpeople对岸: wolfcabbage The7time -------->peopleandgoat 本岸: None对岸: wolfgoatcabbagepeople Pressanykeytocontinue 七、相关运行界面 八、调试记录 (1)在最初的时候没有printf("本岸: ");printf("对岸: ");使得输出的程序看起来不清晰易懂,于是进行修改调试。 (2)if(i>0&&i }else{printf("<-----people");printf("%s\n",name[b[i]+1])}}时没有结果的输出,程序有问题,在同学的帮助之下得以修改。 (3)当if(memcmp(a[i],a[iStep],20)==0){return;}此处的程序中,数字大于等于十七时会出现M-1个步骤,其中的M-9个步骤是人来回过河,做的无用功。 当数字在13~16之间时会出现两种有效的步骤,并且其中无无用功的过河,当小于13时则不能出现程序的调试结果。 (4)对#defineM10进行宏定义时要确定好M的大小范围,以免做无用功,经调试得出如图结果。 最终是两种过河的有效方法,但是调试的结果不那么的美观进行了优化界面。 加上了printf("\n\n人过河问题解决方案如下: \n\n\n");得出一下较优化的程序运行界面。 九、课程设计总结: 通过本次的课程程序设计,应用VC++6.0软件进行程序的调试验证,把学习过的C语言知识进行了实践,对知识还进行了进一步的掌握,同时加深了对VC++6.0软件的熟练程度。 对于设计这个狼羊白菜人过河的程序的设计,运用了if选择语句和递归调用的程序结构。 通过一次一次的调试使得结果更加的清晰明了,并且运行的界面美观化,具体的程序细节还要精心的琢磨推敲,通过上机的运行对知识有了多角度的理解与体会,两周的忙碌努力还有一定的收获,会更加的努力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 白菜 实验 报告