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

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

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

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

WordCount

Утилита в духе wc: считает строки, слова, латинские буквы с цифрами и байты в файлах. Разбор аргументов командной строки и потоковое чтение без std::string и контейнеров.

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

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

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

Задание

Утилита в духе wc: для каждого файла из аргументов считает строки, слова, латинские буквы с цифрами и байты и печатает результат одной строкой. Первая лаба, где нужно самому разобрать аргументы командной строки и прочитать файл потоком, не загружая его в память целиком.

Репозиторий
У каждого свой: организация is-itmo-c-26, репозиторий labwork1-<ваш GitHub-логин>. Решение пишется в main.cpp, тесты лежат в tests/.

Опции

КороткаяДлиннаяЧто выводит
-l--linesколичество строк
-w--wordsколичество слов
-a--alnumколичество латинских букв и цифр
-c--bytesразмер файла в байтах

Короткие опции можно склеивать (-lawc), опции и имена файлов идут в любом порядке, файлов может быть несколько:

./WordCount filename1
./WordCount filename1 filename2
./WordCount --words --lines filename1
./WordCount -l -c filename1
./WordCount -lawc filename1 filename2
./WordCount filename1 filename2 -lw --bytes

Формат вывода

По одной строке на файл, в том порядке, в каком файлы переданы:

<lines> <words> <alnum> <bytes> <filename>
  • Колонки всегда в этом порядке, независимо от порядка опций, и выводятся только запрошенные.
  • Без опций выводятся строки, слова и байты: <lines> <words> <bytes> <filename>.
  • Разделитель ровно один пробел. Имя файла печатается так, как его передали в аргументах.
  • Итоговую строку с суммой по всем файлам выводить не нужно.

Правила подсчёта

  • Строка заканчивается символом \n. Последний непустой кусок без завершающего \n тоже считается строкой. В пустом файле 0 строк.
  • Слово — непустая последовательность непробельных символов. Пробельные: пробел, \t, \n, \r, \v, \f.
  • --alnum считает только A-Z, a-z и 0-9, все остальные байты не учитываются.
Файл может не влезть в память
Размер входного файла не ограничен. Читайте его потоком (std::ifstream) кусками или по символу, а не целиком. Отдельный тест проверяет слово, которое попадает на границу буфера.

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

cmake -B build
cmake --build build
./build/WordCount -lawc main.cpp
ctest -V --test-dir build

Тесты лежат в tests/testdata/<номер>_<название>/: args.txt с аргументами, input.txt и expected.txt с ожидаемым выводом. Если тест упал, проще всего запустить утилиту руками на его input.txt и сравнить с expected.txt.

Про файлы, начинающиеся с «-»
Поддерживать такие имена не обязательно. Но стоит подумать, как это сделать, и посмотреть, как это решают другие утилиты: например, -- в аргументах означает «дальше только имена файлов».

Теормин

  1. Стандартные типы данных
  2. Представление чисел в памяти
  3. Литералы
  4. Указатели
  5. Массивы
  6. Арифметика указателей
  7. Строки
  8. Указатели на функцию

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

ВеткаСрокКоэффициент
deadline_011.10, 23:591.0
deadline_118.10, 23:590.85
deadline_225.10, 23:590.65
deadline_301.11, 00:000.5

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

Требования

  • Только стандартная библиотека C++.
  • Запрещены std::string, std::string_view, контейнеры стандартной библиотеки (std::vector, std::map и другие) и std::regex. Аргументы разбираются как char*.
  • Формат вывода является частью условия: никаких лишних пробелов, символов и сообщений.
  • Тесты в tests/ менять нельзя.
  • CI собирает решение clang++-21 обычным и с санитайзерами (-fsanitize=address,undefined), поэтому выход за границы массива или чтение неинициализированной памяти роняют тест.
  • Стиль проверяет clang-tidy: функции, классы и структуры в CamelCase, переменные в lower_case, константы в kCamelCase.

Как сдавать

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

Материалы

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

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

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