From 0d9815494487d9186d6febbf3ed619d5573b97b2 Mon Sep 17 00:00:00 2001 From: AZEN-SGG Date: Fri, 22 Nov 2024 09:45:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=A1?= =?UTF-8?q?=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++ Sorting/9Ex/input.txt | 1 + Sorting/9Ex/main.c | 107 +++++++------------------------------- Sorting/9Ex/makefile | 16 ++++-- Sorting/9Ex/seagwithsob.c | 5 +- Sorting/9Ex/seagwithsob.h | 2 + Sorting/9Ex/tools.c | 92 ++++++++++++++++++++++++++++++++ Sorting/9Ex/tools.h | 20 +++++++ 8 files changed, 152 insertions(+), 94 deletions(-) create mode 100644 .gitignore create mode 100644 Sorting/9Ex/input.txt create mode 100644 Sorting/9Ex/tools.c create mode 100644 Sorting/9Ex/tools.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..75940fb --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.un~ +*.exe +*~ \ No newline at end of file diff --git a/Sorting/9Ex/input.txt b/Sorting/9Ex/input.txt new file mode 100644 index 0000000..ef11784 --- /dev/null +++ b/Sorting/9Ex/input.txt @@ -0,0 +1 @@ +6 5 4 3 2 1 \ No newline at end of file diff --git a/Sorting/9Ex/main.c b/Sorting/9Ex/main.c index 8442986..86a2ff6 100644 --- a/Sorting/9Ex/main.c +++ b/Sorting/9Ex/main.c @@ -1,96 +1,25 @@ #include #include "seagwithsob.h" +#include "tools.h" +#include -int main() { - // Тест 1: Набор чисел в обычном порядке - double array1[] = {10.0, 9.00001, 8.0001, 7.001, 6.01, 5.1}; - int length1 = sizeof(array1) / sizeof(array1[0]); +int main() { + FILE * file = getFile(); + double * array; + int length; + + if (file == NULL) return -1; + array = getArray(file); + if (array == NULL) return -2; + length = (int)array[0]; - printf("Test 1 - Original array:\n"); - for (int i = 0; i < length1; i++) { - printf("%lf ", array1[i]); - } - printf("\n"); + array = &array[1]; + printArray(array, length); + sort(array, length); + printArray(array, length); - sort(array1, length1); + printf("\n"); + randomArray(); - printf("Test 1 - Sorted array:\n"); - for (int i = 0; i < length1; i++) { - printf("%lf ", array1[i]); - } - printf("\n\n"); - - // Тест 2: Все числа одинаковые - double array2[] = {1.0, 1.0, 1.0, 1.0}; - int length2 = sizeof(array2) / sizeof(array2[0]); - - printf("Test 2 - Original array:\n"); - for (int i = 0; i < length2; i++) { - printf("%lf ", array2[i]); - } - printf("\n"); - - sort(array2, length2); - - printf("Test 2 - Sorted array:\n"); - for (int i = 0; i < length2; i++) { - printf("%lf ", array2[i]); - } - printf("\n\n"); - - // Тест 3: Набор чисел с отрицательными значениями - double array3[] = {-3.0, -1.5, -7.2, 2.1, 0.0}; - int length3 = sizeof(array3) / sizeof(array3[0]); - - printf("Test 3 - Original array:\n"); - for (int i = 0; i < length3; i++) { - printf("%lf ", array3[i]); - } - printf("\n"); - - sort(array3, length3); - - printf("Test 3 - Sorted array:\n"); - for (int i = 0; i < length3; i++) { - printf("%lf ", array3[i]); - } - printf("\n\n"); - - // Тест 4: Набор чисел с разной экспонентой - double array4[] = {1e-10, 1e+10, 1.0, 1e-5, 1e+5}; - int length4 = sizeof(array4) / sizeof(array4[0]); - - printf("Test 4 - Original array:\n"); - for (int i = 0; i < length4; i++) { - printf("%e ", array4[i]); - } - printf("\n"); - - sort(array4, length4); - - printf("Test 4 - Sorted array:\n"); - for (int i = 0; i < length4; i++) { - printf("%e ", array4[i]); - } - printf("\n\n"); - - // Тест 5: Граничные значения (минимальное и максимальное double) - double array5[] = {1e-308, 1e+308, 0.0, -1e-308, -1e+308}; - int length5 = sizeof(array5) / sizeof(array5[0]); - - printf("Test 5 - Original array:\n"); - for (int i = 0; i < length5; i++) { - printf("%e ", array5[i]); - } - printf("\n"); - - sort(array5, length5); - - printf("Test 5 - Sorted array:\n"); - for (int i = 0; i < length5; i++) { - printf("%e ", array5[i]); - } - printf("\n"); - - return 0; + return 0; } diff --git a/Sorting/9Ex/makefile b/Sorting/9Ex/makefile index 1141a15..cec5611 100644 --- a/Sorting/9Ex/makefile +++ b/Sorting/9Ex/makefile @@ -1,4 +1,12 @@ -all: - gcc -c main.c seagwithsob.c - gcc main.o seagwithsob.o && del *.o - a.exe \ No newline at end of file +all: main.o seagwithsob.o tools.o + gcc main.o seagwithsob.o tools.o && del *.o + a.exe + +main.o: main.c + gcc -c main.c + +seagwithsob.o: seagwithsob.c + gcc -c seagwithsob.c + +tools.o: tools.c + gcc -c tools.c diff --git a/Sorting/9Ex/seagwithsob.c b/Sorting/9Ex/seagwithsob.c index d3a1c29..4943dea 100644 --- a/Sorting/9Ex/seagwithsob.c +++ b/Sorting/9Ex/seagwithsob.c @@ -3,7 +3,7 @@ void sort(double * array, int length) { double zero[length]; double unit[length]; - int index; + int index, timer = -clock(); for (int j = 0; j < 63; ++j) { index = 0; @@ -25,6 +25,9 @@ void sort(double * array, int length) { for (int i = 0; i < index; ++i) array[i] = unit[index - i - 1]; for (int i = index; i < length; ++i) array[i] = zero[i - index]; + + timer += clock(); + printf("Required time for sorting is %lf seconds\n", (double)timer / CLOCKS_PER_SEC); } void rewrite(double * array, double * zero, int len_zero, double * unit, int len_unit) { diff --git a/Sorting/9Ex/seagwithsob.h b/Sorting/9Ex/seagwithsob.h index ada5c4a..f23efc2 100644 --- a/Sorting/9Ex/seagwithsob.h +++ b/Sorting/9Ex/seagwithsob.h @@ -2,6 +2,8 @@ #define SEAGWITHSOB #include +#include +#include void sort(double * array, int length); void rewrite(double * array, double * zero, int len_zero, double * unit, int len_unit); diff --git a/Sorting/9Ex/tools.c b/Sorting/9Ex/tools.c new file mode 100644 index 0000000..f9a60a3 --- /dev/null +++ b/Sorting/9Ex/tools.c @@ -0,0 +1,92 @@ +#include "tools.h" + +FILE * getFile() { + char filename[50]; + + printf("Enter file name: "); + if (scanf("%s", &filename) == 1) { + FILE * file = fopen(filename, "r"); + if (file == NULL) { + printf("Error file!\n)"); + return NULL; + } else { + return file; + } + } else { + printf("Empty name!\n"); + return NULL; + } +} + +double * getArray(FILE * file) { + char filename[50]; + int i, size = 2; + double * array = NULL; + double current; + + if (fscanf(file, "%lf", ¤t) != 1) { + printf("File if empty!"); + return array; + } + + array = (double *)malloc(size * sizeof(double)); + + i = 1; + do { + if (i >= size) { + size *= 2; + array = (double *)realloc(array, sizeof(double) * size); + } + array[i] = current; + ++i; + } while (fscanf(file, "%lf", ¤t) == 1); + + array = (double *)realloc(array, sizeof(double) * i); + array[0] = (double)i; + + return array; +} + + +bool orderliness(double * array, int length) { + for (int i = 1; i < length; ++i) if ((array[i] - array[i - 1]) < exp) return false; + return true; +} + +void randomArray() { + int length; + + printf("Enter length of array: "); + if (scanf("%d", &length) == 1) { + double * array = (double *)malloc(length * sizeof(double)); + generate(array, length); + printArray(array, length); + printf("\n"); + sort(array, length); + printf("\n"); + printArray(array, length); + } else { + printf("Length not entered!\n"); + } +} + +void generate(double * array, int length) { + srand(time(NULL)); + + for (int i = 0; i < length; ++i) { + array[i] = 1.*rand() / (1. + rand()) * 1000; + } +} + +void printArray(double * array, int length) { + length = (length > 10) ? 10 : length; + + for (int i = 0; i < length; ++i) { + printf("%.2lf ", array[i]); + } + + printf("\n"); + +} + + diff --git a/Sorting/9Ex/tools.h b/Sorting/9Ex/tools.h new file mode 100644 index 0000000..1830ada --- /dev/null +++ b/Sorting/9Ex/tools.h @@ -0,0 +1,20 @@ +#ifndef TOOLS +#define TOOLS + +#include "seagwithsob.h" +#include +#include +#include +#include +#include + +#define exp -1.e-6 + +FILE * getFile(); +double * getArray(FILE * file); +bool orderliness(double * array, int length); +void randomArray(); +void generate(double * array, int length); +void printArray(double * array, int length); + +#endif