Skip to content

Latest commit

 

History

History
251 lines (185 loc) · 16 KB

README.md

File metadata and controls

251 lines (185 loc) · 16 KB

Гайд по написанию лабораторных работ

ревизия от 08.09.2023

Содержание

  1. Введение
  2. Инструкция по сдаче лабораторных работ
    1. Начало работы
    2. Локальное тестирование
      1. Компиляция
      2. clang-format
      3. cppcheck
      4. clang-tidy
      5. Открытые тесты
    3. Как загрузить лабу
      1. В какую ветку загружать
      2. Какие кнопочки нажимать, чтобы загрузить
      3. Требования к Pull Request
  3. Общие советы

Введение

В течение годового курса по C++ вам предстоит делать лабораторные работы на отработку пройденного на лекциях материала. Получать и сдавать домашние задания вы будете через Github.

Про вопросы

Можно и нужно обсуждать друг с другом, преподавателями и кем угодно:

  • Содержимое лекций
  • Не связанные с домашкой куски кода, вроде "нет ли UB в этой программе?" или "за сколько работает vector::push_back в каких случаях?"
  • Настройку среды разработки, запуск компиляторов, отладчиков, и анализаторов
  • Вопросы на StackOverflow
  • Чисто алгоритмическую часть заданий по C++, вообще не зависящую от языка программирования, вроде "какую структуру данных надо использовать, чтобы работало за линию вместо квадрата"

Следует спрашивать напрямую у своего практика (лектора, проверяющего — если практик недоступен), чтобы получить надёжную информацию:

  • Вопросы по условию
  • Подсказки

Цикл сдачи лабораторных работ

У каждого из вас есть личный репозиторий labs-<github-username>, работать Вы будете исключительно с ним. Для каждой выданной лабораторной работы в нём есть отдельная ветка (например, lab00-demo), в которую вы загружаете Ваше решение. По мере выдачи новых домашек в вашем личном репозитории будут появляться новые ветки.

Сдача домашнего задания происходит итеративно (в среднем 2-3 итерации), цикл выглядит следующим образом:

  • написание и локальное тестирование Вашего решения
  • корректное оформление Pull Request с прохождением всех открытых автопроверок и "ОК" от бота
  • проверяющий делает код-ревью Вашего Pull Request'а, выставляет баллы за стиль и корректность
  • внимательное чтение замечаний и осознание того, что нужно исправить

Инструкция по сдаче лабораторных работ

ВАЖНО: прочитайте гайд полностью перед тем как загружать домашнее задание.

Начало работы

Для начала нужно скачать ваш репозиторий с лабораторной работой. Рассмотрим на примере lab00-demo.

image

В условии каждой лабы четко прописано, в каких файлах должно находиться ваше решение. Нельзя переименовывать, удалять или создавать новые файлы.

Для lab00-demo это overview.cpp.

Локальное тестирование

И вот вы написали какой-то код в overview.cpp и по готовности лабораторной работы изменили tests.txt.

clang-format

Для успешного прохождения тестов для лабораторных работ необходимо чтобы код был корректно отформатирован. Например, есть вот такой код(по мотивам overview.cpp):

int main() {
  int case_number = 0;
  while (true) {
    std::cin >> case_number;
    switch (case_number) {
    case -1:
      return 0;
    case 1: {
      int a = 0;
      int b = 0;
      std::cin >> a >> b;
      std::cout << a + b << std::endl;
      break;
    }
    default:
      std::cout << "Undefined case number!\n";
    }
  }
}

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

clang-format-15 -i путь-до-файла

Результат форматирования:

int main() {
    int case_number = 0;
    while (true) {
        std::cin >> case_number;
        switch (case_number) {
            case -1:
                return 0;
            case 1: {
                int a = 0;
                int b = 0;
                std::cin >> a >> b;
                std::cout << a + b << std::endl;
                break;
            }
            default:
                std::cout << "Undefined case number!\n";
        }
    }
}

Так же мы можем форматировать несколько файлов командой

clang-format-15 -i путь-до-файла1 путь-до-файла2 путь-до-файла3

-i - это флаг, который означает, что код отформатируется и запишется в тот же файл.

Если бы этого флага не было, то результат форматирования вывелся бы в терминал.

Clang-format имеет разные настройки форматирования. Эти настройки можно написать в файле под названием .clang-format. Если запустить clang-format в этой же директории, то код отформатируется в соответствии с этими настройками. В репозитории labs-ник_на_github есть файл .clang-format.

clang-tidy

clang-tidy - это средство анализа кода, помогает замечать логические ошибки и писать более оптимальный код.

Запускается следующей командой: clang-tidy имя-файла

Аналогично, clang-tidy имеет разные настройки форматирования. Если запустить clang-tidy в директории с лабораторной работой, то код отформатируется в соответствии с необходимыми настройками. В репозитории labs-ник_на_github есть файл .clang-tidy.

cppcheck

cppcheck - это статический анализатор, нужный для выявления ошибок, на которые компиляторы не обращают внимания, таких как ошибка в логическом выражении в условном операторе ветвления (if) и использование shadows и unusable variable

Команда для запуска (в консоли):

cppcheck --language=c++ -DSOME_DEFINE_TO_FIX_CONFIG --enable=all --error-exitcode=1 --inline-suppr путь-до-файла

Заметим, что путь до файла можно заменить названием файла, если запускать cppcheck из директории с этим файлом.

Так же можно проверить несколько файлов, если заменить название файла на *.cpp (или другое расширение)

Компиляция и тесты

Как правило, к лабораторной работе прилагается набор открытых тестов. Для их прохождения сначала необходимо скомпилировать программу.

Компиляция - преобразование всех *.cpp файлов в один исполняемый бинарный .exe файл

Перед прочтением этой главы у вас должны быть установлены хотя бы два компилятора.

Чтобы проверить, что всё установлено нормально запустите:

  • g++ --version или g++-12 –v - чтобы проверить g++

  • clang++ -v или clang++-15 -v - чтобы проверить clang++ если версии без суффикса одинаковые, можно его не приписывать

Шаблон команды выглядит таким образом:

g++-12|clang++-15 path/to/source.cpp -std=c++17 -Wall -Wextra -Werror -o path/to/output_executable

Расшифровка:

g++-12|clang++-15 -- выбираем одним из двух компиляторов

path/to/source.cpp -- путь до каждой единицы трансляции (компилятору можно передать через пробел каждый *.cpp файл, который нужно скомпилировать)

-std=c++98|c++11|c++14|c++17|c++20 -- выбираем стандарт C++, с которым хотим скомпилировать

-Wall -Wextra -Werror -- включаем предупреждения компилятора и говорим ему трактовать предупреждения, как ошибки

-o path/to/output_executable -- флаг -o (от слова output) позволяет указать, куда положить результат компиляции (по умолчанию создаётся .out)

Теперь скомпилируем overview.cpp следующей командой:

g++-12 overview.cpp -std=c++17 -Wall -Wextra -Werror -o result

image

Пропишем ls и убедимся, что появился res

image

Запустить скомпилированную программу можно командой ./path/to/exe

image

Теперь можем протестировать программу. Тесты можно запустить командой: bash /path/to/run-test-data.sh ./path/to/exe

image

Как загрузить лабу

Теперь, когда мы протестировали, отформатировали программу, прошли проверки cppcheck и clang-tidy, можем загружать наше решение на GitHub.

Открываем ваш репозиторий на github и меняем ветку с main на ветку соответствующей лабы (например, lab00-demo) (очень важный момент).

image image

Убедитесь, что находитесь в ветке lab00-demo, сверху слева написано название ветки в которой вы находитесь. После этого, заходим в lab00-demo/solution/tests.txt и оставляем только те подзадачи, которые уже выполнили. image image image

Теперь можем изменить файл overview.cpp. Ещё раз внимательно смотрим, что находимся в нужной ветке (сейчас для нас это -- lab00-demo) image image

Смотрим в какой ветке мы находимся, должны быть в lab00-demo. После вставки своего кода, жмем commit changes. image

После этого, должно появиться окно в главном окне вашего репозитория, которое предлагает создать pull request. Жмем на Compare & pull request. image

Меняем название pull request на ваше имя и вашу лабораторную работу. Вводите имя и название лабораторной аккуратно, пробелы важны. После этого жмем на кнопку Create pull request. image

После этого появится окно. Здесь оно показывает, что некоторые тесты не были пройдены. image

Заходим в Pull Requests и видим там свой Pull Request, заходим туда и смотрим какие тесты пройдены. При необходимости коммитим ещё раз.

image

Если горит зеленая галочка - то все ок, мы сдали подзадачу лабораторной работы. Вас может привлечь огромная зелёная кнопка Squash and merge -- её нельзя нажимать. Оставьте всё, как есть. image

Советы

  • если в чем-то не уверены -- пишите практику\флудилку. Вам очень хотят помочь и очень не хотят возиться с возможными последствиями Ваших ошибок, так что дешевле -- переспросить.
  • каждый раз смотрите, в какой ветке вы находитесь -- в main коммитить нельзя.