Задача «пользователь вводит число с клавиатуры — составьте программу, которая в случае если данное число [условие]» — классическое упражнение для изучения базовых конструкций программирования: ввода-вывода, условных операторов и циклов. Чаще всего такое задание подразумевает проверку числа на чётность, положительность, принадлежность диапазону или выполнение математических операций (например, вычисление факториала). Ошибки здесь возникают на этапе считывания данных (особенно в C++ с использованием cin), неверной обработки типов (например, когда пользователь вводит строку вместо числа) или логических ошибок в условиях.
В этой статье разберём 7 типичных сценариев для такой программы — от простейшей проверки знака числа до рекурсивных вычислений — с готовыми примерами кода на Python, C++, Java и JavaScript. Особое внимание уделим обработке исключений (например, когда пользователь вводит буквы вместо цифр) и оптимизации кода для повторного ввода данных. Если ваша задача предполагает конкретное условие (например, «если число простое»), используйте оглавление ниже для быстрого перехода к нужному разделу.
1. Базовая структура программы: считывание числа с клавиатуры
Прежде чем анализировать число, его нужно корректно считать. Способы ввода отличаются в зависимости от языка:
- 📌 Python: функция
input()всегда возвращает строку, поэтому требуется явное преобразование вintилиfloat. Пример:num = int(input("Введите число: ")). - 🖥️ C++: используется
cin >> num, но при вводе нечисловых данных поток ввода переходит в состояние ошибки, которое нужно сбрасывать с помощьюcin.clear()иcin.ignore(). - ☕ Java: класс
Scannerс методомnextInt(), который выбрасывает исключениеInputMismatchExceptionпри неверном формате. - 🌐 JavaScript: в браузере —
prompt()(возвращает строку), в Node.js — модульreadline.
Общий алгоритм:
- Вывести приглашение к вводу (например, «Введите число:»).
- Считать введённую строку и преобразовать её в числовой тип.
- Обработать возможные ошибки (нечисловые данные, переполнение).
- Передать число на анализ в основную логику программы.
⚠️ Внимание: В C++ после некорректного ввода (например, буквы) поток cin остаётся в состоянии ошибки, и все последующие операции чтения будут пропускаться. Чтобы избежать зацикливания, используйте конструкцию:
if (!(cin >> num)) {
cin.clear(); // Сбросить флаг ошибки
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // Очистить буфер
cout << "Ошибка! Введите число: ";
}
2. Проверка числа на чётность/нечётность
Один из самых распространённых вариантов задачи — определить, является ли введённое число чётным или нечётным. Для этого используется оператор остатка от деления %:
- 🔢 Если
num % 2 == 0→ число чётное. - 🔢 Если
num % 2 != 0→ число нечётное.
Пример на Python:
num = int(input("Введите число: "))
if num % 2 == 0:
print(f"Число {num} чётное.")
else:
print(f"Число {num} нечётное.")
Особенности реализации:
- 🔹 В JavaScript для вывода используйте
console.log()илиalert(). - 🔹 В C++ не забудьте подключить
#include <iostream>. - 🔹 Для отрицательных чисел алгоритм работает так же (например,
-4 % 2 == 0).
3. Проверка числа на положительность/отрицательность
Задача часто дополняется условием «если число положительное — выполнить действие X, иначе — действие Y». Здесь достаточно сравнить число с нулём:
| Условие | Логическое выражение | Пример действия |
|---|---|---|
| Число положительное | num > 0 | Вывести «Положительное» |
| Число отрицательное | num < 0 | Вывести «Отрицательное» |
| Число равно нулю | num == 0 | Вывести «Ноль» |
Пример на Java с обработкой исключений:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Введите число: ");
try {
int num = scanner.nextInt();
if (num > 0) {
System.out.println("Положительное");
} else if (num < 0) {
System.out.println("Отрицательное");
} else {
System.out.println("Ноль");
}
} catch (Exception e) {
System.out.println("Ошибка! Введите целое число.");
}
}
}
⚠️ Внимание: В JavaScript функцияprompt()всегда возвращает строку. Чтобы избежать ошибок, используйтеparseInt()илиNumber()для преобразования, но проверяйте результат наNaN:let num = Number(prompt("Введите число:"));if (isNaN(num)) {
alert("Это не число!");
} else {
// Логика проверки
}
4. Проверка принадлежности числу диапазону
Частый сценарий — проверить, попадает ли введённое число в заданный интервал (например, от 10 до 20). Здесь используются логические операторы
&&(И) и||(ИЛИ).Пример условия: «если число находится в диапазоне [10, 20] или равно 5».
if ((num >= 10 && num <= 20) || num == 5) {print("Число подходит под условие.");
}
Типичные ошибки:
- 🚫 Забывают проверить границы диапазона (например, пишут
num > 10 && num < 20, исключая 10 и 20).- 🚫 Путают
&&и||, что приводит к неверной логике.- 🚫 Не учитывают возможность ввода дробных чисел (если требуются только целые, используйте
int).Уточните, включаются ли границы диапазона (закрытый/открытый интервал)
Проверьте тип данных (int или float)
Добавьте обработку нечисловых данных
Тестируйте граничные значения (например, 10 и 20)
-->
5. Вычисление факториала числа
Если задача звучит как «если число положительное — вычислить его факториал», потребуется использовать цикл или рекурсию. Факториал числа
n(n!) — это произведение всех положительных целых чисел от 1 доn.Пример на Python с проверкой ввода:
num = int(input("Введите число: "))if num < 0:
print("Факториал не определён для отрицательных чисел.")
elif num == 0:
print("0! = 1")
else:
factorial = 1
for i in range(1, num + 1):
factorial *= i
print(f"{num}! = {factorial}")
Особенности:
- 🔢 Для больших чисел (например,
n > 20) факториал быстро превышает пределы стандартных типов данных (intв C++ или Java). В таких случаях используйтеlong long(C++) илиBigInteger(Java).- 🔢 Рекурсивный подход (вызов функции внутри себя) элегантен, но может привести к переполнению стека при больших
n.Рекурсивное решение на Python
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
num = int(input("Введите число: "))
if num >= 0:
print(f"{num}! = {factorial(num)}")
else:
print("Ошибка: отрицательное число")
6. Проверка числа на простоту
Простое число — это натуральное число больше 1, которое делится только на 1 и само на себя. Алгоритм проверки:
- Если число ≤ 1 → не простое.
- Проверить делимость числа на все целые числа от 2 до
√num(достаточно проверять до квадратного корня для оптимизации).- Если ни один делитель не подошёл → число простое.
Пример на C++:
#include <iostream>#include <cmath>
using namespace std;
bool isPrime(int num) {
if (num <= 1) return false;
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
int main() {
int num;
cout << "Введите число: ";
cin >> num;
if (isPrime(num)) {
cout << num << " — простое число." << endl;
} else {
cout << num << " — не простое число." << endl;
}
return 0;
}
Оптимизации:
- 🔹 Пропускайте чётные числа после проверки делимости на 2.
- 🔹 Для больших чисел используйте решето Эратосфена (если нужно проверять много чисел подряд).
7. Обработка некорректного ввода
Пользователь может ввести не число, а строку или символ. Чтобы программа не завершалась с ошибкой, добавьте обработку исключений или проверку формата.
Примеры для разных языков:
Язык Метод проверки Пример кода Python try-excepttry: num = int(input())
except ValueError: print("Ошибка!")C++ Проверка cin.fail()if (!(cin >> num)) { ... }Java try-catchсInputMismatchExceptiontry { num = scanner.nextInt(); } catch (Exception e) { ... }JavaScript isNaN()if (isNaN(num)) { ... }Рекомендации:
- 🔄 Предлагайте пользователю повторный ввод до тех пор, пока не будет введено корректное число.
- 📌 В Python можно использовать бесконечный цикл с
breakпосле успешного ввода.- 🖥️ В C++ не забывайте очищать буфер ввода после ошибки (
cin.ignore()).while True:
try:
num = int(input("Введите число: "))
break
except ValueError:
print("Некорректный ввод. Попробуйте снова.")
-->
FAQ: Частые вопросы по задаче
Как сделать, чтобы программа запрашивала ввод числа до тех пор, пока оно не станет корректным?
Используйте цикл
whileс проверкой условия. Пример на Python:while True:try:
num = int(input("Введите число: "))
break
except ValueError:
print("Ошибка! Введите целое число.")
В C++ аналогично проверяйте
cin.fail()в цикле.Можно ли обойтись без
try-exceptпри проверке ввода?Да, но это менее надёжно. Например, в Python можно проверить, состоит ли строка только из цифр:
s = input("Введите число: ")if s.lstrip('-').isdigit():
num = int(s)
# Дальнейшая логика
else:
print("Ошибка!")
Однако этот метод не учитывает дробные числа или научную нотацию (например,
1e3).Как обработать дробные числа (float)?
Замените
intнаfloatи используйте сравнение с учётом погрешности (например,abs(num - 0.5) < 1e-9для проверки на 0.5). Пример на JavaScript:let num = parseFloat(prompt("Введите число:"));if (isNaN(num)) {
alert("Ошибка!");
} else {
alert(`Вы ввели: ${num}`);
}
Почему в C++ после ввода буквы программа зацикливается?
Поток
cinпереходит в состояние ошибки, и все последующие операции чтения игнорируются. Решение:if (!(cin >> num)) {cin.clear(); // Сбросить флаг ошибки
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // Очистить буфер
cout << "Ошибка! Повторите ввод: ";
}
Не забудьте подключить
#include <limits>дляnumeric_limits.Как оптимизировать проверку простоты числа для больших значений?
Используйте следующие приёмы:
- Проверяйте делимость только до
√num.- Пропускайте чётные делители после проверки на 2.
- Для чисел вида
n = 6k ± 1проверяйте делители 6k±1 (оптимизация решета Эратосфена).Пример оптимизированного кода на Python:
def is_prime(n):if n <= 1: return False
if n <= 3: return True
if n % 2 == 0 or n % 3 == 0: return False
i = 5
while i * i <= n:
if n % i == 0 or n % (i + 2) == 0:
return False
i += 6
return True