From 4e08a3ad71336d75ecd0aaf4f26b1a3b19ff010b Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Fri, 8 Dec 2023 12:59:45 +0300 Subject: [PATCH] 1 1.4 to prod --- other/Vova`s Proj/main.c | 92 ++++++ other/Vova`s Proj/out/app | Bin 0 -> 16520 bytes other/Vova`s Proj/readme | 34 ++ other/Vova`s Proj/text.txt | 36 +++ patch_note.md | 3 + {test => project}/ver1.4/Makefile | 0 project/ver1.4/README.md | 35 ++ {test => project}/ver1.4/declare.h | 2 +- {test => project}/ver1.4/functions.c | 9 +- {test => project}/ver1.4/main.c | 10 +- .../ver1.4/out/app | Bin 21552 -> 21552 bytes project/ver1.4/out/function_zeros_calculator | Bin 0 -> 21584 bytes test/ver1.5/Makefile | 26 ++ test/{ver1.4 => ver1.5}/README | 3 +- test/ver1.5/declare.h | 21 ++ test/ver1.5/functions.c | 305 ++++++++++++++++++ test/ver1.5/main.c | 71 ++++ test/ver1.5/out/app | Bin 0 -> 21552 bytes test/ver1.5/out/function_zeros_calculator | Bin 0 -> 21584 bytes 19 files changed, 636 insertions(+), 11 deletions(-) create mode 100644 other/Vova`s Proj/main.c create mode 100755 other/Vova`s Proj/out/app create mode 100644 other/Vova`s Proj/readme create mode 100644 other/Vova`s Proj/text.txt create mode 100644 patch_note.md rename {test => project}/ver1.4/Makefile (100%) create mode 100644 project/ver1.4/README.md rename {test => project}/ver1.4/declare.h (96%) rename {test => project}/ver1.4/functions.c (97%) rename {test => project}/ver1.4/main.c (66%) rename test/ver1.4/out/function_zeros_calculator => project/ver1.4/out/app (76%) create mode 100755 project/ver1.4/out/function_zeros_calculator create mode 100644 test/ver1.5/Makefile rename test/{ver1.4 => ver1.5}/README (94%) create mode 100644 test/ver1.5/declare.h create mode 100644 test/ver1.5/functions.c create mode 100644 test/ver1.5/main.c create mode 100755 test/ver1.5/out/app create mode 100755 test/ver1.5/out/function_zeros_calculator diff --git a/other/Vova`s Proj/main.c b/other/Vova`s Proj/main.c new file mode 100644 index 0000000..18b5dd7 --- /dev/null +++ b/other/Vova`s Proj/main.c @@ -0,0 +1,92 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int linesWritten = 0; + +void signalHandler(int signal) +{ + printf("Number of lines written: %d\n", linesWritten); +} + +void writeFile(const char *fileName, int numLines, const char *placeholder) +{ + int fd = open(fileName, O_CREAT | O_WRONLY | O_TRUNC, 0666); + + if (fd == -1) + { + printf("Failed to open the file\n"); + exit(EXIT_FAILURE); + } + + if (flock(fd, LOCK_EX) == -1) + { + printf("Failed to lock file for exclusive use\n"); + exit(EXIT_FAILURE); + } + + signal(SIGINT, signalHandler); + + // lseek(fd, 0, SEEK_END); + + for (int i = 0; i < numLines; i++) + { + dprintf(fd, "%s\n", placeholder); + linesWritten++; + + usleep(100000); + } + + if (flock(fd, LOCK_UN) == -1) + { + printf("Failed to unlock file\n"); + exit(EXIT_FAILURE); + } + + close(fd); +} + +int main(int argc, char *argv[]) +{ + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + exit(EXIT_FAILURE); + } + + const char *fileName = argv[1]; + if (strstr(fileName, ".txt") == NULL) + { + printf("The provided file must be ended with .txt\n"); + exit(EXIT_FAILURE); + } + + int numLines = atoi(argv[2]); + if (numLines <= 0) + { + printf("The number of lines must be a positive integer\n"); + exit(EXIT_FAILURE); + } + + char *placeholder = argv[3]; + while (*placeholder) + { + if (!isalnum(*placeholder) && !isspace(*placeholder)) + { + printf("The placeholder must consist of letters and numbers\n"); + exit(EXIT_FAILURE); + } + placeholder++; + } + + writeFile(fileName, numLines, argv[3]); + + return 0; +} \ No newline at end of file diff --git a/other/Vova`s Proj/out/app b/other/Vova`s Proj/out/app new file mode 100755 index 0000000000000000000000000000000000000000..6d7c039381b1d67839b6098469a40328404ee698 GIT binary patch literal 16520 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 literal 0 HcmV?d00001 diff --git a/other/Vova`s Proj/readme b/other/Vova`s Proj/readme new file mode 100644 index 0000000..3286ae6 --- /dev/null +++ b/other/Vova`s Proj/readme @@ -0,0 +1,34 @@ +Руководство для пользователя: + +1. Что делают функции: +Функция writeFile отвечает за запись определяемого пользователем количества строк в указанный файл, используя указанную строку в качестве заполнителя. +Обратите внимание: при записи в файл одним процессом другие процессы не будут иметь к нему (к файлу) доступа - они начнут заполнять его только лишь после окончания работы первого. +Файл не перезаписывается новым процессом, а продолжает пополняться новыми строками со следующей после +последней строки. + +Функция signalHandler используется для обработки прерывания программы через сигнал, который подаётся при помощи комбинации клавиш Ctrl+C. + + +2. Как компилировать программу: +Для компиляции программы необходимо использовать компилятор языка C, например gcc. +Пример команды для компиляции программы: открываем терминал, в строке пишем +gcc program.c -o program. +Здесь "program" - название скомпилированного файла, а "program.c" - название файла с исходным кодом программы. + + +4. Как выводить промежуточный результат программы: +Промежуточный результат программы будет выводиться автоматически при нажатии клавиш Ctrl+C. + + +5. Пример использования программы: +Программа принимает три аргумента командной строки: название файла, количество строк для записи и строку-заполнитель. +Например, для записи 10 строк в файл "test.txt" с использованием строки "Hello", необходимо выполнить следующую команду: +./program test.txt 10 Hello. +При этом, промежуточный результат будет выводиться при нажатии клавиш Ctrl+C. + + +6. Предостережения или что НЕ нужно делать, чтобы программа работала корректно: +- использовать для заполнения файлы только с расширением .txt; +- использовать в строке-заполнителе цифры и буквы латинского алфавита, для использования специальных символов (это - &, ', \, |) +именно как элементов строки-заполнителя необходимо для правильной работы программы экранировать их, т.е. использовать \ перед ними; +- использование данной программы предполагается на машинах с предустановленной ОС Debian (12-й версии); \ No newline at end of file diff --git a/other/Vova`s Proj/text.txt b/other/Vova`s Proj/text.txt new file mode 100644 index 0000000..2cf66c7 --- /dev/null +++ b/other/Vova`s Proj/text.txt @@ -0,0 +1,36 @@ +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia +mia diff --git a/patch_note.md b/patch_note.md new file mode 100644 index 0000000..7b2e784 --- /dev/null +++ b/patch_note.md @@ -0,0 +1,3 @@ +1.4 Добавлен вывод графиков функций, добавлена проприетарная функция выхода с возвратом значений настроек системы по умолчанию. + +1.5 Добавлен второй обработчик сигналов для комбинации Ctrl+Z - переход в exit_777(выход из программы с возвратом настроек по умолчанию.) diff --git a/test/ver1.4/Makefile b/project/ver1.4/Makefile similarity index 100% rename from test/ver1.4/Makefile rename to project/ver1.4/Makefile diff --git a/project/ver1.4/README.md b/project/ver1.4/README.md new file mode 100644 index 0000000..344d4d1 --- /dev/null +++ b/project/ver1.4/README.md @@ -0,0 +1,35 @@ +# Function Zeros Calculator + +## Описание +Эта программа предназначена для вычисления нулей функции на языке C в среде Linux. + +## Установка +1. Склонируйте репозиторий: git clone https://github.com/ada-dmitry/tmp_project.git +2. Перейдите в каталог проекта: cd /Project_1.2 + +## Использование +0. Для нормальной работы программы необходимо установить программу GNU PLot + (sudo apt install gnuplot) +1. Соберите программу: make +2. Запустите программу: ./out/function_zeros_calculator +3. Введите необходимые параметры для вычисления нуля функции: a - ЛЕВАЯ граница отрезка + b - ПРАВАЯ граница отрезка, eps > 0 - точность вычисления корня(до 10^-6). + +## Замечания +1. Для корректной работы программы, необходимо вводить отрезок, на котором есть лишь один корень + (это можно проверить благодаря графику). +2. После вызова меню выбора действий (Ctrl+C) можно использовать как верхний регистр, так и нижний. +3. Не рекомендуется бесконечно вызывать Ctrl+C без выбора действия, это может повлечь ошибки + вследствие переполнения памяти. + + +## Обработка сигнала SIGINT + Программа обрабатывает сигнал SIGINT, что позволяет давать пользователю выбор действия +при нажатии сочетания клавиш Ctrl+C. + +## Авторы +Антипенко Дмитрий Андреевич [C22-712] - https://github.com/ada-dmitry/ +Кузнецов Даниил Евгеньевич [C22-712] +Никитин Михаил Андреевич [C22-712] +Ускова Екатерина Александровна [C22-712] + diff --git a/test/ver1.4/declare.h b/project/ver1.4/declare.h similarity index 96% rename from test/ver1.4/declare.h rename to project/ver1.4/declare.h index 7b60d34..572de16 100644 --- a/test/ver1.4/declare.h +++ b/project/ver1.4/declare.h @@ -17,4 +17,4 @@ void newton_method(); double numerical_derivative(double x); void exit_777(); void show_grapgh(); -void input_diap(); \ No newline at end of file +void input_diap(); diff --git a/test/ver1.4/functions.c b/project/ver1.4/functions.c similarity index 97% rename from test/ver1.4/functions.c rename to project/ver1.4/functions.c index f3177b3..c325363 100644 --- a/test/ver1.4/functions.c +++ b/project/ver1.4/functions.c @@ -2,7 +2,7 @@ #include #include #include -#include +// #include #include #include @@ -159,8 +159,9 @@ R - начать поиск на другом отрезке: \n"); if (f(*pa) * f(*pb) > 0) { - printf("В указанных границах нуля функции не существует.\n"); - printf("Нажмите Ctrl+C и поменяйте границы\n"); + printf("\nВ указанных границах нуля функции не существует.\n"); + printf("Поменяйте границы\n"); + choose_path(); } if (*pa == *pb) { @@ -255,7 +256,7 @@ void input_diap() } __fpurge(stdin); - printf("Выберите метод вычисления корня:\ + printf("Выберите метод вычисления корня и нажмите Enter:\ 0 - метод вилки, 1 - метод хорд, 2 - метод касательных\n(По умолчанию: 0): "); *mth = getchar(); diff --git a/test/ver1.4/main.c b/project/ver1.4/main.c similarity index 66% rename from test/ver1.4/main.c rename to project/ver1.4/main.c index ba324ed..bf5954b 100644 --- a/test/ver1.4/main.c +++ b/project/ver1.4/main.c @@ -18,13 +18,13 @@ int main() pb = &b; px = &x; - struct sigaction sig; // Инициализация структуры, отвечающей за обработку сигнала. + struct sigaction sig_int; // Инициализация структуры, отвечающей за обработку сигнала. // Замена стандартного алгоритма на необходимый для вызова меню действий. - sig.sa_handler = ctrlc_handler; - sig.sa_flags = 0; // Очистка флагов "на всякий случай". - sigemptyset(&sig.sa_mask); // Очистка маски "на всякий случай". + sig_int.sa_handler = ctrlc_handler; + sig_int.sa_flags = 0; // Очистка флагов "на всякий случай". + sigemptyset(&sig_int.sa_mask); // Очистка маски "на всякий случай". - if (sigaction(SIGINT, &sig, NULL) == -1) // Обработчик ошибок и инициализация сигнала SIGINT. + if (sigaction(SIGINT, &sig_int, NULL) == -1) // Обработчик ошибок и инициализация сигнала SIGINT. { perror("sigaction"); return 1; diff --git a/test/ver1.4/out/function_zeros_calculator b/project/ver1.4/out/app similarity index 76% rename from test/ver1.4/out/function_zeros_calculator rename to project/ver1.4/out/app index f06347bff182ab4f1eb95a8d4cce8b4b3b479cc1..84ae7f9ac6032969c4468428afef4ab6f0f4af5a 100755 GIT binary patch delta 1870 zcmZ8idu&rx7{BL^vb9)l_X?Yic4I?^!>#4jB21W2cQ?^&CS;-{fWs<55Xf+1bTuqh zM=cJH5->jIAL_)A3~!u`jAQa6wnw6$qzM6S)zYSZ78iB7E<_mG2{nsGZJZ)w$;VVR6* zSy_pMoYwNDmJpIbefAZ~Q6fpcZc~$s7wum~PuUle9dx2&FUhCxIP95WZr59HFs24g zHBL#oq}U`Zx6o4#`{Z&M)S%>3l}#ObDIImp^rwz9sUg!>$%ts^4x@~uKRE)JkSQu` zdInU1KNIeY3S3{O7~%SjVa7mfpoo|6Z^j4C;g~ZDCn#)(6VUny)RzuF!x$@30{$SV z3hiMfP#0I0DuFF=Wvvoe7gx3_fvUJttpv*B%7aRvIIe6|0!}DuD6koo)P|$&oZ1oo z(QRl1Y!`!2DmVqbSJtTo6Q<|GS7XwvsWWHFoK!e{fsSp3U_MmHqr}+Imn!-aGn#{L z#8CdE&*v18_4GiFebS?_9x-OvNWag?@vj2{;WPOqHeZ9sz9BxC^pU&yxV#B^>!?>Y)eLYf@GgE)Nx5kmM%_1!f-4>4O!P4T)yF3WjdA5krA`W}25jv_J>IKBoORzt{%9qj?JO!6s3ozHp!P$2e4 z|K|?_zH64`H)7GJH;nPM@p?hiL6Il(_Mv_#RBt$@?=qrdcO{4u!_%7)_~LlSR>QH< z+l&o5X)ti%WIcxvzNe;4LB+3c;aox{iy~Tm9IDu`>Z=^tX0;)OZ?b_=z(@ISfh1j4 z>a3%{@F`WDsBgLe8(?x{9o`{2JO^uR7-z*2!zk=jcJ2ZTzM{W5%*q!$_y5cP`7r(4 zk?*e`X9Mmct3gkk>>mdV$`!(y#G^T|nDw#;5lBlBiz$#YJTjO<7_J90SE5^0UJMZ!Hh zBA;b@H`P3`m7bY9N)OFmL$A(zoi@&2?vMT?SY`jrSQLm($SaU*&M?*lS=PHwb! zD`QT`GRO+ZLs7;yLpshf_6B5KA8;TKoMWsPa^ZQ#u0yhZ#!lWt zT^{MBcX{k&0WI_7l6tz)lPkAJ=^oEC`FI~~_1LGm!LBO-$==Dfm*u6_i3wjO+?JRm zWx=!$Y|s2oM?Lnbi8^B|V2X!f$wPiX$P&%9;FScLU+f`y+S+3G1QMqEOG@P>ZrWEe zNEXwc`&Pr_S~`P}E^XzqT0)|<$2&xVTIc=Wnn7!KMUgpgI)_KA^kfBc6KP6ip=I1Z TV0qETne(&yapgXtwywBI~{XNgS z&t8X*bl_(q5m|A9er3^Uk`u8e!qC>Jt4R)t8OS%(DM@#Wqp=-5i^m`Hl}blHUifrp z!R!Nh4cmWG_k_G)A;t9O%$LY!wJJ82h%7~|k82f4Ej7n4C3&h6pFqfbb;GPKk?c?t z6T=C4QJs@yCnSnGt>tnT5d>$S)Sk;Xy}Xv5wic1sX;|`y#7Yk&TZg)xD~J9ROA}JR@Rb|W%^zBV!FDwWJqJ!+$E}UZg3ydi__jz|HTd=Sj>*QODkUM@ z>Gs!Uqn6v*JkRJODxGgsYILm_`9_=mqdQY`B435>b$r$M?Y}M7xEULvb?e=2ql2lb zt{NZ_-mUIH=XHjkT;(l`yZZ=lq{Dw=F|53IZLrH!Lwp29llfRsVH4S{O+~ z!ks{Z(qw*8=X8c2rVe?;fb`uD>FU!~O<~3X(~khWOj3L-mjT?vQ@A&Do>RCL25#B? zxP98S(IC|rjyEt<$CDHUf-9<0n&OIFdYZZY0nkt#RJym&D7y|=Xi>xT7VUsd`v?!u zNw7`_j?-h|M}wTeFpL{Z3`0)OYYqV1GypV-<9Ves3k8=Ri#i=$Xx}${Kd*Gu$P;<_ zP&*9O(G}45=~00pYQ?+6(|risHQljYcT_rjIG}!=K`tibZG`YMm3pJ}(p=iMzxCSA z1*p9Y)i|)~+Z@?qPCyDjWF2DxZ>0&AF}cCqj3ai+&-7q_>Ba&b_KN^a21oTuqp${= zF=8wq_%g)Hlb?oD9ANU(&~uHFluTFCG#fatH0zv=*L>)T&ih%zrnNvdc<-NJO#e6} z8zpM>aG`W3zyzWB!Ey7z+usWhpEyjLNohP~;<_NH`5C7pY3bvUs<`NLk#;U#uNEx% zp3vEO<1~6nCf$_3*Q5vH(NeI+Rr<5Rq4^iaeuu3c@)qR4uZ*=r9=pJp1+%yHH^vr0 z9)m1}OdVpZ7IH7-2aux|fdiRviLncihyP-10`mD`#u7zA=!9Gb88*UL1th;PE%dvB zq*RSVEwrW``jfHaAxL&aS>6##%wZv&ArFO{ghZJ3 zfvsJm&O&QawZ>REOu;ZLdB{10e5xKS+!aFok+n3l*hUi7s^WrBqR{>JRpLNCy=WgL zdGze^_3-4D%p>HuTDhX0kn{Ac<0}5FdRG1rLEfP6m*zwyX7DY5O#4fb8%ATwvLmPc TK|WEIA5l?Y#8jxBvP0tkD;dN* diff --git a/project/ver1.4/out/function_zeros_calculator b/project/ver1.4/out/function_zeros_calculator new file mode 100755 index 0000000000000000000000000000000000000000..75b4bd6f821653ba299ba538b5a42bc262045c7c GIT binary patch literal 21584 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 SwTMVo 0 - точность вычисления корня(до 10^-6). ## Замечания -1. Для корректной работы программы, необходимо вводить отрезок, на котором есть лишь один корень. +1. Для корректной работы программы, необходимо вводить отрезок, на котором есть лишь один корень + (это можно проверить благодаря графику). 2. После вызова меню выбора действий (Ctrl+C) можно использовать как верхний регистр, так и нижний. 3. Не рекомендуется бесконечно вызывать Ctrl+C без выбора действия, это может повлечь ошибки вследствие переполнения памяти. diff --git a/test/ver1.5/declare.h b/test/ver1.5/declare.h new file mode 100644 index 0000000..6a9a50a --- /dev/null +++ b/test/ver1.5/declare.h @@ -0,0 +1,21 @@ +extern double a, b, eps, x, *pa, *pb, *px; +extern short method, *mth, sig_flag; + +// Декларирование глобальных переменных, +// как внешних для последующего использования их во всей программе. +#define H 0.000001 +#define A 0 +#define B 100000000 +#define EPS 0.001 + +double f(double x); +void ctrlc_handler(int signum); +void ctrlz_handler(int signum); +void choose_path(); +void fork_method(); +void chord_method(); +void newton_method(); +double numerical_derivative(double x); +void exit_777(); +void show_grapgh(); +void input_diap(); diff --git a/test/ver1.5/functions.c b/test/ver1.5/functions.c new file mode 100644 index 0000000..86cef3e --- /dev/null +++ b/test/ver1.5/functions.c @@ -0,0 +1,305 @@ +#include +#include +#include +#include +// #include +#include +#include + +#include "declare.h" + +double f(double x) // Функция, заданная пользователем, для которой происходит поиск корней. +{ + return x - x * x + 1349; +} + +void show_grapgh() +{ + struct termios old_term, new_term; + + tcgetattr(STDIN_FILENO, &old_term); + new_term = old_term; + new_term.c_lflag &= ~(ECHO | ICANON); + tcsetattr(STDIN_FILENO, TCSANOW, &new_term); + + char func[100] = "x - x * x + 1349"; + + // Подключение GNU Plot + FILE *gp = popen("gnuplot -persist", "w"); + + if (gp == NULL) + { + printf("GNUerror\n"); + exit(3); + } + fprintf(gp, "set xrange [-500:500]\n"); + fprintf(gp, "set yrange [0:500]\n"); + fprintf(gp, "plot %s\n", func); + fflush(gp); // очищение буфера вывода + sig_flag = 1; + printf("Нажмите любую клавишу, чтобы продолжить...\n"); + getchar(); + sig_flag = 0; + fprintf(gp, "exit\n"); + tcsetattr(STDIN_FILENO, TCSANOW, &old_term); + return; +} + +// Приближенное вычисление производной по методу конечных разностей +double numerical_derivative(double x) +{ + return (f(x + H) - f(x)) / H; +} + +void newton_method() +{ + *pb = *pa; + do + { + printf("%lf %lf\n", *pa, *pb); + *pa = *pb; + *pb = *pa - f(*pa) / numerical_derivative(*pa); + // Используем численно вычисленную производную + *px = *pb; + sleep(1); + } while (fabs(*pb - *pa) > eps && f(x) != 0); + return; +} + +void chord_method() +{ + *px = *pa; + while ((*pb - *pa) > eps && f(x) != 0) + { + // Находим точку пересечения хорды с осью x + *px = (*pa * f(*pb) - *pb * f(*pa)) / (f(*pb) - f(*pa)); + printf("%lf %lf\n", *pa, *pb); + // Проверяем знаки функции в точках a и x + if (f(*px) == 0) + break; + else if (f(*px) * f(*pa) < 0) + *pb = *px; + else + *pa = *px; + sleep(1); + } + return; +} + +void fork_method() // Функция поиска корней, использующая метод вилки. +{ + do + { + *px = (*pa + *pb) / 2; // метод деления отрезка пополам + + // Печать границ для отладки и для отслеживания хода вычислений + printf("%lf %lf\n", *pa, *pb); + + // Проверка, какой из отрезков [a, x] или [x, b] подходит под условие существования корня, + // т.е. различие знаков на границе. + + if (f(*pa) * f(x) <= 0) + *pb = x; + else if (f(*pb) * f(x) <= 0) + *pa = x; + + sleep(1); // Принудительное ожидание программой, для возможности прерывания пользователем. + + } while (fabs(*pb - *pa) > eps && f(x) != 0); + return; +} + +void choose_path() // Функция выбора действия после вызова сигнала. +{ + sig_flag = 1; + + char choice; + + struct termios default_term, modif_term; // Задание структуры, определяющей терминал Linux. + + // Получение текущих настроек терминала + tcgetattr(0, &default_term); + modif_term = default_term; + // Отключение символа ECHO + modif_term.c_lflag &= ~(ECHO | ICANON); + // Применение новых настроек терминала + tcsetattr(0, TCSANOW, &modif_term); + + printf("\nПродолжить поиск корня?\n"); + printf("\nC - продолжить, A - закончить работу программы, \ +R - начать поиск на другом отрезке: \n"); + + do + { + // Очистка стандартного потока ввода от "лишних" + __fpurge(stdin); + choice = getchar(); + // scanf("%c", &choice); // Запись буквы, введенной пользователем в переменную choice. + switch (choice) + { + case 'C': // Выбор вида "Продолжить вычисление". + case 'c': + sig_flag = 0; + return; // Выход из функции без каких-либо изменений. + + case 'A': // Выбор вида "Завершить вычисление". + case 'a': + printf("\nКорень уравнения: %lf\n", *px); + printf("Работа программы завершена.\n"); + exit_777(); // Принудительное завершение программы с выводом текущего приближения корня. + + case 'R': // Выбор вида "Продолжить вычисления с новым отрезком". + case 'r': + // Возврат к обычному выводу + tcsetattr(0, TCSANOW, &default_term); + + printf("Введите новые значения границ a и b: "); + + scanf("%lf%lf", pa, pb); + + if (f(*pa) * f(*pb) > 0) + { + printf("\nВ указанных границах нуля функции не существует.\n"); + printf("Поменяйте границы\n"); + choose_path(); + } + if (*pa == *pb) + { + if (f(*pa) == 0) + { + printf("\nКорень уравнения: %lf\n", *pa); + printf("Работа программы завершена.\n"); + exit_777(); + } + else + { + printf("Нажмите Ctrl+C и поменяйте границы\n"); + } + } + + sig_flag = 0; + return; + + default: + printf("Ошибка ввода, повторная попытка...\n"); + __fpurge(stdin); + } + } while (choice != 'A' || choice != 'R' || choice != 'C' || choice != 'a' || choice != 'r' || choice != 'c' || choice != 'M' || choice != 'm'); + + // Применение новых настроек терминала + tcsetattr(0, TCSANOW, &default_term); + + sig_flag = 0; +} + +void ctrlc_handler(int signum) // Функция, заменяющая стандартный алгоритм для сигнала SIGINT. +{ + if (sig_flag == 0) + { + printf("\nТекущее приближение: %lf\n", *px); + choose_path(); + } + return; +} + +void ctrlz_handler(int signum) +{ + printf("Аварийное завершение программы, возврат к настройкам по умолчанию..."); + exit_777(); +} + +void exit_777() +{ + struct termios term; + tcgetattr(0, &term); + term.c_lflag |= ~ECHO; + tcsetattr(0, TCSANOW, &term); + exit(1); +} + +void input_diap() +{ + double tmp; + char input[50]; + sig_flag = 1; + printf("\nПоочередно вводите через Enter: левую границу, правую и точность\n\ +(или нажимайте Enter для значений по умолчанию: -10000/10000/0.0001): "); + + // printf("Введите левую границу отрезка (или нажмите Enter для значения по умолчанию): "); + fgets(input, sizeof(input), stdin); + + if (input[0] == '\n') + { + *pa = A; // значение по умолчанию + } + else + { + sscanf(input, "%lf", pa); + } + + // printf("Введите правую границу отрезка (или нажмите Enter для значения по умолчанию): "); + fgets(input, sizeof(input), stdin); + + if (input[0] == '\n') + { + *pb = B; // значение по умолчанию + } + else + { + sscanf(input, "%lf", pb); + } + + // printf("Введите точность вычисления (или нажмите Enter для значения по умолчанию): "); + fgets(input, sizeof(input), stdin); + + if (input[0] == '\n') + { + eps = EPS; // значение по умолчанию + } + else + { + sscanf(input, "%lf", &eps); + } + + __fpurge(stdin); + printf("Выберите метод вычисления корня и нажмите Enter:\ + 0 - метод вилки, 1 - метод хорд, 2 - метод касательных\n(По умолчанию: 0): "); + *mth = getchar(); + + if (*pa > *pb) // Если пользователь перепутал границы + { + printf("Границы указаны неверно, запуск задачи с исправленным условием\n"); + tmp = *pa; + *pa = *pb; + *pb = tmp; + } + + if (f(*pa) * f(*pb) > 0) + { + sig_flag = 0; + printf("В указанных границах нуля функции не существует.\n"); + printf("Поменяйте границы\n"); + choose_path(); + } + if (eps < 0) // Если пользователь указал отрицательную точность + { + eps = eps * (-1); + printf("Точность отрицательна, условие приведено в порядок, запуск решения...\n"); + } + + if (*pa == *pb) + { + if (f(*pa) == 0) + { + printf("\nКорень уравнения: %lf\n", *pa); + printf("Работа программы завершена.\n"); + exit_777(); + } + else + { + printf("Нажмите Ctrl+C и поменяйте границы\n"); + } + } + sig_flag = 0; + return; +} \ No newline at end of file diff --git a/test/ver1.5/main.c b/test/ver1.5/main.c new file mode 100644 index 0000000..dfbd1dd --- /dev/null +++ b/test/ver1.5/main.c @@ -0,0 +1,71 @@ +#include +#include +#include +#include +#include + +#include "declare.h" + +double a, b, eps, x, *pa, *pb, *px; +short method, *mth, sig_flag; + +int main() +{ + sig_flag = 0; + method = 0; + mth = &method; + pa = &a; + pb = &b; + px = &x; + + struct sigaction sig_int, sig_tstp; // Инициализация структуры, отвечающей за обработку сигнала. + // Замена стандартного алгоритма на необходимый для вызова меню действий. + sig_int.sa_handler = ctrlc_handler; + sig_int.sa_flags = 0; // Очистка флагов "на всякий случай". + sigemptyset(&sig_int.sa_mask); // Очистка маски "на всякий случай". + sig_tstp.sa_handler = ctrlz_handler; + sig_tstp.sa_flags = 0; + sigemptyset(&sig_tstp.sa_mask); + + if (sigaction(SIGINT, &sig_int, NULL) == -1) // Обработчик ошибок и инициализация сигнала SIGINT. + { + perror("sigaction"); + return 1; + } + if (sigaction(SIGTSTP, &sig_tstp, NULL) == -1) // Обработчик ошибок и инициализация сигнала SIGTSTP. + { + perror("sigaction"); + return 1; + } + + show_grapgh(); + input_diap(); + + if (*mth == 0) + { + printf("Fork\n"); + fork_method(); + } + else if (*mth == 1) + { + printf("Chord\n"); + chord_method(); + } + else if (*mth == 2) + { + printf("Newton\n"); + newton_method(); + } + else + { + printf("Fork\n"); + fork_method(); + } + + printf("\nКорень уравнения: %lf\n", *px); + printf("Работа программы завершена.\n"); + + return 0; +} + +// MEEEEEEEOW \ No newline at end of file diff --git a/test/ver1.5/out/app b/test/ver1.5/out/app new file mode 100755 index 0000000000000000000000000000000000000000..84ae7f9ac6032969c4468428afef4ab6f0f4af5a GIT binary patch literal 21552 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 literal 0 HcmV?d00001 diff --git a/test/ver1.5/out/function_zeros_calculator b/test/ver1.5/out/function_zeros_calculator new file mode 100755 index 0000000000000000000000000000000000000000..75b4bd6f821653ba299ba538b5a42bc262045c7c GIT binary patch literal 21584 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 SwTMVo