Программа сумма двух чисел — классическая учебная задача, с которой начинается любой курс программирования. Решение занимает 3–5 строк на Python, Java, C++ или JavaScript и включает четыре шага: ввод, конвертацию строки в число, сложение, вывод. Главная ловушка — конкатенация вместо арифметики, если забыть int() или Integer.parseInt.
- Постановка задачи и учебный контекст
- Реализация на Python, Java, C++, JavaScript
- Пять шагов: программа сумма двух чисел с нуля
- Ограничения типов данных и переполнение
- Сравнение input() Python, Scanner Java и prompt() JS
- Что нельзя делать при написании суммы двух чисел
- Мифы о простой задаче
- Достаточно поставить плюс между вводами
- Любой int вмещает любую сумму
- Вопрос-ответ
Постановка задачи и учебный контекст
Программа сумма двух чисел встречается в первом задании CS50 (Harvard, курс запущен в 2007 году), в главе 1 книги «Python Crash Course» Эрика Мэттиза (No Starch Press, издание 3-е, 2023) и в первом уроке курса Coursera «Programming for Everybody» Чарльза Северанса. Задача проверяет базовые понятия — ввод, тип данных, оператор сложения, вывод.
Программа сумма двух чисел не требует знаний ООП, циклов и условий. Достаточно понимать, что такое переменная и функция ввода. Именно поэтому её ставят первой — она демонстрирует полный цикл «ввод — обработка — вывод», из которого состоят все дальнейшие задачи.
По данным опроса JetBrains Developer Ecosystem 2024, 68% начинающих разработчиков в первый месяц обучения писали именно такую программу. Это делает её эталоном для сравнения синтаксиса языков и демонстрации типовых ошибок ввода.
Реализация на Python, Java, C++, JavaScript
Одна и та же задача выглядит по-разному в четырёх популярных языках.
Python. a = int(input()); b = int(input()); print(a + b). Функция input() возвращает строку, поэтому обязателен int() или float(). По данным Python Docs 3.12 (docs.python.org), input() читает до символа перевода строки и возвращает str без завершающего \n.
Java. Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); System.out.println(a + b);. Класс Scanner из пакета java.util автоматически парсит целые числа. Согласно Oracle JDK Reference, метод nextInt() бросает InputMismatchException при нечисловом вводе.
C++. int a, b; cin >> a >> b; cout << a + b;. Поток cin из <iostream> сам конвертирует ввод в int согласно стандарту C++20 §29.4.4. При ошибке поток переходит в fail-state, и последующее чтение возвращает 0.
JavaScript (Node.js). const [a, b] = require(‘readline-sync’).question().split(‘ ‘).map(Number); console.log(a + b);. В браузере используют prompt(). MDN Web Docs подчёркивают: prompt() всегда возвращает string, и без Number() плюс сработает как конкатенация — 2 + 3 даст «23».
Пять шагов: программа сумма двух чисел с нуля
Схема одинакова во всех языках, различается только синтаксис.
Шаг 1. Считайте первое число. В Python — input(), в Java — sc.nextInt(), в C++ — cin >> a;, в JS — prompt() или readline-sync.
Шаг 2. Конвертируйте строку в число. В Python — int() или float(), в Java Scanner делает это сам, в JS — Number() или parseInt(). Пропуск этого шага в динамических языках даёт конкатенацию: строка + строка = склеенная строка.
Шаг 3. Считайте второе число и повторите конвертацию. Помните: input() Python всегда возвращает str, независимо от того, что ввёл пользователь. То же самое prompt() в JavaScript.
Шаг 4. Сложите два числа оператором +. Если конвертация была корректной, оператор выполнит арифметическое сложение. В противном случае — конкатенацию или NaN.
Шаг 5. Выведите результат — print() в Python, System.out.println() в Java, cout в C++, console.log() в JS. Оберните ввод в try/except (Python) или try/catch (Java) для перехвата ValueError и InputMismatchException.
Ограничения типов данных и переполнение
Классическая учебная программа сумма двух чисел не учитывает переполнение. В реальном коде это важно.
Тип int32 в Java и C++ хранит значения от −2 147 483 648 до 2 147 483 647 (диапазон 2^31). При сложении двух больших чисел (например 2 000 000 000 + 500 000 000) результат превысит границу и в C++ приведёт к undefined behavior по стандарту C++20 §7.1. В Java произойдёт wrap-around согласно JLS §4.2.2 — результат станет отрицательным без выброса исключения.
Тип int64 (long в Java, long long в C++) расширяет диапазон до ±9.2 × 10^18, но не решает проблему. Python 3 использует произвольную точность: целое ограничено только доступной памятью. JavaScript до 2020 года имел только Number (64-битный float, безопасный диапазон 2^53), затем добавили BigInt по стандарту ECMAScript 2020.
По данным CERT Coding Standards (издание 2016 года, Carnegie Mellon), около 5% CVE-уязвимостей категории CWE-190 (Integer Overflow) в проектах на C и C++ связаны именно с обычным сложением без проверки границ.
Сравнение input() Python, Scanner Java и prompt() JS
Три способа получить ввод от пользователя отличаются интерфейсом и поведением.
input() Python 3 vs raw_input() Python 2. В Python 2 существовали две функции: input() выполнял eval() над вводом (небезопасно), а raw_input() возвращал строку. По сравнению с Python 3, где остался только безопасный input() (эквивалент старого raw_input), Python 2 требовал осторожности из-за возможности выполнения произвольного кода.
Scanner Java vs BufferedReader. Scanner парсит типы автоматически, но медленнее. По сравнению с BufferedReader + Integer.parseInt(), Scanner проще, но на олимпиадных задачах с миллионами чисел выигрывает BufferedReader — до 10 раз быстрее по данным JMH-бенчмарков.
prompt() JS vs Scanner Java. prompt() блокирует UI браузера и возвращает string или null (если отменили). В отличие от Scanner, prompt() не парсит типы — обязательна ручная конвертация через Number(). В Node.js prompt() отсутствует, используется readline или readline-sync.
Что нельзя делать при написании суммы двух чисел
Простая учебная программа сумма двух чисел содержит несколько запретов, которые нельзя обходить даже в тренировочном коде. Программа сумма двух чисел без валидации — заведомая уязвимость.
Нельзя использовать eval() в Python для конвертации ввода. Функция выполнит произвольный код: злоумышленник введёт __import__(‘os’).system(‘rm -rf /’) и получит выполнение команды. По официальной документации Python (PEP 8), eval не гарантирует безопасности и не является допустимым способом парсинга ввода.
Нельзя игнорировать возврат null из prompt() в JavaScript. Пользователь может нажать Cancel — тогда prompt() возвращает null, а null + null не является числом и даёт 0 или NaN в зависимости от последующей операции. Проверка обязательна.
Нельзя полагаться на int по умолчанию для больших сумм. Программа сумма двух чисел на C++ при переполнении int не гарантирует корректного результата — стандарт объявляет undefined behavior. Используйте long long или библиотеку boost::multiprecision.
Мифы о простой задаче
Даже такая учебная программа порождает устойчивые заблуждения.
Достаточно поставить плюс между вводами
В динамических языках это ошибка. В Python input() + input() склеит две строки: ввод «2» и «3» даст «23», а не 5. То же в JavaScript: prompt() + prompt(). Без конвертации через int(), Number() или parseInt() арифметика не работает.
Любой int вмещает любую сумму
Нет. Диапазон int32 ограничен 2^31, и сумма двух миллиардов уже переполнит его. В финансовых расчётах и криптографии всегда используются int64 или BigInteger. По данным ISO 27001 (пункт A.14.2.5), проверка границ обязательна для безопасной разработки.
Вопрос-ответ
Как написать программу суммы двух чисел на Python? Считайте два ввода через input(), обязательно оберните в int(), сложите и выведите: print(int(input()) + int(input())). Без int() получите конкатенацию строк вместо арифметики.
Почему 2 + 3 даёт 23 вместо 5? Ввод из input() или prompt() приходит как строка. Оператор + для двух строк выполняет конкатенацию, а не сложение. Проблему решает конвертация: int() в Python, Number() в JavaScript, parseInt() в Java.
Какой максимум для int в языках? В Java и C++ int32 хранит до 2 147 483 647. Тип long (int64) — до 9 223 372 036 854 775 807. Python 3 не имеет фиксированной границы. JavaScript использует Number до 2^53 или BigInt для больших значений.
Что если пользователь введёт буквы? Программа упадёт с исключением: ValueError в Python, InputMismatchException в Java, NaN в JavaScript. Оберните ввод в try/except или добавьте валидацию через isdigit() перед конвертацией.
Нужна ли программа для суммы двух чисел на собеседовании? Именно эта программа сумма двух чисел встречается редко, но её вариации проверяют базовое владение вводом-выводом. По данным HackerRank Developer Skills Report 2024, простые арифметические задания фигурируют в 35% отборочных тестов на позиции джуниоров.
