Программа для обработки числа, введенного с клавиатуры: 7 рабочих алгоритмов с примерами кода

Задача «пользователь вводит число с клавиатуры — составьте программу, которая в случае если данное число [условие]» — классическое упражнение для изучения базовых конструкций программирования: ввода-вывода, условных операторов и циклов. Чаще всего такое задание подразумевает проверку числа на чётность, положительность, принадлежность диапазону или выполнение математических операций (например, вычисление факториала). Ошибки здесь возникают на этапе считывания данных (особенно в 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.

Общий алгоритм:

  1. Вывести приглашение к вводу (например, «Введите число:»).
  2. Считать введённую строку и преобразовать её в числовой тип.
  3. Обработать возможные ошибки (нечисловые данные, переполнение).
  4. Передать число на анализ в основную логику программы.
⚠️ Внимание: В 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).
📊 Какой язык вы используете для подобных задач?
Python
C++
Java
JavaScript
Другой

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. Если число ≤ 1 → не простое.
  2. Проверить делимость числа на все целые числа от 2 до √num (достаточно проверять до квадратного корня для оптимизации).
  3. Если ни один делитель не подошёл → число простое.

Пример на 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. Обработка некорректного ввода

Пользователь может ввести не число, а строку или символ. Чтобы программа не завершалась с ошибкой, добавьте обработку исключений или проверку формата.

Примеры для разных языков:

ЯзыкМетод проверкиПример кода
Pythontry-excepttry: num = int(input())
except ValueError: print("Ошибка!")
C++Проверка cin.fail()if (!(cin >> num)) { ... }
Javatry-catch с InputMismatchExceptiontry { num = scanner.nextInt(); } catch (Exception e) { ... }
JavaScriptisNaN()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