From f28247d1fdd98e5b92dbb4b213b5d479feeb8695 Mon Sep 17 00:00:00 2001 From: Lubbel Date: Wed, 18 Dec 2024 21:34:32 +0300 Subject: [PATCH 1/7] =?UTF-8?q?1.=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE?= =?UTF-8?q?=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_hw/stack.c | 24 ++++++++++++++++++------ 05_hw/stack.h | 6 +++--- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/05_hw/stack.c b/05_hw/stack.c index 0964440..5e213eb 100644 --- a/05_hw/stack.c +++ b/05_hw/stack.c @@ -1,6 +1,5 @@ #include #include - #include "stack.h" Node* createNode(int data) { @@ -24,26 +23,35 @@ void destroyStack(Stack* stack) { } void push(Stack* stack, int data) { + if (stack == NULL) return; Node* newNode = createNode(data); newNode->next = stack->top; stack->top = newNode; } -void pop(Stack* stack) { + +bool pop(Stack* stack) { + if (stack == NULL || stack->top == NULL) return false; Node* temp = stack->top; stack->top = stack->top->next; + free(temp); + return true; } + Node* searchByValue(Stack* stack, int value) { + if (stack == NULL) return NULL; Node* current = stack->top; while (current != NULL) { if (current->data == value) { return current; } + current = current->next; } return NULL; } + Node* searchByIndex(Stack* stack, int index) { Node* current = stack->top; int count = 0; @@ -58,10 +66,13 @@ Node* searchByIndex(Stack* stack, int index) { } Node* getTop(Stack* stack) { + if (stack == NULL) return NULL; return stack->top; } -void traverseStack(Stack* stack) { + +void traverseStack(const Stack* stack) { + if (stack == NULL) return; Node* current = stack->top; printf("Stack elements: "); while (current != NULL) { @@ -71,8 +82,9 @@ void traverseStack(Stack* stack) { printf("\n"); } -bool isEmpty(Stack* stack) { - free(stack->top); - return stack->top == NULL; + +bool isEmpty(const Stack* stack) { + return stack == NULL || stack->top == NULL; } + diff --git a/05_hw/stack.h b/05_hw/stack.h index ef0734e..52dad0d 100644 --- a/05_hw/stack.h +++ b/05_hw/stack.h @@ -23,7 +23,7 @@ void destroyStack(Stack *stack); void push(Stack* stack, int data); -void pop(Stack* stack); +bool pop(Stack* stack); Node* searchByValue(Stack* stack, int value); @@ -31,9 +31,9 @@ Node* searchByIndex(Stack* stack, int index); Node* getTop(Stack* stack); -void traverseStack(Stack* stack); +void traverseStack(const Stack* stack); -bool isEmpty(Stack* stack); +bool isEmpty(const Stack* stack); #ifdef __cplusplus } From 3a12389c44d8f7cb5c82e63b5251b62dfa6c8e28 Mon Sep 17 00:00:00 2001 From: Lubbel Date: Wed, 18 Dec 2024 21:36:45 +0300 Subject: [PATCH 2/7] =?UTF-8?q?2.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_hw/main.c | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/05_hw/main.c b/05_hw/main.c index fded814..7447cdd 100644 --- a/05_hw/main.c +++ b/05_hw/main.c @@ -1,34 +1,46 @@ #include "stack.h" - +#include #include -int main() { +void test_stack_operations() { + printf("Start of testing\n"); Stack stack; initStack(&stack); + assert(isEmpty(&stack) == true); + printf("The initial stack\n"); + traverseStack(&stack); push(&stack, 10); + assert(stack.top->data == 10); push(&stack, 20); push(&stack, 30); - printf("After pushing elements:\n"); + assert(isEmpty(&stack) == false); + printf("Stack after adding elements\n"); + traverseStack(&stack); + assert(getTop(&stack)->data == 30); + assert(pop(&stack) == true); + printf("Stack after excluding the last element\n"); traverseStack(&stack); - pop(&stack); - printf("After popping an element:\n"); - traverseStack(&stack); + assert(getTop(&stack)->data == 20); - Node* searchResult = searchByValue(&stack, 20); - if (searchResult != NULL) { - printf("Element with value 20 found.\n"); - } else { - printf("Element with value 20 not found.\n"); - } - - Node* topElement = getTop(&stack); - if (topElement != NULL) { - printf("Top element: %d\n", topElement->data); - } + assert(searchByValue(&stack, 20) != NULL); + assert(searchByValue(&stack, 100) == NULL); + + assert(searchByIndex(&stack, 0)->data == 20); + assert(searchByIndex(&stack, 1)->data == 10); + assert(searchByIndex(&stack, 2) == NULL); + + destroyStack(&stack); + assert(isEmpty(&stack) == true); + printf("End of testing\n"); +} + +int main() { + test_stack_operations(); + printf("All tests passed!\n"); return 0; } From fb829053c90315ad11956c02dca47f4152535610 Mon Sep 17 00:00:00 2001 From: Lubbel Date: Wed, 18 Dec 2024 21:38:21 +0300 Subject: [PATCH 3/7] =?UTF-8?q?3.=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE?= =?UTF-8?q?=D0=BA=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B3=D0=BE=20=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=82=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_hw/stack.c | 2 +- 05_hw/stack.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/05_hw/stack.c b/05_hw/stack.c index 5e213eb..ae7e1b8 100644 --- a/05_hw/stack.c +++ b/05_hw/stack.c @@ -65,7 +65,7 @@ Node* searchByIndex(Stack* stack, int index) { return NULL; } -Node* getTop(Stack* stack) { +Node* getTop(const Stack* stack) { if (stack == NULL) return NULL; return stack->top; } diff --git a/05_hw/stack.h b/05_hw/stack.h index 52dad0d..9e79136 100644 --- a/05_hw/stack.h +++ b/05_hw/stack.h @@ -29,7 +29,7 @@ Node* searchByValue(Stack* stack, int value); Node* searchByIndex(Stack* stack, int index); -Node* getTop(Stack* stack); +Node* getTop(const Stack* stack); void traverseStack(const Stack* stack); From c2efc43a60567fc725ae232a609586ef9976cd0d Mon Sep 17 00:00:00 2001 From: Lubbel Date: Wed, 18 Dec 2024 21:42:24 +0300 Subject: [PATCH 4/7] =?UTF-8?q?4.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B1=D0=B5=D0=BD=D1=87=D0=BC=D0=B0?= =?UTF-8?q?=D1=80=D0=BA=D0=BE=D0=B2=20=D0=B4=D0=BB=D1=8F=20push/pop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_hw/main.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/05_hw/main.c b/05_hw/main.c index 7447cdd..60c5f24 100644 --- a/05_hw/main.c +++ b/05_hw/main.c @@ -1,6 +1,7 @@ #include "stack.h" #include #include +#include void test_stack_operations() { printf("Start of testing\n"); @@ -38,10 +39,58 @@ void test_stack_operations() { printf("End of testing\n"); } +// Функция для измерения времени выполнения push +void benchmark_push(Stack* stack, int num_operations) { + clock_t start, end; + double cpu_time_used; + + start = clock(); // Засекаем время начала + for (int i = 0; i < num_operations; i++) { + push(stack, i); // Выполняем push + } + end = clock(); // Засекаем время окончания + + cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC; + printf("Push benchmark: %d operations took %f seconds\n", num_operations, cpu_time_used); +} + +// Функция для измерения времени выполнения pop +void benchmark_pop(Stack* stack, int num_operations) { + clock_t start, end; + double cpu_time_used; + + // Предварительно заполняем стек + for (int i = 0; i < num_operations; i++) { + push(stack, i); + } + + start = clock(); // Засекаем время начала + for (int i = 0; i < num_operations; i++) { + pop(stack); // Выполняем pop + } + end = clock(); // Засекаем время окончания + + cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC; + printf("Pop benchmark: %d operations took %f seconds\n", num_operations, cpu_time_used); +} + int main() { test_stack_operations(); printf("All tests passed!\n"); + Stack stack; + initStack(&stack); + + int num_operations = 1000000; // Количество операций + + // Бенчмарк push + benchmark_push(&stack, num_operations); + + // Бенчмарк pop + benchmark_pop(&stack, num_operations); + + destroyStack(&stack); + return 0; } From 7d0a07d05bba36d249391946d929e0d6fb9b6620 Mon Sep 17 00:00:00 2001 From: Lubbel Date: Wed, 18 Dec 2024 21:46:14 +0300 Subject: [PATCH 5/7] =?UTF-8?q?5.=20=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B0=20CI=20=D0=B4=D0=BB=D1=8F=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..a138579 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,33 @@ +name: C CI + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Install GCC and tools + run: | + sudo apt-get update + sudo apt-get install -y build-essential gcc lcov + + - name: Build and test + run: | + gcc -o main 05_hw/stack.c 05_hw/main.c -fsanitize=address -fsanitize=undefined -fprofile-arcs -ftest-coverage + ./main + + - name: Generate coverage report + run: | + gcov stack.c + lcov --capture --directory . --output-file coverage.info + genhtml coverage.info --output-directory coverage From 21fdfd2ff0df934fc537a2d7a71d60a01510a2f9 Mon Sep 17 00:00:00 2001 From: Lubbel Date: Wed, 18 Dec 2024 22:05:56 +0300 Subject: [PATCH 6/7] =?UTF-8?q?6.=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE?= =?UTF-8?q?=D0=BA=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20CI=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_hw/stack.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/05_hw/stack.c b/05_hw/stack.c index ae7e1b8..a0eb236 100644 --- a/05_hw/stack.c +++ b/05_hw/stack.c @@ -14,12 +14,14 @@ void initStack(Stack* stack) { } void destroyStack(Stack* stack) { + if (stack == NULL || stack->top == NULL) return; 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) { From 5b9a276a79e509c72ebafcdc87f0276bcbc4ec1a Mon Sep 17 00:00:00 2001 From: Lubbel <72159970+Lubbel@users.noreply.github.com> Date: Wed, 18 Dec 2024 22:17:22 +0300 Subject: [PATCH 7/7] Update ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a138579..4c7608a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,6 +28,6 @@ jobs: - name: Generate coverage report run: | - gcov stack.c + gcov 05_hw/stack.c lcov --capture --directory . --output-file coverage.info genhtml coverage.info --output-directory coverage