From 9c3ba250d4b448cbddff36b1835de50315f94a78 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Thu, 7 Dec 2023 12:51:59 +0300 Subject: [PATCH] added plot --- Project_1.3/functions.c | 57 +------- Project_test/out/function_zeros_calculator | Bin 21200 -> 0 bytes {Project_test => Test}/Makefile | 7 +- {Project_test => Test}/README | 0 {Project_test => Test}/declare.h | 3 +- {Project_test => Test}/functions.c | 148 ++++++++++++--------- {Project_test => Test}/main.c | 7 +- Test/out/function_zeros_calculator | Bin 0 -> 21424 bytes 8 files changed, 96 insertions(+), 126 deletions(-) delete mode 100755 Project_test/out/function_zeros_calculator rename {Project_test => Test}/Makefile (84%) rename {Project_test => Test}/README (100%) rename {Project_test => Test}/declare.h (92%) rename {Project_test => Test}/functions.c (55%) rename {Project_test => Test}/main.c (97%) create mode 100755 Test/out/function_zeros_calculator diff --git a/Project_1.3/functions.c b/Project_1.3/functions.c index 366a869..a8cacfe 100644 --- a/Project_1.3/functions.c +++ b/Project_1.3/functions.c @@ -94,7 +94,7 @@ void choose_path() // Функция выбора действия после в printf("\nПродолжить поиск корня?\n"); printf("\nC - продолжить, A - закончить работу программы, \ -R - начать поиск на другом отрезке, M - выбрать другой способ решения: \n"); +R - начать поиск на другом отрезке: \n"); do { @@ -146,61 +146,6 @@ R - начать поиск на другом отрезке, M - выбрать } } return; - case 'M': - case 'm': - __fpurge(stdin); - // Включение символа ECHO - term.c_lflag |= ECHO; - - // Применение новых настроек терминала - tcsetattr(0, TCSANOW, &term); - printf("Выберите метод вычисления корня:\ - 0 - метод вилки, 1 - метод хорд, 2 - метод касательных\n(По умолчанию: 0)\n"); - *mth = getchar(); - - printf("Введите новые значения границ a и b: "); - - scanf("%lf%lf", pa, pb); - - if (f(*pa) * f(*pb) > 0) - { - printf("В указанных границах нуля функции не существует.\n"); - printf("Нажмите Ctrl+C и поменяйте границы\n"); - } - if (*pa == *pb) - { - if (f(*pa) == 0) - { - printf("\nКорень уравнения: %lf\n", *pa); - printf("Работа программы завершена.\n"); - exit(0); - } - else - { - printf("Нажмите Ctrl+C и поменяйте границы\n"); - } - } - 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(); - } - return; default: printf("Ошибка ввода, повторная попытка...\n"); diff --git a/Project_test/out/function_zeros_calculator b/Project_test/out/function_zeros_calculator deleted file mode 100755 index 25ddb11f9c6207bc770ffad1c6b18a0b8c037296..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21200 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 eps && f(x) != 0); + } while (fabs(*pb - *pa) > eps && f(x) != 0); return; } void chord_method() { - sig_flag = 0; - double left = *pa, right = *pb; - *px = left; - while ((right - left) > eps && f(x) != 0) + *px = *pa; + while ((*pb - *pa) > eps && f(x) != 0) { // Находим точку пересечения хорды с осью x - *px = (left * f(right) - right * f(left)) / (f(right) - f(left)); - printf("%lf %lf\n", left, right); + *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(left) < 0) - right = *px; + else if (f(*px) * f(*pa) < 0) + *pb = *px; else - left = *px; + *pa = *px; sleep(1); } return; @@ -59,25 +84,24 @@ void chord_method() void fork_method() // Функция поиска корней, использующая метод вилки. { - sig_flag = 0; - double left = *pa, right = *pb; do { - *px = (left + right) / 2; // метод деления отрезка пополам + *px = (*pa + *pb) / 2; // метод деления отрезка пополам // Печать границ для отладки и для отслеживания хода вычислений - printf("%lf %lf\n", left, right); + printf("%lf %lf\n", *pa, *pb); // Проверка, какой из отрезков [a, x] или [x, b] подходит под условие существования корня, // т.е. различие знаков на границе. - if (f(left) * f(x) <= 0) - right = x; - else if (f(right) * f(x) <= 0) - left = x; + + if (f(*pa) * f(x) <= 0) + *pb = x; + else if (f(*pb) * f(x) <= 0) + *pa = x; sleep(1); // Принудительное ожидание программой, для возможности прерывания пользователем. - } while (fabs(right - left) > eps && f(x) != 0); + } while (fabs(*pb - *pa) > eps && f(x) != 0); return; } @@ -85,16 +109,19 @@ void choose_path() // Функция выбора действия после в { sig_flag = 1; - char choice, *ch = &choice; + char choice; - struct termios original_term, modified_term; // Задание структуры, определяющей терминал Linux. + struct termios default_term, modif_term; // Задание структуры, определяющей терминал Linux. - tcgetattr(STDIN_FILENO, &original_term); - modified_term = original_term; - modified_term.c_lflag &= ~(ICANON | ECHO); // отключить канонического режим и отображение ввода - tcsetattr(STDIN_FILENO, TCSANOW, &modified_term); + // Получение текущих настроек терминала + tcgetattr(0, &default_term); + modif_term = default_term; + // Отключение символа ECHO + modif_term.c_lflag &= ~ECHO; + // Применение новых настроек терминала + tcsetattr(0, TCSANOW, &modif_term); - printf("\nПродолжить поиск корня?\n"); + printf("\nПродолжить поиск корня? Напечатайте букву и нажмите Enter\n"); printf("\nC - продолжить, A - закончить работу программы, \ R - начать поиск на другом отрезке: \n"); @@ -102,45 +129,26 @@ R - начать поиск на другом отрезке: \n"); { // Очистка стандартного потока ввода от "лишних" __fpurge(stdin); - *ch = getchar(); // Запись буквы, введенной пользователем в переменную choice. + scanf("%c", &choice); // Запись буквы, введенной пользователем в переменную choice. - switch (*ch) + switch (choice) { case 'C': // Выбор вида "Продолжить вычисление". case 'c': - tcsetattr(STDIN_FILENO, TCSANOW, &original_term); - 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(); - } + sig_flag = 0; return; // Выход из функции без каких-либо изменений. case 'A': // Выбор вида "Завершить вычисление". case 'a': printf("\nКорень уравнения: %lf\n", *px); printf("Работа программы завершена.\n"); - exit(0); // Принудительное завершение программы с выводом текущего приближения корня. + exit_777(); // Принудительное завершение программы с выводом текущего приближения корня. case 'R': // Выбор вида "Продолжить вычисления с новым отрезком". case 'r': - tcsetattr(STDIN_FILENO, TCSANOW, &original_term); + // Возврат к обычному выводу + tcsetattr(0, TCSANOW, &default_term); printf("Введите новые значения границ a и b: "); @@ -157,22 +165,26 @@ R - начать поиск на другом отрезке: \n"); { printf("\nКорень уравнения: %lf\n", *pa); printf("Работа программы завершена.\n"); - exit(0); + exit_777(); } else { printf("Нажмите Ctrl+C и поменяйте границы\n"); } } + + sig_flag = 0; + __fpurge(stdin); return; default: printf("Ошибка ввода, повторная попытка...\n"); __fpurge(stdin); } - } while (*ch != 'A' || *ch != 'R' || *ch != 'C' || *ch != 'a' || *ch != 'r' || *ch != 'c'); + } while (choice != 'A' || choice != 'R' || choice != 'C' || choice != 'a' || choice != 'r' || choice != 'c' || choice != 'M' || choice != 'm'); - tcsetattr(STDIN_FILENO, TCSANOW, &original_term); + // Применение новых настроек терминала + tcsetattr(0, TCSANOW, &default_term); sig_flag = 0; } @@ -184,4 +196,14 @@ void ctrlc_handler(int signum) // Функция, заменяющая стан printf("\nТекущее приближение: %lf\n", *px); choose_path(); } -} \ No newline at end of file + return; +} + +void exit_777() +{ + struct termios term; + tcgetattr(0, &term); + term.c_lflag |= ~ECHO; + tcsetattr(0, TCSANOW, &term); + exit(1); +} diff --git a/Project_test/main.c b/Test/main.c similarity index 97% rename from Project_test/main.c rename to Test/main.c index 2906229..26a02c6 100644 --- a/Project_test/main.c +++ b/Test/main.c @@ -11,7 +11,6 @@ short method, *mth, sig_flag; int main() { - double tmp; sig_flag = 0; method = 0; @@ -32,7 +31,9 @@ int main() return 1; } - printf("Введите интервал [a, b] и точность eps: "); + show_grapgh(); + + printf("Введите интервал [a, b] и точность eps и нажмите Enter: "); scanf("%lf %lf %lf", pa, pb, &eps); __fpurge(stdin); @@ -65,7 +66,7 @@ int main() { printf("\nКорень уравнения: %lf\n", *pa); printf("Работа программы завершена.\n"); - exit(0); + exit_777(); } else { diff --git a/Test/out/function_zeros_calculator b/Test/out/function_zeros_calculator new file mode 100755 index 0000000000000000000000000000000000000000..d82de89c89055a5f7e888ae9124021618aa7c776 GIT binary patch literal 21424 zcmeHP3v`s#wLS@sq|`8jfJSI_sx|a1eTF@9EBw7jfVP~}7LSLp{X=g+wrh1#&*16w4=j@+cZN7JBI?6wcIaN4Z(JSjiWz&ZnH0g}VQ2N9iIvkGAt@JElWA5llIs zloR@Ae^zPzpqhjb`zvLPKR`c&f;N`~p8XtEbNPZ!KUfOwrtGHdxFfYJJOVFA3Q0KT&TzP$h*E`Z-#0Drguenx?QZ784* zbwRnamO22F#5CckRubM9gx6cw;`0W>O}>WkmH=2Rh&pdP;fp1_jlOV`2u5S!rbJLA z>godtUm_6`pmiZ%OvJcgfvAWl{BYy- zhU1aCOD^%o>wHb*4OY?{y!h%8;YgE+24b;DOaxlO2@#D%1893wES#XA5KrBgy>+24 zdxO4kgP<5`jm{UBuUfgR$~(ukz^KhLYI9r{8}+&Kgm>lI)n0!f7N`%$6M@*;)m06V zrodWXZ3DGX-xz7q-S#TgQ59*G7Gbs0-zl1oGY~>;5@nqtXg!0J^Flo{94@8Zq)%g0 zB!7zdzUG^!g>j@ACw`*&J$FBV{&(1f>nS3wQYL(=$A*dleahhJfIXaj#Ng>bJ)FJU;OPK8oZV{hbYLFN-eB-_ zKpxKe44w|e!`Z71o({mn*`)?gCnm$$3WKKu@o@Gt22Tgz;p`-XrvvYBw#eY^l7H_b z?k^o^(SPQVohL7&>?{{DKj1&W<))c`$HE`8@V~V1uUYsXS@;(%`~eHU*TO$(;UBf| zU$^l0Tlh{3-)`Y=w(!knzT%yg$@KM}M8)N7#me$Zt< z=QgmIfSrps1Mzg)Vni+(NleAmoKJO3%}?Y8?dPUcPjVph z+dt=W8tReaeWG0|{-L!(Ubb{SY`kDEtK_xd`swk|M zoOVo|OfhuWPLZLMzVms~I0W5U%AL|ZBz0}yk=``fvOK+PF(O$UOKb3dPo{Rfp}9+Sef&h^`qBBta!9hJ;wJ zVx^LXmPHK@PBwt3tR(cpA6ikah3(Vhio_Gd+~y{~yXq`%UJ!ymHYQS9f( zBWU)-B}%hxq)4iEYt;cmbsG*1$CpF(dxmPURJ~WLe$7xF!N44+iQK3~TMbbN4Z=qh zJ~%nh%c`(dFYkjgus`drxY^dzQ8VKA%$y?EZo-yX55Y?>@Z!dhxkoTE@}so%92%ze z{VL})lQtNdqi+LPl+`rHupZ?)yB^*<+SdbW8~h+CD~8JRy`-Y_R#3FvEza4_ia8gH z9ujzx?j4?F%}&pNd$;5V+>dM8rKub?$on*ZSksiIM>HMORBj~$?jgx`+Lp@P(AvI4 zXX(d(pxD(iX*)oxMaZq>LM_jY`>=i8VVWlNfeq)| z*!PHi0nUaL^iKrYXGnz?XjZ|r^mEemdeaQ^bZi*OZ>K%OkYY(v zBNecBs0R9wq$1V%Zh2s6|2^e#>U`zr@ACbWDb|5*)nwqTL_3pR`8Bpb-4)x3izy7f z8@+|&3U%!V!}jYB!|G=cA~<(Ob&fXXsfVP2Z9s`++y`lzWcJE>cPFLirlX6 zr(JY1R(;UER;H;QGTLW16(3&=)s4i;;Fjy)`gjYJJEHxL*C{r=Ne0
pojuj>c< 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