通信与信息工程学院软件实验报告
3)当输入的n为自然数且比较小,本次输入“20”,其C程序运行结果如下:
4)当输入的n为自然数且比较大,本次输入“500”,其C程序运行结果如下:
(3)实验结果分析。
本次实验程序基本实现了实验要求,并且在人机交互界面上做了比较大的改善,使得程序的人际交互界面更加友好。同时,采用了较为复杂的算法来实现了大数的阶乘,有效的避免了传统算法计算阶乘时计算机内部存储数据会发生溢出的问题,使程序具有更高的可靠性和更强的鲁棒性。
26
通信与信息工程学院软件实验报告
题目四:P006H
实验要求:
输入任意四个整数(0到10),运算符只有加减乘除,还有括号.每个数只能且必须用一次。要求判断这些表达的结果中是否有24。如果有,输出计算表达式:如输入4,6,1,1 输出 4*6*1*1 =24 (允许有括号)。
1、问题分析与方案设计。
24点游戏是我们在日常的生活中经常碰到的游戏,它的基本规则是输入四个自然数(本次实验要求是从0~10的自然数),然后运用加、减、乘、除四种运算方法配以一定数量的括号,使得输入的四个数的运算结果为24。本次实验要求输入的四个数每个数都参与运算并且都只能用一次。
本程序算法用到的基本思想是回溯,树的深度为最深为4,树的判断分支为 加减乘除,对不满足条件的解进行剪枝(即当前结果>=24),当到达递归边界(即树的深度为4时)时,即判断当前的结果是否符合条件(=24),符合即找到解,否则继续进行。
程序实现的基本思路是把这个问题分解成了两个子问题,首先运用四层“for”循环语句对输入的四个数字进行无重复全排列,然后将其按序存放在一维数组中;其次再使用三层“for”循环语句对四则运算情况进行从头到尾的穷举,最后再将每种情况下的四个数字和三个运算符进行全排列,再加以括号控制运算的顺序,如果运算结果等于24,则输出,否则则不输出。注意到如果运算结果为-24的话,只需要把中间“-”两边的数据进行调换就可以得到它的相反数24。同理,如果结果为1/24,则将“/”两边的数据调换,如果结果为-1/24,则需要将“-”和“/”运算符两边的数字进行对调。
程序的运行结构基本分为四大模块,即输入数据模块、数据运行排序模块、加减乘除运算模块和结果输出模块。其中,输入模块主要是让用户输入需要计算的数据,如果用户输入的数据不符合程序要求,则系统会提示用户是否重新输入数据,直到用户输入正确地符合要求的数据为止;数据排序模块主要是让程序对输入的四个数据进行全排列,并且将排列的数据存放在一位数组中,等待执行后面的运算;加减乘除模块式的作用也是进行全排列,与第二步不同的是,加减乘
27
通信与信息工程学院软件实验报告
除的符号进行排列时允许出现两个或三个相同的符号,排列后与第二步的四个数字进行组合计算;结果输出模块的作用是输出符合题目要求的结果。
程序的算法思想虽然比较简单清晰,但是实现起来有一定的难度,因为程序涉及的循环嵌套语句比较多,而且需要定义的变量也比较多,所以需要程序员有较强的编程能力。程序中使用到了许多输出格式控制符号,这些符号的准确运用使得最终的输出结果更加清晰明快。
为了使程序具有良好的互动界面,程序还设计了简单的人际交互界面。在实现界面的算法时,运用了C语言中的“goto”语句,使得实现起来避免了主程序和子程序之间的相互调用,使程序更加简洁。
具体的流程图如下:
N
正确否 输入4个数字 开始 Y
继续? 结果输出 运算符号 全排列 数字全排列 Y
N 结束 28
通信与信息工程学院软件实验报告
2、编程实现。
程序的关键源代码如下: (1)定义加减乘除运算的子程序: double fun(double a1,double a2,int b) {
switch(b) {
case 0:return (a1+a2); case 1:return (a1-a2);
case 2:return (a1*a2); case 3:return (a1/a2); default:return 0; } }
(2)对数据、符号排列及运算的关键代码: if(flg) {
flg=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++) if(j!=i) {for(k=0;k<4;k++) if(k!=i&&k!=j) {for(l=0;l<4;l++) if(l!=i&&l!=j&&l!=k) {for(n=0;n<4;n++) for(m=0;m<4;m++) for(r=0;r<4;r++) {tem1=fun(num[i],num[j],n);
tem2=fun(tem1,num[k],m); tem3=fun(tem2,num[l],r); if(tem3==24.0)
{printf(\ign[r],save[l]);q=1;} else if(tem3==-24.0) {if(sign[m]=='-')
29
通信与信息工程学院软件实验报告
{printf(\ign[r],save[l]);q=2;}} else if(tem3==1.0/24.0) {if(sign[r]=='/')
{printf(\gn[m],save[k]);q=3;}} else if(tem3==-1.0/24.0) {if(sign[m]=='-'&&sign[r]=='/')
{printf(\ign[n],save[j]);q=4;}}
else {tem1=fun(num[i],num[j],n); tem2=fun(num[k],num[l],r); tem3=fun(tem1,tem2,m); if(tem3==24.0)
{printf(\],save[l]);q=5;} } } } } }
}
3、测试数据、测试结果、结果分析。
(1)欢迎界面:
(2)当输入的数据不符合要求时:
1)当输入的数据带有小数,本次输入“1.2 3 4 5 ”,其C程序运行结果如下:
30