Khi Ty Ответов: 2

Как преобразовать содержимое файла в числа в visual studio


Для этого файла математических уравнений я должен преобразовать его в код и вычислить правильный ответ. Но я не знаю, как это сделать.

2 + 2
10 + 12
9 + 7
0 + 8
5 - 3
19 - 8
9 * 4
6 * 7
11 * 12
16 / 4
100 / 5
36 / 9


Что я уже пробовал:

foreach (string line in fileInput)
{
  string[] lineSplit = line.Split(',');
  Console.WriteLine(2 + 2);
}

Maciej Los

Сколько раз вы хотите задать один и тот же вопрос?
Это же 3. один!
Вопросы членов &усилителя; ответы[^]

2 Ответов

Рейтинг:
20

Maciej Los

Это нелегкая работа. Я бы предложил начать здесь: Написание простых математических выражений в C#[^]

Эти статьи тоже могут быть полезны:
Механизм вычислений для .NET[^]
Синтаксический анализ математических выражений в VB.NET: миссия возможна[^]

[РЕДАКТИРОВАТЬ]
Я хотел бы сказать: для всех этих ленивых людей то, что я создал (основываясь на первой статье, упомянутой в этом ответе) очень, очень, очень простой и простой класс называется SingleMathExpressionEvaluator Он способен вычислять одно математическое выражение только с одним арифметическим оператором за один раз.

void Main()
{
	//string[] lines = File.ReadAllLines("fullFileNameHere.txt");

	//tested on:
	string[] lines = {"2 + 2", "10 + 12", "10 + -12", "9 + 7", "0 + 8", "5 - 3", "-2 + -3", "5 - -2",
	"19 - 8", "9 * 4", "6 * 7", "5 * -8", "11 * 12", "16 / 4", "100 / 5", "-100 / -2", "36 / 9", "5 ^ 2", "-3 ^ 3"};	

	SingleMathExpressionEvaluator smee = new SingleMathExpressionEvaluator();
	foreach(string line in lines)
	{
		Console.WriteLine($"{line} = {smee.Eval(line)}");
	}
	smee = null;
	
}

// Define other methods and classes here


class SingleMathExpressionEvaluator
{
	private string pattern = @"-?\d+"; 
	private Regex r = null;
	
	public SingleMathExpressionEvaluator()
	{
		r = new Regex(pattern);
	}
	
	public double Eval(string expressiontext)
	{
		double left = 0.0;
		double right = 0.0;
		double result = 0.0;
		string[] tokens = {" "};

		//get mathematical operator
		string  token = r.Replace(expressiontext, "").Trim();
		//get left and right side of mathematical expression
		string[] nodes = expressiontext.Split(tokens, StringSplitOptions.RemoveEmptyEntries);
		if(!Double.TryParse(nodes[0], out left)) Console.WriteLine("Left part of expression is not a number!");
		if(!Double.TryParse(nodes[nodes.Length-1], out right)) Console.WriteLine("Right part of expression is not a number!");
		switch(token)
		{
			case "+":
				result = left + right;
				break;
			case "-":
				result = left - right;
				break;
			case "*":
				result = left * right;
				break;
			case "/":
				result = left / right;
				break;
			case "^":
				result = Math.Pow(left, right);
				break;
		}

		return result;
	}
}


Результат:
2 + 2 = 4
10 + 12 = 22
10 + -12 = -2
9 + 7 = 16
0 + 8 = 8
5 - 3 = 2
-2 + -3 = -5
5 - -2 = 7
19 - 8 = 11
9 * 4 = 36
6 * 7 = 42
5 * -8 = -40
11 * 12 = 132
16 / 4 = 4
100 / 5 = 20
-100 / -2 = 50
36 / 9 = 4
5 ^ 2 = 25
-3 ^ 3 = -27


Рейтинг:
0

OriginalGriff

Начните с просмотра данных, а затем кода: где в данных вы находите запятую?

Сначала проанализируйте свои данные, а затем начните планировать, что делать: для этого упражнения все довольно просто: каждое выражение находится в одной строке, поэтому считайте файл в строковый массив с файлом.Прочитайте все строки, а затем обработайте их отдельно.
Написать метод оценки, который получает string параметр и возвращает double ценность.
Обработайте строку в набор из трех "токенов" - X, operator, Y и отбросьте все пробелы. Вы могли бы использовать string.Split для этого, если вы разделяете на пробелы вместо запятых - вы не можете разделить на свои операторы, так как Split отбрасывает символ, на который он разделен.
Тогда все просто: используйте двойной.Метод tryparse[^] для преобразования чисел и использования switch оператор для обработки операторов.

Красиво и просто!