diff --git a/2025.02.14/1Ex/Linux/Makefile b/2025.02.14/1Ex/Linux/Makefile new file mode 100644 index 0000000..9393cd7 --- /dev/null +++ b/2025.02.14/1Ex/Linux/Makefile @@ -0,0 +1,8 @@ +all: main.o array.o + gcc main.o array.o -o a01.out && rm *.o + +main.o: main.c + gcc -c main.c + +array.o: array.c + gcc -c array.c diff --git a/2025.02.14/1Ex/Linux/array.c b/2025.02.14/1Ex/Linux/array.c new file mode 100644 index 0000000..da14f78 --- /dev/null +++ b/2025.02.14/1Ex/Linux/array.c @@ -0,0 +1,71 @@ +#include "array.h" + + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s) { + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) { + if (s[i] == '\\') { + if (i + 1 == len_s) return ERROR_PATTERN; + else { + s1[j] = 0; + s2[j++] = s[++i]; + } + } else if ((s[i] == '^') && (i == 0)) { + s1[j] = '1'; + s2[j++] = s[++i]; + } else { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, int * r) { + FILE * fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE * fw = fopen(f_out, "w"); + int i; + + if (!fw) {fclose(fp); return ERROR_OPEN;} + for (i = 0; fgets(buf, sizeof(buf), fp);) { + size_t len_buf = strlen(buf); + bool is_approach = process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + } + + return SUCCESS; +} + +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf) { + if (len_buf < len_s) return false; + + if (s1[0] == '1') { + size_t i; + for (i = 0; i < len_s; ++i) { + if (buf[i] != s2[i]) return false; + } + } else { + char * s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + diff --git a/2025.02.14/1Ex/Linux/array.h b/2025.02.14/1Ex/Linux/array.h new file mode 100644 index 0000000..cb541d1 --- /dev/null +++ b/2025.02.14/1Ex/Linux/array.h @@ -0,0 +1,13 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, int * r); +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/1Ex/Linux/io_status.h b/2025.02.14/1Ex/Linux/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/1Ex/Linux/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/1Ex/Linux/main.c b/2025.02.14/1Ex/Linux/main.c new file mode 100644 index 0000000..ba51a51 --- /dev/null +++ b/2025.02.14/1Ex/Linux/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 1; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task1(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/1Ex/Makefile b/2025.02.14/1Ex/Makefile new file mode 100644 index 0000000..669b997 --- /dev/null +++ b/2025.02.14/1Ex/Makefile @@ -0,0 +1,38 @@ +CFLAGS = -mfpmath=sse \ + -fstack-protector-all \ + -W \ + -Wall \ + -Wextra \ + -Wunused \ + -Wcast-align \ + -Werror \ + -pedantic \ + -pedantic-errors \ + -Wfloat-equal \ + -Wpointer-arith \ + -Wformat-security \ + -Wmissing-format-attribute \ + -Wformat=1 \ + -Wwrite-strings \ + -Wcast-align \ + -Wno-long-long \ + -std=gnu99 \ + -Wstrict-prototypes \ + -Wmissing-prototypes \ + -Wmissing-declarations \ + -Wold-style-definition \ + -Wdeclaration-after-statement \ + -Wbad-function-cast \ + -Wnested-externs \ + -O3 \ + -D_DEBUG -g \ + -c + +all: main.o array.o + gcc main.o array.o -lssp && del *.o + +main.o: main.c + gcc $(CFLAGS) main.c + +array.o: array.c + gcc $(CFLAGS) array.c diff --git a/2025.02.14/1Ex/array.c b/2025.02.14/1Ex/array.c new file mode 100644 index 0000000..7159e2b --- /dev/null +++ b/2025.02.14/1Ex/array.c @@ -0,0 +1,74 @@ +#include "array.h" + + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s) { + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) { + if (s[i] == '\\') { + if (i + 1 == len_s) return ERROR_PATTERN; + else { + s1[j] = 0; + s2[j++] = s[++i]; + } + } else if ((s[i] == '^') && (i == 0)) { + s1[j] = '1'; + s2[j++] = s[++i]; + } else { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, int * r) { + FILE * fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE * fw = fopen(f_out, "w"); + int i; + + if (!fw) {fclose(fp); return ERROR_OPEN;} + for (i = 0; fgets(buf, sizeof(buf), fp);) { + size_t len_buf = strlen(buf); + bool is_approach = process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf) { + if (len_buf < len_s) return false; + + if (s1[0] == '1') { + size_t i; + for (i = 0; i < len_s; ++i) { + if (buf[i] != s2[i]) return false; + } + } else { + char * s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + diff --git a/2025.02.14/1Ex/array.h b/2025.02.14/1Ex/array.h new file mode 100644 index 0000000..cb541d1 --- /dev/null +++ b/2025.02.14/1Ex/array.h @@ -0,0 +1,13 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, int * r); +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/1Ex/io_status.h b/2025.02.14/1Ex/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/1Ex/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/1Ex/main.c b/2025.02.14/1Ex/main.c new file mode 100644 index 0000000..ba51a51 --- /dev/null +++ b/2025.02.14/1Ex/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 1; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task1(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/1Ex/o.txt b/2025.02.14/1Ex/o.txt new file mode 100644 index 0000000..38cc797 --- /dev/null +++ b/2025.02.14/1Ex/o.txt @@ -0,0 +1,14 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +.abs +abs +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss diff --git a/2025.02.14/1Ex/out.txt b/2025.02.14/1Ex/out.txt new file mode 100644 index 0000000..721387c --- /dev/null +++ b/2025.02.14/1Ex/out.txt @@ -0,0 +1 @@ +a^bs haha diff --git a/2025.02.14/1Ex/t.txt b/2025.02.14/1Ex/t.txt new file mode 100644 index 0000000..a2c71b8 --- /dev/null +++ b/2025.02.14/1Ex/t.txt @@ -0,0 +1,23 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +pbs +ubs +.abs +abs +pbt +ats +.b. +bs +bsaha +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss + + diff --git a/2025.02.14/1Ex/Примеры b/2025.02.14/1Ex/Примеры new file mode 100644 index 0000000..d2ed666 --- /dev/null +++ b/2025.02.14/1Ex/Примеры @@ -0,0 +1,13 @@ +Проверка на s: +- в конце есть \ +abs\ + +- в конце есть \\ +abs\\ + +- в начале есть ^ +^abs + +- в начале есть \^ + +- Есть \ и ^ diff --git a/2025.02.14/2Ex/Linux/Makefile b/2025.02.14/2Ex/Linux/Makefile new file mode 100644 index 0000000..882c677 --- /dev/null +++ b/2025.02.14/2Ex/Linux/Makefile @@ -0,0 +1,8 @@ +all: main.o array.o + gcc main.o array.o -o a02.out && rm *.o + +main.o: main.c + gcc -c main.c + +array.o: array.c + gcc -c array.c diff --git a/2025.02.14/2Ex/Linux/array.c b/2025.02.14/2Ex/Linux/array.c new file mode 100644 index 0000000..175cb8f --- /dev/null +++ b/2025.02.14/2Ex/Linux/array.c @@ -0,0 +1,75 @@ +#include "array.h" + + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s) { + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) { + if (s[i] == '\\') { + if (i + 1 == len_s) return ERROR_PATTERN; + else { + s1[j] = 0; + s2[j++] = s[++i]; + } + } else if ((s[i] == '$') && (i + 1 == len_s)) { + if (j != 0) + { + s1[j-1] = '1'; + } + } else { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, int * r) { + FILE * fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE * fw = fopen(f_out, "w"); + int i; + + if (!fw) {fclose(fp); return ERROR_OPEN;} + for (i = 0; fgets(buf, sizeof(buf), fp);) { + size_t len_buf = strlen(buf); + bool is_approach; + if (buf[len_buf-1] == '\n') buf[--len_buf] = '\0'; + is_approach = process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + } + + return SUCCESS; +} + +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf) { + if (len_buf < len_s) return false; + + if (s1[len_s - 1] == '1') { + size_t i; + for (i = len_buf-1; i > len_buf-len_s-1; --i) { + if (buf[i] != s2[i-(len_buf-len_s)]) return false; + } + } else { + char * s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + diff --git a/2025.02.14/2Ex/Linux/array.h b/2025.02.14/2Ex/Linux/array.h new file mode 100644 index 0000000..cb541d1 --- /dev/null +++ b/2025.02.14/2Ex/Linux/array.h @@ -0,0 +1,13 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, int * r); +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/2Ex/Linux/io_status.h b/2025.02.14/2Ex/Linux/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/2Ex/Linux/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/2Ex/Linux/main.c b/2025.02.14/2Ex/Linux/main.c new file mode 100644 index 0000000..ba51a51 --- /dev/null +++ b/2025.02.14/2Ex/Linux/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 1; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task1(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/2Ex/Makefile b/2025.02.14/2Ex/Makefile new file mode 100644 index 0000000..669b997 --- /dev/null +++ b/2025.02.14/2Ex/Makefile @@ -0,0 +1,38 @@ +CFLAGS = -mfpmath=sse \ + -fstack-protector-all \ + -W \ + -Wall \ + -Wextra \ + -Wunused \ + -Wcast-align \ + -Werror \ + -pedantic \ + -pedantic-errors \ + -Wfloat-equal \ + -Wpointer-arith \ + -Wformat-security \ + -Wmissing-format-attribute \ + -Wformat=1 \ + -Wwrite-strings \ + -Wcast-align \ + -Wno-long-long \ + -std=gnu99 \ + -Wstrict-prototypes \ + -Wmissing-prototypes \ + -Wmissing-declarations \ + -Wold-style-definition \ + -Wdeclaration-after-statement \ + -Wbad-function-cast \ + -Wnested-externs \ + -O3 \ + -D_DEBUG -g \ + -c + +all: main.o array.o + gcc main.o array.o -lssp && del *.o + +main.o: main.c + gcc $(CFLAGS) main.c + +array.o: array.c + gcc $(CFLAGS) array.c diff --git a/2025.02.14/2Ex/array.c b/2025.02.14/2Ex/array.c new file mode 100644 index 0000000..3171842 --- /dev/null +++ b/2025.02.14/2Ex/array.c @@ -0,0 +1,78 @@ +#include "array.h" + + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s) { + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) { + if (s[i] == '\\') { + if (i + 1 == len_s) return ERROR_PATTERN; + else { + s1[j] = 0; + s2[j++] = s[++i]; + } + } else if ((s[i] == '$') && (i + 1 == len_s)) { + if (j != 0) + { + s1[j-1] = '1'; + } + } else { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, int * r) { + FILE * fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE * fw = fopen(f_out, "w"); + int i; + + if (!fw) {fclose(fp); return ERROR_OPEN;} + for (i = 0; fgets(buf, sizeof(buf), fp);) { + size_t len_buf = strlen(buf); + bool is_approach; + if (buf[len_buf-1] == '\n') buf[--len_buf] = '\0'; + is_approach = process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf) { + if (len_buf < len_s) return false; + + if (s1[len_s - 1] == '1') { + size_t i; + for (i = len_buf-1; i > len_buf-len_s-1; --i) { + if (buf[i] != s2[i-(len_buf-len_s)]) return false; + } + } else { + char * s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + diff --git a/2025.02.14/2Ex/array.h b/2025.02.14/2Ex/array.h new file mode 100644 index 0000000..cb541d1 --- /dev/null +++ b/2025.02.14/2Ex/array.h @@ -0,0 +1,13 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, int * r); +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/2Ex/io_status.h b/2025.02.14/2Ex/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/2Ex/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/2Ex/main.c b/2025.02.14/2Ex/main.c new file mode 100644 index 0000000..8ab4024 --- /dev/null +++ b/2025.02.14/2Ex/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task2(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task2(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 2; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task2(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/2Ex/o.txt b/2025.02.14/2Ex/o.txt new file mode 100644 index 0000000..38cc797 --- /dev/null +++ b/2025.02.14/2Ex/o.txt @@ -0,0 +1,14 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +.abs +abs +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss diff --git a/2025.02.14/2Ex/t.txt b/2025.02.14/2Ex/t.txt new file mode 100644 index 0000000..a2c71b8 --- /dev/null +++ b/2025.02.14/2Ex/t.txt @@ -0,0 +1,23 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +pbs +ubs +.abs +abs +pbt +ats +.b. +bs +bsaha +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss + + diff --git a/2025.02.14/2Ex/Примеры b/2025.02.14/2Ex/Примеры new file mode 100644 index 0000000..456bbc4 --- /dev/null +++ b/2025.02.14/2Ex/Примеры @@ -0,0 +1,21 @@ +Проверка на s: +- в конце есть \ +abs\ + +- в конце есть \\ +abs\\ + +- в конце есть $ +abs$ + +- в конце есть \$ +abs\$ + +- Есть \ и $ +\\abs\s\$\hello + +- в строке один $ +$ + +- дефолт +abs diff --git a/2025.02.14/3Ex/Linux/Makefile b/2025.02.14/3Ex/Linux/Makefile new file mode 100644 index 0000000..9cf7460 --- /dev/null +++ b/2025.02.14/3Ex/Linux/Makefile @@ -0,0 +1,8 @@ +all: main.o array.o + gcc main.o array.o -o "a03.out" && rm *.o + +main.o: main.c + gcc -c main.c + +array.o: array.c + gcc -c array.c diff --git a/2025.02.14/3Ex/Linux/array.c b/2025.02.14/3Ex/Linux/array.c new file mode 100644 index 0000000..c0e9613 --- /dev/null +++ b/2025.02.14/3Ex/Linux/array.c @@ -0,0 +1,125 @@ +#include "array.h" + + +io_status process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else if ((i == 0) && (s[i + 1] == '<')) + { + s1[j] = '1'; + s2[j++] = s[i += 2]; + } + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach = process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + } + + return SUCCESS; +} + +bool process_string(const char* buf, const char* s1, const char* s2, const char* t, const size_t len_s, + const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[0] == '1') + { + size_t i, last_space = -1, per_sim = 0; // Percent of similarity + for (i = 0; i < len_buf; ++i) + { + if (is_space(buf[i], t)) + { + last_space = i; + per_sim = 0; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space + 1) || (per_sim)) + { + if (++per_sim == len_s) + { + return true; + } + } + } + else + { + per_sim = 0; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +bool is_space(char symbol, const char* t) +{ + int i; + for (i = 0; t[i] != '\0'; ++i) + { + if (t[i] == symbol) return true; + } + + return false; +} diff --git a/2025.02.14/3Ex/Linux/array.h b/2025.02.14/3Ex/Linux/array.h new file mode 100644 index 0000000..83a6939 --- /dev/null +++ b/2025.02.14/3Ex/Linux/array.h @@ -0,0 +1,14 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, const char * t, int * r); +bool process_string(const char * buf, const char * s1, const char * s2, const char * t, const size_t len_s, const size_t len_buf); +bool is_space(char symbol, const char * t); + +#endif diff --git a/2025.02.14/3Ex/Linux/io_status.h b/2025.02.14/3Ex/Linux/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/3Ex/Linux/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/3Ex/Linux/main.c b/2025.02.14/3Ex/Linux/main.c new file mode 100644 index 0000000..5c001c2 --- /dev/null +++ b/2025.02.14/3Ex/Linux/main.c @@ -0,0 +1,69 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t, int* res); + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, t, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 3; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + const char* spaces = 0; + int res = 0; + double t; + if (argc != 5) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + spaces = argv[4]; + t = clock(); + ret = task3(f_in, f_out, s, spaces, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/3Ex/Linux/o.txt b/2025.02.14/3Ex/Linux/o.txt new file mode 100644 index 0000000..93d631d --- /dev/null +++ b/2025.02.14/3Ex/Linux/o.txt @@ -0,0 +1,2 @@ +sasobsomcsome +hsome diff --git a/2025.02.14/3Ex/Linux/t.txt b/2025.02.14/3Ex/Linux/t.txt new file mode 100644 index 0000000..7eeb5e8 --- /dev/null +++ b/2025.02.14/3Ex/Linux/t.txt @@ -0,0 +1,2 @@ +sasobsomcsome +hsome \ No newline at end of file diff --git a/2025.02.14/3Ex/Makefile b/2025.02.14/3Ex/Makefile new file mode 100644 index 0000000..669b997 --- /dev/null +++ b/2025.02.14/3Ex/Makefile @@ -0,0 +1,38 @@ +CFLAGS = -mfpmath=sse \ + -fstack-protector-all \ + -W \ + -Wall \ + -Wextra \ + -Wunused \ + -Wcast-align \ + -Werror \ + -pedantic \ + -pedantic-errors \ + -Wfloat-equal \ + -Wpointer-arith \ + -Wformat-security \ + -Wmissing-format-attribute \ + -Wformat=1 \ + -Wwrite-strings \ + -Wcast-align \ + -Wno-long-long \ + -std=gnu99 \ + -Wstrict-prototypes \ + -Wmissing-prototypes \ + -Wmissing-declarations \ + -Wold-style-definition \ + -Wdeclaration-after-statement \ + -Wbad-function-cast \ + -Wnested-externs \ + -O3 \ + -D_DEBUG -g \ + -c + +all: main.o array.o + gcc main.o array.o -lssp && del *.o + +main.o: main.c + gcc $(CFLAGS) main.c + +array.o: array.c + gcc $(CFLAGS) array.c diff --git a/2025.02.14/3Ex/array.c b/2025.02.14/3Ex/array.c new file mode 100644 index 0000000..2a15eff --- /dev/null +++ b/2025.02.14/3Ex/array.c @@ -0,0 +1,128 @@ +#include "array.h" + + +io_status process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else if ((i == 0) && (s[i + 1] == '<')) + { + s1[j] = '1'; + i++; + } + else + { + if (s1[j] != '1') s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + if (s1[j] != '1') s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach = process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + if ((len_buf > 0) && (buf[len_buf - 1] == '\n')) buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool process_string(const char* buf, const char* s1, const char* s2, const char* t, const size_t len_s, + const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[0] == '1') + { + int last_space = -1, i; + size_t per_sim = 0; // Percent of similarity + for (i = 0; i < (int)len_buf; ++i) + { + if (is_space(buf[i], t)) + { + last_space = i; + per_sim = 0; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space + 1) || (per_sim)) + { + if (++per_sim == len_s) + { + return true; + } + } + } + else + { + per_sim = 0; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +bool is_space(char symbol, const char* t) +{ + int i; + for (i = 0; t[i] != '\0'; ++i) + { + if (t[i] == symbol) return true; + } + + return false; +} diff --git a/2025.02.14/3Ex/array.h b/2025.02.14/3Ex/array.h new file mode 100644 index 0000000..83a6939 --- /dev/null +++ b/2025.02.14/3Ex/array.h @@ -0,0 +1,14 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, const char * t, int * r); +bool process_string(const char * buf, const char * s1, const char * s2, const char * t, const size_t len_s, const size_t len_buf); +bool is_space(char symbol, const char * t); + +#endif diff --git a/2025.02.14/3Ex/io_status.h b/2025.02.14/3Ex/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/3Ex/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/3Ex/main.c b/2025.02.14/3Ex/main.c new file mode 100644 index 0000000..5c001c2 --- /dev/null +++ b/2025.02.14/3Ex/main.c @@ -0,0 +1,69 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t, int* res); + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, t, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 3; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + const char* spaces = 0; + int res = 0; + double t; + if (argc != 5) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + spaces = argv[4]; + t = clock(); + ret = task3(f_in, f_out, s, spaces, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/3Ex/o.txt b/2025.02.14/3Ex/o.txt new file mode 100644 index 0000000..22ea93c --- /dev/null +++ b/2025.02.14/3Ex/o.txt @@ -0,0 +1,4 @@ +somePalongPway +some +howPsomePitPbe +howPsomething diff --git a/2025.02.14/3Ex/t.txt b/2025.02.14/3Ex/t.txt new file mode 100644 index 0000000..6f50c61 --- /dev/null +++ b/2025.02.14/3Ex/t.txt @@ -0,0 +1,28 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +pbs +ubs +.abs +abs +pbt +ats +.b. +bs +bsaha +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss +abs* +somePalongPway +some +howPsomePitPbe +howPsomething +whyPanysome + diff --git a/2025.02.14/3Ex/Примеры b/2025.02.14/3Ex/Примеры new file mode 100644 index 0000000..42780d8 --- /dev/null +++ b/2025.02.14/3Ex/Примеры @@ -0,0 +1,12 @@ +Дефолт: Проверить что находит по паттерну: +{ + "pattern": "some", + "text": "some text" +} + +Проверка работы \<: +{ + "pattern": "\')) + { + if (j > 0) + { + s1[j++-1] = '1'; + } else + { + s1[j++] = '1'; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (buf[len_buf - 1] == '\n') buf[--len_buf] = '\0'; + is_approach = process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool process_string(const char* buf, const char* s1, const char* s2, const char* t, const size_t len_s, + const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[len_s - 1] == '1') + { + size_t i, last_space = len_buf, per_sim = len_s - 1; // Percent of similarity + for (i = len_buf - 1; i < i + 2; --i) // i < i + 2 - size_t всегда положительный -> закончится когда случится переход от -1 к -2, а они сильно больше 0 + { + if (is_space(buf[i], t)) + { + last_space = i; + per_sim = len_s - 1; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space - 1) || ((per_sim + 1) < len_s)) + { + if (per_sim-- == 0) + { + return true; + } + } + } + else + { + per_sim = len_s - 1; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +bool is_space(char symbol, const char* t) +{ + int i; + for (i = 0; t[i] != '\0'; ++i) + { + if (t[i] == symbol) return true; + } + + return false; +} diff --git a/2025.02.14/4Ex/array.h b/2025.02.14/4Ex/array.h new file mode 100644 index 0000000..83a6939 --- /dev/null +++ b/2025.02.14/4Ex/array.h @@ -0,0 +1,14 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, const char * t, int * r); +bool process_string(const char * buf, const char * s1, const char * s2, const char * t, const size_t len_s, const size_t len_buf); +bool is_space(char symbol, const char * t); + +#endif diff --git a/2025.02.14/4Ex/io_status.h b/2025.02.14/4Ex/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/4Ex/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/4Ex/main.c b/2025.02.14/4Ex/main.c new file mode 100644 index 0000000..66decac --- /dev/null +++ b/2025.02.14/4Ex/main.c @@ -0,0 +1,69 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task4(const char* f_in, const char* f_out, const char* s, const char* t, int* res); + +io_status task4(const char* f_in, const char* f_out, const char* s, const char* t, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, t, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 4; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + const char* spaces = 0; + int res = 0; + double t; + if (argc != 5) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + spaces = argv[4]; + t = clock(); + ret = task4(f_in, f_out, s, spaces, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/4Ex/o.txt b/2025.02.14/4Ex/o.txt new file mode 100644 index 0000000..e69de29 diff --git a/2025.02.14/4Ex/t.txt b/2025.02.14/4Ex/t.txt new file mode 100644 index 0000000..a2c71b8 --- /dev/null +++ b/2025.02.14/4Ex/t.txt @@ -0,0 +1,23 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +pbs +ubs +.abs +abs +pbt +ats +.b. +bs +bsaha +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss + + diff --git a/2025.02.14/4Ex/Примеры b/2025.02.14/4Ex/Примеры new file mode 100644 index 0000000..b7e098b --- /dev/null +++ b/2025.02.14/4Ex/Примеры @@ -0,0 +1,12 @@ +Дефолт: Проверить что находит по паттерну: +{ + "pattern": "some", + "text": "some text" +} + +Проверка работы \>: +{ + "pattern": "some\>", + "spaces": "abc" + "text": "sasobsomcsome" +} \ No newline at end of file diff --git a/2025.02.14/6Ex/Makefile b/2025.02.14/6Ex/Makefile new file mode 100644 index 0000000..669b997 --- /dev/null +++ b/2025.02.14/6Ex/Makefile @@ -0,0 +1,38 @@ +CFLAGS = -mfpmath=sse \ + -fstack-protector-all \ + -W \ + -Wall \ + -Wextra \ + -Wunused \ + -Wcast-align \ + -Werror \ + -pedantic \ + -pedantic-errors \ + -Wfloat-equal \ + -Wpointer-arith \ + -Wformat-security \ + -Wmissing-format-attribute \ + -Wformat=1 \ + -Wwrite-strings \ + -Wcast-align \ + -Wno-long-long \ + -std=gnu99 \ + -Wstrict-prototypes \ + -Wmissing-prototypes \ + -Wmissing-declarations \ + -Wold-style-definition \ + -Wdeclaration-after-statement \ + -Wbad-function-cast \ + -Wnested-externs \ + -O3 \ + -D_DEBUG -g \ + -c + +all: main.o array.o + gcc main.o array.o -lssp && del *.o + +main.o: main.c + gcc $(CFLAGS) main.c + +array.o: array.c + gcc $(CFLAGS) array.c diff --git a/2025.02.14/6Ex/array.c b/2025.02.14/6Ex/array.c new file mode 100644 index 0000000..ae39ce1 --- /dev/null +++ b/2025.02.14/6Ex/array.c @@ -0,0 +1,95 @@ +#include "array.h" + + +io_status process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if (s[i] == '.') + { + s1[j] = '1'; + s2[j++] = '.'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (buf[len_buf - 1] == '\n') buf[--len_buf] = '\0'; + is_approach = process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, + const size_t len_buf) +{ + if (len_buf < len_s) return false; + if (s1[0] == '1' || buf[0] == s2[0]) + { + int j; + for (j = 1; j < (int)len_s; ++j) + { + if ((buf[j] != s2[j]) && (s1[j] == '0')) + { + break; + } + } + + if (j == (int)len_s && j == (int)len_buf) return true; + } + + return false; +} diff --git a/2025.02.14/6Ex/array.h b/2025.02.14/6Ex/array.h new file mode 100644 index 0000000..f4e19fe --- /dev/null +++ b/2025.02.14/6Ex/array.h @@ -0,0 +1,13 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r); +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/6Ex/io_status.h b/2025.02.14/6Ex/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/6Ex/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/6Ex/main.c b/2025.02.14/6Ex/main.c new file mode 100644 index 0000000..5a4bce3 --- /dev/null +++ b/2025.02.14/6Ex/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task6(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task6(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 6; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task6(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/6Ex/o.txt b/2025.02.14/6Ex/o.txt new file mode 100644 index 0000000..38cc797 --- /dev/null +++ b/2025.02.14/6Ex/o.txt @@ -0,0 +1,14 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +.abs +abs +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss diff --git a/2025.02.14/6Ex/t.txt b/2025.02.14/6Ex/t.txt new file mode 100644 index 0000000..a2c71b8 --- /dev/null +++ b/2025.02.14/6Ex/t.txt @@ -0,0 +1,23 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +pbs +ubs +.abs +abs +pbt +ats +.b. +bs +bsaha +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss + + diff --git a/2025.02.14/6Ex/Примеры.txt b/2025.02.14/6Ex/Примеры.txt new file mode 100644 index 0000000..a1bbee7 --- /dev/null +++ b/2025.02.14/6Ex/Примеры.txt @@ -0,0 +1,23 @@ +Дефолт: +{ + 's': 'some' + 'a': 'some\nhellosome\nsomeone' +} + +\ в конце: +{ + 's': 'some\\\' - ERROR + 'a': 'not important' +} + +замена \some на some: +{ + 's': '\.wh\at' + 'a': '.what' +} + +Проверка шаблона: +{ + 's': 's.m.' + 'a': 'some\nsone\nsumy\n.o.e\nsm' +} \ No newline at end of file diff --git a/2025.02.14/7Ex/Makefile b/2025.02.14/7Ex/Makefile new file mode 100644 index 0000000..75cb2c0 --- /dev/null +++ b/2025.02.14/7Ex/Makefile @@ -0,0 +1,13 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a07.exe: main.o solve.o + gcc main.o solve.o -o a07.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +clean: + del *.o *.exe \ No newline at end of file diff --git a/2025.02.14/7Ex/io_status.h b/2025.02.14/7Ex/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/7Ex/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/7Ex/main.c b/2025.02.14/7Ex/main.c new file mode 100644 index 0000000..4871e06 --- /dev/null +++ b/2025.02.14/7Ex/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task7(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task7(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = t7_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return t7_process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 7; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task7(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/7Ex/o.txt b/2025.02.14/7Ex/o.txt new file mode 100644 index 0000000..e69de29 diff --git a/2025.02.14/7Ex/solve.c b/2025.02.14/7Ex/solve.c new file mode 100644 index 0000000..4babb30 --- /dev/null +++ b/2025.02.14/7Ex/solve.c @@ -0,0 +1,96 @@ +#include "solve.h" + + +io_status t7_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '?') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t7_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') buf[--len_buf] = '\0'; + is_approach = t7_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t7_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + bool is_approach = false; + size_t char_s = sizeof(char); + if (len_s == 0) + { + if (len_buf == 0) return true; + return false; + } + + if (s1[0] == '1') + { + is_approach = t7_start(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf); + if (is_approach) return true; + } + if (len_buf != 0 && buf[0] == s2[0]) + { + is_approach = t7_start(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1); + if (is_approach) return true; + } + + + return false; +} diff --git a/2025.02.14/7Ex/solve.h b/2025.02.14/7Ex/solve.h new file mode 100644 index 0000000..e3d0479 --- /dev/null +++ b/2025.02.14/7Ex/solve.h @@ -0,0 +1,13 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status t7_process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status t7_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r); +bool t7_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/7Ex/t.txt b/2025.02.14/7Ex/t.txt new file mode 100644 index 0000000..2e65efe --- /dev/null +++ b/2025.02.14/7Ex/t.txt @@ -0,0 +1 @@ +a \ No newline at end of file diff --git a/2025.02.14/7Ex/test_cases.json b/2025.02.14/7Ex/test_cases.json new file mode 100644 index 0000000..40c64d7 --- /dev/null +++ b/2025.02.14/7Ex/test_cases.json @@ -0,0 +1,222 @@ +{ + "exe": "a07.exe", + "f_in": "input.txt", + "f_out": "output.txt", + "tests": [ + { + "s": "some", + "text": "some\nnotsome\nrandom", + "expected": "some\n" + }, + { + "s": "so?me", + "text": "some\nsme\nslome\nI'm sometimes", + "expected": "some\nsme\n" + }, + { + "s": "s\\ome\\\\", + "text": "some\\", + "expected": "some\\\n" + }, + { + "s": "some\\\\\\", + "text": "some\\", + "expected": "fall" + }, + { + "s": "?oho", + "text": "?oho\noho", + "expected": "?oho\n" + }, + { + "s": "a?", + "text": "\naha\na\na?\na????", + "expected": "\na\n" + }, + { + "s": "abs", + "text": "abs\n\\abs\nabsababa\nahahabs\nahahahabsahhaha\n^abs\nahahahabs$jajaja\nha\\abss$hello what!\npbs\nubs\n.abs\nabs\npbt\natn.b.\nbs\nbsaha\n?abs\naaaaaaaaaaaaabs\n+abs+\nabsssssss\n\n", + "expected": "abs\nabs\n" + }, + { + "s": "a??????", + "text": "a\naaa\n\n", + "expected": "a\n\n" + }, + { + "s": "a\\????", + "text": "a\naaa\na?\na??", + "expected": "a\na?\n" + }, + { + "s": "s\\ome\\\\", + "text": "some\\\nsome\ns\\ome\\\\\ns\\ome\\\nsome\\", + "expected": "some\\\nsome\\\n" + }, + { + "s": "some\\\\\\", + "text": "some\\", + "expected": "fall" + }, + { + "s": "ab????c", + "text": "abc\nac\nabbc\nab?c\nab???c\n", + "expected": "abc\nac\n" + }, + { + "s": "\\?some", + "text": "?some\n\\?some\n?someother\n?som\n", + "expected": "?some\n" + }, + { + "s": "", + "text": "hello\n\n\nabc", + "expected": "\n\n" + }, + { + "s": "te\\?st", + "text": "te?st\nte\\?st\nte\\st\ntest", + "expected": "te?st\n" + }, + { + "s": "hello?", + "text": "hello", + "expected": "hello\n" + }, + { + "s": "hello?", + "text": "hell", + "expected": "hell\n" + }, + { + "s": "hello?", + "text": "helloo", + "expected": "" + }, + { + "s": "he?llo", + "text": "hllo", + "expected": "hllo\n" + }, + { + "s": "he?llo", + "text": "hello", + "expected": "hello\n" + }, + { + "s": "he?llo", + "text": "heeello", + "expected": "" + }, + { + "s": "abc???", + "text": "abc", + "expected": "abc\n" + }, + { + "s": "abc???", + "text": "ab", + "expected": "ab\n" + }, + { + "s": "abc???", + "text": "abcd", + "expected": "" + }, + { + "s": "?abc", + "text": "abc", + "expected": "" + }, + { + "s": "?abc", + "text": "?abc", + "expected": "?abc\n" + }, + { + "s": "abc\\?", + "text": "abc?", + "expected": "abc?\n" + }, + { + "s": "abc\\?", + "text": "abc", + "expected": "" + }, + { + "s": "ab??c", + "text": "ac", + "expected": "ac\n" + }, + { + "s": "ab??c", + "text": "abc", + "expected": "abc\n" + }, + { + "s": "ab??c", + "text": "abbc", + "expected": "" + }, + { + "s": "a\\\\?", + "text": "a\\", + "expected": "a\\\n" + }, + { + "s": "a\\\\?", + "text": "a", + "expected": "a\n" + }, + { + "s": "\\?", + "text": "?", + "expected": "?\n" + }, + { + "s": "\\?", + "text": "a", + "expected": "" + }, + { + "s": "x??y??z", + "text": "xyz", + "expected": "xyz\n" + }, + { + "s": "x??y??z", + "text": "xyyz", + "expected": "" + }, + { + "s": "??abc", + "text": "abc", + "expected": "abc\n" + }, + { + "s": "a?b?c?", + "text": "abc", + "expected": "abc\n" + }, + { + "s": "a?b?c?", + "text": "ac", + "expected": "ac\n" + }, + { + "s": "a?b?c?", + "text": "c", + "expected": "c\n" + }, + { + "s": "a?b?c?", + "text": "ab", + "expected": "ab\n" + }, + { + "s": "a?b?c?", + "text": "", + "expected": "" + } + ] +} diff --git a/2025.02.14/7Ex/test_runner.py b/2025.02.14/7Ex/test_runner.py new file mode 100644 index 0000000..1865bfd --- /dev/null +++ b/2025.02.14/7Ex/test_runner.py @@ -0,0 +1,121 @@ +import json +import subprocess +import os +import time +import platform +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, s, text, expected): + self.s = s + self.text = text + self.expected = expected + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.f_in = self.config["f_in"] + self.f_out = self.config["f_out"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, f_in, f_out = test_suite.exe, test_suite.f_in, test_suite.f_out + + # Write input data to a file + with open(f_in, "w", encoding="utf-8") as f: + f.write(test.text) + + # Windows fix: remove './' for executables + cmd = [exe, f_in, f_out, test.s] if platform.system() == "Windows" else [f"./{exe}", f_in, f_out, test.s] + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.s}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.s}' should have failed but did not.", Fore.RED)) + return + + # Read output file + try: + with open(f_out, "r", encoding="utf-8") as f: + output = f.read() + except FileNotFoundError: + output = None + + # Check result + if output == test.expected: + print(color_text(f"[PASS] Test '{test.s}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.s}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{output}") + + # Cleanup test files + for file in [f_in, f_out]: + try: + os.remove(file) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {file}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.14/7Ex/Примеры.txt b/2025.02.14/7Ex/Примеры.txt new file mode 100644 index 0000000..2dc6c40 --- /dev/null +++ b/2025.02.14/7Ex/Примеры.txt @@ -0,0 +1,35 @@ +Default: +{ + s: 'some' + t: 'someone\nsome' +} + +Проверка ?: +{ + s: 's?ome' + t: 'some\nhome' +} + +Проверка \s -> s: +{ + s: 's\ome\\' + t: 'some\' +} + +Проверка \: +{ + s: 'some\\\' + t: 'not important' +} + +Проверка \?: +{ + s: '?oho' + t: 'haha?oho!' +} + +Множество ?: +{ + s: 'ha????ha' + t: 'hihihhahoho' +} \ No newline at end of file diff --git a/2025.02.14/8Ex/Linux.rar b/2025.02.14/8Ex/Linux.rar new file mode 100644 index 0000000..e1357cb Binary files /dev/null and b/2025.02.14/8Ex/Linux.rar differ diff --git a/2025.02.14/8Ex/Linux/Makefile b/2025.02.14/8Ex/Linux/Makefile new file mode 100644 index 0000000..0ce8470 --- /dev/null +++ b/2025.02.14/8Ex/Linux/Makefile @@ -0,0 +1,38 @@ +CFLAGS = -mfpmath=sse \ + -fstack-protector-all \ + -W \ + -Wall \ + -Wextra \ + -Wunused \ + -Wcast-align \ + -Werror \ + -pedantic \ + -pedantic-errors \ + -Wfloat-equal \ + -Wpointer-arith \ + -Wformat-security \ + -Wmissing-format-attribute \ + -Wformat=1 \ + -Wwrite-strings \ + -Wcast-align \ + -Wno-long-long \ + -std=gnu99 \ + -Wstrict-prototypes \ + -Wmissing-prototypes \ + -Wmissing-declarations \ + -Wold-style-definition \ + -Wdeclaration-after-statement \ + -Wbad-function-cast \ + -Wnested-externs \ + -O3 \ + -D_DEBUG -g \ + -c + +all: main.o array.o + gcc main.o array.o -o a08.out && rm *.o + +main.o: main.c + gcc $(CFLAGS) main.c + +array.o: array.c + gcc $(CFLAGS) array.c diff --git a/2025.02.14/8Ex/Linux/array.c b/2025.02.14/8Ex/Linux/array.c new file mode 100644 index 0000000..10c8784 --- /dev/null +++ b/2025.02.14/8Ex/Linux/array.c @@ -0,0 +1,115 @@ +#include "array.h" + + +io_status process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '+') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (buf[len_buf - 1] == '\n') buf[--len_buf] = '\0'; + is_approach = start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (buf[0] == s2[0]) + { + if (s1[0] == '1') + { + if (recursion(buf + char_s, s1, s2, len_s, len_buf - 1)) return true; + } + if (recursion(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1)) return true; + } + + return false; +} + +bool recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (len_s == 0) return true; + else if (len_buf == 0) return false; + else + { + int i; + for (i = 0; i < (int)len_buf; ++i) + { + if (buf[i] == s2[i]) + { + if (s1[i] == '1') + { + if (recursion(buf + (i + 1) * char_s, s1, s2, len_s, len_buf - 1)) return true; + } + if (i + 1 == (int)len_s) return true; + } + else + { + return false; + } + } + + return false; + } +} diff --git a/2025.02.14/8Ex/Linux/array.h b/2025.02.14/8Ex/Linux/array.h new file mode 100644 index 0000000..9ec7e36 --- /dev/null +++ b/2025.02.14/8Ex/Linux/array.h @@ -0,0 +1,14 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r); +bool start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf); +bool recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/8Ex/Linux/io_status.h b/2025.02.14/8Ex/Linux/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/8Ex/Linux/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/8Ex/Linux/main.c b/2025.02.14/8Ex/Linux/main.c new file mode 100644 index 0000000..0fa6bd1 --- /dev/null +++ b/2025.02.14/8Ex/Linux/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 8; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task8(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/8Ex/Linux/t.txt b/2025.02.14/8Ex/Linux/t.txt new file mode 100644 index 0000000..4535b00 --- /dev/null +++ b/2025.02.14/8Ex/Linux/t.txt @@ -0,0 +1 @@ +haaaaaaaaha \ No newline at end of file diff --git a/2025.02.14/8Ex/Makefile b/2025.02.14/8Ex/Makefile new file mode 100644 index 0000000..5832fda --- /dev/null +++ b/2025.02.14/8Ex/Makefile @@ -0,0 +1,13 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a08.exe: main.o solve.o + gcc main.o solve.o -o a08.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +clean: + del *.o *.exe \ No newline at end of file diff --git a/2025.02.14/8Ex/io_status.h b/2025.02.14/8Ex/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/8Ex/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/8Ex/main.c b/2025.02.14/8Ex/main.c new file mode 100644 index 0000000..43caf1a --- /dev/null +++ b/2025.02.14/8Ex/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = t8_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return t8_process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 8; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task8(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/8Ex/solve.c b/2025.02.14/8Ex/solve.c new file mode 100644 index 0000000..2791bd9 --- /dev/null +++ b/2025.02.14/8Ex/solve.c @@ -0,0 +1,84 @@ +#include "solve.h" + + +io_status t8_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '+') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t8_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (buf[len_buf - 1] == '\n') buf[--len_buf] = '\0'; + is_approach = t8_recursion(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t8_recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + if (len_s == 0) return (len_buf == 0); + else if (len_buf == 0) return false; + + if (buf[0] == s2[0]) + { + if (s1[0] == '1') if (t8_recursion(buf + 1, s1, s2, len_s, len_buf - 1)) return true; + if (t8_recursion(buf + 1, s1 + 1, s2 + 1, len_s - 1, len_buf - 1)) return true; + } + return false; +} diff --git a/2025.02.14/8Ex/solve.h b/2025.02.14/8Ex/solve.h new file mode 100644 index 0000000..236c3d8 --- /dev/null +++ b/2025.02.14/8Ex/solve.h @@ -0,0 +1,13 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status t8_process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status t8_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r); +bool t8_recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/8Ex/t.txt b/2025.02.14/8Ex/t.txt new file mode 100644 index 0000000..4245587 --- /dev/null +++ b/2025.02.14/8Ex/t.txt @@ -0,0 +1,6 @@ + +aha +a +a+ +a++ +aaaaaaaa \ No newline at end of file diff --git a/2025.02.14/8Ex/test_cases.json b/2025.02.14/8Ex/test_cases.json new file mode 100644 index 0000000..25570a9 --- /dev/null +++ b/2025.02.14/8Ex/test_cases.json @@ -0,0 +1,212 @@ +{ + "exe": "a08.exe", + "f_in": "input.txt", + "f_out": "output.txt", + "tests": [ + { + "s": "some", + "text": "some\nnotsome\nrandom", + "expected": "some\n" + }, + { + "s": "so+me", + "text": "some\nsooooome\nI'm sometimes", + "expected": "some\nsooooome\n" + }, + { + "s": "s\\ome\\\\", + "text": "some\\", + "expected": "some\\\n" + }, + { + "s": "some\\\\\\", + "text": "some\\", + "expected": "fall" + }, + { + "s": "+oho", + "text": "+oho\noho", + "expected": "+oho\n" + }, + { + "s": "a+", + "text": "\naha\na\na+\na++\naaaaaaaa\naa\naaaa\nbbb", + "expected": "a\naaaaaaaa\naa\naaaa\n" + }, + { + "s": "abs", + "text": "abs\n\\abs\nabsababa\nahahabs\nahahahabsahhaha\n^abs\nahahahabs$jajaja\nha\\abss$hello what!\npbs\nubs\n.abs\nabs\npbt\natn.b.\nbs\nbsaha\n?abs\naaaaaaaaaaaaabs\n+abs+\nabsssssss\n\n", + "expected": "abs\nabs\n" + }, + { + "s": "a+++++", + "text": "a\naaa\n\n", + "expected": "a\naaa\n" + }, + { + "s": "a\\+++++", + "text": "a\naaa\na+\na++", + "expected": "a+\na++\n" + }, + { + "s": "a+", + "text": "a\naa\naaa\naaaaaa\nb\naab\naaaaaax\n", + "expected": "a\naa\naaa\naaaaaa\n" + }, + { + "s": "a+b", + "text": "ab\naab\naaaab\nacb", + "expected": "ab\naab\naaaab\n" + }, + { + "s": "a++b", + "text": "ab\naab\naaaab", + "expected": "ab\naab\naaaab\n" + }, + { + "s": "a+++b", + "text": "ab\naab\naaaab", + "expected": "ab\naab\naaaab\n" + }, + { + "s": "+abc", + "text": "+abc\nabc\nxabc", + "expected": "+abc\n" + }, + { + "s": "abc+", + "text": "abc\nabcc\nabcccc\nab", + "expected": "abc\nabcc\nabcccc\n" + }, + { + "s": "a+b+c", + "text": "abc\naabbcc\naaaabbc", + "expected": "abc\naaaabbc\n" + }, + { + "s": "a+b+c", + "text": "ac\nabbc", + "expected": "abbc\n" + }, + { + "s": "a+b+c+", + "text": "abc\nabbcc\naaaabccccc", + "expected": "abc\nabbcc\naaaabccccc\n" + }, + { + "s": "a+b+c+", + "text": "ac\nabb\n", + "expected": "" + }, + { + "s": "a+b+c+d+", + "text": "abcd\naabbdcddd\naaaabbccddddd", + "expected": "abcd\naaaabbccddddd\n" + }, + { + "s": "hello+world", + "text": "helloworld\nhelloooooworld\nhelo+world", + "expected": "helloworld\nhelloooooworld\n" + }, + { + "s": "a\\+b", + "text": "a+b\nab\naab", + "expected": "a+b\n" + }, + { + "s": "a++", + "text": "a\naa\naaa\naaaa", + "expected": "a\naa\naaa\naaaa\n" + }, + { + "s": "a+++b+", + "text": "ab\naab\naaaabb\nabb", + "expected": "ab\naab\naaaabb\nabb\n" + }, + { + "s": "x+y+z+", + "text": "xyz\nxxyz\nxxxxyzzzz", + "expected": "xyz\nxxyz\nxxxxyzzzz\n" + }, + { + "s": "x+y+z+", + "text": "xz\nxyz\nxyzz", + "expected": "xyz\nxyzz\n" + }, + { + "s": "+abc", + "text": "+abc\nabc\nxabc", + "expected": "+abc\n" + }, + { + "s": "abc+", + "text": "abc\nabcc\nabccc\nab\n", + "expected": "abc\nabcc\nabccc\n" + }, + { + "s": "so+me", + "text": "some\nsooooome\nsometimes\n", + "expected": "some\nsooooome\n" + }, + { + "s": "a+b", + "text": "ab\naab\naaaab\nacb\n", + "expected": "ab\naab\naaaab\n" + }, + { + "s": "a++b", + "text": "ab\naab\naaaab\nazb\n", + "expected": "ab\naab\naaaab\n" + }, + { + "s": "a+++++b", + "text": "ab\naab\naaaab\naaaaaab\naxb\n", + "expected": "ab\naab\naaaab\naaaaaab\n" + }, + { + "s": "start+end", + "text": "startend\nstartttend\nstart\nstartende\n", + "expected": "startend\nstartttend\n" + }, + { + "s": "m++n", + "text": "mn\nmmn\nmmmn\nn\nmnn\n", + "expected": "mn\nmmn\nmmmn\n" + }, + { + "s": "z+z", + "text": "z\nzz\nzzz\nzzzz\nzzzza\n", + "expected": "zz\nzzz\nzzzz\n" + }, + { + "s": "++abc", + "text": "++abc\n+abc\n+++abc\n++++abc\n++abcd\n", + "expected": "++abc\n+abc\n+++abc\n++++abc\n" + }, + { + "s": "slash\\+slash", + "text": "slash+slash\nslashslash\nslash++slash\n", + "expected": "slash+slash\n" + }, + { + "s": "abc\\+def", + "text": "abc+def\nabc++def\nabcdef\nabc+defg\n", + "expected": "abc+def\n" + }, + { + "s": "my++test", + "text": "mytest\nmyytest\nmtest\nmytests\n", + "expected": "mytest\nmyytest\n" + }, + { + "s": "end+", + "text": "end\nendd\nenddd\nen\nendxd\n", + "expected": "end\nendd\nenddd\n" + }, + { + "s": "", + "text": "some\nboy\nwhant\nto\nsee\n\n", + "expected": "\n" + } + ] +} diff --git a/2025.02.14/8Ex/test_runner.py b/2025.02.14/8Ex/test_runner.py new file mode 100644 index 0000000..1865bfd --- /dev/null +++ b/2025.02.14/8Ex/test_runner.py @@ -0,0 +1,121 @@ +import json +import subprocess +import os +import time +import platform +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, s, text, expected): + self.s = s + self.text = text + self.expected = expected + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.f_in = self.config["f_in"] + self.f_out = self.config["f_out"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, f_in, f_out = test_suite.exe, test_suite.f_in, test_suite.f_out + + # Write input data to a file + with open(f_in, "w", encoding="utf-8") as f: + f.write(test.text) + + # Windows fix: remove './' for executables + cmd = [exe, f_in, f_out, test.s] if platform.system() == "Windows" else [f"./{exe}", f_in, f_out, test.s] + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.s}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.s}' should have failed but did not.", Fore.RED)) + return + + # Read output file + try: + with open(f_out, "r", encoding="utf-8") as f: + output = f.read() + except FileNotFoundError: + output = None + + # Check result + if output == test.expected: + print(color_text(f"[PASS] Test '{test.s}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.s}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{output}") + + # Cleanup test files + for file in [f_in, f_out]: + try: + os.remove(file) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {file}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.14/8Ex/Примеры.txt b/2025.02.14/8Ex/Примеры.txt new file mode 100644 index 0000000..93c71df --- /dev/null +++ b/2025.02.14/8Ex/Примеры.txt @@ -0,0 +1,76 @@ +Default: +{ + s: 'some' + t: 'some' +} + +Проверка, что если часть предложения: +{ + s: 'some' + t: 'somebody here!?' +} + +Проверка +: +{ + s: 'so+me' + t: 'sooooome\nsme\nsome' +} + +Проверка \s -> s: +{ + s: 's\ome\\' + t: 'some\' +} + +Проверка \: +{ + s: 'some\\\' + t: 'not important' +} + +Проверка \+: +{ + s: '+o\+o' + t: '+o+o' +} + +Множество +: +{ + s: 'ha++++++ha' + t: 'haaaaaaaaha' +} + +Проверка на не выход за стэк: +{ + s: 'som+e' + t: 'sommmme' +} + +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +pbs +ubs +.abs +abs +pbt +ats +.b. +bs +bsaha +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss +abs* +somePalongPway +some +howPsomePitPbe +howPsomething +whyPanysome + diff --git a/2025.02.14/9Ex/Makefile b/2025.02.14/9Ex/Makefile new file mode 100644 index 0000000..669b997 --- /dev/null +++ b/2025.02.14/9Ex/Makefile @@ -0,0 +1,38 @@ +CFLAGS = -mfpmath=sse \ + -fstack-protector-all \ + -W \ + -Wall \ + -Wextra \ + -Wunused \ + -Wcast-align \ + -Werror \ + -pedantic \ + -pedantic-errors \ + -Wfloat-equal \ + -Wpointer-arith \ + -Wformat-security \ + -Wmissing-format-attribute \ + -Wformat=1 \ + -Wwrite-strings \ + -Wcast-align \ + -Wno-long-long \ + -std=gnu99 \ + -Wstrict-prototypes \ + -Wmissing-prototypes \ + -Wmissing-declarations \ + -Wold-style-definition \ + -Wdeclaration-after-statement \ + -Wbad-function-cast \ + -Wnested-externs \ + -O3 \ + -D_DEBUG -g \ + -c + +all: main.o array.o + gcc main.o array.o -lssp && del *.o + +main.o: main.c + gcc $(CFLAGS) main.c + +array.o: array.c + gcc $(CFLAGS) array.c diff --git a/2025.02.14/9Ex/array.c b/2025.02.14/9Ex/array.c new file mode 100644 index 0000000..716bdc4 --- /dev/null +++ b/2025.02.14/9Ex/array.c @@ -0,0 +1,133 @@ +#include "array.h" + + +io_status process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '*') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') buf[--len_buf] = '\0'; + is_approach = start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (buf[0] == s2[0]) + { + if (s1[0] == '1') + { + if (recursion(buf + char_s, s1, s2, len_s, len_buf - 1)) return true; + else if (recursion(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf)) return true; + } + if (len_buf == 0 && len_s == 0) return true; + return recursion(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1); + } + if (s1[0] == '1') return recursion(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf); + + return false; +} + +bool recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (len_s == 0) + { + if (len_buf == 0) return true; + return false; + } + else if (len_buf == 0) return false; + else + { + int i; + for (i = 0; i < (int)len_buf; ++i) + { + if (buf[i] == s2[i]) + { + if (s1[i] == '1') + { + if (recursion(buf + (i + 1) * char_s, s1 + i * char_s, s2 + i * char_s, len_s - i, + len_buf - (i + 1))) + return true; + else if (recursion(buf + i * char_s, s1 + (i + 1) * char_s, s2 + (i + 1) * char_s, len_s - (i + 1), + len_buf - i)) + return true; + } + } + else + { + if (s1[i] == '1') + { + return (recursion(buf + i * char_s, s1 + (i + 1) * char_s, s2 + (i + 1) * char_s, len_s - (i + 1), + len_buf - i)); + return true; + } + return false; + } + } + + if (i == (int)len_s) return true; + return false; + } +} diff --git a/2025.02.14/9Ex/array.h b/2025.02.14/9Ex/array.h new file mode 100644 index 0000000..9ec7e36 --- /dev/null +++ b/2025.02.14/9Ex/array.h @@ -0,0 +1,14 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r); +bool start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf); +bool recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/9Ex/io_status.h b/2025.02.14/9Ex/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/9Ex/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/9Ex/main.c b/2025.02.14/9Ex/main.c new file mode 100644 index 0000000..168d588 --- /dev/null +++ b/2025.02.14/9Ex/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task9(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task9(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 9; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task9(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/9Ex/o.txt b/2025.02.14/9Ex/o.txt new file mode 100644 index 0000000..3d4dc53 --- /dev/null +++ b/2025.02.14/9Ex/o.txt @@ -0,0 +1,2 @@ +abs +abs diff --git a/2025.02.14/9Ex/t.txt b/2025.02.14/9Ex/t.txt new file mode 100644 index 0000000..a2c71b8 --- /dev/null +++ b/2025.02.14/9Ex/t.txt @@ -0,0 +1,23 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +pbs +ubs +.abs +abs +pbt +ats +.b. +bs +bsaha +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss + + diff --git a/2025.02.14/9Ex/Примеры.txt b/2025.02.14/9Ex/Примеры.txt new file mode 100644 index 0000000..c04b0a9 --- /dev/null +++ b/2025.02.14/9Ex/Примеры.txt @@ -0,0 +1,47 @@ +Default: +{ + s: 'some' + t: 'some\nheysome\nsomeone\nhey someone!' +} + +Проверка, на отсутствие буквы: +{ + s: 'so*me' + t: 'sme\nsome\nsume' +} + +Проверка, на множественное повторение: +{ + s: 'so*me' + t: 'sooooome\nsme\nsome\nsiiiime' +} + +Проверка \s -> s: +{ + s: 's\ome\\' + t: 'some\' +} + +Проверка, что если заканчивается t, то он не подходит +{ + s: 'something' + t: 'some' +} + +Проверка \: +{ + s: 'some\\\' + t: 'not important' +} + +Проверка \*: +{ + s: '*o\*o' + t: '*o*o\no*o\n**o*o\n*ooooo\n**o\n*oooo*o' +} + +Множество *: +{ + s: 'ha*****ha' + t: 'haaaaaaaaha' +} diff --git a/2025.02.14/Krivoruchenko_SK.zip b/2025.02.14/Krivoruchenko_SK.zip new file mode 100644 index 0000000..b74f28d Binary files /dev/null and b/2025.02.14/Krivoruchenko_SK.zip differ diff --git a/2025.02.14/Krivoruchenko_SK/Makefile b/2025.02.14/Krivoruchenko_SK/Makefile new file mode 100644 index 0000000..b60e76f --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/Makefile @@ -0,0 +1,13 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +%.out: %.o solve.o + gcc $(FLAGS) $^ -o $@ +%.o: %.c + gcc -c $(FLAGS) $< + +all: a01.out a02.out a03.out a04.out a06.out a07.out a08.out a09.out + +solve.o: solve.c solve.h + +clean: + rm -f *.o *.out diff --git a/2025.02.14/Krivoruchenko_SK/a01.c b/2025.02.14/Krivoruchenko_SK/a01.c new file mode 100644 index 0000000..89c70fa --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/a01.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t1_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t1_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 1; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task1(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Krivoruchenko_SK/a02.c b/2025.02.14/Krivoruchenko_SK/a02.c new file mode 100644 index 0000000..d89dc80 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/a02.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task2(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task2(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t2_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t2_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 2; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task2(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Krivoruchenko_SK/a03.c b/2025.02.14/Krivoruchenko_SK/a03.c new file mode 100644 index 0000000..c201e58 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/a03.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res); + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t3_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t3_process_file(f_in, f_out, s1, s2, t_param, res); + } +} + +int main(int argc, char* argv[]) { + int task = 3; + io_status ret; + const char *f_in, *f_out, *s, *t_param; + int res = 0; + double t; + if (argc != 5) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t_param = argv[4]; + t = clock(); + ret = task3(f_in, f_out, s, t_param, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Krivoruchenko_SK/a04.c b/2025.02.14/Krivoruchenko_SK/a04.c new file mode 100644 index 0000000..e166283 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/a04.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task4(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res); + +io_status task4(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t4_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t4_process_file(f_in, f_out, s1, s2, t_param, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 4; + io_status ret; + const char *f_in, *f_out, *s, *t_param; + int res = 0; + double t; + if (argc != 5) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t_param = argv[4]; + t = clock(); + ret = task4(f_in, f_out, s, t_param, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Krivoruchenko_SK/a06.c b/2025.02.14/Krivoruchenko_SK/a06.c new file mode 100644 index 0000000..82b0e38 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/a06.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task6(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task6(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t6_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t6_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 6; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task6(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Krivoruchenko_SK/a07.c b/2025.02.14/Krivoruchenko_SK/a07.c new file mode 100644 index 0000000..deb9928 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/a07.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task7(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task7(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t7_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t7_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 7; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task7(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Krivoruchenko_SK/a08.c b/2025.02.14/Krivoruchenko_SK/a08.c new file mode 100644 index 0000000..83d0cb9 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/a08.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = t8_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t8_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 8; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task8(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Krivoruchenko_SK/a09.c b/2025.02.14/Krivoruchenko_SK/a09.c new file mode 100644 index 0000000..4caa8c7 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/a09.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task9(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task9(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t9_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t9_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 9; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task9(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Krivoruchenko_SK/io_status.h b/2025.02.14/Krivoruchenko_SK/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/Krivoruchenko_SK/solve.c b/2025.02.14/Krivoruchenko_SK/solve.c new file mode 100644 index 0000000..88fa367 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/solve.c @@ -0,0 +1,886 @@ +#include "solve.h" + +/* ======================================= */ +/* ========== TASK 1 (Задание 1) ========= */ +/* ======================================= */ + +io_status t1_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = 0; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '^') && (i == 0)) + { + s1[j] = '1'; + s2[j++] = s[++i]; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t1_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach = t1_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Исправленная проверка на '\n': */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t1_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + + if (s1[0] == '1') + { + size_t i; + for (i = 0; i < len_s; ++i) + { + if (buf[i] != s2[i]) return false; + } + } + else + { + char* s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + +/* ======================================= */ +/* ========== TASK 2 (Задание 2) ========= */ +/* ======================================= */ + +io_status t2_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = 0; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '$') && (i + 1 == len_s)) + { + if (j != 0) + { + s1[j - 1] = '1'; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t2_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + /* Исправленная проверка на '\n' + уменьшение len_buf: */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + + is_approach = t2_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Здесь снова, если вдруг ещё раз проверяется: */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t2_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + + if (s1[len_s - 1] == '1') + { + size_t i; + /* Проверка с конца строки */ + for (i = len_buf - 1; i > len_buf - len_s - 1; --i) + { + if (buf[i] != s2[i - (len_buf - len_s)]) return false; + } + } + else + { + char* s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + +/* ======================================= */ +/* ========== TASK 3 (Задание 3) ========= */ +/* ======================================= */ + +io_status t3_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else if ((i == 0) && (s[i + 1] == '<')) + { + s1[j] = '1'; + i++; + } + else + { + if (s1[j] != '1') s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + if (s1[j] != '1') s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t3_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach = t3_process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t3_process_string(const char* buf, const char* s1, const char* s2, const char* t, + const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[0] == '1') + { + int last_space = -1, i; + size_t per_sim = 0; // Percent of similarity + for (i = 0; i < (int)len_buf; ++i) + { + if (t3_is_space(buf[i], t)) + { + last_space = i; + per_sim = 0; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space + 1) || (per_sim)) + { + if (++per_sim == len_s) + { + return true; + } + } + } + else + { + per_sim = 0; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +bool t3_is_space(char symbol, const char* t) +{ + int i; + for (i = 0; t[i] != '\0'; ++i) + { + if (t[i] == symbol) return true; + } + + return false; +} + +/* ======================================= */ +/* ========== TASK 4 (Задание 4) ========= */ +/* ======================================= */ + +io_status t4_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else if ((i == len_s - 2) && (s[i + 1] == '>')) + { + if (j > 0) + { + s1[j++ - 1] = '1'; + } + else + { + s1[j++] = '1'; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t4_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t4_process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + /* Проверка повторно (если была) */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t4_process_string(const char* buf, const char* s1, const char* s2, const char* t, + const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[len_s - 1] == '1') + { + size_t i, last_space = len_buf, per_sim = len_s - 1; // Percent of similarity + /* Обратный цикл, используя size_t */ + for (i = len_buf - 1; i < i + 2; --i) + { + if (t3_is_space(buf[i], t)) // используем t3_is_space, чтобы логику не менять + { + last_space = i; + per_sim = len_s - 1; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space - 1) || ((per_sim + 1) < len_s)) + { + if (per_sim-- == 0) + { + return true; + } + } + } + else + { + per_sim = len_s - 1; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +/* ======================================= */ +/* ========== TASK 6 (Задание 6) ========= */ +/* ======================================= */ + +io_status t6_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if (s[i] == '.') + { + s1[j] = '1'; + s2[j++] = '.'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t6_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t6_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Повторная проверка на всякий случай */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t6_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, + const size_t len_buf) +{ + if (len_buf < len_s) return false; + if (s1[0] == '1' || buf[0] == s2[0]) + { + int j; + for (j = 1; j < (int)len_s; ++j) + { + if ((buf[j] != s2[j]) && (s1[j] == '0')) + { + break; + } + } + + if (j == (int)len_s && j == (int)len_buf) return true; + } + + return false; +} + +/* ======================================= */ +/* ========== TASK 7 (Задание 7) ========= */ +/* ======================================= */ + +io_status t7_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i; + int j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '?') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t7_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') buf[--len_buf] = '\0'; + is_approach = t7_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t7_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + bool is_approach = false; + size_t char_s = sizeof(char); + if (len_s == 0) + { + if (len_buf == 0) return true; + return false; + } + + if (s1[0] == '1') + { + is_approach = t7_start(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf); + if (is_approach) return true; + } + if (len_buf != 0 && buf[0] == s2[0]) + { + is_approach = t7_start(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1); + if (is_approach) return true; + } + + + return false; +} + +/* ======================================= */ +/* ========== TASK 8 (Задание 8) ========= */ +/* ======================================= */ + +io_status t8_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '+') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t8_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (buf[len_buf - 1] == '\n') buf[--len_buf] = '\0'; + is_approach = t8_recursion(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t8_recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + if (len_s == 0) return (len_buf == 0); + else if (len_buf == 0) return false; + + if (buf[0] == s2[0]) + { + if (s1[0] == '1') if (t8_recursion(buf + 1, s1, s2, len_s, len_buf - 1)) return true; + if (t8_recursion(buf + 1, s1 + 1, s2 + 1, len_s - 1, len_buf - 1)) return true; + } + return false; +} + +/* ======================================= */ +/* ========== TASK 9 (Задание 9) ========= */ +/* ======================================= */ + +io_status t9_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '*') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t9_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t9_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t9_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (buf[0] == s2[0]) + { + if (s1[0] == '1') + { + if (t9_recursion(buf + char_s, s1, s2, len_s, len_buf - 1)) return true; + else if (t9_recursion(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf)) return true; + } + if (len_buf == 0 && len_s == 0) return true; + return t9_recursion(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1); + } + if (s1[0] == '1') return t9_recursion(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf); + + return false; +} + +bool t9_recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (len_s == 0) + { + if (len_buf == 0) return true; + return false; + } + else if (len_buf == 0) return false; + else + { + int i; + for (i = 0; i < (int)len_buf; ++i) + { + if (buf[i] == s2[i]) + { + if (s1[i] == '1') + { + if (t9_recursion(buf + (i + 1) * char_s, s1 + i * char_s, s2 + i * char_s, + len_s - i, len_buf - (i + 1))) + return true; + else if (t9_recursion(buf + i * char_s, s1 + (i + 1) * char_s, s2 + (i + 1) * char_s, + len_s - (i + 1), len_buf - i)) + return true; + } + } + else + { + if (s1[i] == '1') + { + /* Здесь два return подряд в оригинале - оставляем как есть */ + return (t9_recursion(buf + i * char_s, s1 + (i + 1) * char_s, s2 + (i + 1) * char_s, + len_s - (i + 1), len_buf - i)); + return true; + } + return false; + } + } + + if (i == (int)len_s) return true; + return false; + } +} diff --git a/2025.02.14/Krivoruchenko_SK/solve.h b/2025.02.14/Krivoruchenko_SK/solve.h new file mode 100644 index 0000000..c611b0e --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/solve.h @@ -0,0 +1,53 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include "io_status.h" +#include +#include +#include + +/* ========== TASK 1 (Исходный код из первого задания) ========== */ +io_status t1_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t1_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t1_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 2 ========== */ +io_status t2_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t2_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t2_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 3 ========== */ +io_status t3_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t3_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, const char *t, int *r); +bool t3_process_string(const char *buf, const char *s1, const char *s2, const char *t, + const size_t len_s, const size_t len_buf); +bool t3_is_space(char symbol, const char *t); + +/* ========== TASK 4 ========== */ +io_status t4_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t4_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, const char *t, int *r); +bool t4_process_string(const char *buf, const char *s1, const char *s2, const char *t, + const size_t len_s, const size_t len_buf); + +/* ========== TASK 6 ========== */ +io_status t6_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t6_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t6_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 7 ========== */ +io_status t7_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t7_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t7_start(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 8 ========== */ +io_status t8_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t8_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t8_recursion(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 9 ========== */ +io_status t9_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t9_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t9_start(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); +bool t9_recursion(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +#endif // SOLVE_H diff --git a/2025.02.14/Linux/Makefile b/2025.02.14/Linux/Makefile new file mode 100644 index 0000000..b60e76f --- /dev/null +++ b/2025.02.14/Linux/Makefile @@ -0,0 +1,13 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +%.out: %.o solve.o + gcc $(FLAGS) $^ -o $@ +%.o: %.c + gcc -c $(FLAGS) $< + +all: a01.out a02.out a03.out a04.out a06.out a07.out a08.out a09.out + +solve.o: solve.c solve.h + +clean: + rm -f *.o *.out diff --git a/2025.02.14/Linux/a01.c b/2025.02.14/Linux/a01.c new file mode 100644 index 0000000..89c70fa --- /dev/null +++ b/2025.02.14/Linux/a01.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t1_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t1_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 1; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task1(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Linux/a02.c b/2025.02.14/Linux/a02.c new file mode 100644 index 0000000..d89dc80 --- /dev/null +++ b/2025.02.14/Linux/a02.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task2(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task2(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t2_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t2_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 2; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task2(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Linux/a03.c b/2025.02.14/Linux/a03.c new file mode 100644 index 0000000..c201e58 --- /dev/null +++ b/2025.02.14/Linux/a03.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res); + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t3_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t3_process_file(f_in, f_out, s1, s2, t_param, res); + } +} + +int main(int argc, char* argv[]) { + int task = 3; + io_status ret; + const char *f_in, *f_out, *s, *t_param; + int res = 0; + double t; + if (argc != 5) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t_param = argv[4]; + t = clock(); + ret = task3(f_in, f_out, s, t_param, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Linux/a04.c b/2025.02.14/Linux/a04.c new file mode 100644 index 0000000..e166283 --- /dev/null +++ b/2025.02.14/Linux/a04.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task4(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res); + +io_status task4(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t4_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t4_process_file(f_in, f_out, s1, s2, t_param, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 4; + io_status ret; + const char *f_in, *f_out, *s, *t_param; + int res = 0; + double t; + if (argc != 5) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t_param = argv[4]; + t = clock(); + ret = task4(f_in, f_out, s, t_param, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Linux/a06.c b/2025.02.14/Linux/a06.c new file mode 100644 index 0000000..82b0e38 --- /dev/null +++ b/2025.02.14/Linux/a06.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task6(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task6(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t6_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t6_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 6; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task6(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Linux/a07.c b/2025.02.14/Linux/a07.c new file mode 100644 index 0000000..deb9928 --- /dev/null +++ b/2025.02.14/Linux/a07.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task7(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task7(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t7_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t7_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 7; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task7(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Linux/a08.c b/2025.02.14/Linux/a08.c new file mode 100644 index 0000000..83d0cb9 --- /dev/null +++ b/2025.02.14/Linux/a08.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = t8_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t8_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 8; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task8(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Linux/a09.c b/2025.02.14/Linux/a09.c new file mode 100644 index 0000000..4caa8c7 --- /dev/null +++ b/2025.02.14/Linux/a09.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task9(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task9(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t9_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t9_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 9; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task9(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Linux/io_status.h b/2025.02.14/Linux/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/Linux/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/Linux/solve.c b/2025.02.14/Linux/solve.c new file mode 100644 index 0000000..eafa00d --- /dev/null +++ b/2025.02.14/Linux/solve.c @@ -0,0 +1,929 @@ +#include "solve.h" + +/* ======================================= */ +/* ========== TASK 1 (Задание 1) ========= */ +/* ======================================= */ + +io_status t1_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = 0; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '^') && (i == 0)) + { + s1[j] = '1'; + s2[j++] = s[++i]; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t1_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach = t1_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Исправленная проверка на '\n': */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t1_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + + if (s1[0] == '1') + { + size_t i; + for (i = 0; i < len_s; ++i) + { + if (buf[i] != s2[i]) return false; + } + } + else + { + char* s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + +/* ======================================= */ +/* ========== TASK 2 (Задание 2) ========= */ +/* ======================================= */ + +io_status t2_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = 0; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '$') && (i + 1 == len_s)) + { + if (j != 0) + { + s1[j - 1] = '1'; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t2_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + /* Исправленная проверка на '\n' + уменьшение len_buf: */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + + is_approach = t2_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Здесь снова, если вдруг ещё раз проверяется: */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t2_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + + if (s1[len_s - 1] == '1') + { + size_t i; + /* Проверка с конца строки */ + for (i = len_buf - 1; i > len_buf - len_s - 1; --i) + { + if (buf[i] != s2[i - (len_buf - len_s)]) return false; + } + } + else + { + char* s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + +/* ======================================= */ +/* ========== TASK 3 (Задание 3) ========= */ +/* ======================================= */ + +io_status t3_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else if ((i == 0) && (s[i + 1] == '<')) + { + s1[j] = '1'; + i++; + } + else + { + if (s1[j] != '1') s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + if (s1[j] != '1') s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t3_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach = t3_process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t3_process_string(const char* buf, const char* s1, const char* s2, const char* t, + const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[0] == '1') + { + int last_space = -1, i; + size_t per_sim = 0; // Percent of similarity + for (i = 0; i < (int)len_buf; ++i) + { + if (t3_is_space(buf[i], t)) + { + last_space = i; + per_sim = 0; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space + 1) || (per_sim)) + { + if (++per_sim == len_s) + { + return true; + } + } + } + else + { + per_sim = 0; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +bool t3_is_space(char symbol, const char* t) +{ + int i; + for (i = 0; t[i] != '\0'; ++i) + { + if (t[i] == symbol) return true; + } + + return false; +} + +/* ======================================= */ +/* ========== TASK 4 (Задание 4) ========= */ +/* ======================================= */ + +io_status t4_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else if ((i == len_s - 2) && (s[i + 1] == '>')) + { + if (j > 0) + { + s1[j++ - 1] = '1'; + } + else + { + s1[j++] = '1'; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t4_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t4_process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + /* Проверка повторно (если была) */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t4_process_string(const char* buf, const char* s1, const char* s2, const char* t, + const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[len_s - 1] == '1') + { + size_t i, last_space = len_buf, per_sim = len_s - 1; // Percent of similarity + /* Обратный цикл, используя size_t */ + for (i = len_buf - 1; i < i + 2; --i) + { + if (t3_is_space(buf[i], t)) // используем t3_is_space, чтобы логику не менять + { + last_space = i; + per_sim = len_s - 1; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space - 1) || ((per_sim + 1) < len_s)) + { + if (per_sim-- == 0) + { + return true; + } + } + } + else + { + per_sim = len_s - 1; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +/* ======================================= */ +/* ========== TASK 6 (Задание 6) ========= */ +/* ======================================= */ + +io_status t6_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if (s[i] == '.') + { + s1[j] = '1'; + s2[j++] = '.'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t6_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t6_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Повторная проверка на всякий случай */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t6_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, + const size_t len_buf) +{ + if (len_buf < len_s) return false; + if (s1[0] == '1' || buf[0] == s2[0]) + { + int j; + for (j = 1; j < (int)len_s; ++j) + { + if ((buf[j] != s2[j]) && (s1[j] == '0')) + { + break; + } + } + + if (j == (int)len_s && j == (int)len_buf) return true; + } + + return false; +} + +/* ======================================= */ +/* ========== TASK 7 (Задание 7) ========= */ +/* ======================================= */ + +io_status t7_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i; + int j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '?') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t7_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t7_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t7_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + bool is_approach = false; + size_t char_s = sizeof(char); + if (len_s == 0) + { + if (len_buf == 0) return true; + return false; + } + else if (len_buf == 0) return false; + + if (buf[0] == s2[0]) + { + is_approach = t7_start(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1); + if (is_approach) return true; + } + if (s1[0] == '1') + { + is_approach = t7_start(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf); + if (is_approach) return true; + } + + return false; +} + +/* ======================================= */ +/* ========== TASK 8 (Задание 8) ========= */ +/* ======================================= */ + +io_status t8_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '+') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t8_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t8_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t8_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (buf[0] == s2[0]) + { + if (s1[0] == '1') + { + if (t8_recursion(buf + char_s, s1, s2, len_s, len_buf - 1)) return true; + } + if (len_buf == 0 && len_s == 0) return true; + if (t8_recursion(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1)) return true; + } + + return false; +} + +bool t8_recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (len_s == 0) return true; + else if (len_buf == 0) return false; + else + { + int i; + for (i = 0; i < (int)len_buf; ++i) + { + if (buf[i] == s2[i]) + { + if (s1[i] == '1') + { + if (t8_recursion(buf + (i + 1) * char_s, s1 + i * char_s, s2 + i * char_s, len_s - i, + len_buf - (i + 1))) + return true; + } + if ((i + 1) == (int)len_s) + { + if (i + 1 == (int)len_buf) return true; + return false; + } + } + else + { + return false; + } + } + + return false; + } +} + +/* ======================================= */ +/* ========== TASK 9 (Задание 9) ========= */ +/* ======================================= */ + +io_status t9_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '*') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t9_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t9_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t9_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (buf[0] == s2[0]) + { + if (s1[0] == '1') + { + if (t9_recursion(buf + char_s, s1, s2, len_s, len_buf - 1)) return true; + else if (t9_recursion(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf)) return true; + } + if (len_buf == 0 && len_s == 0) return true; + return t9_recursion(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1); + } + if (s1[0] == '1') return t9_recursion(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf); + + return false; +} + +bool t9_recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (len_s == 0) + { + if (len_buf == 0) return true; + return false; + } + else if (len_buf == 0) return false; + else + { + int i; + for (i = 0; i < (int)len_buf; ++i) + { + if (buf[i] == s2[i]) + { + if (s1[i] == '1') + { + if (t9_recursion(buf + (i + 1) * char_s, s1 + i * char_s, s2 + i * char_s, + len_s - i, len_buf - (i + 1))) + return true; + else if (t9_recursion(buf + i * char_s, s1 + (i + 1) * char_s, s2 + (i + 1) * char_s, + len_s - (i + 1), len_buf - i)) + return true; + } + } + else + { + if (s1[i] == '1') + { + /* Здесь два return подряд в оригинале - оставляем как есть */ + return (t9_recursion(buf + i * char_s, s1 + (i + 1) * char_s, s2 + (i + 1) * char_s, + len_s - (i + 1), len_buf - i)); + return true; + } + return false; + } + } + + if (i == (int)len_s) return true; + return false; + } +} diff --git a/2025.02.14/Linux/solve.h b/2025.02.14/Linux/solve.h new file mode 100644 index 0000000..14afcef --- /dev/null +++ b/2025.02.14/Linux/solve.h @@ -0,0 +1,54 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include "io_status.h" +#include +#include +#include + +/* ========== TASK 1 (Исходный код из первого задания) ========== */ +io_status t1_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t1_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t1_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 2 ========== */ +io_status t2_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t2_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t2_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 3 ========== */ +io_status t3_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t3_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, const char *t, int *r); +bool t3_process_string(const char *buf, const char *s1, const char *s2, const char *t, + const size_t len_s, const size_t len_buf); +bool t3_is_space(char symbol, const char *t); + +/* ========== TASK 4 ========== */ +io_status t4_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t4_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, const char *t, int *r); +bool t4_process_string(const char *buf, const char *s1, const char *s2, const char *t, + const size_t len_s, const size_t len_buf); + +/* ========== TASK 6 ========== */ +io_status t6_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t6_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t6_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 7 ========== */ +io_status t7_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t7_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t7_start(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 8 ========== */ +io_status t8_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t8_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t8_start(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); +bool t8_recursion(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 9 ========== */ +io_status t9_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t9_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t9_start(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); +bool t9_recursion(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +#endif // SOLVE_H diff --git a/2025.02.14/Makefile b/2025.02.14/Makefile new file mode 100644 index 0000000..b60e76f --- /dev/null +++ b/2025.02.14/Makefile @@ -0,0 +1,13 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +%.out: %.o solve.o + gcc $(FLAGS) $^ -o $@ +%.o: %.c + gcc -c $(FLAGS) $< + +all: a01.out a02.out a03.out a04.out a06.out a07.out a08.out a09.out + +solve.o: solve.c solve.h + +clean: + rm -f *.o *.out diff --git a/2025.02.14/Tasks01.pdf b/2025.02.14/Tasks01.pdf new file mode 100644 index 0000000..ab60708 Binary files /dev/null and b/2025.02.14/Tasks01.pdf differ diff --git a/2025.02.14/a01.c b/2025.02.14/a01.c new file mode 100644 index 0000000..89c70fa --- /dev/null +++ b/2025.02.14/a01.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t1_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t1_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 1; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task1(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/a02.c b/2025.02.14/a02.c new file mode 100644 index 0000000..d89dc80 --- /dev/null +++ b/2025.02.14/a02.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task2(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task2(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t2_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t2_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 2; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task2(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/a03.c b/2025.02.14/a03.c new file mode 100644 index 0000000..c201e58 --- /dev/null +++ b/2025.02.14/a03.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res); + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t3_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t3_process_file(f_in, f_out, s1, s2, t_param, res); + } +} + +int main(int argc, char* argv[]) { + int task = 3; + io_status ret; + const char *f_in, *f_out, *s, *t_param; + int res = 0; + double t; + if (argc != 5) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t_param = argv[4]; + t = clock(); + ret = task3(f_in, f_out, s, t_param, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/a04.c b/2025.02.14/a04.c new file mode 100644 index 0000000..e166283 --- /dev/null +++ b/2025.02.14/a04.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task4(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res); + +io_status task4(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t4_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t4_process_file(f_in, f_out, s1, s2, t_param, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 4; + io_status ret; + const char *f_in, *f_out, *s, *t_param; + int res = 0; + double t; + if (argc != 5) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t_param = argv[4]; + t = clock(); + ret = task4(f_in, f_out, s, t_param, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/a06.c b/2025.02.14/a06.c new file mode 100644 index 0000000..82b0e38 --- /dev/null +++ b/2025.02.14/a06.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task6(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task6(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t6_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t6_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 6; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task6(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/a07.c b/2025.02.14/a07.c new file mode 100644 index 0000000..deb9928 --- /dev/null +++ b/2025.02.14/a07.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task7(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task7(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t7_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t7_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 7; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task7(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/a08.c b/2025.02.14/a08.c new file mode 100644 index 0000000..83d0cb9 --- /dev/null +++ b/2025.02.14/a08.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = t8_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t8_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 8; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task8(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/a09.c b/2025.02.14/a09.c new file mode 100644 index 0000000..4caa8c7 --- /dev/null +++ b/2025.02.14/a09.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task9(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task9(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t9_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t9_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 9; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task9(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/io_status.h b/2025.02.14/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/solve.c b/2025.02.14/solve.c new file mode 100644 index 0000000..eafa00d --- /dev/null +++ b/2025.02.14/solve.c @@ -0,0 +1,929 @@ +#include "solve.h" + +/* ======================================= */ +/* ========== TASK 1 (Задание 1) ========= */ +/* ======================================= */ + +io_status t1_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = 0; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '^') && (i == 0)) + { + s1[j] = '1'; + s2[j++] = s[++i]; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t1_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach = t1_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Исправленная проверка на '\n': */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t1_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + + if (s1[0] == '1') + { + size_t i; + for (i = 0; i < len_s; ++i) + { + if (buf[i] != s2[i]) return false; + } + } + else + { + char* s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + +/* ======================================= */ +/* ========== TASK 2 (Задание 2) ========= */ +/* ======================================= */ + +io_status t2_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = 0; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '$') && (i + 1 == len_s)) + { + if (j != 0) + { + s1[j - 1] = '1'; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t2_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + /* Исправленная проверка на '\n' + уменьшение len_buf: */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + + is_approach = t2_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Здесь снова, если вдруг ещё раз проверяется: */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t2_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + + if (s1[len_s - 1] == '1') + { + size_t i; + /* Проверка с конца строки */ + for (i = len_buf - 1; i > len_buf - len_s - 1; --i) + { + if (buf[i] != s2[i - (len_buf - len_s)]) return false; + } + } + else + { + char* s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + +/* ======================================= */ +/* ========== TASK 3 (Задание 3) ========= */ +/* ======================================= */ + +io_status t3_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else if ((i == 0) && (s[i + 1] == '<')) + { + s1[j] = '1'; + i++; + } + else + { + if (s1[j] != '1') s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + if (s1[j] != '1') s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t3_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach = t3_process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t3_process_string(const char* buf, const char* s1, const char* s2, const char* t, + const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[0] == '1') + { + int last_space = -1, i; + size_t per_sim = 0; // Percent of similarity + for (i = 0; i < (int)len_buf; ++i) + { + if (t3_is_space(buf[i], t)) + { + last_space = i; + per_sim = 0; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space + 1) || (per_sim)) + { + if (++per_sim == len_s) + { + return true; + } + } + } + else + { + per_sim = 0; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +bool t3_is_space(char symbol, const char* t) +{ + int i; + for (i = 0; t[i] != '\0'; ++i) + { + if (t[i] == symbol) return true; + } + + return false; +} + +/* ======================================= */ +/* ========== TASK 4 (Задание 4) ========= */ +/* ======================================= */ + +io_status t4_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else if ((i == len_s - 2) && (s[i + 1] == '>')) + { + if (j > 0) + { + s1[j++ - 1] = '1'; + } + else + { + s1[j++] = '1'; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t4_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t4_process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + /* Проверка повторно (если была) */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t4_process_string(const char* buf, const char* s1, const char* s2, const char* t, + const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[len_s - 1] == '1') + { + size_t i, last_space = len_buf, per_sim = len_s - 1; // Percent of similarity + /* Обратный цикл, используя size_t */ + for (i = len_buf - 1; i < i + 2; --i) + { + if (t3_is_space(buf[i], t)) // используем t3_is_space, чтобы логику не менять + { + last_space = i; + per_sim = len_s - 1; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space - 1) || ((per_sim + 1) < len_s)) + { + if (per_sim-- == 0) + { + return true; + } + } + } + else + { + per_sim = len_s - 1; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +/* ======================================= */ +/* ========== TASK 6 (Задание 6) ========= */ +/* ======================================= */ + +io_status t6_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if (s[i] == '.') + { + s1[j] = '1'; + s2[j++] = '.'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t6_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t6_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Повторная проверка на всякий случай */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t6_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, + const size_t len_buf) +{ + if (len_buf < len_s) return false; + if (s1[0] == '1' || buf[0] == s2[0]) + { + int j; + for (j = 1; j < (int)len_s; ++j) + { + if ((buf[j] != s2[j]) && (s1[j] == '0')) + { + break; + } + } + + if (j == (int)len_s && j == (int)len_buf) return true; + } + + return false; +} + +/* ======================================= */ +/* ========== TASK 7 (Задание 7) ========= */ +/* ======================================= */ + +io_status t7_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i; + int j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '?') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t7_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t7_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t7_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + bool is_approach = false; + size_t char_s = sizeof(char); + if (len_s == 0) + { + if (len_buf == 0) return true; + return false; + } + else if (len_buf == 0) return false; + + if (buf[0] == s2[0]) + { + is_approach = t7_start(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1); + if (is_approach) return true; + } + if (s1[0] == '1') + { + is_approach = t7_start(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf); + if (is_approach) return true; + } + + return false; +} + +/* ======================================= */ +/* ========== TASK 8 (Задание 8) ========= */ +/* ======================================= */ + +io_status t8_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '+') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t8_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t8_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t8_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (buf[0] == s2[0]) + { + if (s1[0] == '1') + { + if (t8_recursion(buf + char_s, s1, s2, len_s, len_buf - 1)) return true; + } + if (len_buf == 0 && len_s == 0) return true; + if (t8_recursion(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1)) return true; + } + + return false; +} + +bool t8_recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (len_s == 0) return true; + else if (len_buf == 0) return false; + else + { + int i; + for (i = 0; i < (int)len_buf; ++i) + { + if (buf[i] == s2[i]) + { + if (s1[i] == '1') + { + if (t8_recursion(buf + (i + 1) * char_s, s1 + i * char_s, s2 + i * char_s, len_s - i, + len_buf - (i + 1))) + return true; + } + if ((i + 1) == (int)len_s) + { + if (i + 1 == (int)len_buf) return true; + return false; + } + } + else + { + return false; + } + } + + return false; + } +} + +/* ======================================= */ +/* ========== TASK 9 (Задание 9) ========= */ +/* ======================================= */ + +io_status t9_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '*') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t9_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t9_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t9_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (buf[0] == s2[0]) + { + if (s1[0] == '1') + { + if (t9_recursion(buf + char_s, s1, s2, len_s, len_buf - 1)) return true; + else if (t9_recursion(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf)) return true; + } + if (len_buf == 0 && len_s == 0) return true; + return t9_recursion(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1); + } + if (s1[0] == '1') return t9_recursion(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf); + + return false; +} + +bool t9_recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (len_s == 0) + { + if (len_buf == 0) return true; + return false; + } + else if (len_buf == 0) return false; + else + { + int i; + for (i = 0; i < (int)len_buf; ++i) + { + if (buf[i] == s2[i]) + { + if (s1[i] == '1') + { + if (t9_recursion(buf + (i + 1) * char_s, s1 + i * char_s, s2 + i * char_s, + len_s - i, len_buf - (i + 1))) + return true; + else if (t9_recursion(buf + i * char_s, s1 + (i + 1) * char_s, s2 + (i + 1) * char_s, + len_s - (i + 1), len_buf - i)) + return true; + } + } + else + { + if (s1[i] == '1') + { + /* Здесь два return подряд в оригинале - оставляем как есть */ + return (t9_recursion(buf + i * char_s, s1 + (i + 1) * char_s, s2 + (i + 1) * char_s, + len_s - (i + 1), len_buf - i)); + return true; + } + return false; + } + } + + if (i == (int)len_s) return true; + return false; + } +} diff --git a/2025.02.14/solve.h b/2025.02.14/solve.h new file mode 100644 index 0000000..14afcef --- /dev/null +++ b/2025.02.14/solve.h @@ -0,0 +1,54 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include "io_status.h" +#include +#include +#include + +/* ========== TASK 1 (Исходный код из первого задания) ========== */ +io_status t1_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t1_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t1_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 2 ========== */ +io_status t2_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t2_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t2_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 3 ========== */ +io_status t3_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t3_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, const char *t, int *r); +bool t3_process_string(const char *buf, const char *s1, const char *s2, const char *t, + const size_t len_s, const size_t len_buf); +bool t3_is_space(char symbol, const char *t); + +/* ========== TASK 4 ========== */ +io_status t4_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t4_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, const char *t, int *r); +bool t4_process_string(const char *buf, const char *s1, const char *s2, const char *t, + const size_t len_s, const size_t len_buf); + +/* ========== TASK 6 ========== */ +io_status t6_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t6_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t6_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 7 ========== */ +io_status t7_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t7_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t7_start(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 8 ========== */ +io_status t8_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t8_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t8_start(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); +bool t8_recursion(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 9 ========== */ +io_status t9_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t9_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t9_start(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); +bool t9_recursion(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +#endif // SOLVE_H diff --git a/2025.02.21/1Ex/Makefile b/2025.02.21/1Ex/Makefile new file mode 100644 index 0000000..11a8ad1 --- /dev/null +++ b/2025.02.21/1Ex/Makefile @@ -0,0 +1,16 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a01.exe: main.o array.o solve.o + gcc main.o solve.o array.o -o a01.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +clean: + del *.o *.exe \ No newline at end of file diff --git a/2025.02.21/1Ex/array.c b/2025.02.21/1Ex/array.c new file mode 100644 index 0000000..5a5f7b4 --- /dev/null +++ b/2025.02.21/1Ex/array.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int delete_string(char ** a, int n, int i) +{ + free(a[i]); + a[i] = a[n - 1]; + a[n - 1] = 0; + return n - 1; +} + diff --git a/2025.02.21/1Ex/array.h b/2025.02.21/1Ex/array.h new file mode 100644 index 0000000..2b5a9ce --- /dev/null +++ b/2025.02.21/1Ex/array.h @@ -0,0 +1,16 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int delete_string(char ** a, int n, int i); + +#endif diff --git a/2025.02.21/1Ex/io_status.h b/2025.02.21/1Ex/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/1Ex/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/1Ex/main.c b/2025.02.21/1Ex/main.c new file mode 100644 index 0000000..e0e5ea6 --- /dev/null +++ b/2025.02.21/1Ex/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 1; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status ret; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + ret = read_array(a, n, name); + do { + switch (ret) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + ret = t1_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, ret, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, ret, t); + free_array(a, ret); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/1Ex/solve.c b/2025.02.21/1Ex/solve.c new file mode 100644 index 0000000..b04f1a7 --- /dev/null +++ b/2025.02.21/1Ex/solve.c @@ -0,0 +1,16 @@ +#include "solve.h" + +int t1_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (strcmp(a[i], s) >= 0) + { + if (i != j) a[j] = a[i]; + j++; + } else free(a[i]); + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} diff --git a/2025.02.21/1Ex/solve.h b/2025.02.21/1Ex/solve.h new file mode 100644 index 0000000..7f6ed03 --- /dev/null +++ b/2025.02.21/1Ex/solve.h @@ -0,0 +1,10 @@ +#ifndef SOLVE +#define SOLVE + +#include + +#include "array.h" + +int t1_solve(char **arr, int n, char *s); + +#endif diff --git a/2025.02.21/1Ex/t.txt b/2025.02.21/1Ex/t.txt new file mode 100644 index 0000000..94dc09d --- /dev/null +++ b/2025.02.21/1Ex/t.txt @@ -0,0 +1,3 @@ +abcdef +abcefg +zyxwvf diff --git a/2025.02.21/2Ex/Makefile b/2025.02.21/2Ex/Makefile new file mode 100644 index 0000000..b4136a4 --- /dev/null +++ b/2025.02.21/2Ex/Makefile @@ -0,0 +1,16 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a02.exe: main.o array.o solve.o + gcc main.o solve.o array.o -o a02.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +clean: + del *.o *.exe diff --git a/2025.02.21/2Ex/array.c b/2025.02.21/2Ex/array.c new file mode 100644 index 0000000..5a5f7b4 --- /dev/null +++ b/2025.02.21/2Ex/array.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int delete_string(char ** a, int n, int i) +{ + free(a[i]); + a[i] = a[n - 1]; + a[n - 1] = 0; + return n - 1; +} + diff --git a/2025.02.21/2Ex/array.h b/2025.02.21/2Ex/array.h new file mode 100644 index 0000000..2b5a9ce --- /dev/null +++ b/2025.02.21/2Ex/array.h @@ -0,0 +1,16 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int delete_string(char ** a, int n, int i); + +#endif diff --git a/2025.02.21/2Ex/io_status.h b/2025.02.21/2Ex/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/2Ex/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/2Ex/main.c b/2025.02.21/2Ex/main.c new file mode 100644 index 0000000..e73740f --- /dev/null +++ b/2025.02.21/2Ex/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 2; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t2_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/2Ex/solve.c b/2025.02.21/2Ex/solve.c new file mode 100644 index 0000000..3a163c5 --- /dev/null +++ b/2025.02.21/2Ex/solve.c @@ -0,0 +1,18 @@ +#include "solve.h" + +int t2_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (!strstr(s, a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + } else free(a[i]); + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} diff --git a/2025.02.21/2Ex/solve.h b/2025.02.21/2Ex/solve.h new file mode 100644 index 0000000..6fe2229 --- /dev/null +++ b/2025.02.21/2Ex/solve.h @@ -0,0 +1,10 @@ +#ifndef SOLVE +#define SOLVE + +#include + +#include "array.h" + +int t2_solve(char **arr, int n, char *s); + +#endif diff --git a/2025.02.21/2Ex/t.txt b/2025.02.21/2Ex/t.txt new file mode 100644 index 0000000..3ce8488 --- /dev/null +++ b/2025.02.21/2Ex/t.txt @@ -0,0 +1,5 @@ +hello +friends +we +are +here diff --git a/2025.02.21/3Ex/Makefile b/2025.02.21/3Ex/Makefile new file mode 100644 index 0000000..742a071 --- /dev/null +++ b/2025.02.21/3Ex/Makefile @@ -0,0 +1,16 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a03.exe: main.o array.o solve.o + gcc main.o solve.o array.o -o a03.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +clean: + del *.o *.exe diff --git a/2025.02.21/3Ex/array.c b/2025.02.21/3Ex/array.c new file mode 100644 index 0000000..5a5f7b4 --- /dev/null +++ b/2025.02.21/3Ex/array.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int delete_string(char ** a, int n, int i) +{ + free(a[i]); + a[i] = a[n - 1]; + a[n - 1] = 0; + return n - 1; +} + diff --git a/2025.02.21/3Ex/array.h b/2025.02.21/3Ex/array.h new file mode 100644 index 0000000..2b5a9ce --- /dev/null +++ b/2025.02.21/3Ex/array.h @@ -0,0 +1,16 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int delete_string(char ** a, int n, int i); + +#endif diff --git a/2025.02.21/3Ex/io_status.h b/2025.02.21/3Ex/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/3Ex/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/3Ex/main.c b/2025.02.21/3Ex/main.c new file mode 100644 index 0000000..072006f --- /dev/null +++ b/2025.02.21/3Ex/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 3; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t3_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/3Ex/solve.c b/2025.02.21/3Ex/solve.c new file mode 100644 index 0000000..62da943 --- /dev/null +++ b/2025.02.21/3Ex/solve.c @@ -0,0 +1,20 @@ +#include "solve.h" + +int t3_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (strpbrk(s, a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + } else { + free(a[i]); + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} diff --git a/2025.02.21/3Ex/solve.h b/2025.02.21/3Ex/solve.h new file mode 100644 index 0000000..3595dcd --- /dev/null +++ b/2025.02.21/3Ex/solve.h @@ -0,0 +1,10 @@ +#ifndef SOLVE +#define SOLVE + +#include + +#include "array.h" + +int t3_solve(char **arr, int n, char *s); + +#endif diff --git a/2025.02.21/3Ex/t.txt b/2025.02.21/3Ex/t.txt new file mode 100644 index 0000000..3ce8488 --- /dev/null +++ b/2025.02.21/3Ex/t.txt @@ -0,0 +1,5 @@ +hello +friends +we +are +here diff --git a/2025.02.21/4Ex/Makefile b/2025.02.21/4Ex/Makefile new file mode 100644 index 0000000..b93020e --- /dev/null +++ b/2025.02.21/4Ex/Makefile @@ -0,0 +1,16 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a04.exe: main.o array.o solve.o + gcc main.o solve.o array.o -o a04.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +clean: + del *.o *.exe diff --git a/2025.02.21/4Ex/array.c b/2025.02.21/4Ex/array.c new file mode 100644 index 0000000..5a5f7b4 --- /dev/null +++ b/2025.02.21/4Ex/array.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int delete_string(char ** a, int n, int i) +{ + free(a[i]); + a[i] = a[n - 1]; + a[n - 1] = 0; + return n - 1; +} + diff --git a/2025.02.21/4Ex/array.h b/2025.02.21/4Ex/array.h new file mode 100644 index 0000000..2b5a9ce --- /dev/null +++ b/2025.02.21/4Ex/array.h @@ -0,0 +1,16 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int delete_string(char ** a, int n, int i); + +#endif diff --git a/2025.02.21/4Ex/io_status.h b/2025.02.21/4Ex/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/4Ex/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/4Ex/main.c b/2025.02.21/4Ex/main.c new file mode 100644 index 0000000..9bcfd2b --- /dev/null +++ b/2025.02.21/4Ex/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 4; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t4_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/4Ex/solve.c b/2025.02.21/4Ex/solve.c new file mode 100644 index 0000000..1e2f4ed --- /dev/null +++ b/2025.02.21/4Ex/solve.c @@ -0,0 +1,29 @@ +#include "solve.h" + +int t4_solve(char ** a, int n, char *s) { + size_t len_s = strlen(s); + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (len_s <= strlen(a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } else { + free(a[i]); + } + k++; + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} diff --git a/2025.02.21/4Ex/solve.h b/2025.02.21/4Ex/solve.h new file mode 100644 index 0000000..3a1ac7d --- /dev/null +++ b/2025.02.21/4Ex/solve.h @@ -0,0 +1,10 @@ +#ifndef SOLVE +#define SOLVE + +#include + +#include "array.h" + +int t4_solve(char **arr, int n, char *s); + +#endif diff --git a/2025.02.21/4Ex/t.txt b/2025.02.21/4Ex/t.txt new file mode 100644 index 0000000..98f854e --- /dev/null +++ b/2025.02.21/4Ex/t.txt @@ -0,0 +1,11 @@ +1 +22 +333 +4444 +55555 +666666 +333 +22 +1 +7777777 +22 diff --git a/2025.02.21/5Ex/Makefile b/2025.02.21/5Ex/Makefile new file mode 100644 index 0000000..c40ed58 --- /dev/null +++ b/2025.02.21/5Ex/Makefile @@ -0,0 +1,16 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a05.exe: main.o array.o solve.o + gcc main.o solve.o array.o -o a05.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +clean: + del *.o *.exe diff --git a/2025.02.21/5Ex/array.c b/2025.02.21/5Ex/array.c new file mode 100644 index 0000000..5a5f7b4 --- /dev/null +++ b/2025.02.21/5Ex/array.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int delete_string(char ** a, int n, int i) +{ + free(a[i]); + a[i] = a[n - 1]; + a[n - 1] = 0; + return n - 1; +} + diff --git a/2025.02.21/5Ex/array.h b/2025.02.21/5Ex/array.h new file mode 100644 index 0000000..2b5a9ce --- /dev/null +++ b/2025.02.21/5Ex/array.h @@ -0,0 +1,16 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int delete_string(char ** a, int n, int i); + +#endif diff --git a/2025.02.21/5Ex/io_status.h b/2025.02.21/5Ex/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/5Ex/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/5Ex/main.c b/2025.02.21/5Ex/main.c new file mode 100644 index 0000000..ca878c7 --- /dev/null +++ b/2025.02.21/5Ex/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 5; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t5_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/5Ex/solve.c b/2025.02.21/5Ex/solve.c new file mode 100644 index 0000000..49e28b5 --- /dev/null +++ b/2025.02.21/5Ex/solve.c @@ -0,0 +1,44 @@ +#include "solve.h" + +int t5_solve(char ** a, int n, char *s) { + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (!check(a[i], s)) { + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } else { + free(a[i]); + } + k++; + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + + +bool check(char *a, char *s) { + int i; + int len_s = (int)strlen(s); + int len_a = (int)strlen(a); + int diff = len_a - len_s; + + if (diff < 0) return false; + + for (i = (len_a - 1); i > (diff - 1); --i) { + if (a[i] != s[i - diff]) return false; + } + + return true; +} diff --git a/2025.02.21/5Ex/solve.h b/2025.02.21/5Ex/solve.h new file mode 100644 index 0000000..41781ae --- /dev/null +++ b/2025.02.21/5Ex/solve.h @@ -0,0 +1,12 @@ +#ifndef SOLVE +#define SOLVE + +#include +#include + +#include "array.h" + +int t5_solve(char **arr, int n, char *s); +bool check(char *a, char *s); + +#endif diff --git a/2025.02.21/5Ex/t.txt b/2025.02.21/5Ex/t.txt new file mode 100644 index 0000000..31a1902 --- /dev/null +++ b/2025.02.21/5Ex/t.txt @@ -0,0 +1,3 @@ +xyz +pqr +zzz diff --git a/2025.02.21/6Ex/Makefile b/2025.02.21/6Ex/Makefile new file mode 100644 index 0000000..aef2b70 --- /dev/null +++ b/2025.02.21/6Ex/Makefile @@ -0,0 +1,16 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a06.exe: main.o array.o solve.o + gcc main.o solve.o array.o -o a06.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +clean: + del *.o *.exe diff --git a/2025.02.21/6Ex/array.c b/2025.02.21/6Ex/array.c new file mode 100644 index 0000000..5a5f7b4 --- /dev/null +++ b/2025.02.21/6Ex/array.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int delete_string(char ** a, int n, int i) +{ + free(a[i]); + a[i] = a[n - 1]; + a[n - 1] = 0; + return n - 1; +} + diff --git a/2025.02.21/6Ex/array.h b/2025.02.21/6Ex/array.h new file mode 100644 index 0000000..2b5a9ce --- /dev/null +++ b/2025.02.21/6Ex/array.h @@ -0,0 +1,16 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int delete_string(char ** a, int n, int i); + +#endif diff --git a/2025.02.21/6Ex/io_status.h b/2025.02.21/6Ex/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/6Ex/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/6Ex/main.c b/2025.02.21/6Ex/main.c new file mode 100644 index 0000000..e3decb7 --- /dev/null +++ b/2025.02.21/6Ex/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 6; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t6_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/6Ex/solve.c b/2025.02.21/6Ex/solve.c new file mode 100644 index 0000000..6f30a8e --- /dev/null +++ b/2025.02.21/6Ex/solve.c @@ -0,0 +1,39 @@ +#include "solve.h" + +int t6_solve(char ** a, int n, char *s) { + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (strpbrk(a[i], s)) { + if (k > 1) + { + for (int x = 2; x < k; x++) free(a[i - x]); + a[j++] = a[i - 1]; + } + + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } + k++; + } + } + + if (k > 1) + { + for (int x = 2; x < k; x++) free(a[i - x]); + a[j++] = a[i - 1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + diff --git a/2025.02.21/6Ex/solve.h b/2025.02.21/6Ex/solve.h new file mode 100644 index 0000000..a89dc75 --- /dev/null +++ b/2025.02.21/6Ex/solve.h @@ -0,0 +1,11 @@ +#ifndef SOLVE +#define SOLVE + +#include +#include + +#include "array.h" + +int t6_solve(char **arr, int n, char *s); + +#endif diff --git a/2025.02.21/6Ex/t.txt b/2025.02.21/6Ex/t.txt new file mode 100644 index 0000000..31a1902 --- /dev/null +++ b/2025.02.21/6Ex/t.txt @@ -0,0 +1,3 @@ +xyz +pqr +zzz diff --git a/2025.02.21/7Ex/Makefile b/2025.02.21/7Ex/Makefile new file mode 100644 index 0000000..90aeeae --- /dev/null +++ b/2025.02.21/7Ex/Makefile @@ -0,0 +1,16 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a07.exe: main.o array.o solve.o + gcc main.o solve.o array.o -o a07.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +clean: + del *.o *.exe diff --git a/2025.02.21/7Ex/array.c b/2025.02.21/7Ex/array.c new file mode 100644 index 0000000..5a5f7b4 --- /dev/null +++ b/2025.02.21/7Ex/array.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int delete_string(char ** a, int n, int i) +{ + free(a[i]); + a[i] = a[n - 1]; + a[n - 1] = 0; + return n - 1; +} + diff --git a/2025.02.21/7Ex/array.h b/2025.02.21/7Ex/array.h new file mode 100644 index 0000000..2b5a9ce --- /dev/null +++ b/2025.02.21/7Ex/array.h @@ -0,0 +1,16 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int delete_string(char ** a, int n, int i); + +#endif diff --git a/2025.02.21/7Ex/io_status.h b/2025.02.21/7Ex/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/7Ex/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/7Ex/main.c b/2025.02.21/7Ex/main.c new file mode 100644 index 0000000..e3cb05f --- /dev/null +++ b/2025.02.21/7Ex/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 7; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t7_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/7Ex/solve.c b/2025.02.21/7Ex/solve.c new file mode 100644 index 0000000..e65afb6 --- /dev/null +++ b/2025.02.21/7Ex/solve.c @@ -0,0 +1,39 @@ +#include "solve.h" + +int t7_solve(char ** a, int n, char *s) { + bool fl_lst = false, fl_cur = false, fl_nxt = false; + int i, j; + + if (strcmp(a[0], s) < 0) fl_cur = true; + + for (i = 1, j = 0; i < n; ++i) { + if (strcmp(a[i], s) < 0) { + fl_lst = true; + fl_nxt = true; + } + + if (!fl_lst) { + if (j != (i-1)) { + a[j] = a[i-1]; + } + j++; + } else { + free(a[i-1]); + } + + fl_lst = fl_cur; + fl_cur = fl_nxt; + fl_nxt = false; + } + + if (fl_lst) + { + free(a[i-1]); + } else { + a[j++] = a[i-1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} diff --git a/2025.02.21/7Ex/solve.h b/2025.02.21/7Ex/solve.h new file mode 100644 index 0000000..79e0bde --- /dev/null +++ b/2025.02.21/7Ex/solve.h @@ -0,0 +1,11 @@ +#ifndef SOLVE +#define SOLVE + +#include +#include + +#include "array.h" + +int t7_solve(char **arr, int n, char *s); + +#endif diff --git a/2025.02.21/7Ex/t.txt b/2025.02.21/7Ex/t.txt new file mode 100644 index 0000000..bfba8e3 --- /dev/null +++ b/2025.02.21/7Ex/t.txt @@ -0,0 +1,3 @@ +apple +banana +coffee diff --git a/2025.02.21/8Ex/Makefile b/2025.02.21/8Ex/Makefile new file mode 100644 index 0000000..6d0657c --- /dev/null +++ b/2025.02.21/8Ex/Makefile @@ -0,0 +1,16 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a08.exe: main.o array.o solve.o + gcc main.o solve.o array.o -o a08.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +clean: + del *.o *.exe diff --git a/2025.02.21/8Ex/array.c b/2025.02.21/8Ex/array.c new file mode 100644 index 0000000..5a5f7b4 --- /dev/null +++ b/2025.02.21/8Ex/array.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int delete_string(char ** a, int n, int i) +{ + free(a[i]); + a[i] = a[n - 1]; + a[n - 1] = 0; + return n - 1; +} + diff --git a/2025.02.21/8Ex/array.h b/2025.02.21/8Ex/array.h new file mode 100644 index 0000000..2b5a9ce --- /dev/null +++ b/2025.02.21/8Ex/array.h @@ -0,0 +1,16 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int delete_string(char ** a, int n, int i); + +#endif diff --git a/2025.02.21/8Ex/io_status.h b/2025.02.21/8Ex/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/8Ex/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/8Ex/main.c b/2025.02.21/8Ex/main.c new file mode 100644 index 0000000..eaae524 --- /dev/null +++ b/2025.02.21/8Ex/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 8; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t8_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/8Ex/solve.c b/2025.02.21/8Ex/solve.c new file mode 100644 index 0000000..734542c --- /dev/null +++ b/2025.02.21/8Ex/solve.c @@ -0,0 +1,77 @@ +#include "solve.h" + +#define INF 97 +#define EXTR 122 +#define TO_UPPER 32 + +#define LOWER(a) (INF <= a && a <= EXTR) + +int t8_solve(char ** a, int n, char *s) { + bool fl_lst = false, fl_cur = false, fl_nxt = false; + int i, j; + + fl_cur = is_inside(a[0], s); + + for (i = 1, j = 0; i < n; ++i) { + if (is_inside(a[i], s)) { + fl_lst = true; + fl_nxt = true; + } + + if (!fl_lst) { + if (j != (i-1)) { + a[j] = a[i-1]; + } + j++; + } else { + free(a[i-1]); + } + + fl_lst = fl_cur; + fl_cur = fl_nxt; + fl_nxt = false; + } + + if (fl_lst) + { + free(a[i-1]); + } else { + a[j++] = a[i-1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +bool is_inside(char *a, char *s) +{ + int len_s = (int)strlen(s); + int len_a = (int)strlen(a); + int i, j; + + if (len_s < len_a) return false; + + for (i = 0; i < len_s; ++i) { + if (!ccmp(a[0], s[i])) { + if (len_a > (len_s-len_a)) return false; + + for (j = 0; j < len_a; ++j) { + if (ccmp(a[j], s[i + j]) != 0) break; + } + + if (j == len_a) return true; + } + } + + return false; +} + +int ccmp(char a, char b) { + if (LOWER(a)) a -= TO_UPPER; + if (LOWER(b)) b -= TO_UPPER; + + if (a < b) return -1; + if (a > b) return 1; + return 0; +} diff --git a/2025.02.21/8Ex/solve.h b/2025.02.21/8Ex/solve.h new file mode 100644 index 0000000..3dfa18a --- /dev/null +++ b/2025.02.21/8Ex/solve.h @@ -0,0 +1,13 @@ +#ifndef SOLVE +#define SOLVE + +#include +#include + +#include "array.h" + +int t8_solve(char **arr, int n, char *s); +bool is_inside(char *a, char *s); +int ccmp(char a, char s); + +#endif diff --git a/2025.02.21/8Ex/t.txt b/2025.02.21/8Ex/t.txt new file mode 100644 index 0000000..cb163b8 --- /dev/null +++ b/2025.02.21/8Ex/t.txt @@ -0,0 +1,9 @@ +anysome +hello +anybody +here +someone?! +somehelp +I +need +cosomello diff --git a/2025.02.21/Example/array.c b/2025.02.21/Example/array.c new file mode 100644 index 0000000..d87eee2 --- /dev/null +++ b/2025.02.21/Example/array.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + +#define LEN 1234 + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + delete_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == "\n") + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + delete_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void delete_array(char ** a. int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + + diff --git a/2025.02.21/Example/io_status.h b/2025.02.21/Example/io_status.h new file mode 100644 index 0000000..491c8a1 --- /dev/null +++ b/2025.02.21/Example/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#typedef enum _io_status +{ + SUCCESS, + READ_ERROR, + SIZE_ERROR, + FORMAT_ERROR, + MEMORY_ERROR +} io_status; + +#endif diff --git a/2025.02.21/Example/main.c b/2025.02.21/Example/main.c new file mode 100644 index 0000000..7c7c5e0 --- /dev/null +++ b/2025.02.21/Example/main.c @@ -0,0 +1,52 @@ +#include +#include "io_status.h" + + +int main(int argc, char * srgv[]) { + int n = 0, m = 0; + char * name = 0; + char ** a = 0; + io_status ret; + + if (!(argc == 4 && fscanf(argv[1], "%d", &n) == 1 && fscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file\n", argv[0]); + return 1; + } + name = argv[3]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return MEMORY_ERROR; + } + ret = read_array(a, n, name); + do { + switch (ret) { + case SUCCESS; + continue; + case ERROR_OPEN; + printf("Can not open %s\n", name); + break; + case ERROR_READ; + printf("Can not read %s\n", name); + break; + case ERROR_MEM; + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + // TODO: Замер времени + l = solve(a, n); + // TODO: Замер времени + print_array(a, l, m); + delete_array(a, l); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Krivoruchenko_SK.zip b/2025.02.21/Krivoruchenko_SK.zip new file mode 100644 index 0000000..35a3dac Binary files /dev/null and b/2025.02.21/Krivoruchenko_SK.zip differ diff --git a/2025.02.21/Linux/Makefile b/2025.02.21/Linux/Makefile new file mode 100644 index 0000000..4437b75 --- /dev/null +++ b/2025.02.21/Linux/Makefile @@ -0,0 +1,13 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +%.out: %.o solve.o + gcc $(FLAGS) $^ -o $@ +%.o: %.c + gcc -c $(FLAGS) $< + +all: a01.out a02.out a03.out a04.out a05.out a06.out a07.out a08.out + +solve.o: solve.c solve.h + +clean: + rm -f *.o *.out diff --git a/2025.02.21/Linux/a01.c b/2025.02.21/Linux/a01.c new file mode 100644 index 0000000..e0e5ea6 --- /dev/null +++ b/2025.02.21/Linux/a01.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 1; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status ret; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + ret = read_array(a, n, name); + do { + switch (ret) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + ret = t1_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, ret, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, ret, t); + free_array(a, ret); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Linux/a02.c b/2025.02.21/Linux/a02.c new file mode 100644 index 0000000..e73740f --- /dev/null +++ b/2025.02.21/Linux/a02.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 2; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t2_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Linux/a03.c b/2025.02.21/Linux/a03.c new file mode 100644 index 0000000..072006f --- /dev/null +++ b/2025.02.21/Linux/a03.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 3; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t3_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Linux/a04.c b/2025.02.21/Linux/a04.c new file mode 100644 index 0000000..9bcfd2b --- /dev/null +++ b/2025.02.21/Linux/a04.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 4; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t4_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Linux/a05.c b/2025.02.21/Linux/a05.c new file mode 100644 index 0000000..ca878c7 --- /dev/null +++ b/2025.02.21/Linux/a05.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 5; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t5_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Linux/a06.c b/2025.02.21/Linux/a06.c new file mode 100644 index 0000000..e3decb7 --- /dev/null +++ b/2025.02.21/Linux/a06.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 6; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t6_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Linux/a07.c b/2025.02.21/Linux/a07.c new file mode 100644 index 0000000..e3cb05f --- /dev/null +++ b/2025.02.21/Linux/a07.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 7; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t7_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Linux/a08.c b/2025.02.21/Linux/a08.c new file mode 100644 index 0000000..eaae524 --- /dev/null +++ b/2025.02.21/Linux/a08.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 8; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t8_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Linux/array.c b/2025.02.21/Linux/array.c new file mode 100644 index 0000000..7d03417 --- /dev/null +++ b/2025.02.21/Linux/array.c @@ -0,0 +1,66 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} diff --git a/2025.02.21/Linux/array.h b/2025.02.21/Linux/array.h new file mode 100644 index 0000000..4617a02 --- /dev/null +++ b/2025.02.21/Linux/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); + +#endif diff --git a/2025.02.21/Linux/io_status.h b/2025.02.21/Linux/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/Linux/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/Linux/solve.c b/2025.02.21/Linux/solve.c new file mode 100644 index 0000000..30145ea --- /dev/null +++ b/2025.02.21/Linux/solve.c @@ -0,0 +1,269 @@ +#include "solve.h" + +int t1_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (strcmp(a[i], s) >= 0) + { + if (i != j) a[j] = a[i]; + j++; + } else free(a[i]); + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t2_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (!strstr(s, a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + } else free(a[i]); + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t3_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (strpbrk(s, a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + } else { + free(a[i]); + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t4_solve(char ** a, int n, char *s) { + size_t len_s = strlen(s); + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (len_s <= strlen(a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } else { + free(a[i]); + } + k++; + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t5_solve(char ** a, int n, char *s) { + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (!check(a[i], s)) { + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } else { + free(a[i]); + } + k++; + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + + +bool check(char *a, char *s) { + int i; + int len_s = (int)strlen(s); + int len_a = (int)strlen(a); + int diff = len_a - len_s; + + if (diff < 0) return false; + + for (i = (len_a - 1); i > (diff - 1); --i) { + if (a[i] != s[i - diff]) return false; + } + + return true; +} + +int t6_solve(char ** a, int n, char *s) { + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (strpbrk(a[i], s)) { + if (k > 1) + { + for (int x = 2; x < k; x++) free(a[i - x]); + a[j++] = a[i - 1]; + } + + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } + k++; + } + } + + if (k > 1) + { + for (int x = 2; x < k; x++) free(a[i - x]); + a[j++] = a[i - 1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t7_solve(char ** a, int n, char *s) { + bool fl_lst = false, fl_cur = false, fl_nxt = false; + int i, j; + + if (strcmp(a[0], s) < 0) fl_cur = true; + + for (i = 1, j = 0; i < n; ++i) { + if (strcmp(a[i], s) < 0) { + fl_lst = true; + fl_nxt = true; + } + + if (!fl_lst) { + if (j != (i-1)) { + a[j] = a[i-1]; + } + j++; + } else { + free(a[i-1]); + } + + fl_lst = fl_cur; + fl_cur = fl_nxt; + fl_nxt = false; + } + + if (fl_lst) + { + free(a[i-1]); + } else { + a[j++] = a[i-1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + + +int t8_solve(char ** a, int n, char *s) { + bool fl_lst = false, fl_cur = false, fl_nxt = false; + int i, j; + + fl_cur = is_inside(a[0], s); + + for (i = 1, j = 0; i < n; ++i) { + if (is_inside(a[i], s)) { + fl_lst = true; + fl_nxt = true; + } + + if (!fl_lst) { + if (j != (i-1)) { + a[j] = a[i-1]; + } + j++; + } else { + free(a[i-1]); + } + + fl_lst = fl_cur; + fl_cur = fl_nxt; + fl_nxt = false; + } + + if (fl_lst) + { + free(a[i-1]); + } else { + a[j++] = a[i-1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +bool is_inside(char *a, char *s) +{ + int len_s = (int)strlen(s); + int len_a = (int)strlen(a); + int i, j; + + if (len_s < len_a) return false; + + for (i = 0; i < len_s; ++i) { + if (!ccmp(a[0], s[i])) { + if (len_a > (len_s-len_a)) return false; + + for (j = 0; j < len_a; ++j) { + if (ccmp(a[j], s[i + j]) != 0) break; + } + + if (j == len_a) return true; + } + } + + return false; +} + +int ccmp(char a, char b) { + if (LOWER(a)) a -= TO_UPPER; + if (LOWER(b)) b -= TO_UPPER; + + if (a < b) return -1; + if (a > b) return 1; + return 0; +} diff --git a/2025.02.21/Linux/solve.h b/2025.02.21/Linux/solve.h new file mode 100644 index 0000000..e90508f --- /dev/null +++ b/2025.02.21/Linux/solve.h @@ -0,0 +1,27 @@ +#ifndef SOLVE +#define SOLVE + +#include +#include + +#include "array.h" + +#define INF 97 +#define EXTR 122 +#define TO_UPPER 32 + +#define LOWER(a) (INF <= a && a <= EXTR) + +int t1_solve(char **arr, int n, char *s); +int t2_solve(char **arr, int n, char *s); +int t3_solve(char **arr, int n, char *s); +int t4_solve(char **arr, int n, char *s); +int t5_solve(char **arr, int n, char *s); +bool check(char *a, char *s); +int t6_solve(char **arr, int n, char *s); +int t7_solve(char **arr, int n, char *s); +int t8_solve(char **arr, int n, char *s); +bool is_inside(char *a, char *s); +int ccmp(char a, char s); + +#endif diff --git a/2025.02.21/Makefile b/2025.02.21/Makefile new file mode 100644 index 0000000..8050f29 --- /dev/null +++ b/2025.02.21/Makefile @@ -0,0 +1,14 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +%.out: %.o solve.o array.o + gcc $(FLAGS) $^ -o $@ +%.o: %.c + gcc -c $(FLAGS) $< + +all: a01.out a02.out a03.out a04.out a05.out a06.out a07.out a08.out + +solve.o: solve.c solve.h +array.o: array.c array.h + +clean: + rm -f *.o *.out diff --git a/2025.02.21/Tasks02.pdf b/2025.02.21/Tasks02.pdf new file mode 100644 index 0000000..80e2ca0 Binary files /dev/null and b/2025.02.21/Tasks02.pdf differ diff --git a/2025.02.21/a01.c b/2025.02.21/a01.c new file mode 100644 index 0000000..e0e5ea6 --- /dev/null +++ b/2025.02.21/a01.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 1; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status ret; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + ret = read_array(a, n, name); + do { + switch (ret) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + ret = t1_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, ret, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, ret, t); + free_array(a, ret); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/a02.c b/2025.02.21/a02.c new file mode 100644 index 0000000..e73740f --- /dev/null +++ b/2025.02.21/a02.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 2; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t2_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/a03.c b/2025.02.21/a03.c new file mode 100644 index 0000000..072006f --- /dev/null +++ b/2025.02.21/a03.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 3; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t3_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/a04.c b/2025.02.21/a04.c new file mode 100644 index 0000000..9bcfd2b --- /dev/null +++ b/2025.02.21/a04.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 4; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t4_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/a05.c b/2025.02.21/a05.c new file mode 100644 index 0000000..ca878c7 --- /dev/null +++ b/2025.02.21/a05.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 5; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t5_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/a06.c b/2025.02.21/a06.c new file mode 100644 index 0000000..e3decb7 --- /dev/null +++ b/2025.02.21/a06.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 6; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t6_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/a07.c b/2025.02.21/a07.c new file mode 100644 index 0000000..e3cb05f --- /dev/null +++ b/2025.02.21/a07.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 7; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t7_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/a08.c b/2025.02.21/a08.c new file mode 100644 index 0000000..eaae524 --- /dev/null +++ b/2025.02.21/a08.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 8; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t8_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/array.c b/2025.02.21/array.c new file mode 100644 index 0000000..7d03417 --- /dev/null +++ b/2025.02.21/array.c @@ -0,0 +1,66 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} diff --git a/2025.02.21/array.h b/2025.02.21/array.h new file mode 100644 index 0000000..4617a02 --- /dev/null +++ b/2025.02.21/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); + +#endif diff --git a/2025.02.21/io_status.h b/2025.02.21/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/solve.c b/2025.02.21/solve.c new file mode 100644 index 0000000..30145ea --- /dev/null +++ b/2025.02.21/solve.c @@ -0,0 +1,269 @@ +#include "solve.h" + +int t1_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (strcmp(a[i], s) >= 0) + { + if (i != j) a[j] = a[i]; + j++; + } else free(a[i]); + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t2_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (!strstr(s, a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + } else free(a[i]); + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t3_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (strpbrk(s, a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + } else { + free(a[i]); + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t4_solve(char ** a, int n, char *s) { + size_t len_s = strlen(s); + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (len_s <= strlen(a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } else { + free(a[i]); + } + k++; + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t5_solve(char ** a, int n, char *s) { + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (!check(a[i], s)) { + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } else { + free(a[i]); + } + k++; + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + + +bool check(char *a, char *s) { + int i; + int len_s = (int)strlen(s); + int len_a = (int)strlen(a); + int diff = len_a - len_s; + + if (diff < 0) return false; + + for (i = (len_a - 1); i > (diff - 1); --i) { + if (a[i] != s[i - diff]) return false; + } + + return true; +} + +int t6_solve(char ** a, int n, char *s) { + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (strpbrk(a[i], s)) { + if (k > 1) + { + for (int x = 2; x < k; x++) free(a[i - x]); + a[j++] = a[i - 1]; + } + + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } + k++; + } + } + + if (k > 1) + { + for (int x = 2; x < k; x++) free(a[i - x]); + a[j++] = a[i - 1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t7_solve(char ** a, int n, char *s) { + bool fl_lst = false, fl_cur = false, fl_nxt = false; + int i, j; + + if (strcmp(a[0], s) < 0) fl_cur = true; + + for (i = 1, j = 0; i < n; ++i) { + if (strcmp(a[i], s) < 0) { + fl_lst = true; + fl_nxt = true; + } + + if (!fl_lst) { + if (j != (i-1)) { + a[j] = a[i-1]; + } + j++; + } else { + free(a[i-1]); + } + + fl_lst = fl_cur; + fl_cur = fl_nxt; + fl_nxt = false; + } + + if (fl_lst) + { + free(a[i-1]); + } else { + a[j++] = a[i-1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + + +int t8_solve(char ** a, int n, char *s) { + bool fl_lst = false, fl_cur = false, fl_nxt = false; + int i, j; + + fl_cur = is_inside(a[0], s); + + for (i = 1, j = 0; i < n; ++i) { + if (is_inside(a[i], s)) { + fl_lst = true; + fl_nxt = true; + } + + if (!fl_lst) { + if (j != (i-1)) { + a[j] = a[i-1]; + } + j++; + } else { + free(a[i-1]); + } + + fl_lst = fl_cur; + fl_cur = fl_nxt; + fl_nxt = false; + } + + if (fl_lst) + { + free(a[i-1]); + } else { + a[j++] = a[i-1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +bool is_inside(char *a, char *s) +{ + int len_s = (int)strlen(s); + int len_a = (int)strlen(a); + int i, j; + + if (len_s < len_a) return false; + + for (i = 0; i < len_s; ++i) { + if (!ccmp(a[0], s[i])) { + if (len_a > (len_s-len_a)) return false; + + for (j = 0; j < len_a; ++j) { + if (ccmp(a[j], s[i + j]) != 0) break; + } + + if (j == len_a) return true; + } + } + + return false; +} + +int ccmp(char a, char b) { + if (LOWER(a)) a -= TO_UPPER; + if (LOWER(b)) b -= TO_UPPER; + + if (a < b) return -1; + if (a > b) return 1; + return 0; +} diff --git a/2025.02.21/solve.h b/2025.02.21/solve.h new file mode 100644 index 0000000..e90508f --- /dev/null +++ b/2025.02.21/solve.h @@ -0,0 +1,27 @@ +#ifndef SOLVE +#define SOLVE + +#include +#include + +#include "array.h" + +#define INF 97 +#define EXTR 122 +#define TO_UPPER 32 + +#define LOWER(a) (INF <= a && a <= EXTR) + +int t1_solve(char **arr, int n, char *s); +int t2_solve(char **arr, int n, char *s); +int t3_solve(char **arr, int n, char *s); +int t4_solve(char **arr, int n, char *s); +int t5_solve(char **arr, int n, char *s); +bool check(char *a, char *s); +int t6_solve(char **arr, int n, char *s); +int t7_solve(char **arr, int n, char *s); +int t8_solve(char **arr, int n, char *s); +bool is_inside(char *a, char *s); +int ccmp(char a, char s); + +#endif diff --git a/2025.02.28/1Ex/Makefile b/2025.02.28/1Ex/Makefile new file mode 100644 index 0000000..859dbc6 --- /dev/null +++ b/2025.02.28/1Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a01.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a01.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/1Ex/a.txt b/2025.02.28/1Ex/a.txt new file mode 100644 index 0000000..8a1218a --- /dev/null +++ b/2025.02.28/1Ex/a.txt @@ -0,0 +1,5 @@ +1 +2 +3 +4 +5 diff --git a/2025.02.28/1Ex/array.c b/2025.02.28/1Ex/array.c new file mode 100644 index 0000000..616f68e --- /dev/null +++ b/2025.02.28/1Ex/array.c @@ -0,0 +1,61 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} diff --git a/2025.02.28/1Ex/array.h b/2025.02.28/1Ex/array.h new file mode 100644 index 0000000..c68d721 --- /dev/null +++ b/2025.02.28/1Ex/array.h @@ -0,0 +1,14 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); + +#endif diff --git a/2025.02.28/1Ex/io_status.h b/2025.02.28/1Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/1Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/1Ex/main.c b/2025.02.28/1Ex/main.c new file mode 100644 index 0000000..6c8e47f --- /dev/null +++ b/2025.02.28/1Ex/main.c @@ -0,0 +1,66 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./aout x c n p filename */ + int c, p, n, res, task = 1; + io_status ret; + char *name, *x, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 6 && sscanf(argv[2], "%d", &c) && sscanf(argv[3], "%d", &n) == 1 && sscanf(argv[4], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s x c n p name\n", argv[0]); + return 1; + } + x = argv[1]; + name = argv[5]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + res = t1_solve(a, n, x, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + + printf("%s : Task = %d Res = %d Elapsed = %.2f\n", argv[0], task, res, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/1Ex/solve.c b/2025.02.28/1Ex/solve.c new file mode 100644 index 0000000..466f73c --- /dev/null +++ b/2025.02.28/1Ex/solve.c @@ -0,0 +1,14 @@ +#include "solve.h" + +int t1_solve(char **a, int n, char *x, int (*cmp)(const char *, const char *)) { + int avg = (n + (-1)*(n%2)) / 2; + int comp; + + if (n == 0) return 0; + + comp = cmp(x, a[avg]); + if (comp < 0) return t1_solve(a, avg, x, cmp); + if (comp > 0) return avg+1 + t1_solve(a+avg+1, n-(avg+1), x, cmp); + else return avg; +} + diff --git a/2025.02.28/1Ex/solve.h b/2025.02.28/1Ex/solve.h new file mode 100644 index 0000000..9dc8792 --- /dev/null +++ b/2025.02.28/1Ex/solve.h @@ -0,0 +1,8 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +int t1_solve(char **a, int n, char *x, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/1Ex/sort.c b/2025.02.28/1Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/1Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/1Ex/sort.h b/2025.02.28/1Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/1Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/2Ex/Makefile b/2025.02.28/2Ex/Makefile new file mode 100644 index 0000000..ebc13fc --- /dev/null +++ b/2025.02.28/2Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a02.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a02.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/2Ex/a.txt b/2025.02.28/2Ex/a.txt new file mode 100644 index 0000000..b8836ca --- /dev/null +++ b/2025.02.28/2Ex/a.txt @@ -0,0 +1,4 @@ +alpha +beta +gamma +delta \ No newline at end of file diff --git a/2025.02.28/2Ex/array.c b/2025.02.28/2Ex/array.c new file mode 100644 index 0000000..5841914 --- /dev/null +++ b/2025.02.28/2Ex/array.c @@ -0,0 +1,73 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} diff --git a/2025.02.28/2Ex/array.h b/2025.02.28/2Ex/array.h new file mode 100644 index 0000000..a90dd77 --- /dev/null +++ b/2025.02.28/2Ex/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/2Ex/b.txt b/2025.02.28/2Ex/b.txt new file mode 100644 index 0000000..deea518 --- /dev/null +++ b/2025.02.28/2Ex/b.txt @@ -0,0 +1,5 @@ +alpha +beta +gamma +delta +epsilon \ No newline at end of file diff --git a/2025.02.28/2Ex/io_status.h b/2025.02.28/2Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/2Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/2Ex/main.c b/2025.02.28/2Ex/main.c new file mode 100644 index 0000000..a1eea09 --- /dev/null +++ b/2025.02.28/2Ex/main.c @@ -0,0 +1,120 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a02.out c n p_a filename_a m p_b filename_b */ + int c, p_a, n, p_b, m, diff, task = 2; + io_status ret; + char *name_a, *name_b, **arr_a, **arr_b, **arr_c; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 8 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p_a) == 1 && sscanf(argv[5], "%d", &m) && sscanf(argv[6], "%d",&p_b) && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p_a filename_a m p_b filename_b\n", argv[0]); + return 1; + } + name_a = argv[4]; + name_b = argv[7]; + cmp = f[c-1]; + + if (!(arr_a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + if (!(arr_b = (char **)malloc(m * sizeof(char *)))) + { + free(arr_a); + + printf("Not enough memory: \n"); + return 2; + } + if (!(arr_c = (char **)malloc((n+m) * sizeof(char *)))) + { + free(arr_a); + free(arr_b); + + printf("Not enough memory: \n"); + return 2; + } + + + ret = read_array(arr_a, n, name_a); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name_a); + break; + case ERROR_READ: + printf("Cannot read %s\n", name_a); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(arr_a); + free(arr_b); + free(arr_c); + return 3; + } while (0); + + ret = read_array(arr_b, m, name_b); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name_b); + break; + case ERROR_READ: + printf("Cannot read %s\n", name_b); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free_array(arr_a, n); + + free(arr_a); + free(arr_b); + free(arr_c); + return 3; + } while (0); + + print_array(arr_a, n, p_a); + printf("\n"); + print_array(arr_b, m, p_b); + + t = clock(); + t2_solve(arr_a, arr_b, arr_c, n, m, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(arr_c, n+m, cmp); + + printf("New array:\n"); + print_array(arr_c, n+m, p_a+p_b); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(arr_a, n); + free_array(arr_b, m); + + free(arr_a); + free(arr_b); + free(arr_c); + + return 0; +} diff --git a/2025.02.28/2Ex/solve.c b/2025.02.28/2Ex/solve.c new file mode 100644 index 0000000..a7a0130 --- /dev/null +++ b/2025.02.28/2Ex/solve.c @@ -0,0 +1,24 @@ +#include "solve.h" + +#include "array.h" + +void t2_solve(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)) +{ + int i, j, k, cntr, len = n + m; // cntr - contrast + for (i = 0, j = 0, k = 0; k < len; ++k) + { + if (i >= n) + { + arr_c[k] = arr_b[j++]; + } else if (j >= m) + { + arr_c[k] = arr_a[i++]; + } else + { + cntr = cmp(arr_a[i], arr_b[j]); + if (cntr <= 0) arr_c[k] = arr_a[i++]; + else arr_c[k] = arr_b[j++]; + } + } +} + diff --git a/2025.02.28/2Ex/solve.h b/2025.02.28/2Ex/solve.h new file mode 100644 index 0000000..ca5dca6 --- /dev/null +++ b/2025.02.28/2Ex/solve.h @@ -0,0 +1,9 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +void t2_solve(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/2Ex/sort.c b/2025.02.28/2Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/2Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/2Ex/sort.h b/2025.02.28/2Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/2Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/2Ex/test_cases.json b/2025.02.28/2Ex/test_cases.json new file mode 100644 index 0000000..5322614 --- /dev/null +++ b/2025.02.28/2Ex/test_cases.json @@ -0,0 +1,19 @@ +{ + "exe": "a02.exe", + "filename_a": "a.txt", + "filename_b": "b.txt", + "tests": [ + { + "c": 1, + "a": "1 2 3 4\n5 6 7 8", + "b": "9 10 11\n12 13 14", + "expected": "1 2 3 4 5 6 7 8 9 10 11 12 13 14" + }, + { + "c": 2, + "a": "10 20\n30 40 50", + "b": "15 25 35\n45 55", + "expected": "10 20 30 40 50 15 25 35 45 55" + } + ] +} diff --git a/2025.02.28/2Ex/test_runner.py b/2025.02.28/2Ex/test_runner.py new file mode 100644 index 0000000..6715556 --- /dev/null +++ b/2025.02.28/2Ex/test_runner.py @@ -0,0 +1,130 @@ +import json +import subprocess +import os +import time +import platform +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, c, a, b, expected): + self.c = c + self.a = a + self.b = b + self.expected = expected + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.filename_a = self.config["filename_a"] + self.filename_b = self.config["filename_b"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd): + """Runs a shell command and handles errors""" + result = subprocess.run(cmd, capture_output=True, text=True, shell=True) + return result + +def count_lines(filename): + """Counts the number of non-empty lines in a file""" + try: + with open(filename, "r", encoding="utf-8") as f: + return sum(1 for line in f if line.strip()) + except FileNotFoundError: + print(color_text(f"[ERROR] File {filename} not found.", Fore.RED)) + return 0 + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe = test_suite.exe + filename_a = test_suite.filename_a + filename_b = test_suite.filename_b + + # Write input arrays to files + with open(filename_a, "w", encoding="utf-8") as fa: + fa.write(test.a) + with open(filename_b, "w", encoding="utf-8") as fb: + fb.write(test.b) + + # Calculate n and m correctly + n = count_lines(filename_a) + m = count_lines(filename_b) + pa = n + pb = m + + # Debug output to check file contents + print(color_text(f"[DEBUG] a.txt content:\n{open(filename_a).read()}", Fore.CYAN)) + print(color_text(f"[DEBUG] b.txt content:\n{open(filename_b).read()}", Fore.CYAN)) + print(color_text(f"[DEBUG] Calculated n = {n}, m = {m}", Fore.CYAN)) + + # Ensure correct execution command on Windows + exe_cmd = exe if platform.system() == "Windows" else f"./{exe}" + + # Form command-line arguments as a list + cmd = [exe_cmd, str(test.c), str(n), str(pa), filename_a, str(m), str(pb), filename_b] + print(color_text(f"[DEBUG] Running command: {' '.join(cmd)}", Fore.CYAN)) + + # Run program + result = run_command(cmd) + if result.returncode != 0: + print(color_text(f"[ERROR] Test failed to execute: {' '.join(cmd)}", Fore.RED)) + print(color_text(f"[EXIT CODE]: {result.returncode}", Fore.YELLOW)) + print(color_text(f"[STDOUT]: {result.stdout}", Fore.YELLOW)) + print(color_text(f"[STDERR]: {result.stderr}", Fore.YELLOW)) + return + + # Extract relevant output + output_lines = result.stdout.split("\n") + try: + start_index = output_lines.index("New array:") + 1 + end_index = next(i for i, line in enumerate(output_lines) if "Task" in line) + output = "\n".join(output_lines[start_index:end_index]) + except (ValueError, IndexError): + print(color_text(f"[FAIL] Could not parse output correctly.", Fore.RED)) + return + + # Validate output + if output == test.expected: + print(color_text(f"[PASS] Test passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test failed.", Fore.RED)) + print(color_text(f"Expected:\n{test.expected}", Fore.YELLOW)) + print(color_text(f"Got:\n{output}", Fore.YELLOW)) + + # Cleanup files + for file in [filename_a, filename_b]: + try: + os.remove(file) + except FileNotFoundError: + print(color_text(f"[WARNING] Could not delete {file}, may be locked.", Fore.MAGENTA)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.MAGENTA)) + run_command(["make", "clean"]) + print(color_text("[BUILD] Compiling project...", Fore.MAGENTA)) + run_command(["make"]) + + test_suite = TestSuite("test_cases.json") + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.MAGENTA)) + run_command(["make", "clean"]) + +if __name__ == "__main__": + main() diff --git a/2025.02.28/3Ex/Makefile b/2025.02.28/3Ex/Makefile new file mode 100644 index 0000000..1bff8fe --- /dev/null +++ b/2025.02.28/3Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a03.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a03.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/3Ex/a.txt b/2025.02.28/3Ex/a.txt new file mode 100644 index 0000000..0646efc --- /dev/null +++ b/2025.02.28/3Ex/a.txt @@ -0,0 +1,4 @@ +same +one +one +same diff --git a/2025.02.28/3Ex/array.c b/2025.02.28/3Ex/array.c new file mode 100644 index 0000000..616f68e --- /dev/null +++ b/2025.02.28/3Ex/array.c @@ -0,0 +1,61 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} diff --git a/2025.02.28/3Ex/array.h b/2025.02.28/3Ex/array.h new file mode 100644 index 0000000..c68d721 --- /dev/null +++ b/2025.02.28/3Ex/array.h @@ -0,0 +1,14 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); + +#endif diff --git a/2025.02.28/3Ex/io_status.h b/2025.02.28/3Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/3Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/3Ex/main.c b/2025.02.28/3Ex/main.c new file mode 100644 index 0000000..c1aae34 --- /dev/null +++ b/2025.02.28/3Ex/main.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./aout x c n p filename */ + int c, p, n, res, task = 3; + io_status ret; + char *name, *x, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 6 && sscanf(argv[2], "%d", &c) && sscanf(argv[3], "%d", &n) == 1 && sscanf(argv[4], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s x c n p name\n", argv[0]); + return 1; + } + x = argv[1]; + name = argv[5]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + res = t3_solve(a, n, x, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Res = %d Elapsed = %.2f\n", argv[0], task, res, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/3Ex/solve.c b/2025.02.28/3Ex/solve.c new file mode 100644 index 0000000..6cdee26 --- /dev/null +++ b/2025.02.28/3Ex/solve.c @@ -0,0 +1,21 @@ +#include "solve.h" + +int t3_solve(char **a, int n, char *x, int (*cmp)(const char *, const char *)) { + int i = 0, j = n-1; + char *temp; + + while (1) + { + for (; i < n; i++) if (cmp(a[i], x) >= 0) break; + for (; j >= 0; j--) if (cmp(a[j], x) < 0) break; + + if (i >= j) break; + temp = a[i]; + a[i] = a[j]; + a[j] = temp; + + i++, j--; + } + + return i; +} diff --git a/2025.02.28/3Ex/solve.h b/2025.02.28/3Ex/solve.h new file mode 100644 index 0000000..f312d1f --- /dev/null +++ b/2025.02.28/3Ex/solve.h @@ -0,0 +1,8 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +int t3_solve(char **a, int n, char *x, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/3Ex/sort.c b/2025.02.28/3Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/3Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/3Ex/sort.h b/2025.02.28/3Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/3Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/3Ex/test_cases.json b/2025.02.28/3Ex/test_cases.json new file mode 100644 index 0000000..d682b9a --- /dev/null +++ b/2025.02.28/3Ex/test_cases.json @@ -0,0 +1,110 @@ +{ + "exe": "a03.exe", + "filename": "input.txt", + "tests": [ + { + "name": "Basic Sorting Test", + "x": "5", + "c": 1, + "text": "9\n8\n7\n6\n5\n4\n3\n2\n1\n0", + "expected": "0\n1\n2\n3\n4\n5\n6\n7\n8\n9", + "res": 5 + }, + { + "name": "Insert at Start (Should not change order)", + "x": "aaa", + "c": 1, + "text": "bbb\nccc\nddd\neee", + "expected": "bbb\nccc\nddd\neee", + "res": 0 + }, + { + "name": "Insert at End (Should not change order)", + "x": "zzz", + "c": 1, + "text": "aaa\nbbb\nccc\nddd", + "expected": "aaa\nbbb\nccc\nddd", + "res": 4 + }, + { + "name": "Insert in Middle", + "x": "mmm", + "c": 1, + "text": "aaa\njjj\nnnn\nzzz", + "expected": "aaa\njjj\nnnn\nzzz", + "res": 2 + }, + { + "name": "Already Present", + "x": "hello", + "c": 1, + "text": "apple\nbanana\nhello\norange\ntiger", + "expected": "apple\nbanana\nhello\norange\ntiger", + "res": 2 + }, + { + "name": "Reverse Order", + "x": "h", + "c": 2, + "text": "z\ny\nx\nw\nv\nu\nt\ns\nr\nq\np", + "expected": "z\ny\nx\nw\nv\nu\nt\ns\nr\nq\np", + "res": 11 + }, + { + "name": "Equal Length Sorting", + "x": "abc", + "c": 3, + "text": "x\ny\nz\napple\nbanana\ncoconut", + "expected": "x\ny\nz\napple\nbanana\ncoconut", + "res": 3 + }, + { + "name": "All Same Elements", + "x": "same", + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame", + "res": 0 + }, + { + "name": "Similar Elements", + "x": "one", + "c": 1, + "text": "same\none\none\nsame", + "expected": "same\none\none\nsame", + "res": 0 + }, + { + "name": "Insert in Empty List", + "x": "new", + "c": 1, + "text": "", + "expected": "", + "res": 1 + }, + { + "name": "Insert Before Larger Values", + "x": "mid", + "c": 1, + "text": "zeta\nzulu", + "expected": "zeta\nzulu", + "res": 0 + }, + { + "name": "Insert After Smaller Values", + "x": "mid", + "c": 1, + "text": "alpha\nbeta", + "expected": "alpha\nbeta", + "res": 2 + }, + { + "name": "Sorting Numbers as Strings", + "x": "5", + "c": 1, + "text": "10\n20\n30\n40", + "expected": "10\n20\n30\n40", + "res": 4 + } + ] +} diff --git a/2025.02.28/3Ex/test_runner.py b/2025.02.28/3Ex/test_runner.py new file mode 100644 index 0000000..754392d --- /dev/null +++ b/2025.02.28/3Ex/test_runner.py @@ -0,0 +1,156 @@ +import json +import subprocess +import os +import time +import platform +import re +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, x, c, text, expected, res, p=None, debug=False, name=None): + self.x = x + self.c = c + self.text = text + self.expected = expected + self.res = res + self.p = p + self.debug = debug + self.name = name if name else str(c) # Используем c, если name отсутствует + + def get_num_lines(self): + """Returns the number of lines in the input text (n)""" + return self.text.count("\n") + 1 # +1, чтобы учесть последнюю строку + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.filename = self.config["filename"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def parse_sorted_output(output): + """Extracts the second print_array output from program output""" + parts = output.split("New array:\n") + if len(parts) > 1: + sorted_array = parts[1].strip().split("\n") + sorted_array = sorted_array[:-1] # Убираем последнюю строку (Task = ... Res = ... Elapsed = ...) + return "\n".join(sorted_array) + return "" + +def check_res(output, expected_res): + """Checks if Res matches expected value""" + match = re.search(r"Res\s*=\s*(-?\d+)", output) + if match: + res_value = int(match.group(1)) + if res_value != expected_res: + print(color_text(f"[FAIL] Test failed: Res = {res_value} (expected {expected_res})", Fore.RED)) + return False + return True + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, filename = test_suite.exe, test_suite.filename + n = test.get_num_lines() # Auto-count lines in input + p = test.p if test.p is not None else n # Default p = n + + # Write input data to a file (Ensure last line has \n) + with open(filename, "w", encoding="utf-8") as f: + text = test.text.rstrip() + "\n" # Если нет \n в конце, добавляем + f.write(text) + + # Windows fix: remove './' for executables + cmd = [exe, test.x, str(test.c), str(n), str(p), filename] + if test.debug: + cmd.append("DEBUG") + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.name}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.name}' should have failed but did not.", Fore.RED)) + return + + # Extract sorted array output + sorted_output = parse_sorted_output(result.stdout) if result else None + + # Check Res value + if not check_res(result.stdout, test.res): + return + + # Check result + if sorted_output == test.expected: + print(color_text(f"[PASS] Test '{test.name}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.name}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{sorted_output}") + if test.debug: + print(color_text("[DEBUG] Full Program Output:", Fore.YELLOW)) + print(result.stdout) + + # Cleanup test files + try: + os.remove(filename) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {filename}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.28/4Ex/Makefile b/2025.02.28/4Ex/Makefile new file mode 100644 index 0000000..217960a --- /dev/null +++ b/2025.02.28/4Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a04.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a04.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/4Ex/a.txt b/2025.02.28/4Ex/a.txt new file mode 100644 index 0000000..ece7a82 --- /dev/null +++ b/2025.02.28/4Ex/a.txt @@ -0,0 +1,4 @@ + apple +banana + cherry +date diff --git a/2025.02.28/4Ex/array.c b/2025.02.28/4Ex/array.c new file mode 100644 index 0000000..5841914 --- /dev/null +++ b/2025.02.28/4Ex/array.c @@ -0,0 +1,73 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} diff --git a/2025.02.28/4Ex/array.h b/2025.02.28/4Ex/array.h new file mode 100644 index 0000000..a90dd77 --- /dev/null +++ b/2025.02.28/4Ex/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/4Ex/io_status.h b/2025.02.28/4Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/4Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/4Ex/main.c b/2025.02.28/4Ex/main.c new file mode 100644 index 0000000..bc0aa48 --- /dev/null +++ b/2025.02.28/4Ex/main.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a04.out c n p filename */ + int c, n, p, diff, task = 4; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t4_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/4Ex/solve.c b/2025.02.28/4Ex/solve.c new file mode 100644 index 0000000..987d4ab --- /dev/null +++ b/2025.02.28/4Ex/solve.c @@ -0,0 +1,20 @@ +#include "solve.h" + +void t4_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + char *temp; + int i, j; + for (i=n; i > 0; --i) + { + for (j=0; j < i-1; ++j) + { + if (cmp(a[j], a[j+1]) >= 0) + { + temp = a[j]; + a[j] = a[j+1]; + a[j+1] = temp; + } + } + } +} + diff --git a/2025.02.28/4Ex/solve.h b/2025.02.28/4Ex/solve.h new file mode 100644 index 0000000..122e950 --- /dev/null +++ b/2025.02.28/4Ex/solve.h @@ -0,0 +1,8 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +void t4_solve(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/4Ex/sort.c b/2025.02.28/4Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/4Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/4Ex/sort.h b/2025.02.28/4Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/4Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/4Ex/test_cases.json b/2025.02.28/4Ex/test_cases.json new file mode 100644 index 0000000..56c66a2 --- /dev/null +++ b/2025.02.28/4Ex/test_cases.json @@ -0,0 +1,76 @@ +{ + "exe": "a04.exe", + "filename": "input.txt", + "tests": [ + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" +}, +{ + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" +}, +{ + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" +}, +{ + "c": 1, + "text": "", + "expected": "" +}, +{ + "c": 1, + "text": "onlyone", + "expected": "onlyone" +}, +{ + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" +}, +{ + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" +}, +{ + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" +}, +{ + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" +}, +{ + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" +}, +{ + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" +} + ] +} diff --git a/2025.02.28/4Ex/test_runner.py b/2025.02.28/4Ex/test_runner.py new file mode 100644 index 0000000..5dbc484 --- /dev/null +++ b/2025.02.28/4Ex/test_runner.py @@ -0,0 +1,153 @@ +import json +import subprocess +import os +import time +import platform +import re +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, c, text, expected, p=None, debug=False): + self.c = c + self.text = text + self.expected = expected + self.p = p + self.debug = debug + + def get_num_lines(self): + """Returns the number of lines in the input text (n)""" + return self.text.count("\n") + 1 # +1, чтобы учесть последнюю строку + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.filename = self.config["filename"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def parse_sorted_output(output): + """Extracts the second print_array output from program output""" + parts = output.split("New array:\n") + if len(parts) > 1: + sorted_array = parts[1].rstrip().split("\n") + sorted_array = sorted_array[:-1] # Убираем последнюю строку (Task = ... Diff = ... Elapsed = ...) + return "\n".join(sorted_array) + return "" + +def check_diff(output): + """Checks if Diff != 0 in the program output""" + match = re.search(r"Diff\s*=\s*(\d+)", output) + if match: + diff_value = int(match.group(1)) + if diff_value != 0: + print(color_text(f"[FAIL] Test failed: Diff = {diff_value} (expected 0)", Fore.RED)) + return False + return True + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, filename = test_suite.exe, test_suite.filename + n = test.get_num_lines() # Auto-count lines in input + p = test.p if test.p is not None else n # Default p = n + + # Write input data to a file (Ensure last line has \n) + with open(filename, "w", encoding="utf-8") as f: + text = test.text.rstrip() + "\n" # Если нет \n в конце, добавляем + f.write(text) + + # Windows fix: remove './' for executables + cmd = [exe, str(test.c), str(n), str(p), filename] + if test.debug: + cmd.append("DEBUG") + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.c}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' should have failed but did not.", Fore.RED)) + return + + # Extract sorted array output + sorted_output = parse_sorted_output(result.stdout) if result else None + + # Check Diff value + if not check_diff(result.stdout): + return + + # Check result + if sorted_output == test.expected: + print(color_text(f"[PASS] Test '{test.c}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{sorted_output}") + if test.debug: + print(color_text("[DEBUG] Full Program Output:", Fore.YELLOW)) + print(result.stdout) + + # Cleanup test files + try: + os.remove(filename) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {filename}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.28/5Ex/Makefile b/2025.02.28/5Ex/Makefile new file mode 100644 index 0000000..b01b1b5 --- /dev/null +++ b/2025.02.28/5Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a05.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a05.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/5Ex/a.txt b/2025.02.28/5Ex/a.txt new file mode 100644 index 0000000..ece7a82 --- /dev/null +++ b/2025.02.28/5Ex/a.txt @@ -0,0 +1,4 @@ + apple +banana + cherry +date diff --git a/2025.02.28/5Ex/array.c b/2025.02.28/5Ex/array.c new file mode 100644 index 0000000..5841914 --- /dev/null +++ b/2025.02.28/5Ex/array.c @@ -0,0 +1,73 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} diff --git a/2025.02.28/5Ex/array.h b/2025.02.28/5Ex/array.h new file mode 100644 index 0000000..a90dd77 --- /dev/null +++ b/2025.02.28/5Ex/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/5Ex/io_status.h b/2025.02.28/5Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/5Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/5Ex/main.c b/2025.02.28/5Ex/main.c new file mode 100644 index 0000000..964130e --- /dev/null +++ b/2025.02.28/5Ex/main.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a05.out c n p filename */ + int c, n, p, diff, task = 5; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t5_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/5Ex/solve.c b/2025.02.28/5Ex/solve.c new file mode 100644 index 0000000..720e9c1 --- /dev/null +++ b/2025.02.28/5Ex/solve.c @@ -0,0 +1,28 @@ +#include "solve.h" + +void t5_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + char *temp; + size_t size_c = sizeof(char); + int i, min; + for (i=0; i < n-1; ++i) + { + min = minimum(a+i*size_c, n-i, cmp)+i; + temp = a[min]; + a[min] = a[i]; + a[i] = temp; + } +} + +int minimum(char **a, int n, int (*cmp)(const char *, const char *)) +{ + int i, min=0; + if (n <= 0) return 0; + for (i = 1; i < n; ++i) + { + if (cmp(a[min], a[i]) > 0) min = i; + } + + return min; +} + diff --git a/2025.02.28/5Ex/solve.h b/2025.02.28/5Ex/solve.h new file mode 100644 index 0000000..d9d649e --- /dev/null +++ b/2025.02.28/5Ex/solve.h @@ -0,0 +1,9 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +void t5_solve(char **a, int n, int (*cmp)(const char *, const char *)); +int minimum(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/5Ex/sort.c b/2025.02.28/5Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/5Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/5Ex/sort.h b/2025.02.28/5Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/5Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/5Ex/test_cases.json b/2025.02.28/5Ex/test_cases.json new file mode 100644 index 0000000..0346994 --- /dev/null +++ b/2025.02.28/5Ex/test_cases.json @@ -0,0 +1,231 @@ +{ + "exe": "a05.exe", + "filename": "input.txt", + "tests": [ + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" +}, +{ + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" +}, +{ + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" +}, +{ + "c": 1, + "text": "", + "expected": "" +}, +{ + "c": 1, + "text": "onlyone", + "expected": "onlyone" +}, +{ + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" +}, +{ + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" +}, +{ + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" +}, +{ + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" +}, +{ + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" +}, +{ + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" +}, + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" + }, + { + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" + }, + { + "c": 1, + "text": "", + "expected": "" + }, + { + "c": 1, + "text": "onlyone", + "expected": "onlyone" + }, + { + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" + }, + { + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" + }, + { + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" + }, + { + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" + }, + { + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" + }, + { + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" + }, + { + "c": 2, + "text": "zoo\napple\nbanana\ncherry", + "expected": "zoo\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "abcd\na\nabcdef\nabc", + "expected": "a\nabc\nabcd\nabcdef" + }, + { + "c": 4, + "text": "abcd\na\nabcdef\nabc", + "expected": "abcdef\nabcd\nabc\na" + }, + { + "c": 3, + "text": "12345\n1234\n123\n12\n1", + "expected": "1\n12\n123\n1234\n12345" + }, + { + "c": 4, + "text": "12345\n1234\n123\n12\n1", + "expected": "12345\n1234\n123\n12\n1" + }, + { + "c": 1, + "text": "hello\nHELLO\nhElLo\nHeLLo", + "expected": "HELLO\nHeLLo\nhElLo\nhello" + }, + { + "c": 1, + "text": "A\nB\nC\nD\nE", + "expected": "A\nB\nC\nD\nE" + }, + { + "c": 2, + "text": "A\nB\nC\nD\nE", + "expected": "E\nD\nC\nB\nA" + }, + { + "c": 3, + "text": "aaa\nbb\nc", + "expected": "c\nbb\naaa" + }, + { + "c": 4, + "text": "aaa\nbb\nc", + "expected": "aaa\nbb\nc" + }, + { + "c": 1, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 4, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 2, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "3\n1\n4\n1\n5\n9\n2\n6\n5\n3", + "expected": "1\n1\n2\n3\n3\n4\n5\n5\n6\n9" + }, + { + "c": 3, + "text": "hello\nworld\nhi\ncode", + "expected": "hi\ncode\nhello\nworld" + }, + { + "c": 4, + "text": "hello\nworld\nhi\ncode", + "expected": "world\nhello\ncode\nhi" + } + ] +} diff --git a/2025.02.28/5Ex/test_runner.py b/2025.02.28/5Ex/test_runner.py new file mode 100644 index 0000000..30ed462 --- /dev/null +++ b/2025.02.28/5Ex/test_runner.py @@ -0,0 +1,138 @@ +import json +import subprocess +import os +import time +import platform +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, c, text, expected, p=None, debug=False): + self.c = c + self.text = text + self.expected = expected + self.p = p + self.debug = debug + + def get_num_lines(self): + """Returns the number of lines in the input text (n)""" + return self.text.count("\n") + 1 # +1, чтобы учесть последнюю строку + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.filename = self.config["filename"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def parse_sorted_output(output): + """Extracts the second print_array output from program output""" + parts = output.split("New array:\n") + if len(parts) > 1: + sorted_array = parts[1].rstrip().split("\n") + sorted_array = sorted_array[:-1] # Убираем последнюю строку (Task = ... Diff = ... Elapsed = ...) + return "\n".join(sorted_array) + return "" + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, filename = test_suite.exe, test_suite.filename + n = test.get_num_lines() # Auto-count lines in input + p = test.p if test.p is not None else n # Default p = n + + # Write input data to a file (Ensure last line has \n) + with open(filename, "w", encoding="utf-8") as f: + text = test.text.rstrip() + "\n" # Если нет \n в конце, добавляем + f.write(text) + + # Windows fix: remove './' for executables + cmd = [exe, str(test.c), str(n), str(p), filename] + if test.debug: + cmd.append("DEBUG") + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.c}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' should have failed but did not.", Fore.RED)) + return + + # Extract sorted array output + sorted_output = parse_sorted_output(result.stdout) if result else None + + # Check result + if sorted_output == test.expected: + print(color_text(f"[PASS] Test '{test.c}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{sorted_output}") + if test.debug: + print(color_text("[DEBUG] Full Program Output:", Fore.YELLOW)) + print(result.stdout) + + # Cleanup test files + try: + os.remove(filename) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {filename}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.28/6Ex/Makefile b/2025.02.28/6Ex/Makefile new file mode 100644 index 0000000..a156fa5 --- /dev/null +++ b/2025.02.28/6Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a06.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a06.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/6Ex/a.txt b/2025.02.28/6Ex/a.txt new file mode 100644 index 0000000..ece7a82 --- /dev/null +++ b/2025.02.28/6Ex/a.txt @@ -0,0 +1,4 @@ + apple +banana + cherry +date diff --git a/2025.02.28/6Ex/array.c b/2025.02.28/6Ex/array.c new file mode 100644 index 0000000..5841914 --- /dev/null +++ b/2025.02.28/6Ex/array.c @@ -0,0 +1,73 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} diff --git a/2025.02.28/6Ex/array.h b/2025.02.28/6Ex/array.h new file mode 100644 index 0000000..a90dd77 --- /dev/null +++ b/2025.02.28/6Ex/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/6Ex/io_status.h b/2025.02.28/6Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/6Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/6Ex/main.c b/2025.02.28/6Ex/main.c new file mode 100644 index 0000000..cdf1dad --- /dev/null +++ b/2025.02.28/6Ex/main.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a06.out c n p filename */ + int c, n, p, diff, task = 6; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t6_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/6Ex/solve.c b/2025.02.28/6Ex/solve.c new file mode 100644 index 0000000..9830e08 --- /dev/null +++ b/2025.02.28/6Ex/solve.c @@ -0,0 +1,21 @@ +#include "solve.h" + +void t6_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + int i; + for (i = 1; i < n; ++i) append(a, i+1, a[i], find(a, i, a[i], cmp)); +} + +int find(char **arr, int n, char *a, int (*cmp)(const char *, const char *)) +{ + int i; + for (i=0; i index; --i) arr[i] = arr[i-1]; + arr[index] = a; +} + diff --git a/2025.02.28/6Ex/solve.h b/2025.02.28/6Ex/solve.h new file mode 100644 index 0000000..a716162 --- /dev/null +++ b/2025.02.28/6Ex/solve.h @@ -0,0 +1,10 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +void t6_solve(char **a, int n, int (*cmp)(const char *, const char *)); +int find(char **arr, int n, char *a, int (*cmp)(const char *, const char *)); +void append(char **arr, int n, char *a, int index); + +#endif diff --git a/2025.02.28/6Ex/sort.c b/2025.02.28/6Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/6Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/6Ex/sort.h b/2025.02.28/6Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/6Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/6Ex/test_cases.json b/2025.02.28/6Ex/test_cases.json new file mode 100644 index 0000000..491dca7 --- /dev/null +++ b/2025.02.28/6Ex/test_cases.json @@ -0,0 +1,231 @@ +{ + "exe": "a06.exe", + "filename": "input.txt", + "tests": [ + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" +}, +{ + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" +}, +{ + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" +}, +{ + "c": 1, + "text": "", + "expected": "" +}, +{ + "c": 1, + "text": "onlyone", + "expected": "onlyone" +}, +{ + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" +}, +{ + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" +}, +{ + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" +}, +{ + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" +}, +{ + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" +}, +{ + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" +}, + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" + }, + { + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" + }, + { + "c": 1, + "text": "", + "expected": "" + }, + { + "c": 1, + "text": "onlyone", + "expected": "onlyone" + }, + { + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" + }, + { + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" + }, + { + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" + }, + { + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" + }, + { + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" + }, + { + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" + }, + { + "c": 2, + "text": "zoo\napple\nbanana\ncherry", + "expected": "zoo\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "abcd\na\nabcdef\nabc", + "expected": "a\nabc\nabcd\nabcdef" + }, + { + "c": 4, + "text": "abcd\na\nabcdef\nabc", + "expected": "abcdef\nabcd\nabc\na" + }, + { + "c": 3, + "text": "12345\n1234\n123\n12\n1", + "expected": "1\n12\n123\n1234\n12345" + }, + { + "c": 4, + "text": "12345\n1234\n123\n12\n1", + "expected": "12345\n1234\n123\n12\n1" + }, + { + "c": 1, + "text": "hello\nHELLO\nhElLo\nHeLLo", + "expected": "HELLO\nHeLLo\nhElLo\nhello" + }, + { + "c": 1, + "text": "A\nB\nC\nD\nE", + "expected": "A\nB\nC\nD\nE" + }, + { + "c": 2, + "text": "A\nB\nC\nD\nE", + "expected": "E\nD\nC\nB\nA" + }, + { + "c": 3, + "text": "aaa\nbb\nc", + "expected": "c\nbb\naaa" + }, + { + "c": 4, + "text": "aaa\nbb\nc", + "expected": "aaa\nbb\nc" + }, + { + "c": 1, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 4, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 2, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "3\n1\n4\n1\n5\n9\n2\n6\n5\n3", + "expected": "1\n1\n2\n3\n3\n4\n5\n5\n6\n9" + }, + { + "c": 3, + "text": "hello\nworld\nhi\ncode", + "expected": "hi\ncode\nhello\nworld" + }, + { + "c": 4, + "text": "hello\nworld\nhi\ncode", + "expected": "world\nhello\ncode\nhi" + } + ] +} diff --git a/2025.02.28/6Ex/test_runner.py b/2025.02.28/6Ex/test_runner.py new file mode 100644 index 0000000..30ed462 --- /dev/null +++ b/2025.02.28/6Ex/test_runner.py @@ -0,0 +1,138 @@ +import json +import subprocess +import os +import time +import platform +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, c, text, expected, p=None, debug=False): + self.c = c + self.text = text + self.expected = expected + self.p = p + self.debug = debug + + def get_num_lines(self): + """Returns the number of lines in the input text (n)""" + return self.text.count("\n") + 1 # +1, чтобы учесть последнюю строку + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.filename = self.config["filename"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def parse_sorted_output(output): + """Extracts the second print_array output from program output""" + parts = output.split("New array:\n") + if len(parts) > 1: + sorted_array = parts[1].rstrip().split("\n") + sorted_array = sorted_array[:-1] # Убираем последнюю строку (Task = ... Diff = ... Elapsed = ...) + return "\n".join(sorted_array) + return "" + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, filename = test_suite.exe, test_suite.filename + n = test.get_num_lines() # Auto-count lines in input + p = test.p if test.p is not None else n # Default p = n + + # Write input data to a file (Ensure last line has \n) + with open(filename, "w", encoding="utf-8") as f: + text = test.text.rstrip() + "\n" # Если нет \n в конце, добавляем + f.write(text) + + # Windows fix: remove './' for executables + cmd = [exe, str(test.c), str(n), str(p), filename] + if test.debug: + cmd.append("DEBUG") + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.c}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' should have failed but did not.", Fore.RED)) + return + + # Extract sorted array output + sorted_output = parse_sorted_output(result.stdout) if result else None + + # Check result + if sorted_output == test.expected: + print(color_text(f"[PASS] Test '{test.c}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{sorted_output}") + if test.debug: + print(color_text("[DEBUG] Full Program Output:", Fore.YELLOW)) + print(result.stdout) + + # Cleanup test files + try: + os.remove(filename) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {filename}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.28/7Ex/Makefile b/2025.02.28/7Ex/Makefile new file mode 100644 index 0000000..edeec68 --- /dev/null +++ b/2025.02.28/7Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a07.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a07.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/7Ex/a.txt b/2025.02.28/7Ex/a.txt new file mode 100644 index 0000000..15a1d5a --- /dev/null +++ b/2025.02.28/7Ex/a.txt @@ -0,0 +1,8 @@ +zzzzzzzz +zzzzzzz +zzzzzz +zzzzz +zzzz +zzz +zz +z diff --git a/2025.02.28/7Ex/array.c b/2025.02.28/7Ex/array.c new file mode 100644 index 0000000..5841914 --- /dev/null +++ b/2025.02.28/7Ex/array.c @@ -0,0 +1,73 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} diff --git a/2025.02.28/7Ex/array.h b/2025.02.28/7Ex/array.h new file mode 100644 index 0000000..a90dd77 --- /dev/null +++ b/2025.02.28/7Ex/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/7Ex/io_status.h b/2025.02.28/7Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/7Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/7Ex/main.c b/2025.02.28/7Ex/main.c new file mode 100644 index 0000000..a5ea454 --- /dev/null +++ b/2025.02.28/7Ex/main.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a07.out c n p filename */ + int c, n, p, diff, task = 7; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t7_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/7Ex/solve.c b/2025.02.28/7Ex/solve.c new file mode 100644 index 0000000..0d0190c --- /dev/null +++ b/2025.02.28/7Ex/solve.c @@ -0,0 +1,25 @@ +#include "solve.h" + +void t7_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + int i; + for (i = 1; i < n; ++i) append(a, i+1, a[i], find(a, i, a[i], cmp)); +} + +int find(char **a, int n, char *x, int (*cmp)(const char *, const char *)) { + int avg = (n + (-1)*(n%2)) / 2; + int comp; + + if (n == 0) return 0; + + comp = cmp(x, a[avg]); + if (comp < 0) return find(a, avg, x, cmp); + if (comp > 0) return avg+1 + find(a+(avg+1), n-(avg+1), x, cmp); + else return avg; +} + +void append(char **arr, int n, char *a, int index) +{ + for (int i = n-1; i > index; --i) arr[i] = arr[i-1]; + arr[index] = a; +} diff --git a/2025.02.28/7Ex/solve.h b/2025.02.28/7Ex/solve.h new file mode 100644 index 0000000..5d0f991 --- /dev/null +++ b/2025.02.28/7Ex/solve.h @@ -0,0 +1,10 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +void t7_solve(char **a, int n, int (*cmp)(const char *, const char *)); +int find(char **arr, int n, char *a, int (*cmp)(const char *, const char *)); +void append(char **arr, int n, char *a, int index); + +#endif diff --git a/2025.02.28/7Ex/sort.c b/2025.02.28/7Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/7Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/7Ex/sort.h b/2025.02.28/7Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/7Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/7Ex/test_cases.json b/2025.02.28/7Ex/test_cases.json new file mode 100644 index 0000000..fbdf85f --- /dev/null +++ b/2025.02.28/7Ex/test_cases.json @@ -0,0 +1,231 @@ +{ + "exe": "a07.exe", + "filename": "input.txt", + "tests": [ + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" +}, +{ + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" +}, +{ + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" +}, +{ + "c": 1, + "text": "", + "expected": "" +}, +{ + "c": 1, + "text": "onlyone", + "expected": "onlyone" +}, +{ + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" +}, +{ + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" +}, +{ + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" +}, +{ + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" +}, +{ + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" +}, +{ + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" +}, + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" + }, + { + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" + }, + { + "c": 1, + "text": "", + "expected": "" + }, + { + "c": 1, + "text": "onlyone", + "expected": "onlyone" + }, + { + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" + }, + { + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" + }, + { + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" + }, + { + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" + }, + { + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" + }, + { + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" + }, + { + "c": 2, + "text": "zoo\napple\nbanana\ncherry", + "expected": "zoo\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "abcd\na\nabcdef\nabc", + "expected": "a\nabc\nabcd\nabcdef" + }, + { + "c": 4, + "text": "abcd\na\nabcdef\nabc", + "expected": "abcdef\nabcd\nabc\na" + }, + { + "c": 3, + "text": "12345\n1234\n123\n12\n1", + "expected": "1\n12\n123\n1234\n12345" + }, + { + "c": 4, + "text": "12345\n1234\n123\n12\n1", + "expected": "12345\n1234\n123\n12\n1" + }, + { + "c": 1, + "text": "hello\nHELLO\nhElLo\nHeLLo", + "expected": "HELLO\nHeLLo\nhElLo\nhello" + }, + { + "c": 1, + "text": "A\nB\nC\nD\nE", + "expected": "A\nB\nC\nD\nE" + }, + { + "c": 2, + "text": "A\nB\nC\nD\nE", + "expected": "E\nD\nC\nB\nA" + }, + { + "c": 3, + "text": "aaa\nbb\nc", + "expected": "c\nbb\naaa" + }, + { + "c": 4, + "text": "aaa\nbb\nc", + "expected": "aaa\nbb\nc" + }, + { + "c": 1, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 4, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 2, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "3\n1\n4\n1\n5\n9\n2\n6\n5\n3", + "expected": "1\n1\n2\n3\n3\n4\n5\n5\n6\n9" + }, + { + "c": 3, + "text": "hello\nworld\nhi\ncode", + "expected": "hi\ncode\nhello\nworld" + }, + { + "c": 4, + "text": "hello\nworld\nhi\ncode", + "expected": "world\nhello\ncode\nhi" + } + ] +} diff --git a/2025.02.28/7Ex/test_runner.py b/2025.02.28/7Ex/test_runner.py new file mode 100644 index 0000000..30ed462 --- /dev/null +++ b/2025.02.28/7Ex/test_runner.py @@ -0,0 +1,138 @@ +import json +import subprocess +import os +import time +import platform +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, c, text, expected, p=None, debug=False): + self.c = c + self.text = text + self.expected = expected + self.p = p + self.debug = debug + + def get_num_lines(self): + """Returns the number of lines in the input text (n)""" + return self.text.count("\n") + 1 # +1, чтобы учесть последнюю строку + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.filename = self.config["filename"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def parse_sorted_output(output): + """Extracts the second print_array output from program output""" + parts = output.split("New array:\n") + if len(parts) > 1: + sorted_array = parts[1].rstrip().split("\n") + sorted_array = sorted_array[:-1] # Убираем последнюю строку (Task = ... Diff = ... Elapsed = ...) + return "\n".join(sorted_array) + return "" + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, filename = test_suite.exe, test_suite.filename + n = test.get_num_lines() # Auto-count lines in input + p = test.p if test.p is not None else n # Default p = n + + # Write input data to a file (Ensure last line has \n) + with open(filename, "w", encoding="utf-8") as f: + text = test.text.rstrip() + "\n" # Если нет \n в конце, добавляем + f.write(text) + + # Windows fix: remove './' for executables + cmd = [exe, str(test.c), str(n), str(p), filename] + if test.debug: + cmd.append("DEBUG") + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.c}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' should have failed but did not.", Fore.RED)) + return + + # Extract sorted array output + sorted_output = parse_sorted_output(result.stdout) if result else None + + # Check result + if sorted_output == test.expected: + print(color_text(f"[PASS] Test '{test.c}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{sorted_output}") + if test.debug: + print(color_text("[DEBUG] Full Program Output:", Fore.YELLOW)) + print(result.stdout) + + # Cleanup test files + try: + os.remove(filename) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {filename}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.28/8Ex/' b/2025.02.28/8Ex/' new file mode 100644 index 0000000..8914634 --- /dev/null +++ b/2025.02.28/8Ex/' @@ -0,0 +1,47 @@ +#include "solve.h" + +#include "array.h" + +void t8_solve(char **a, char **b, int n, int (*cmp)(const char *, const char *)) +{ + int i = 2, j, margin; + do { + int hf_i = i/2; + for (j = 0; j < n; j += i) + { + if (n < j+i) + { + margin = n-(j+hf_i); + if (margin <= 0) break; + } else margin = hf_i; + + unite(a+j, a+(j+hf_i), b, hf_i, margin, cmp); + for (int k = 0; k < hf_i+margin; k++) a[i+j] = b[i]; + } + + printf("\ni: %d:\n", i); + print_array(a, n, n); + i *= 2; + } while (i < n); +} + +void unite(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)) +{ + int i, j, k, cntr, len = n + m; // cntr - contrast + for (i = 0, j = 0, k = 0; k < len; ++k) + { + if (i >= n) + { + arr_c[k] = arr_b[j++]; + } else if (j >= m) + { + arr_c[k] = arr_a[i++]; + } else + { + cntr = cmp(arr_a[i], arr_b[j]); + if (cntr <= 0) arr_c[k] = arr_a[i++]; + else arr_c[k] = arr_b[j++]; + } + } +} + diff --git a/2025.02.28/8Ex/Makefile b/2025.02.28/8Ex/Makefile new file mode 100644 index 0000000..f31a9c0 --- /dev/null +++ b/2025.02.28/8Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a08.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a08.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/8Ex/a.txt b/2025.02.28/8Ex/a.txt new file mode 100644 index 0000000..abb8f77 --- /dev/null +++ b/2025.02.28/8Ex/a.txt @@ -0,0 +1,9 @@ +9 +8 +7 +6 +5 +4 +3 +2 +1 diff --git a/2025.02.28/8Ex/array.c b/2025.02.28/8Ex/array.c new file mode 100644 index 0000000..5841914 --- /dev/null +++ b/2025.02.28/8Ex/array.c @@ -0,0 +1,73 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} diff --git a/2025.02.28/8Ex/array.h b/2025.02.28/8Ex/array.h new file mode 100644 index 0000000..a90dd77 --- /dev/null +++ b/2025.02.28/8Ex/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/8Ex/io_status.h b/2025.02.28/8Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/8Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/8Ex/main.c b/2025.02.28/8Ex/main.c new file mode 100644 index 0000000..988280c --- /dev/null +++ b/2025.02.28/8Ex/main.c @@ -0,0 +1,76 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a08.out c n p filename */ + int c, n, p, diff, task = 8; + io_status ret; + char *name, **a, **b; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } if (!(b = (char **)malloc(n * sizeof(char *)))) + { + + free(a); + printf("Not enough memory: \n"); + return 2; + } + memset(b, 0, (n * sizeof(char *))); + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t8_solve(a, b, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + free(b); + + return 0; +} diff --git a/2025.02.28/8Ex/solve.c b/2025.02.28/8Ex/solve.c new file mode 100644 index 0000000..7100cf7 --- /dev/null +++ b/2025.02.28/8Ex/solve.c @@ -0,0 +1,43 @@ +#include "solve.h" + +void t8_solve(char **a, char **b, int n, int (*cmp)(const char *, const char *)) +{ + int i = 2, j, margin; + do { + int hf_i = i/2; + for (j = 0; j < n; j += i) + { + if (n < j+i) + { + margin = n-(j+hf_i); + if (margin <= 0) break; + } else margin = hf_i; + + unite(a+j, a+(j+hf_i), b, hf_i, margin, cmp); + for (int k = 0; k < hf_i+margin; k++) a[j+k] = b[k]; + } + + i *= 2; + } while (i < n*2); +} + +void unite(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)) +{ + int i, j, k, cntr, len = n + m; // cntr - contrast + for (i = 0, j = 0, k = 0; k < len; ++k) + { + if (i >= n) + { + arr_c[k] = arr_b[j++]; + } else if (j >= m) + { + arr_c[k] = arr_a[i++]; + } else + { + cntr = cmp(arr_a[i], arr_b[j]); + if (cntr <= 0) arr_c[k] = arr_a[i++]; + else arr_c[k] = arr_b[j++]; + } + } +} + diff --git a/2025.02.28/8Ex/solve.h b/2025.02.28/8Ex/solve.h new file mode 100644 index 0000000..1519154 --- /dev/null +++ b/2025.02.28/8Ex/solve.h @@ -0,0 +1,9 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +void t8_solve(char **a, char **b, int n, int (*cmp)(const char *, const char *)); +void unite(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/8Ex/sort.c b/2025.02.28/8Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/8Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/8Ex/sort.h b/2025.02.28/8Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/8Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/8Ex/test_cases.json b/2025.02.28/8Ex/test_cases.json new file mode 100644 index 0000000..0a16078 --- /dev/null +++ b/2025.02.28/8Ex/test_cases.json @@ -0,0 +1,231 @@ +{ + "exe": "a08.exe", + "filename": "input.txt", + "tests": [ + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" +}, +{ + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" +}, +{ + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" +}, +{ + "c": 1, + "text": "", + "expected": "" +}, +{ + "c": 1, + "text": "onlyone", + "expected": "onlyone" +}, +{ + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" +}, +{ + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" +}, +{ + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" +}, +{ + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" +}, +{ + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" +}, +{ + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" +}, + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" + }, + { + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" + }, + { + "c": 1, + "text": "", + "expected": "" + }, + { + "c": 1, + "text": "onlyone", + "expected": "onlyone" + }, + { + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" + }, + { + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" + }, + { + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" + }, + { + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" + }, + { + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" + }, + { + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" + }, + { + "c": 2, + "text": "zoo\napple\nbanana\ncherry", + "expected": "zoo\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "abcd\na\nabcdef\nabc", + "expected": "a\nabc\nabcd\nabcdef" + }, + { + "c": 4, + "text": "abcd\na\nabcdef\nabc", + "expected": "abcdef\nabcd\nabc\na" + }, + { + "c": 3, + "text": "12345\n1234\n123\n12\n1", + "expected": "1\n12\n123\n1234\n12345" + }, + { + "c": 4, + "text": "12345\n1234\n123\n12\n1", + "expected": "12345\n1234\n123\n12\n1" + }, + { + "c": 1, + "text": "hello\nHELLO\nhElLo\nHeLLo", + "expected": "HELLO\nHeLLo\nhElLo\nhello" + }, + { + "c": 1, + "text": "A\nB\nC\nD\nE", + "expected": "A\nB\nC\nD\nE" + }, + { + "c": 2, + "text": "A\nB\nC\nD\nE", + "expected": "E\nD\nC\nB\nA" + }, + { + "c": 3, + "text": "aaa\nbb\nc", + "expected": "c\nbb\naaa" + }, + { + "c": 4, + "text": "aaa\nbb\nc", + "expected": "aaa\nbb\nc" + }, + { + "c": 1, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 4, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 2, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "3\n1\n4\n1\n5\n9\n2\n6\n5\n3", + "expected": "1\n1\n2\n3\n3\n4\n5\n5\n6\n9" + }, + { + "c": 3, + "text": "hello\nworld\nhi\ncode", + "expected": "hi\ncode\nhello\nworld" + }, + { + "c": 4, + "text": "hello\nworld\nhi\ncode", + "expected": "world\nhello\ncode\nhi" + } + ] +} diff --git a/2025.02.28/8Ex/test_runner.py b/2025.02.28/8Ex/test_runner.py new file mode 100644 index 0000000..30ed462 --- /dev/null +++ b/2025.02.28/8Ex/test_runner.py @@ -0,0 +1,138 @@ +import json +import subprocess +import os +import time +import platform +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, c, text, expected, p=None, debug=False): + self.c = c + self.text = text + self.expected = expected + self.p = p + self.debug = debug + + def get_num_lines(self): + """Returns the number of lines in the input text (n)""" + return self.text.count("\n") + 1 # +1, чтобы учесть последнюю строку + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.filename = self.config["filename"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def parse_sorted_output(output): + """Extracts the second print_array output from program output""" + parts = output.split("New array:\n") + if len(parts) > 1: + sorted_array = parts[1].rstrip().split("\n") + sorted_array = sorted_array[:-1] # Убираем последнюю строку (Task = ... Diff = ... Elapsed = ...) + return "\n".join(sorted_array) + return "" + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, filename = test_suite.exe, test_suite.filename + n = test.get_num_lines() # Auto-count lines in input + p = test.p if test.p is not None else n # Default p = n + + # Write input data to a file (Ensure last line has \n) + with open(filename, "w", encoding="utf-8") as f: + text = test.text.rstrip() + "\n" # Если нет \n в конце, добавляем + f.write(text) + + # Windows fix: remove './' for executables + cmd = [exe, str(test.c), str(n), str(p), filename] + if test.debug: + cmd.append("DEBUG") + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.c}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' should have failed but did not.", Fore.RED)) + return + + # Extract sorted array output + sorted_output = parse_sorted_output(result.stdout) if result else None + + # Check result + if sorted_output == test.expected: + print(color_text(f"[PASS] Test '{test.c}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{sorted_output}") + if test.debug: + print(color_text("[DEBUG] Full Program Output:", Fore.YELLOW)) + print(result.stdout) + + # Cleanup test files + try: + os.remove(filename) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {filename}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.28/9Ex/Makefile b/2025.02.28/9Ex/Makefile new file mode 100644 index 0000000..e5f9668 --- /dev/null +++ b/2025.02.28/9Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a09.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a09.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/9Ex/a.txt b/2025.02.28/9Ex/a.txt new file mode 100644 index 0000000..050d01f --- /dev/null +++ b/2025.02.28/9Ex/a.txt @@ -0,0 +1,10 @@ +3 +1 +4 +1 +5 +9 +2 +6 +5 +3 diff --git a/2025.02.28/9Ex/array.c b/2025.02.28/9Ex/array.c new file mode 100644 index 0000000..5841914 --- /dev/null +++ b/2025.02.28/9Ex/array.c @@ -0,0 +1,73 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} diff --git a/2025.02.28/9Ex/array.h b/2025.02.28/9Ex/array.h new file mode 100644 index 0000000..a90dd77 --- /dev/null +++ b/2025.02.28/9Ex/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/9Ex/io_status.h b/2025.02.28/9Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/9Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/9Ex/main.c b/2025.02.28/9Ex/main.c new file mode 100644 index 0000000..edfeaad --- /dev/null +++ b/2025.02.28/9Ex/main.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a09.out c n p filename */ + int c, n, p, diff, task = 9; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t9_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/9Ex/solve.c b/2025.02.28/9Ex/solve.c new file mode 100644 index 0000000..c49bfb5 --- /dev/null +++ b/2025.02.28/9Ex/solve.c @@ -0,0 +1,41 @@ +#include "solve.h" + +void t9_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + while (n > 1) + { + int is_edge = 0, ind_x = findIndex(a, n, a[n/2], cmp); + if (ind_x < n-ind_x) + { + if (ind_x == 0) is_edge = 1; + t9_solve(a, ind_x, cmp); + a += ind_x + is_edge; + n -= ind_x + is_edge; + } else + { + t9_solve(a+ind_x, n-ind_x, cmp); + n = ind_x; + } + } +} + +int findIndex(char **a, int n, char *x, int (*cmp)(const char *, const char *)) +{ + int i = 0, j = n-1; + char *temp; + + while (1) + { + for (; i < n; i++) if (cmp(a[i], x) >= 0) break; + for (; j >= 0; j--) if (cmp(a[j], x) <= 0) break; + + if (i >= j) break; + temp = a[i]; + a[i] = a[j]; + a[j] = temp; + + i++, j--; + } + + return i; +} diff --git a/2025.02.28/9Ex/solve.h b/2025.02.28/9Ex/solve.h new file mode 100644 index 0000000..b52d2b9 --- /dev/null +++ b/2025.02.28/9Ex/solve.h @@ -0,0 +1,9 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +void t9_solve(char **a, int n, int (*cmp)(const char *, const char *)); +int findIndex(char **a, int n, char *x, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/9Ex/sort.c b/2025.02.28/9Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/9Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/9Ex/sort.h b/2025.02.28/9Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/9Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/9Ex/test_cases.json b/2025.02.28/9Ex/test_cases.json new file mode 100644 index 0000000..0317142 --- /dev/null +++ b/2025.02.28/9Ex/test_cases.json @@ -0,0 +1,231 @@ +{ + "exe": "a09.exe", + "filename": "input.txt", + "tests": [ + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" +}, +{ + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" +}, +{ + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" +}, +{ + "c": 1, + "text": "", + "expected": "" +}, +{ + "c": 1, + "text": "onlyone", + "expected": "onlyone" +}, +{ + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" +}, +{ + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" +}, +{ + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" +}, +{ + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" +}, +{ + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" +}, +{ + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" +}, + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" + }, + { + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" + }, + { + "c": 1, + "text": "", + "expected": "" + }, + { + "c": 1, + "text": "onlyone", + "expected": "onlyone" + }, + { + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" + }, + { + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" + }, + { + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" + }, + { + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" + }, + { + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" + }, + { + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" + }, + { + "c": 2, + "text": "zoo\napple\nbanana\ncherry", + "expected": "zoo\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "abcd\na\nabcdef\nabc", + "expected": "a\nabc\nabcd\nabcdef" + }, + { + "c": 4, + "text": "abcd\na\nabcdef\nabc", + "expected": "abcdef\nabcd\nabc\na" + }, + { + "c": 3, + "text": "12345\n1234\n123\n12\n1", + "expected": "1\n12\n123\n1234\n12345" + }, + { + "c": 4, + "text": "12345\n1234\n123\n12\n1", + "expected": "12345\n1234\n123\n12\n1" + }, + { + "c": 1, + "text": "hello\nHELLO\nhElLo\nHeLLo", + "expected": "HELLO\nHeLLo\nhElLo\nhello" + }, + { + "c": 1, + "text": "A\nB\nC\nD\nE", + "expected": "A\nB\nC\nD\nE" + }, + { + "c": 2, + "text": "A\nB\nC\nD\nE", + "expected": "E\nD\nC\nB\nA" + }, + { + "c": 3, + "text": "aaa\nbb\nc", + "expected": "c\nbb\naaa" + }, + { + "c": 4, + "text": "aaa\nbb\nc", + "expected": "aaa\nbb\nc" + }, + { + "c": 1, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 4, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 2, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "3\n1\n4\n1\n5\n9\n2\n6\n5\n3", + "expected": "1\n1\n2\n3\n3\n4\n5\n5\n6\n9" + }, + { + "c": 3, + "text": "hello\nworld\nhi\ncode", + "expected": "hi\ncode\nhello\nworld" + }, + { + "c": 4, + "text": "hello\nworld\nhi\ncode", + "expected": "world\nhello\ncode\nhi" + } + ] +} diff --git a/2025.02.28/9Ex/test_runner.py b/2025.02.28/9Ex/test_runner.py new file mode 100644 index 0000000..30ed462 --- /dev/null +++ b/2025.02.28/9Ex/test_runner.py @@ -0,0 +1,138 @@ +import json +import subprocess +import os +import time +import platform +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, c, text, expected, p=None, debug=False): + self.c = c + self.text = text + self.expected = expected + self.p = p + self.debug = debug + + def get_num_lines(self): + """Returns the number of lines in the input text (n)""" + return self.text.count("\n") + 1 # +1, чтобы учесть последнюю строку + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.filename = self.config["filename"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def parse_sorted_output(output): + """Extracts the second print_array output from program output""" + parts = output.split("New array:\n") + if len(parts) > 1: + sorted_array = parts[1].rstrip().split("\n") + sorted_array = sorted_array[:-1] # Убираем последнюю строку (Task = ... Diff = ... Elapsed = ...) + return "\n".join(sorted_array) + return "" + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, filename = test_suite.exe, test_suite.filename + n = test.get_num_lines() # Auto-count lines in input + p = test.p if test.p is not None else n # Default p = n + + # Write input data to a file (Ensure last line has \n) + with open(filename, "w", encoding="utf-8") as f: + text = test.text.rstrip() + "\n" # Если нет \n в конце, добавляем + f.write(text) + + # Windows fix: remove './' for executables + cmd = [exe, str(test.c), str(n), str(p), filename] + if test.debug: + cmd.append("DEBUG") + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.c}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' should have failed but did not.", Fore.RED)) + return + + # Extract sorted array output + sorted_output = parse_sorted_output(result.stdout) if result else None + + # Check result + if sorted_output == test.expected: + print(color_text(f"[PASS] Test '{test.c}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{sorted_output}") + if test.debug: + print(color_text("[DEBUG] Full Program Output:", Fore.YELLOW)) + print(result.stdout) + + # Cleanup test files + try: + os.remove(filename) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {filename}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.28/Example/compare.c b/2025.02.28/Example/compare.c new file mode 100644 index 0000000..b09926b --- /dev/null +++ b/2025.02.28/Example/compare.c @@ -0,0 +1,18 @@ +#include "compare.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return strcmp(b, a); } + +int up_len(const char *a, const char *b) +{ + ssize_t diff = (ssize_t)strlen(a) - (ssize_t)strlen(b); + if (diff < 0) return -1; + if (diff > 0) return 1; + return up_strcmp(a, b); +} + +int down_len(const char *a, const char *b) +{ return up_len(b, a); } diff --git a/2025.02.28/Example/compare.h b/2025.02.28/Example/compare.h new file mode 100644 index 0000000..a807307 --- /dev/null +++ b/2025.02.28/Example/compare.h @@ -0,0 +1,9 @@ +#ifndef COMPARE_H +#define COMPARE_H + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/Example/main.c b/2025.02.28/Example/main.c new file mode 100644 index 0000000..3704f7f --- /dev/null +++ b/2025.02.28/Example/main.c @@ -0,0 +1,52 @@ +int main(int argc, char *argv[]) +{ + /* ./aout c n p a.txt */ + int c, p, n; + char *name; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + + if (!(argc == 5 && sscanf(argv[2]. "%d", &n) == 1 && sscanf(argv[3], "%d" &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + sort(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + print_array(a, n, p); + + delete_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/Example/solve.c b/2025.02.28/Example/solve.c new file mode 100644 index 0000000..4eb8a43 --- /dev/null +++ b/2025.02.28/Example/solve.c @@ -0,0 +1,13 @@ +#include "solve.h" + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} diff --git a/2025.02.28/Example/sort.h b/2025.02.28/Example/sort.h new file mode 100644 index 0000000..40c768b --- /dev/null +++ b/2025.02.28/Example/sort.h @@ -0,0 +1,6 @@ +#ifndef SORT_H +#define SORT_H + +void sort(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/Krivoruchenko_SK.zip b/2025.02.28/Krivoruchenko_SK.zip new file mode 100644 index 0000000..11d7e22 Binary files /dev/null and b/2025.02.28/Krivoruchenko_SK.zip differ diff --git a/2025.02.28/Linux/Makefile b/2025.02.28/Linux/Makefile new file mode 100644 index 0000000..5f902ba --- /dev/null +++ b/2025.02.28/Linux/Makefile @@ -0,0 +1,15 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +%.out: %.o solve.o array.o sort.o + gcc $(FLAGS) $^ -o $@ +%.o: %.c + gcc -c $(FLAGS) $< + +all: a01.out a02.out a03.out a04.out a05.out a06.out a07.out a08.out a09.out + +solve.o: solve.c solve.h +array.o: array.c array.h +sort.o: sort.c sort.h + +clean: + rm -f *.o *.out diff --git a/2025.02.28/Linux/a01.c b/2025.02.28/Linux/a01.c new file mode 100644 index 0000000..6c8e47f --- /dev/null +++ b/2025.02.28/Linux/a01.c @@ -0,0 +1,66 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./aout x c n p filename */ + int c, p, n, res, task = 1; + io_status ret; + char *name, *x, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 6 && sscanf(argv[2], "%d", &c) && sscanf(argv[3], "%d", &n) == 1 && sscanf(argv[4], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s x c n p name\n", argv[0]); + return 1; + } + x = argv[1]; + name = argv[5]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + res = t1_solve(a, n, x, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + + printf("%s : Task = %d Res = %d Elapsed = %.2f\n", argv[0], task, res, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/Linux/a02.c b/2025.02.28/Linux/a02.c new file mode 100644 index 0000000..a1eea09 --- /dev/null +++ b/2025.02.28/Linux/a02.c @@ -0,0 +1,120 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a02.out c n p_a filename_a m p_b filename_b */ + int c, p_a, n, p_b, m, diff, task = 2; + io_status ret; + char *name_a, *name_b, **arr_a, **arr_b, **arr_c; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 8 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p_a) == 1 && sscanf(argv[5], "%d", &m) && sscanf(argv[6], "%d",&p_b) && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p_a filename_a m p_b filename_b\n", argv[0]); + return 1; + } + name_a = argv[4]; + name_b = argv[7]; + cmp = f[c-1]; + + if (!(arr_a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + if (!(arr_b = (char **)malloc(m * sizeof(char *)))) + { + free(arr_a); + + printf("Not enough memory: \n"); + return 2; + } + if (!(arr_c = (char **)malloc((n+m) * sizeof(char *)))) + { + free(arr_a); + free(arr_b); + + printf("Not enough memory: \n"); + return 2; + } + + + ret = read_array(arr_a, n, name_a); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name_a); + break; + case ERROR_READ: + printf("Cannot read %s\n", name_a); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(arr_a); + free(arr_b); + free(arr_c); + return 3; + } while (0); + + ret = read_array(arr_b, m, name_b); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name_b); + break; + case ERROR_READ: + printf("Cannot read %s\n", name_b); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free_array(arr_a, n); + + free(arr_a); + free(arr_b); + free(arr_c); + return 3; + } while (0); + + print_array(arr_a, n, p_a); + printf("\n"); + print_array(arr_b, m, p_b); + + t = clock(); + t2_solve(arr_a, arr_b, arr_c, n, m, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(arr_c, n+m, cmp); + + printf("New array:\n"); + print_array(arr_c, n+m, p_a+p_b); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(arr_a, n); + free_array(arr_b, m); + + free(arr_a); + free(arr_b); + free(arr_c); + + return 0; +} diff --git a/2025.02.28/Linux/a03.c b/2025.02.28/Linux/a03.c new file mode 100644 index 0000000..c1aae34 --- /dev/null +++ b/2025.02.28/Linux/a03.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./aout x c n p filename */ + int c, p, n, res, task = 3; + io_status ret; + char *name, *x, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 6 && sscanf(argv[2], "%d", &c) && sscanf(argv[3], "%d", &n) == 1 && sscanf(argv[4], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s x c n p name\n", argv[0]); + return 1; + } + x = argv[1]; + name = argv[5]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + res = t3_solve(a, n, x, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Res = %d Elapsed = %.2f\n", argv[0], task, res, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/Linux/a04.c b/2025.02.28/Linux/a04.c new file mode 100644 index 0000000..bc0aa48 --- /dev/null +++ b/2025.02.28/Linux/a04.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a04.out c n p filename */ + int c, n, p, diff, task = 4; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t4_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/Linux/a05.c b/2025.02.28/Linux/a05.c new file mode 100644 index 0000000..964130e --- /dev/null +++ b/2025.02.28/Linux/a05.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a05.out c n p filename */ + int c, n, p, diff, task = 5; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t5_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/Linux/a06.c b/2025.02.28/Linux/a06.c new file mode 100644 index 0000000..cdf1dad --- /dev/null +++ b/2025.02.28/Linux/a06.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a06.out c n p filename */ + int c, n, p, diff, task = 6; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t6_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/Linux/a07.c b/2025.02.28/Linux/a07.c new file mode 100644 index 0000000..a5ea454 --- /dev/null +++ b/2025.02.28/Linux/a07.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a07.out c n p filename */ + int c, n, p, diff, task = 7; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t7_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/Linux/a08.c b/2025.02.28/Linux/a08.c new file mode 100644 index 0000000..988280c --- /dev/null +++ b/2025.02.28/Linux/a08.c @@ -0,0 +1,76 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a08.out c n p filename */ + int c, n, p, diff, task = 8; + io_status ret; + char *name, **a, **b; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } if (!(b = (char **)malloc(n * sizeof(char *)))) + { + + free(a); + printf("Not enough memory: \n"); + return 2; + } + memset(b, 0, (n * sizeof(char *))); + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t8_solve(a, b, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + free(b); + + return 0; +} diff --git a/2025.02.28/Linux/a09.c b/2025.02.28/Linux/a09.c new file mode 100644 index 0000000..edfeaad --- /dev/null +++ b/2025.02.28/Linux/a09.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a09.out c n p filename */ + int c, n, p, diff, task = 9; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t9_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/Linux/array.c b/2025.02.28/Linux/array.c new file mode 100644 index 0000000..cd34789 --- /dev/null +++ b/2025.02.28/Linux/array.c @@ -0,0 +1,73 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} \ No newline at end of file diff --git a/2025.02.28/Linux/array.h b/2025.02.28/Linux/array.h new file mode 100644 index 0000000..a90dd77 --- /dev/null +++ b/2025.02.28/Linux/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/Linux/io_status.h b/2025.02.28/Linux/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/Linux/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/Linux/solve.c b/2025.02.28/Linux/solve.c new file mode 100644 index 0000000..81f2083 --- /dev/null +++ b/2025.02.28/Linux/solve.c @@ -0,0 +1,237 @@ +// Program from 1Ex +#include "solve.h" + +int t1_solve(char **a, int n, char *x, int (*cmp)(const char *, const char *)) { + int avg = (n + (-1)*(n%2)) / 2; + int comp; + + if (n == 0) return 0; + + comp = cmp(x, a[avg]); + if (comp < 0) return t1_solve(a, avg, x, cmp); + if (comp > 0) return avg+1 + t1_solve(a+avg+1, n-(avg+1), x, cmp); + else return avg; +} + +// Program from 2Ex + +void t2_solve(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)) +{ + int i, j, k, cntr, len = n + m; // cntr - contrast + for (i = 0, j = 0, k = 0; k < len; ++k) + { + if (i >= n) + { + arr_c[k] = arr_b[j++]; + } else if (j >= m) + { + arr_c[k] = arr_a[i++]; + } else + { + cntr = cmp(arr_a[i], arr_b[j]); + if (cntr <= 0) arr_c[k] = arr_a[i++]; + else arr_c[k] = arr_b[j++]; + } + } +} + +// Program from 3Ex + +int t3_solve(char **a, int n, char *x, int (*cmp)(const char *, const char *)) { + int i = 0, j = n-1; + char *temp; + + while (1) + { + for (; i < n; i++) if (cmp(a[i], x) >= 0) break; + for (; j >= 0; j--) if (cmp(a[j], x) < 0) break; + + if (i >= j) break; + temp = a[i]; + a[i] = a[j]; + a[j] = temp; + + i++, j--; + } + + return i; +} + +// Program from 4Ex + +void t4_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + char *temp; + int i, j; + for (i=n; i > 0; --i) + { + for (j=0; j < i-1; ++j) + { + if (cmp(a[j], a[j+1]) >= 0) + { + temp = a[j]; + a[j] = a[j+1]; + a[j+1] = temp; + } + } + } +} + +// Program from 5Ex + +void t5_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + char *temp; + size_t size_c = sizeof(char); + int i, min; + for (i=0; i < n-1; ++i) + { + min = minimum(a+i*size_c, n-i, cmp)+i; + temp = a[min]; + a[min] = a[i]; + a[i] = temp; + } +} + +int minimum(char **a, int n, int (*cmp)(const char *, const char *)) +{ + int i, min=0; + if (n <= 0) return 0; + for (i = 1; i < n; ++i) + { + if (cmp(a[min], a[i]) > 0) min = i; + } + + return min; +} + +// Program from 6Ex + +void t6_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + int i; + for (i = 1; i < n; ++i) t6_append(a, i+1, a[i], t6_find(a, i, a[i], cmp)); +} + +int t6_find(char **arr, int n, char *a, int (*cmp)(const char *, const char *)) +{ + int i; + for (i=0; i index; --i) arr[i] = arr[i-1]; + arr[index] = a; +} + +// Program from 7Ex + +void t7_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + int i; + for (i = 1; i < n; ++i) t7_append(a, i+1, a[i], t7_find(a, i, a[i], cmp)); +} + +int t7_find(char **a, int n, char *x, int (*cmp)(const char *, const char *)) { + int avg = (n + (-1)*(n%2)) / 2; + int comp; + + if (n == 0) return 0; + + comp = cmp(x, a[avg]); + if (comp < 0) return t7_find(a, avg, x, cmp); + if (comp > 0) return avg+1 + t7_find(a+(avg+1), n-(avg+1), x, cmp); + else return avg; +} + +void t7_append(char **arr, int n, char *a, int index) +{ + for (int i = n-1; i > index; --i) arr[i] = arr[i-1]; + arr[index] = a; +} +// Program from 8Ex + +void t8_solve(char **a, char **b, int n, int (*cmp)(const char *, const char *)) +{ + int i = 2, j, margin; + do { + int hf_i = i/2; + for (j = 0; j < n; j += i) + { + if (n < j+i) + { + margin = n-(j+hf_i); + if (margin <= 0) break; + } else margin = hf_i; + + unite(a+j, a+(j+hf_i), b, hf_i, margin, cmp); + for (int k = 0; k < hf_i+margin; k++) a[j+k] = b[k]; + } + + i *= 2; + } while (i < n*2); +} + +void unite(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)) +{ + int i, j, k, cntr, len = n + m; // cntr - contrast + for (i = 0, j = 0, k = 0; k < len; ++k) + { + if (i >= n) + { + arr_c[k] = arr_b[j++]; + } else if (j >= m) + { + arr_c[k] = arr_a[i++]; + } else + { + cntr = cmp(arr_a[i], arr_b[j]); + if (cntr <= 0) arr_c[k] = arr_a[i++]; + else arr_c[k] = arr_b[j++]; + } + } +} + +// Program from 9Ex + +void t9_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + while (n > 1) + { + int is_edge = 0, ind_x = findIndex(a, n, a[n/2], cmp); + if (ind_x < n-ind_x) + { + if (ind_x == 0) is_edge = 1; + t9_solve(a, ind_x, cmp); + a += ind_x + is_edge; + n -= ind_x + is_edge; + } else + { + t9_solve(a+ind_x, n-ind_x, cmp); + n = ind_x; + } + } +} + +int findIndex(char **a, int n, char *x, int (*cmp)(const char *, const char *)) +{ + int i = 0, j = n-1; + char *temp; + + while (1) + { + for (; i < n; i++) if (cmp(a[i], x) >= 0) break; + for (; j >= 0; j--) if (cmp(a[j], x) <= 0) break; + + if (i >= j) break; + temp = a[i]; + a[i] = a[j]; + a[j] = temp; + + i++, j--; + } + + return i; +} diff --git a/2025.02.28/Linux/solve.h b/2025.02.28/Linux/solve.h new file mode 100644 index 0000000..a93a43b --- /dev/null +++ b/2025.02.28/Linux/solve.h @@ -0,0 +1,42 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include +#include "array.h" +#include "sort.h" + +// Headers from 1Ex +int t1_solve(char **a, int n, char *x, int (*cmp)(const char *, const char *)); + +// Headers from 2Ex +void t2_solve(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)); + +// Headers from 3Ex +int t3_solve(char **a, int n, char *x, int (*cmp)(const char *, const char *)); + +// Headers from 4Ex +void t4_solve(char **a, int n, int (*cmp)(const char *, const char *)); + +// Headers from 5Ex +void t5_solve(char **a, int n, int (*cmp)(const char *, const char *)); +int minimum(char **a, int n, int (*cmp)(const char *, const char *)); + +// Headers from 6Ex +void t6_solve(char **a, int n, int (*cmp)(const char *, const char *)); +int t6_find(char **arr, int n, char *a, int (*cmp)(const char *, const char *)); +void t6_append(char **arr, int n, char *a, int index); + +// Headers from 7Ex +void t7_solve(char **a, int n, int (*cmp)(const char *, const char *)); +int t7_find(char **arr, int n, char *a, int (*cmp)(const char *, const char *)); +void t7_append(char **arr, int n, char *a, int index); + +// Headers from 8Ex +void t8_solve(char **a, char **b, int n, int (*cmp)(const char *, const char *)); +void unite(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)); + +// Headers from 9Ex +void t9_solve(char **a, int n, int (*cmp)(const char *, const char *)); +int findIndex(char **a, int n, char *x, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/Linux/sort.c b/2025.02.28/Linux/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/Linux/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/Linux/sort.h b/2025.02.28/Linux/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/Linux/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/Tasks03.pdf b/2025.02.28/Tasks03.pdf new file mode 100644 index 0000000..1a00ae5 Binary files /dev/null and b/2025.02.28/Tasks03.pdf differ diff --git a/2025.03.07/Example/array_io.c b/2025.03.07/Example/array_io.c new file mode 100644 index 0000000..65f4dbe --- /dev/null +++ b/2025.03.07/Example/array_io.c @@ -0,0 +1,41 @@ +#include +#include "array_io.h" + +#define MAX(n, m) (n < m ? n : m) + +io_status read_matrix(double *a, int n, int m, const char *name) +{ + int i, j; + FILE *fp; + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) + for (j = 0; j < m; j++) + if (fscanf(fp, "%lf", a + i * m + j) != 1) + {fclose(fp); return ERROR_READ;} + fclose(fp); + return SUCCESS; +} + +void print_matrix(const double *a, int n, int m, int p) +{ + int np = (n > p ? p : n); + int mp = (m > p ? p : m); + int i, j; + + for (i = 0; i < np; i++) + { + for (j = 0; i < mp; j++) + printf(" %10.3e", a[i * m + j]); + printf("\n"); + } +} + +void init_matrix(double *a, int n, int m) +{ + double (*f)[](int, int, int, int) = {f1, f2, f3, f4}; + int i, j; + q = f[k-1]; + for (i = 0; i < m; i++) + for (j = 0; j < n; j++) + a[i * m + j] = (*q(n, m , i, j)); +} diff --git a/2025.03.07/Example/init_f.c b/2025.03.07/Example/init_f.c new file mode 100644 index 0000000..56e7785 --- /dev/null +++ b/2025.03.07/Example/init_f.c @@ -0,0 +1,22 @@ +#include "init_f.h" + +double f1(int n, int m, int i, int j) + return MAX(n, m) - MAX(i, j) + 1; + +double f2(int n, int m, int i, int j) +{ + void n, m; + return MAX(i, j); +} + +double f3(int n, int m, int i, int j) +{ + void n, m; + return abs(i - j); +} + +double f4(int n, int m, int i, int j) +{ + void n, m; + return 1./(i+j-1); +} diff --git a/2025.03.07/Example/init_f.h b/2025.03.07/Example/init_f.h new file mode 100644 index 0000000..691aace --- /dev/null +++ b/2025.03.07/Example/init_f.h @@ -0,0 +1,9 @@ +#ifndef INIT_F_H +#define INIT_F_H + +double f1(int n, int m, int i, int j); +double f2(int n, int m, int i, int j); +double f3(int n, int m, int i, int j); +double f4(int n, int m, int i, int j); + +#endif diff --git a/2025.03.07/Example/main.c b/2025.03.07/Example/main.c new file mode 100644 index 0000000..4bdd56a --- /dev/null +++ b/2025.03.07/Example/main.c @@ -0,0 +1,63 @@ +#include +#include +#include "array_io.h" + +/* ./a.out n m p k [name] */ +int main(int argc, char *argv[]) +{ + double *a; + int n, m, p, k; + char *name = 0; + + if (!((argc == 5 || argc == 6) && + sscanf(argv[1], "%d", &n) == 1 && + sscanf(argv[2], "%d", &m) == 1 && + sscanf(argv[3], "%d", &p) == 1 && + sscanf(argv[4], "%d", &k) == 1 && + k >= 0 && k <= 4 && (!(k == 0 && argc != 6)))) + { + printf("Usage: %s n m p k [name]\n", argv[0]); + return 0; + } + if (arc == 6) name = argv[5]; + + a = (double *)malloc(n * m * sizeof(double)); + if (!a) + { + printf("Not enough memory\n"); + return 2; + } + + if (name) + { /* из файла */ + io_status ret; + ret = read_matrix(a, n, m, name); + do { + switch (ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + } + free(a); + return 3; + } + } else init_matrix(a, n, m, k); + + printf("initial matrix:\n"); + print_matrix(a, n, m, p); + + t = clock(); + solve(a, n, m); + t = (clock() - t) / CLOCKS_PER_SEC; + + printf("Result matrix:\n"); + print_matrix(a, n, m, p); + printf("Elapsed = %.2f\n", t); + free(a); + return 0; +}