24点

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语句程序无法运行下去,这个原因我还无从得知,不过这也为我以后解决问题积攒了经验。
一开始我想用栈来实现四则运算,但是这种结构不好实现表达式的输出,但是栈相比我现在使用的方法有更大的优点,用栈实现直接就可以将运算符号的优先性包括进去,无需分情况来计算。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值