| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
Reworld,下班在家制作游戏,1500万奖金等你拿编程微博 - 发现编程界的新鲜事
共有 388 人关注过本帖
标题:编写了一个简单计算器但不知道为何不能打印
只看楼主 加入收藏
德华
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2019-5-10
结帖率:100%
  已结贴   问题点数:20  回复次数:7   
编写了一个简单计算器但不知道为何不能打印
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//计算符优先级比较表
char First[7][7]=
{
    //'+','-','*','/','(',')','#'
        //'+'
        '>','>','<','<','<','>','>',
        //'-'
        '>','>','<','<','<','>','>',
        //'*'
        '>','>','>','>','<','>','>',
        //'/'
        '>','>','>','>','<','>','>',
        //'('
        '<','<','<','<','<','=',' ',
        //')'
        '>','>','>','>',' ','>','>',
        //'#'
        '<','<','<','<','<',' ','=',
};
//运算符数组
char op[7]={'+','-','*','/','(',')','#'};
//数据结构体
typedef struct
{
    double data[50];
    int top;
}opnd_Stack;
//运算符结构体
typedef struct
{
    char data[50];
    int top;
}optr_Stack;
//初始化运算符栈函数
void IntStack_r(optr_Stack*a)
{
    a->top=-1;
}
//初始化数据站函数
void IntStack_d(opnd_Stack*a)
{
    a->top=-1;
}
//运算符进栈函数
void Push_r(optr_Stack*a, char b)
{
    a->top++;
    a->data[a->top]=b;
}
//数据进栈函数
void Push_d(opnd_Stack*a, double b)
{
    a->top++;
    a->data[a->top]=b;
}
//取运算符栈顶符函数
void Gettop_r(optr_Stack*a, char*b)
{
    *b=a->data[a->top];
}
//取数据栈顶数函数
void Gettop_d(opnd_Stack*a, double*b)
{
    *b=a->data[a->top];
}
//判断数据是否为运算符函数
int In(char a, char*s)
{
    for(int i=0;i<7;i++)
    {
        if(a==s[i])
            return 1;
        
            return 0;
    }
}
//算符优先级判断函数
char Precede(char a, char b)
{
    int m, n;
    for (int i=0;i<7;i++)
    {
        if(a==op[i])
            m=i;
        if(b==op[i])
            n=i;
    }
    return First[m][n];
}
//删除运算符栈顶元素,并取新栈的栈顶元素
void Pop_r(optr_Stack*a, char*b)
{
    a->top--;
    *b=a->data[a->top];
}
//取数据栈的栈顶元素,并从栈中删除此元素
void Pop_d(opnd_Stack*a, double*b)
{
    *b=a->data[a->top];
    a->top--;
}
//二元运算函数
double Operate(double a,char t, double b)
{
    switch(t)
    {
    case'+':return a+b;
    case'-':return a-b;
    case'*':return a*b;
    case'/':return a/b;
    default:return 0;
    }
}
//将字符串转换成浮点型数据
double Getdouble(char*a, int*b)
{
    double x;
    char s[50];
    int m=0;
    int n;
    n=strlen(a);
    for(int i=*b;i<n;i++)
    {
        if(In(a[i],op)==1)
        {
            m=i;
            break;
        }
    }
    for(i=*b;i<m;i++)
    {
        s[i-*b]=a[i];
        strcat(s, "\0");
        x=atof(s);
        *b=m;
        return x;
    }
}
//算符优先算法求职核心函数
double Value(char*s)
{
    opnd_Stack opnd;
    optr_Stack optr;
    char ch,t;
    double x, a, b;
    int k=0;
    strcat(s, "#");
    IntStack_r(&optr);
     Push_r(&optr, '#');
    IntStack_d(&opnd);
    Gettop_r(&optr,&ch);
    while(s[k]!='#' || ch!='#')
    {
        if(In(s[k],op)==0)
        {
            x=Getdouble(s,&k);
            Push_d(&opnd,x);
        }
        else
        {
            switch(Precede(ch,s[k]))
            {
            case'<':
                Push_r(&optr,s[k]);
                k++;
                break;
            case'=':
                Pop_r(&optr, &ch);
                k++;
                break;
            case'>':
                Gettop_r(&optr,&t);
                Pop_r(&optr,&ch);
                Pop_d(&opnd,&b);
                Pop_d(&opnd,&a);
                Push_d(&opnd, Operate(a, t, b));
                break;
            }
        }
        Gettop_r(&optr, &ch);
    }
    Gettop_d(&opnd, &x);
    return x;
    IntStack_r(&optr);
    Push_r(&optr, '#');
    IntStack_d(&opnd);
}
//判断输入表达式是否正确
int Can(char a[], int n)
{
    int p=0, s=0, t=0;
    for(int i=0;i<n;i++)
    {
        if(a[i]=='('||a[i]==')')
            p++;
        if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0' && a[i+1]!='(')||a[i+1]>'9'))
            s++;
        if(a[i]=='/' && a[i+1]=='0')
            s++;
        if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')) || (a[i]==')' && a[i+1]=='('))
            s++;
        if(a[i]==')' && a[i+1]!='\0' && (a[i+1]!='+' && a[i+1]!='-' && a[i+1]!='*' && a[i+1]!='/'))
            s++;
        if(a[i]=='.' && a[i+1]=='.')
            s++;
    }
    if(p%2==0 && s==0)
        return 0;
    return 1;
}
//负数转换函数
void Translate(char*s)
{
    char b[80];
    int k, t;
    if(s[0]=='-')
    {
        b[0]='0';
        b[1]='\0';
        strcat(b, s);
        strcpy(s, b);
    }
    t=strlen(s);
    k=t;
    for(int i=0;i<t;i++)
    {
        if(s[i]=='(' && s[i+1]=='-')
        {
            k=i+1;
            for(int j=t;j>=k;j--)
            {
                s[j]=s[j-1];
                s[k]='0';
                s[t+1]='\0';
            }
        }
        t=strlen(s);
        k=t;
    }
}
//主函数
void main()
{
    system("color B0");//设置背景颜色
    char a[80];
    int m;
    char b[80];
    printf("-------简易计算器------\n");
    printf("请输入一个表达式\n");
    while(1)
    {
        gets(a);
        strcpy(b, a);
        Translate(a);
        while(1)
        {
        int p;
        m=strlen(a);
        p=Can(a, m);
        if(p==0)
            break;
        system("color F4");
        printf("输入错误,请重新输入表达式");
        gets(a);
        strcpy(b, a);
        Translate(a);
    }
    system("color B0");
    printf("该表达式结果为:\n %s=%lf\n", b, Value(a));
    printf("继续使用请再输入一个表达式\n");
}
}
搜索更多相关主题的帖子: char int top 函数 return 
2019-06-10 13:02
德华
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2019-5-10
  得分:0 
总的来说,就是输出只能识别错误算式,一旦输入正确算式就会卡死
2019-06-12 08:42
rjsp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:316
帖 子:6553
专家分:37990
注 册:2011-1-18
  得分:10 
回复 2楼 德华
什么叫“不能打印”?

“就是输出只能识别错误算式,一旦输入正确算式就会卡死” ------- 还是听不懂,直接说输入什么、输出什么、期待输出什么。
(比如说输入“Hello, Miss Lee.”输出“Hello, Mike.”期待输出“Hello, Kitty”,
千万不要说“输入一句问候,输出不正确的回答”之类不知所云的话)

我拿你的代码编译了一下,编译失败,比如
int In(char a, char*s)
{
    for(int i=0;i<7;i++)
    {
        if(a==s[i])
            return 1;
        
            return 0;
    }
}
应该是
int In(char a, char*s)
{
    for(int i=0;i<7;i++)
    {
        if(a==s[i])
            return 1;
    }
    return 0;
}


    for(int i=*b;i<m;i++)
    {
        s[i-*b]=a[i];
        strcat(s, "\0");
        x=atof(s);
        *b=m;
        return x;
    }
}
应该是
    for(int i=*b;i<m;i++)
    {
        s[i-*b]=a[i];
        strcat(s, "\0");
        x=atof(s);
        *b=m;
    }
    return x;
}

2019-06-12 11:06
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:132
帖 子:1934
专家分:8543
注 册:2015-3-19
  得分:0 
回复 3楼 rjsp
懒得分析报错,等版主一下子给个全面的分析顺带给解决了

知命以下无敌
2019-06-12 11:10
德华
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2019-5-10
  得分:0 
对不起没有解释清楚,我按照版主的方法解释一下:
输入2-1.5
输出:无(程序卡死,无法运行)
期望:0.5
带小数的算式无法求解,可能是浮点数转换的问题,但萌新水平有限,希望大佬多加指教
2019-06-12 20:43
rjsp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:316
帖 子:6553
专家分:37990
注 册:2011-1-18
  得分:10 
回复 5楼 德华
先将我在3楼说的那两处错误改掉

    for(i=*b;i<m;i++)
    {
        s[i-*b]=a[i];
        strcat(s, "\0");
        x=atof(s);
        *b=m;
        return x;
    }
}
改为
    for(int i=*b;i<m;i++)
    {
        s[i-*b]=a[i];
    }
    s[m-*b+1]='\0';
    x=atof(s);
    *b=m;
    return x;

2019-06-13 08:39
德华
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2019-5-10
  得分:0 
定义为int i会报错,定义量重复,所以我将i改成了j;
代码改正之后可以计算整数,但仍无法计算上述的小数问题,希望大佬指教
2019-06-13 12:14
sainte
Rank: 1
等 级:新手上路
帖 子:14
专家分:4
注 册:2019-6-15
  得分:0 
回复 7楼 德华
在数后面加上.0,比如3.0\1.0,这样
2019-06-15 11:58
快速回复:编写了一个简单计算器但不知道为何不能打印
数据加载中...
 
   



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

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