diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..08d9005 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,28 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: gcc build active file", + "command": "/usr/bin/gcc", + "args": [ + "-fdiagnostics-color=always", + "-g", + "${file}", + "-o", + "${fileDirname}/${fileBasenameNoExtension}" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Task generated by Debugger." + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/Prod_with_G/declare.h b/Prod_with_G/declare.h new file mode 100644 index 0000000..b28b04f --- /dev/null +++ b/Prod_with_G/declare.h @@ -0,0 +1,3 @@ + + + diff --git a/Prod_with_G/func.c b/Prod_with_G/func.c index 0405b0a..cf1e70d 100644 --- a/Prod_with_G/func.c +++ b/Prod_with_G/func.c @@ -1,14 +1,11 @@ -#include -#include -#include -#include +#include "declare.h" double f(double x) { return x * x - 16; } -void find_zero(double *pa, double *pb, double eps, double *px) +void find_zero() { *px = (*pa + *pb) / 2; // метод деления отрезка пополам if (f(*pa) * f(*px) < 0) diff --git a/Prod_with_G/main b/Prod_with_G/main new file mode 100755 index 0000000..f14ee7c Binary files /dev/null and b/Prod_with_G/main differ diff --git a/Prod_with_G/main.c b/Prod_with_G/main.c index d1bb21c..0ee97be 100644 --- a/Prod_with_G/main.c +++ b/Prod_with_G/main.c @@ -1,18 +1,20 @@ #include +#include #include #include #include double f(double x); -void find_zero(double *pa, double *pb, double eps, double *px); +void find_zero(); void ctrlc_handler(int signum); -// void choose_path(); -// void new_row(double *pa, double *pb); +void choose_path(); + +double a, b, eps, x, *pa = &a, *pb = &b; +char choice, *ch = &choice; int main() { - double a, b, eps, x, *pa = &a, *pb = &b, *px = &x; - char choice, *ch = &choice; + double tmp; struct sigaction sa; sa.sa_handler = ctrlc_handler; sa.sa_flags = 0; @@ -20,7 +22,38 @@ int main() printf("Введите интервал [a, b] и точность eps: "); scanf("%lf %lf %lf", pa, pb, &eps); - find_zero(pa, pb, eps, px); + + 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); + } + if (*pa == *pb) + { + if (f(*pa) == 0) + { + printf("\nКорень уравнения: %lf\n", *pa); + printf("Работа программы завершена.\n"); + exit(0); + } + else + { + printf("Нажмите Ctrl+C и поменяйте границы\n"); + } + } + + find_zero(); if (sigaction(SIGINT, &sa, NULL) == -1) { @@ -29,14 +62,101 @@ int main() } printf("Ожидание сигнала Ctrl+C...\n"); - + // signal(SIGINT, ctrlc_handler); while (1) { sleep(1); } - printf("\nКорень уравнения: %lf\n", *px); - printf("Работа программы завершена.\n"); - return 0; } + +double f(double x) +{ + return x * x - 16; +} + +void find_zero() +{ + double x; + x = (*pa + *pb) / 2; // метод деления отрезка пополам + if (f(*pa) * f(x) < 0) + *pb = x; + else + *pa = x; + printf("Текущее приближение: %lf\n", x); + + if (fabs(b - a) < eps) + { + printf("\nКорень уравнения: %lf\n", x); + printf("Работа программы завершена.\n"); + exit(0); + } + else + { + return; + } +} + +void ctrlc_handler(int signum) +{ + printf("\nПолучен сигнал Ctrl+C\n"); + choose_path(); +} + +void choose_path() +{ + // printf("\nПродолжить поиск корня?\ + (C - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке): \n"); + // choice = 'Q'; + // *ch = getchar(); + + // if (*ch == 'A') + // { + // printf("Работа программы завершена.\n"); + // exit(0); + // } + + // else if (*ch == 'C') + // { + // find_zero(); + // printf("Ожидание сигнала Ctrl+C...\n"); + // } + // else if (*ch == 'R') + // { + // printf("Введите новые значения границ a и b: "); + // scanf("%lf %lf", pa, pb); + // find_zero(); + // printf("Ожидание сигнала Ctrl+C...\n"); + // } + // else + // { + // printf("Ошибка ввода, повторная попытка..."); + // choose_path(); + // } + printf("\nПродолжить поиск корня?\ + (C - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке): \n"); + do + { + + *ch = getchar(); + switch (*ch) + { + case 'C': + find_zero(); + printf("Ожидание сигнала Ctrl+C...\n"); + return; + case 'A': + printf("Работа программы завершена.\n"); + exit(0); + case 'R': + printf("Введите новые значения границ a и b: "); + scanf("%lf %lf", pa, pb); + find_zero(); + printf("Ожидание сигнала Ctrl+C...\n"); + return; + } + } while (*ch != 'A' || *ch != 'R' || *ch != 'C'); + printf("Ошибка ввода, повторная попытка..."); + choose_path(); +} diff --git a/Prod_with_G/out_prod/main_app b/Prod_with_G/out_prod/main_app new file mode 100755 index 0000000..d531bef Binary files /dev/null and b/Prod_with_G/out_prod/main_app differ diff --git a/Prod_with_G/out_prod/main_app1 b/Prod_with_G/out_prod/main_app1 new file mode 100755 index 0000000..f6af47d Binary files /dev/null and b/Prod_with_G/out_prod/main_app1 differ