用C语言编译一个简单计算器的程序,要求其中有括号和幂函数

请各位高手帮忙编译一个简单计算器的程序,可以运行加减乘除,括号和幂函数
谢啦
请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。要求:
①从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志。
②输入表达式中的数值均为大于等于零的整数。中间的计算过程如果出现小数也只取整。
例如,输入:4+2*5= 输出:14
输入:(4+2)*(2-10)= 输出:-48
谢谢大家啦

既然大家都没发程序,I am coming.
说明:由于幂的运算应该比括号低比乘除要高,所以为避免混淆用幂运算时用括号括起来,比如2+9/3^2-5表示2+(9/3)^2-5,要是想要9除以3^2,这样输入:2+9/(3^2)-5,以免引起歧义。
程序功能强大代码简练。可以对任意数值类型计算,这里全部按double型处理,程序还可以使用大括号{}中括号[]小括号()三种括号,当然优先级是小括号>中括号>大括号>运算符。
要是只想结果取整,将所有double类型改为int即可,不过不主张这样做,既然是计算器,当然要精确计算。
一个完整的c程序如下,程序在win-tc和Dev-c++下都调试通过。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

char s[201];/*全局变量s[]与i分别表示算术表达式字符串以及其当前位置指针变量*/
int i=0;
double proc1(char ch);
void proc2(double *a,char *c);

void str_read(double *a,char *c) /*读取下一个操作数*/
{ int j=0;
char s1[30];
while ((s[i]!='\0')&&(s[i]!='+')&&(s[i]!='-')&&(s[i]!='(')&&(s[i]!=')')
&&(s[i]!='=')&&(s[i]!='^')&&(s[i]!='*')&&(s[i]!='/')&&(s[i]!='[')&&(s[i]!=']')
&&(s[i]!='{')&&(s[i]!='}')) /*操作数结束标志*/
s1[j++]=s[i++];
s1[j]='\0';
*a=atof(s1);
*c=s[i++];
}

void input_str() /*表达式接收模块*/
{ int j,k,t=0;
char c,s1[80];
printf("\n请输入任一算术表达式:\n");
while (!t)
{ gets(s);
j=k=0; t=1;
while ((s[j]!='=')&&(s[j]!='\0')&&(t)) /*判断括号配对*/
{if ((s[j]=='(')||(s[j]=='[')||(s[j]=='{'))
switch(s[j])
{ case '(':s1[k++]=')';break;
case '[':s1[k++]=']';break;
case '{':s1[k++]='}';
}
else if ((s[j]==')')||(s[j]==']')||(s[j]=='}'))
if (s1[--k]!=s[j])
{ printf("输入出错!请重新输入(直接回车退出):\n");
t=0;
}
j++;
}
if ((k!=0)&&(t))
{printf("输入出错!请重新输入(直接回车退出):\n");
t=0;
}
}
}

void proc2(double *a,char *c)
/*算术运算符之后只有两种情况:要么是各种左括号,要么是操作数*/
{ char ch;
if ((s[i]=='(')||(s[i]=='[')||(s[i]=='{'))
{ switch(s[i])
{ case '(':ch=')';break;
case '[':ch=']';break;
case '{':ch='}';
}
++i;
*a=proc1(ch);
/*计算从当前左括号开始到与其相对应的右括号结束这段表达式的值*/
*c=s[i++]; /*跳过右括号*/
}
else str_read(a,c); /*读取一个操作数*/
}

double proc1(char ch)
/*该过程对算术表达式s从当前位置s[i]开始到表达式结束或s[i]==ch这部分进行求值*/
{ double a1=0,a2,a=0;
char c1='+',c='+',c2='+';
/*给表达式前面加上"0+"(第一操作数与第一操作符)*/
while((c!='=')&&(c!='\0')&&(c!=ch))
{ proc2(&a,&c); /*读取第二操作数与第二操作符.*/
while (c=='^' || c=='*' || c=='/')
{ proc2(&a2,&c2); /*读取第三操作数与第三操作符.*/
switch (c) /*对第二操作符进行运算*/
{ case '*':a=a*a2; break;
case '/':a=a/a2; break;
case '^':a=pow(a,a2);
}
c=c2; /*把第三操作符赋给第二操作符变量*/
}
switch (c1) /*对第一操作符进行运算*/
{ case '+':a1=a1+a;break;
case '-':a1=a1-a;
}
c1=c; /*把第二操作符赋给第一操作符变量*/
}
return(a1); /*返回这部分表达式的值*/
}

int main(void)
{ system("cls");
input_str();
if (s[0]=='\0') return 0;
printf("该表达式的值是: ");
printf("%-8f\n",proc1('\0'));
system("pause");
return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-03-24
写好了

不能算小数,根据你的题意来的,如果输入小数,则只取整数部分运算,结果不能为负数

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int deal(int op1,int op2,char op) //运算
{
switch(op)
{
case '+': op1 += op2; break;
case '-': op1 -= op2; break;
case '*': op1 *= op2; break;
case '/': op1 /= op2; break;
case '^':
{
int temp = op2;
for(int i = 1; i < op2 - 1; i++)
op1 *= temp;
break;
}
}
return op1;
}
char *replace(char *source, char *sub, char *rep) //字符串替换
{
char *result;
char *pc1, *pc2, *pc3;
int isource, isub, irep;
isub = strlen(sub);
irep = strlen(rep);
isource = strlen(source);
if(NULL == *sub)
return strdup(source);
result = (char *)malloc(( (irep > isub) ? (float)strlen(source) / isub* irep+ 1:isource ) * sizeof(char));
pc1 = result;
while(*source != NULL)
{
pc2 = source;
pc3 = sub;
while(*pc2 == *pc3 && *pc3 != NULL && *pc2 != NULL)
pc2++, pc3++;
if(NULL == *pc3)
{
pc3 = rep;

while(*pc3 != NULL)
*pc1++ = *pc3++;
pc2--;
source = pc2;
}
else
*pc1++ = *source;
source++;
}
*pc1 = NULL;
return result;
}

int main()
{
char s[1000],op1[100],op2[100],*p,*temp,*back;
scanf("%s",&s);
temp = s;
back = s;
int pos = -1;
int fin,oper1,oper2,tmp, size;
char op;
while(1)
{
size = (int)strlen(temp);
for(int i = 0; i < size; i++,temp++)
{
if( *temp == '(')
{
p = (temp + 1);
pos =(i + 1); //找出最后一个(的位置
}
}
int k = 0;
if(pos != -1)
{
temp = back;
tmp = pos;
while(*p != ')')
{
p++;
tmp++;
if( *p == '*' || *p == '/')
{
tmp--;
for(;(temp[tmp] >= '0' && temp[tmp] <= '9') || temp[tmp] == '.';)
{
tmp--;
break;
}
}
else
continue;
}
if(tmp != pos && *p != ')')
{
pos = ++tmp;
}
int start = pos;
while( temp[pos] >= '0' && temp[pos] <= '9')
{
op1[k] = temp[pos];
pos++;
k++;
}
op1[k] = '\0';
while((temp[pos] >= '0' && temp[pos] <= '9') || temp[pos] == '.')
pos++;
op = temp[pos];
oper1 = atoi(op1);
pos++;
k = 0;
while( temp[pos] >= '0' && temp[pos] <= '9')
{
op2[k] = temp[pos];
pos++;
k++;
}
op2[k] = '\0';
while((temp[pos] >= '0' && temp[pos] <= '9') || temp[pos] == '.')
pos++;
oper2 = atoi(op2);
int end;
if( temp[pos] != ')')
end = --pos;
else
{
if(temp[start-1] == '(')
{
end = pos;
start--;
}
}
char rep[100];
k = 0;
for(; start <= end; start++,k++)
{
rep[k] = temp[start];
}
rep[k] = '\0';
fin = deal(oper1,oper2,op);
char final[100];
itoa(fin,final,10);
temp = replace(temp,rep,final);
back = temp;
pos = -1;
p = temp;
k = 0;
*rep = NULL;
*final = NULL;
printf("%s\n",replace(temp,rep,final));
}
else
{
temp = back;
p = temp;
tmp = pos;
while(*p != '\0')
{
p++;
tmp++;
if( *p == '*' || *p == '/')
{
tmp--;
for(;(temp[tmp] >= '0' && temp[tmp] <= '9') || temp[tmp] == '.';)
{
tmp--;
break;
}
}
else
continue;
break;
}
if(tmp != pos && tmp != (int)strlen(temp)-1)
{
pos = ++tmp;
}
else
pos = 0;
int start = pos;
while( temp[pos] >= '0' && temp[pos] <= '9')
{
op1[k] = temp[pos];
pos++;
k++;
}
while((temp[pos] >= '0' && temp[pos] <= '9') || temp[pos] == '.')
pos++;
op1[k] = '\0';
op = temp[pos];
oper1 = atoi(op1);
pos++;
k = 0;
while( temp[pos] >= '0' && temp[pos] <= '9')
{
op2[k] = temp[pos];
pos++;
k++;
}
op2[k] = '\0';
while((temp[pos] >= '0' && temp[pos] <= '9') || temp[pos] == '.')
{
pos++;
if(pos >= (int)strlen(temp))
break;
}
oper2 = atoi(op2);
int end = --pos;
char rep[100] = {'\0'};
k = 0;
for(; start <= end; start++)
{
rep[k] = temp[start];
k++;
}
fin = deal(oper1,oper2,op);
char final[100];
itoa(fin,final,10);
temp = replace(temp,rep,final);
back = temp;
for(k = 0; k < (int)strlen(temp); k++)
{
if(temp[k] < '0' || temp[k] > '9' && temp[k] != '.')
break;
}
if(k == (int)strlen(temp))
break;
pos = -1;
p = temp;
k = 0;
printf("%s\n", temp);
}
}
printf("%d\n",fin);
return 0;
}本回答被提问者采纳
第2个回答  2009-03-27
这个实在有点麻烦,但是不难!!!
曾经做过一个,是用C写的图形界面计算器.....
可运算 符点型数据,带括号,乘方............
另外,还带有 排错功能,错误的式子能辨别出..
这是我学C后的课程设计.......可以去看看,有源码,如果不要图形,就把图形那部分删掉,大概有500多行....

在 QQ787052538 空间里...
第3个回答  2009-03-20
计算器和括号有什么关系??如果你是想仿一个windows的计算器,那就不是一个“简单”的计算器。考虑括号太烦了。。。
第4个回答  2009-03-20
篮灵儿

题意不清

“可以运行括号和幂函数”是什么意思

用C语言编译一个简单计算器的程序,要求其中有括号和幂函数
char c,s1[80];printf("\\n请输入任一算术表达式:\\n");while (!t){ gets(s);j=k=0; t=1;while ((s[j]!='=')&&(s[j]!='\\0')&&(t)) \/*判断括号配对*\/ {if ((s[j]=='(')||(s[j]=='[')||(s[j]=='{'))switch(s[j]){ case '(':s1[k++]=')'...

C语言中的幂函数··
功能:计算x的y次幂。 说明:x应大于零,返回幂指数的结果。 举例: \/\/ pow.c #include <stdlib.h> #include <math.h> #include <conio.h> void main() { printf("4^5=%f",pow(4.,5.)); getchar(); } 相关函数:pow10 本回答由提问者推荐 举报| 答案纠错 | 评论 8 18 agtim62 采纳率:27%...

C语言简单计算,三角函数,四则运算,幂函数,指数函数
1.函数名:abs原型:int abs(int i);功能:求整数的绝对值。例如,设x=abs(5),y=abs(–5),z=abs(0),则x=5,y=5,z=0。2.函数名:labs原型:long labs(long n);功能:求长整型数的绝对值。例如,设x=labs(40000L),y=labs(–5),z=labs(0),则x=40000,y=5,z=0。3...

大神帮忙用c语言编一个程序计算一个物理公式
b = (u*r*r*n*i)\/2.0\/ pow(r*r+x*x,1.5);printf("b=%lf", b);return 0;} 输入 110 和 0 输出 b=0.001428 请注意物理量的单位,根据单位,自己调整一下程序。pow() 是 幂函数计算。

C语言中,对一个初学者来说,如何编一个幂函数程序
用循环,循环次数为n,每循环一次就再乘以一个(1+r)即可。要用静态变量来记录乘积。

如何用c语言来表示一个指数?
1、直接用浮点数表示:10的N次方为 1e10 也可写成1e+10(如果是负N次方的话就把加号变成减号)。e大小写都可以,需要注意的是e前面必须有一个数字,不然的话就非法表达。2、用幂函数表示:在c语言中,求x的y次方可用pow(x,y)表示,所以10的N次方也可表示为pow(10,N)。其中pow函数在头文件...

c语言简单程序 想求2的2次方 可是我写的程序结果是零 求指点 新手_百度...
你那个符号不是幂函数符号,他表示两个数取异或,现将两个数转化为二进制数码,两个2转化之后每一位对应都是一样的,得到的结果就是每一位都是0,最后结果就是0了嘛。例如转化之后是 0000 0010 ^ 0000 0010 --- 得到 0000 0000 (每一位对应作异或运算,相同则为0,不同则为1.) 最后结...

学生必看的计算机C语言重要考点
第一章 C 语言基本知识 [考点 1]C程序 用C语言编写的程序称为C语言源程序,源程序文件的后缀名为“.c”。源程序经编译后生成后级名为“obi”的目标文件,再把目标文件与各种库函数连接起来,生成“.exe”可执行文件。C语言有种基本结构:顺序结构、选择结构、循环结构 [考点 2] main 函数 又称主函数,是C程序...

用C语言求平方根的问题
64.编写计算器程序。用户输入运算数和四则运算符,输出计算结果。(用swith语句,需要3个变量,一个是字符型变量存放运算符,两个用于运算的整型变量)65.void main()66.{ 67. int a,b,d;68.69. char c;70. printf("Please input operator\\nFor example '+' '-' '*' '\/'\\n");71. ...

C语言头文件的问题
本分类给出了各种数学计算函数,必须提醒的是ANSI C标准中的数据格式并不符合IEEE754标准,一些C语言编译器却遵循IEEE754(例如frinklin C51)头文件 math.h 函数列表 函数类别 函数用途 详细说明 错误条件处理 定义域错误(函数的输入参数值不在规定的范围内)值域错误(函数的返回值不在规定的范围内)三...

相似回答