diff --git a/Fixed_Project 1.0/main.c b/Fixed_Project 1.0/main.c index 99d0d45..53176cc 100644 --- a/Fixed_Project 1.0/main.c +++ b/Fixed_Project 1.0/main.c @@ -5,7 +5,7 @@ #include double a, b, eps, x, *pa = &a, *pb = &b; -char ch, *pch = &ch; +char choice, *ch = &choice; double f(double x); void find_zero(); @@ -19,6 +19,7 @@ double f(double x) // Функция обязана быть линейной void choose_path() { + printf("\nПродолжить поиск корня?\ (C - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке): \n"); do @@ -27,8 +28,6 @@ void choose_path() switch (*ch) { case 'C': - // find_zero(); - //printf("Ожидание сигнала Ctrl+C...\n"); return; case 'A': printf("Работа программы завершена.\n"); @@ -99,8 +98,6 @@ void find_zero() exit(0); } - - int main(){ double tmp; printf("Введите интервал [a, b] и точность eps: "); diff --git a/Fixed_Project 1.0/out/app1 b/Fixed_Project 1.0/out/app1 new file mode 100755 index 0000000..bd9370f Binary files /dev/null and b/Fixed_Project 1.0/out/app1 differ diff --git a/try/a.out b/try/a.out new file mode 100755 index 0000000..c29759f Binary files /dev/null and b/try/a.out differ diff --git a/try/func.c b/try/func.c index 0405b0a..4bc72da 100644 --- a/try/func.c +++ b/try/func.c @@ -1,36 +1,144 @@ #include +#include #include #include #include -double f(double x) +double a, b, eps, x, *pa = &a, *pb = &b; + +double f(double x); +void find_zero(); +void ctrlc_handler(int signum); +void choose_path(); + +double f(double x) // Функция обязана быть линейной { - return x * x - 16; + return x + 4; } -void find_zero(double *pa, double *pb, double eps, double *px) +void choose_path() { - *px = (*pa + *pb) / 2; // метод деления отрезка пополам - if (f(*pa) * f(*px) < 0) - *pb = *px; - else - *pa = *px; - printf("Текущее приближение: %lf\n", *px); + char choice, *ch = &choice; + printf("\nПродолжить поиск корня?\ + (C - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке): \n"); + do + { + *ch = getchar(); + switch (*ch) + { + case 'C': + return; + case 'A': + printf("Работа программы завершена.\n"); + exit(0); + case 'R': + 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"); + } + } + find_zero(); + printf("Ожидание сигнала Ctrl+C...\n"); + return; + } + } while (*ch != 'A' || *ch != 'R' || *ch != 'C'); + printf("Ошибка ввода, повторная попытка..."); + choose_path(); } void ctrlc_handler(int signum) { printf("\nПолучен сигнал Ctrl+C\n"); - printf("\nПродолжить поиск корня? (C - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке): \n"); + choose_path(); + find_zero(); } -// void choose_path() -// { -// char choice = getchar(); -// if(choice == 'A') -// break; -// else if(choice == 'C') -// find_zero() +void find_zero() +{ + double x; + x = (*pa + *pb) / 2; // метод деления отрезка пополам + while(fabs(*pb - *pa) > eps || f(x) != 0){ + printf("%lf %lf", *pa, *pb); + sleep(2); -// } -// void new_row(double *pa, double *pb); \ No newline at end of file + if (f(*pa) * f(x) < 0) + *pb = x; + else if(f(*pb) * f(x) < 0) + *pb = x; + + printf("Текущее приближение: %lf\n", x); + + if(f(x) <= eps) + { + printf("\nКорень уравнения: %lf\n", x); + printf("Работа программы завершена.\n"); + exit(0); + } + + x = (*pa + *pb) / 2; // метод деления отрезка пополам + } + printf("\nКорень уравнения: %lf\n", x); + printf("Работа программы завершена.\n"); + exit(0); +} + +int main(){ + double tmp; + printf("Введите интервал [a, b] и точность eps: "); + scanf("%lf %lf %lf", pa, pb, &eps); + + 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"); + } + } + + find_zero(); + + printf("Ожидание сигнала Ctrl+C...\n"); + signal(SIGINT, ctrlc_handler); + while(1); + return 0; +} \ No newline at end of file