战w9diwdo 发表于 2015-10-20 13:53:07

有关简易计算器的问题

【问题描述】
设计一个简单的计算器,一次性将所有的运算命令输入,先计算的后输入。首行输入一个数字,表示运算命令的总个数;其余各行输入,每行表示一个运算命令(包括运算操作符和操作数)。所有的输入及输出都为整数。运算操作符有只有Add、Sub、Mul,即加法、减法、乘法三种。

【输入形式】
首行:运算命令的总个数
其余各行:每次运算命令,包括运算操作符和操作数

【输出形式】
输出计算结果

【样例输入】
4
Add 1
Sub 2
Mul 4
Sub 4 5

【样例输出】
3

【样例说明】
计算表达式为(5-4)*4-2+1

有哪位大神能写一份好使的详细详细详细算法(算法就行,程序更好)
为啥我的程序老是有两个结果是错误的(这是作业),怎么调试也调不出来哪里错了,然后学校还不告诉我出错的事例






下面是我的程序:
#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
        int data, size;
        char x;
}node, *qnode;




int check(char *q)
{
        if(q == 'A'&&q == 'd'&&q == 'd')
        {
                return 1;
        }
        if(q == 'S'&&q == 'u'&&q == 'b')
        {
                return 2;
        }
        if(q == 'M'&&q == 'u'&&q == 'l')
        {
                return 3;
        }
}

int main()
{
        int i, j, number, end=0, level, x1, x2, mid;
        char go={0}, c1, c2, y;
        node list1, list2;
        list1.size = 0;

        scanf("%d", &number);
        scanf("%c", &c1);

        for(i=0; i<number; i++)
        {
                for(j=0; j<3; j++)
                {
                        scanf("%c", &go);
                }
                scanf("%c", &c1);
                level = check(go);
                if(level == 1)
                {
                        scanf("%d%c", &x1, &y);
                        if(y== ' ')
                        {
                                scanf("%d%c", &x2, &y);
                                mid = x1+x2;
                                end+=mid;
                        }
                        else
                        {
                                list1.data = x1;
                                list1.x = '+';
                                list1.size++;
                        }
                }

                if(level == 2)
                {
                        scanf("%d%c", &x1, &y);
                        if(y== ' ')
                        {
                                scanf("%d%c", &x2, &y);
                                mid = x2-x1;
                                end+=mid;
                        }
                        else
                        {
                                list1.data = x1;
                                list1.x = '-';
                                list1.size++;
                        }
                }

                if(level == 3)
                {
                        scanf("%d%c", &x1, &y);
                        if(y== ' ')
                        {
                                scanf("%d%c", &x2, &y);
                                mid = x1*x2;
                                end+=mid;
                        }
                        else
                        {
                                list1.data = x1;
                                list1.x = '*';
                                list1.size++;
                        }
                }
        }

        list2.size = list1.size;

        for(i=0; i<list1.size; i++)
        {
                list2.data = list1.data;
                list2.x = list1.x;
        }


        for(i=0; i<list2.size; i++)
        {
                while(list2.x == '*'&&i!=list2.size-1)
                {
                        mid = list2.data*list2.data;
                        list2.data = mid;
                        for(j=i+1; j<list2.size-1; j++)
                        {
                                list2.data = list2.data;
                                list2.x = list2.x;
                        }
                        list2.size--;
                }
                if(list2.x == '+')
                {
                        end += list2.data;
                }
                if(list2.x == '-')
                {
                        end -= list2.data;
                }
                if(list2.x == '*')
                {
                        end *= list2.data;
                }
        }

        printf("%d", end);

        return 0;
}


       

y290176346 发表于 2015-10-20 13:53:08

本帖最后由 y290176346 于 2015-10-21 16:50 编辑

#include "stdafx.h"
#include "iostream"
#include "stdio.h"
typedef struct mingling
{
        char zifu;
        int shuzi;
};

int _tmain(int argc, _TCHAR* argv[])
{
        int a=0,i=0, zongji=0,kongge,k;
        char b='0';
       mingling MLshuzu;
       for (int i=0;i<10;i++)
       {
               MLshuzu.shuzi=0;
       }
        scanf_s("%d",&k,1);

        getchar();
        a=k;
        for (;a>0;a--)      
        {
                kongge=0;
                scanf_s("%c",&b,1);
                i=0;
               
                for (;b!='\n';)
                {
                        if (b==' ')
                        {
                                if (kongge==1)//处理最后一行命令的第二个数字
                                {
                                       
                                                scanf_s("%c",&b,1);
                                                while (b!='\n')
                                                {
                                                        zongji=zongji*10+(b-48);
                                                        scanf_s("%c",&b,1);
                                                }
                                                break;
                                       
                                }
                                scanf_s("%c",&b,1);
                                kongge++;
                        }
                        if (b<=122&&b>=65)//如果是字母 进结构体数组, 如果是数字 进结构体 int 类型
                        {
                                MLshuzu.zifu=b;
                        }
                        if(b<=57&&b>=48)
                        {
                                MLshuzu.shuzi=MLshuzu.shuzi*10+(b-48);
                        }
                       
               
                scanf_s("%c",&b,1);
       
                }
               
        }
        for (int i=1;i<=k;i++)//计算 根据字符判断计算方式
        {
                switch (MLshuzu.zifu)
                {
                case 'A':
                        zongji+=MLshuzu.shuzi;
                        continue;
                case 'S':
                        zongji-=MLshuzu.shuzi;
                        continue;
                case 'M':
                        zongji*=MLshuzu.shuzi;
                        continue;
               
                }
        }

        printf_s("%d", zongji);


        return 0;
}
我也是新手 挑战下自己 希望对你有帮助

ryxcaixia 发表于 2015-10-20 14:35:43

看着像是自己学校平台的ACM试题
有这个题的网页么

h348400034 发表于 2015-10-21 01:08:57

路过......帮顶

战w9diwdo 发表于 2015-10-21 09:55:57

ryxcaixia 发表于 2015-10-20 14:35
看着像是自己学校平台的ACM试题
有这个题的网页么

你进不去。。。

淫令天下 发表于 2015-10-21 13:52:36

小甲鱼数据结构里面有教写简易计算器的可以看看!!

y290176346 发表于 2015-10-21 14:42:50

我的思路就是 吧每行命令如果是字母 就存入 结构体字符数组,如果是数字 就存入 整形变量 ,数字可以是两位以上, 最后遍历每个结构体数组,根据结构体数组的第一个字符判断是什么运算,最后得出结果,最复杂的是最后一行命令的 两组 数字,我把第二组数字直接存进zongji 变量,来进行运算

战w9diwdo 发表于 2015-10-22 09:04:10

y290176346 发表于 2015-10-21 14:36
我也是新手 挑战下自己 希望对你有帮助

你那些前面的库函数声明是怎么回事?VC++里面没有

y290176346 发表于 2015-10-22 09:35:12

我用的是vs2008你就把主函数 和 输入输出函数 改改就行了 或者直接安装一个vs2008

dps521 发表于 2015-11-21 16:09:06

一起研究一下呵呵

鱼C工作室.YCGZS 发表于 2015-11-24 16:47:56

感谢分享

飘渺463431810 发表于 2017-1-7 15:34:34

谢谢,学习了
页: [1]
查看完整版本: 有关简易计算器的问题