Главная страница
Навигация по странице:

  • Users.Context.cs

  • ResultLab.cs

  • Дипломная работа. Разработка виртуального лабораторного комплекса по дисциплине Методы оптимизации


    Скачать 2.09 Mb.
    НазваниеРазработка виртуального лабораторного комплекса по дисциплине Методы оптимизации
    АнкорДипломная работа
    Дата03.06.2022
    Размер2.09 Mb.
    Формат файлаdocx
    Имя файлаbakanina_diplom.docx
    ТипДиплом
    #567993
    страница8 из 8
    1   2   3   4   5   6   7   8

    OperatorContainer.cs

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespaceдиплом_беловой

    {

    publicclassOperatorContainer

    {

    publicstatic List operators = new List();

    staticOperatorContainer()

    {

    operators.Add(new operators("(", 1));

    operators.Add(new operators(")", 1));

    operators.Add(new operators("+", 2));

    operators.Add(new operators("-", 2));

    operators.Add(new operators("*", 3));

    operators.Add(new operators("/", 3));

    operators.Add(new operators("s", 4)); //sin

    operators.Add(new operators("c", 4)); //cos

    operators.Add(new operators("t", 4)); //tg

    operators.Add(new operators("q", 4)); //sqrt

    operators.Add(new operators("r", 4)); //sqrtn

    operators.Add(new operators("p", 4)); //sqr

    operators.Add(new operators("l", 4)); //ln

    operators.Add(new operators("v", 4)); //pow

    operators.Add(new operators("e", 5)); //e

    operators.Add(new operators("x", 5)); //x

    }
    publicstatic operators Find(string op)

    {

    foreach (var item in operators)

    {

    if (item.Value == op)

    {

    return item;

    }

    }

    returnnull;

    }

    }

    }

    operators.cs

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespaceдиплом_беловой

    {

    publicclassoperators

    {

    publicstring Value;

    publicdouble tempValue;

    publicint priorst;
    publicoperators(string Value, int priorst)

    {

    this.Value = Value;

    this.priorst = priorst;

    }
    publicoperators(double Value, int priorst)

    {

    this.tempValue = Value;

    this.Value = Convert.ToString(this.tempValue);

    this.priorst = priorst;

    }

    }

    }

    steps.cs

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespaceдиплом_беловой

    {

    publicclasssteps

    {

    publicint step { get; set; }

    publicdouble xi { get; set; }

    publicdouble fxi { get; set; }

    publicdouble minx { get; set; }

    publicdouble minfx { get; set; }

    publicdouble h { get; set; }

    publicdouble a { get; set; }

    publicdouble b { get; set; }

    publicdouble En { get; set; }

    publicdouble x1 { get; set; }

    publicdouble x2 { get; set; }

    publicdouble fx1 { get; set; }

    publicdouble fx2 { get; set; }

    }

    }

    Users.Context.cs

    namespaceдиплом_беловой

    {

    using System;

    using System.Data.Entity;

    using System.Data.Entity.Infrastructure;
    publicpartialclassUsersContainer : DbContext

    {

    publicUsersContainer()

    : base("name=UsersContainer")

    {

    }
    protectedoverridevoid OnModelCreating(DbModelBuilder modelBuilder)

    {

    thrownew UnintentionalCodeFirstException();

    }
    publicvirtual DbSet StudentsSet { get; set; }

    publicvirtual DbSet ResultLabSet { get; set; }

    }

    }

    ResultLab.cs

    namespaceдиплом_беловой

    {

    using System;

    using System.Collections.Generic;
    publicpartialclassResultLab

    {

    publicint Id { get; set; }

    publicstring Lab1 { get; set; }

    publicstring Lab2 { get; set; }

    publicstring Lab3 { get; set; }

    publicstring Lab4 { get; set; }
    publicvirtual Students Students { get; set; }

    }

    }

    Students.cs

    namespaceдиплом_беловой

    {

    using System;

    using System.Collections.Generic;
    publicpartialclassStudents

    {

    publicint Id { get; set; }

    publicstring FIO { get; set; }

    publicstring Group { get; set; }

    publicstring Login { get; set; }

    publicstring Password { get; set; }
    publicvirtual ResultLab ResultLab { get; set; }

    }

    }

    test.cs

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    using System.Windows.Forms;
    namespace диплом_беловой

    {

    public partial class test : Form

    {

    int idreg; int lab; int n; string[] quest = new string[6]; string[] answer = new string[6]; int ball = 0; int chek; string res; char[] arr = new char[6];

    public test(int id, int numlab)

    {

    InitializeComponent();

    idreg = id;

    lab = numlab;

    }
    private void btStart_Click(object sender, EventArgs e)

    {

    n = 0;

    btStart.Visible = false;

    label1.Visible = true;

    panel1.Visible = true;

    button1.Visible = false;

    btNext.Visible = true;

    //labNum.Text = Convert.ToString(n+1);

    //labNum.Visible = true;

    label2.Visible = true;

    if (lab == 1)

    {

    quest[0] = "При увеличении точности, количество итераций...";

    quest[1] = "Почему метод равномерного поиска считается неэффективным?";

    quest[2] = "Зная, в скольких точках в процессе решения задачи равномерного поиска пришлось вычислять значение целевой функции, можно определить...";

    quest[3] = "Какой из методов одномерной оптимизации является простейшим?";

    quest[4] = "По какой формуле находится погрешность Ɛn?";

    quest[5] = "При каком условии поиск останавливается и предпоследняя точка становится решением?";

    //ответы на 1ый

    rdb1.Text = "Увеличивается"; //*

    rdb2.Text = "Уменьшается";

    rdb3.Text = "Остается прежним";

    rdb4.Text = "Увеличивается или остается прежним";

    }

    else if (lab == 2)

    {

    quest[0] = "Перебор точек отрезка происходит сначала с шагом Δ = Xi+1 - Xi > E до тех пор, пока...";

    quest[1] = "Следующий шаг при выполнении условия f(Xi) <= f(Xi+1) или по достижению точки конца отрезка.";

    quest[2] = "Задачу можно считать выполненной ...";

    quest[3] = "Во сколько раз обычно уменьшается шаг перебора:";

    quest[4] = "В каких задачах используется метод поразрядного поиска?";

    quest[5] = "За счет какого свойства функции мы можем грубо определить первоначальный отрезок для поиска?";

    rdb1.Text = "не выполнится условие f(Xi)<=f(Xi+1) или пока очередная из этих точек не совпадет с концом отрезка"; //*

    rdb2.Text = "пока очередная из этих точек не совпадет с концом отрезка";

    rdb3.Text = "не выполнится условие f(Xi)<=f(Xi+1)";

    rdb4.Text = "все варианты не верные";

    }

    else if (lab == 3)

    {

    quest[0] = "Метод заключается в том, ...";

    quest[1] = "Первым шагом при решении методом равномерного поиска является:";

    quest[2] = "При поиске минимума функции переход к отрезку [a; x2], положив b = x2 осуществляется при условии...";

    quest[3] = "Формула для выбора точки X1 деления:";

    quest[4] = "В методе дихотомии точки x1 и x2 располагаются?";

    quest[5] = "Какое условие должно выполняться для завершения вычисления по методу дихотомии?";

    rdb1.Text = "чтобы разделить отрезок на n равных частей точкамии перебором каждой точки в поисках минимума";

    rdb2.Text = "чтобы делить очередной отрезок, содержащий точку минимума функции, пополам и исключать из рассмотрения ту часть, где минимума быть не может"; //*

    rdb3.Text = "деление отрезка на две неравные части, что отношение длины всего отрезка к длине его большей части равно отношению длин большей и меньшей частей отрезка";

    rdb4.Text = "чтобы находить точку минимума графическим путем, без каких-либо вычислений";

    }

    else if (lab == 4)

    {

    quest[0] = "Какой метод требует меньшее количество затрачиваемых итераций?";

    quest[1] = "Что называется золотым сечением отрезка?";

    quest[2] = "Какие точки называются точками золотого сечения?";

    quest[3] = "В конце вычислений по методу золотого сечения в качестве приближенного значения можно взять...";

    quest[4] = "В чем преимущество метода золотого сечения в сравнение с методом дихотомии?";

    quest[5] = "При невыполнении условия En<=E нужно перейти новому отрезку и к новым пробным точкам. Когда f(x1) < f(x2), то b будет равен";

    rdb1.Text = "Равномерного поиска";

    rdb2.Text = "Поразрядного поиска";

    rdb3.Text = "Дихотомии";

    rdb4.Text = "Золотого сечения"; //*

    }

    labelQuest.Visible = true;

    labelQuest.Text = Convert.ToString(quest[0]);

    }
    private void button1_Click(object sender, EventArgs e)

    {

    Students user = null;

    if (button1.Text == "завершить")

    {

    //запись результата

    res += Convert.ToString(chek);

    // MessageBox.Show(Convert.ToString(res), "Количество баллов (из 12)", MessageBoxButtons.OK, MessageBoxIcon.Information);

    arr = res.ToCharArray();

    if (lab == 1)

    {

    if (arr[0] == '1')

    ball = ball + 2;

    if (arr[1] == '3')

    ball = ball + 2;

    if (arr[2] == '1')

    ball = ball + 2;

    if (arr[3] == '3')

    ball = ball + 2;

    if (arr[4] == '4')

    ball = ball + 2;

    if (arr[5] == '2')

    ball = ball + 2;

    using (UsersContainer db = new UsersContainer())

    {

    foreach (var item in db.StudentsSet)

    {

    if (item.Id == idreg)

    {

    user = db.StudentsSet.Find(item.Id);

    }

    }

    user.ResultLab.Lab1 = Convert.ToString(ball);

    db.SaveChanges();

    }

    }

    if (lab == 2)

    {

    if (arr[0] == '2')

    ball = ball + 2;

    if (arr[1] == '1')

    ball = ball + 2;

    if (arr[2] == '2')

    ball = ball + 2;

    if (arr[3] == '1')

    ball = ball + 2;

    if (arr[4] == '3')

    ball = ball + 2;

    if (arr[5] == '4')

    ball = ball + 2;

    using (UsersContainer db = new UsersContainer())

    {

    foreach (var item in db.StudentsSet)

    {

    if (item.Id == idreg)

    {

    user = db.StudentsSet.Find(item.Id);

    }

    }

    user.ResultLab.Lab2 = Convert.ToString(ball);

    db.SaveChanges();

    }

    }

    if (lab == 3)

    {

    if (arr[0] == '2')

    ball = ball + 2;

    if (arr[1] == '3')

    ball = ball + 2;

    if (arr[2] == '3')

    ball = ball + 2;

    if (arr[3] == '2')

    ball = ball + 2;

    if (arr[4] == '1')

    ball = ball + 2;

    if (arr[5] == '4')

    ball = ball + 2;

    using (UsersContainer db = new UsersContainer())

    {

    foreach (var item in db.StudentsSet)

    {

    if (item.Id == idreg)

    {

    user = db.StudentsSet.Find(item.Id);

    }

    }

    user.ResultLab.Lab3 = Convert.ToString(ball);

    db.SaveChanges();

    }

    }

    if (lab == 4)

    {

    if (arr[0] == '4')

    ball = ball + 2;

    if (arr[1] == '1')

    ball = ball + 2;

    if (arr[2] == '4')

    ball = ball + 2;

    if (arr[3] == '2')

    ball = ball + 2;

    if (arr[4] == '3')

    ball = ball + 2;

    if (arr[5] == '1')

    ball = ball + 2;

    using (UsersContainer db = new UsersContainer())

    {

    foreach (var item in db.StudentsSet)

    {

    if (item.Id == idreg)

    {

    user = db.StudentsSet.Find(item.Id);

    }

    }

    user.ResultLab.Lab4 = Convert.ToString(ball);

    db.SaveChanges();

    }

    }

    MessageBox.Show(Convert.ToString(ball), "Количество баллов (из 12)", MessageBoxButtons.OK, MessageBoxIcon.Information);

    this.Close();

    }

    else if (button1.Text == "закрыть")

    {

    this.Close();

    }

    }
    private void btNext_Click(object sender, EventArgs e)

    {

    res += Convert.ToString(chek);

    rdb1.Checked = false;

    rdb2.Checked = false;

    rdb3.Checked = false;

    rdb4.Checked = false;

    n++;

    if (n!=5)

    {

    labelQuest.Text = Convert.ToString(quest[n]);

    //labNum.Text = Convert.ToString(n);

    }

    else if (n==5)

    {

    labelQuest.Text = Convert.ToString(quest[n]);

    //labNum.Text = Convert.ToString(n);

    btNext.Visible = false;

    button1.Text = "завершить";

    button1.Visible = true;

    }

    //ответы

    //131342

    if (lab == 1)

    {

    if (n == 1)

    {

    rdb1.Text = "Требует больших затрат";

    rdb2.Text = "Большой объем вычислений";

    rdb3.Text = "Варианты 1 и 2 верны"; //*

    rdb4.Text = "Плохая точность";

    }

    if (n == 2)

    {

    rdb1.Text = "Число отрезков n"; //*

    rdb2.Text = "Допустимую погрешность";

    rdb3.Text = "Длину последнего отрезка";

    rdb4.Text = "Достигнутую точность";

    }

    if (n == 3)

    {

    rdb1.Text = "Метод поразрядного поиска";

    rdb2.Text = "Метод дихотомии";

    rdb3.Text = "Метод равномерного поиска"; //*

    rdb4.Text = "Нет верного ответа";

    }

    if (n == 4)

    {

    rdb1.Text = "Ɛn = (b - a) / n + 1";

    rdb2.Text = "Ɛn = (b + a) / n";

    rdb3.Text = "Все варианты не верны";

    rdb4.Text = "Ɛn = (b - a) / n"; //*

    }

    if (n == 5)

    {

    rdb1.Text = "f(xi+1) < f(xi)";

    rdb2.Text = "f(xi+1) > f(xi)"; //*

    rdb3.Text = "f(xi+1) >= f(xi)";

    rdb4.Text = "f(xi+1) <= f(xi)";

    }

    }

    //212134

    if (lab == 2)

    {

    if (n == 1)

    {

    rdb1.Text = "a) После этого шаг увеличивается (обычно в 4 раза), и перебор точек с новым шагом производится в противоположном направлении до тех пор, пока значения f(x)" +

    " снова не перестанут уменьшаться или очередная точка не совпадет с другим концом отрезка и т.д."; //*

    rdb2.Text = "b) После этого шаг уменьшается (обычно в 4 раза), и перебор точек с новым шагом производится в противоположном направлении до тех пор, пока значения f(x)" +

    " снова не перестанут уменьшаться или очередная точка не совпадет с другим концом отрезка и т.д.";

    rdb3.Text = "c) После этого шаг уменьшается (обычно в 4 раза), и перебор точек с новым шагом производится с самого начала до тех пор, пока значения f(x)" +

    " снова не перестанут уменьшаться или очередная точка не совпадет с другим концом отрезка и т.д.";

    rdb4.Text = "d) После этого шаг уменьшается (обычно в 4 раза), и перебор точек с новым шагом производится в противоположном направлении до тех пор, пока значения f(x)" +

    " снова не перестанут увеличиваться или очередная точка не совпадет с другим концом отрезка и т.д.";

    }

    if (n == 2)

    {

    rdb1.Text = "когда перебор в данном направлении не закончен, а использованный при этом шаг дискретизации превосходит E";

    rdb2.Text = "когда перебор в данном направлении закончен и |h| <= E"; //*

    rdb3.Text = "Если En > E";

    rdb4.Text = "когда перебор в данном направлении закончен и |h| >= E";

    }

    if (n == 3)

    {

    rdb1.Text = "в 4"; //*

    rdb2.Text = "в 3";

    rdb3.Text = "в 2";

    rdb4.Text = "в 7";

    }

    if (n == 4)

    {

    rdb1.Text = "В задачах безусловной оптимизации ";

    rdb2.Text = "В задачах многомерного поиска";

    rdb3.Text = "В задачах одномерной оптимизации";//*

    rdb4.Text = "Ни один из вышеперечисленных";

    }

    if (n == 5)

    {

    rdb1.Text = "Невозрастания";

    rdb2.Text = "Неубывания";

    rdb3.Text = "Четности";

    rdb4.Text = "Унимодальности";//*

    }

    }

    //233214

    if (lab == 3)

    {

    if (n == 1)

    {

    rdb1.Text = "Выбрать начальный шаг Δ = (b-a)/4. Положить x0 = a, вычислить f(x0)";

    rdb2.Text = "Разбитие отрезка на n равных частей точками деления";

    rdb3.Text = "Задать параметр точности E>0, параметр алгоритма δ ∈ (0;2E) ";//*

    rdb4.Text = "Задать E>0";

    }

    if (n == 2)

    {

    rdb1.Text = "f(x1)<=f(x2)";

    rdb2.Text = "f(x1)=f(x2)";

    rdb3.Text = "Оба варианта верны";//*

    rdb4.Text = "Оба не верны";

    }

    if (n == 3)

    {

    rdb1.Text = "X1 = (a - b + δ) / 2";

    rdb2.Text = "X1 = (a + b - δ) / 2";//*

    rdb3.Text = "X1 = (a + b - δ) / 4";

    rdb4.Text = "X1 = (a + 2b - δ) / 4";

    }

    if (n == 4)

    {

    rdb1.Text = "Располагаются близко к середине очередного отрезка [a;b]"; //*

    rdb2.Text = "Располагаются близко к краям очередного отрезка [a;b]";

    rdb3.Text = "Расположение точек выбирается произвольно";

    rdb4.Text = "Все варианты не верны";

    }

    if (n == 5)

    {

    rdb1.Text = "(b*a) / 2≤ε";

    rdb2.Text = "(b-a) * 2≤ε";

    rdb3.Text = "(b+a) / 2≤ε";

    rdb4.Text = "(b-a) / 2≤ε "; //*

    }

    }

    //414231

    if (lab == 4)

    {

    if (n == 1)

    {

    rdb1.Text = "Такое деление отрезка на две неравные части, что отношение длины всего отрезка к длине его большей части " +

    "равно отношению длин большей и меньшей частей отрезка."; //*

    rdb2.Text = "Такое деление отрезка на равные части, что отношение длины всего отрезка к длине его большей части равно отношению длин большей и меньшей частей отрезка.";

    rdb3.Text = "Такое деление отрезка на две равные части, что отношение длины всего отрезка к длине его большей части не равно отношению длин большей и меньшей частей отрезка.";

    rdb4.Text = "Все ответы не верные";

    }

    if (n == 2)

    {

    rdb1.Text = "Каждая из них делит отрезок [a;b] на две равные части так, что отношение длины всего отрезка к длине его большей части равно отношению длин большей и меньше частей отрезка.";

    rdb2.Text = "Каждая из них делит отрезок [a;b] на три неравные части так, что отношение длины всего отрезка к длине его большей части равно отношению длин большей и меньше частей отрезка.";

    rdb3.Text = "Каждая из них делит отрезок [a;b] на три равные так, что отношение длины всего отрезка к длине его большей части равно отношению длин большей и меньше частей отрезка.";

    rdb4.Text = "Каждая из них делит отрезок [a;b] на две неравные части так, что отношение длины всего отрезка к длине его большей части равно отношению длин большей и меньше частей отрезка.";//*

    }

    if (n == 3)

    {

    rdb1.Text = "конец последнего из полученных отрезков";

    rdb2.Text = "середину последнего из полученных отрезков";//*

    rdb3.Text = "начало последнего из полученных отрезков";

    rdb4.Text = "последний отрезок";

    }

    if (n == 4)

    {

    rdb1.Text = "Деление не производится";

    rdb2.Text = "Производится деление на 4 части";

    rdb3.Text = "Одна из точек уже найдена";//*

    rdb4.Text = "Ни один из вышеперечисленных";

    }

    if (n == 5)

    {

    rdb1.Text = "x2"; //*

    rdb2.Text = "x1";

    rdb3.Text = "a";

    rdb4.Text = "f(x1)";

    }

    }

    }
    private void rdb1_CheckedChanged(object sender, EventArgs e)

    {

    chek = 1;

    }
    private void rdb2_CheckedChanged(object sender, EventArgs e)

    {

    chek = 2;

    }
    private void rdb3_CheckedChanged(object sender, EventArgs e)

    {

    chek = 3;

    }
    private void rdb4_CheckedChanged(object sender, EventArgs e)

    {

    chek = 4;

    }
    private void test_Load(object sender, EventArgs e)

    {
    }

    }

    }

    function.cs

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    using System.Windows.Forms;
    namespace диплом_беловой

    {

    public partial class function : Form

    {

    int metod;

    int numlab;

    string spow;

    int pow;

    int powsqrtn;

    int idreg;

    List myList = new List();

    bool error = false;

    int info = 0;
    public function(int point, int id)

    {

    InitializeComponent();

    numlab = point;

    idreg = id;

    Zagolovok(numlab);

    richTextBox1.Text = "Ввод операций: \n" +

    "1. Сложение, вычитание, деление, умножение: a+b, a-b, a/b, a*b \n" +

    "2. sin(x), cos(x), tg(x) \n" +

    "3. Возведение в квадрат: sqr(x) \n" +

    "4. Возведение в степень pow...(x), где ... - степень \n" +

    "5. Квадратный корень: sqrt(x) \n" +

    "6. Корень некоторой степени: sqrtn...(x), где ... - степень \n" +

    "7. Натуральный логарифм: ln(x) \n" +

    "В качестве переменной использовать x!";

    }
    private void Zagolovok(int point)

    {

    if (point == 1)

    {

    this.Text = "Лабораторный комплекс 'Методы оптимизации' || Равномерный поиск";

    }

    if (point == 2)

    {

    this.Text = "Лабораторный комплекс 'Методы оптимизации' || Поразрядный поиск";

    }

    if (point == 3)

    {

    this.Text = "Лабораторный комплекс 'Методы оптимизации' || Дихотомия";

    txtbDel.Visible = true;

    label9.Visible = true;

    }

    if (point == 4)

    {

    this.Text = "Лабораторный комплекс 'Методы оптимизации' || Золотое сечение";

    }

    }
    private void btTabl_Click(object sender, EventArgs e)

    {

    tablica f3 = new tablica(myList, numlab); //передать ответы

    f3.ShowDialog();

    }

    private void button1_Click(object sender, EventArgs e)

    {

    myList.Clear();

    this.Close();

    }
    //ОПЗ

    private double Calculation(double x0, string func, Stack myStack)

    {

    double x = x0;

    string output = "";

    char[] f = func.ToCharArray();

    double res = 0.0;

    var temp = 0.0;

    int i;

    //обработка ОПЗ

    for (i = 0; i < f.Length; i++)

    {

    //определяем символ и приоритет

    if (char.IsDigit(f[i])) //цифра

    {

    output += f[i];

    continue;

    }

    else if (char.IsLetter(f[i]) && (f[i] != 's' && f[i] != 'c' && f[i] != 'q' && f[i] != 'p' && f[i] != 'l' && f[i] != 'r' && f[i] != 't' && f[i] != 'v')) //переменная (буква, но не операция)

    {

    if (f[i] == 'e')

    {

    output += "e";

    }

    else if (f[i] != 'e')

    {

    //помещаем x

    output += "x";

    }

    continue;

    }

    //операция

    else if (f[i] == '+' || f[i] == '-' || f[i] == '*' || f[i] == '/' || f[i] == '(' || f[i] == ')' || f[i] == '^' || f[i] == 's' || f[i] == 'c' || f[i] == 'q' || f[i] == 'p' || f[i] == 'l' || f[i] == 't' || f[i] == 'r' || f[i] == 'v')

    {

    char m = f[i];
    if (m == '(')

    {

    myStack.Push(OperatorContainer.Find("("));

    continue;

    }
    if (m == ')')

    {

    while (myStack.Peek().Value != "(")

    {

    output += myStack.Pop().Value;

    }

    if (myStack.Peek().Value == "(")

    {

    myStack.Pop();

    }

    continue;

    }

    int k; //временная переменная для порядкового номера

    //sin, sqrt, sqr

    if (f[i] == 's')

    {

    k = i; //временная переменная для порядкового номера

    i++; //проверяем символ после s

    if (f[i] == 'i') //sin

    {

    m = 's';

    i++;

    }

    else if (f[i] == 'q')

    {

    i = i + 2;

    if (f[i] == 't') //sqrt

    {

    //m = 'q';

    // continue;

    i++;

    if (f[i] != 'n')

    {

    m = 'q';

    i = i - 1;

    continue;

    }

    else if (f[i] == 'n') //sqrtn

    {

    m = 'r';

    i = i + 1;

    powsqrtn = f[i];

    continue;

    }
    }

    else if (f[i] != 't') //sqr

    {

    m = 'p';

    i--;

    }

    }

    }

    //pow*(x) (* - степень)

    if (f[i] == 'p')

    {

    m = 'v';

    i = i + 3; //проверяем символ после s

    pow = f[i];

    continue;

    }

    //cos

    if (f[i] == 'c')

    {

    k = i; //временная переменная для порядкового номера

    m = 'c';

    i = i + 2;

    }

    //tg

    if (f[i] == 't')

    {

    k = i; //временная переменная для порядкового номера

    m = 't';

    i++;

    }

    //ln

    if (f[i] == 'l')

    {

    k = i; //временная переменная для порядкового номера

    m = 'l';

    i++;

    }
    if (myStack.Count == 0 || myStack.Peek().priorst < OperatorContainer.Find(Convert.ToString(m)).priorst && m != ')')

    {

    myStack.Push(OperatorContainer.Find(m.ToString()));

    continue;

    }
    while (myStack.Peek().priorst >= OperatorContainer.Find(Convert.ToString(m)).priorst && m != '(')

    {

    output += myStack.Pop().Value;

    if (myStack.Count == 0)

    {

    break;

    }

    }

    myStack.Push(OperatorContainer.Find(Convert.ToString(m)));

    }

    }

    //опустошение стека

    while (myStack.Count != 0)

    {

    output += myStack.Pop().Value;

    }

    //textBox1.Text = output;

    //рассчет

    for (int j = 0; j < output.Length; j++)

    {

    if (Char.IsDigit(output[j]))

    {

    myStack.Push(new operators(Convert.ToString(output[j]), 0));

    continue;

    }

    else if (char.IsLetter(output[j]) && (output[j] != 's' && output[j] != 'c' && output[j] != 'q' && output[j] != 'p' && output[j] != 'l' && output[j] != 'v' && output[j] != 'r' && output[j] != 't' && output[j] != 'e' && output[j] != 'x')) //переменная (буква, но не операнд)

    {

    myStack.Push(new operators(Convert.ToString(output[j]), 0));

    continue;

    }

    else

    {

    if (output[j] == '+')

    {

    temp = Convert.ToDouble(Convert.ToString(myStack.Pop().Value)) + Convert.ToDouble(Convert.ToString(myStack.Pop().Value));

    myStack.Push(new operators(temp, 0));

    }

    if (output[j] == '-')

    {

    double temp2 = 0.0;

    temp2 = Convert.ToDouble(Convert.ToString(myStack.Pop().Value));

    temp = Convert.ToDouble(Convert.ToString(myStack.Pop().Value)) - temp2;

    myStack.Push(new operators(temp, 0));

    }

    if (output[j] == '*')

    {

    temp = Convert.ToDouble(Convert.ToString(myStack.Pop().Value)) * Convert.ToDouble(Convert.ToString(myStack.Pop().Value));

    myStack.Push(new operators(temp, 0));

    }

    if (output[j] == '/')

    {

    double temp2 = 0.0;

    temp2 = Convert.ToInt32(Convert.ToString(myStack.Pop().Value));

    temp = Convert.ToInt32(Convert.ToString(myStack.Pop().Value)) / temp2;

    myStack.Push(new operators(temp, 0));

    }

    if (output[j] == 's') //sin

    {

    temp = Math.Sin(Convert.ToDouble(myStack.Pop().Value));

    myStack.Push(new operators(temp, 0));

    }

    if (output[j] == 'c') //cos

    {

    temp = Math.Cos(Convert.ToDouble(myStack.Pop().Value));

    myStack.Push(new operators(temp, 0));

    }

    if (output[j] == 't') //tg

    {

    temp = Math.Tan(Convert.ToDouble(myStack.Pop().Value));

    myStack.Push(new operators(temp, 0));

    }

    if (output[j] == 'q') //sqrt

    {

    temp = Math.Sqrt(Convert.ToDouble(myStack.Pop().Value));

    myStack.Push(new operators(temp, 0));

    }

    if (output[j] == 'p') //sqr

    {

    double a = Convert.ToDouble(myStack.Pop().Value);

    temp = a * a;

    myStack.Push(new operators(temp, 0));

    }

    if (output[j] == 'l') //ln

    {

    temp = Math.Log(Convert.ToDouble(myStack.Pop().Value));

    myStack.Push(new operators(temp, 0));

    }

    if (output[j] == 'v') //pow

    {

    temp = Math.Pow(Convert.ToDouble(myStack.Pop().Value), pow);

    myStack.Push(new operators(temp, 0));

    }

    if (output[j] == 'r') //sqrtn

    {

    powsqrtn = 1 / powsqrtn;

    temp = Math.Pow(Convert.ToDouble(myStack.Pop().Value), powsqrtn);

    myStack.Push(new operators(temp, 0));

    }

    if (output[j] == 'x') //x

    {

    temp = x;

    myStack.Push(new operators(temp, 0));

    }

    if (output[j] == 'e') //экспонента

    {

    temp = Convert.ToDouble(2.71);

    myStack.Push(new operators(temp, 0));

    continue;

    }

    }

    }

    res = Convert.ToDouble(myStack.Pop().tempValue);

    return res;

    }
    private void btGo_Click(object sender, EventArgs e)

    {

    error = false;

    myList.Clear();

    //пустая строка

    if (txtbFunction.Text == "" || txtbA.Text == "" || txtbB.Text == "" || txtbE.Text == "")

    {

    MessageBox.Show("Введите все входные данные!", "Пустые строки", MessageBoxButtons.OK);

    error = true;

    }

    if (metod == 3 && (txtbFunction.Text == "" || txtbA.Text == "" || txtbB.Text == "" || txtbE.Text == "" || txtbDel.Text == ""))

    {

    MessageBox.Show("Введите все входные данные!", "Пустые строки", MessageBoxButtons.OK);

    error = true;

    }

    else if (error == false)

    {

    btTabl.Enabled = true;

    btTest.Enabled = true;

    Stack myStack = new Stack();

    string func = txtbFunction.Text; //функция

    char[] f = func.ToCharArray();

    //АЛГОРИТМЫ

    //РАВНОМЕРНЫЙ ПОИСК

    if (numlab == 1)

    {

    double n;

    double a = Convert.ToDouble(txtbA.Text);

    double b = Convert.ToDouble(txtbB.Text);

    double parE = Convert.ToDouble(txtbE.Text);

    n = (b - a) / parE;

    double xmin = 1000, fxmin = 1000, xi, fxi;

    int k = 1;

    for (int i = 1; i <= n; i++)

    {

    xi = a + i * (b - a) / (n + 1);

    fxi = Calculation(xi, func, myStack);

    //находим минимум

    if (fxi < fxmin)

    {

    xmin = xi;

    fxmin = fxi;

    }

    steps steps = new steps();

    {

    steps.step = k;

    steps.xi = xi;

    steps.fxi = fxi;

    steps.minx = xmin;

    steps.minfx = fxmin;

    steps.a = a;

    steps.b = b;

    k++;

    }

    myList.Add(steps);

    }

    //вывод xi, fxi

    txtbXMin.Text = Convert.ToString(xmin);

    txtbFXMin.Text = Convert.ToString(fxmin);

    }

    //ПОРАЗРЯДНЫЙ ПОИСК

    else if (numlab == 2)

    {

    bool cont = true;

    double a = Convert.ToDouble(txtbA.Text);

    double b = Convert.ToDouble(txtbB.Text);

    double parE = Convert.ToDouble(txtbE.Text);

    double h;

    double x0, x1, xmin;

    double fx0, fx1, fxmin;

    xmin = 0; fxmin = 0;

    int k = 1;

    if (parE <= 0)

    {

    MessageBox.Show("Параметр точности Е должен быть больше 0!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);

    }

    else if (parE > 0)

    {

    //шаг 0

    h = (b - a) / 4;

    x0 = a;

    fx0 = Calculation(x0, func, myStack);

    myList.Add(new steps() { step = k, a = a, b = b, xi = x0, fxi = fx0, minx = xmin, minfx = fxmin, h = h });

    k++;

    //шаг 1

    label1:

    x1 = x0 + h;

    fx1 = Calculation(x1, func, myStack);

    myList.Add(new steps() { step = k, a = a, b = b, xi = x1, fxi = fx1, minx = xmin, minfx = fxmin, h = h });

    k++;

    //шаг 2

    if (fx0 > fx1)

    {

    cont = false;

    //шаг 3

    x1 = x0;

    fx0 = fx1;

    myList.Add(new steps() { step = k, a = a, b = b, xi = x1, fxi = fx1, minx = xmin, minfx = fxmin, h = h });

    k++;

    if (x0 > a && x0 < b)

    {

    cont = true;

    goto label1;

    }

    else

    {

    cont = true;

    }

    }

    if (cont == true)

    {

    //шаг 4

    if (Math.Abs(h) <= parE)

    {

    //конец вычислений

    xmin = x0;

    fxmin = fx0;

    myList.Add(new steps() { step = k, a = a, b = b, xi = x0, fxi = fx0, minx = xmin, minfx = fxmin, h = h });

    // k++;

    txtbXMin.Text = Convert.ToString(xmin);

    txtbFXMin.Text = Convert.ToString(fxmin);

    }

    else

    {

    //шаг 5

    h = h * (-1);

    h = h / 4;

    x1 = x0;

    fx0 = fx1;

    myList.Add(new steps() { step = k, a = a, b = b, xi = x1, fxi = fx1, minx = xmin, minfx = fxmin, h = h });

    k++;

    goto label1;

    }

    }

    }

    }

    //МЕТОД ДИХОТОМИИ

    else if (numlab == 3)

    {

    double a = Convert.ToDouble(txtbA.Text);

    double b = Convert.ToDouble(txtbB.Text);

    double parE = Convert.ToDouble(txtbE.Text);

    double parDelta = Convert.ToDouble(txtbDel.Text);

    double En = 0;

    double x1, x2, fx1, fx2, xmin, fxmin;

    //шаг0

    if (parE < 0 || (parDelta < 0 || parDelta > (parE * 2)))

    {

    MessageBox.Show("Не верно введены параметры!", "Ошибка!", MessageBoxButtons.OK);

    }

    else

    {

    xmin = 0; fxmin = 0;

    int k = 1;

    //шаг 1

    label2:

    x1 = (a + b - parDelta) / 2;

    x2 = (a + b + parDelta) / 2; ;

    fx1 = Calculation(x1, func, myStack);

    fx2 = Calculation(x2, func, myStack);

    myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En });

    k++;

    /*myList.Add(new steps() { step = k, a = a, b = b, xi = x2, fxi = fx2, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En });

    k++;*/

    //myList.Add(steps);

    //шаг 2

    if (fx1 <= fx2)

    {

    //[a,x2]

    b = x2;

    myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En });

    k++;

    }

    else if (fx1 > fx2)

    {

    //[x1,b]

    a = x1;

    myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En });

    k++;

    }

    //шаг 3

    En = (b - a) / 2;

    myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En });

    k++;

    if (En > parE)

    {

    // MessageBox.Show("Не верно введены параметры!", "Ошибка!", MessageBoxButtons.OK);

    //шаг1

    goto label2;

    }

    else

    {

    //конец

    xmin = (a + b) / 2;

    fxmin = Calculation(xmin, func, myStack);

    myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En });

    txtbXMin.Text = Convert.ToString(xmin);

    txtbFXMin.Text = Convert.ToString(fxmin);

    }

    }

    }

    //МЕТОД ЗОЛОТОГО СЕЧЕНИЯ

    else if (numlab == 4)

    {

    double a = Convert.ToDouble(txtbA.Text);

    double b = Convert.ToDouble(txtbB.Text);

    double parE = Convert.ToDouble(txtbE.Text);

    double x1, x2, fx1, fx2, En, xmin, fxmin;

    xmin = 0; fxmin = 0;

    double t; int k = 1;

    if (parE < 0)

    {

    MessageBox.Show("Не верно введены параметры!", "Ошибка!", MessageBoxButtons.OK);

    }

    else

    {

    //шаг 0

    t = (Math.Sqrt(5) - 1) / 2;

    //шаг 1

    x1 = a + ((3 - Math.Sqrt(5)) / 2) * (b - a);

    x2 = a + ((Math.Sqrt(5) - 1) / 2) * (b - a);

    fx1 = Calculation(x1, func, myStack);

    fx2 = Calculation(x2, func, myStack);

    En = (b - a) / 2;

    myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En });

    k++;

    /*myList.Add(new steps() { step = k, a = a, b = b, xi = x2, fxi = fx2, minx = xmin, minfx = fxmin, En = En });

    k++;*/

    //шаг2

    label3:

    if (En <= parE)

    {

    //шаг4

    xmin = (a + b) / 2;

    fxmin = Calculation(xmin, func, myStack);

    myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En });

    txtbXMin.Text = Convert.ToString(xmin);

    txtbFXMin.Text = Convert.ToString(fxmin);

    }

    else

    {

    //шаг3

    if (fx1 < fx2)

    {

    b = x2;

    x2 = x1;

    fx2 = fx1;

    x1 = b + a - x2;

    fx1 = Calculation(x1, func, myStack);

    En = t * En;

    myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En });

    k++;

    goto label3;

    }

    else

    {

    a = x1;

    x1 = x2;

    fx1 = fx2;

    x2 = b + a - x1;

    fx2 = Calculation(x2, func, myStack);

    En = t * En;

    myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En });

    k++;

    goto label3;

    }

    }
    }

    }

    }
    }
    private void function_FormClosing(object sender, FormClosingEventArgs e)

    {

    myList.Clear();

    }
    private void btTest_Click(object sender, EventArgs e)

    {

    btTest.Enabled = false;

    test f6 = new test(idreg, numlab);

    f6.ShowDialog();

    }
    private void btInfo_Click(object sender, EventArgs e)

    {

    if (info == 0)

    {

    richTextBox1.Visible = true;

    info = 1;

    }

    else if (info == 1)

    {

    richTextBox1.Visible = false;

    info = 0;

    }

    }

    }
    }

    ПРИЛОЖЕНИЕ 2. ПРЕЗЕНТАЦИЯ

    1   2   3   4   5   6   7   8


    написать администратору сайта