Рекурсивный поворот строки, оценить корректность кода - C (СИ)
Формулировка задачи:
Всем привет.
Закодил следующую ф-ю:
Нужно уточнить следующее:
void ReverseStringRecursion(char *str, int i = 0) { int size = strlen(str); if (i < size/2) { char temp = str[i]; str[i] = str[size - 1 - i]; str[size - 1 - i] = temp; ReverseStringRecursion(str, i + 1); } }
1
. По сравнению с for( ; ; ), данный способ, ведь, не самый быстрый и легкий для системы при выполнении?2
. Можно ли утверждать, что задача соответствует сабжу?3
. Как бы вы решили данную задачу?Решение задачи: «Рекурсивный поворот строки, оценить корректность кода»
textual
Листинг программы
#include "greatest.h" #include <string.h> void ReverseStringRecursion(char *str, int i) { int size = strlen(str); if (i < size/2) { char temp = str[i]; str[i] = str[size - 1 - i]; str[size - 1 - i] = temp; ReverseStringRecursion(str, i + 1); } } TEST empty_string() { char* string = ""; ReverseStringRecursion(string, 0); ASSERT_EQ(strcmp(string, ""), 0); PASS(); } TEST one_char() { char* string = "a"; ReverseStringRecursion(string, 0); ASSERT_EQ(strcmp(string, "a"), 0); PASS(); } TEST two_chars() { char* string = "ab"; ReverseStringRecursion(string, 0); ASSERT_EQ(strcmp(string, "ba"), 0); PASS(); } TEST very_long_string() { char* string = "The quick brown fox jumps over the lazy dog."; ReverseStringRecursion(string, 0); ASSERT_EQ(strcmp(string, ".god yzal eht revo spmuj xof nworb kciuq ehT"), 0); PASS(); } TEST two_reversions() { char* string = "The quick brown fox jumps over the lazy dog."; ReverseStringRecursion(string, 0); ReverseStringRecursion(string, 0); ASSERT_EQ(strcmp(string, "The quick brown fox jumps over the lazy dog."), 0); PASS(); } SUITE(Test_Reverse_String_Recursion) { RUN_TEST(empty_string); RUN_TEST(one_char); RUN_TEST(two_chars); RUN_TEST(very_long_string); RUN_TEST(two_reversions); } GREATEST_MAIN_DEFS(); int main(int argc, char **argv) { GREATEST_MAIN_BEGIN(); /* command-line arguments, initialization. */ RUN_SUITE(Test_Reverse_String_Recursion); GREATEST_MAIN_END(); /* display results */ }
Объяснение кода листинга программы
- Включаются две библиотеки:
greatest.h
и. - Создается функция
ReverseStringRecursion
, которая принимает два аргумента:char *str
иint i
. - Внутри функции происходит вычисление размера строки с помощью функции
strlen
. - Затем выполняется проверка: если
i
меньше половины размера строки, то происходит обмен симвоновstr[i]
иstr[size - 1 - i]
, после чего рекурсивный вызов функцииReverseStringRecursion
с аргументамиstr
иi + 1
. - Если условие не выполняется, то происходит выход из рекурсии.
- Завершается определение функции
ReverseStringRecursion
. - Определяются тестовые функции
TEST empty_string
,TEST one_char
,TEST two_chars
,TEST very_long_string
,TEST two_reversions
. - В каждой тестовой функции создается строка с заданным значением, вызывается функция
ReverseStringRecursion
с аргументамиstring
и0
, после чего происходит сравнение исходной и перевернутой строк с помощью функцииstrcmp
. - Если строки совпадают, то функция
PASS
завершает работу тестовой функции. - В конце определения тестовой функции
TEST two_reversions
создается строка с заданным значением, вызывается функцияReverseStringRecursion
два раза с аргументамиstring
и0
, после чего происходит сравнение исходной и перевернутой строк с помощью функцииstrcmp
. - Если строки совпадают, то функция
PASS
завершает работу тестовой функции. - Определяется функция
main
, которая принимает аргументыargc
иargv
, инициализирует их, а затем запускает тестовую функциюTest_Reverse_String_Recursion
. - В конце функции
main
выводится сообщение об успешном завершении работы программы. - Завершается определение функции
main
. - Создается файл
greatest.h
, который содержит макросы и функции для создания тестовых функций и запуска тестов. - Завершается файл
main.c
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д