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

📄 form1.cs

📁 用C#实现的数学常用函数的教学演示用程序.
💻 CS
📖 第 1 页 / 共 5 页
字号:
					dataCount++;
					continue;
				}
				if(str.Equals("x"))
				{
					newString="数字序列";
					dataCount++;
					continue;
				}
				if(str.Equals("("))
				{
					newString="左括号";
					characterCount++;
					continue;
				}
				if(str.Equals(")"))
				{
					newString="右括号";
					characterCount++;
					continue;
				}
				if(Char.IsDigit(startString[i]))
				{
					while(Char.IsDigit(startString[i]))
					{
						i++;											
					}
					if(startString[i]=='.'&&(!Char.IsDigit(startString[i+1]))&&(i+1)!=startString.Length)
						return 13;
					if(startString[i]=='.')
					{
						i++;
					}					
					while(Char.IsDigit(startString[i]))
					{
						i++;	
					}
					newString="数字序列";
					i--; dataCount++;
					continue;
				}
				return 1;         //非法字符
			} 
			if((dataCount==0&&characterCount!=0)||(startString[0]=='0'&&dataCount==1&&characterCount>1&&startString.Length!=2))
				return 12;
			return 100;
		}
		public int IsCharacterOrData(ref double num)
		{
			string str="";
			startTop+=startTopMoveCount; startTopMoveCount=0;
			int i=startTop;
			if(i<startString.Length-5&&startString.Length>=6)
			{
				str=startString.Substring(i,6); 
				for(int j=4;j<=7;j++)
					if(str.Equals(opchTbl[j].op))
					{
						startTopMoveCount=6;
						return opchTbl[j].code;
					}
			}
			if(i<startString.Length-2&&startString.Length>=3)
			{					
				str=startString.Substring(i,3);				     
				for(int j=0;j<10;j++)
					if(str.CompareTo(opchTbl[j].op)==0)
					{
						startTopMoveCount=3;
						return opchTbl[j].code;
					}
			}
			if(i<(startString.Length-1)&&(startString.Length)>=2)
			{
				str=startString.Substring(i,2);
				if(str.CompareTo("ln")==0)
				{
					startTopMoveCount=2;
					return 11;
				}
				if(str.CompareTo("pi")==0)
				{
					startTopMoveCount=2;
					num=Math.PI;
					return 100;
				}
			}
			//以下开始确认一个字符是属于什么值类型
			if(i<startString.Length)
			{
				str=startString.Substring(i,1);
				for(int j=11;j<19;j++)
				{
					if(str.Equals(opchTbl[j].op))
					{startTopMoveCount=1;return opchTbl[j].code;}					
				}
				if(str.CompareTo("e")==0)
				{
					startTopMoveCount=1; num=Math.E;
					return 100;
				}
				if(str.CompareTo("x")==0)
				{
					startTopMoveCount=1; num=start;
					return 100;
				}
				if(Char.IsDigit(startString[i]))
				{
					double temp=0,M=10; int j=i;
					while(Char.IsDigit(startString[j]))
					{
						temp=M*temp+Char.GetNumericValue(startString[j]);
						startTop++;
						j++;						
					}
					if(startString[j]=='.')
					{
						j++;startTop++;						
					}
					while(Char.IsDigit(startString[j]))
					{
						temp+=1.0/M*Char.GetNumericValue(startString[j]);
						M/=10;j++;	
						startTop++;
					}
					startTopMoveCount=0;
					num=temp;
					return 100;
				}
			}
			return -1;
		}
		public double DoubleCount(string opString,double data1,double data2)
		{   //双目运算 
			if(opString.CompareTo("+")==0) return (data1+data2);
			if(opString.CompareTo("-")==0) return (data1-data2);
			if(opString.CompareTo("*")==0) return (data1*data2);
			if(opString.CompareTo("/")==0) 
			{
				if(data2==0)
				{
					drawPoint=false;
					return 0;
				}
				return (data1/data2);
			}
			if(opString.CompareTo("^")==0) 
			{
				double end=data1;
				for(int i=0;i<data2-1;i++)
					end*=data1;
				return (end);
			}			
			return Double.MaxValue;   
		}		
		public double DoubleCount(string opString,double data1)
		{   //单目运算			
			if(opString.CompareTo("sin")==0) return Math.Sin(data1);
			if(opString.CompareTo("cos")==0) return Math.Cos(data1);
			if(opString.CompareTo("tan")==0) return Math.Tan(data1);
			
			if(opString.CompareTo("cot")==0) 
			{
				//if(Math.Tan(data1)==0)
				if(Math.Tan(data1)>-0.001&&Math.Tan(data1)<0.001)
				{
					drawPoint=false;
					return 0;
				}
				return (1/(Math.Tan(data1)));			
			}
			
			if(opString.CompareTo("arcsin")==0)
			{
				if(data1<-1||data1>1)
				{
					drawPoint=false;
					return 0;
				}
				return  Math.Asin(data1);
			}					
			if(opString.CompareTo("arccos")==0) 
			{
				if(data1<-1||data1>1)
				{
					drawPoint=false;
					return 0;
				}
				return Math.Acos(data1);   
			}			
			if(opString.CompareTo("arctan")==0)
				/*if(-Math.PI/2<=data1&&data1<=Math.PI/2)*/return Math.Atan(data1);
			if(opString.CompareTo("arccot")==0)
				/*if(-Math.PI/2<=data1&&data1<=Math.PI/2)*/return (-Math.Atan(data1));
			if(opString.CompareTo("sec")==0) 
			{
				double temp=Math.Cos(data1);
				///if(temp==0) 
				if(temp>-0.0001&&temp<0.0001)
				{
					drawPoint=false;  //置为无效点,即不把这个点对应坐标画出
					return 0;    //可以为任意的实数,因为这个值所对应的点已置为无效,即不再画值为零的点
				}
				if(temp!=0)
					return (1/(Math.Cos(data1)));
			}
			if(opString.CompareTo("csc")==0) 
			{			
				double temp=Math.Sin(data1);
				//if(temp==0) 
				if(temp>-0.0001&&temp<0.0001)
				{
					drawPoint=false;//置为无效点,即不把这个点对应坐标画出
					return 0;    //可以为任意的实数,因为这个值所对应的点已置为无效,即不再画值为零的点
				}
				if(temp!=0)
                    return (1/(Math.Sin(data1)));					
			}
			
			//if(data1>0) 
			if(opString.CompareTo("ln")==0)
			{
				if(data1<=0)
				{
					drawPoint=false;
					return 0;
				}
				return  Math.Log(data1);
			}
			return Double.MaxValue;
		}

		public int CountValueY(ref double tempY)  //方法功能为求得一个自变量X的一个解
		{
			int type=-1;                  //存放正在扫描的字符串是为数字类型还是(单双目运算符)
			double num=0;                   //如果是数据,则返回数据的值
			//进栈底结束符"end"
			opTop++;
			operateStack[opTop].op="end"; operateStack[opTop].code=18; operateStack[opTop].grade=' ';
			while(startTop<=startString.Length-1)
			{
			start:
				type=IsCharacterOrData(ref num);  //调用判断返回值类型函数 
				if(type==-1){return 1;}				
				if(type==100) 
				{				
					dataTop=dataTop+1;
					//Console.WriteLine(dataTop);
					dataStack[dataTop]=num;															
				}	
				else
				{   
					if(osp[type-1]>isp[operateStack[opTop].code-1])   //操作符进栈
					{
						opTop++;
						operateStack[opTop].op=opchTbl[type-1].op; operateStack[opTop].code=opchTbl[type-1].code; operateStack[opTop].grade=opchTbl[type-1].grade;						                    				
					}
					else
					{
						while(osp[type-1]<=isp[operateStack[opTop].code-1])  //弹出操作符跟数据计算,并存入数据
						{							
							if(operateStack[opTop].op.CompareTo("end")==0)//当遇到"end"结束符表示已经获得结果
							{
								if(dataTop==0)
								{
									tempY=dataStack[dataTop];  startTop=0; startTopMoveCount=0; opTop=-1; dataTop=-1;
									return 0;
								}
								else return 1;       //顺序错乱造成的错误
							}
							if(operateStack[opTop].op.CompareTo("(")==0)  //如果要弹出操作数为'( ',则消去左括号
							{
								opTop--; goto start;
							}  
							//弹出操作码和一个或两个数据计算,并将计算结果存入数据栈
							double data1,data2; opTable operate;
							if(dataTop>=0)	data2=dataStack[dataTop];
							else return 1;
							operate.op=operateStack[opTop].op; operate.code=operateStack[opTop].code; operate.grade=operateStack[opTop].grade;
							opTop--;                        //处理一次,指针必须仅且只能下移一个单位
							if(operate.grade=='d')
							{
								if(dataTop-1>=0)    data1=dataStack[dataTop-1];
								else return 1;
								//if(operate.op=="/"&&data2==0)													
									//return 3;             //如果继续,将会发生出零错误								
								double tempValue=DoubleCount(operate.op,data1,data2);
								if(tempValue!=Double.MaxValue)	dataStack[--dataTop]=tempValue;
								else return 1;
							}
							if(operate.grade=='s')
							{
								double tempValue=DoubleCount(operate.op,data2);
								if(tempValue!=Double.MaxValue)
								{									
									dataStack[dataTop]=tempValue;
								}
								else return 2;								
							}
						}										
						//如果当前栈外操作符比栈顶的操作符优先级别高,则栈外操作符进栈
						opTop++;
						operateStack[opTop].op=opchTbl[type-1].op; operateStack[opTop].code=opchTbl[type-1].code; operateStack[opTop].grade=opchTbl[type-1].grade;
					}
				}
			}
			return 1; 
		}

		public bool StartExcute()   //这个方法的功能是调用各个检错函数
		{			
			startString=expressBox.Text;
			//InitializeOpchTblStack();
			CreterionFaction();
			if(CheckParentthese()==false)
			{
				MessageBox.Show("括号不匹配,请重新输入!!!","错误",MessageBoxButtons.OK,MessageBoxIcon.Error);
				//this.pictureBox.Refresh();
				RestoreAllPictures();   //重画所有图像,相当于刷新屏幕
				//DrawBackPicture();
				return false; 
			}
			switch(CheckFollowCorrect())
			{ 
				case 0:  MessageBox.Show("表达式为空,请先输入表达式!!!","错误",MessageBoxButtons.OK,MessageBoxIcon.Asterisk); RestoreAllPictures();                                      return false;
				case 1:  MessageBox.Show("表达式中有非法字符!!!","错误",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);RestoreAllPictures();                                              return false;
				case 2:  MessageBox.Show("三角函数运算符与 ) 之间应输入数据或其它表达式!!!","错误",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);RestoreAllPictures();                  return false;
				case 3:  Me

⌨️ 快捷键说明

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