| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7400 人关注过本帖
标题:拜托大家帮我看看这有什么问题啊,VC检查没问题,可是输出不对 不知道哪里 ...
只看楼主 加入收藏
dd7403
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-4-27
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:15 
拜托大家帮我看看这有什么问题啊,VC检查没问题,可是输出不对 不知道哪里有问题,求大神们帮看看修改下,只能用C语言和数据结构
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define MAX 4;/*最大输入个数*/
int k=0;/*全局变量 判定是否有解*/
char tp[4]={0},tpt[2000]={0},tptt[2000]={0},tre[2000]={0};/*用来消除重复与记录表达式中的运算符*/
char op[4]={'+','-','*','/'};
void count(float a[],char tem[][25],int n);/*a[]中存放输入的4个数,tem[][25]中存放计算的步骤,n是a[]中元素的个数*/
int q=0,p=0,e=0,w=0,t=0,r=0,g=0,h=0,v=0,u=0,tu=0,te=0;/*用于消除重复*/
float group[2]={0},flow[20]={0},flo[20]={0};
void main()
{
    char br=1;
    int d;
    while (br==1)
    {
    float number[4];/*放输入的4个数*/

    char temp[4][25];/*放表达式,初始化放4个数*/
    printf("请输入4个数\n");
    for(d=0;d<4;d++)
      scanf("%f",&number[d]);
    for(d=0;d<4;d++)
    {
        sprintf(temp[d],"%d",(int) number[d]);
    }/*初始化temp[d]*/
    count(number,temp,4);/*调用count函数*/
    if(k==0)
        printf("没有结果\n");
    printf("按0结束\n");
    scanf("%d",&br);
    }
}
void count(float a[],char tem[][25],int n)
{
    float b[4];
    char tm[4][25];/*b[4]中存放输入的4个数,tm[][25]中存放计算的步骤*/
    int i,j,l,x,y;/*i,j用来做双循环,l用来做加减乘除的开关,x,y为后面准备递归数据*/
    /*输出部分*/
    if(n==1)
    {
        if(fabs(a[0]-24<0.001))/*要考虑到除法,用fabs函数求绝对值与24比较,相当于等于24时的情况*/
        {
            /*以下限定输出条件*/
            if(tp[3]=='*'&&tp[2]=='*'&&tp[1]=='*')
            {
                if(te==0)
                {
                    printf("\n有解为%s=24",tem[0]);/*最后的表达式存在tem[0]中*/
                    k=1;
                    te=1;
                }
            }/*对运算符全为'*'的只输出一遍*/
            else if(tp[3]=='+'&&(tp[2]=='+'||tp[0]=='+')&&tp[1]=='+')
            {
                if(t==0)
                {
                    printf("\n有解为%s=24",tem[0]);/*最后的表达式存在tem[0]中*/
                    k=1;
                    t=1;
                }
            }/*对运算符全为'+'的只输出一遍*/
            else if(tp[3]=='+'&&(tp[2]=='*'||tp[0]=='*')&&tp[1]=='+')
            {
                if(g==0)
                {
                    printf("\n有解为%s=24",tem[0]);/*最后的表达式存在tem[0]中*/
                    k=1;
                    g=1;
                }
            }
            else if((tp[3]=='-'&&tp[2]=='+')||(tp[3]=='+'&&tp[2]=='-'))
            {
                if(w==0)
                {
                    printf("\n有解为%s=24",tem[0]);/*最后的表达式存在tem[0]中*/
                    k=1;
                    w=1;
                }
            }/*对于第二次运算时取到b[0]时,第一第二个运算符是'+','-'或'-','+'的只输出一遍*/
            else if(tp[3]=='+'&&tp[2]=='+')
            {
                if(u==0)
                {
                    printf("\n有解为%s=24",tem[0]);/*最后的表达式存在tem[0]中*/
                    k=1;
                    u=1;
                }
            }/*对于第二次运算时取到b[0]时,第一第二个运算符都是'+'的只输出一遍*/
            else if(tp[3]=='*'&&tp[0]=='*'&&tp[1]=='+')
            {
                if(tu=0)
                {
                    printf("\n有解为%s=24",tem[0]);/*最后的表达式存在tem[0]中*/
                    k=1;
                    tu=1;
                }
            }
            else
            {for(h=0;h<q;h++)
            {
            if(group[0]==flow[h])
            {
            if(tp[3]==tpt[h])
            {
            if(tp[2]==tptt[h])
            {
            if(group[1]==flo[h])
            {
            if(p==0)
            {
                printf("\n有解为%s=24",tem[0]);
                k=1;
                p=1;
            }
            }
            }
            }
            }
            else if(h==q-1)
            {
                printf("\n有解为%s=24",tem[0]);
                k=1;
            }
            }
            }
            flo[q]=group[1];/*限定条件初始化*/
            flow[q]=group[0];/*限定条件初始化*/
            tpt[q]=tp[3];/*限定条件初始化*/
            tptt[q]=tp[2];/*限定条件初始化*/
            tre[q]=tp[1];/*限定条件初始化*/
            tp[3]=0;
            tp[2]=0;
            tp[1]=0;
            tp[0]=0;
                    q=q+1;
        }
    }
          /*运算部分*/
    if(n=1)/*该条件语句用来结束一次递归*/
    {
        for(i=0;i<n;i++)/*对n个数做'+','-','*','/'遍历*/
        {
            for(j=0;j<n;j++)
            {
                if(i=j)
                    continue;
                for(l=0;l<4;l++)/*进行四则运算*/
                {
                    switch(l)
                    {
                    case(0):if(n==2)
                            {
                    b[0]=a[0]+a[1];
                    break;
                }
                else b[0]=a[i]+a[j];
                break;
                case(1):if(n==2)
                        {
                            b[0]=a[0]*a[1];
                            break;
                        }
                    else b[0]=a[i]*a[j];
                    break;
                    /*对加和乘做遍历时除去a[i]+a[j]与a[j]+a[i]或a[i]*a[j]与a[j]*a[i]的相同情况*/
                case(2):
                    b[0]=a[i]-a[j];
                    break;
                case(3):
                    if(a[j]==0)
                        break;
                    b[0]=a[i]/a[j];
                    break;
                    /*对减和除做遍历时考虑a[i]-a[j]与a[j]-a[i]或a[i]/a[j]与a[j]/a[i]的不同*/
                default:break;
            }
            
                if(l!=3||a[j]!=0)
            {
                {
                    if(l==0||l==2||l==3)/*为递归准备数据(把没用到的数也放到b[]与tm[]中)*/
                    sprintf(tm[0],"(%s%c%s)",tem[i],op[l],tem[j]);/*用sprintf函数将表达式输入到数组tm[]中,同时把括号也输入tm[]中*/
                    if(l==1)
                        sprintf(tm[0],"%s%c%s",tem[i],op[l],tem[j]);
                }
                {
                    if(n==3)/*提取第一次运算的运算符和运算结果*/
                    {
                        group[1]=b[0];
                        if(i!=0&&j!=0)
                            tp[0]=op[l];
                        else
                            tp[n-1]=op[l];
                    }
                    else if(n==4)/*提取第二次运算的运算符和运算结果*/
                    {
                        tp[n-1]=op[l];
                        group[0]=b[0];
                    }
                    else/*提取第三次运算的运算符和运算结果*/
                        tp[n-1]=op[l];
                }
                for(x=0,y=1;x<n;x++)/*备份没用到的数据(为递归用)*/
                {
                    if(x!=i&&x!=j)
                    {
                    b[y]=a[x];
                    strcpy(tm[y],tem[x]);/*复制字符串*/
                    y++;
                    }
                }
                }
                count(b,tm,n-1);
        }
    }
    }
    }
    }

[此贴子已经被作者于2016-4-27 13:57编辑过]

搜索更多相关主题的帖子: include C语言 表达式 count 记录 
2016-04-27 11:50
dd7403
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-4-27
收藏
得分:0 
这是速算24点的
2016-04-27 11:50
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:10 
要不先把告警解决了?

1>  main.c
1>c:\users\tr002\documents\visual studio 2015\projects\max.c\max.c\main.c(33): warning C4477: “scanf”: 格式字符串“%d”需要类型“int *”的参数,但可变参数 1 拥有了类型“char *”
1>  c:\users\tr002\documents\visual studio 2015\projects\max.c\max.c\main.c(33): note: 请考虑在格式字符串中使用“%hhd”
1>c:\users\tr002\documents\visual studio 2015\projects\max.c\max.c\main.c(51): warning C4477: “printf”: 格式字符串“%c”需要类型“int”的参数,但可变参数 1 拥有了类型“char *”
1>c:\users\tr002\documents\visual studio 2015\projects\max.c\max.c\main.c(60): warning C4477: “printf”: 格式字符串“%c”需要类型“int”的参数,但可变参数 1 拥有了类型“char *”
1>c:\users\tr002\documents\visual studio 2015\projects\max.c\max.c\main.c(69): warning C4477: “printf”: 格式字符串“%c”需要类型“int”的参数,但可变参数 1 拥有了类型“char *”
1>c:\users\tr002\documents\visual studio 2015\projects\max.c\max.c\main.c(78): warning C4477: “printf”: 格式字符串“%c”需要类型“int”的参数,但可变参数 1 拥有了类型“char *”
1>c:\users\tr002\documents\visual studio 2015\projects\max.c\max.c\main.c(87): warning C4477: “printf”: 格式字符串“%c”需要类型“int”的参数,但可变参数 1 拥有了类型“char *”
1>c:\users\tr002\documents\visual studio 2015\projects\max.c\max.c\main.c(96): warning C4477: “printf”: 格式字符串“%c”需要类型“int”的参数,但可变参数 1 拥有了类型“char *”
1>c:\users\tr002\documents\visual studio 2015\projects\max.c\max.c\main.c(115): warning C4477: “printf”: 格式字符串“%c”需要类型“int”的参数,但可变参数 1 拥有了类型“char *”
1>c:\users\tr002\documents\visual studio 2015\projects\max.c\max.c\main.c(125): warning C4477: “printf”: 格式字符串“%c”需要类型“int”的参数,但可变参数 1 拥有了类型“char *”
2016-04-27 11:53
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:0 
if (n = 1)这是什么目的?输入的不是4吗
2016-04-27 11:58
dd7403
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-4-27
收藏
得分:0 
回复 3楼 grmmylbs
  有警告啊。。。我哪里貌似没问题哎   我再看看
2016-04-27 12:31
dd7403
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-4-27
收藏
得分:0 
回复 3楼 grmmylbs
没有哎,我的VC没有警告哎。。。要不我再发你一次
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define MAX 4;/*最大输入个数*/
int k=0;/*全局变量 判定是否有解*/
char tp[4]={0},tpt[2000]={0},tptt[2000]={0},tre[2000]={0};/*用来消除重复与记录表达式中的运算符*/
char op[4]={'+','-','*','/'};
void count(float a[],char tem[][25],int n);/*a[]中存放输入的4个数,tem[][25]中存放计算的步骤,n是a[]中元素的个数*/
int q=0,p=0,e=0,w=0,t=0,r=0,g=0,h=0,v=0,u=0,tu=0,te=0;/*用于消除重复*/
float group[2]={0},flow[20]={0},flo[20]={0};
int main()
{
    char br=1;
    int d;
    while (br==1)
    {
    float number[4];/*放输入的4个数*/

    char temp[4][25];/*放表达式,初始化放4个数*/
    printf("请输入4个数\n");
    for(d=0;d<4;d++)
      scanf("%f",&number[d]);
    for(d=0;d<4;d++)
    {
        sprintf(temp[d],"%d",(int) number[d]);
    }/*初始化temp[d]*/
    count(number,temp,4);/*调用count函数*/
    if(k==0)
        printf("没有结果\n");
    printf("按0结束\n");
    scanf("%d",&br);
    }
}
void count(float a[],char tem[][25],int n)
{
    float b[4];
    char tm[4][25];/*b[4]中存放输入的4个数,tm[][25]中存放计算的步骤*/
    int i,j,l,x,y;/*i,j用来做双循环,l用来做加减乘除的开关,x,y为后面准备递归数据*/
    /*输出部分*/
    if(n==1)
    {
        if(fabs(a[0]-24<0.001))/*要考虑到除法,用fabs函数求绝对值与24比较,相当于等于24时的情况*/
        {
            /*以下限定输出条件*/
            if(tp[3]=='*'&&tp[2]=='*'&&tp[1]=='*')
            {
                if(te==0)
                {
                    printf("\n有解为%c=24",tem[0]);/*最后的表达式存在tem[0]中*/
                    k=1;
                    te=1;
                }
            }/*对运算符全为'*'的只输出一遍*/
            else if(tp[3]=='+'&&(tp[2]=='+'||tp[0]=='+')&&tp[1]=='+')
            {
                if(t==0)
                {
                    printf("\n有解为%c=24",tem[0]);/*最后的表达式存在tem[0]中*/
                    k=1;
                    t=1;
                }
            }/*对运算符全为'+'的只输出一遍*/
            else if(tp[3]=='+'&&(tp[2]=='*'||tp[0]=='*')&&tp[1]=='+')
            {
                if(g==0)
                {
                    printf("\n有解为%c=24",tem[0]);/*最后的表达式存在tem[0]中*/
                    k=1;
                    g=1;
                }
            }
            else if((tp[3]=='-'&&tp[2]=='+')||(tp[3]=='+'&&tp[2]=='-'))
            {
                if(w==0)
                {
                    printf("\n有解为%c=24",tem[0]);/*最后的表达式存在tem[0]中*/
                    k=1;
                    w=1;
                }
            }/*对于第二次运算时取到b[0]时,第一第二个运算符是'+','-'或'-','+'的只输出一遍*/
            else if(tp[3]=='+'&&tp[2]=='+')
            {
                if(u==0)
                {
                    printf("\n有解为%c=24",tem[0]);/*最后的表达式存在tem[0]中*/
                    k=1;
                    u=1;
                }
            }/*对于第二次运算时取到b[0]时,第一第二个运算符都是'+'的只输出一遍*/
            else if(tp[3]=='*'&&tp[0]=='*'&&tp[1]=='+')
            {
                if(tu=0)
                {
                    printf("\n有解为%c=24",tem[0]);/*最后的表达式存在tem[0]中*/
                    k=1;
                    tu=1;
                }
            }
            else
            {for(h=0;h<q;h++)
            {
            if(group[0]==flow[h])
            {
            if(tp[3]==tpt[h])
            {
            if(tp[2]==tptt[h])
            {
            if(group[1]==flo[h])
            {
            if(p==0)
            {
                printf("\n有解为%c=24",tem[0]);
                k=1;
                p=1;
            }
            }
            }
            }
            }
            else if(h==q-1)
            {
                printf("\n有解为%c=24",tem[0]);
                k=1;
            }
            }
            }
            flo[q]=group[1];/*限定条件初始化*/
            flow[q]=group[0];/*限定条件初始化*/
            tpt[q]=tp[3];/*限定条件初始化*/
            tptt[q]=tp[2];/*限定条件初始化*/
            tre[q]=tp[1];/*限定条件初始化*/
            tp[3]=0;
            tp[2]=0;
            tp[1]=0;
            tp[0]=0;
                    q=q+1;
        }
    }
          /*运算部分*/
    if(n=1)/*该条件语句用来结束一次递归*/
    {
        for(i=0;i<n;i++)/*对n个数做'+','-','*','/'遍历*/
        {
            for(j=0;j<n;j++)
            {
                if(i=j)
                    continue;
                for(l=0;l<4;l++)/*进行四则运算*/
                {
                    switch(l)
                    {
                    case(0):if(n==2)
                            {
                    b[0]=a[0]+a[1];
                    break;
                }
                else b[0]=a[i]+a[j];
                break;
                case(1):if(n==2)
                        {
                            b[0]=a[0]*a[1];
                            break;
                        }
                    else b[0]=a[i]*a[j];
                    break;
                    /*对加和乘做遍历时除去a[i]+a[j]与a[j]+a[i]或a[i]*a[j]与a[j]*a[i]的相同情况*/
                case(2):
                    b[0]=a[i]-a[j];
                    break;
                case(3):
                    if(a[j]==0)
                        break;
                    b[0]=a[i]/a[j];
                    break;
                    /*对减和除做遍历时考虑a[i]-a[j]与a[j]-a[i]或a[i]/a[j]与a[j]/a[i]的不同*/
                default:break;
            }
            
                if(l!=3||a[j]!=0)
            {
                {
                    if(l==0||l==2||l==3)/*为递归准备数据(把没用到的数也放到b[]与tm[]中)*/
                    sprintf(tm[0],"(%s%c%s)",tem[i],op[l],tem[j]);/*用sprintf函数将表达式输入到数组tm[]中,同时把括号也输入tm[]中*/
                    if(l==1)
                        sprintf(tm[0],"%s%c%s",tem[i],op[l],tem[j]);
                }
                {
                    if(n==3)/*提取第一次运算的运算符和运算结果*/
                    {
                        group[1]=b[0];
                        if(i!=0&&j!=0)
                            tp[0]=op[l];
                        else
                            tp[n-1]=op[l];
                    }
                    else if(n==4)/*提取第二次运算的运算符和运算结果*/
                    {
                        tp[n-1]=op[l];
                        group[0]=b[0];
                    }
                    else/*提取第三次运算的运算符和运算结果*/
                        tp[n-1]=op[l];
                }
                for(x=0,y=1;x<n;x++)/*备份没用到的数据(为递归用)*/
                {
                    if(x!=i&&x!=j)
                    {
                    b[y]=a[x];
                    strcpy(tm[y],tem[x]);/*复制字符串*/
                    y++;
                    }
                }
                }
               
        }
    }
    }
    }
    }

[此贴子已经被作者于2016-4-27 13:25编辑过]

2016-04-27 12:34
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:10 
我这运行没有问题,就一个警告,main不要用void,改为int,最后加个return 0;
不过有BUG,输入字符就会出问题,还有个不太友好的地方:不能重复计算。你要不要加个循环。
没看出来你说的输出不对是什么意思。不过算法应该有问题,因为我输入了1  2  3  4,四个数字,居然说没有结果。
这明明可以算24的好吧

[此贴子已经被作者于2016-4-27 12:57编辑过]

2016-04-27 12:55
dd7403
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-4-27
收藏
得分:0 
回复 7楼 wanglianyi1
就是这个原因,没能达到概要的结果,貌似是没引用到count(b,tm,n-1);这个函数,不懂怎么放了。。。因为本身不是很懂,就是边看边问别人所以不知道该怎么引用这个了

[此贴子已经被作者于2016-4-27 13:19编辑过]

2016-04-27 13:13
dd7403
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-4-27
收藏
得分:0 
回复 4楼 grmmylbs
我错了,改成if(n>1),这样可以,但是没有表达式出来。。。
2016-04-27 13:50
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:0 
你想要什么样的表达式?预想的输出结果是怎样的
2016-04-27 14:16
快速回复:拜托大家帮我看看这有什么问题啊,VC检查没问题,可是输出不对 不知道 ...
数据加载中...
 
   



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

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