📄 3.c
字号:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <process.h>
#include <string.h>
#define N 100
double numStack[N]={0};
int numTop;
char opStack[N];
int opTop;
int op(char ch)
{
if(ch=='+'||ch=='-') return 2;
if(ch=='*'||ch=='/') return 3;
if(ch=='(') return -1;
return 0;
}
double result(double num1,char op,double num2)
{
if(op=='+') return num1+num2;
if(op=='-') return num1-num2;
if(op=='*') return num1*num2;
if(op=='/') return num1/num2;
return 0;
}
int compute(char str[])
{
double num=0;
int i=0,j=1,k=1;
int Flag=0;
numTop=opTop=0;
while(str[i]!='\0'||opTop>0)
{
if(str[i]>='0'&&str[i]<='9')
if(Flag==0)
num=num*10+str[i]-'0';
else
{
num+=(str[i]-'0')/(j*10.0);
j*=10;
}
else
if(str[i]=='.')
Flag=1;
else
if( k==1&&str[i]=='-'&&(i==0||op(str[i-1])) )
k=-1;
else
{
if(i>0&&!op(str[i-1])&&str[i]!='('&&str[i-1]!=')')
{
numStack[numTop++]=num*k;
num=0; j=1; Flag=0; k=1;
}
if(opTop==0||str[i]=='(')
opStack[opTop++]=str[i];
else
if(str[i]==')')
{
while(opTop>0&&opStack[--opTop]!='(')
{
numStack[numTop-2]=result(numStack[numTop-2],opStack[opTop],numStack[numTop-1]);
numTop--;
}
if(opStack[opTop]!='(') return 0;
}
else
{
if(str[i]=='\0'&&numTop==0) return 0;
while(opTop>0&&op(str[i])<=op(opStack[opTop-1]))
{
numStack[numTop-2]=result(numStack[numTop-2],opStack[--opTop],numStack[numTop-1]);
numTop--;
}
if(str[i]!='\0')
opStack[opTop++]=str[i];
}
}
if(str[i]!='\0')
i++;
}
if(numTop!=1||opTop!=0)
return 0;
return 1;
}
void face()
{
system("cls");
printf("__________________________________________________________________\n");
printf(" Save number(S) | Read number(R) | Clear(C) | Equal(E) | Quit(Q) \n");
printf("------------------------------------------------------------------\n");
}
main()
{
int i=0,j=0,k;
char str[N]="\0";
char num[N]="\0";
char save[N]="\0";
char ch;
double temp;
unsigned long temp2;
face();
printf("input an expression,press key 'E' to compute\n");
ch=getch();
while( 1 )
{
if(ch=='.'||ch==')'||op(ch)||ch>='0'&&ch<='9')
{
str[i++]=ch;
str[i]='\0';
face();
printf("input an expression,press key 'E' to compute\n");
printf("%s",str);
if( ch=='-'&&(i==1||op(str[i-2]))||ch>='0'&&ch<='9' )
{
num[j++]=ch;
num[j]='\0';
}
else j=0;
}
if(ch=='S'||ch=='s')
if(strlen(num))
{
face();
printf("%s has been saved\n",strcpy(save,num));
printf("input an expression,press key 'E' to compute\n");
printf("%s",str);
}
else
{
face();
printf("there is no number to save!\n");
printf("input an expression,press key 'E' to compute\n");
printf("%s",str);
}
if(ch=='R'||ch=='r')
if(strlen(save))
{
face();
printf("input an expression,press key 'E' to compute\n");
printf("%s",strcat(str,save));
i+=strlen(save);
}
if(ch=='C'||ch=='c')
{
if(strlen(str))
str[--i]='\0';
face();
printf("input an expression,press key 'E' to compute\n");
printf("%s",str);
}
if(ch=='E'||ch=='e')
{
if(compute(str))
{
printf("\n=%g\n",numStack[0]);
j=0; temp=numStack[0];
if(temp<0)
{
temp=-temp;
num[j++]='-';
num[j]='\0';
}
temp2=(unsigned long)temp;
k=1;
while(temp2/k>=10)
k*=10;
while(k)
{
num[j++]=temp2/k+'0';
num[j]='\0';
temp2=temp2%k;
k/=10;
}
temp=temp-(int)temp;
if(temp!=0)
{
num[j++]='.';
num[j]='\0';
temp+=0.0000005;
}
for(k=6;k>0;k--)
{
if(temp==0) break;
temp*=10;
num[j++]=(int)temp+'0';
num[j]='\0';
temp=temp-(int)temp;
}
}
else
{
face();
printf("input an expression,press key 'E' to compute\n");
printf("%s",str);
printf("\nwrong expression!");
}
i=0; j=0; str[0]='\0';
}
if(ch=='Q'||ch=='q')
{
printf("\nare you sure to quit?(Y/N)\n");
ch=getch();
if(ch=='Y'||ch=='y') break;
else
{
face();
printf("input an expression,press key 'E' to compute\n");
printf("%s",str);
}
}
ch=getch();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -