From 7c9279480944857096b2c1d2ff6c3f82405f5e9d Mon Sep 17 00:00:00 2001 From: Artem Date: Wed, 14 Dec 2022 17:08:26 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D1=82=D0=BE=D1=80=D0=B0=D1=8F=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=20=D0=B7=D0=B0=D1=87=D1=91=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- secondTask/secondTask.sln | 31 ++++ secondTask/secondTask/list.c | 129 +++++++++++++++ secondTask/secondTask/list.h | 25 +++ secondTask/secondTask/main.c | 69 ++++++++ secondTask/secondTask/secondTask.vcxproj | 156 ++++++++++++++++++ .../secondTask/secondTask.vcxproj.filters | 41 +++++ secondTask/secondTask/test.c | 36 ++++ secondTask/secondTask/test.h | 6 + secondTask/secondTask/test.txt | 3 + 9 files changed, 496 insertions(+) create mode 100644 secondTask/secondTask.sln create mode 100644 secondTask/secondTask/list.c create mode 100644 secondTask/secondTask/list.h create mode 100644 secondTask/secondTask/main.c create mode 100644 secondTask/secondTask/secondTask.vcxproj create mode 100644 secondTask/secondTask/secondTask.vcxproj.filters create mode 100644 secondTask/secondTask/test.c create mode 100644 secondTask/secondTask/test.h create mode 100644 secondTask/secondTask/test.txt diff --git a/secondTask/secondTask.sln b/secondTask/secondTask.sln new file mode 100644 index 0000000..f3ce2ba --- /dev/null +++ b/secondTask/secondTask.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "secondTask", "secondTask\secondTask.vcxproj", "{445E5F6E-C6A8-4B4E-B14C-0B4879144302}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {445E5F6E-C6A8-4B4E-B14C-0B4879144302}.Debug|x64.ActiveCfg = Debug|x64 + {445E5F6E-C6A8-4B4E-B14C-0B4879144302}.Debug|x64.Build.0 = Debug|x64 + {445E5F6E-C6A8-4B4E-B14C-0B4879144302}.Debug|x86.ActiveCfg = Debug|Win32 + {445E5F6E-C6A8-4B4E-B14C-0B4879144302}.Debug|x86.Build.0 = Debug|Win32 + {445E5F6E-C6A8-4B4E-B14C-0B4879144302}.Release|x64.ActiveCfg = Release|x64 + {445E5F6E-C6A8-4B4E-B14C-0B4879144302}.Release|x64.Build.0 = Release|x64 + {445E5F6E-C6A8-4B4E-B14C-0B4879144302}.Release|x86.ActiveCfg = Release|Win32 + {445E5F6E-C6A8-4B4E-B14C-0B4879144302}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {5A2201CE-EEEF-4D03-B86E-D9912CA162B5} + EndGlobalSection +EndGlobal diff --git a/secondTask/secondTask/list.c b/secondTask/secondTask/list.c new file mode 100644 index 0000000..0a7db28 --- /dev/null +++ b/secondTask/secondTask/list.c @@ -0,0 +1,129 @@ +#include "list.h" +#include +#include +#include + +typedef struct NodeList { + char value[100]; + struct NodeList* next; +} NodeList; + +typedef struct List { + NodeList* head; +}; + +bool isLastElementSame(List* list, char value[], Error* errorCheck) { + if (list == NULL || list->head == NULL) { + *errorCheck = emptyPointer; + return false; + } + NodeList* walker = list->head; + while (walker->next != NULL) { + walker = walker->next; + } + return strcmp(walker->value, value) == 0; +} + +List* createList(Error* errorCheck) { + List* list = calloc(1, sizeof(List)); + if (list == NULL) { + *errorCheck = memoryError; + } + return list; +} + +int sizeList(List* list) { + int sizeList = 0; + NodeList* walker = list->head; + while (walker != NULL) { + ++sizeList; + walker = walker->next; + } + return sizeList; +} + +void addWithASymbolStrings(List* list, Error* errorCheck) { + if (list == NULL) { + *errorCheck = emptyPointer; + return; + } + NodeList* walker = list->head; + int size = sizeList(list); + int i = 0; + while (i < size && walker != NULL) { + if (walker->value != NULL && walker->value[0] == 'a') { + addToList(list, walker->value, errorCheck); + if (errorCheck != ok) { + return; + } + } + walker = walker->next; + ++i; + } +} + +void addToList(List* list, char value[], Error* errorCheck) { + if (list == NULL) { + *errorCheck = emptyPointer; + return; + } + NodeList* temp = calloc(1, sizeof(NodeList)); + if (temp == NULL) { + *errorCheck = memoryError; + return; + } + + strcpy(temp->value, value); + temp->next = NULL; + + if (list->head == NULL) { + list->head = temp; + return; + } + NodeList* walker = list->head; + while (walker->next != NULL) { + walker = walker->next; + } + walker->next = temp; +} + +bool isEmptyList(List* list) { + if (list == NULL) { + return true; + } + return list->head == NULL; +} + +char* deleteElementList(List* list, Error* errorCheck) { + if (list == NULL || list->head == NULL) { + *errorCheck = emptyPointer; + return NULL; + } + if (list->head->next == NULL) { + char* value = list->head->value; + free(list->head); + list->head = NULL; + return value; + } + NodeList* walker = list->head; + while (walker->next->next != NULL) { + walker = walker->next; + } + char* value = walker->next->value; + free(walker->next); + walker->next = NULL; + return value; +} + +List* clearList(List* list, Error* errorCheck) { + if (list == NULL) { + return; + } + + while (!isEmptyList(list)) { + deleteElementList(list, errorCheck); + } + + free(list); + return NULL; +} \ No newline at end of file diff --git a/secondTask/secondTask/list.h b/secondTask/secondTask/list.h new file mode 100644 index 0000000..5460b04 --- /dev/null +++ b/secondTask/secondTask/list.h @@ -0,0 +1,25 @@ +#pragma once +#include + +typedef struct List List; + +typedef enum Error { + memoryError, + emptyPointer, + anotherError, + ok, +}Error; + +List* createList(Error* errorCheck); + +bool isEmptyList(List* list); + +void addToList(List* list, char value[], Error* errorCheck); + +char* deleteElementList(List* list, Error* errorCheck); + +List* clearList(List* list, Error* errorCheck); + +void addWithASymbolStrings(List* list, Error* errorCheck); + +bool isLastElementSame(List* list, char value[], Error* errorCheck); \ No newline at end of file diff --git a/secondTask/secondTask/main.c b/secondTask/secondTask/main.c new file mode 100644 index 0000000..db9df5c --- /dev/null +++ b/secondTask/secondTask/main.c @@ -0,0 +1,69 @@ +#include "list.h" +#include "test.h" +#include "list.h" +#include +#include +#include + +void workWithFile(const char* fileName, Error* errorCheck) { + FILE* file = fopen(fileName, "r"); + if (file == NULL) { + *errorCheck = anotherError; + return; + } + List* list = createList(errorCheck); + if (list == NULL) { + *errorCheck = emptyPointer; + return; + } + char buffer[100] = { '\0' }; + while (fscanf(file, "%s", buffer) == 1) { + addToList(list, buffer, errorCheck); + if (*errorCheck != ok) { + clearList(list, errorCheck); + return; + } + } + fclose(file); + addWithASymbolStrings(list, errorCheck); + if (*errorCheck != ok) { + clearList(list, errorCheck); + return; + } + clearList(list, errorCheck); +} + +int main() { + if (test()) { + printf("Tests correct\n"); + } + else { + printf("Tests incorrect\n"); + return -1; + } + char fileName[101] = { '\0' }; + printf("Input fileName, maximum of 100 characters\n"); + int checkScanf = scanf("%s", fileName); + while (checkScanf != 1) { + while (getchar() != '\n') { + } + printf("Error...\n"); + checkScanf = scanf("%s", &fileName); + } + Error errorCheck = ok; + workWithFile(fileName, &errorCheck); + switch (errorCheck) + { + case(ok): + break; + case(emptyPointer): + printf("Error with null pointer\n"); + return -1; + case(memoryError): + printf("Error with memory\n"); + return -1; + case(anotherError): + printf("Error\n"); + return -1; + } +} \ No newline at end of file diff --git a/secondTask/secondTask/secondTask.vcxproj b/secondTask/secondTask/secondTask.vcxproj new file mode 100644 index 0000000..4a82343 --- /dev/null +++ b/secondTask/secondTask/secondTask.vcxproj @@ -0,0 +1,156 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {445e5f6e-c6a8-4b4e-b14c-0b4879144302} + secondTask + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + false + + + true + + + false + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + false + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/secondTask/secondTask/secondTask.vcxproj.filters b/secondTask/secondTask/secondTask.vcxproj.filters new file mode 100644 index 0000000..51b6378 --- /dev/null +++ b/secondTask/secondTask/secondTask.vcxproj.filters @@ -0,0 +1,41 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Исходные файлы + + + Исходные файлы + + + Исходные файлы + + + + + Исходные файлы + + + Исходные файлы + + + + + Исходные файлы + + + \ No newline at end of file diff --git a/secondTask/secondTask/test.c b/secondTask/secondTask/test.c new file mode 100644 index 0000000..cdcf753 --- /dev/null +++ b/secondTask/secondTask/test.c @@ -0,0 +1,36 @@ +#include "test.h" +#include "list.h" + +bool test() { + Error errorCheck = ok; + FILE* file = fopen("test.txt", "r"); + if (file == NULL) { + errorCheck = anotherError; + return false; + } + List* list = createList(&errorCheck); + if (list == NULL) { + errorCheck = emptyPointer; + return false; + } + char buffer[100] = { '\0' }; + while (fscanf(file, "%s", buffer) == 1) { + addToList(list, buffer, &errorCheck); + if (errorCheck != ok) { + clearList(list, &errorCheck); + return false; + } + } + addWithASymbolStrings(list, &errorCheck); + if (errorCheck != ok) { + clearList(list, &errorCheck); + return false; + } + bool result = isLastElementSame(list, "adad", &errorCheck); + if (errorCheck != ok) { + clearList(list, &errorCheck); + return false; + } + clearList(list, &errorCheck); + return result; +} \ No newline at end of file diff --git a/secondTask/secondTask/test.h b/secondTask/secondTask/test.h new file mode 100644 index 0000000..52e95a9 --- /dev/null +++ b/secondTask/secondTask/test.h @@ -0,0 +1,6 @@ +#pragma once +#include +#include +#include + +bool test(); \ No newline at end of file diff --git a/secondTask/secondTask/test.txt b/secondTask/secondTask/test.txt new file mode 100644 index 0000000..2982bf3 --- /dev/null +++ b/secondTask/secondTask/test.txt @@ -0,0 +1,3 @@ +fdfdf +adad +fdfdfe \ No newline at end of file