К содержимому
ИС30

Поиск по сайту

Конспекты, лабы, квизы, ЧаВо и страницы

Войти
Основы программирования
ПрогаЛаба 2

int2026_t

Своё целое знаковое число на 2026 бит: конвертация из int32_t и строки, сложение, вычитание, умножение, деление с переполнением по модулю, сравнение и вывод в поток. Без контейнеров и std::bitset.

Моисеенко Артём Ярославовичдо 12 баллов
Дедлайн
понедельник, 26 октября
до 23:59
Через 14 днейДедлайн мягкий: сдать можно и позже, но лучше не тянуть

Дальше мягкие дедлайны: deadline_1 до 02.11 (×0.85), deadline_2 до 09.11 (×0.65), deadline_3 с 10.11 (×0.5).

Войти, чтобы записаться на сдачу
Войдите

Задание

Свой тип для целого знакового числа фиксированной длины int2026_t: 2026 значащих бит, включая знаковый, и не больше 254 байт в памяти. Нужно реализовать конвертацию из int32_t и из строки, четыре арифметические операции, сравнение на равенство и вывод в поток — всё без стандартных контейнеров.

Репозиторий
У каждого свой: организация is-itmo-c-26, репозиторий labwork2-<ваш GitHub-логин>. Тип описывается в lib/number.h (структура там уже есть, её нужно дополнить), реализация — в lib/number.cpp. Структуру проекта менять и добавлять новые исходные файлы нельзя.

Тип

  • Диапазон значений: [−22025, 22025−1][-2^{2025},\ 2^{2025} - 1].
  • sizeof(int2026_t) <= 254 — это проверяет static_assert в заголовке.
  • Неиспользуемые биты хранения не расширяют диапазон: если под число отведено больше 2026 бит, лишние значения всё равно недопустимы.

Что реализовать

Сигнатуры уже объявлены в lib/number.h:

lib/number.h
int2026_t from_int(int32_t i);
int2026_t from_string(const char* buff);
 
int2026_t operator+(const int2026_t& lhs, const int2026_t& rhs);
int2026_t operator-(const int2026_t& lhs, const int2026_t& rhs);
int2026_t operator*(const int2026_t& lhs, const int2026_t& rhs);
int2026_t operator/(const int2026_t& lhs, const int2026_t& rhs);
 
bool operator==(const int2026_t& lhs, const int2026_t& rhs);
bool operator!=(const int2026_t& lhs, const int2026_t& rhs);
 
std::ostream& operator<<(std::ostream& stream, const int2026_t& value);

Правила операций

  • from_int сохраняет значение исходного числа, включая INT32_MIN и INT32_MAX.
  • from_string принимает десятичную строку вида [+-]?[0-9]+: необязательный знак и хотя бы одна цифра. Ведущие нули разрешены, "0", "-0" и "+0" — одно и то же число. Число вне диапазона приводится по правилу переполнения.
  • Деление целочисленное, с округлением к нулю: -7 / 3 == -2, 7 / -3 == -2.
  • operator<< выводит число в любой системе счисления на ваш выбор (десятичная не обязательна), но разные значения должны выводиться по-разному. Возвращает переданный поток, чтобы работали цепочки stream << a << " " << b.
  • Деление на ноль, некорректные строки и nullptr в контракт не входят и тестами не проверяются.

Переполнение

В отличие от стандартных знаковых типов, где переполнение — UB, здесь нужен wrap around: результат берётся по модулю 220262^{2026} и приводится к диапазону [−22025, 22025−1][-2^{2025},\ 2^{2025} - 1]. Правило действует для конвертации из строки, сложения, вычитания, умножения и деления.

ВыражениеРезультат
MAX + 1MIN
MIN - 1MAX
MIN * 20
MIN / -1MIN

Здесь MIN =−22025= -2^{2025}, MAX =22025−1= 2^{2025} - 1.

Сборка и тесты

cmake -B build
cmake --build build
ctest -V --test-dir build

Тесты на GoogleTest лежат в tests/: конвертации, арифметика, сравнение, вывод и граничные случаи. Пока все тесты и CI не проходят, лаба не засчитана. Дополнять тесты можно, но не обязательно.

В bin/ есть консольное приложение — его можно менять как угодно, чтобы погонять свой код руками. Частью задания оно не является:

cmake --build build --target labwork2 && build/bin/labwork2

Теормин

  1. Стандартные типы данных
  2. Представление чисел в памяти
  3. Массивы
  4. Арифметика указателей
  5. Структуры
  6. Объединения

Мягкие дедлайны

ВеткаСрокКоэффициент
deadline_0до 26.10, 23:591.0
deadline_127.10 — 02.11, 23:590.85
deadline_203.11 — 09.11, 23:590.65
deadline_3с 10.110.5

Максимум 12 баллов.

Требования

  • Только стандартная библиотека C++, стандарт C++23.
  • В lib и bin запрещены стандартные контейнеры (std::vector, std::list, std::string и другие) и std::bitset. В тестах их использовать можно.
  • Структуру проекта не менять, новых исходных файлов не добавлять: всё пишется в lib/number.h и lib/number.cpp.
  • Размер типа — не больше 254 байт.
  • CI собирает решение clang++-21 с санитайзерами (-fsanitize=address,undefined), поэтому выход за границы массива или чтение неинициализированной памяти роняют тест.
  • Стиль проверяет clang-tidy: функции, классы и структуры в CamelCase, переменные в lower_case, поля классов с _ на конце, константы в kCamelCase. Имена int2026_t, from_int и from_string заданы условием и из проверки исключены.

Как сдавать

  1. Создайте ветку deadline_0 от main в своём репозитории.
  2. Решайте в этой ветке, коммитьте небольшими логичными порциями.
  3. Откройте Pull Request из deadline_0 в main.
  4. Дождитесь отчёта CI в комментарии к PR: там результаты тестов и проверки стиля.
  5. Если сдаёте после первого дедлайна, ветка называется по дедлайну (deadline_1, deadline_2, deadline_3), и балл умножается на его коэффициент.

Материалы

Комментарии0

Пока никто ничего не написал.

Войдите, чтобы оставить комментарий