Skip to content

cowboymalboro1884/hse-practices

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

37 Commits
 
 
 
 
 
 

Repository files navigation

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

ревизия от 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 коммитить нельзя.

About

для практик

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published