Практика №15. Калькулятор

Общее описание

Разработать мобильное приложение «Калькулятор», визуально и функционально соответствующее стандартному калькулятору Apple. Приложение должно быть реализовано на React Native с использованием TypeScript и Expo, без навигации между экранами (одноэкранное). Репозиторий должен быть опубликован в GitHub-организации предмета под именем Group_LastName_task-15.

Ресурсы

  • Пример дизайна: калькулятор Apple (iOS)
    Pasted image 20260507125922.png
  • Для проверки UI — запуск через Expo Go на устройстве или эмуляторе

Определение задачи

Необходимо создать полностью рабочий калькулятор с корректной логикой вычислений и аккуратным, адаптивным интерфейсом. Все элементы должны быть реализованы вручную (без использования готовых библиотек калькуляторов). Разрешено использовать только стандартные компоненты React Native и базовые стили (StyleSheet, View, Text, Pressable и т.п.).

Функциональность

Приложение должно поддерживать следующие операции:

  • Ввод чисел от 0 до 9;
  • Ввод десятичной точки (.) — не более одной в числе;
  • Смена знака числа (±);
  • Очистка всего (AC) — сброс текущего состояния вычисления;
  • Четыре арифметические операции: +, -, ×, ÷;
  • Вычисление процента (%) — например: 200 × 5 % → 10;
  • Нажатие = для получения результата;
  • Корректное отображение промежуточных и финальных значений на дисплее;
  • Обработка ошибок:
    • Деление на ноль → отобразить "Error" и блокировать дальнейший ввод до нажатия AC;
    • Переполнение (опционально, но желательно).

Требования к интерфейсу

  • Один экран без навигации;
  • Макет должен быть адаптивным под разные размеры экрана;
  • Цветовая палитра и пропорции кнопок — как у калькулятора Apple:
  • Шрифт — моноширинный или системный, крупный на дисплее;
  • Кнопки должны иметь обратную связь при нажатии (например, изменение opacity).

Технические требования

  • Использование TypeScript;
  • Архитектура: код должен быть читаемым, разбитым на файлы и структурированным;
  • Логика вычислений — реализована самостоятельно (без eval()!);
  • Хранение состояния — через useState и собственные переменные (без Redux/Zustand);
  • Запрещено использовать сторонние UI-библиотеки (например, react-native-paper, native-base);

Дополнительная часть

  • Поддержка непрерывных вычислений: 5 + 3 = → 8 + 2 = → 10;
  • Улучшенная обработка длинных чисел (ограничение количества знаков на дисплее).

Время на выполнение

На выполнение выделяется 2 практических пары.
Градация баллов после дедлайна:

  • 1 пара: 50%
  • 2 пара: 25%
  • 3 пара: 10%

Баллы

Статус выполнения Количество баллов
Не сдано -8
Сдано 20
Дополнительное задание +3