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

📄 count.h

📁 这是一个差值的程序
💻 H
字号:


class count{
	Array<char>  Char_Array;//存放表达式中的符号
	Array<float> digital_Array;//存放表达式中的数字
	stack<char>  Char_Stack;//计算时表达式中的符号入栈
	stack<float> digital_Stack;//计算时表达式中的数字入栈
	int frontchar;//表达式最开始时符号的个数
	int CACrrent,DAcurrent;//分别表示读到当前的符号和数字
public:
	count();//构造函数赋初值
	bool readtext();//读取数学表达式
	bool putouttext();//输出表达式
	bool counttext();//计算表达式的值
	bool showresult();
};
count::count(){
	CACrrent=DAcurrent=frontchar=0;//默认为零
}
bool count::readtext(){
	char a;//
	float di;
	cout<<"请输入一个数学表达式"<<endl;
	while(cin.peek()!=10){//首先查看表达式的开头是否为符号,如果是符号则符号放入符号的数组中
		a=cin.peek();   
		if(a<'0'||a>'9'){//如果是符号	
			frontchar++;
			cin>>a;//把符号读取
			Char_Array.push(a);//把符号入栈
		}
		else break;
	}
	while(cin.peek()!=10){//以下为继续读入表达式
		a=cin.peek();
		if(a<'0'||a>'9'){//如果是符号	
			cin>>a;//把符号读取
			Char_Array.push(a);//把符号入栈
		}
		else{
			cin>>di;
			digital_Array.push(di);
		}
	}
	return true;
}
bool count::putouttext(){
	char a;
	int change=1;//用来判断输出顺序,1表示输出数字,0表示输出符号
	float di;
	cout<<"您所输入的数学表达式为:"<<endl;
	for(CACrrent=0;CACrrent<frontchar&&Char_Array.getaele(CACrrent,a);CACrrent++){
		//首先输出表达式最前面的符号
		cout<<a;
	}
	while(1){
		if( change && digital_Array.getaele(DAcurrent++,di)){//要求能取到当前值
			cout<<di;
			change=0;//输出数字之后一定是输出符号
			continue;//接着进入下一次循环
		}
		else if(Char_Array.getaele(CACrrent++,a)){
			cout<<a;//输出当前符号
			if( a=='{' || a=='[' || a=='(' ){
				change=1;continue;}
			else if( a=='}' || a==']' || a==')' )
				continue;//如果为以上三种符号,表示后面一定还要在输出符号,所以不改变 change的值
						 //继续输出符号
			else if(a=='*' || a=='-'||a=='+'||a=='/' ){
					Char_Array.getaele(CACrrent,a);
					if( a=='{' || a=='[' || a=='(' )
						continue;
					else 
						change=1;//如果不是以上三符号一定是接下来输出数字
			}
		}
		else break;//如果不输符号和数字则表明表达式完全输完
	}
	cout<<endl;
	CACrrent=DAcurrent=0;
	return true;
}
bool count::counttext(){
	char a,b,nextchar,frontchar=0;
	int change=1;//用来判断入栈顺序,1表示数字入栈,0表示符号入栈
	float di,a1,a2;
	for(CACrrent=0;CACrrent<frontchar&& Char_Array.getaele(CACrrent,a);CACrrent++){//首先把表达式最前面的
		Char_Stack.push(a);										   //符号入栈
	}
	while(1){//开始计算
		if( change && digital_Array.getaele(DAcurrent++,di)){//要求能取到当前值
			digital_Stack.push(di);//把所计算的数字入栈
			change=0;//数字入栈之后一定是符号入栈
			continue;//接着进入下一次循环
		}
		else if( Char_Array.getaele(CACrrent++,a) ){//取到当前符号
			Char_Array.getaele(CACrrent,nextchar);
			switch(a){//用switch语句与下一个符号相比较
			case '+':;
			case '-':switch(nextchar){
						case '*':;
						case '/':change=1; //接下来读度数字,改变change的值为1
						case '(':;
						case '[':;
						case '{':;
						Char_Stack.push(a);
							break;//如果接下来的是 + - } ] ) 则要进行计算
						case '}':;
						case ']':;
						case ')':;
						case 'e':;//没有nextchar所返回的值
						case '-':;
						case '+':digital_Stack.pop(a1);//一个数存放在栈中
								 digital_Array.getaele(DAcurrent++,a2);//另一个数还未进栈
								if(a=='+')
								 di=a1+a2;
								else 
									di=a1-a2;
								digital_Stack.push(di);//把计算的结果放回栈中
								break;
						default:return false;//如果不匹配说明所写的表达式有错误
					 }
					break;
			case '*':;
			case '/':switch(nextchar){
						case '(':;
						case '{':;
						case '[':
						Char_Stack.push(a);//接下来读度数字,不改变change的值
							break;
						case 'e':;//没有nextchar所返回的值
						case '*':;
						case '/':;
						case '+':;
						case '-':;
						case '}':;
						case ']':;
						case ')':
								digital_Stack.pop(a1);//一个数存放在栈中
								digital_Array.getaele(DAcurrent++,a2);//另一个数还未进栈
								if(a=='*')
								 di=a1*a2;
								else di=a1/a2;
								Char_Stack.checkele(0,b);//查看上次进栈的是否为 + - 
								if(b=='+'){
									digital_Stack.pop(a1);
									di=di+a1;
								}//+-号没有出栈
								else if(b=='-'){
									digital_Stack.pop(a1);
									di=a1-di;
								}
								digital_Stack.push(di);break;
						}
						break;
			case '{':;
			case '[':;
			case '(':Char_Stack.push(a);change=1;break;
			case '}':;
			case ']':;
			case ')':Char_Stack.pop(b);//出栈的为括号对应的反括号
					Char_Stack.checkele(0,b);//查看括号前面所对应的符号
					switch(b){
					case '*':
					case '/':digital_Stack.pop(a1);//一个数存放在栈中
							digital_Stack.pop(a2);
							if(b=='*')
								di=a1*a2;
							else 
								di=a2/a1;
							Char_Stack.pop(b);
							Char_Stack.checkele(0,b);//查看上次进栈的是否为 + - 
							if(b=='+'){
								digital_Stack.pop(a1);
								di=di+a1;
								Char_Stack.pop(b);
							}
							else if(b=='-'){
								digital_Stack.pop(a1);
								di=a1-di;
								Char_Stack.pop(b);
								}
							digital_Stack.push(di);
							break;
					case '+':
					case '-':digital_Stack.pop(a1);//一个数存放在栈中
							digital_Stack.pop(a2);
							if(b=='+'){
								di=a1+a2;
								Char_Stack.pop(b);
							}
							else if(b=='-'){
								di=a2-a1;
								Char_Stack.pop(b);
							}
							digital_Stack.push(di);
					default:break;
					}
				default:break;
			}
		}
		else break;
	}
	digital_Stack.pop(di);
	cout<<"表达式的值为:"<<endl;
	cout<<di<<endl;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -