Shader_L 2022-03-04 11:28 采纳率: 50%
浏览 31
已结题

习题6-7四则运算计算器运行无法得到结果

pta C语言习题6-7
编写一个四则运算优先级相同的计算器
若为非法输入或除数为0则输出ERROR。
写好了但运行不出结果,求找错
代码如下:

#include <stdio.h>
#include <math.h>
int main(void)
{
    int i = 0,j,cnt = 1,n = 0,m = 0;//计数变量
    int *p;//判断是否为错误输入,错误则为-1
    double num[100] = {0};//储存从字符串中获取的数字
    char ch[100] = {'e'},dos[100];//ch[]用来获取输入的字符串
    //dos[]用来存放从字符串中获取的运算符
    while (ch[i-1] != '=')
        ch[i++] = getchar();//获取字符串
    for (i = 0;ch[i] != 'e';i++)
    {
        if (ch[i] >= 48 && ch[i] <= 57)//判断字符串某一项为数字或运算符
        {
            j = i + 1;
            if (ch[j] >= 48 && ch[j] <= 57)//是否为多位数
            {
                while (ch[j] >= 48 && ch[j] <= 57)
                {
                    j++;
                    cnt++;
                }
                while (i < j)
                {
                    num[n] += ch[i++]*pow(10,cnt - 1);
                    cnt--;//将该多位数求出并保存至num[]
                }
                i--;    
            }
            else
            {
                num[n++] = ch[i];//直接将个位数保存至num[]
            }
        }
        else if (ch[i] = '*')//将运算符保存至dos[]
            dos[m++] = '*';
        else if (ch[i] = '+')
            dos[m++] = '+';
        else if (ch[i] = '-')
            dos[m++] = '-';
        else if (ch[i] = '/')
            dos[m++] = '/';
        else
        {
            *p = 0;//非法输入
            break;
        }
    }
    if (*p != 0)//确保不为非法输入
    {
        j = -1;
        for(i = 0;i < n;i++)//判断是否存在0,以及存放下标
        {
            if (num[i] == 0)
                j = i;
        }
        if (j > 0)
        {
            if (dos[j - 1] == '/')//判断0前一个运算符是否为“/”
                printf ("ERROR\n");
        }
        else
        {
            i = 0;
            while(i <= m)//开始运算
            {
                if (dos[i] == '+')
                    num[i + 1] += num[i];
                else if (dos[i] == '-')
                    num[i + 1] -= num[i];
                else if (dos[i] == '*')
                    num[i + 1] *= num[i];
                else if (dos[i] == '/')
                    num[i + 1]  /= num[i];
                    i++;
            }
            printf ("%lf",num[i]);
        }
    }
    else
    {
        printf ("ERROR\n");
    }
    return 0;
}

img

多次检查无果,求找错
十分感谢!

  • 写回答

3条回答 默认 最新

  • CSDN专家-link 2022-03-04 11:32
    关注

    while (ch[i-1] != '=')
    i初始值为0,这不第一下就越界访问了么

    char ch[100] = {'e'}
    这只是把ch数组的第一个元素赋值为'e',其它字符都是0,并不是把所有字符都初始化为'e'啊

     else if (ch[i] = '*')//将运算符保存至dos[]
    ch[i]='*'是赋值语句,不是判断语句啊。判断语句是 ch[i] == '*',后面都是这么个错误
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月12日
  • 已采纳回答 3月4日
  • 创建了问题 3月4日

悬赏问题

  • ¥15 VSCode里的Prettier如何实现等式赋值后的对齐效果?
  • ¥15 流式socket文件传输答疑
  • ¥20 keepalive配置业务服务双机单活的方法。业务服务一定是要双机单活的方式
  • ¥50 关于多次提交POST数据后,无法获取到POST数据参数的问题
  • ¥15 win10,这种情况怎么办
  • ¥15 如何在配置使用Prettier的VSCode中通过Better Align插件来对齐等式?(相关搜索:格式化)
  • ¥100 在连接内网VPN时,如何同时保持互联网连接
  • ¥15 MATLAB中使用parfor,矩阵Removal的有效索引在parfor循环中受限制
  • ¥20 Win 10 LTSC 1809版本如何无损提升到20H1版本
  • ¥50 win10 LTSC 虚拟键盘不弹出