24点计算

系统功能模块结构图

        运算符号

        计算方法

        计算结果

数据结构设计及用法说明

        按照相应的序号进行输入即可

程序结构

各模块的功能

        运算符号

                四个运算符号

                四个运算符号所对应的运算法则

        计算方法

                根据括号的不用位置,有五种不同的计算方法

        计算结果

                判断结果与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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值