⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 super.c

📁 二: 普通计算器的设计说明: 1 普通计算器的主要功能(普通计算与逆波兰计算): 1.1主要功能: 包括 a普通加减乘除运算及带括号的运算 b各类三角与反三角运算(可实现角度与弧度的切换) c逻辑运算
💻 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 + -