| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 855 人关注过本帖
标题:C语言问题
取消只看楼主 加入收藏
流光丶溢彩
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2015-6-23
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
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
流光丶溢彩
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2015-6-23
收藏
得分:0 
回复 4楼 T_MACC
输入的四个任意整数运算后的值等于某个特定的数值,这个特定的数值,也是由键盘输入的,相当于一共要输入5个数值。并求出输入的前四个整数运算的结果等于第五个数的表达式。

[ 本帖最后由 流光丶溢彩 于 2015-6-23 21:00 编辑 ]
2015-06-23 19:10
流光丶溢彩
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2015-6-23
收藏
得分:0 
回复 7楼 我爱吃青菜
那么这代码该如何改动呢,特别是最后一个输入的数值,还有计算的结果精度范围。
2015-06-23 21:53
流光丶溢彩
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2015-6-23
收藏
得分:0 
回复 9楼 我爱吃青菜
恩 多谢您的指导 有种茅塞顿开的感觉 思路终于有了
2015-06-23 22:13
流光丶溢彩
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2015-6-23
收藏
得分:0 
回复 11楼 我爱吃青菜
这个是为甚么呢,有点不太理解?不容易终止循环吗?
2015-06-23 22:25
流光丶溢彩
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2015-6-23
收藏
得分:0 
回复 13楼 我爱吃青菜
这个问题老师上课没有详细说明,仅仅轻轻一笔带过,长知识了。
2015-06-23 22:52
流光丶溢彩
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2015-6-23
收藏
得分:0 
回复 15楼 TonyDeng
学校的老师上课都是按PPT讲解,不管你听不听的懂,讲完了就完了。上课还没有自学的有效果,问问题也是是如此。
2015-06-23 23:16
流光丶溢彩
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2015-6-23
收藏
得分:0 
回复 17楼 TonyDeng
结构化编程是说了,但是照着PPT念得,有些东西讲解不是很到位。
2015-06-23 23:21
快速回复:C语言问题
数据加载中...
 
   



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

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