added 1.3

This commit is contained in:
ada-dmitry
2023-12-01 14:30:50 +03:00
parent 16c60f25e0
commit 3433904111
10 changed files with 414 additions and 22 deletions
+3 -1
View File
@@ -1,6 +1,8 @@
extern double a, b, eps, x, *pa, *pb, *px;
// Декларирование глобальных переменных,
// как внешних для последующего использования их во всей программе.
double f(double x);
void ctrlc_handler(int signum);
void choose_path();
void fork_method();
void fork_method();
+26 -14
View File
@@ -7,34 +7,38 @@
#include "declare.h"
double f(double x)
double f(double x) // Функция, заданная пользователем, для которой происходит поиск корней.
{
return x - 16;
}
void fork_method()
void fork_method() // Функция поиска корней, использующая метод вилки.
{
do
{
*px = (*pa + *pb) / 2; // метод деления отрезка пополам
// Печать границ для отладки и для отслеживания хода вычислений
printf("%lf %lf\n", *pa, *pb);
// Проверка, какой из отрезков [a, x] или [x, b] подходит под условие существования корня,
// т.е. различие знаков на границе.
if (f(*pa) * f(x) <= 0)
*pb = x;
else if (f(*pb) * f(x) <= 0)
*pa = x;
sleep(1);
sleep(1); // Принудительное ожидание программой, для возможности прерывания пользователем.
} while (fabs(*pb - *pa) > eps && f(x) != 0);
return;
}
void choose_path()
void choose_path() // Функция выбора действия после вызова сигнала.
{
char choice, *ch = &choice;
struct termios term;
struct termios term; // Задание структуры, определяющей терминал Linux.
// Получение текущих настроек терминала
tcgetattr(0, &term);
@@ -46,23 +50,31 @@ void choose_path()
tcsetattr(0, TCSANOW, &term);
printf("\nПродолжить поиск корня?\n");
printf("\nC - продолжить, A - закончить работу программы, \
R - начать поиск на другом отрезке: \n");
// Очистка стандартного потока ввода от "лишних"
__fpurge(stdin);
do
{
printf("\nC - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке: \n");
*ch = getchar();
*ch = getchar(); // Запись буквы, введенной пользователем в переменную choice.
switch (*ch)
{
case 'C':
case 'C': // Выбор вида "Продолжить вычисление".
case 'c':
return;
case 'A':
return; // Выход из функции без каких-либо изменений.
case 'A': // Выбор вида "Завершить вычисление".
case 'a':
printf("\nКорень уравнения: %lf\n", *px);
printf("Работа программы завершена.\n");
exit(0);
case 'R':
exit(0); // Принудительное завершение программы с выводом текущего приближения корня.
case 'R': // Выбор вида "Продолжить вычисления с новым отрезком".
case 'r':
// Включение символа ECHO
term.c_lflag |= ECHO;
@@ -94,7 +106,7 @@ void choose_path()
return;
default:
printf("Ошибка ввода, повторная попытка...");
printf("Ошибка ввода, повторная попытка...\n");
}
} while (*ch != 'A' || *ch != 'R' || *ch != 'C' || *ch != 'a' || *ch != 'r' || *ch != 'c');
@@ -105,7 +117,7 @@ void choose_path()
tcsetattr(0, TCSANOW, &term);
}
void ctrlc_handler(int signum)
void ctrlc_handler(int signum) // Функция, заменяющая стандартный алгоритм для сигнала SIGINT.
{
printf("\nТекущее приближение: %lf\n", *px);
choose_path();
+8 -7
View File
@@ -15,20 +15,21 @@ int main()
pb = &b;
px = &x;
struct sigaction sig;
struct sigaction sig; // Инициализация структуры, отвечающей за обработку сигнала.
// Замена стандартного алгоритма на необходимый для вызова меню действий.
sig.sa_handler = ctrlc_handler;
sig.sa_flags = 0;
sigemptyset(&sig.sa_mask);
sig.sa_flags = 0; // Очистка флагов "на всякий случай".
sigemptyset(&sig.sa_mask); // Очистка маски "на всякий случай".
printf("Введите интервал [a, b] и точность eps: ");
scanf("%lf %lf %lf", pa, pb, &eps);
if (sigaction(SIGINT, &sig, NULL) == -1)
if (sigaction(SIGINT, &sig, NULL) == -1) // Обработчик ошибок и инициализация сигнала SIGINT.
{
perror("sigaction");
return 1;
}
printf("Введите интервал [a, b] и точность eps: ");
scanf("%lf %lf %lf", pa, pb, &eps);
if (*pa > *pb) // Если пользователь перепутал границы
{
printf("Границы указаны неверно, запуск задачи с исправленным условием\n");
Binary file not shown.