按要求求一个C语言的计算器。
1.函数概述:此程序可以计算带双括号的公式的结果,如((3+2)*(3+2)+5)*((3+2)*(3+2)+5)*(5+5)=输出结果为9000。
2.源程序:
# include & ltstdio.h & gt
int w;
双B[4][40];
shuru(char *pt)
{
int i=0,m;
做
{
*(pt+I)= getchar();
m = I;
i++;
}
while(*(pt+m)!='=');
*(pt+m)= '+';
*(pt+m+1)= ' = ';
}
tlchli(char *p)
{
int a,b;
if(*p=='-'||*p=='+')
{
for(b = 0;*(p+b)!='=';b++)
;
for(;b & gt=0;b -)
*(p+b+ 1)= *(p+b);
* p = ' 0
}
其他
{
for(a = 1;*(p+a)!='=';a++)
{
if(*(p+a)=='-'||*(p+a)=='+')
{
if(*(p+a-1)= '(' & amp;& amp*(p+a+1)>= ' 0 ' & amp& amp*(p+a+1)& lt;='9')
{
for(b = 0;*(p+a+b)!='=';b++)
;
for(;b & gt=0;b -)
*(p+a+b+ 1)= *(p+a+b);
*(p+a)=“0”;
a =(a+1);
}
}
}
}
}
jgh(双B[4][40],char *p)
{
int a,b,c=0,d,e,f,h,I,k,n,m;
双g=0,j = 0;
for(a = 0;a & lt4;a++)
for(b = 0;b & lt40;b++)
b[a]= 0;
for(d = 0;*(p+d)!='=';d++)
{
if(*(p+d)= = '+' | | *(p+d)= = '-' | | *(p+d)= = ' * ' | *(p+d)= = = '/')
{
if(*(p+d)= = '+')B[3][c]= '+';
if(*(p+d)= = '-')B[3][c]= '-';
if(*(p+d)= = ' * ' B[3][c]= ' * ';
if(*(p+d)= = '/')B[3][c]= '/';
if(*(p+d-1)= ')' & amp;& amp*(p+d-2)== ')')
{
b[0][c]= ')';
b[1][c]= ')';
}
if(*(p+d-1)= ')' & amp;& amp*(p+d-2)!=')')
b[1][c]= ')';
for(e = d-1;*(p+e)& lt;0 ' | | *(p+e)>;'9';e -)
;
for(f = e;*(p+f)!='.'& amp& amp(f & gt0)& amp;& amp*(p+f)>= ' 0 ' & amp& amp*(p+f)& lt;='9';f -)
;
if(*(p+f)== ' . ')
{
for(h = f-1;(h & gt= 0)& amp;& amp*(p+h)>= ' 0 ' & amp& amp*(p+h)& lt;='9';h -)
;
h++;
if(*(p+h-1)= '(' & amp;& amp*(p+h-2)== '(')
{
b[0][c]= '(';
b[1][c]= '(';
}
if(*(p+h-1)= '(' & amp;& amp*(p+h-2)!='(')
b[1][c]= '(';
for(I = h;*(p+i)>= ' 0 ' & amp& amp*(p+I)& lt;='9';i++)
g =(*(p+I)-48)+g * 10.0;
for(k = f+1;*(p+k)>= ' 0 ' & amp& amp*(p+k)& lt;='9';k++)
;
k-;
for(n = k;*(p+n)>= ' 0 ' & amp& amp*(p+n)& lt;='9';n -)
j =(j/10.0+(*(p+n)-48)/10.0);
b[2][c]=(g+j);
g = j = 0;
}
其他
{
for(m = e;*(p+m)>= ' 0 ' & amp& amp*(p+m)& lt;='9';m-);
m++;
if(*(p+m-1)= '(' & amp;& amp*(p+m-2)== '(')
{
b[0][c]= '(';
b[1][c]= '(';
}
if(*(p+m-1)= '(' & amp;& amp*(p+m-2)!='(')
b[1][c]= '(';
for(I = m;*(p+i)>= ' 0 ' & amp& amp*(p+I)& lt;='9';i++)
g =(*(p+I)-48)+g * 10.0;
b[2][c]= g;
g = 0;
}
c++;
}
}
w =(c-1);
}
qkh1(双B[4][40])
{
int a=1,b,c,d,e,f,j,k;
for(b = 0;b & ltw;b++)
{
if(B[a]== '(')
{
for(c = b;B[a][c]!=')';c++)
;
for(d = b+ 1;B[a][d]!= '(' & amp;& ampd & ltc;d++)
;
if(B[a][d]== '(')
k = d;
其他
k = b;
b[a][k]= 0;b[a][c]= 0;
for(e = k;e & ltc;e++)
{
if(B[3][e]=='* ')
{
B[2][e+1]= B[2][e]* B[2][e+1];
if(B[3][e-1]= = '-' & amp;& amp(e & gt0))
{
b[2][e]= 0;
b[3][e]= '-';
}
其他
{
b[2][e]= 0;
b[3][e]= '+';
}
}
if(B[3][e]=='/')
{
B[2][e+1]= B[2][e]/B[2][e+1];
if(B[3][e-1]= = '-' & amp;& ampe & gt0)
{
b[2][e]= 0;
b[3][e]= '-';
}
其他
{
b[2][e]= 0;
b[3][e]= '+';
}
}
}
for(f = k;f & ltc;f++)
{
if(B[3][f]=='+')
{
B[2][f+1]= B[2][f]+B[2][f+1];
b[2][f]= 0;b[3][f]= '+';
}
if(B[3][f]=='-')
{
B[2][f+1]= B[2][f]-B[2][f+1];
b[2][f]= 0;b[3][f]= '+';
}
}
b = c-1;
if(B[3][k-1]= = ' * ' & amp;& ampk & gt0)
{
for(;k & ltc;k++)
{
b[3][k]= ' * ';
b[2][k]= 1.0;
}
}
if(B[3][k-1]= = '/' & amp;& ampk & gt0)
{
for(;k & ltc;k++)
{
b[3][k]= '/';
b[2][k]= 1.0;
}
}
}
}
for(j = 0;j & lt= w;j++)
{
if(B[1][j]!= '(' & amp;& ampB[1][j]!=')')
B[1][j]= B[0][j];
}
}
qkh2(双B[4][40])
{
int a,b,c,d,e,f,j;
for(b = 0;b & ltw;b++)
{
if(B[1]== '(')
{
for(c = b;B[1][c]!=')';c++)
;
b[1]= 0;b[1][c]= 0;
for(e = b;e & ltc;e++)
{
if(B[3][e]=='* ')
{
B[2][e+1]= B[2][e]* B[2][e+1];
if(B[3][e-1]= = '-' & amp;& amp(e & gt0))
{
b[2][e]= 0;
b[3][e]= '-';
}
其他
{
b[2][e]= 0;
b[3][e]= '+';
}
}
if(B[3][e]=='/')
{
B[2][e+1]= B[2][e]/B[2][e+1];
if(B[3][e-1]= = '-' & amp;& amp(e & gt0))
{
b[2][e]= 0;
b[3][e]= '-';
}
其他
{
b[2][e]= 0;
b[3][e]= '+';
}
}
}
for(f = b;f & ltc;f++)
{
if(B[3][f]=='+')
{
B[2][f+1]= B[2][f]+B[2][f+1];
b[2][f]= 0;b[3][f]= '+';
}
if(B[3][f]=='-')
{
B[2][f+1]= B[2][f]-B[2][f+1];
b[2][f]= 0;b[3][f]= '+';
}
}
if(B[3][B-1]= = ' * ' & amp;& ampb & gt0)
{
for(;b & ltc;b++)
{
b[3]= ' * ';
b[2]= 1.0;
}
}
if(B[3][B-1]= = '/' & amp;& ampb & gt0)
{
for(;b & ltc;b++)
{
b[3]= '/';
b[2]= 1.0;
}
}
}
}
}
jshjg(双B[4][40])
{
int b,d,e,f;
for(e = 0;e & ltw;e++)
{
if(B[3][e]=='* ')
{
B[2][e+1]= B[2][e]* B[2][e+1];
if(B[3][e-1]= = '-' & amp;& ampe & gt0)
{
b[2][e]= 0;
b[3][e]= '-';
}
其他
{
b[2][e]= 0;
b[3][e]= '+';
}
}
if(B[3][e]=='/')
{
B[2][e+1]= B[2][e]/B[2][e+1];
if(B[3][e-1]= = '-' & amp;& ampe & gt0)
{
b[2][e]= 0;
b[3][e]= '-';
}
其他
{
b[2][e]= 0;
b[3][e]= '+';
}
}
}
for(f = 0;f & ltw;f++)
{
if(B[3][f]=='+')
{
B[2][f+1]= B[2][f]+B[2][f+1];
b[2][f]= 0;b[3][f]= '+';
}
if(B[3][f]=='-')
{
B[2][f+1]=(B[2][f]-B[2][f+1]);
b[2][f]= 0;b[3][f]= '+';
}
}
}
shuchu(双B[4][40],char *p)
{
printf("答案%f\n ",B[2][w]);
}
主()
{
char *p,A[100];
舒如(一);
p = & ampa[0];
tlchli(p);
jgh(B,p);
qkh 1(B);
qkh 2(B);
jshjg(B);
舒初(B,p);
}
#包含" string.h "
#包含“graphics.h”
#包含“conio.h”
#包含“dos.h”
#包含“time.h”
#包含" stdlib.h "
#包含“stdio.h”
#包含“math.h”
/*调用一系列库函数*/
int py/*定义一个全局变量*/
Void mode(int py)/*mode函数,用于设置和使用计算器的各种运算功能*/
{ double x1,x2,ans,ans 2;
if(py & lt;11)
{ printf("input x1,x2:");
scanf("%lf,%lf ",& ampx1。x2);}
else { printf(" input x:");scanf("%lf ",& ampx 1);}
开关(py)
{案例6:ans = x 1+x2;printf("=%.3lf ",ans);打破;
情况7:ans = x 1-x2;printf("=%.3lf ",ans);打破;
情况8:ans = x 1 * x2;printf("=%.3lf ",ans);打破;
情况9:ans = x 1/x2;printf("=%.3lf ",ans);打破;
案例10 : ans=pow(x1,x2);printf("x^%.1lf=%.3lf",x2,ans);打破;
case 11:ans = sqrt(x 1);printf("=%.3lf ",ans);打破;
案例12:ans = sin(x 1);ans2 = cos(x 1);printf("sin x=%.3lf,cos x=%.3lf ",ans,ans 2);打破;
案例13:ans = asin(x 1);ans 2 = acos(x 1);printf("asin x=%.3lf,acos x=%.3lf ",ans,ans 2);打破;
}
getch();clr SCR();
}
Int join(char *ps) /*join函数是输入用户名和密码,可以匹配注册用户。注册用户可以使用高级功能*/
{ char name[30],pass[20];
int len,I;
printf(" ID:");
scanf("%s ",名称);
printf(" \ n pass word:");
scanf("%s ",通过);
clr SCR();
for(I = 0;我& ltstrlen(PS);i++)
if(pass[i]!=*(ps+i))返回0;
返回1;
}
int menu(int pass)/*菜单功能,menu */
{ int py = 6;char key = 0;
gotoxy(1,4);
printf(" MENU \ n \ n ");
printf(" ADD+\ n ");
printf(" SUB-\ n ");
printf(" MUL * \ n ");
printf(" DIV/");
gotoxy(10,6);printf(" & lt;-");
if(pass) {gotoxy(1,10);printf(" inv ^\n ");
printf(" EVO ~ \ n ");
printf(" SIN COS \ n ");
printf("阿辛·ACOS \ n ");
printf(" modify \ n ");
printf(" QUIT ");}
else {gotoxy(1,10);printf(" QUIT ");}
而(键!=13) /*以下是控制选择箭头位置的所有语句*/
{ key = getch();
开关(钥匙)
{案例80 : gotoxy(10,py);printf(" ");如果(!通过)py = py % 5+6;else { ++ py;if(py = = 16)py = 6;}破;
案例72 : gotoxy(10,py);printf(" ");-py;if(py = = 5)py = 10+5 *通过;打破;
}
gotoxy(10,py);printf(" & lt;-");
}
返回py;
}
Main() /*主函数,关于函数分配和启动动画的语句*/
{ int gd=DETECT,gm,x=320,y=10,I,l=10,h=10,t,co=3,v = 0;
int pass
FILE * fpchar PS[20];
init graph(& amp;gd,& ampgm,“”;/*初始化图形模式*/
registerbgidriver(EGA VGA _ driver);
for(I = 1;我& lt31;co=(co++%10),v++,y++ = 2+v,i++)
{ delay(9e 10);clear device();
set color(co);
setfillstyle(1,co);
扇形(x,y,0,360,l,h);/*画一个圆*/
}
for(I = 1;我& lt300;i++)
{ set color(I % 10);
circle(x,y,I);
延时(1000);/*延迟*/
}
clear device();/*清空屏幕*/
closegraph();
fp=fopen("file1 "," r ");
if(FP = = NULL)pass = 1;
else {fgets(ps,20,FP);
pass = join(PS);}
LD:py =菜单(pass);
if(py = = pass * 5+10){ clrscr();printf("拜拜!");getch();返回0;}
else if(py!= 14){ clrscr();模式(py);} else { fp=fopen("file1 "," w ");
printf(" \ n pass word:");
scanf("%s ",PS);
fputs(ps,FP);
fclose(FP);getch();clr SCR();
}
goto ld/*函数内跳转*/
}
# include & ltstdio.h & gt/*库函数*/
结构节点
{
int数据;
struct s _ node * next
};
typedef结构s _ node s _ list
typedef s _ list * link
链接运算符= NULL
链接操作数= NULL
链接推送(链接堆栈,int值)
{
链接newnode
new node =(link)malloc(sizeof(s _ list));
如果(!新节点)
{
printf(" \ n内存分配失败!!!");
返回NULL
}
新节点-& gt;数据=值;
新节点-& gt;next =堆栈;
stack = newnode
返回堆栈;
}
链接弹出(链接栈,int *value)
{
链接顶部;
如果(堆栈!=空)
{
top =堆栈;
stack = stack-& gt;接下来;
* value = top-& gt;数据;
免费(上);
返回堆栈;
}
其他
* value =-1;
}
int empty(链接栈)
{
if(stack==NULL)
返回1;
其他
返回0;
}
int is_operator(字符运算符)
{
开关(操作员)
{
大小写'+':大小写'-':大小写' * ':大小写'/':返回1;
默认值:返回0;
}
}
int优先级(字符运算符)
{
开关(操作员)
{
大小写'+':大小写'-':返回1;
case“*”:case“/”:返回2;
默认值:返回0;
}
}
int two_result(int operator,int operand1,int operand2)
{
开关(操作员)
{
case '+':return(operand 2+operand 1);
case '-':return(operand 2-operand 1);
case ' * ':return(operand 2 * operand 1);
case '/':return(operand 2/operand 1);
}
}
void main()
{
char表达式[50];
int position = 0;
int op = 0;
int operand 1 = 0;
int operand 2 = 0;
int evaluate = 0;
printf(" \ n请输入顺序表达式:");
gets(表达式);
while(表情[位置]!= ' \ 0 ' & amp& amp表情[位置]!='\n ')
{
if(is_operator(表达式[位置]))
{
如果(!空(运算符))
while(优先级(表达式[位置])& lt;=优先级(运算符-& gt;数据);& amp
!空(运算符))
{
操作数=pop(操作数& ampoperand 1);
操作数=pop(操作数& amp操作2);
运算符=pop(运算符& ampop);
操作数=push(操作数,two_result(op,operand1,operand 2));
}
运算符=push(运算符,表达式[位置]);
}
其他
操作数=push(操作数,表达式[位置]-48);
position++;
}
而(!空(运算符))
{
运算符=pop(运算符& ampop);
操作数=pop(操作数& ampoperand 1);
操作数=pop(操作数& amp操作2);
操作数=push(操作数,two_result(op,operand1,operand 2));
}
操作数=pop(操作数& amp评估);
printf("表达式[%s]结果为' %d ' ",表达式,求值);
getch();
}