diff --git a/firstTaskV1/firstTaskV1.sln b/firstTaskV1/firstTaskV1.sln new file mode 100644 index 0000000..2a58bcd --- /dev/null +++ b/firstTaskV1/firstTaskV1.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}") = "firstTaskV1", "firstTaskV1\firstTaskV1.vcxproj", "{AA955246-93A2-4C17-A4C9-75864DD3582B}" +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 + {AA955246-93A2-4C17-A4C9-75864DD3582B}.Debug|x64.ActiveCfg = Debug|x64 + {AA955246-93A2-4C17-A4C9-75864DD3582B}.Debug|x64.Build.0 = Debug|x64 + {AA955246-93A2-4C17-A4C9-75864DD3582B}.Debug|x86.ActiveCfg = Debug|Win32 + {AA955246-93A2-4C17-A4C9-75864DD3582B}.Debug|x86.Build.0 = Debug|Win32 + {AA955246-93A2-4C17-A4C9-75864DD3582B}.Release|x64.ActiveCfg = Release|x64 + {AA955246-93A2-4C17-A4C9-75864DD3582B}.Release|x64.Build.0 = Release|x64 + {AA955246-93A2-4C17-A4C9-75864DD3582B}.Release|x86.ActiveCfg = Release|Win32 + {AA955246-93A2-4C17-A4C9-75864DD3582B}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {0ACCB585-F11E-4776-992A-D26D70A758C4} + EndGlobalSection +EndGlobal diff --git a/firstTaskV1/firstTaskV1/firstTaskV1.vcxproj b/firstTaskV1/firstTaskV1/firstTaskV1.vcxproj new file mode 100644 index 0000000..bc918e8 --- /dev/null +++ b/firstTaskV1/firstTaskV1/firstTaskV1.vcxproj @@ -0,0 +1,154 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {aa955246-93a2-4c17-a4c9-75864dd3582b} + firstTaskV1 + 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/firstTaskV1/firstTaskV1/firstTaskV1.vcxproj.filters b/firstTaskV1/firstTaskV1/firstTaskV1.vcxproj.filters new file mode 100644 index 0000000..e4d8c96 --- /dev/null +++ b/firstTaskV1/firstTaskV1/firstTaskV1.vcxproj.filters @@ -0,0 +1,35 @@ + + + + + {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/firstTaskV1/firstTaskV1/main.c b/firstTaskV1/firstTaskV1/main.c new file mode 100644 index 0000000..9b5d5c8 --- /dev/null +++ b/firstTaskV1/firstTaskV1/main.c @@ -0,0 +1,95 @@ +#include "stack.h" +#include +#include +#include +#include +#include + +int returnFirstSymbolInNumber(int* number, int sizeNumber) { + int divide = pow(10, sizeNumber - 1); + int result = *number / divide; + *number = *number % divide; + return result; +} + +void workWithFile(Error* errorCheck, const char* fileName, char* numberString) { + FILE* file = fopen(fileName, "r"); + if (file == NULL) { + *errorCheck = anotherError; + return -1; + } + + Stack* stack = createStack(errorCheck); + char symbol = 0; + while (fscanf(file, "%c", &symbol) == 1) { + addElementsFromStringToStack(stack, errorCheck, symbol); + if (*errorCheck != ok) { + stack = clearStack(stack, errorCheck); + fclose(file); + return; + } + } + fclose(file); + int sizeNumber = 0; + int number = createNumberFromStack(stack, errorCheck); + //MAX_INT - 10 + int copyNumber = number; + while (copyNumber != 0) { + copyNumber /= 10; + ++sizeNumber; + } + + int i = 0; + while (number != 0) { + numberString[i] = returnFirstSymbolInNumber(&number, sizeNumber) + '0'; + --sizeNumber; + ++i; + } + free(stack); + return numberString; +} + +bool test() { + char string[11] = { '\0' }; + Error check = ok; + workWithFile(&check, "test.txt", string); + if (check != ok) { + return false; + } + return strcmp(string, "13") == 0; +} + +int main() { + if (test()) { + printf("Test correct\n"); + } else { + printf("Error\n"); + return -1; + } + printf("Enter fileName with extension No more than 99 symbols\n"); + char fileName[100] = {'\0'}; + int checkScanf = scanf_s("%s", fileName, 99); + while (checkScanf != 1) { + while (getchar() != '\n') { + } + checkScanf = scanf_s("%s", fileName, 99); + } + Error errorCheck = ok; + char numberString[11] = { '\0' }; + workWithFile(&errorCheck, fileName, numberString); + 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; + } + printf("%s\n", numberString); +} \ No newline at end of file diff --git a/firstTaskV1/firstTaskV1/stack.c b/firstTaskV1/firstTaskV1/stack.c new file mode 100644 index 0000000..1fe710c --- /dev/null +++ b/firstTaskV1/firstTaskV1/stack.c @@ -0,0 +1,82 @@ +#include "stack.h" +#include +#include + +typedef struct NodeStack { + struct NodeStack* next; + char value; +} NodeStack; + +typedef struct Stack { + struct NodeStack* head; +}Stack; + +int createNumberFromStack(Stack* stack, Error* errorCheck) { + if (stack == NULL) { + *errorCheck = emptyPointer; + return; + } + NodeStack* walker = stack->head; + int number = 0; + int multiplay = 1; + + while (walker != NULL) { + number += ((int)walker->value - 48)* multiplay; + multiplay *= 2; + walker = walker->next; + } + + return number; +} + +Stack* createStack(Error* errorCheck) { + Stack* stack = calloc(1, sizeof(Stack)); + if (stack == NULL) { + *errorCheck = memoryError; + return NULL; + } + return stack; +} + +void addElementsFromStringToStack(Stack* stack, Error* errorCheck, char value) { + NodeStack* temp = calloc(1, sizeof(NodeStack)); + if (temp == NULL) { + *errorCheck = memoryError; + return; + } + temp->value = value; + temp->next = stack->head; + + stack->head = temp; + return; +} + +void deleteElementInStack(Stack* stack, Error* errorCheck) { + if (stack == NULL || stack->head == NULL) { + *errorCheck = anotherError; + return; + } + int value = stack->head->value; + NodeStack* temp = stack->head->next; + free(stack->head); + stack->head = temp; + return value; +} + +Stack* clearStack(Stack* stack, Error* errorCheck) { + if (stack == NULL) { + return; + } + while (!isEmpty(stack)) { + deleteElementInStack(stack, errorCheck); + if (*errorCheck != ok) { + return stack; + } + } + free(stack); + return NULL; +} + +bool isEmpty(Stack* stack) { + return stack == NULL ? true : stack->head == NULL; +} \ No newline at end of file diff --git a/firstTaskV1/firstTaskV1/stack.h b/firstTaskV1/firstTaskV1/stack.h new file mode 100644 index 0000000..93beab8 --- /dev/null +++ b/firstTaskV1/firstTaskV1/stack.h @@ -0,0 +1,23 @@ +#pragma once +#include + +typedef struct Stack Stack; + +typedef enum Error { + memoryError, + emptyPointer, + anotherError, + ok, +}Error; + +Stack* createStack(Error* errorCheck); + +int createNumberFromStack(Stack* stack, Error* errorCheck); + +void addElementsFromStringToStack(Stack* stack, Error* errorCheck, char value); + +void deleteElementInStack(Stack* stack, Error* errorCheck); + +Stack* clearStack(Stack* stack, Error* errorCheck); + +bool isEmpty(Stack* stack); \ No newline at end of file diff --git a/firstTaskV1/firstTaskV1/test.txt b/firstTaskV1/firstTaskV1/test.txt new file mode 100644 index 0000000..1ea87ef --- /dev/null +++ b/firstTaskV1/firstTaskV1/test.txt @@ -0,0 +1 @@ +1101 \ No newline at end of file