using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Reflection.Emit;

namespace WindowsFormsApp1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        public
double[,] PZT = new double[0, 0]; // Массив значений функции Z
        public
double ShagY = new double(); // Шаг изменения аргументов Y
        int J = new int();
        PZT = new double[NN, NN]; // Выделение памяти для значений функции Z
        public
                string FileN = "", // Имя файла данных
                FileE = "", // Расширение файла данных
                LineS = ""; // Строка из файла данных
        public
                StreamReader StRead; // Объект потока ввода
        public
                StreamWriter StWrit; // Объект потока вывода
        public
        double
        MaxX = new double(), // Максимальное значение аргумента Х
        MinX = new double(), // Минимальное значение аргумента X
        MaxY = new double(), // Максимальное значение функции Y
        MinY = new double(), // Минимальное значение функции Y
        ShagX = new double(); // Шаг изменения аргумента X
        public
        int NN = new int(), // Размерность цикла
        I = new int(), // Счётчик цикла
        J = new int(); // Счётчик цикла

        private void button2_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            BT = System.DateTime.Now; // Создание объекта BT Время начала процесса класса DateTime
            // Формирование значений аргументов функции
            MaxX = Convert.ToDouble(textBox2.Text);
            NN = Convert.ToInt32(textBox3.Text); // Ввод размерности массивов
            if (NN <= 100) // Если размер массивов меньше или равен 100
            {
                progressBar1.Maximum = 100; // Формирование  максимального значения полосы прогресса
                progressBar1.Step = 1; // Формирование шага значения полосы прогресса
            } // Конец условия if (NN <= 100)
            if (NN > 100) // Если размер массивов больше 100
            {
                progressBar1.Maximum = NN; // Формирование максимального значения полосы прогресса
            progressBar1.Step = Convert.ToInt32(NN / 100);
                // Формирование шага значения полосы прогресса
            } // Конец условия if (NN > 100)
            progressBar1.Minimum = 0; // Формирование минимального значения полосы прогресса
            progressBar1.Value = 0; // Установка текущего значения полосы прогресса в 0
            PXT = new double[NN]; // Выделение памяти для аргументов  точно так же выделяется память для массива PYT
            ShagX = (MaxX - MinX) / (NN - 1); // Формирование шага изменения аргумента Х
            PXT[0] = MinX; // Первое значение в массиве аргументов Х
               // Цикл для формирования массива аргументов функции
            I = 1; // Начальное значение счётчика цикла
            while (I <= NN - 1) // Цикл по массиву аргументов
            {
                PXT[I] = PXT[I - 1] + ShagX; // Формирование элементов массива аргументов
            if ((progressBar1.Value + progressBar1.Step) < progressBar1.Maximum) // Если текущее значение полосы прогресса +шаг меньше максимального
            {
                    progressBar1.Value += progressBar1.Step;
                    // Формирование значения полосы прогресса
                    progressBar1.Refresh(); // Обновление значения полосы прогресса
            FT = System.DateTime.Now; // Извлечение текущего значения времени
                    TimeSpan ST = FT - BT; // Вычисление интервала времени
                    label11.Text = ST.ToString(); // Вывод значения интервала времени в метку label11
            label11.Refresh(); // Обновление метки label11
                } // Конец условия if ((progressBar1.Value + progressBar1.Step) < progressBar1.Maximum)
I++; // Наращивание значения счётчика цикла
            } // Конец цикла while (I <= NN - 1)
            progressBar1.Value = progressBar1.Maximum; // Формирование значения полосы прогресса
// Цикл для вычисления функции
progressBar1.Value = 0; // Установка текущего значения полосы прогресса в 0
progressBar1.Refresh(); // Обновление значения полосы прогресса
I = 0; // Начальное значение счётчика цикла
            while (I <= NN - 1) // Цикл по массиву значений функции
            {
                PYT[I] = Math.Cos(Math.Pow(PXT[I], 3)) * (4 * Math.Sin(PXT[I]) - Math.Sin(12 * PXT[I]) - 3 * Math.Sin(4 * PXT[I]));
                if ((progressBar1.Value + progressBar1.Step) < progressBar1.Maximum)
                    if ((progressBar1.Value + progressBar1.Step) <
                progressBar1.Maximum) // Если текущее  значение полосы прогресса + шаг меньше максимального
            {
                    progressBar1.Value += progressBar1.Step;
                    // Формирование значения полосы прогресса
                    progressBar1.Refresh(); // Обновление значения полосы прогресса
            FT = System.DateTime.Now; // Извлечение текущего значения времени
            TimeSpan ST = FT - BT; // Вычисление интервала времени
                    label11.Text = ST.ToString(); // Вывод значения интервала времени в метку label11
            label11.Refresh(); // Обновление метки label11
                } // Конец условия if ((progressBar1.Value + progressBar1.Step) < progressBar1.Maximum)
I++; // Наращивание значения счётчика цикла
            } // Конец цикла while (I <= NN - 1)
              // Вывод результатов в файл
            FileN = "D://A_1.txt"; // Формирование имени файла данных
StWrit = new StreamWriter(FileN, false,
System.Text.Encoding.Default); // Открытие потока StWrit для вывода
            I = 0; // Обнуление счётчика строк
            LineS = "PXT: "; // Инициализация строки
                             // Цикл вывода данных в файл
            while (I < NN) // Цикл до конца массива аргументов
            {
                if (I < NN - 1) // Для всех элементов массива PXT кроме последнего
            {
                    LineS = LineS + PXT[I].ToString() + "; "; // Занесение значения аргумента в строку
            }
                if (I == NN - 1) // Для последнего элемента массива PXT
                {
                    LineS = LineS + PXT[I].ToString() + ";\n"; // Занесение значения аргумента в строку
                }
                I++; // Наращивание счётчика
            } // Конец цикла while (I < NN)
            StWrit.WriteLine(LineS); // Вывод строки в поток вывода аналогичным образом выполняется вывод в файл результатов массива значений функции PYT
StWrit.Close(); // Закрытие потока вывода
            progressBar1.Value = progressBar1.Maximum; // Формирование значения полосы прогресса
progressBar1.Refresh(); // Обновление значения полосы прогресса
FT = System.DateTime.Now; // Создание объекта Время окончания процесса класса DateTime
label10.Text = BT.Hour.ToString() + ":" + BT.Minute.ToString() + ":" + BT.Second.
ToString() + ":" + BT.Millisecond.ToString();
            label11.Text = FT.Hour.ToString() + ":" + FT.Minute.ToString() + ":" + FT.Second.ToString() + ":" + FT.Millisecond.ToString();
            ST = FT - BT;
            label12.Text = ST.Hours.ToString() + ":" + ST.Minutes.ToString() + ":" + ST.Seconds.ToString() + ":" + ST.Milliseconds.ToString();
        }

        public
                double[] PXT = new double[0], // Массив аргументов X
        PYT = new double[0]; // Массив значений функции Y
        public
        DateTime BT = new DateTime(), // Время начала процесса
        FT = new DateTime(); // Время окончания процесса
        public
        TimeSpan ST = new TimeSpan(); // Длительность процесса

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void Form2_Load(object sender, EventArgs e)
        {
            textBox1.Text = "1";
            textBox2.Text = "5";
            textBox3.Text = "10";
            textBox4.Text = "1";
            textBox5.Text = "5";
            textBox6.Text = "4";
        }
    }
}