系统功能模块结构图
运算符号
计算方法
计算结果
数据结构设计及用法说明
按照相应的序号进行输入即可
程序结构
各模块的功能
运算符号
四个运算符号
四个运算符号所对应的运算法则
计算方法
根据括号的不用位置,有五种不同的计算方法
计算结果
判断结果与24是否相等
试验结果
计算出来的结果不等于24 解决办法:往上看代码,最后发现是计算方法里的四个数字中有两个写重复了。。。。
第二次输入cnt会叠加 解决办法:每一次输入后都重新给cnt赋值 为0
调试与测试
开始时输入1,不管能不能计算出24,都可以再输入想要的序号,这次输入2,可以随机输入4个合法的数字,同样 不管能不能计算出24,都可以再输入想要的需要,这次输入3,就是退出程序了。
总结
我认为这个程序最难的点是那五种计算方法,只要列出了计算方法,然后判断四个数字能不能等于24,按照自己的想法设计出程序的界面就行了。
有一个我犯的低级错误!!!!就是输出的四个数字i j k l ,放到计算方法中时,数字要输正确,一个数字只能用一次!!!! 不然就这么个 低级错误 找了好久好久
还有 四个数字要用浮点型,因为里面涉及 除法
源代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int cnt=0; //有几种计算方法 等于零:无解
char op[4] = {'+' , '-' , '*' , '/'};
//运算符号(operation symbol) 加减乘除 分别对应 0123
float jisuan( float x, float y, int op)
{
if(op == 0)
return x + y;
if(op == 1)
return x - y;
if(op == 2)
return x * y;
if(op == 3)
return x / y;
}
//输入对应运算符号的返回值
/*
括号括不同地方 运算顺序就不一样 有五种计算方法(calculate method)
方法一 ( (aob)oc )od
方法二 ( ao(boc) )od
方法三 (aob)o(cod)
方法四 ao( bo(cod) )
方法五 ao( (boc)od )
*/
float cm1(float a,float b,float c,float d,int o1,int o2,int o3)//对应表达式((aob)oc)od
{
float c1,c2,c3;
c1=jisuan(a,b,o1);
c2=jisuan(c1,c,o2);
c3=jisuan(c2,d,o3);
return c3;
}
float cm2(float a,float b,float c,float d,int o1,int o2,int o3)//对应表达式(aob)o(cod)
{
float c1,c2,c3;
c1=jisuan(a,b,o1);
c2=jisuan(c,d,o3);
c3=jisuan(c1,c2,o2);
return c3;
}
float cm3(float a,float b,float c,float d,int o1,int o2,int o3)//对应表达式(ao(boc))od
{
float c1,c2,c3;
c1=jisuan(b,c,o2);
c2=jisuan(a,c1,o1);
c3=jisuan(c2,d,o3);
return c3;
}
float cm4(float a,float b,float c,float d,int o1,int o2,int o3)//对应表达式ao((boc)od)
{
float c1,c2,c3;
c1=jisuan(b,c,o2);
c2=jisuan(c1,d,o3);
c3=jisuan(a,c2,o1);
return c3;
}
float cm5(float a,float b,float c,float d,int o1,int o2,int o3)//对应表达式ao(bo(cod))
{
float c1,c2,c3;
c1=jisuan(c,d,o3);
c2=jisuan(b,c1,o2);
c3=jisuan(a,c2,o1);
return c3;
}
//计算结果, 看是否与24相等 相等返回1 不相等返回0
float equal_24( float a, float b, float c, float d)
{
int o1,o2,o3;
for (o1=0;o1<4;o1++)//使用该三重for循坏举出运算符号的所有变化
{
for (o2=0;o2<4;o2++)
{
for (o3=0;o3<4;o3++)
{
if (cm1(a,b,c,d,o1,o2,o3)==24)
{
printf("((%.0f%c%.0f)%c%.0f)%c%.0f = 24\n",a,op[o1],b,op[o2],c,op[o3],d);
cnt++;
}
if (cm2(a,b,c,d,o1,o2,o3)==24)
{
printf("(%.0f%c%.0f)%c(%.0f%c%.0f) = 24\n",a,op[o1],b,op[o2],c,op[o3],d);
cnt++;
}
if (cm3(a,b,c,d,o1,o2,o3)==24)
{
printf("(%.0f%c(%.0f%c%.0f))%c%.0f = 24\n",a,op[o1],b,op[o2],c,op[o3],d);
cnt++;
}
if (cm4(a,b,c,d,o1,o2,o3)==24)
{
printf("%.0f%c((%.0f%c%.0f)%c%.0f) = 24\n",a,op[o1],b,op[o2],c,op[o3],d);
cnt++;
}
if (cm5(a,b,c,d,o1,o2,o3)==24)
{
printf("%.0f%c(%.0f%c(%.0f%c%.0f)) = 24\n",a,op[o1],b,op[o2],c,op[o3],d);
cnt++;
}
}
}
}
return cnt;
}
int main()
{
printf("............................\n");
printf(".....欢迎使用24点计算器.....\n");
printf("......请输入对应的序号......\n");
printf(".........[1]随机数..........\n");
printf(".........[2]自由输入........\n");
printf(".........[其它]退出..........\n");
printf("............................\n");
printf("\n");
printf("请输入对应的序号:");
int n;
loop:scanf("%d",&n);
if(n==1)
{
printf("\n");
int a,b,c,d;
printf("系统将随机产生以下四个数进行计算:\n");
srand(time(NULL));
a = (rand() % 13) + 1;
b = (rand() % 13) + 1;
c = (rand() % 13) + 1;
d = (rand() % 13) + 1;
printf("%d %d %d %d\n", a, b, c, d);
if (equal_24(a, b, c, d))
{
printf("一共有%d种计算方法\n",cnt);
cnt=0;
printf("再来一次,请输入对应的序号:");
goto loop;
}
else
{
printf("这四个数算不出来24,请重新输入序号:\n");
goto loop;
}
}
if(n==2)
{
printf("请输入你要计算的四个数字:\n");
int i,j,k,l;
loop1:scanf("%d %d %d %d",&i,&j,&k,&l);
if(i<1||i>13 || j<1||j>13 || k<1||k>13 || l<1||l>13)
{
printf("输入的数字不合法,请在输入一次:\n");
goto loop1;
}
if (equal_24(i, j, k, l))
{
printf("一共有%d种计算方法\n",cnt);
cnt=0;
printf("再来一次,请输入对应的序号:");
goto loop;
}
else
{
printf("这四个数算不出来24,请重新输入:\n");
goto loop1;
}
}
if(n!=1 && n!=2)
{
printf("感谢您的使用!\n");
exit(0);
}
return 0;
}