1.算法设计思路及源代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<fstream.h>
#include<iostream.h>
double count[4];//输入的四个数字
char c1,c2,c3;//三个符号
int t=0;//用来判断四个数字是否可以经过四则运算得到24
double reckon(double a,char c,double b)//两个数之间的运算
{
switch(c)
{
case '+':return a+b;break;
case '-':return a-b;break;
case '*':return a*b;break;
case '/':return a/b;break;
}
}
void all(double a,double b,double c,double d,int flag)//生成所有情况
{
for(int i=0;i<4;i++)//c1的排列情况
{
if(i==0) c1='+';
if(i==1) c1='-';
if(i==2) c1='*';
if(i==3) c1='/';
for(int j=0;j<4;j++)//c2的排列情况
{
if(j==0) c2='+';
if(j==1) c2='-';
if(j==2) c2='*';
if(j==3) c2='/';
for(int k=0;k<4;k++)//c3的排列情况
{
if(k==0) c3='+';
if(k==1) c3='-';
if(k==2) c3='*';
if(k==3) c3='/';
//用五种情况来区分数字的结合顺序
if(reckon(reckon(reckon(a,c1,b),c2,c),c3,d)==24.0)
{if(flag==1)
{printf("(((%.1lf%c%.1lf)%c%.1lf)%c%.1lf)\n",a,c1,b,c2,c,c3,d); t++;}
else t++;
}
if(reckon(reckon(a,c1,b),c2,reckon(c,c3,d))==24.0)
{
if(flag==1)
{ printf("((%.1lf%c%.1lf)%c(%.1lf%c%.1lf))\n",a,c1,b,c2,c,c3,d);t++;}
}
if(reckon(reckon(a,c1,reckon(b,c2,c)),c3,d)==24.0)
{
if(flag==1)
{printf("((%.1lf%c(%.1lf%c%.1lf))%c%.1lf)\n",a,c1,b,c2,c,c3,d);t++;}
else
t++;
}
if(reckon(a,c1,reckon(reckon(b,c2,c),c3,d))==24.0)
{
if(flag==1){printf("(%.1lf%c((%.1lf%c%.1lf)%c%.1lf))\n",a,c1,b,c2,c,c3,d);t++;}
else t++;
}
if(reckon(a,c1,reckon(b,c2,reckon(c,c3,d)))==24.0)
{
if(flag==1)
{printf("(%.1lf%c(%.1lf%c(%.1lf%c%.1lf)))\n",a,c1,b,c2,c,c3,d);t++;}
else
t++;
}
}
}
}
}
void main()
{
int grade=6;//初始成绩为6
int flag=0;//当用户输入答案之前,判断四个数是否可以得到24
while(grade>=0)//当成绩大于零时游戏一直进行下去
{
srand((double)time(NULL));
for( int i=0;i<4;i++)//随机生成四个数
{
count[i]=rand()%13+1.0;
}
all(count[0],count[1],count[2],count[3],flag);
if(t==0)
{
srand((double)time(NULL));
for( i=0;i<4;i++)//随机生成四个数
{
count[i]=rand()%13+1.0;
}
}
printf("随机生成的四个数为:\n");
printf("%.1lf,%.1lf,%.1lf,%.1lf\n",count[0],count[1],count[2],count[3]);
printf("请写出满足条件的表达式\n");
cin>>count[0]>>c1>>count[1]>>c2>>count[2]>>c3>>count[3];
if(reckon(reckon(reckon(count[0],c1,count[1]),c2,count[2]),c3,count[3])==24.0)//默认用户输入的表达式的运算顺序自左向右
{printf("答案正确\n");
flag=0;
all(count[0],count[1],count[2],count[3],flag);
grade=grade+2;
}
else
{ printf("答案错误\n");grade=grade-2;
printf("正确答案有以下几种:\n");
flag=1;
all(count[0],count[1],count[2],count[3],flag);
}
ofstream outfile("24.txt",ios::out);
outfile<<"成绩:"<<grade<<endl;//将成绩记录在文件里
}
printf("游戏结束\n");
}
2.1 测试
(1)输入正确答案时:
(2)输入错误答案时:
(3)测试游戏的正常运行
(4)测试文件读写
3.调试
4.总结
对四个数进行四则运算,如果一次性整体得出结果,过程是会很繁琐的,可以每次两个数的计算,之前两个数进行运算得出的结果再与另一个数进行运算。
我使用了三个嵌套的for语句来实现所有情况,这还是有弊端的,会有重复的情况,在编写的过程中,我因为switch语句无法继续编下去,最后我用if来代替switch语句的作用,至于为什么用switch语句程序无法运行下去,这个原因我还无从得知,不过这也为我以后解决问题积攒了经验。
一开始我想用栈来实现四则运算,但是这种结构不好实现表达式的输出,但是栈相比我现在使用的方法有更大的优点,用栈实现直接就可以将运算符号的优先性包括进去,无需分情况来计算。