C语言计算器程序设计思路

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.使用C语言的库函数bioskey或getch,根据这些函数的返回值,识别出控制键与一般字符键,作出不同的处理来实现对历史命令的调用。
2.对表达式的预处理:检查括号的配对情况(正确配对,则前括号与后括号的数量相同,否则为不配对,进行出错处理);负号的处理。
3.对负号的处理:
(1)不需要处理的情况是:负号前面是数字,或者后括号。如:5-2,(5+2)-3
(2)错误的情况:缺少操作数,如:sin-2,此时也不进行处理,因为在计算过程中,会检测到缺少操作数
(3)需要处理的情况:即负号是表达式第一个字符,或者负号前面是前括号。如:
2×(-2+3),-2+3。这种情况之所以需要处理,是因为在后面的词法分析中,把负号作为操作符减号进行处理,显然会导致缺少一个操作数的错误。
(4)处理方法:在符合规定的条件下,在负号前面插入一个数0
4.支持的命令:
Set (设置参数)
List (列出缓冲区中的历史命令,可用的系统关键字和操作符,函数,命令)
?或help (帮助)
Clr (清屏)
Quit (退出系统)
File (文件批处理)
5.命令处理框架:
if ( ORDER[0]==keyword)
{
读取关键字队列中第一个元素 str
Switch(str)
{
Case set : set(pExp);break;
Case help : help();break;
Case clear : clrscr();break
Case list : list(); break
……
Default:break
}
}
6.支持的函数:三角函数:sin,cos,tg/tan,ctg
对数函数:ln,lg
7.支持的运算:加法,减法,乘法,除法,乘方,阶乘
8.关于运算符优先级的规定
优先级的定义:
\0
)


×
÷
函数
^
(
!
0
1
2
2
3
3
-4
5
8
9
说明:
(1)运算符 \0 用于和第一个读取的运算符比较,以判断是否该进栈。因为此时运算符栈尚为空,如果不事先压入一个运算符 \0,则会出错;
(2)前括号在任何情况下均进栈,后括号在任何情况下均不进栈
(3)之所以规定函数的优先级为负,是因为函数的运算在优先级相同的情况下,是右结合,而基本的加减乘除在优先级相同的情况下,均为左结合。例如:sincoslg10=sin(cos(lg(10))),该表达式为右结合;1+2+3-4=((1+2)+3)-4,该表达式为左结合。
如果规定了负的优先级数值,则可以判断是左结合还是右结合;
(4)阶乘的优先级最高。任何一个运算符,包括前括号,遇到栈顶为阶乘时,阶乘运算符均要弹出,并进行运算。事实上,前括号遇到栈顶元素为阶乘符号时,表达式已经出错,但是此时没有报错

,留待计算结束,统一处理并报错。
9.对运算优先级的应用和处理:
if (栈顶元素为括号“)”)
error;
if(栈顶元素为前括号“(” && 当前操作符为“\0”)
error;
if(当前元素为前括号“(” || 栈顶元素为前括号“(”)
当前元素进栈;
if(当前运算符优先级的绝对值 > 栈顶元素优先级的绝对值)
当前元素进栈
else
{
if(当前运算符优先级 < 0 && 栈顶运算符优先级 < 0)
当前运算符进栈;
Else
栈顶元素弹出,进行运算;
}
10.计算结束的判断
正确结束的标准:(1)操作符栈为空;(2)数字栈只有一个数字
此时计算的结果即为数字栈中唯一的这个数字




相关文档
最新文档