using System;
using System.Collections.Generic;
using System.Text;
namespace Count
{
//定义枚举类型存储运算方式
enum sign : byte
{
加 = 1,
减 = 2,
乘 = 3,
除 = 4,
乘方 = 5,
开方 = 6,
}
//定义一个算术结构(因为用于计算的变量只存储一些数据,用结构更好)
struct count
{
public double value1; //定义变量保存数字
public double value2;
public sign mySign; //使用枚举类型
}
class Program
{
private static count myCount;
static void Main(string[] args)
{
string answer; //定义变量存放是否继续计算
int input; //定义变量存放用户的选择
Console.WriteLine("--------欢迎使用运算程序--------\n");
do
{
Console.WriteLine("请选择您需要的运算类型:1.四则运算 2.乘方 3.开方");
input = Convert.ToInt32(Console.ReadLine());
switch (input) //判断用户的输入
{
case 1:
Console.WriteLine("请分别输入用于计算的数字");
Console.Write("请输入第一条数字:");
myCount.value1 = Convert.ToDouble(Console.ReadLine());
Console.Write("请输入第二条数字:");
myCount.value2 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("请选择运算方式: 1.加法 2.减法 3.乘法 4.除法");
input = Convert.ToInt32(Console.ReadLine());
if (input <= 4) //如果运算类型是“四则运算”
{
myCount.mySign =(sign)input;
}
else
{
Console.WriteLine("请正确选择运算方式: 1.加法 2.减法 3.乘法 4.除法");
}
WriteResult();
break;
case 2://用户选择乘方
myCount.mySign = sign.乘方;
Console.Write("请输入底数:");
myCount.value1 = Convert.ToDouble(Console.ReadLine());
Console.Write("请输入指数:");
myCount.value2 = Convert.ToDouble(Console.ReadLine());
WriteResult();
break;
case 3://用户选择开方
myCount.mySign = sign.开方;
Console.Write("请输入一条数字:");
myCount.value1 = Convert.ToDouble(Console.ReadLine());
WriteResult();
break;
default:
Console.WriteLine("请选择正确的运算类型:1.四则运算 2.乘方 3.开方");
break;
}
Console.WriteLine("\n继续运算吗?(y/n)");
answer = Console.ReadLine();
} while (answer.ToLower() == "y");
}
///
/// 输出运算结果
///
///
private static void WriteResult()
{
double result=0;
if (myCount.mySign <=(sign) 4)
{
switch (myCount.mySign)
{
case (sign)1:
result = myCount.value1 + myCount.value2;
break;
case (sign)2:
result = myCount.value1 - myCount.value2;
break;
case (sign)3:
result = myCount.value1 * myCount.value2;
break;
case (sign)4:
result = myCount.value1 / myCount.value2;
break;
}
Console.WriteLine("的结果是", myCount.value1, (sign)myCount.mySign, myCount.value2, result);
}
else
{
switch (myCount.mySign)
{
case (sign)5:
result = Math.Pow(myCount.value1, myCount.value2);
Console.WriteLine("底数,指数的幂是",myCount.value1,myCount.value2,result);
break;
case (sign)6:
result = Math.Sqrt(myCount.value1);
Console.WriteLine("的平方根是",myCount.value1,result);
break;
}
}
}
}
}
///
/// 分解字符串中括号左、中、右部分
///
/// 所要分析的字符串
/// 输出左边
/// 输出中间
/// 输出右边
private static void Bracket(string AText,
out string ALStr, out string ACStr, out string ARStr)
{
int L = 0, R = 0; // 出现的括号,判断匹配用
ALStr = ACStr = ARStr = "";
for (int i = 0; i < AText.Length; i++)
{
if (AText[i] == '(') L++;
else if (AText[i] == ')') R++;
if (L == 0) ALStr += AText[i];
else if (L > R) ACStr += AText[i];
else
{
ARStr = AText.Substring(i + 1);
break;
}
}
if (ACStr.Length >= 1) ACStr = ACStr.Remove(0, 1);
}
private static string fCalc(string AText)
{
if (AText.IndexOf('(') >= 0)
{
string L, C, R;
Bracket(AText, out L, out C, out R);
return fCalc(L + fCalc(C) + R);
}
else if ((AText.IndexOf('+') >= 0) || (AText.IndexOf('-') >= 0))
{
int i = AText.IndexOf('+');
int j = AText.IndexOf('-');
if (i < 0) i = AText.Length - 1;
if (j < 0) j = AText.Length - 1;
int K = Math.Min(i, j);
string L = AText.Substring(0, K);
string R = AText.Substring(K + 1);
if (L.Length <= 0) L = "0";
if (R.Length <= 0) R = "0";
if (i == K)
return (double.Parse(fCalc(L)) + double.Parse(fCalc(R))).ToString();
else return (double.Parse(fCalc(L)) - double.Parse(fCalc(R))).ToString();
}
else if ((AText.IndexOf('*') >= 0) || (AText.IndexOf('/') >= 0))
{
int i = AText.IndexOf('*');
int j = AText.IndexOf('/');
if (i < 0) i = AText.Length - 1;
if (j < 0) j = AText.Length - 1;
int K = Math.Min(i, j);
string L = AText.Substring(0, K);
string R = AText.Substring(K + 1);
if (L.Length <= 0) L = "0";
if (R.Length <= 0) R = "0";
if (i == K)
return (double.Parse(fCalc(L)) * double.Parse(fCalc(R))).ToString();
else return (double.Parse(fCalc(L)) / double.Parse(fCalc(R))).ToString();
}
else if ((AText.IndexOf('_') >= 0))
return (-double.Parse(fCalc(AText.Substring(1)))).ToString();
else return double.Parse(AText).ToString();
}
///
/// 计算表达式
///
/// 输入的表达式
///
private static string Calc(string AText)
{
string vText = "";
int L = AText.Length;
#region 处理负号
for (int i = 0; i < L; i++)
{
if ((AText[i] == '-') && (i + 1 < L) &&
("+-()".IndexOf(AText[i + 1]) < 0))
{
if ((i == 0) || ((i > 0) && ("*/".IndexOf(AText[i - 1]) >= 0)))
vText += "_";
else if (((i > 0) && ("+-".IndexOf(AText[i - 1]) >= 0)) ||
((i + 1 < L) && ("+-()".IndexOf(AText[i + 1]) < 0)))
vText += "+_";
else vText += AText[i];
}
else vText += AText[i];
}
#endregion 处理负号
return fCalc(vText);
}
明白你的意思,做过类似的,技术简单,主要是对字符串进行截取和操作、判断、拼合等。代码就不拿出来了,太长了。
什么