C语言实现计算器 version 2.

在之前版本中使用栈结构来实现,但由于51单片机不支持malloc函数,所以使用C语言又写了一个计算器版本。

通过数组存放值和操作符模拟栈操作。

实现代码:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <math.h>
  4 #define OK 1
  5 #define ERROR 0
  6 int InputJudge(char c); //判断函数是否为数字
  7 float Calc(char optr, float num1, float num2);
  8 char PriorityJudge(char optr1, char optr2);
  9 int main()
 10 {
 11     char arrayChar[20];
 12     float arrayFloat[20] = {0};
 13     char tempChar, optr, c;
 14     float tempFloat, num1, num2;
 15     int topChar = 0;
 16     int topFloat = 0;
 17     int i;
 18     for (i = 0; i < 20; ++i)
 19     {
 20         arrayChar[i] = ‘0‘;
 21     }
 22     arrayChar[topChar] = ‘#‘;
 23     topChar++;
 24     c = getchar();
 25     while(c != ‘#‘ || arrayChar[topChar - 1] != ‘#‘)
 26     {
 27         if (InputJudge(c))
 28         {
 29             arrayFloat[topFloat] = (float)(c - ‘0‘);
 30             topFloat++;
 31             c = getchar();
 32             /* 当连续输入数字时,计算十位数和百位数 */
 33             while(InputJudge(c))
 34             {
 35                 topFloat--;
 36                 tempFloat = arrayFloat[topFloat];
 37                 arrayFloat[topFloat] = (float)(tempFloat * 10 + (c - ‘0‘));
 38                 topFloat++;
 39                 c = getchar();
 40             }
 41             if (c == ‘.‘)
 42             {
 43                 i = 1;
 44                 c = getchar();
 45                 do
 46                 {
 47                     topFloat--;
 48                     tempFloat = arrayFloat[topFloat];
 49                     tempFloat = tempFloat + ((c - ‘0‘) / pow(10, i));
 50                     i++;
 51                     arrayFloat[topFloat] = tempFloat;
 52                     topFloat++;
 53                     c = getchar();
 54                 }
 55                 while(InputJudge(c));
 56             }
 57         }
 58         else
 59         {
 60             tempChar = arrayChar[topChar - 1];
 61             switch(PriorityJudge(tempChar, c))
 62             {
 63             case ‘<‘:
 64                 arrayChar[topChar] = c;
 65                 topChar++;
 66                 c = getchar();
 67                 break;
 68             case ‘=‘:
 69                 topChar--;
 70                 c = arrayChar[topChar];
 71                 c = getchar();
 72                 break;
 73             case ‘>‘:
 74                 topChar--;
 75                 optr = arrayChar[topChar];
 76                 topFloat--;
 77                 num2 = arrayFloat[topFloat];
 78                 topFloat--;
 79                 num1 = arrayFloat[topFloat];
 80                 arrayFloat[topFloat] = Calc(optr, num1, num2);
 81                 topFloat++;
 82                 break;
 83             }
 84         }
 85     }
 86     while(topFloat != 0)
 87     {
 88         topFloat--;
 89         tempFloat = arrayFloat[topFloat];
 90         printf("%f\n", tempFloat);
 91     }
 92     return OK;
 93 }
 94 float Calc(char optr, float num1, float num2)
 95 {
 96     switch(optr)
 97     {
 98     case ‘+‘:
 99         return (num1 + num2);
100         break;
101     case ‘-‘:
102         return (num1 - num2);
103         break;
104     case ‘*‘:
105         return (num1 * num2);
106         break;
107     case ‘/‘:
108         return (num1 / num2);
109         break;
110     }
111 }
112 int InputJudge(char c)
113 {
114     switch(c)
115     {
116     case ‘0‘:
117     case ‘1‘:
118     case ‘2‘:
119     case ‘3‘:
120     case ‘4‘:
121     case ‘5‘:
122     case ‘6‘:
123     case ‘7‘:
124     case ‘8‘:
125     case ‘9‘:
126         return OK;
127         break;
128     case ‘.‘:
129     case ‘+‘:
130     case ‘-‘:
131     case ‘*‘:
132     case ‘/‘:
133     case ‘(‘:
134     case ‘)‘:
135     case ‘#‘:
136         return ERROR;
137         break;
138     default:
139         break;
140     }
141 }
142 char PriorityJudge(char optr1, char optr2)
143 {
144     int i, j;
145     char priorityTable[7][7] =
146     {
147         {‘>‘, ‘>‘, ‘<‘, ‘<‘, ‘<‘, ‘>‘, ‘>‘},
148         {‘>‘, ‘>‘, ‘<‘, ‘<‘, ‘<‘, ‘>‘, ‘>‘},
149         {‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘<‘, ‘>‘, ‘>‘},
150         {‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘<‘, ‘>‘, ‘>‘},
151         {‘<‘, ‘<‘, ‘<‘, ‘<‘, ‘<‘, ‘=‘, ‘0‘},
152         {‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘0‘, ‘>‘, ‘>‘},
153         {‘<‘, ‘<‘, ‘<‘, ‘<‘, ‘<‘, ‘0‘, ‘=‘}
154     };
155     switch(optr1)
156     {
157     case ‘+‘:
158         i = 0;
159         break;
160     case ‘-‘:
161         i = 1;
162         break;
163     case ‘*‘:
164         i = 2;
165         break;
166     case ‘/‘:
167         i = 3;
168         break;
169     case ‘(‘:
170         i = 4;
171         break;
172     case ‘)‘:
173         i = 5;
174         break;
175     case ‘#‘:
176         i = 6;
177         break;
178     }
179     switch(optr2)
180     {
181     case ‘+‘:
182         j = 0;
183         break;
184     case ‘-‘:
185         j = 1;
186         break;
187     case ‘*‘:
188         j = 2;
189         break;
190     case ‘/‘:
191         j = 3;
192         break;
193     case ‘(‘:
194         j = 4;
195         break;
196     case ‘)‘:
197         j = 5;
198         break;
199     case ‘#‘:
200         j = 6;
201         break;
202     }
203     return priorityTable[i][j];
204 }

时间: 2024-10-28 20:59:30

C语言实现计算器 version 2.的相关文章

c 语言简单计算器源码

//  main.c //  计算器 //  Created by qianfeng on 14-7-15. //  Copyright (c) 2014年 ___FGY___. All rights reserved. //iPhone自带计算器不够好,由于你技术出众,你被安排去开发一款iOS新式计算器. /*项目经理认为计算器第一版要支持表达式求值,所以要求如下: 输入任意表达式 求出他的值(支持负数,不支持小数) 这里支持6种表达式 () * / + - ()优先级最高, * /优先级其次

C语言实现“计算器”

支持 加减乘除 混合运算.具体设计见代码. #include <assert.h> #include <stdio.h> /////////////////////////////////////////////////////////////////////////////// typedef char bool; #define true 1 #define false 0 typedef struct { const char *szExp; int nPos; } Cont

C语言日期计算器

记录下码子 1 # define _CRT_SECURE_NO_WARNINGS 2 # include <stdio.h> 3 # include <stdlib.h> 4 5 int days(int month) 6 { 7 int day; 8 switch (month) 9 { 10 case 1: 11 day = 31; //1月天数 12 break; 13 case 2: 14 day = 29+31; //1+2月天数 15 break; 16 case 3:

1 C语言 gcc 介绍 C 语言编译 main接受参数

1         第一个c语言的hello world 1.1      include头文件包含 头文件包含,写法#include<文件名>, 1.2      main函数 这个就是C语言程序的入口,所有的C程序都是从main开始执行,一个C的源程序必须有一个main函数,也只能有一个main函数 1.3      注释 //注释一行 /* */代表块注释,可以注释多行代码 1.4      {}括号和代码块 代表一个代码单元 1.5      声明 C语言规定,所有的变量和函数必须先声

如何为Linux安装Go语言

导读 Go 语言又称为 golang, 是由 Google 最初开发的一种开源编程语言,其在设计时就遵循了简单.安全和速度的 3 大原则.Go 语言具有多种调试.测试.分析和代码审查工具,如今 Go 语言和工具已在大多数 Linux 发行版本的源库中进行提供,本文我就来说明如何为?Linux 安装 Go 语言. Ubuntu.Debian或Linux Mint安装Go语言 基于 Debian的 Linux 发行版本都可以使用 apt-get 命令来进行安装: sudo apt-get insta

信息安全-3:负数取模[转]

背景 最近在一道 Java 习题中,看到这样的一道题: What is the output when this statement executed:System.out.printf(-7 % 3); 正整数的取余运算大家都很熟悉,但是对于负数.实数的取余运算,确实给人很新鲜的感觉.于是我对此进行了一些探索.我发现,这里面还是颇有一点可以探索的东西的. 探究 首先,看看自然数的取模运算(定义1): 如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = qd +

C++ 备忘录 (1)

取模: 1. 转载自:http://ceeji.net/blog/mod-in-real/ 1 背景 2 3 最近在一道 Java 习题中,看到这样的一道题: 4 5 What is the output when this statement executed: 6 System.out.printf(-7 % 3); 7 8 正整数的取余运算大家都很熟悉,但是对于负数.实数的取余运算,确实给人很新鲜的感觉.于是我对此进行了一些探索.我发现,这里面还是颇有一点可以探索的东西的. 9 10 探究

java第一周总结

计算机语言作为人与计算机之间沟通交流的工具,最早的计算机语言是DOS语言,也叫做计算机母语,随着计算机语言的发展,陆续出现了C语言.c++语言和JAVA语言等等: JAVA语言是在1995年由SUN公司推出,随着JAVA语言的发展,出现了三个分支JAVA EE(企业版).JAVA SE(标准版).J2ME(小型版): jdk:java的开发工具包,提供java的开发工具,包含有jre.javac等等: jre:java的运行环境,保证java在PC机上的运行: javac:java的编译工具,将

java解惑之再探取余

整数无所谓 关键是负数 c++,java的求余: 除数和被除数取绝对值求余,最后的符号跟着除数 如:-7%3=-1:-7%(-3)=-1 Python等, a%b 1.先求tmp=|a|%|b| 2.如果a<0&&b<0,-tmp 3.如果a<0&&b>0,tmp+b 4.如果a>0&&b<0,tmp-b http://ceeji.net/blog/mod-in-real/ 背景 最近在一道 Java 习题中,看到这样的一