Загрузка данных


        public Form1()
        {
            InitializeComponent();
            CreateTabs(); // Создаём все элементы программно (чтобы избежать проблем с дизайнером)
        }

        private void CreateTabs()
        {
            // Создаём TabControl
            TabControl tabControl = new TabControl { Dock = DockStyle.Fill };

            // Вкладка 1: Задание 1 - Доход
            TabPage tab1 = new TabPage("Задание 1. Доход");
            GroupBox group1 = new GroupBox { Text = "Расчёт дохода по вкладу", Dock = DockStyle.Fill, Padding = new Padding(10) };
            Label lblSum = new Label { Text = "Сумма вклада:", Top = 20, Left = 20 };
            TextBox txtSum = new TextBox { Top = 20, Left = 150, Width = 150 };
            Label lblPeriod = new Label { Text = "Период (месяцы):", Top = 60, Left = 20 };
            TextBox txtPeriod = new TextBox { Top = 60, Left = 150, Width = 150 };
            Button btnCalcIncome = new Button { Text = "Вычислить доход", Top = 100, Left = 150, Width = 150 };
            Label lblIncomeResult = new Label { Text = "Доход: 0,00 руб.", Top = 140, Left = 20, AutoSize = true };

            btnCalcIncome.Click += (s, e) =>
            {
                try
                {
                    if (string.IsNullOrEmpty(txtSum.Text))
                        throw new FormatException("Сумма");
                    if (string.IsNullOrEmpty(txtPeriod.Text))
                        throw new FormatException("Период (месяцы)");

                    double sum = double.Parse(txtSum.Text);
                    int period = int.Parse(txtPeriod.Text);

                    if (sum <= 0) throw new ArgumentException("Сумма должна быть положительной.");
                    if (period <= 0) throw new ArgumentException("Период должен быть положительным.");

                    double percent = (sum < 10000) ? 8.5 : 12.0;
                    double dochod = sum * (percent / 100 / 12) * period;

                    lblIncomeResult.Text = $"Доход: {dochod:F2} руб.";
                }
                catch (FormatException ex)
                {
                    MessageBox.Show($"Поле '{ex.Message}' не заполнено или содержит не число.",
                                    "Ошибка формата", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                catch (ArgumentException ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка ввода", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Неизвестная ошибка: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            };

            group1.Controls.AddRange(new Control[] { lblSum, txtSum, lblPeriod, txtPeriod, btnCalcIncome, lblIncomeResult });
            tab1.Controls.Add(group1);

            // Вкладка 2: Задание 2 - Выражение с корнем
            TabPage tab2 = new TabPage("Задание 2. Выражение");
            GroupBox group2 = new GroupBox { Text = "Вычисление z = sqrt(x³ - y³) / (x - y)", Dock = DockStyle.Fill, Padding = new Padding(10) };
            Label lblX = new Label { Text = "x:", Top = 20, Left = 20 };
            TextBox txtX = new TextBox { Top = 20, Left = 80, Width = 100 };
            Label lblY = new Label { Text = "y:", Top = 60, Left = 20 };
            TextBox txtY = new TextBox { Top = 60, Left = 80, Width = 100 };
            Button btnCalcExpr = new Button { Text = "Вычислить", Top = 100, Left = 80, Width = 100 };
            Label lblExprResult = new Label { Text = "Результат: ", Top = 140, Left = 20, AutoSize = true };

            btnCalcExpr.Click += (s, e) =>
            {
                try
                {
                    if (string.IsNullOrEmpty(txtX.Text)) throw new FormatException("x");
                    if (string.IsNullOrEmpty(txtY.Text)) throw new FormatException("y");

                    double x = double.Parse(txtX.Text);
                    double y = double.Parse(txtY.Text);

                    if (x == y) throw new DivideByZeroException("Знаменатель (x - y) равен нулю.");

                    double underRadical = Math.Pow(x, 3) - Math.Pow(y, 3);
                    if (underRadical < 0) throw new ArgumentException("Подкоренное выражение отрицательное.");

                    double result = Math.Sqrt(underRadical) / (x - y);
                    lblExprResult.Text = $"Результат: {result:F6}";
                }
                catch (FormatException ex)
                {
                    MessageBox.Show($"Поле '{ex.Message}' не заполнено или содержит не число.", "Ошибка формата",
                                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                catch (DivideByZeroException ex)
                {
                    MessageBox.Show(ex.Message, "Деление на ноль", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                catch (ArgumentException ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка вычисления", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Ошибка: {ex.Message}", "Исключение", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            };

            group2.Controls.AddRange(new Control[] { lblX, txtX, lblY, txtY, btnCalcExpr, lblExprResult });
            tab2.Controls.Add(group2);

            // Вкладка 3: Задание 3 - Собственные исключения (по номеру ошибки)
            TabPage tab3 = new TabPage("Задание 3. Генерация исключений");
            GroupBox group3 = new GroupBox { Text = "Генерация исключения по номеру (1-4)", Dock = DockStyle.Fill, Padding = new Padding(10) };
            Label lblErrorNum = new Label { Text = "Номер ошибки (1-4):", Top = 20, Left = 20 };
            TextBox txtErrorNum = new TextBox { Top = 20, Left = 150, Width = 100 };
            Button btnThrow = new Button { Text = "Сгенерировать", Top = 60, Left = 150, Width = 120 };
            Label lblThrowResult = new Label { Text = "Результат перехвата:", Top = 100, Left = 20, AutoSize = true };

            // Функция, генерирующая исключение с разными типами данных (имитация, т.к. в C# можно бросать только Exception)
            void ThrowError(int errorNumber)
            {
                switch (errorNumber)
                {
                    case 1:
                        throw new Exception("IntError") { Data = { ["Type"] = 100 } };
                    case 2:
                        throw new Exception("StringError") { Data = { ["Type"] = "char* equivalent (string)" } };
                    case 3:
                        throw new Exception("DoubleError") { Data = { ["Type"] = 3.1415 } };
                    case 4:
                        throw new Exception("CharError") { Data = { ["Type"] = 'C' } };
                    default:
                        throw new Exception("Неизвестный номер ошибки");
                }
            }

            btnThrow.Click += (s, e) =>
            {
                if (!int.TryParse(txtErrorNum.Text, out int num) || num < 1 || num > 4)
                {
                    MessageBox.Show("Введите целое число от 1 до 4.", "Ошибка ввода", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                try
                {
                    ThrowError(num);
                }
                catch (Exception ex)
                {
                    string msg = $"Перехвачено исключение: {ex.Message}\n";
                    if (ex.Data.Contains("Type"))
                    {
                        msg += $"Сгенерированный тип: {ex.Data["Type"]?.GetType().Name} со значением {ex.Data["Type"]}";
                    }
                    lblThrowResult.Text = msg;
                    MessageBox.Show(msg, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            };

            group3.Controls.AddRange(new Control[] { lblErrorNum, txtErrorNum, btnThrow, lblThrowResult });
            tab3.Controls.Add(group3);

            // Вкладка 4: Задание 4 - Алгоритм Евклида (НОД)
            TabPage tab4 = new TabPage("Задание 4. НОД (Евклид)");
            GroupBox group4 = new GroupBox { Text = "Наибольший общий делитель (вычитанием)", Dock = DockStyle.Fill, Padding = new Padding(10) };
            Label lblA = new Label { Text = "Число A:", Top = 20, Left = 20 };
            TextBox txtA = new TextBox { Top = 20, Left = 100, Width = 100 };
            Label lblB = new Label { Text = "Число B:", Top = 60, Left = 20 };
            TextBox txtB = new TextBox { Top = 60, Left = 100, Width = 100 };
            Button btnGCD = new Button { Text = "Найти НОД", Top = 100, Left = 100, Width = 100 };
            Label lblGCDResult = new Label { Text = "НОД: ", Top = 140, Left = 20, AutoSize = true };

            int EuclidGCD(int x, int y)
            {
                if (x < 0 || y < 0)
                    throw new ArgumentOutOfRangeException("Числа не могут быть отрицательными.");
                if (x == 0 && y == 0)
                    throw new ArgumentException("Оба числа не могут быть нулевыми.");
                if (x == 0) return y;
                if (y == 0) return x;

                int a = x, b = y;
                while (a != b)
                {
                    if (a > b) a -= b;
                    else b -= a;
                }
                return a;
            }

            btnGCD.Click += (s, e) =>
            {
                try
                {
                    if (string.IsNullOrEmpty(txtA.Text) || string.IsNullOrEmpty(txtB.Text))
                        throw new FormatException("Заполните оба поля.");

                    int a = int.Parse(txtA.Text);
                    int b = int.Parse(txtB.Text);

                    int result = EuclidGCD(a, b);
                    lblGCDResult.Text = $"НОД({a}, {b}) = {result}";
                }
                catch (FormatException)
                {
                    MessageBox.Show("Введите целые числа.", "Ошибка формата", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                catch (ArgumentOutOfRangeException ex)
                {
                    MessageBox.Show(ex.Message, "Недопустимое значение", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                catch (ArgumentException ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Ошибка: {ex.Message}", "Исключение", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            };

            group4.Controls.AddRange(new Control[] { lblA, txtA, lblB, txtB, btnGCD, lblGCDResult });
            tab4.Controls.Add(group4);

            tabControl.TabPages.AddRange(new TabPage[] { tab1, tab2, tab3, tab4 });
            this.Controls.Add(tabControl);
        }

        // Пустые обработчики из вашего шаблона (можно оставить или удалить)
        private void Form1_Load(object sender, EventArgs e) { }
        private void label1_Click(object sender, EventArgs e) { }
        private void textBox1_TextChanged(object sender, EventArgs e) { }
        private void button1_Click(object sender, EventArgs e) { }
    }
}