Загрузка данных
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) { }
}
}