C语言 计算器Word文档格式.docx
- 文档编号:18234667
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:13
- 大小:17.39KB
C语言 计算器Word文档格式.docx
《C语言 计算器Word文档格式.docx》由会员分享,可在线阅读,更多相关《C语言 计算器Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
//运算符进栈
voidpush_ovs(doublex);
//操作数进栈
charpop_ops();
//运算符出栈
doublepop_ovs();
//操作数出栈
chargettop_ops();
//取出运算符栈顶元素
doublegettop_ovs();
//取出操作数栈顶元素
voidinistack_ops();
//初始化运算符栈
voidinistack_ovs();
//初始化操作数栈
charPrecede(chart1,chart2);
//判断t1与t2的优先级别
intchar_In(charc);
//判断c是否为运算符
doubleOperate(doublea,chartheta,doubleb);
//对出栈的两个数计算
doubleEvaluateExpression();
//使用算符优先算法进行算术表示式求值
//ops[]为运算符栈,ovs[]为操作数栈
intmain(intargc,char*argv[])
{doublex;
while
(1)/*循环进行计算器*/
{printf("
请输入算术表达式,以回车结束\n"
);
x=EvaluateExpression();
printf("
通信0801李胜博的计算器\n答案="
if(ops_top!
=0||ovs_top!
=0)
{printf("
error"
}
else
%f\n"
x);
}/*如果栈内还有东西则输出错误*/
}
voidpush_ops(charx)//运算符进栈
{
if(ops_top==MAXSIZE-1)
{
运算符栈已满!
上溢\n"
exit
(1);
{
ops_top++;
ops[ops_top]=x;
voidpush_ovs(doublex)//操作数进栈
if(ovs_top==MAXSIZE-1)
操作数栈已满!
}
ovs_top++;
ovs[ovs_top]=x;
charpop_ops()//运算符出栈
chary;
if(ops_top==-1)
运算符栈空!
下溢\n"
y=ops[ops_top];
ops_top--;
returny;
doublepop_ovs()//操作数出栈
doubley;
if(ovs_top==-1)
操作数栈空!
exit
(1);
y=ovs[ovs_top];
ovs_top--;
chargettop_ops()//取出运算符栈顶元素
if(ops_top!
=-1)
returnops[ops_top];
printf("
取数时运算符栈已空\n"
doublegettop_ovs()//取出操作数栈顶元素
if(ovs_top!
returnovs[ovs_top];
取数时操作数栈已空\n"
voidinistack_ops()//初始化运算符栈
ops_top=-1;
voidinistack_ovs()//初始化操作数栈
ovs_top=-1;
charPrecede(chart1,chart2)//判断t1与t2的优先级别
charf;
switch(t2)
case'
+'
:
-'
if(t1=='
('
||t1==END)
f='
<
'
;
else
>
break;
*'
/'
||t1=='
elsef='
z'
f'
/*符号的优先级高于加减乘除*/
)'
)
^'
/*优先级来参考卡西欧计算器*/
!
printf("
运算符error1\n"
switch(t1)
case'
='
break;
caseEND:
运算符错误2\n"
exit
(1);
default:
caseEND:
f='
运算符错误3\n"
returnf;
intchar_In(charc)//判断c是否为运算符
switch(c)
/*定义了负数符号*/
return1;
default:
return0;
doubleOperate(doublea,chartheta,doubleb)//对出栈的两个数计算
{inti;
doublec;
switch(theta)//theta为运算符
/*幂指数的算法么,能计算正负数的指数,不能计算分式的指数*/
c=1;
if(b>
0){for(i=0;
i<
b;
i++)
{c=c*a;
}}
elseif(b==0){c=1;
elsefor(i=0;
i>
i--)
{c=c/a;
/*阶乘的算法*/
c=1;
for(i=1;
=b;
{c=i*c;
c=a+b;
//输出0-9的ASCII码
c=a-b;
c=a*b;
c=a/b;
break;
returnc;
doubleEvaluateExpression()
//ops[]为运算符栈,ovs[]为操作数栈
doublea,b,c,d,e,f,g,h,x,temp1,temp2,temp3,n;
charstack_x,theta,input_c;
inti=0;
charstr[100];
inistack_ops();
push_ops(END);
//使结束符进栈
inistack_ovs();
while((str[i]=getchar())!
)/*字符串输入下面顺序输出(可以观察‘-’和其他字符的相对位置)*/
{if(str[i]=='
{if(str[i-1]>
0'
&
str[i-1]<
9'
||str[i-1]=='
);
elsestr[i]='
}/*定义了一个“f”字符作为负号(同时设置优先级和判断字符)*/
if(str[i]=='
if(str[i-1]=='
)str[i]='
.'
)/*连续输入小数点时显示为错*/
if(str[i-1]=='
x'
)
/*定义了一个“z”字符作为正号(同时设置优先级和判断字符)*/
}
i++;
if(i==1)str[i-1]='
/*单个字输入的时候显示错误*/
str[i]='
i=0;
input_c=str[i];
i++;
stack_x=gettop_ops();
while(input_c!
=END||stack_x!
=END)//判断计算是否结束
if(char_In(input_c))//若输入的字符是9种运算符之一
{
switch(Precede(stack_x,input_c))
{
case'
push_ops(input_c);
//若栈顶(x)优先级<
输入则输入进栈
input_c=str[i];
stack_x=pop_ops();
//相等则出栈,即脱括号接受下一个字符
theta=pop_ops();
if(theta=='
{b=pop_ovs();
b=0-b;
push_ovs(b);
elseif(theta=='
b=0+b;
)/*阶乘计算时要另设一个a=1*/
{a=1;
b=pop_ovs();
push_ovs(Operate(a,theta,b));
else{
b=pop_ovs();
a=pop_ovs();
elseif(input_c>
input_c<
)//input_c是操作数
input_c=input_c-'
push_ovs(input_c);
input_c=str[i];
while(input_c>
{/*把连续输入的字符前面一位提出来*10+后面那位*/
c=pop_ovs()*10;
d=input_c-'
e=c+d;
push_ovs(e);
}
elseif(input_c=='
)/*小数点后一位把最后输入那个数/10在相加返回到栈*/
{input_c=str[i];
n=0;
n++;
x=pow(10,n);
f=pop_ovs();
g=(double)(input_c-'
)/x;
h=f+g;
push_ovs(h);
非法字符\n"
stack_x=gettop_ops();
return(gettop_ovs());
/*还可以调用math.h,排完优先级之后把相应三角函数,开根号给编出来。
。
应为时间仓促。
没来得及编写,请老师见谅*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言 计算器 语言