VoyakinH / PREP

Технопарк си/си++ 2019

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Подготовительная программа на С/С++

Домашнее задание №1

Вводное задание нашего курса, которое познакомит вас с нашей методикой приема ДЗ.

В папках project/include и project/src лежат исходники тестовой программы, которая через командную строку принимает следующие аргументы:

  • номер кейса (целое число в диапазоне [1, 3]);
  • входные данные для кейса:
    • для кейса 1 - строка (./main.out 1 'Hello world!');
    • для кейса 2 - два целых числа (./main.out 2 7 9);
    • для кейса 3 - целое число (./main.out 3 197).

Требуется:

  1. Провести статический анализ кода: найти при помощи линтеров ошибки в стиле и исправить их.
  2. Найти и исправить ошибку в кейсе №1.
    • Чем проще - тем лучше.
    • Для облегчения поиска ошибки можно собрать программу при помощи make'а и позапускать с различными параметрами.
  3. Реализовать функцию кейса №2 по ее прототипу.
    • Функция возвращает результат возведения base в степень pow.
  4. Реализовать модуль для кейса №3 и добавить его в основную программу.
    • Модуль должен содержать функцию, определяющую является ли число, поданное на вход, простым: если да - вернуть 1, иначе 0.
    • Описание модуля и его реализация должны лежать в соответствующих .h и .c файлах.
    • Не забудьте добавить исходники в Makefile.

Если вы нашли какие-либо неточности/ошибки или испытываете затруднения при решении - обращайтесь к преподавателям (общий чат, сообщения на портале, на почту или в issues GitLab'а).

Если задание выполнено полностью верно, то после пуша в свою ветку на странице CI/Pipelines GitLab'а вы увидите 4 успешно прошедших этапа:

  • тестирование стиля кода;
  • сборка;
  • тестирование собранного бинарника;
  • тестирование собранного бинарника на наличие утечек памяти.

CI.png

Проверь себя!

Все команды, описанные ниже, выполняются из корневой директории проекта (один уровень с Makefile).

Как собрать и запустить программу?

Как использовать команды, подобные той, что ниже

$ make clean && make
$ ./main.out 1 'Hello world!'

Не собирается:

  • все ли ошибки, выявленные gcc, исправлены?
  • все ли исходники указаны в Makefile?

Как запустить статический анализ кода?

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

Необходимые зависимости

На вашей машине должны быть установлены утилита cppcheck и Python 2.7 (воспользуйтесь apt-get install).

$ cppcheck --version
Cppcheck 1.82
$ python2.7 --version
Python 2.7.13

Запуск линтеров

$ ./linters/run.sh --local

***** RUN cppcheck *****
Checking project/src/main.c ...
1/2 files checked 50% done
Checking project/src/utils.c ...
2/2 files checked 100% done
[*]: (information) Unmatched suppression: missingIncludeSystem

***** RUN cpplint.py *****
Done processing project/include/utils.h
Done processing project/src/main.c
Done processing project/src/utils.c
Total errors found: 0

***** SUCCESS *****

Как запустить тесты?

$ make clean && make
$ ./btests/run.sh ./main.out
............SUCCESS

Тест не пройден. Причина?

Код возврата программы не совпадает с ожидаемым
$ ./btests/run.sh ./main.out 
TEST ./btests/0.0.tst FAILED. INVALID EXIT STATUS 
EXPECTED:
255
RECEIVED:
0

Мы видим, что тест ./btests/0.0.tst не прошёл.

Ожидалось, что программа завершится с кодом 255, а был получен 0.

Вывод программы не совпадает с ожидаемым
$ ./btests/run.sh ./main.out 
..TEST ./btests/1.0.tst FAILED 
EXPECTED (2 symbols):
12
RECEIVED (1 symbols):
8

Мы видим, что тест ./btests/1.0.tst не прошёл.

В стандартном выводе программы ожидалось "12", а было получено "8".

Что делать?

Смотрим содержимое непрошедшего теста (файл .tst), узнаём с какими ключами (KEYS) была запущена программа, что было подано ей на вход (IN) и какой вывод (OUT) и код возврата (STATUS) ожидались.

Пробуем повторить тест руками.

Дополнения

Использование кодовых вставок

Все кодовые вставки в данном документе подчиняются следующим правилам:

Если перед строкой стоит знак $, значит это команда, которая запускается в терминале. Пример:

$ ls
$ ./test

Здесь выполняются 2 команды: ls и ./test. Чтобы выполнить их у себя на компьютере, необходимо скопировать все, что находится за символом $.

Если перед строкой не стоит символа $, значит это вывод программы, которая была выполнена выше. Пример:

$ ls
test 123 somedir

Здесь была выполнена команда ls, которая выдала в терминал текст test 123 somedir. Эти строки даны для ознакомления с примером вывода программ.

Как добавить исходные коды в Makefile

Если вы добавляете в проект еще один файл исходных кодов, для того чтобы он успешно собирался, необходимо добавить его в файл Makefile. Напомним, что Makefile является составным конфигурационным файлом для утилиты make.

Пример конфигурационного файла:

TARGET = main.out
HDRS_DIR = project/include

# XXX: Don't forget backslash at the end of any line except the last one
SRCS = \
       project/src/main.c \
       project/src/utils.c

.PHONY: all clean

all: $(TARGET)

$(TARGET): $(SRCS)
	$(CC) -Wall -Wextra -Werror -I $(HDRS_DIR) -o $(TARGET) $(CFLAGS) $(SRCS)

clean:
	rm -rf $(TARGET)

В данном примере, проект состоит из 2х файлов исходных кодов: project/src/main.c и project/src/utils.c. В случае, если вам необходимо добавить еще один файл в проект, необходимо добавить путь к файлу в переменную SRCS.

Например, чтобы добавить файл project/src/some.c, отредактируйте Makefile следующим образом:

SRCS = \
       project/src/main.c \
       project/src/utils.c \
       project/src/some.c

Обратите внимание, что после utils.c появился знак переноса строки (символ /) тогда как после some.c его нет. Знак переноса строки должен присутствовать во всех строках кроме последней.

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

About

Технопарк си/си++ 2019


Languages

Language:Shell 44.7%Language:C 38.9%Language:Scilab 10.0%Language:Makefile 6.4%