From 3f5c6299fc79f6bbf28d5eff83c0e32b316603d4 Mon Sep 17 00:00:00 2001 From: AZEN-SGG Date: Fri, 18 Oct 2024 10:00:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=2013=20?= =?UTF-8?q?=D1=83=D1=81=D0=BE=D0=B2=D0=B5=D1=80=D1=88=D0=B5=D0=BD=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=83=D1=8E=20=D1=81?= =?UTF-8?q?=20=D0=B8=D0=BD=D1=8B=D0=BC=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WorkingArrays/13ExDeluxe/equal.c | 23 ++++++++++++ WorkingArrays/13ExDeluxe/equal.h | 13 +++++++ WorkingArrays/13ExDeluxe/input.txt | 1 + WorkingArrays/13ExDeluxe/main.c | 19 ++++++++++ WorkingArrays/13ExDeluxe/makefile | 11 ++++++ WorkingArrays/13ExDeluxe/tools.c | 50 ++++++++++++++++++++++++++ WorkingArrays/13ExDeluxe/tools.h | 10 ++++++ WorkingArrays/15Ex/replace_local_min.c | 13 +++++-- WorkingArrays/15Ex/replace_local_min.h | 4 +++ WorkingArrays/22Ex/local_minimum.c | 4 +-- WorkingArrays/22Ex/local_minimum.h | 3 ++ 11 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 WorkingArrays/13ExDeluxe/equal.c create mode 100644 WorkingArrays/13ExDeluxe/equal.h create mode 100644 WorkingArrays/13ExDeluxe/input.txt create mode 100644 WorkingArrays/13ExDeluxe/main.c create mode 100644 WorkingArrays/13ExDeluxe/makefile create mode 100644 WorkingArrays/13ExDeluxe/tools.c create mode 100644 WorkingArrays/13ExDeluxe/tools.h diff --git a/WorkingArrays/13ExDeluxe/equal.c b/WorkingArrays/13ExDeluxe/equal.c new file mode 100644 index 0000000..90bcd32 --- /dev/null +++ b/WorkingArrays/13ExDeluxe/equal.c @@ -0,0 +1,23 @@ +#include "equal.h" + +int canFixArray(double * numbers) { + unsigned short indexNonEqualNumber = 0, indexSecondNonEqualNumber = 0, numberDiffernce = 0, length = (int)numbers[0]; + + for (int i = 2; i < length; ++i) { + if (!isEqual(numbers[i - 1], numbers[i])) { + numberDiffernce++; + if (!indexNonEqualNumber) indexNonEqualNumber = i; + else if (!indexSecondNonEqualNumber) indexSecondNonEqualNumber = i - 1; + } + } + + if (numberDiffernce > 2) return -1; + else if (numberDiffernce == 2 && (!isEqual(numbers[indexNonEqualNumber - 1], numbers[length - 1]) || indexNonEqualNumber != indexSecondNonEqualNumber)) return -2; + else if (numberDiffernce == 1 && ((indexNonEqualNumber != 2) && (indexNonEqualNumber != (length - 1)))) return -3; + + return 0; +} + +bool isEqual(double first, double second) { + return (fabs(first - second) < eps); +} diff --git a/WorkingArrays/13ExDeluxe/equal.h b/WorkingArrays/13ExDeluxe/equal.h new file mode 100644 index 0000000..a8a0078 --- /dev/null +++ b/WorkingArrays/13ExDeluxe/equal.h @@ -0,0 +1,13 @@ +#ifndef EQUAL +#define EQUAL + +#include +#include +#include + +#define eps 1.e-6 + +int canFixArray(double * numbers); +bool isEqual(double first, double second); + +#endif // EQUAL diff --git a/WorkingArrays/13ExDeluxe/input.txt b/WorkingArrays/13ExDeluxe/input.txt new file mode 100644 index 0000000..b68f6da --- /dev/null +++ b/WorkingArrays/13ExDeluxe/input.txt @@ -0,0 +1 @@ +1 1 1 2 2 2 \ No newline at end of file diff --git a/WorkingArrays/13ExDeluxe/main.c b/WorkingArrays/13ExDeluxe/main.c new file mode 100644 index 0000000..cbc805f --- /dev/null +++ b/WorkingArrays/13ExDeluxe/main.c @@ -0,0 +1,19 @@ +#include +#include "tools.h" +#include "equal.h" + +int main(void) { + double * numbers; + FILE * file = getFile(); + if (file == NULL) return 1; + + numbers = getList(file); + if (numbers == NULL) return 1; + + if (canFixArray(numbers)) printf("It can't be fixed!"); + else printf("It is possible to make them equal!"); + + free(numbers); + + return 0; +} diff --git a/WorkingArrays/13ExDeluxe/makefile b/WorkingArrays/13ExDeluxe/makefile new file mode 100644 index 0000000..3ccf9a2 --- /dev/null +++ b/WorkingArrays/13ExDeluxe/makefile @@ -0,0 +1,11 @@ +all: main.o equal.o tools.o + gcc main.o equal.o tools.o && del *.o + +main.o: main.c + gcc -c main.c + +equal.o: equal.c + gcc -c equal.c + +tools.o: tools.c + gcc -c tools.c \ No newline at end of file diff --git a/WorkingArrays/13ExDeluxe/tools.c b/WorkingArrays/13ExDeluxe/tools.c new file mode 100644 index 0000000..f2ebc66 --- /dev/null +++ b/WorkingArrays/13ExDeluxe/tools.c @@ -0,0 +1,50 @@ +#include "tools.h" + +FILE * getFile(void) +{ + FILE * file; + char filename[50]; + + printf("Enter filename: "); + if (scanf("%s", filename) == 1) + { + file = fopen(filename, "r"); + if (file == NULL) { + printf("Error file!\n"); + return NULL; + } else { + return file; + } + } else + { + printf("Empty name!\n"); + return NULL; + } +} + +double * getList(FILE * file) { + double current; + int i, length = 2; + double * numbers = NULL; + + if (fscanf(file, "%lf", ¤t) != 1) { + printf("File is empty!"); + return numbers; + } + + numbers = (double *)malloc(length * sizeof(double)); + i = 1; + + do { + if (i >= length) { + length *= 2; + numbers = (double *)realloc(numbers, (length * sizeof(double))); + } + numbers[i] = current; + i++; + } while (fscanf(file, "%lf", ¤t) == 1); + + numbers = (double *)realloc(numbers, i * sizeof(double)); + numbers[0] = i; + return numbers; +} diff --git a/WorkingArrays/13ExDeluxe/tools.h b/WorkingArrays/13ExDeluxe/tools.h new file mode 100644 index 0000000..706e31a --- /dev/null +++ b/WorkingArrays/13ExDeluxe/tools.h @@ -0,0 +1,10 @@ +#ifndef TOOLS +#define TOOLS + +#include +#include + +FILE * getFile(void); +double * getList(FILE * file); + +#endif diff --git a/WorkingArrays/15Ex/replace_local_min.c b/WorkingArrays/15Ex/replace_local_min.c index b8a3249..98eca3b 100644 --- a/WorkingArrays/15Ex/replace_local_min.c +++ b/WorkingArrays/15Ex/replace_local_min.c @@ -1,18 +1,25 @@ #include "replace_local_min.h" +double min(double * numbers) { + + for (int i = 1; i < length; ++i) { + + } +} + int replaceLocalMin(double * numbers) { int length = numbers[0]; unsigned final_num = 1; unsigned local_length = 1; for (int i = 2; i < length; ++i, ++final_num) { - if (numbers[i - 1] == numbers[i]) { if (local_length) ++local_length; - } else if (numbers[i - 1] < numbers[i]) { + if (fabs(numbers[i - 1] - numbers[i]) < exp) { if (local_length) ++local_length; + } else if ((numbers[i] - numbers[i - 1]) > exp) { if (local_length) final_num -= (local_length - 1), local_length = 0; } else local_length = 1; } - if ((numbers[length - 1] == numbers[length - 2]) && (local_length)) final_num -= (local_length - 1); + if ((fabs(numbers[length - 1] - numbers[length - 2]) < exp) && (local_length)) final_num -= (local_length - 1); return final_num; } diff --git a/WorkingArrays/15Ex/replace_local_min.h b/WorkingArrays/15Ex/replace_local_min.h index b2619fd..2bcc438 100644 --- a/WorkingArrays/15Ex/replace_local_min.h +++ b/WorkingArrays/15Ex/replace_local_min.h @@ -1,6 +1,10 @@ #ifndef REPLACE_LOCAL_MIN #define REPLACE_LOCAL_MIN +#include + +#define exp 1.e-6 + int replaceLocalMin(double * numbers); #endif // REPLACE_LOCAL_MIN diff --git a/WorkingArrays/22Ex/local_minimum.c b/WorkingArrays/22Ex/local_minimum.c index bf3334f..48399db 100644 --- a/WorkingArrays/22Ex/local_minimum.c +++ b/WorkingArrays/22Ex/local_minimum.c @@ -26,9 +26,9 @@ int searching_loc_min(double * numbers) for (unsigned i = 2; i < length; ++i) { - if (numbers[i] == numbers[i - 1]) { + if (fabs(numbers[i] - numbers[i - 1]) < exp) { if (curr_len) ++curr_len; - } else if (numbers[i] > numbers[i - 1]) { + } else if ((numbers[i] - numbers[i - 1]) > exp) { if (curr_len) { // It is important to remember that numbers[0] is equal to the length of the list! start_end[0 + (min_num * 2)] = (i - curr_len), start_end[1 + (min_num * 2)] = i - 1; diff --git a/WorkingArrays/22Ex/local_minimum.h b/WorkingArrays/22Ex/local_minimum.h index dae8dcf..30797a3 100644 --- a/WorkingArrays/22Ex/local_minimum.h +++ b/WorkingArrays/22Ex/local_minimum.h @@ -1,9 +1,12 @@ #ifndef LOCAL_MINIMUM #define LOCAL_MINIMUM +#include #include #include +#define exp 1.e-6 + int transposition(double * numbers, unsigned * start_end); int searching_loc_min(double * numbers);