Skip to content

Хранилище за домашни работи и автоматични тестове

Notifications You must be signed in to change notification settings

fmi-lab/cpp-homeworks-kn-2018

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Домашни работи по УП на специалност КН 2018г.

Условието на всяко домашно можете да намерите в подпапката homeworks тук в GitHub, или в сайта. Ако двете се разминават - по-актуалното е това в сайта.

Тестове

Домашните проверяваме автоматично чрез автоматизирани тестове. За всяка задача получавате брой точки, пропорционален на броя успешни тестове (евентуално добавени/отнети бонус точки). Тези тестове стават публични след края на срока за предаване на съответното домашно.

Примерни тестове

За да можете да си проверите базови неща като сигнатурите на функциите, за всяко домашно ви даваме набор от примерни тестове. Тези тестове пробват само малка част от възможните случаи за всяка функция. Не разчитайте, че щом те минават успешно, значи решението ви е коректно.

Пускане на aвтоматичните тестове

  1. Направете празен проект с празен solution.cpp файл.
    • За Visual Studio направете Empty Project, не Console Application (така няма да имате проблеми свързани със stdafx.h).
  2. Свалете doctest.h (десен бутон на този линк -> Save as...) в папката на решението си.
    • За Visual Studio:
      • Сложете този файл в папката Header Files.
      • Погрижете се, че в right-click менюто на този файл -> Properties на General таб-а в Item Type пише C/C++ header.
    • За Code::Blocks: Ако при компилация получавате странни грешки свързани с C++11, nullptr или fileno направете следното:
      • Отворете Settings -> Global compiler settings -> Compiler settings -> Other compiler options и напишете -std=gnu++11 в текстовото поле.
    • За друго IDE - погрижете се да не се опитва да компилира файла doctest.h. Той ще бъде зареден от cpp файла с тестовете.
  3. Свалете файла с тестовете на съответното домашно - tests.cpp или sample_tests.cpp. Сложете го в проекта до cpp файла с решението ви.
  4. Добавете функциите, очаквани от задачата в solution.cpp. Ако ги няма или нямат точно същите имена и сигнатури - проектът няма да се компилира.
  5. Пуснете проекта.
    • Ако не използвате IDE, а компилирате през терминал - изброете и двата cpp файла, например clang++ solution.cpp tests.cpp
  6. В конзолата трябва да виждате броя успешни и неуспешни тестове, както и описание какво се е счупило за неуспешните:
[doctest] doctest version is "2.0.1"
[doctest] run with "--help" for options
===============================================================================
sample_tests.cpp:15:
TEST CASE:  returns 6

sample_tests.cpp:16: ERROR: CHECK( return_five() == 6 ) is NOT correct!
  values: CHECK( 5 == 6 )

===============================================================================
[doctest] test cases:      1 |      0 passed |      1 failed |      0 skipped
[doctest] assertions:      1 |      0 passed |      1 failed |
[doctest] Status: FAILURE!

За повече информация какво очаква определен тест отворете тестовия файл и прочетете какво прави съответният тест.

Добавяйте свои тестове

Добавяйки собствени тестове към примерните ви помага да проверите всички възможни случаи на решението си. Просто отворете нашия файл с тестове, копи-пейстнете някой съществуващ тест и променете данните или проверките. Структурата на всеки тест е следната:

// Низът тук е името на теста
TEST_CASE("testing the factorial function") {
    // Тук обикновено има код, подготвящ данните за функцията, която се тества

    // Извикваме решението и проверяваме дали резултатът е това, което очакваме.
    // Може да има повече от една проверка, или проверките да са изнесени във функция.
    CHECK(factorial(1) == 1);
    CHECK(factorial(2) == 2);
    CHECK(factorial(3) == 6);
    CHECK(factorial(10) == 3628800);
}

Повече може да прочетете в документацията на doctest.

ВАЖНО! За да не се окажете с 0 точки...

  • Проверете си решението с примерните тестове. Ако решението не се компилира заедно с примерните тестове - получава 0 точки.
  • Не добавяйте main функция. Тестовете дефинират своя такава. Ако го направите - проектът няма да се компилира с тестовете и сайтът ще ви се скара при предаване.
  • Не използвайте cin. Използвайте само данните, подадени ви като аргументи на съответната функция. Тестовете ни няма да подават неща на стандартния вход.
  • Не показвайте неща на екрана. Връщайте стойности (или променяйте аргументи). Няма да се проверява какво сте извели на екрана, дори да е вярно.
  • Ще отнемаме точки за грешно форматиран код. Внимавайте за индентацията (отместването) на кода.
  • Ще отнемаме точки за лоши имена на функции и променливи. chislo е лошо име. number е относително лошо име. first_divisor е хубаво име. Неща като a, tmp и подобни са в първата категория.

За имената...

Когато задавате имена на променливи, помислете за следните неща:

  • Имена се пишат на английски. Google Translate е ваш приятел, ако не знаете някоя дума.
  • Какво представлява стойността на променливата? Не от какъв тип е - името number не носи никаква информация. Имена като first_divisor и max_number носят такава.
  • Измислете най-описателното име, след което го съкратете, така че да запази смисъла си. Добри думи за премахване са тези, които се подразбират от контекста. Например:
    • int numbers_array[] -> int numbers[]
    • int count_positive_elements_in_an_array(int numbers[], ...) -> int count_positive_elements(int numbers[], ...) или направо int count_positive(int numbers[], ...)
    • int count_positive(int numbers[], int numbers_length) -> int count_positive(int numbers[], int length)
  • Съкращения на думи са приемливи в много малко случаи. Не пестите нищо ако напишете cur_max_num, вместо current_max_number.
  • i е добро име единствено ако представлява индекс в цикъл. Ако обхождате матрица - по-добре напишете row и col вместо i и j.
  • Няма проблем да използвате camelCase или snake_case.

About

Хранилище за домашни работи и автоматични тестове

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages