| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 855 人关注过本帖
标题:C语言问题
只看楼主 加入收藏
流光丶溢彩
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2015-6-23
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:19 
C语言问题
问题

楼下为给定求24点的源代码

[ 本帖最后由 流光丶溢彩 于 2015-6-23 22:53 编辑 ]
搜索更多相关主题的帖子: C语言 
2015-06-23 13:08
流光丶溢彩
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2015-6-23
收藏
得分:0 
程序代码:
#include<stdio.h>   
#include<string.h>
#include<stdlib.h>
int input0()
{
    int m;
    int flag,i;
    char t[100];  //先采用字符串输入 限定输入的每一位都在0~9之间,保证输入的是数字、避免输入的是字母或者其他字符
    do{
        flag=0;   
        fflush(stdin);
re:        gets(t);
        for(i=0;(size_t)i<strlen(t);i++)
        {
            if(t[i]<'0' ||t[i]>'9')
                flag=1;
        }
        if(flag)
        {
            printf("输入有误,请重新输入\n>> ①:");
            flag=0;  //(这一步要重置flag为0,当做无误的再作判断)
            goto re;
        }
    }while(flag);
    m=atoi(t);//C语言库函数名atoi功能: 把字符串转换成整型数得到全局n的值
    if(m<=0||m>=10)  
    {
            printf("输入有误,请重新输入\n>> ①:");
            flag=0;  //(这一步要重置flag为0,当做无误的再作判断)
            goto re;
    }
    return m;
}


int input1()
{
    int m;
    int flag,i;
    char t[100];  
    do{
        flag=0;   
        fflush(stdin);
re:        gets(t);
        for(i=0;(size_t)i<strlen(t);i++)
        {
            if(t[i]<'0' ||t[i]>'9')
                flag=1;
        }
        if(flag)
        {
            printf("输入有误,请重新输入\n>> ②:");
            flag=0;  //
            goto re;
        }
    }while(flag);
    m=atoi(t);
    if(m<=0||m>=10)  
    {
            printf("输入有误,请重新输入\n>> ②:");
            flag=0;  
            goto re;
    }
    return m;
}
int input2()
{
    int m;
    int flag,i;
    char t[100];  
    do{
        flag=0;   
        fflush(stdin);
re:        gets(t);
        for(i=0;(size_t)i<strlen(t);i++)
        {
            if(t[i]<'0' ||t[i]>'9')
                flag=1;
        }
        if(flag)
        {
            printf("输入有误,请重新输入\n>> ③:");
            flag=0;  
            goto re;
        }
    }while(flag);
    m=atoi(t);
    if(m<=0||m>=10)  
    {
            printf("输入有误,请重新输入\n>> ③:");
            flag=0;  
            goto re;
    }
    return m;
}



int input3()
{
    int m;
    int flag,i;
    char t[100];  
    do{
        flag=0;   
        fflush(stdin);
re:        gets(t);
        for(i=0;(size_t)i<strlen(t);i++)
        {
            if(t[i]<'0' ||t[i]>'9')
                flag=1;
        }
        if(flag)
        {
            printf("输入有误,请重新输入\n>> ④:");
            flag=0;  
            goto re;
        }
    }while(flag);
    m=atoi(t);
    if(m<=0||m>=10)  
    {
            printf("输入有误,请重新输入\n>> ④:");
            flag=0;  
            goto re;
    }
    return m;
}        




输入输出定义
double  cal(double a,double b,int op)      // op: 0:+,1:-,2:*,3:/
{
        switch (op)                        // +-x/ 运算
         {
           case 0:  return(a+b);
           case 1:  return(a-b);
           case 2:  return(a*b);
         }
        if (b==0.0)                       //  分母为0
            return(999.0);
        else
            return(a/b);
}


//在运算过程中除法的特殊性——除数不能为零。因为可能会用到除法,所以要考虑精度问题
//这里通过结果减去24取绝对值与一个接近0的小数(如0.001)比较,如小于它,即可判定结果是24。

int    isEqual(double d1,double d2)           // 两个浮点数是否近似相等   
{
        double d=d1-d2;
        if (d<0) d=-d;                        // 求绝对值
        return(d<=0.001);                     //返回为1或者0 取决于d<=0.001是否成立。若成立则返回1,即判定预算结果等于24

}





/**************************计算24点***************/
void   D24(int v0,int v1,int v2,int v3)          // 穷举法求24点

{
       char op[4]={'+','-','*','/'};             //  +:0  -:1 *:2  /:3
       int count=0;// 计数成功次数
       int i1,i2,i3,i4;
       int f1,f2,f3;
       int v[4];                                 // 输入四整数

       v[0]=v0; v[1]=v1;

       v[2]=v2; v[3]=v3;

//-----------四重循环开始穷举四个数字的位置: 4!=24 种  A44--------------------------
       
       for (i1=0;i1<4;i1++)                  //i表示v[i]下标的位置 i1 i2 i3 i4不能相等(分别为0 1 2 3)  表示4个数排列在数组4个不同的位置上

        for (i2=0;i2<4;i2++)                 // 四重循环对四个数穷举

          if (i2!=i1)

          for (i3=0;i3<4;i3++)

            if (i3!=i2 && i3!=i1)

            for (i4=0;i4<4;i4++)

               if (i4!=i3 && i4!=i2 && i4!=i1)

                 {

//-----------三重循环开始穷举三个运算符: 4X4X4=64 种 +-*/可以重复使用---------------------------

                   for (f1=0;f1<4;f1++)      // 三重循环对运算符穷举,f表示op[f]中的元素

                     for (f2=0;f2<4;f2++)

                       for (f3=0;f3<4;f3++)  // 运算符 f1,f2,f3

                         {                       // 对运算优先级直接列举(5种)

//-----------未用循环,直接穷举三个运算符的优先级: 3!-1=5种( 3*2-1=5)-------------------

                           double t1,t2,t3;      // 存放计算的中间值  两个两个按优先级进行计算

                           // 第1种情况  ((a 。b)。c)。d  :

                           t1=cal(v[i1],v[i2],f1);

                           t2=cal(t1,v[i3],f2);

                           t3=cal(t2,v[i4],f3);

                           if (isEqual(t3,24))    // 运算后是否为24

                            {

                              char *fs="((%d%c%d)%c%d)%c%d=24\n";

                              printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4]);

                              count++;

                            }

                           // 第2种情况(a 。b)。(c。 d) 开始计算 :

                           t1=cal(v[i1],v[i2],f1);

                           t2=cal(v[i3],v[i4],f3);

                           t3=cal(t1,t2,f2);

                           if (isEqual(t3,24))      // 运算后是否为24

                            {

                              char *fs="(%d%c%d)%c(%d%c%d)=24\n";

                              printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4]);

                              count++;

                             }

                           // 第3种情况 (a。(b。c))。d  开始计算 :

                           t1=cal(v[i2],v[i3],f2);

                           t2=cal(v[i1],t1,f1);

                           t3=cal(t2,v[i4],f3);

                           if (isEqual(t3,24))    // 运算后是否为24

                            {

                              char *fs="(%d%c(%d%c%d))%c%d=24\n";

                              printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4]);

                              count++;

                            }

                           // 第4种情况  a。((b。c)。d ) 开始计算:

                           t1=cal(v[i2],v[i3],f2);

                           t2=cal(t1,v[i4],f3);

                           t3=cal(v[i1],t2,f1);

                           if (isEqual(t3,24))    // 运算后是否为24

                           {

                             char *fs="%d%c((%d%c%d)%c%d)=24\n";

                             printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4]);

                             count++;

                           }

                           // 第5种情况 a。(b。(c。d)) 开始计算:

                           t1=cal(v[i3],v[i4],f3);

                           t2=cal(v[i2],t1,f2);

                           t3=cal(v[i1],t2,f1);

                           if (isEqual(t3,24))    // 运算后是否为24

                           {

                             char *fs="%d%c(%d%c(%d%c%d))=24\n";

                             printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4]);

                             count++;

                           }

                         }

                   }

//-------------- 穷举结束: 共 24*64*5=7680 种表达式 ---------------------------
                if (count==0)
                    printf("\n抱歉,无法算出24点\n\n\n");
                else
                    printf("\n共找到 %d 条算式\n\n\n",count);

}



void    main()
{
        int v0,v1,v2,v3;
        char c;
repeat:
        printf("\t\t\t***********************\n ");
        printf("\t\t\t* welcome to 24点程序 *\n");
        printf("\t\t\t***********************\n ");
        printf("输入四个整数(0,10)之间:\n");
        printf(">> ①:");
        v0=input0();
        printf(">> ②:");
        v1=input1();
        printf(">> ③:");
        v2=input2();
        printf(">> ④:");
        v3=input3();
        printf("您所输入的四个整数分别为:%d  %d  %d  %d\n",v0,v1,v2,v3);
        D24(v0,v1,v2,v3);
        printf("是否继续?y/n\n>>");
        fflush(stdin);
         scanf("%c",&c);
        while(c!='y'&&c!='n')
        {
          printf("输入有误请选择y或者n\n>>");
          fflush(stdin);
          scanf("%c",&c);
        
        }
        if(c=='y') goto repeat;
        else printf("--------------------------------再见--------------------------\n");
}


[ 本帖最后由 流光丶溢彩 于 2015-6-23 13:15 编辑 ]
2015-06-23 13:13
流光丶溢彩
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2015-6-23
收藏
得分:0 
来人给理下思路吧

[ 本帖最后由 流光丶溢彩 于 2015-6-23 13:19 编辑 ]
2015-06-23 13:14
T_MACC
Rank: 4
等 级:业余侠客
威 望:8
帖 子:99
专家分:211
注 册:2015-4-14
收藏
得分:7 
计算结果等于键盘输入的表达式????   比如输入  4 5 6 7     计算结果就是4567啦才正确????
2015-06-23 14:32
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:7 
问得太多了,看得我稀里糊涂的。所以我一直建议 一个帖子只许提一个问题。

我不是来回答你问题的,只是想顺便问一问 (5 - 1/5)*5 = 24 算不算符合你的要求?
2015-06-23 14:41
流光丶溢彩
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2015-6-23
收藏
得分:0 
回复 4楼 T_MACC
输入的四个任意整数运算后的值等于某个特定的数值,这个特定的数值,也是由键盘输入的,相当于一共要输入5个数值。并求出输入的前四个整数运算的结果等于第五个数的表达式。

[ 本帖最后由 流光丶溢彩 于 2015-6-23 21:00 编辑 ]
2015-06-23 19:10
我爱吃青菜
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:6
帖 子:190
专家分:500
注 册:2015-3-29
收藏
得分:7 
24点这么复杂的思路都给出来了,只是把输入数的范围改到0~1000;还有增加一个结果的输入,增加D24函数的一个参数,把24换成所增的参数就好了
2015-06-23 21:42
流光丶溢彩
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2015-6-23
收藏
得分:0 
回复 7楼 我爱吃青菜
那么这代码该如何改动呢,特别是最后一个输入的数值,还有计算的结果精度范围。
2015-06-23 21:53
我爱吃青菜
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:6
帖 子:190
专家分:500
注 册:2015-3-29
收藏
得分:0 
动了一下你的代码
关于你说的结果精度范围,我没考虑过,麻烦你举个例子说说为什么要考虑精度呢?计算24点需要的精度不适用于更大数?
计算值越大,越不容易得到键盘输入的值


程序代码:
#include<stdio.h>   
#include<string.h>
#include<stdlib.h>

const char serial[][4] = {"", "", "", ""};//通过数组显示序号 


int input(int x)//之前有4个input函数,函数体几乎一样,太累赘了 
{
    int m;
    int flag,i;
    char t[100];  //先采用字符串输入 限定输入的每一位都在0~9之间,保证输入的是数字、避免输入的是字母或者其他字符
    do{
        flag=0;   
        fflush(stdin);
        gets(t);
        for(i=0;(size_t)i<strlen(t);i++)
        {
            if(t[i]<'0' ||t[i]>'9')
            {
                flag=1;
                printf("输入有误,请重新输入\n>> %s:", serial[x]);
                break;
            }      
        }
        if(!flag)
        {
            m=atoi(t);//C语言库函数名atoi功能: 把字符串转换成整型数得到全局n的值
               if(m<=0||m>=1000)  
             {
                printf("输入有误,请重新输入\n>> %s:", serial[x]);
                flag=1;  
            }
        }
    }while(flag);
    
    return m;
}


//输入输出定义
double  cal(double a,double b,int op)      // op: 0:+,1:-,2:*,3:/
{
        switch (op)                        // +-x/ 运算
         {
           case 0:  return(a+b);
           case 1:  return(a-b);
           case 2:  return(a*b);
         }
        if (b==0.0)                       //  分母为0
            return(999.0);
        else
            return(a/b);
}


//在运算过程中除法的特殊性——除数不能为零。因为可能会用到除法,所以要考虑精度问题
//这里通过结果减去24取绝对值与一个接近0的小数(如0.001)比较,如小于它,即可判定结果是24。

int    isEqual(double d1,double d2)           // 两个浮点数是否近似相等   
{
        double d=d1-d2;
        if (d<0) d=-d;                        // 求绝对值
        return(d<=0.001);                     //返回为1或者0 取决于d<=0.001是否成立。若成立则返回1,即判定预算结果等于24

}





/**************************计算result***************/
void   D24(int v[], int result)          // 穷举法求结果,增加变量result 

{
       char op[4]={'+','-','*','/'};             //  +:0  -:1 *:2  /:3
       int count=0;// 计数成功次数
       int i1,i2,i3,i4;
       int f1,f2,f3;
       

//-----------四重循环开始穷举四个数字的位置: 4!=24 种  A44--------------------------
       
       for (i1=0;i1<4;i1++)                  //i表示v[i]下标的位置 i1 i2 i3 i4不能相等(分别为0 1 2 3)  表示4个数排列在数组4个不同的位置上

        for (i2=0;i2<4;i2++)                 // 四重循环对四个数穷举

          if (i2!=i1)

          for (i3=0;i3<4;i3++)

            if (i3!=i2 && i3!=i1)

            for (i4=0;i4<4;i4++)

               if (i4!=i3 && i4!=i2 && i4!=i1)

                 {

//-----------三重循环开始穷举三个运算符: 4X4X4=64 种 +-*/可以重复使用---------------------------

                   for (f1=0;f1<4;f1++)      // 三重循环对运算符穷举,f表示op[f]中的元素

                     for (f2=0;f2<4;f2++)

                       for (f3=0;f3<4;f3++)  // 运算符 f1,f2,f3

                         {                       // 对运算优先级直接列举(5种)

//-----------未用循环,直接穷举三个运算符的优先级: 3!-1=5种( 3*2-1=5)-------------------

                           double t1,t2,t3;      // 存放计算的中间值  两个两个按优先级进行计算

                           // 第1种情况  ((a 。b)。c)。d  :

                           t1=cal(v[i1],v[i2],f1);

                           t2=cal(t1,v[i3],f2);

                           t3=cal(t2,v[i4],f3);

                           if (isEqual(t3,result))    // 将24改成result

                            {

                              char *fs="((%d%c%d)%c%d)%c%d=%d\n";  //将24改成%d 

                              printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4],result); //增加resul参数 ,对应增加的%d 

                              count++;

                            }

                           // 第2种情况(a 。b)。(c。 d) 开始计算 :

                           t1=cal(v[i1],v[i2],f1);

                           t2=cal(v[i3],v[i4],f3);

                           t3=cal(t1,t2,f2);

                           if (isEqual(t3,result))      // 将24改成result

                            {

                              char *fs="(%d%c%d)%c(%d%c%d)=%d\n";  //将24改成%d 

                              printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4],result);//增加resul参数 ,对应增加的%d 

                              count++;

                             }

                           // 第3种情况 (a。(b。c))。d  开始计算 :

                           t1=cal(v[i2],v[i3],f2);

                           t2=cal(v[i1],t1,f1);

                           t3=cal(t2,v[i4],f3);

                           if (isEqual(t3,result))    // 将24改成result

                            {

                              char *fs="(%d%c(%d%c%d))%c%d=%d\n";  //将24改成%d 

                              printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4],result);//增加resul参数 ,对应增加的%d 

                              count++;

                            }

                           // 第4种情况  a。((b。c)。d ) 开始计算:

                           t1=cal(v[i2],v[i3],f2);

                           t2=cal(t1,v[i4],f3);

                           t3=cal(v[i1],t2,f1);

                           if (isEqual(t3,result))    // 将24改成result

                           {

                             char *fs="%d%c((%d%c%d)%c%d)=%d\n";  //将24改成%d 

                             printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4],result);//增加resul参数 ,对应增加的%d 

                             count++;

                           }

                           // 第5种情况 a。(b。(c。d)) 开始计算:

                           t1=cal(v[i3],v[i4],f3);

                           t2=cal(v[i2],t1,f2);

                           t3=cal(v[i1],t2,f1);

                           if (isEqual(t3,result))    // 运算后是否为result

                           {

                             char *fs="%d%c(%d%c(%d%c%d))=%d\n";  //将24改成%d 

                             printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4],result);//增加resul参数 ,对应增加的%d 

                             count++;

                           }

                         }

                   }

//-------------- 穷举结束: 共 24*64*5=7680 种表达式 ---------------------------
                if (count==0)
                    printf("\n抱歉,无法算出结果%d\n\n\n", result);
                else
                    printf("\n共找到 %d 条算式\n\n\n",count);

}


int main()
{
        int i, result, v[4];
        char c;
        do{
            printf("\t\t\t***********************\n ");
            printf("\t\t\t* welcome to 24点程序 *\n");
             printf("\t\t\t***********************\n ");
             
             printf("输入四个整数(0,10)之间:\n");
               for(i = 0; i < 4; i++)
               {
                    printf(">> %s:", serial[i]);
                v[i] = input(i);
            }
            printf("您所输入的四个整数分别为:%d  %d  %d  %d\n",v[0],v[1],v[2],v[3]);
            printf("输入想求得的结果:");
             scanf("%d", &result);
             D24(v, result);
            printf("是否继续?y/n\n>>");
            fflush(stdin);
             scanf("%c",&c);
            while(c!='y'&&c!='n')
            {
              printf("输入有误请选择y或者n\n>>");
              fflush(stdin);
              scanf("%c",&c);
            }
        }while(c=='y');
        printf("--------------------------------再见--------------------------\n");
        return 0;
}
2015-06-23 22:05
流光丶溢彩
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2015-6-23
收藏
得分:0 
回复 9楼 我爱吃青菜
恩 多谢您的指导 有种茅塞顿开的感觉 思路终于有了
2015-06-23 22:13
快速回复:C语言问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025631 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved