From 00157f0653963ad56058b9a081917caa73d7914b Mon Sep 17 00:00:00 2001 From: kamendov-maxim Date: Mon, 11 Dec 2023 20:50:20 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=9F=D0=BE=D0=B8=D1=81=D0=BA=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- semester_1/Homework11/file.txt | 1 + semester_1/Homework11/include/String.h | 8 ++ semester_1/Homework11/include/readFile.h | 3 + semester_1/Homework11/include/subString.h | 9 +++ semester_1/Homework11/include/test.h | 4 + semester_1/Homework11/src/String.c | 48 +++++++++++ semester_1/Homework11/src/main.c | 54 +++++++++++++ semester_1/Homework11/src/readFile.c | 25 ++++++ semester_1/Homework11/src/subString.c | 90 +++++++++++++++++++++ semester_1/Homework11/src/test.c | 66 +++++++++++++++ semester_1/Homework11/testFiles/answer1.txt | 1 + semester_1/Homework11/testFiles/answer2.txt | 1 + semester_1/Homework11/testFiles/answer3.txt | 1 + semester_1/Homework11/testFiles/test1.txt | 2 + semester_1/Homework11/testFiles/test2.txt | 2 + semester_1/Homework11/testFiles/test3.txt | 2 + 16 files changed, 317 insertions(+) create mode 100644 semester_1/Homework11/file.txt create mode 100644 semester_1/Homework11/include/String.h create mode 100644 semester_1/Homework11/include/readFile.h create mode 100644 semester_1/Homework11/include/subString.h create mode 100644 semester_1/Homework11/include/test.h create mode 100644 semester_1/Homework11/src/String.c create mode 100644 semester_1/Homework11/src/main.c create mode 100644 semester_1/Homework11/src/readFile.c create mode 100644 semester_1/Homework11/src/subString.c create mode 100644 semester_1/Homework11/src/test.c create mode 100644 semester_1/Homework11/testFiles/answer1.txt create mode 100644 semester_1/Homework11/testFiles/answer2.txt create mode 100644 semester_1/Homework11/testFiles/answer3.txt create mode 100644 semester_1/Homework11/testFiles/test1.txt create mode 100644 semester_1/Homework11/testFiles/test2.txt create mode 100644 semester_1/Homework11/testFiles/test3.txt diff --git a/semester_1/Homework11/file.txt b/semester_1/Homework11/file.txt new file mode 100644 index 0000000..911fc56 --- /dev/null +++ b/semester_1/Homework11/file.txt @@ -0,0 +1 @@ +jfgdas;vksgcdlfvahb`e/rbasjgffbddfcv,b gb rbaef lyjfvdfl;g`bdvfjlg`vdljc`gxdfkzgsxvfgdzsxzkcdhfrjgahkshxvcbx,d,zevgafukyrgfjzbc \ No newline at end of file diff --git a/semester_1/Homework11/include/String.h b/semester_1/Homework11/include/String.h new file mode 100644 index 0000000..089f344 --- /dev/null +++ b/semester_1/Homework11/include/String.h @@ -0,0 +1,8 @@ +#pragma once + +#include +#include +#include + +char *getString(size_t * const len, FILE * file, char const endOfLine); +char *copyString(char const * const string); diff --git a/semester_1/Homework11/include/readFile.h b/semester_1/Homework11/include/readFile.h new file mode 100644 index 0000000..e01a1fc --- /dev/null +++ b/semester_1/Homework11/include/readFile.h @@ -0,0 +1,3 @@ +#pragma once + +char *readFile(const char *const fileName); diff --git a/semester_1/Homework11/include/subString.h b/semester_1/Homework11/include/subString.h new file mode 100644 index 0000000..7793b06 --- /dev/null +++ b/semester_1/Homework11/include/subString.h @@ -0,0 +1,9 @@ +#pragma once + +typedef enum ErrorCode +{ + ok, + memoryError +} ErrorCode; + +size_t findSubstring(char const *const pattern, char const *const text, ErrorCode *const errorCode); diff --git a/semester_1/Homework11/include/test.h b/semester_1/Homework11/include/test.h new file mode 100644 index 0000000..7c37092 --- /dev/null +++ b/semester_1/Homework11/include/test.h @@ -0,0 +1,4 @@ +#pragma once +#include + +const bool test(void); diff --git a/semester_1/Homework11/src/String.c b/semester_1/Homework11/src/String.c new file mode 100644 index 0000000..f83a0d4 --- /dev/null +++ b/semester_1/Homework11/src/String.c @@ -0,0 +1,48 @@ +#include +#include +#include + +#include "../include/String.h" + +char *getString(size_t * const len, FILE * file, char const endOfLine) +{ + *len = 0; + size_t capacity = 1; + char *s = (char *)malloc(sizeof(char)); + if (s == NULL) + { + return NULL; + } + + for (char c = fgetc(file); c != endOfLine && c != EOF; c = fgetc(file)) + { + s[(*len)++] = c; + + if (*len >= capacity) + { + capacity *= 2; + char *tmp = (char *)realloc(s, capacity * sizeof(char)); + if (tmp == NULL) + { + free(s); + return NULL; + } + s = tmp; + } + } + + s[*len] = '\0'; + + return s; +} + +char *copyString(char const * const string) +{ + const size_t len = strlen(string); + char *copy = (char *)malloc(len * sizeof(char)); + if (copy != NULL) + { + strcpy(copy, string); + } + return copy; +} diff --git a/semester_1/Homework11/src/main.c b/semester_1/Homework11/src/main.c new file mode 100644 index 0000000..a8b6b69 --- /dev/null +++ b/semester_1/Homework11/src/main.c @@ -0,0 +1,54 @@ +#include +#include + +#include "../include/subString.h" +#include "../include/String.h" +#include "../include/readFile.h" +#include "../include/test.h" + +#define PROGRAM_FINISHED_CORRECTLY 0 +#define PROGRAM_FAILED_TESTS 1 +#define MEMORY_ERROR 2 +#define FILE_ERROR 3 + +#define FILE_NAME "../file.txt" + +int main(void) +{ + setlocale(LC_ALL, "utf-8"); + + if (!test()) + { + printf("Программа сейчас не работает\n"); + return PROGRAM_FAILED_TESTS; + } + + + size_t len = 0; + printf("Введите подстроку: "); + char *pattern = getString(&len, stdin, '\n'); + if (pattern == NULL) + { + return MEMORY_ERROR; + } + char *text = readFile(FILE_NAME); + + ErrorCode errorCode = ok; + size_t answer = findSubstring(pattern, text, &errorCode); + if (errorCode != ok) + { + printf("Программа не может получить доступ к памяти\n"); + return MEMORY_ERROR; + } + + if (answer == -1) + { + printf("Подстрока %s не встречается в тексте ни разу\n", pattern); + return PROGRAM_FINISHED_CORRECTLY; + } + + + printf("Первое вхождение подстроки %s в тексте начинается на %lu символе\n", pattern, answer); + + return PROGRAM_FINISHED_CORRECTLY; +} diff --git a/semester_1/Homework11/src/readFile.c b/semester_1/Homework11/src/readFile.c new file mode 100644 index 0000000..3273ae9 --- /dev/null +++ b/semester_1/Homework11/src/readFile.c @@ -0,0 +1,25 @@ +#include +#include + +#include "../include/String.h" + +#define MEMORY_ERROR 2 +#define FILE_ERROR 3 + +char *readFile(const char *const fileName) +{ + FILE *file = fopen(fileName, "r"); + if (file == NULL) + { + exit(FILE_ERROR); + } + size_t len = 0; + char *str = getString(&len, file, EOF); + fclose(file); + if (str == NULL) + { + exit(MEMORY_ERROR); + } + + return str; +} \ No newline at end of file diff --git a/semester_1/Homework11/src/subString.c b/semester_1/Homework11/src/subString.c new file mode 100644 index 0000000..e67988e --- /dev/null +++ b/semester_1/Homework11/src/subString.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include + +#include "../include/subString.h" + +#define MEMORY_ERROR 2 + +static size_t *createLPSArray(char const *const pattern, const size_t pLength) +{ + size_t len = 0; + size_t *lps = (size_t *)malloc(pLength * sizeof(size_t)); + + lps[0] = 0; + size_t i = 1; + + while (i < pLength) + { + if (pattern[i] == pattern[len]) + { + ++len; + lps[i] = len; + ++i; + } + else + { + if (len != 0) + { + len = lps[len - 1]; + } + else + { + lps[i] = 0; + ++i; + } + } + } + + return lps; +} + +size_t findSubstring(char const *const pattern, char const *const text, ErrorCode *const errorCode) +{ + size_t pLength = strlen(pattern); + size_t tLength = strlen(text); + + if (pLength == 0) + { + return 0; + } + + if (pLength > tLength) + { + return -1; + } + + size_t *lps = createLPSArray(pattern, pLength); + if (lps == NULL) + { + *errorCode = memoryError; + } + *errorCode = ok; + size_t j = 0; + size_t i = 0; + while (i < tLength) + { + if (pattern[j] == text[i]) + { + ++j; + ++i; + } + + if (j == pLength) + { + free(lps); + return i - j + 1; + } + + else if (i < tLength && pattern[j] != text[i]) + { + if (j != 0) + j = lps[j - 1]; + else + i = i + 1; + } + } + free(lps); + return -1; +} diff --git a/semester_1/Homework11/src/test.c b/semester_1/Homework11/src/test.c new file mode 100644 index 0000000..cc9398c --- /dev/null +++ b/semester_1/Homework11/src/test.c @@ -0,0 +1,66 @@ +#include +#include + +#include "../include/test.h" +#include "../include/String.h" +#include "../include/subString.h" + +static const bool testCase(const char *const testFileName, const char *const answerFileName) +{ + FILE *testFile = fopen(testFileName, "r"); + if (testFile == NULL) + { + return false; + } + + size_t len = 0; + char *pattern = getString(&len, testFile, '\n'); + if (pattern == NULL) + { + fclose(testFile); + return false; + } + + char *text = getString(&len, testFile, EOF); + if (text == NULL) + { + free(pattern); + fclose(testFile); + return false; + } + fclose(testFile); + ErrorCode errorCode = ok; + size_t position = findSubstring(pattern, text, &errorCode); + free(pattern); + free(text); + if (errorCode != ok) + { + return false; + } + + FILE *answerFile = fopen(answerFileName, "r"); + size_t answer = 0; + int scanfCheck = fscanf(answerFile, "%lu", &answer); + fclose(answerFile); + return scanfCheck == 1 && position == answer; +} + +const bool test(void) +{ + const size_t testNumber = 3; + const char *const testFileNames[testNumber] = {"../testFiles/test1.txt", + "../testFiles/test2.txt", + "../testFiles/test3.txt"}; + const char *const answerFileNames[testNumber] = {"../testFiles/answer1.txt", + "../testFiles/answer2.txt", + "../testFiles/answer3.txt"}; + for (size_t i = 0; i < testNumber; ++i) + { + if (!testCase(testFileNames[i], answerFileNames[i])) + { + return false; + } + } + + return true; +} diff --git a/semester_1/Homework11/testFiles/answer1.txt b/semester_1/Homework11/testFiles/answer1.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/semester_1/Homework11/testFiles/answer1.txt @@ -0,0 +1 @@ +1 diff --git a/semester_1/Homework11/testFiles/answer2.txt b/semester_1/Homework11/testFiles/answer2.txt new file mode 100644 index 0000000..3c03207 --- /dev/null +++ b/semester_1/Homework11/testFiles/answer2.txt @@ -0,0 +1 @@ +18 diff --git a/semester_1/Homework11/testFiles/answer3.txt b/semester_1/Homework11/testFiles/answer3.txt new file mode 100644 index 0000000..573541a --- /dev/null +++ b/semester_1/Homework11/testFiles/answer3.txt @@ -0,0 +1 @@ +0 diff --git a/semester_1/Homework11/testFiles/test1.txt b/semester_1/Homework11/testFiles/test1.txt new file mode 100644 index 0000000..6d3319d --- /dev/null +++ b/semester_1/Homework11/testFiles/test1.txt @@ -0,0 +1,2 @@ +a +aaa \ No newline at end of file diff --git a/semester_1/Homework11/testFiles/test2.txt b/semester_1/Homework11/testFiles/test2.txt new file mode 100644 index 0000000..0a65863 --- /dev/null +++ b/semester_1/Homework11/testFiles/test2.txt @@ -0,0 +1,2 @@ +dhgfaqasd +sbblkbv;bdfgbsdfkdhgfaqasdfsds \ No newline at end of file diff --git a/semester_1/Homework11/testFiles/test3.txt b/semester_1/Homework11/testFiles/test3.txt new file mode 100644 index 0000000..fb19e1a --- /dev/null +++ b/semester_1/Homework11/testFiles/test3.txt @@ -0,0 +1,2 @@ + +gfjbsdvdg \ No newline at end of file From 8655d59ea6bc5c53c16e4c0d22f94fdb90288b0c Mon Sep 17 00:00:00 2001 From: kamendov-maxim Date: Tue, 12 Dec 2023 10:44:54 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- semester_1/Homework11/include/subString.h | 2 +- semester_1/Homework11/src/main.c | 20 ++++++++---- semester_1/Homework11/src/readFile.c | 10 ++---- semester_1/Homework11/src/subString.c | 39 ++++++++++++----------- semester_1/Homework11/src/test.c | 14 +++++--- 5 files changed, 47 insertions(+), 38 deletions(-) diff --git a/semester_1/Homework11/include/subString.h b/semester_1/Homework11/include/subString.h index 7793b06..0e3a796 100644 --- a/semester_1/Homework11/include/subString.h +++ b/semester_1/Homework11/include/subString.h @@ -6,4 +6,4 @@ typedef enum ErrorCode memoryError } ErrorCode; -size_t findSubstring(char const *const pattern, char const *const text, ErrorCode *const errorCode); +long findSubstring(char const *const pattern, char const *const text, ErrorCode *const errorCode); diff --git a/semester_1/Homework11/src/main.c b/semester_1/Homework11/src/main.c index a8b6b69..499d69a 100644 --- a/semester_1/Homework11/src/main.c +++ b/semester_1/Homework11/src/main.c @@ -1,5 +1,6 @@ #include #include +#include #include "../include/subString.h" #include "../include/String.h" @@ -22,7 +23,6 @@ int main(void) printf("Программа сейчас не работает\n"); return PROGRAM_FAILED_TESTS; } - size_t len = 0; printf("Введите подстроку: "); @@ -32,23 +32,31 @@ int main(void) return MEMORY_ERROR; } char *text = readFile(FILE_NAME); + if (text == NULL) + { + free(pattern); + return MEMORY_ERROR; + } ErrorCode errorCode = ok; - size_t answer = findSubstring(pattern, text, &errorCode); + long answer = findSubstring(pattern, text, &errorCode); + free(text); + if (errorCode != ok) { + free(pattern); printf("Программа не может получить доступ к памяти\n"); return MEMORY_ERROR; } - + if (answer == -1) { printf("Подстрока %s не встречается в тексте ни разу\n", pattern); + free(pattern); return PROGRAM_FINISHED_CORRECTLY; } - - - printf("Первое вхождение подстроки %s в тексте начинается на %lu символе\n", pattern, answer); + printf("Первое вхождение подстроки %s в тексте начинается на %ld символе\n", pattern, answer); + free(pattern); return PROGRAM_FINISHED_CORRECTLY; } diff --git a/semester_1/Homework11/src/readFile.c b/semester_1/Homework11/src/readFile.c index 3273ae9..e4a0b9f 100644 --- a/semester_1/Homework11/src/readFile.c +++ b/semester_1/Homework11/src/readFile.c @@ -11,15 +11,11 @@ char *readFile(const char *const fileName) FILE *file = fopen(fileName, "r"); if (file == NULL) { - exit(FILE_ERROR); + return NULL; } - size_t len = 0; + long len = 0; char *str = getString(&len, file, EOF); fclose(file); - if (str == NULL) - { - exit(MEMORY_ERROR); - } return str; -} \ No newline at end of file +} diff --git a/semester_1/Homework11/src/subString.c b/semester_1/Homework11/src/subString.c index e67988e..5159e4f 100644 --- a/semester_1/Homework11/src/subString.c +++ b/semester_1/Homework11/src/subString.c @@ -7,13 +7,17 @@ #define MEMORY_ERROR 2 -static size_t *createLPSArray(char const *const pattern, const size_t pLength) +static long *createLPSArray(char const *const pattern, const long pLength) { - size_t len = 0; - size_t *lps = (size_t *)malloc(pLength * sizeof(size_t)); + long len = 0; + long *lps = (long *)malloc(pLength * sizeof(long)); + if (lps == NULL) + { + return NULL; + } lps[0] = 0; - size_t i = 1; + long i = 1; while (i < pLength) { @@ -23,27 +27,24 @@ static size_t *createLPSArray(char const *const pattern, const size_t pLength) lps[i] = len; ++i; } + else if (len != 0) + { + len = lps[len - 1]; + } else { - if (len != 0) - { - len = lps[len - 1]; - } - else - { - lps[i] = 0; - ++i; - } + lps[i] = 0; + ++i; } } return lps; } -size_t findSubstring(char const *const pattern, char const *const text, ErrorCode *const errorCode) +long findSubstring(char const *const pattern, char const *const text, ErrorCode *const errorCode) { - size_t pLength = strlen(pattern); - size_t tLength = strlen(text); + long pLength = strlen(pattern); + long tLength = strlen(text); if (pLength == 0) { @@ -55,14 +56,14 @@ size_t findSubstring(char const *const pattern, char const *const text, ErrorCod return -1; } - size_t *lps = createLPSArray(pattern, pLength); + long *lps = createLPSArray(pattern, pLength); if (lps == NULL) { *errorCode = memoryError; } *errorCode = ok; - size_t j = 0; - size_t i = 0; + long j = 0; + long i = 0; while (i < tLength) { if (pattern[j] == text[i]) diff --git a/semester_1/Homework11/src/test.c b/semester_1/Homework11/src/test.c index cc9398c..5d66c69 100644 --- a/semester_1/Homework11/src/test.c +++ b/semester_1/Homework11/src/test.c @@ -22,15 +22,14 @@ static const bool testCase(const char *const testFileName, const char *const ans } char *text = getString(&len, testFile, EOF); + fclose(testFile); if (text == NULL) { free(pattern); - fclose(testFile); return false; } - fclose(testFile); ErrorCode errorCode = ok; - size_t position = findSubstring(pattern, text, &errorCode); + long position = findSubstring(pattern, text, &errorCode); free(pattern); free(text); if (errorCode != ok) @@ -39,8 +38,13 @@ static const bool testCase(const char *const testFileName, const char *const ans } FILE *answerFile = fopen(answerFileName, "r"); - size_t answer = 0; - int scanfCheck = fscanf(answerFile, "%lu", &answer); + if (answerFile == NULL) + { + return false; + } + + long answer = 0; + int scanfCheck = fscanf(answerFile, "%ld", &answer); fclose(answerFile); return scanfCheck == 1 && position == answer; }