| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7422 人关注过本帖
标题:拜托大家帮我看看这有什么问题啊,VC检查没问题,可是输出不对 不知道哪里 ...
取消只看楼主 加入收藏
dd7403
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-4-27
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
拜托大家帮我看看这有什么问题啊,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
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
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
dd7403
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-4-27
收藏
得分:0 
回复 10楼 grmmylbs
预想的结果是,比如输入进去的是1 2 3 4,输出的结果应该是   有解为1*2*3*4=24   这样类似的结果,但现在得不到呢
2016-04-27 14:18
dd7403
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-4-27
收藏
得分:0 
回复 12楼 grmmylbs
说实话,不是很懂呢,诶…因为是在别人还有网上一边看一边自己改的,所以有些也不是很懂…大神帮看看呗,小弟谢谢了
2016-04-27 16:20
dd7403
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-4-27
收藏
得分:0 
回复 13楼 wanglianyi1
就是不太懂怎么读…诶,要是可以帮看看呗,小弟谢谢了
2016-04-27 16:21
快速回复:拜托大家帮我看看这有什么问题啊,VC检查没问题,可是输出不对 不知道 ...
数据加载中...
 
   



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

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