Написать программу, позволяющую решить простейшие уравнения или системы уравнений - C#
Формулировка задачи:
Всем доброго дня!
Прошу вас о помощи, потому что послезавтра сдавать лабораторные.
Надо написать программу позволяющую решить простейшие уравнения или системы уравнений. Исходные данные и результат должны быть представлены в понятном математическом виде. Выводить ошибку, если уравнение не имеет корней или их бесконечное множество.
Заранее спасибо за любую помощь.
Решение задачи: «Написать программу, позволяющую решить простейшие уравнения или системы уравнений»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace Num__
{
public partial class Form1 : Form
{
double c;
bool status = false;
bool stat = true;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string inString = textBox1.Text;
if (Checked(inString))
{
string outStr = GetExp(inString);
textBox1.Text += " = " + Reshenie(outStr);
status = true;
}
}
static private bool Checked(string str)
{
int sum = 0;
foreach (char ch in str)
{
if (ch == '(')
sum++;
if (ch == ')')
sum--;
}
if (sum != 0 || IsOperator(str[0]) || IsOperator(str[str.Length - 1]))
{
MessageBox.Show("Error!");
return false;
}
return true;
}
private double Reshenie(string str)
{
Stack<double> resh = new Stack<double>();
for (int i = 0; i < str.Length; i++)
{
if (Char.IsDigit(str[i]))
{
string a = "";
while (!IsDelimetr(str[i])) //Пока не разделитель
{
a += str[i]; //Добаляем
i++;
if (i == str.Length) break;
}
resh.Push(double.Parse(a));
i--;
continue;
}
else if (IsOperator(str[i]))
{
double a = resh.Pop();
double b = resh.Pop();
switch (str[i])
{
case '+': c = b + a; break;
case '-': c = b - a; break;
case '*': c = b * a; break;
case '/': c = b / a; break;
case '^': c = double.Parse(Math.Pow(double.Parse(b.ToString()), double.Parse(a.ToString())).ToString()); break;
}
resh.Push(c);
}
}
return resh.Peek();
}
private string GetExp(string str)
{
string outString = "";
Stack<char> operStack = new Stack<char>();
for (int i = 0; i < str.Length; i++)
{
if (str[i] == ' ') //Если пробел
continue; //пропускаем
if (Char.IsDigit(str[i])) //Если число
{
while (!IsDelimetr(str[i])) //Пока не разделитель
{
outString += str[i]; //Добаляем
i++;
if (i == str.Length) break;
}
outString += " ";
i--;
continue;
}
if (IsOperator(str[i]))
{
if (operStack.Count > 0)
if (GetPriority(str[i]) <= GetPriority(operStack.Peek()))
outString += operStack.Pop().ToString() + " ";
operStack.Push(char.Parse(str[i].ToString()));
}
if (str[i] == '(')
operStack.Push(str[i]);
if (str[i] == ')')
{
char s = operStack.Pop();
while (s != '(')
{
outString += s.ToString() + ' ';
s = operStack.Pop();
}
}
}
while (operStack.Count > 0)
outString += operStack.Pop() + " ";
return outString;
}
static private bool IsOperator(char с)
{
if (("+-/*^".IndexOf(с) != -1))
return true;
return false;
}
private byte GetPriority(char s)
{
switch (s)
{
case '(':
return 0;
case ')':
return 1;
case '+':
return 2;
case '-':
return 3;
case '*':
return 4;
case '/':
return 4;
case '^':
return 5;
default:
return 6;
}
}
static private bool IsDelimetr(char c)
{
if ((" +-/*^()=".IndexOf(c) != -1))
return true;
return false;
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (status)
{
textBox1.Clear();
status = false;
}
}
}
}