From f3b8c9c9156588afc6fc01356b889105c447bc02 Mon Sep 17 00:00:00 2001 From: AndreyBryzgalov Date: Sat, 28 Dec 2024 19:29:17 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=9B=D0=A0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_hw/CMakeLists.txt | 10 +++ 05_hw/benchmark_pp.c | 46 +++++++++++ 05_hw/stack.c | 14 ++-- 05_hw/test.c | 182 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 247 insertions(+), 5 deletions(-) create mode 100644 05_hw/benchmark_pp.c create mode 100644 05_hw/test.c diff --git a/05_hw/CMakeLists.txt b/05_hw/CMakeLists.txt index 6f5e398..ef738e5 100644 --- a/05_hw/CMakeLists.txt +++ b/05_hw/CMakeLists.txt @@ -5,3 +5,13 @@ add_library(stack stack.c) add_executable(main main.c) target_link_libraries(main stack) + +add_executable(test test.c) +target_link_libraries(test stack) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage -g") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage") + +add_executable(benchmark_pp benchmark_pp.c) +target_link_libraries(benchmark_pp stack) + diff --git a/05_hw/benchmark_pp.c b/05_hw/benchmark_pp.c new file mode 100644 index 0000000..b824499 --- /dev/null +++ b/05_hw/benchmark_pp.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include "stack.h" + +// Функция для измерения времени выполнения операции push +void measurePushPerformance(Stack* stack, size_t elementCount) { + clock_t startTime = clock(); + for (size_t i = 0; i < elementCount; ++i) { + push(stack, (int)i); + } + clock_t endTime = clock(); + printf("Push operation for %zu elements took: %.6f seconds\n", elementCount, (double)(endTime - startTime) / CLOCKS_PER_SEC); +} + +// Функция для измерения времени выполнения операции pop +void measurePopPerformance(Stack* stack, size_t elementCount) { + clock_t startTime = clock(); + for (size_t i = 0; i < elementCount; ++i) { + pop(stack); + } + clock_t endTime = clock(); + printf("Pop operation for %zu elements took: %.6f seconds\n", elementCount, (double)(endTime - startTime) / CLOCKS_PER_SEC); +} + +int main() { + Stack stack; + initStack(&stack); + + // Количество элементов для тестирования + size_t testElementCount = 1500000; + + // Измерение производительности операций push + measurePushPerformance(&stack, testElementCount); + + // Заполнение стека для тестирования pop + for (size_t i = 0; i < testElementCount; ++i) { + push(&stack, (int)i); + } + + // Измерение производительности операций pop + measurePopPerformance(&stack, testElementCount); + + destroyStack(&stack); + return 0; +} diff --git a/05_hw/stack.c b/05_hw/stack.c index 0964440..c9fe6b1 100644 --- a/05_hw/stack.c +++ b/05_hw/stack.c @@ -17,10 +17,11 @@ void initStack(Stack* stack) { void destroyStack(Stack* stack) { Node* current = stack->top; while (current != NULL) { - Node *tmp = current; + Node* tmp = current; current = current->next; - free(tmp); + free(tmp); } + stack->top = NULL; // Обнуляем указатель на вершину } void push(Stack* stack, int data) { @@ -30,8 +31,12 @@ void push(Stack* stack, int data) { } void pop(Stack* stack) { + if (stack->top == NULL) { + return; // Безопасно выходим, если стек пуст + } Node* temp = stack->top; stack->top = stack->top->next; + free(temp); } Node* searchByValue(Stack* stack, int value) { @@ -40,6 +45,7 @@ Node* searchByValue(Stack* stack, int value) { if (current->data == value) { return current; } + current = current->next; // Обновляем указатель } return NULL; } @@ -72,7 +78,5 @@ void traverseStack(Stack* stack) { } bool isEmpty(Stack* stack) { - free(stack->top); return stack->top == NULL; -} - +} \ No newline at end of file diff --git a/05_hw/test.c b/05_hw/test.c new file mode 100644 index 0000000..e8816fc --- /dev/null +++ b/05_hw/test.c @@ -0,0 +1,182 @@ +#include "stack.h" +#include +#include +#include + +void verifyPushFunctionality() { + Stack testStack; + initStack(&testStack); + + push(&testStack, 15); + push(&testStack, 25); + push(&testStack, 35); + + const Node* topNode = getTop(&testStack); + assert(topNode && topNode->data == 35); + + destroyStack(&testStack); + printf("verifyPushFunctionality: PASSED\n"); +} + +void verifyPopFunctionality() { + Stack testStack; + initStack(&testStack); + + push(&testStack, 5); + push(&testStack, 15); + push(&testStack, 25); + + pop(&testStack); + const Node* topNode = getTop(&testStack); + assert(topNode && topNode->data == 15); + + pop(&testStack); + topNode = getTop(&testStack); + assert(topNode && topNode->data == 5); + + pop(&testStack); + assert(isEmpty(&testStack)); + + destroyStack(&testStack); + printf("verifyPopFunctionality: PASSED\n"); +} + +void verifyEmptyStackBehavior() { + Stack testStack; + initStack(&testStack); + + assert(isEmpty(&testStack)); + + push(&testStack, 100); + assert(!isEmpty(&testStack)); + + pop(&testStack); + assert(isEmpty(&testStack)); + + destroyStack(&testStack); + printf("verifyEmptyStackBehavior: PASSED\n"); +} + +void verifyValueSearch() { + Stack testStack; + initStack(&testStack); + + push(&testStack, 10); + push(&testStack, 20); + push(&testStack, 30); + + const Node* foundNode = searchByValue(&testStack, 20); + assert(foundNode && foundNode->data == 20); + + foundNode = searchByValue(&testStack, 40); + assert(foundNode == NULL); + + destroyStack(&testStack); + printf("verifyValueSearch: PASSED\n"); +} + +void verifyIndexSearch() { + Stack testStack; + initStack(&testStack); + + push(&testStack, 10); + push(&testStack, 20); + push(&testStack, 30); + + const Node* foundNode = searchByIndex(&testStack, 0); + assert(foundNode && foundNode->data == 30); + + foundNode = searchByIndex(&testStack, 2); + assert(foundNode && foundNode->data == 10); + + foundNode = searchByIndex(&testStack, 3); + assert(foundNode == NULL); + + destroyStack(&testStack); + printf("verifyIndexSearch: PASSED\n"); +} + +void verifyTopRetrieval() { + Stack testStack; + initStack(&testStack); + + push(&testStack, 10); + push(&testStack, 15); + + const Node* topNode = getTop(&testStack); + assert(topNode && topNode->data == 15); + + pop(&testStack); + topNode = getTop(&testStack); + assert(topNode && topNode->data == 10); + + pop(&testStack); + topNode = getTop(&testStack); + assert(topNode == NULL); + + destroyStack(&testStack); + printf("verifyTopRetrieval: PASSED\n"); +} + +void verifyStackDestruction() { + Stack testStack; + initStack(&testStack); + + push(&testStack, 10); + push(&testStack, 20); + push(&testStack, 30); + + destroyStack(&testStack); + assert(getTop(&testStack) == NULL); + + printf("verifyStackDestruction: PASSED\n"); +} + +void verifyNodeCreation() { + Node* newNode = createNode(50); + assert(newNode && newNode->data == 50 && newNode->next == NULL); + free(newNode); + printf("verifyNodeCreation: PASSED\n"); +} + +void verifyStackInitialization() { + Stack testStack; + initStack(&testStack); + assert(testStack.top == NULL); + printf("verifyStackInitialization: PASSED\n"); +} + +void verifyStackTraversal() { + Stack testStack; + initStack(&testStack); + + push(&testStack, 15); + push(&testStack, 25); + push(&testStack, 35); + + printf("Expected output: Stack contents: 35 25 15\n"); + printf("Actual output: "); + traverseStack(&testStack); + + destroyStack(&testStack); + printf("verifyStackTraversal: PASSED\n"); +} + +int main() { + printf("Executing test suite...\n"); + + verifyNodeCreation(); + verifyStackInitialization(); + verifyStackDestruction(); + verifyPushFunctionality(); + verifyPopFunctionality(); + verifyValueSearch(); + verifyIndexSearch(); + verifyTopRetrieval(); + verifyStackTraversal(); + verifyEmptyStackBehavior(); + + printf("All tests completed successfully.\n"); + + return 0; +} \ No newline at end of file