Зміст

Задачі з числами

Приклад

Створимо додаток для обчислення площі квадрата.

Прикрасимо форму малюнком та змінимо колір фону та колір тексту.

Сторону квадрата (ціле число) будемо вводити в текстове поле.

При натисканні кнопки "Обчислити", в інше текстове поле має виводитися площа квадрата з введеною стороною.

При натисканні кнопки "Очистити", форма має очищуватися.

Додаток має бути розроблений таким чином, щоб в перше текстове поле вводилися лише натуральні числа. Окрім цифр будь-які інші символи не допускаються.

Додаток має бути розроблений таким чином, щоб якщо текстове поле не заповнене, то при натисканні кнопки "Обчислити" у спеціальному вікні виводилось повідомлення.

Створення форми

У конструкторі форми створимо:

Змінимо властивості форми та її елементів згідно з малюнком.

При перетягуванні елементів не виконуйте на них подвійний клік. Створюються зайві обробники подій Click для цих елементів.

Створення обробників подій

KeyPress

Згідно умови, в текстове поле textBox1 повинні вводитися лише натуральні числа. Окрім цифр будь-які інші символи не допускаються.

Тому до події KeyPress для елемента textBox1 прив'яжемо відповідний обробник.

private void TextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    // Дозволяємо лише цифри, Backspace (для видалення) та Control (для Ctrl+C/Ctrl+V)
    if (!char.IsDigit(e.KeyChar) && e.KeyChar != '\b' && !char.IsControl(e.KeyChar))
    {
        e.Handled = true; // Блокуємо символ
    }
}

Якщо потрібно дозволити додаткові символи (наприклад, крапку для десяткових чисел):


private void TextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (!char.IsDigit(e.KeyChar) && 
        e.KeyChar != '\b' && 
        e.KeyChar != '.' && 
        !char.IsControl(e.KeyChar))
    {
        e.Handled = true;
    }
}

Для більш складної валідації можна використати регулярні вирази:


private void TextBox1_Validating(object sender, CancelEventArgs e)
{
    if (!Regex.IsMatch(textBox1.Text, @"^\d+$"))
    {
        errorProvider1.SetError(textBox1, "Дозволено лише цифри");
        e.Cancel = true;
    }
    else
    {
        errorProvider1.SetError(textBox1, "");
    }
}

Для повноцінної обробки введення чисел додайте обробник події TextChanged:


private void TextBox1_TextChanged(object sender, EventArgs e)
{
    if (string.IsNullOrEmpty(textBox1.Text))
    {
        // Обробка пустого поля
    }
}

Click для кнопки "Очистити"

Обробник події Click кнопки clearButton має очищати поля textBox1 і textBox2.


private void ClearButton_Click(object sender, EventArgs e)
{
    // Очищення основних текстових полів
    textBox1.Clear();
    textBox2.Clear();
    
    // Додатково: скидання інших елементів форми
    checkBox1.Checked = false;
    checkBox2.Checked = false;
    radioButton1.Checked = false;
    radioButton2.Checked = false;
    comboBox1.SelectedIndex = -1;
    comboBox1.Text = string.Empty;
    
    // Повернення фокусу на перше поле
    textBox1.Focus();
}

Альтернативні варіанти реалізації:

Якщо потрібно очистити всі поля форми:


private void ClearAllFields()
{
    foreach (Control control in this.Controls)
    {
        if (control is TextBox)
            ((TextBox)control).Clear();
        else if (control is ComboBox)
            ((ComboBox)control).SelectedIndex = -1;
        else if (control is CheckBox)
            ((CheckBox)control).Checked = false;
        // Аналогічно для інших типів контролів
    }
    textBox1.Focus();
}

З використанням діалогового підтвердження:


private void ClearButton_Click(object sender, EventArgs e)
{
    if (MessageBox.Show("Очистити всі поля?", "Підтвердження", 
        MessageBoxButtons.YesNo) == DialogResult.Yes)
    {
        textBox1.Clear();
        textBox2.Clear();
        // Інші поля...
    }
}

Click для кнопки "Обчислити"

Обробник події Click кнопки calculateSquareButton повинен зчитувати число з поля textBox1, обчислювати площу квадрата і записувати результат в елемент textBox2.


private void CalculateSquareButton_Click(object sender, EventArgs e)
{
    // Перевірка на пусте введення
    if (string.IsNullOrWhiteSpace(textBox1.Text))
    {
        MessageBox.Show("Будь ласка, введіть довжину сторони квадрата", 
                      "Помилка введення", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Warning);
        textBox1.Focus();
        return;
    }

    // Спроба конвертації та обчислення
    if (int.TryParse(textBox1.Text, out int sideLength))
    {
        try 
        {
            // Обчислення площі квадрата з перевіркою переповнення
            int squareArea = checked(sideLength * sideLength);
            textBox2.Text = squareArea.ToString();
        }
        catch (OverflowException)
        {
            MessageBox.Show("Введене число занадто велике для обчислення",
                          "Помилка обчислення",
                          MessageBoxButtons.OK,
                          MessageBoxIcon.Error);
            textBox1.SelectAll();
            textBox1.Focus();
        }
    }
    else
    {
        MessageBox.Show("Будь ласка, введіть коректне ціле число",
                      "Невірний формат",
                      MessageBoxButtons.OK,
                      MessageBoxIcon.Error);
        textBox1.SelectAll();
        textBox1.Focus();
    }
}
Додаткові рекомендації: Для роботи з великими числами можна використати long замість int:

if (long.TryParse(textBox1.Text, out long sideLength))
{
    long squareArea = checked(sideLength * sideLength);
    textBox2.Text = squareArea.ToString();
}
//Додати обмеження на введення лише цифр (як у попередньому прикладі):
private void TextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (!char.IsDigit(e.KeyChar) && e.KeyChar != '\b' && !char.IsControl(e.KeyChar))
    {
        e.Handled = true;
    }
}
//Додати підтримку десяткових чисел:
if (double.TryParse(textBox1.Text, out double sideLength))
{
    double squareArea = sideLength * sideLength;
    textBox2.Text = squareArea.ToString("F2"); // 2 знаки після коми
}

Для обробки винятків (якщо поле textBox1 не заповнено) використовується інструкція try-catch.

Приклад. Створимо додаток для обчислення значення функції

Задамо фон у вигляді будь-якого малюнка.

Значення аргументів x і y (дійсні числа) будемо вводити в два текстові поля.

При введенні дійсного числа в текстове поле ціла частина від дробової має бути розділена КОМОЮ, а не крапкою.

При натисканні на кнопку "Обчислити" в третє текстове поле має виводитися значення функції z

з точністю до трьох знаків після коми.

При натисканні на кнопку "Очистити", форма має очищатися.

Додаток має бути спроектований таким чином, щоб у перші два текстові поля вводилися лише дійсні числа, додатні або від'ємні. У поля не повинні вводитися жодні інші символи.

Додаток має бути спроектований таким чином, щоб якщо хоча б одне текстове поле не заповнено, то після натискання кнопки "Обчислити" в спеціальному вікні виводилось повідомлення.

Створення форми

У конструкторі форми створимо:

Змінимо властивості форми та її елементів відповідно до малюнка.

Створення обробників подій

KeyPress

Згідно з умовою, у текстові поля textBox1 і textBox2 мають вводитися лише дійсні числа, додатні або від'ємні. Жодні інші символи не повинні вводитися.

Тому до події KeyPress для елементів textBox1 і textBox2 прив'яжемо відповідний обробник подій.


private void TextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    var textBox = (TextBox)sender;
    string currentText = textBox.Text;
    int cursorPosition = textBox.SelectionStart;
    
    // Дозволені символи
    bool isDigit = char.IsDigit(e.KeyChar);
    bool isDecimalSeparator = e.KeyChar == ',' || e.KeyChar == '.';
    bool isSign = e.KeyChar == '-' || e.KeyChar == '+';
    bool isBackspace = e.KeyChar == '\b';
    bool isControlChar = char.IsControl(e.KeyChar);

    // Заборона введення, якщо:
    if (!(isDigit || isBackspace || isControlChar || 
         (isDecimalSeparator && !currentText.Contains(",") && cursorPosition != 0) ||
         (isSign && cursorPosition == 0 && !currentText.StartsWith("-") && !currentText.StartsWith("+"))))
    {
        e.Handled = true;
        return;
    }

    // Автоматична заміна крапки на кому
    if (e.KeyChar == '.')
    {
        e.KeyChar = ',';
    }
}

Для повної валідації додайте обробник події Validating:


private void TextBox1_Validating(object sender, CancelEventArgs e)
{
    if (!decimal.TryParse(textBox1.Text, NumberStyles.Any, CultureInfo.CurrentCulture, out _))
    {
        errorProvider1.SetError(textBox1, "Введіть коректне число");
        e.Cancel = true;
    }
    else
    {
        errorProvider1.SetError(textBox1, "");
    }
}

Для обмеження кількості десяткових знаків:


if (isDecimalSeparator && currentText.Split(',').Length > 1)
{
    e.Handled = true;
}
Для обмеження довжини введення:

csharp
if (currentText.Length >= 10 && !isBackspace && !isControlChar)
{
    e.Handled = true;
}

Click для кнопки "Очистити"

Обробник події Click для кнопки clearButton має очищати поля textBox1, textBox2 і textBox3.

private void ClearButton_Click(object sender, EventArgs e)
{
    // Очищення всіх текстових полів
    ClearTextBoxes();
}
private void ClearTextBoxes()
{
    textBox1.Clear();
    textBox2.Clear();
    textBox3.Clear();
    
    // Повернення фокусу на перше поле
    textBox1.Focus();
}

Click для кнопки "Обчислити"

Обробник події Click для кнопки calculateButton має зчитувати X з поля textBox1, Y з поля textBox2, обчислювати Z і записувати результат у елемент textBox3 з точністю до трьох знаків після коми.


private void CalculateButton_Click(object sender, EventArgs e)
{
    // Валідація введених даних
    if (!ValidateInputs(out double x, out double y))
    {
        return;
    }

    try
    {
        // Обчислення за формулою: √(x⁴ + |y|) + (|x + y|)² / (√(x² + 1) + 1)
        double numerator = Math.Pow(Math.Abs(x + y), 2);
        double denominator = Math.Sqrt(x * x + 1) + 1;
        double z = Math.Sqrt(Math.Pow(x, 4) + Math.Abs(y)) + numerator / denominator;
        
        // Відображення результату з округленням до 3 знаків
        textBox3.Text = Math.Round(z, 3).ToString(CultureInfo.InvariantCulture);
    }
    catch (OverflowException)
    {
        ShowError("Помилка переповнення. Введені числа занадто великі.");
    }
    catch (Exception ex)
    {
        ShowError($"Виникла помилка: {ex.Message}");
    }
}

private bool ValidateInputs(out double x, out double y)
{
    x = y = 0;
    
    if (!double.TryParse(textBox1.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out x))
    {
        ShowError("Будь ласка, введіть коректне число у перше поле");
        textBox1.Focus();
        return false;
    }

    if (!double.TryParse(textBox2.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out y))
    {
        ShowError("Будь ласка, введіть коректне число у друге поле");
        textBox2.Focus();
        return false;
    }

    return true;
}

private void ShowError(string message)
{
    MessageBox.Show(message, "Помилка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

Для вхідних даних:

x = 2

y = 3

Результат буде: 8.333

Формула обчислює:
√(2⁴ + |3|) + (|2 + 3|)² / (√(2² + 1) + 1) = √(16 + 3) + 25 / (√5 + 1) ≈ 4.3589 + 6.8829 ≈ 11.242

Для виведення значення Z з точністю до трьох знаків після коми використовується функція округлення Round.

Для обробки виключень:

використовується конструкція try-catch.Конкретні блоки catch для різних типів помилок

Використано окремий метод для відображення помилок

Використано CultureInfo.InvariantCulture для коректного форматування чисел.Округлення до 3 знаків після коми

Автоматичний фокус на поле з помилкою


Зміст