Написать программу, позволяющую решить простейшие уравнения или системы уравнений - 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; } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д