C语言实现计算器 version 2.
Posted Hugh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于C语言实现计算器 version 2.的主要内容,如果未能解决你的问题,请参考以下文章