




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
空瓶分酒问题一 课题名称空瓶分酒问题二课题内容和要求 设计说明及要求:某人有12品脱啤酒一瓶(品脱是英容量单位,1品脱=0.568升),想从中准确地倒出6品脱啤酒。但是他没有6品脱的容器,只有一个8品脱和一个5品脱的容器。请问怎样利用这两个容器和这瓶啤酒,使8品脱的容器中恰好装好了6品脱啤酒?要求使用高级程序设计语言编程实现这一过程,给出所有可能的解法。例如如下给出的是其中的一种解法: 12, 8, 512 ,0, 04, 8, 04, 3, 59 ,3, 09, 0, 31 ,8, 31 ,6, 56 ,6, 0。三需求分析各函数的功能:(1) 函数原型:int main()功能:作为主调函数处理,调用函数f。入口参数:无返回值:整型(2) 函数原型:freopen(1.txt, w, stdout);功能:实现重定向,将标准输出流(默认为屏幕)文件定向到由1.txt指定的文件中,在本程序中就是将程序运行的结果保存在1.txt中。入口参数:文件名为1.txt,”w”代表写入到文件,stdout 代表写入到文件,和第二个参数 w 连用。返回值:返回值:成功,则返回一个path所指定文件的指针;失败,返回NULL。本程序中没使用它的返回值,这是惯常的做法。(3) 函数原型:void f(int a, int b, int c, int t)功能:用户自定义的函数,用于解决空瓶分酒问题。入口参数:3个整型参数a,b,c,分别代表12品脱的啤酒,8品脱的容器,5品脱的容器。返回值:void类型四概要设计五. 详细设计#include int cap3 = 12, 8, 5;/ 容量int beer1003 = 12;/ 每步装了多少啤酒int cnt;/ 解法计数char v1396;/ 记录是否已访问void f(int a, int b, int c, int t)/ 把a倒入b中,t是步数int i;if (beerta & beertb != capb) /如果a不为空或b不满if (beerta + beertb capb)beert + 1b = capb;beert + 1a = beerta + beertb - capb;elsebeert + 1a = 0;beert + 1b = beerta + beertb;beert + 1c = beertc;if (vbeert + 10beert + 11beert + 12) / 判断/是否循环return;if (beert + 11 = 6) / 完成printf(-%d-n, +cnt);for (i = 0; i = t + 1; +i)printf(%dt%dt%dn,beeri0,beeri1,beeri2);return;vbeert + 10beert + 11beert + 12 = 1;f(a, c, b, t + 1);f(c, a, b, t + 1);f(b, c, a, t + 1);f(c, b, a, t + 1);vbeert + 10beert + 11beert + 12 = 0;int main()/freopen(1.txt, w, stdout); / 重定向输出到文件v1200 = 1;f(0, 1, 2, 0);f(0, 2, 1, 0);return 0;六测试数据及结果分析(1) 1200 705 750 255 282 1002 1020 525 570 075 084 804 840 345 381 1101 1110 615 660(2)1200 705 750 255 282 1002 1020 525 570 075 084 804 840 345 381 1101 1110 480 435 930 903 183 165(3) 1200 705 750 255 282 1002 1020 525 570 075 084 804 840 480 435 930 903 183 165(4) 1200 705 750 255 282 1002 1020 525 570 480 084 804 840 345 381 11011110 615 660(5) 1200 705 750 255 282 1002 1020 525 570 480 435 075 084 804 840 345 381 11011110 615 660(6) 1200 705 750 255 282 1002 1020 525 570 480 435 930 903 183 084 804 840 345 381 11011110 615 660(7) 1200 705 750 255 282 1002 1020 525 570 480 435 930 903 183 165(8) 1200 705 750 255 282 1002 1020 480 084 804 840 345 381 11011110 615 660(9) 1200 705 750 255 282 1002 1020 480 435 075 084 804 840 345 381 11011110 615 660(10)1200 705 750 255 282 1002 1020 480 435 930 903 183 084 804 840 345 381 1101 1110 615 660(11)1200 705 750 255 282 1002 1020 480 435 930 903 183 165(12)1200 705 750 480 084 804 840 345 381 1101 1110 615 660(13)1200 705 750 480 435 075 570 525 1020 1002 282 084 804 840 345 381 1101 1110 615 660(14)1200 705 750 480 435 075 084 804 840 345 381 1101 1110 615 660(15)1200 705 750 480 435 930 903 183 084 804 840 345 381 1101 1110 615 660程序的运行结果如上所示,数据显示,对于本例的问题,共有15种的问题解决方法。七 调试过程中的问题刚开始的时候,使用的是C语言所提供的文件操作的库函数对程序的执行结果进行读取和显示,但是由于使用文件指针要特别注意判断文件是否到尾,会经常发生越界情况,使保存和读取发生错误,影响数据。后来,作了改进,使用了freopen函数,重定向输出到文件,实现简单,且不出错。八 课程设计总结关于freopen:(1) 当我们求解acm题目时,通常在设计好算法和程序后,要在调试环境(例如VC等)中运行程序,输入测试数据,当能得到正确运行结果后,才将程序提交到oj中。但由于调试往往不能一次成功,每次运行时,都要重新输入一遍测试数据,对于有大量输入数据的题目,输入数据需要花费大量时间。 使用freopen函数可以解决测试数据输入问题,避免重复输入,不失为一种简单而有效的解决方法。(2) 可以不使用重定向,仍然在控制台查看输出。(3) 程序调试成功后,提交到oj时不要忘记把与重定向有关的语句删除。关于程序设计过程:首先要了解问题的基本要求,即输入、输出,怎样完成从输入到输出。在这个过程中,可确定所需的变量、数组、函数,然后确定处理过程算法。最后,用程序实现。关于程序调试:(1)人工检查,即静态检查。在写好一个程序以后,不要匆匆忙忙上机,而应对程序进行人工检查。这一步十分重要,它能发现程序设计人员由于疏忽而造成的多数错误。这一步往往容易被人忽视,总希望把一切都推给计算机去做,但这样会多占用机器时间,作为一个程序人员应当养成严谨的作风,每一步都要严格把关,不把问题留给后面的工序。为了更有效地进行人工检查,所编的程序应力求做到以下几点:应当采用结构化程序方法编程,以增加可读性;尽可能多加注释,以帮助理解每段程序的作用;在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。各函数之间除用参数传递数据外,尽量少出现耦合关系,这样便于分别检查和处理。(2)人工检查无误后,再上机调试。通过上机发现错误称为动态检查。在编译时会给出语法错误的信息,调试时可以根据提示信息具体找出程序中出错之处并改正。应当注意的是有时提示出错的地方并不是真正出错的位置,如果在提示出错的行找不到错误的话应当到上一行再找。有时提示出错的类型并非绝对准确,由于出错的情况繁多且各种错误互有关联,因此要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。如果系统提示的出错信息很多,应当从上到下逐一改正。有时显示出一大片出错信息往往使人感到问题严重,无从下手。其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息。这时只要加上一个变量定义,就所有错误都消除了。(3)改正语法错误(包括“错误(error)”和“警告(warning)”)后,程序经过连接(link)就得到可执行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。应当对运行结果作分析,看它是否符合要求。(4)结果不对,大多属于逻辑错误。对这类错误往往需要仔细检查和分析才能发现。可以采用以下办法:1.将程序与流程图仔细对照,如果流程图是正确的,程序写错了,是很容易发现的。例如,复合语句忘记写花括弧,只要一对照流程图就能很快发现。2.如果实在找不到错误,可以采用“分段检查”的方法。在程序不同的位置设几个printf函数语句,输出有关变量的值,逐段往下检查。直到找到在某一段中数据不对为止。这时就已经把错误局限在这一段中了。不断减小“查错区”,就能发现错误所在。3.也可以用“条件编译”命令进行程序调试(在程序调试阶段,若干printf函数语句就要进行编译并执行。当调试完毕,这些语句不用再编译了,也不再被执行了)。这种方法可以不必一一去掉printf函数语句,以提高效率。4.如果在程序中没有发现问题,就要检查流程图有无错误,即算法有无问题。如有则改正之,接着修改程序。5.有的系统还提供debug(调试)工具,跟踪程序并给出相应信息,使用更为方便。总之,程序调试是一项细致
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年农村合作建房合同协议范本
- 2025年提取公积金租房合同范本
- 2025解除合同协议书范本参考
- 2025年关于铁路货物运输的合同范本
- 2025年城市土地开发与住宅销售贷款合同(范本)模板
- 2025担保公司的贷款合同协议
- 2025规范土地流转协议
- 2025租房合同终止的模板
- 搭配不当之修饰不当课件
- 2025市场营销商品委托代理合同范本
- 2025至2030年中国PA10T行业市场竞争态势及未来前景分析报告
- 催收新人培训管理制度
- DZ/T 0089-1993地质钻探用钻塔技术条件
- CJ/T 328-2010球墨铸铁复合树脂水箅
- 2025-2030中国铁路道岔行业市场现状供需分析及投资评估规划分析研究报告
- 特种设备安全法培训课件
- 2025-2030年中国快速消费品行业市场深度调研及竞争格局与投资研究报告
- 邯郸介绍课件
- 2025至2030中国硼酸行业发展方向及供需趋势研究报告
- DB11T 634-2025 建筑物在用电子系统雷电防护装置检查规范
- 电力工程施工安全风险管理措施
评论
0/150
提交评论