1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/TheAlgorithms-Clang

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
CONTRIBUTING.md 9.5 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 11:43 8da4864

Вызов реализации алгоритма на случайных тестовых данных с ожидаемым результатом. Используйте функцию assert(), чтобы подтвердить, что тесты пройдут. Требуется включить библиотеку assert.h.

Тестовые случаи должны полностью проверять работу программы в соответствии с ожиданиями. Вместо того чтобы запрашивать ввод у пользователя, лучше убедиться, что полученный результат является правильным.

Примеры самотестирования:

  1. ROT13 Cipher (сложный).
// NOTE: функция `rot13` определена в другой части кода.

char test_01[] = "The more I C, the less I see.";
rot13(test_01);
assert(strcmp(test_01, "Gur zber V P, gur yrff V frr.") == 0);

char test_02[] = "Which witch switched the Swiss wristwatches?";
rot13(test_02);
assert(strcmp(test_02, "Juvpu jvgpu fjvgpurq gur Fjvff jevfgjngpurf?") == 0);

char test_03[] = "Juvpu jvgpu fjvgpurq gur Fjvff jevfgjngpurf?";
rot13(test_03);
assert(strcmp(test_03, "Which witch switched the Swiss wristwatches?") == 0);
  1. Sudoku Solver (средний).
uint8_t test_array[] = {3, 0, 6, 5, 0, 8, 4, 0, 0, 5, 2, 0, 0, 0, 0, 0, 0,
                        0, 0, 8, 7, 0, 0, 0, 0, 3, 1, 0, 0, 3, 0, 1, 0, 0,
                        8, 0, 9, 0, 0, 8, 6, 3, 0, 0, 5, 0, 5, 0, 0, 9, 0,
                        6, 0, 0, 1, 3, 0, 0, 0, 0, 2, 5, 0, 0, 0, 0, 0, 0,
                        0, 0, 7, 4, 0, 0, 5, 2, 0, 6, 3, 0, 0};
struct sudoku a = {.N = 9, .N2 = 3, .a = test_array};
assert(solve(&a)); // ensure that solution is obtained
                   // NOTE: `solve` is defined in another part of the code.

uint8_t expected[] = {3, 1, 6, 5, 7, 8, 4, 9, 2, 5, 2, 9, 1, 3, 4, 7, 6,
                      8, 4, 8, 7, 6, 2, 9, 5, 3, 1, 2, 6, 3, 4, 1, 5, 9,
                      8, 7, 9, 7, 4, 8, 6, 3, 1, 2, 5, 8, 5, 1, 7, 9, 2,
                      6, 4, 3, 1, 3, 8, 9, 4, 7, 2, 5, 6, 6, 9, 2, 3, 5,
                      1, 8, 7, 4, 7, 4, 5, 2, 8, 6, 3, 1, 9};
for (int i = 0; i < a.N; i++)
    for (int j = 0; j < a.N; j++)
        assert(a.a[i * a.N + j] == expected[i * a.N + j]);
  1. Небольшая программа на C, демонстрирующая и объясняющая использование тестов.
#include <stdio.h>      /// for IO operations
#include <assert.h>     /// for assert
#include <stdbool.h>    /// for bool

/**
 * @brief Verifies if the given array
 * contains the given number on it.
 * @param arr the array to be used for checking
 * @param number the number to check if it's inside the array
 * @return false if the number was NOT found in the array
 * @return true if the number WAS found in the array
 */
bool is_number_on_array(const int *arr, const int number) {
    for (int i = 0; i < sizeof(arr); i++) {
        if (arr[i] == number) {
            return true;
        }
        else {
            // Number not in the current index, keep searching.
        }
    }

    return false;
}

/**
 * @brief Self-test implementations
 * @returns void
 */
static void tests() {
    int arr[] = { 9, 14, 21, 98, 67 };

    assert(is_number_on_array(arr, 9) == true);
    assert(is_number_on_array(arr, 4) == false);
    assert(is_number_on_array(arr, 98) == true);
    assert(is_number_on_array(arr, 512) == false);

    printf("All tests have successfully passed!\n");
}

/**
 * @brief Main function
 * @returns 0 on exit
 */
int main() {
    tests(); // run self-test implementations
    return 0;
}

Типичная структура программы

/**
* @file
* @brief Добавьте здесь одну строку описания. Должна содержать ссылку на Википедию или другой источник, объясняющий алгоритм/реализацию.
* @details
* Это многострочное
* описание, содержащее ссылки, ссылки,
* математические уравнения и т. д.
* @author [Имя](https://github.com/handle)
* @see related_file.c, another_file.c
*/

#include <assert.h>   /// для assert
#include              /// для `некоторой функции здесь`

/**
* @brief Документация по структуре
*/
struct struct_name {
    int **Файл с именем guidelines**

* Используйте строчные буквы и символ нижнего подчёркивания в качестве разделителя.

Например:

MyNewCStruct.C  неверно;
my_new_c_struct.c  верно.

Имя файла будет использоваться для динамического создания каталога файлов и реализации. Проверка имени файла будет выполняться в Docker, чтобы обеспечить его правильность. Если реализация алгоритма уже существует и ваша версия отличается от реализованной, пожалуйста, используйте инкрементную цифровую цифру в качестве суффикса. Например, если median_search.c уже существует в папке search и вы предоставляете новую реализацию, имя файла должно быть median_search2.c. Для третьей реализации  median_search3.c и так далее.

**Рекомендации по созданию каталогов**

Рекомендуется добавлять файлы в существующие каталоги, насколько это возможно. Используйте строчные буквы и символ нижнего подчёркивания в качестве разделителей (пробелы или дефисы не допускаются).

Например: 

SomeNew Fancy-Category  неверно; 
some_new_fancy_category  верно. 

Пути к файлам будут использоваться для динамического создания каталога наших алгоритмов. Проверка пути к файлу будет выполняться на GitHub Actions, чтобы убедиться в соответствии требованиям.

**Интеграция CMake в новый каталог**

Если требуется создать новый каталог, необходимо обновить файл CMakeLists.txt в корневом каталоге и создать новый файл CMakeLists.txt внутри нового каталога. Пример того, как должен выглядеть ваш новый файл CMakeLists.txt, приведён ниже. Обратите внимание, что если требуются дополнительные библиотеки или настройки, их также необходимо включить в этот файл.

```cmake
# Если необходимо, используйте флаг RELATIVE, иначе каждый исходный файл может быть указан
# с полным путём. Флаг RELATIVE упрощает автоматическое извлечение имени исполняемого файла.

file( GLOB APP_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.c )
foreach( testsourcefile ${APP_SOURCES} )
    string( REPLACE ".c" "" testname ${testsourcefile} ) # File type. Example: `.c`
    add_executable( ${testname} ${testsourcefile} )

    if(OpenMP_C_FOUND)
        target_link_libraries(${testname} OpenMP::OpenMP_C)
    endif()
    if(MATH_LIBRARY)
        target_link_libraries(${testname} ${MATH_LIBRARY})
    endif()
    install(TARGETS ${testname} DESTINATION "bin/<foldername>") # Folder name. Do NOT include `<>`

endforeach( testsourcefile ${APP_SOURCES} )

Файл CMakeLists.txt в корневом каталоге следует обновить, включив новый каталог. Добавьте свой новый каталог после последнего подкаталога.

Пример:

...
add_subdirectory(numerical_methods)
add_subdirectory(<foldername>)

Правила оформления коммитов

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

git add file_xyz.c
git commit -m "your message"

Примеры сообщений о фиксации с семантическими префиксами:

  • fix: ошибка алгоритма xyz;
  • feat: добавить алгоритм xyx, структуру xyz;
  • test: добавить тест для алгоритма xyz;
  • docs: добавить комментарии и пояснения.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/TheAlgorithms-Clang.git
git@api.gitlife.ru:oschina-mirror/TheAlgorithms-Clang.git
oschina-mirror
TheAlgorithms-Clang
TheAlgorithms-Clang
master