简单计算器(非常简便)

Posted yuxiaoba

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单计算器(非常简便)相关的知识,希望对你有一定的参考价值。

题目描述:
    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出:
    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入:
1 + 2
4 + 2 * 5 - 7 / 11
0
样例输出:
3.00
13.36

 

 

解题思路:这道题因为是没有括号的,因而建立一个栈,若遇到加号把数字入栈,若遇到减号则转换为负数后入栈,若遇到乘除则就近直接计算后再把数值写回栈尾。最后再将栈内数字全部相加得到最后的结果。

                    不得不说这样做非常巧妙,不用像传统的做法那样创建一个栈保存运算符,比起王道书上的标准答案代码量也小了很多

 1 #include <stdio.h>
 2 #include<stdlib.h>
 3 
 4 double ans[1002];
 5 int tail;  //尾数下标
 6 
 7 int main()
 8 {
 9     int temp1,temp2;
10     int i;
11     char c1,c2;
12     double ret;
13 
14     while( scanf("%d%c",&temp1,&c2)!=EOF )
15     {
16         if( temp1==0 && c2==\n) break;  //如果输入只有0时结束
17         tail = 0;   //注意每次都要置0
18         ret = 0;    //注意每次都要置0
19         ans[++tail] = 1.0*temp1;  //转换为浮点数
20         while(scanf("%c %d%c",&c1,&temp2,&c2)!=EOF)
21         {
22             if( c1==+)
23             {
24                 ans[++tail] = 1.0*temp2;  //如果是加号直接入栈
25             }
26             else if( c1==-)
27             {
28                 ans[++tail] = -1.0*temp2;  //如果是负号转换为负数再入栈
29             }
30             else if( c1==*)
31             {
32                 ans[tail] *= temp2;   //如果是乘号则更新栈尾数
33 
34             }
35             else if( c1==/&&temp2!=0)
36             {
37                 ans[tail] /= temp2;   //如果是除号则更新栈尾数
38             }
39             else break;
40             if( c2!= ) break;  //如果最后一个字符不是空格则输入结束
41         }
42         for( i=1; i<=tail; i++)
43         {
44             ret += ans[i];   //把栈里头的东西全部加起来,求和
45         }
46         printf("%.2lf\n",ret);
47     }
48 
49     return 0;
50 }

 

以上是关于简单计算器(非常简便)的主要内容,如果未能解决你的问题,请参考以下文章

GLSL片段着色器-绘制简单的粗曲线

简单排序方法

创建自己的代码片段(CodeSnippet)

GLSL片段着色器 - 绘制简单的粗曲线

分享几个实用的代码片段(第二弹)

分享几个实用的代码片段(第二弹)