鱼C论坛

 找回密码
 立即注册
查看: 6128|回复: 11

有关简易计算器的问题

[复制链接]
发表于 2015-10-20 13:53:07 | 显示全部楼层 |阅读模式
100鱼币
【问题描述】
设计一个简单的计算器,一次性将所有的运算命令输入,先计算的后输入。首行输入一个数字,表示运算命令的总个数;其余各行输入,每行表示一个运算命令(包括运算操作符和操作数)。所有的输入及输出都为整数。运算操作符有只有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[1000], size;
        char x[1000];
}node, *qnode;




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

int main()
{
        int i, j, number, end=0, level, x1, x2, mid;
        char go[3]={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[j]);
                }
                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[i] = x1;
                                list1.x[i] = '+';
                                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[i] = x1;
                                list1.x[i] = '-';
                                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[i] = x1;
                                list1.x[i] = '*';
                                list1.size++;
                        }
                }
        }

        list2.size = list1.size;

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


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

        printf("%d", end);

        return 0;
}


       

最佳答案

查看完整内容

我也是新手 挑战下自己 希望对你有帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-20 13:53:08 | 显示全部楼层
本帖最后由 y290176346 于 2015-10-21 16:50 编辑
  1. #include "stdafx.h"
  2. #include "iostream"
  3. #include "stdio.h"
  4. typedef struct mingling
  5. {
  6.         char zifu[3];
  7.         int shuzi;
  8. };

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

  19.         getchar();
  20.         a=k;
  21.         for (;a>0;a--)      
  22.         {
  23.                 kongge=0;
  24.                 scanf_s("%c",&b,1);
  25.                 i=0;
  26.                
  27.                 for (;b!='\n';)
  28.                 {
  29.                         if (b==' ')
  30.                         {
  31.                                 if (kongge==1)//处理最后一行命令的第二个数字
  32.                                 {
  33.                                        
  34.                                                 scanf_s("%c",&b,1);
  35.                                                 while (b!='\n')
  36.                                                 {
  37.                                                         zongji=zongji*10+(b-48);
  38.                                                         scanf_s("%c",&b,1);
  39.                                                 }
  40.                                                 break;
  41.                                        
  42.                                 }
  43.                                 scanf_s("%c",&b,1);
  44.                                 kongge++;
  45.                         }
  46.                         if (b<=122&&b>=65)//如果是字母 进结构体数组, 如果是数字 进结构体 int 类型
  47.                         {
  48.                                 MLshuzu[a].zifu[i++]=b;
  49.                         }
  50.                         if(b<=57&&b>=48)
  51.                         {
  52.                                 MLshuzu[a].shuzi=MLshuzu[a].shuzi*10+(b-48);
  53.                         }
  54.                        
  55.                
  56.                 scanf_s("%c",&b,1);
  57.        
  58.                 }
  59.                
  60.         }
  61.         for (int i=1;i<=k;i++)//计算 根据字符判断计算方式
  62.         {
  63.                 switch (MLshuzu[i].zifu[0])
  64.                 {
  65.                 case 'A':
  66.                         zongji+=MLshuzu[i].shuzi;
  67.                         continue;
  68.                 case 'S':
  69.                         zongji-=MLshuzu[i].shuzi;
  70.                         continue;
  71.                 case 'M':
  72.                         zongji*=MLshuzu[i].shuzi;
  73.                         continue;
  74.                
  75.                 }
  76.         }

  77.         printf_s("%d", zongji);


  78.         return 0;
  79. }
复制代码
我也是新手 挑战下自己 希望对你有帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-20 14:35:43 | 显示全部楼层
看着像是自己学校平台的ACM试题
有这个题的网页么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-21 01:08:57 | 显示全部楼层
路过......帮顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-10-21 09:55:57 | 显示全部楼层
ryxcaixia 发表于 2015-10-20 14:35
看着像是自己学校平台的ACM试题
有这个题的网页么

你进不去。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-21 13:52:36 | 显示全部楼层
小甲鱼数据结构里面有教写简易计算器的可以看看!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-21 14:42:50 | 显示全部楼层
我的思路就是 吧每行命令  如果是字母 就存入 结构体字符数组,如果是数字 就存入 整形变量 ,数字可以是两位以上, 最后遍历每个结构体数组,根据结构体数组的第一个字符判断是什么运算,最后得出结果,最复杂的是最后一行命令的 两组 数字,我把第二组数字直接存进zongji 变量,来进行运算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-10-22 09:04:10 | 显示全部楼层
y290176346 发表于 2015-10-21 14:36
我也是新手 挑战下自己 希望对你有帮助

你那些前面的库函数声明是怎么回事?VC++里面没有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-22 09:35:12 | 显示全部楼层
我用的是vs2008  你就把主函数 和 输入输出函数 改改就行了 或者直接安装一个vs2008
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-21 16:09:06 | 显示全部楼层
一起研究一下呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-24 16:47:56 | 显示全部楼层
感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-7 15:34:34 | 显示全部楼层
谢谢,学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-18 17:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表