diff --git a/.vscode/settings.json b/.vscode/settings.json index 439e6d4..cc6fa74 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,3 +4,5 @@ "unistd.h": "c" } } + + diff --git a/Fixed_Project 1.0/main.c b/Fixed_Project 1.0/main.c index 29c6830..bf39654 100644 --- a/Fixed_Project 1.0/main.c +++ b/Fixed_Project 1.0/main.c @@ -13,14 +13,26 @@ void choose_path(); double f(double x) { - return x - 1; + return x*x - 256; } void choose_path() { char choice, *ch = &choice; + + struct termios term; + + // Получение текущих настроек терминала + tcgetattr(0, &term); + + // Отключение символа ECHO + term.c_lflag &= ~ECHO; + + // Применение новых настроек терминала + tcsetattr(0, TCSANOW, &term); + printf("\nПродолжить поиск корня?\n"); - + do { printf("\nC - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке: \n"); @@ -38,8 +50,16 @@ void choose_path() exit(0); case 'R': case 'r': + // Включение символа ECHO + term.c_lflag |= ECHO; + + // Применение новых настроек терминала + tcsetattr(0, TCSANOW, &term); + printf("Введите новые значения границ a и b: "); + scanf("%lf%lf", pa, pb); + if (f(*pa) * f(*pb) > 0) { printf("В указанных границах нуля функции не существует.\n"); @@ -64,23 +84,6 @@ void choose_path() printf("Ошибка ввода, повторная попытка..."); } } while (*ch != 'A' || *ch != 'R' || *ch != 'C' || *ch != 'a' || *ch != 'r' || *ch != 'c'); -} - -void ctrlc_handler(int signum) -{ - struct termios term; - - // Получение текущих настроек терминала - tcgetattr(0, &term); - - // Отключение символа ECHO - term.c_lflag &= ~ECHO; - - // Применение новых настроек терминала - tcsetattr(0, TCSANOW, &term); - - printf("\nТекущее приближение: %lf\n", *px); - choose_path(); // Включение символа ECHO term.c_lflag |= ECHO; @@ -89,6 +92,12 @@ void ctrlc_handler(int signum) tcsetattr(0, TCSANOW, &term); } +void ctrlc_handler(int signum) +{ + printf("\nТекущее приближение: %lf\n", *px); + choose_path(); +} + int main(){ double tmp; @@ -145,18 +154,13 @@ int main(){ { *px = (*pa + *pb) / 2; // метод деления отрезка пополам printf("%lf %lf\n", *pa, *pb); - sleep(1); - 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); - printf("\nКорень уравнения: %lf\n", *px); printf("Работа программы завершена.\n"); diff --git a/Fixed_Project 1.0/out/app b/Fixed_Project 1.0/out/app index e1b37c5..9b81571 100755 Binary files a/Fixed_Project 1.0/out/app and b/Fixed_Project 1.0/out/app differ diff --git a/Project 1.1/main.c b/Project 1.1/main.c new file mode 100644 index 0000000..ca21c0e --- /dev/null +++ b/Project 1.1/main.c @@ -0,0 +1,188 @@ +#include +#include +#include +#include +#include +#include + +double a, b, eps, x, *pa = &a, *pb = &b, *px = &x; + +double f(double x); +void ctrlc_handler(int signum); +void choose_path(); +void fork_method(); + +double f(double x) +{ + return x - 16; +} + +void fork_method() +{ + do + { + *px = (*pa + *pb) / 2; // метод деления отрезка пополам + printf("%lf %lf\n", *pa, *pb); + 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() +{ + char choice, *ch = &choice; + + struct termios term; + + // Получение текущих настроек терминала + tcgetattr(0, &term); + + // Отключение символа ECHO + term.c_lflag &= ~ECHO; + + // Применение новых настроек терминала + tcsetattr(0, TCSANOW, &term); + + printf("\nПродолжить поиск корня?\n"); + + do + { + printf("\nC - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке: \n"); + *ch = getchar(); + *ch = getchar(); + switch (*ch) + { + case 'C': + case 'c': + return; + case 'A': + case 'a': + printf("\nКорень уравнения: %lf\n", *px); + printf("Работа программы завершена.\n"); + exit(0); + case 'R': + case 'r': + // Включение символа ECHO + term.c_lflag |= ECHO; + + // Применение новых настроек терминала + tcsetattr(0, TCSANOW, &term); + + 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"); + } + } + return; + + default: + printf("Ошибка ввода, повторная попытка..."); + } + } while (*ch != 'A' || *ch != 'R' || *ch != 'C' || *ch != 'a' || *ch != 'r' || *ch != 'c'); + + // Включение символа ECHO + term.c_lflag |= ECHO; + + // Применение новых настроек терминала + tcsetattr(0, TCSANOW, &term); +} + +void ctrlc_handler(int signum) +{ + printf("\nТекущее приближение: %lf\n", *px); + choose_path(); +} + +int main(){ + + double tmp; + + + struct sigaction sa; + sa.sa_handler = ctrlc_handler; + sa.sa_flags = 0; + sigemptyset(&sa.sa_mask); + + printf("Введите интервал [a, b] и точность eps: "); + scanf("%lf %lf %lf", pa, pb, &eps); + + if (sigaction(SIGINT, &sa, NULL) == -1) + { + perror("sigaction"); + return 1; + } + + if (*pa > *pb) // Если пользователь перепутал границы + { + printf("Границы указаны неверно, запуск задачи с исправленным условием\n"); + tmp = *pa; + *pa = *pb; + *pb = tmp; + } + + if (f(*pa) * f(*pb) > 0) + { + printf("В указанных границах нуля функции не существует.\n"); + printf("Нажмите Ctrl+C и поменяйте границы\n"); + } + if (eps < 0) // Если пользователь указал отрицательную точность + { + eps = eps * (-1); + printf("Точность отрицательна, условие приведено в порядок, запуск решения...\n"); + } + + if (*pa == *pb) + { + if (f(*pa) == 0) + { + printf("\nКорень уравнения: %lf\n", *pa); + printf("Работа программы завершена.\n"); + exit(0); + } + else + { + printf("Нажмите Ctrl+C и поменяйте границы\n"); + } + } + + fork_method(); + + // do + // { + // *px = (*pa + *pb) / 2; // метод деления отрезка пополам + // printf("%lf %lf\n", *pa, *pb); + // 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); + + printf("\nКорень уравнения: %lf\n", *px); + printf("Работа программы завершена.\n"); + + return 0; +} + +// MEEEEEEEOW \ No newline at end of file diff --git a/Project 1.1/out/app b/Project 1.1/out/app new file mode 100755 index 0000000..64135b1 Binary files /dev/null and b/Project 1.1/out/app differ diff --git a/Project 1.1/out/app1 b/Project 1.1/out/app1 new file mode 100755 index 0000000..bd9370f Binary files /dev/null and b/Project 1.1/out/app1 differ diff --git a/Project 1.1/readme b/Project 1.1/readme new file mode 100644 index 0000000..cd4b968 --- /dev/null +++ b/Project 1.1/readme @@ -0,0 +1 @@ +Очередная попытка вывести в функцию подсчет корня. \ No newline at end of file diff --git a/Prod_with_G/main.c b/try/Prod_with_G/main.c similarity index 100% rename from Prod_with_G/main.c rename to try/Prod_with_G/main.c diff --git a/Prod_with_G/main_wo_struct.c b/try/Prod_with_G/main_wo_struct.c similarity index 100% rename from Prod_with_G/main_wo_struct.c rename to try/Prod_with_G/main_wo_struct.c diff --git a/Prod_with_G/out_prod/main__app1 b/try/Prod_with_G/out_prod/main__app1 similarity index 100% rename from Prod_with_G/out_prod/main__app1 rename to try/Prod_with_G/out_prod/main__app1 diff --git a/Prod_with_G/out_prod/main_app b/try/Prod_with_G/out_prod/main_app similarity index 100% rename from Prod_with_G/out_prod/main_app rename to try/Prod_with_G/out_prod/main_app diff --git a/Prod_with_G/out_prod/main_app1 b/try/Prod_with_G/out_prod/main_app1 similarity index 100% rename from Prod_with_G/out_prod/main_app1 rename to try/Prod_with_G/out_prod/main_app1 diff --git a/Project/main.c b/try/Project/main.c similarity index 100% rename from Project/main.c rename to try/Project/main.c diff --git a/Project/out_p/app_done b/try/Project/out_p/app_done similarity index 100% rename from Project/out_p/app_done rename to try/Project/out_p/app_done diff --git a/Project/out_p/app_test b/try/Project/out_p/app_test similarity index 100% rename from Project/out_p/app_test rename to try/Project/out_p/app_test diff --git a/Project/out_p/prog1 b/try/Project/out_p/prog1 similarity index 100% rename from Project/out_p/prog1 rename to try/Project/out_p/prog1 diff --git a/Project/out_p/prog2 b/try/Project/out_p/prog2 similarity index 100% rename from Project/out_p/prog2 rename to try/Project/out_p/prog2 diff --git a/Project/out_p/prog4 b/try/Project/out_p/prog4 similarity index 100% rename from Project/out_p/prog4 rename to try/Project/out_p/prog4