📄 form1.cs
字号:
}
private void S10() //函数S10判断负号输入是否正确
{
if (logo[n - 1] != 6 && logo[n - 1] != 9)
{
label4.Text = "输入错误,负号输入错误!";
MessageBox.Show("输入错误,负号输入错误!");
}
n = n + 1;
}
//运算函数
private double Count(string op, string numleft, string numright)
{
double left, right;
left = 0;
right = 0;
if (numleft == "$")
left = 0;
else
left = Convert.ToDouble(numleft);
if (numright == "$")
right = 0;
else
right = Convert.ToDouble(numright);
double result;
switch (op)
{
case "+": result = left + right; return result;
case "-": result = left - right; return result;
case "*": result = left * right; return result;
case "/": if (right == 0.0) { label4.Text = "除法运算中,除数不能为0!"; return 0; }
result = left / right; return result;
case "^": result = Math.Pow(left, right); return result;//乘方
case "@": result = -right; return result;//取负
case "%": result = left / 100; return result;
case "sin":
result = Math.Sin(right); return result;
case "cos":
result = Math.Cos(right); return result;
case "tg":
result = Math.Tan(right); return result;
case "ctg":
result = 1.0 / Math.Tan(right); return result;
case "acos":
result = Math.Acos(right); return result;
case "asin":
result = Math.Asin(right); return result;
case "atg":
result = Math.Atan(right); return result;
case "actg":
result = 1.0 / Math.Atan(right); return result;
case "sqrt":
if (left < 0.0) { label4.Text = "开方运算中,开方数必须大于等于0!"; return 0; }//开平方
else
{
result = Math.Sqrt(right); return result;
}
case "cbrt": //开三次方
result = Math.Pow(right, 1.0 / 3.0); return result;
case "ln":
result = Math.Log(2.7182818, right); return result; //e=2.7182818...
case "log":
result = Math.Log(left, right); return result; //left为底数 log(100,10)=2
case "lg":
result = Math.Log10(right); return result;
default:
return 0.0;
}
}
//语法分析
private void YuFa(string input, int n)
{
double result; //存储运算后的运算结果
string numleft, numright; //存储待运算的运算数
string signleft, signright; //存储待比较运算优先关系的运算符
string[] num = new string[100]; //存储未运算的运算数
string[] sign = new string[100]; //存储未运算的运算符号
string str, op;
char prior; //记录两运算符的位置比较优先关系
str = null;
int i, j, k, f, p;
int mark; //循环标记
int remsl, remsr; //remsl记录signleft在优先关系表中纵向的位置,remsr记录signright在优先关系表中横向的位置
numleft = null;
numright = null;
signleft = null;
signright = null;
op = "+-*/()^@%$,#"; //设置优先关系表的横向符号顺序
remsl = -1;
remsr = -1;
prior = '?';
mark = 0;
result = 0;
i = 0;
k = 0;
p = 0;
//优先关系表的优先关系
//+ - * / ( ) ^ @ % 函数 , #
string[] precede ={ ">><<<><<<<>>", ">><<<><<<<>>", ">>>><><<<<>>", ">>>><><<<<>>", "<<<<<=<<<<< ", ">>>> >> > >>", ">>>><>>< >", ">>>> >> <<<>", ">>>> >> > >>", ">>>><>><<<>>", "<<<<<><<<< ", " " };
while (mark != 2)
{
if (signleft == "#" && k == 0 && i > n) //判断运算是否完成
mark = 2;
if (mark == 0)
{
if (logo[i] < 3 && logo[i] > 0) //判断是否为运算数
{
while (logo[i] < 3)
{
str = str + input[p];
p = p + 1;
i = i + 1;
}
if (numleft == null)
{
if (signleft != null)
{
if (signleft == "(" || signleft.Length > 1 || signleft == "@")
numleft = "$";
else
numleft = str;
}
else
numleft = str;
}
else if (numleft != null)
{
if (signright != null)
{
if (signright == "(" || signright.Length > 1 || signleft == "@")
numright = "$";
}
else
numright = str;
}
str = null;
}
else if (logo[i] > 2) //判断是否未运算符
{
if (zi[i] > 1) //判断长度大于1的运算符
{
for (j = 0; j < zi[i]; j++)
str = str + Convert.ToString(input[p + j]);
p = p + zi[i];
i = i + 1;
}
else if (zi[i] == 1) //判断长度为1的运算符
{
str = Convert.ToString(input[p]); p = p + 1; i++;
}
if (signleft == null)
{
signleft = str;
if (signleft == "@" || signleft == "(" || signleft.Length > 1) //当为负号,(,以及长度大于1(sin,log,sqat等)的运算符相对应的运算数设为“$”
numleft = "$";
}
else if (signleft != null)
{
signright = str;
if (signright == "(" || signright.Length > 1 || signright == "@")
numright = "$";
}
str = null;
}
}
else if (mark == 1 && k - 1 > -1) //把存储在sign与num两数组中的运算符与运算数取出比较,即向前读运算式子input
{
signright = signleft;
numright = numleft;
signleft = sign[k - 1];
numleft = Convert.ToString(num[k - 1]);
k = k - 1;
if (k - 1 < 0) //当sign与num两数组中的运算符与运算数为空,则向后读运算式子input
mark = 0;
}
if (signleft != null && signright != null) //找到两运算符表中的位置
{
for (f = 0; f < 12; f++)
{
if (signleft == Convert.ToString(op[f]))
{
remsl = f;
break;
}
else if (f == 11 && signleft != Convert.ToString(op[f])) //对函数统一起来,用“$”在表中表示
{
remsl = 9;
}
}
for (f = 0; f < 12; f++)
{
if (signright == Convert.ToString(op[f]))
{
remsr = f;
break;
}
else if (f == 11 && signright != Convert.ToString(op[f])) //对函数统一起来,用“$”在表中表示
{
remsr = 9;
}
}
}
if (remsl != -1 && remsr != -1)
{
prior = precede[remsl][remsr]; //找出两运算符的优先关系
switch (prior)
{
case '>': //做运算操作
{
if (signleft == ")")
{
// i = i - 1;
mark = 1;
}
else if (signleft == "," && signright == ")")
{
for (j = 0; j < k; j++)
{
if (sign[j] == "log")
{
num[j] = numleft;
break;
}
}
signleft = signright;
numleft = numright;
numright = null;
signright = null;
if (k > 0)
{
mark = 1;
}
}
else
{
result = Count(signleft, numleft, numright);
signleft = signright;
numleft = Convert.ToString(result);
if (signleft != "#")
{
if (k > 0)
{
mark = 1;
numright = null;
signright = null;
}
else
{
numright = null;
signright = null;
}
}
else if (signleft == "#")
{
if (k != 0)
{
mark = 1;
numright = null;
signright = null;
}
else if (k == 0 && i > n)
mark = 2;
}
else if (signleft == "%" || signleft == "@")
{
signright = null;
}
}
remsl = -1;
remsr = -1;
break;
}
case '<': //若signleft中的运算符优先级小于signright中的运算符,则把signleft存入sign数组中,把相应的运算数即numleft存入num数组中
{
if (signleft == "(")
{
sign[k] = signleft; num[k] = numleft;
signleft = signright;
numleft = numright;
numright = null;
signright = null;
k++;
if (mark == 1)
mark = 0;
}
else
{
sign[k] = signleft; signleft = signright; signright = null;
num[k] = numleft; numleft = numright; numright = null;
k = k + 1;
if (mark == 1)
mark = 0;
}
remsl = -1;
remsr = -1;
break;
}
case '=': //当两运算符为(,)则执行以下操作,进行消括号
{
if (k > 0)
{
signleft = sign[k - 1];
numleft = Convert.ToString(num[k - 1]);
signright = null;
k = k - 1;
//if (k == 0)
mark = 0;
// else
// mark = 1;
}
else if (k == 0)
{
numleft = numright;
numright = null;
signleft = null;
signright = null;
mark = 0;
//i = i + 1;
}
remsl = -1;
remsr = -1;
break;
}
}
}
}
textBox3.Text = Convert.ToString(result);
result = 0;
}
//进制转换功能
private void Change()
{
int result;
if (radioButton4.Checked == true && radioButton7.Checked == true) //二进制转换二进制
textBox3.Text = textBox1.Text;
else if (radioButton4.Checked == true && radioButton6.Checked == true) //二进制转换八进制
{
result = Convert.ToInt32(input, 2);
textBox3.Text = Convert.ToString(result, 8);
}
else if (radioButton4.Checked == true && radioButton8.Checked == true) //二进制转换十进制
{
result = Convert.ToInt32(input, 2);
textBox3.Text = Convert.ToString(result);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -