From b4cb5098c29cdab5835dd7db9952ee8bd54f98df Mon Sep 17 00:00:00 2001 From: AZEN-SGG Date: Tue, 10 Dec 2024 09:19:51 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BB=209=20=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D1=83=20?= =?UTF-8?q?=D0=B2=20=D0=BE=D0=B4=D0=BD=D0=BE=D0=BC=20=D1=86=D0=B8=D0=BA?= =?UTF-8?q?=D0=BB=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WorkingArrays/9Ex/grouping.c | 57 +++++++++--------------------------- WorkingArrays/9Ex/grouping.h | 4 +-- WorkingArrays/9Ex/makefile | 4 +-- 3 files changed, 17 insertions(+), 48 deletions(-) diff --git a/WorkingArrays/9Ex/grouping.c b/WorkingArrays/9Ex/grouping.c index 4f921f8..15535c6 100644 --- a/WorkingArrays/9Ex/grouping.c +++ b/WorkingArrays/9Ex/grouping.c @@ -1,55 +1,26 @@ #include "grouping.h" void group(double * array, int length) { - negativeToRight(array, length); - zeroesToCenter(array, length); -} + double temp; + int negative = 0, last_index = length - 1, limit; -void negativeToRight(double * array, int length) { - double temp; - int negative = 0, last_index = length - 1; - - for (int i = 0; i <= last_index - negative; ++i) { - // Так как мы передвигаем каждый отрицательный эл-нт в конец - // То тогда нам не нужно проверять последний эл-нт (т.к. он отрицательный) - поэтому я его пропускаю - -negative - if (array[i] < 0) { - for (int j = length - 2; j >= i; --j) { - // Сначала последний эл-нт копируется в предпоследний, а предпоследний в последний - // Далее каждый следующий j-й элемент заменяется тем, что находится на месте последнего, а последний элемент заменяется на j - // Так шаг за шагов элементы переставляются и наш i-й элемент оказывается на месте последнего (типа ЭП2) + for (int i = 0; i <= last_index - negative; ++i) { + if (array[i] < -exp) limit = length - 2, --last_index; + else if (fabs(array[i]) < exp) limit = last_index - 1, ++negative; + else limit = -1; + + if (limit != -1) { + for (int j = limit; j >= i; --j) { temp = array[j]; - array[j] = array[last_index]; - array[last_index] = temp; - } - - --i, ++negative; + array[j] = array[limit + 1]; + array[limit + 1] = temp; + } + + --i; } } } -void zeroesToCenter(double * array, int length) { - // Аналогичный способ перемещения эл-тов, но только не в конец, а в место между отрицательными и положительными числами - double temp; - int zeroes = 0, last_index = 0; - - while (array[last_index] >= 0 && last_index < length) ++last_index; - // last_index < length - очень важен, так как если нет отрицательных чисел, то цикл уёдет в бесконечность - --last_index; // Так как изначально указывает на первый отрицательный элемент, а нам нужен последний положительный - - for (int i = 0; i <= last_index - zeroes; ++i) { - if (fabs(array[i]) < eps) { - for (int j = last_index - 1; j >= i; --j) { - temp = array[j]; - array[j] = array[last_index]; - array[last_index] = temp; - } - - --i, ++zeroes; - } - } -} - - void printArray(double * array, int length) { for (int i = 0; i < length; ++i) { printf("%.2lf ", array[i]); diff --git a/WorkingArrays/9Ex/grouping.h b/WorkingArrays/9Ex/grouping.h index 6e3bf52..0887637 100644 --- a/WorkingArrays/9Ex/grouping.h +++ b/WorkingArrays/9Ex/grouping.h @@ -4,11 +4,9 @@ #include #include -#define eps 1.e-6 +#define exp 1.e-6 void group(double * array, int length); -void negativeToRight(double * array, int length); -void zeroesToCenter(double * array, int length); void printArray(double * array, int length); #endif diff --git a/WorkingArrays/9Ex/makefile b/WorkingArrays/9Ex/makefile index 52f7ed8..fac4d47 100644 --- a/WorkingArrays/9Ex/makefile +++ b/WorkingArrays/9Ex/makefile @@ -28,8 +28,8 @@ CFLAGS = -mfpmath=sse \ -c all: main.o grouping.o tools.o - gcc main.o grouping.o tools.o -o a.out && rm -f *.o - ./a.out + gcc main.o grouping.o tools.o -lssp && del *.o + a.exe main.o: main.c gcc $(CFLAGS) main.c -o main.o