📄 form1.cs
字号:
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 + -