📄 super.c
字号:
#include <iostream.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int top=-1;
int sys=10;
double number[300];
struct input
{
char charac[300]; //表达式
int oper; //运算符的数字表示
int pri; //运算符的优先级
}in[300],stack[300],store[300];
void sys_change() //进制转换
{
cout<<"Chose the system,enter the corresponding number:"<<endl<<"Dec-10,Bin-2,Oct-8"<<endl;
cin>>sys;
if(sys!=2&&sys!=8&&sys!=10)
{
cout<<"Failed...Try again!"<<endl;
sys_change();
}
else
cout<<"Enter the expression:"<<endl;
}
double dec_to(int m,double from) //十进制数转换为其他进制
{
int inte=int(floor(from)),temp_i[300],temp_d[300],top=0; //inte 整数部分
double deci=from-double(inte),z=0; //deci 小数部分
while(inte>0)
{
temp_i[top]=inte%m;
inte=inte/m;
z=z+temp_i[top]*pow(10,top++);
}
top=0;
while(deci<1&&deci!=0)
{
temp_d[top]=int(floor(deci*m));
deci=deci*m-temp_d[top];
z=z+temp_i[top]*pow(10,-1*(top+1));
top++;
}
return(z);
}
double to_dec(int m,char from[300]) //其他进制转换为十进制
{
double x=0;
int i,k=0;
for(i=0;from[i+1]!='.'&&from[i+1]!='\0';i++);
for(;i>=0;i--)
x=x+(from[i]-48)*pow(m,k++);
k=0;
for(i=0;from[i]!='.'&&from[i]!='\0';i++);
if(from[i]=='.')
for(i++;from[i]!='\0';i++)
x=x+(from[i]-48)*pow(m,--k);
return(x);
}
double transfer(int i) //字符串数字化
{
double x;
if(sys==10)
x=atof(store[i].charac);
else
x=to_dec(sys,store[i].charac); //将N进制(N<10)转换成十进制
return x;
}
double get() //从栈中取出数字
{
double x;
x=number[top--];
return(x);
}
void operate(double y) //将结果存入栈中
{
number[++top]=y;
}
int fac(int z) //阶乘运算
{
int i,sum=1;
for(i=z;i>0;i--)
sum=sum*i;
return(sum);
}
void calcu(int operato) //计算结果
{
switch(operato)
{
case 12:operate(get()+get());break; //遇到运算符,取出栈中数字(1或2个)进行运算,再将结果存入栈中
case 13:operate((-1)*get()+get());break;
case 14:operate(get()*get());break;
case 15:operate(1/get()*get());break;
case 16:operate(pow(get(),double(2)));break;
case 17:operate(sin(get()));break;
case 18:operate(cos(get()));break;
case 19:operate(tan(get()));break;
case 20:operate(1/(tan(get())));break;
case 21:operate(asin(get()));break;
case 22:operate(acos(get()));break;
case 23:operate(atan(get()));break;
case 24:operate(double(1.5707963)-atan(get()));break;
case 25:operate(log10(get()));break;
case 26:operate(log(get()));break;
case 27:operate((fac(int(get()))));break;
case 28:operate(dec_to(2,get()));break;
case 29:operate(dec_to(8,get()));break;
}
}
void stack_calcu() //如果是数字则存入栈中,是符号转入cacu函数
{
int i;
double num;
top=-1;
for(i=0;store[i].charac[0]!='#';i++)
{
if(isdigit(store[i].charac[0])!=0)
{
num=transfer(i);
number[++top]=num;
}
else calcu(store[i].oper);
}
}
void storage() //将数字、运算符以后缀表达式形式存入栈中
{
int i=0,k=0,top=-1;
while(in[i].charac[0]!='#')
{
if(isdigit(in[i].charac[0])!=0)
store[k++]=in[i++];
else if(in[i].pri>stack[top].pri||top==-1)
{
if(in[i].charac[0]=='(')
in[i].pri=2;
stack[++top]=in[i++];
}
else
{
if(stack[top].charac[0]!='(')
store[k++]=stack[top];
top--;
if(stack[top].charac[0]=='(')
{
top--;
i++;
}
if(top==-1)
stack[++top]=in[i++];
}
}
for(i=top;i>=0;i--)
if(stack[i].charac[0]!=')')
store[k++]=stack[i];
store[k].charac[0]='#';
}
void negative() //判断首位及前括号后是否是"+"、"-" 若有,在"+"或"-"号前加0
{
int i,j;
struct input temp1,temp2;
if(in[0].charac[0]=='-'||in[0].charac[0]=='+')
{
temp1=in[0];
in[0].charac[0]='0';in[0].charac[1]='\0';in[0].pri=-2;
for(i=1;in[i-1].charac[0]!='#';i++)
{
temp2=in[i];
in[i]=temp1;
temp1=temp2;
}
in[i]=temp1;
}
for(i=0;in[i].charac[0]!='#';i++)
if((in[i].charac[0]=='-'&&in[i-1].charac[0]=='(')||(in[i].charac[0]=='+'&&in[i-1].charac[0]=='('))
{
temp1=in[i];
in[i].charac[0]='0';in[i].charac[1]='\0';in[0].pri=-2;
for(j=i+1;in[j-1].charac[0]!='#';j++)
{
temp2=in[j];
in[j]=temp1;
temp1=temp2;
}
in[j]=temp1;
}
}
int unfold(char enter[300]) //将数字、字母、运算符分离存入各个结构变量
{
int i=0,j=0,k=0,judge;
while(*(enter+j)!='\0')
{
judge=0;
if(isdigit(*(enter+j))!=0) //数字
{
while(isdigit(*(enter+j+i))!=0||*(enter+j+i)=='.')
{
in[k].charac[i]=*(enter+j+i);
i++;
}
j=j+i;
in[k++].charac[i]='\0';
judge++;
i=0;
}
if(isalpha(*(enter+j))!=0) //字母
{
while(isalpha(*(enter+j+i))!=0)
{
in[k].charac[i]=*(enter+j+i);
i++;
}
j=j+i;
in[k++].charac[i]='\0';
judge++;
i=0;
}
if(*(enter+j)==40||*(enter+j)==41||*(enter+j)==94||*(enter+j)==33) // (, ), ^,!
{
in[k].charac[i]=*(enter+j+i);
i++;
j=j+i;
in[k++].charac[i]='\0';
judge++;
i=0;
}
if(*(enter+j)==43||*(enter+j)==45||*(enter+j)==42||*(enter+j)==47) //+, -, *, /
{
in[k].charac[i]=*(enter+j+i);
i++;
j=j+i;
in[k++].charac[i]='\0';
judge++;
i=0;
}
if(judge==0) //输入错误
return(0);
}
in[k].charac[0]='#';in[k].charac[1]='\0'; //置结束标记
return(1);
}
int getop(struct input in[300])
{
int i;
for(i=0;in[i].charac[0]!='#';i++)
{
if(strcmp(in[i].charac,"(")==0)
{in[i].pri=6;in[i].oper=10;}
else if(strcmp(in[i].charac,")")==0)
{in[i].pri=2;in[i].oper=10;}
else if(strcmp(in[i].charac,"+")==0)
{in[i].pri=3;in[i].oper=12;}
else if(strcmp(in[i].charac,"-")==0)
{in[i].pri=3;in[i].oper=13;}
else if(strcmp(in[i].charac,"*")==0)
{in[i].pri=4;in[i].oper=14;}
else if(strcmp(in[i].charac,"/")==0)
{in[i].pri=4;in[i].oper=15;}
else if(strcmp(in[i].charac,"^")==0)
{in[i].pri=5;in[i].oper=16;}
else if(strcmp(in[i].charac,"sin")==0)
{in[i].pri=5;in[i].oper=17;}
else if(strcmp(in[i].charac,"cos")==0)
{in[i].pri=5;in[i].oper=18;}
else if(strcmp(in[i].charac,"tan")==0)
{in[i].pri=5;in[i].oper=19;}
else if(strcmp(in[i].charac,"ctan")==0)
{in[i].pri=5;in[i].oper=20;}
else if(strcmp(in[i].charac,"asin")==0)
{in[i].pri=5;in[i].oper=21;}
else if(strcmp(in[i].charac,"acos")==0)
{in[i].pri=5;in[i].oper=22;}
else if(strcmp(in[i].charac,"atan")==0)
{in[i].pri=5;in[i].oper=23;}
else if(strcmp(in[i].charac,"actan")==0)
{in[i].pri=5;in[i].oper=24;}
else if(strcmp(in[i].charac,"lg")==0)
{in[i].pri=5;in[i].oper=25;}
else if(strcmp(in[i].charac,"ln")==0)
{in[i].pri=5;in[i].oper=26;}
else if(strcmp(in[i].charac,"!")==0)
{in[i].pri=5;in[i].oper=27;}
else if(strcmp(in[i].charac,"e")==0)
{strcpy(in[i].charac,"2.718281828");in[i].pri=-2;in[i].oper=10;}
else if(strcmp(in[i].charac,"bin")==0) //十进制下,转换为二进制 格式binx
{in[i].pri=5;in[i].oper=28;}
else if(strcmp(in[i].charac,"oct")==0) //十进制下,转换为八进制 格式octx
{in[i].pri=5;in[i].oper=29;}
else if(strcmp(in[i].charac,"help")==0)
{cout<<"here is help...."<<endl;return(3);}
else if(strcmp(in[i].charac,"exit")==0)
return(2);
else if(strcmp(in[i].charac,"clear")==0)
{system("cls");return(3);}
else if(strcmp(in[i].charac,"syschange")==0)
{sys_change();return(3);} //进制切换
else if(isdigit(in[i].charac[0])!=0)
{in[i].pri=-2;in[i].oper=10;} //数字
else
return(0);
}
return(1);
}
void main()
{
cout<<"Welcome to the calculator!"<<endl<<"Press HELP for help;"<<endl<<"Press EXIT to exit."<<endl<<endl;
sys_change();
restart:
char input[300];
int input_legal,get_oper;
cin.getline(input,300); //输入表达式
input_legal=unfold(input); //0为输入错误
if(input_legal==0)
{
cout<<"illegal input"<<endl<<endl;
goto restart;
}
else
get_oper=getop(in); //将字母变为运算符 0输入错误 2退出计算 3重新开始
if(get_oper==0)
{
cout<<"illegal input"<<endl<<endl;
goto restart;
}
else if(get_oper==3)
goto restart;
else if(get_oper==2)
goto end;
negative();
storage();
stack_calcu();
if(top==-1) //没有进行运算,重新开始
goto restart;
double result; //最后结果
if(sys==10)
result=number[top];
else //非十进制下运算,再将十进制转回为指定进制
result=dec_to(sys,number[top]);
cout<<result<<endl<<endl;
goto restart;
end:
cout<<endl<<"Thanks for using!"<<endl<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -