diff --git a/Fixed_Project 1.0/main.c b/Fixed_Project 1.0/main.c index 4355ebe..29c6830 100644 --- a/Fixed_Project 1.0/main.c +++ b/Fixed_Project 1.0/main.c @@ -3,6 +3,7 @@ #include #include #include +#include double a, b, eps, x, *pa = &a, *pb = &b, *px = &x; @@ -12,28 +13,33 @@ void choose_path(); double f(double x) { - return exp(x)-1; + return x - 1; } void choose_path() { - - printf("\nПродолжить поиск корня?\ - (C - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке): \n"); + char choice, *ch = &choice; + 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': printf("Введите новые значения границ a и b: "); - scanf("%lf %lf", pa, pb); + scanf("%lf%lf", pa, pb); if (f(*pa) * f(*pb) > 0) { printf("В указанных границах нуля функции не существует.\n"); @@ -53,24 +59,54 @@ void choose_path() } } return; + + default: + printf("Ошибка ввода, повторная попытка..."); } - } while (*ch != 'A' || *ch != 'R' || *ch != 'C'); - printf("Ошибка ввода, повторная попытка..."); - choose_path(); + } 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; + + // Применение новых настроек терминала + tcsetattr(0, TCSANOW, &term); } int main(){ + double tmp; - signal(SIGINT, ctrlc_handler); + + + 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) // Если пользователь перепутал границы { @@ -120,6 +156,7 @@ int main(){ } 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 ed8a8d5..e1b37c5 100755 Binary files a/Fixed_Project 1.0/out/app and b/Fixed_Project 1.0/out/app differ diff --git a/try/out/test_app3 b/try/out/test_app3 index 610c22e..64cb219 100755 Binary files a/try/out/test_app3 and b/try/out/test_app3 differ diff --git a/try/test3.c b/try/test3.c index 0e4fb03..3c51be4 100644 --- a/try/test3.c +++ b/try/test3.c @@ -4,22 +4,20 @@ #include #include -double a, b, eps, x, *pa = &a, *pb = &b, *px = &x; -char choice, *ch = &choice; +double a, b, eps, x, *pa = &a, *pb = &b, *px = &x; // Переписать для статики... double f(double x); -// void find_zero(); void ctrlc_handler(int signum); void choose_path(); -double f(double x) // Функция обязана быть линейной +double f(double x) { - return x + 4; + return x*x - 16; } -void choose_path() +void choose_path() // Функция выбора после сигнала { - + char choice, *ch = &choice; printf("\nПродолжить поиск корня?\ (C - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке): \n"); do @@ -54,8 +52,6 @@ void choose_path() printf("Нажмите Ctrl+C и поменяйте границы\n"); } } - // // find_zero(); - // printf("Ожидание сигнала Ctrl+C...\n"); return; } } while (*ch != 'A' || *ch != 'R' || *ch != 'C'); @@ -65,42 +61,13 @@ void choose_path() void ctrlc_handler(int signum) { - // printf("\nПолучен сигнал Ctrl+C\n"); printf("\nТекущее приближение: %lf\n", *px); choose_path(); - // find_zero(); } -// void find_zero() -// { -// //signal(SIGINT, ctrlc_handler); -// do -// { -// *px = (*pa + *pb) / 2; // метод деления отрезка пополам -// printf("%lf %lf\n", *pa, *pb); -// sleep(10); - -// if (f(*pa) * f(x) < 0) -// *pb = x; -// else if(f(*pb) * f(x) < 0) -// *pa = x; - -// printf("Текущее приближение: %lf\n", *px); - -// } while(fabs(*pb - *pa) > eps && f(x) != 0); - -// printf("\nКорень уравнения: %lf\n", *px); -// printf("Работа программы завершена.\n"); -// return; -// } - int main(){ double tmp; - - struct sigaction sa; - sa.sa_handler = ctrlc_handler; - sa.sa_flags = SA_RESETHAND; - sigemptyset(&sa.sa_mask); + signal(SIGINT, ctrlc_handler); printf("Введите интервал [a, b] и точность eps: "); scanf("%lf %lf %lf", pa, pb, &eps); @@ -138,36 +105,22 @@ int main(){ } } - signal(SIGINT, ctrlc_handler); do { *px = (*pa + *pb) / 2; // метод деления отрезка пополам printf("%lf %lf\n", *pa, *pb); sleep(1); - if (f(*pa) * f(x) < 0) + if (f(*pa) * f(x) <= 0) *pb = x; - else if(f(*pb) * f(x) < 0) + else if(f(*pb) * f(x) <= 0) *pa = x; - - - } while(fabs(*pb - *pa) > eps && f(x) != 0); printf("\nКорень уравнения: %lf\n", *px); printf("Работа программы завершена.\n"); - if (sigaction(SIGINT, &sa, NULL) == -1) - { - perror("sigaction"); - return 1; - } - - // printf("Ожидание сигнала Ctrl+C...\n"); - // signal(SIGINT, ctrlc_handler); - // while(1) - // { - // sleep(1); - // } return 0; -} \ No newline at end of file +} + +// MEEEEEEEOW \ No newline at end of file