reboot prod

This commit is contained in:
ada-dmitry
2023-12-07 14:36:52 +03:00
parent 9c3ba250d4
commit c022a02959
22 changed files with 173 additions and 119 deletions
-104
View File
@@ -1,104 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <stdio_ext.h>
#include "declare.h"
double a, b, eps, x, *pa, *pb, *px;
short method, *mth, sig_flag;
int main()
{
double tmp;
sig_flag = 0;
method = 0;
mth = &method;
pa = &a;
pb = &b;
px = &x;
struct sigaction sig; // Инициализация структуры, отвечающей за обработку сигнала.
// Замена стандартного алгоритма на необходимый для вызова меню действий.
sig.sa_handler = ctrlc_handler;
sig.sa_flags = 0; // Очистка флагов "на всякий случай".
sigemptyset(&sig.sa_mask); // Очистка маски "на всякий случай".
if (sigaction(SIGINT, &sig, NULL) == -1) // Обработчик ошибок и инициализация сигнала SIGINT.
{
perror("sigaction");
return 1;
}
show_grapgh();
printf("Введите интервал [a, b] и точность eps и нажмите Enter: ");
scanf("%lf %lf %lf", pa, pb, &eps);
__fpurge(stdin);
printf("Выберите метод вычисления корня:\
0 - метод вилки, 1 - метод хорд, 2 - метод касательных\n(По умолчанию: 0): ");
*mth = getchar();
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_777();
}
else
{
printf("Нажмите Ctrl+C и поменяйте границы\n");
}
}
if (*mth == 0)
{
printf("Fork\n");
fork_method();
}
else if (*mth == 1)
{
printf("Chord\n");
chord_method();
}
else if (*mth == 2)
{
printf("Newton\n");
newton_method();
}
else
{
printf("Fork\n");
fork_method();
}
printf("\nКорень уравнения: %lf\n", *px);
printf("Работа программы завершена.\n");
return 0;
}
// MEEEEEEEOW
Binary file not shown.
+1 -1
View File
@@ -6,7 +6,7 @@ CFLAGS= -c -Wall
default: build default: build
general: main.o functions.o general: main.o functions.o
killall -9 function_zeros_calculator
$(CC) ./out/main.o ./out/functions.o -o ./out/function_zeros_calculator -lm $(CC) ./out/main.o ./out/functions.o -o ./out/function_zeros_calculator -lm
main.o: main.c main.o: main.c
+2
View File
@@ -8,6 +8,8 @@
2. Перейдите в каталог проекта: cd /Project_1.2 2. Перейдите в каталог проекта: cd /Project_1.2
## Использование ## Использование
0. Для нормальной работы программы необходимо установить программу GNU PLot
(sudo apt install gnuplot)
1. Соберите программу: make 1. Соберите программу: make
2. Запустите программу: ./out/function_zeros_calculator 2. Запустите программу: ./out/function_zeros_calculator
3. Введите необходимые параметры для вычисления нуля функции: a - ЛЕВАЯ граница отрезка 3. Введите необходимые параметры для вычисления нуля функции: a - ЛЕВАЯ граница отрезка
+4
View File
@@ -4,6 +4,9 @@ extern short method, *mth, sig_flag;
// Декларирование глобальных переменных, // Декларирование глобальных переменных,
// как внешних для последующего использования их во всей программе. // как внешних для последующего использования их во всей программе.
#define H 0.000001 #define H 0.000001
#define A -10000
#define B 10000
#define EPS 0.001
double f(double x); double f(double x);
void ctrlc_handler(int signum); void ctrlc_handler(int signum);
@@ -14,3 +17,4 @@ void newton_method();
double numerical_derivative(double x); double numerical_derivative(double x);
void exit_777(); void exit_777();
void show_grapgh(); void show_grapgh();
void input_diap();
+102 -13
View File
@@ -2,6 +2,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <math.h> #include <math.h>
#include <signal.h>
#include <termios.h> #include <termios.h>
#include <stdio_ext.h> #include <stdio_ext.h>
@@ -14,13 +15,15 @@ double f(double x) // Функция, заданная пользователе
void show_grapgh() void show_grapgh()
{ {
struct termios term; struct termios old_term, new_term;
tcgetattr(STDIN_FILENO, &term); tcgetattr(STDIN_FILENO, &old_term);
term.c_lflag &= ~(ECHO | ICANON); new_term = old_term;
tcsetattr(STDIN_FILENO, TCSANOW, &term); new_term.c_lflag &= ~(ECHO | ICANON);
tcsetattr(STDIN_FILENO, TCSANOW, &new_term);
char func[100] = "x - 125"; char func[100] = "x - 125";
// Подключение GNU Plot // Подключение GNU Plot
FILE *gp = popen("gnuplot -persist", "w"); FILE *gp = popen("gnuplot -persist", "w");
@@ -33,11 +36,12 @@ void show_grapgh()
fprintf(gp, "set yrange [0:500]\n"); fprintf(gp, "set yrange [0:500]\n");
fprintf(gp, "plot %s\n", func); fprintf(gp, "plot %s\n", func);
fflush(gp); // очищение буфера вывода fflush(gp); // очищение буфера вывода
printf("Введите любую букву, чтобы продолжить...\n"); sig_flag = 1;
printf("Нажмите любую клавишу, чтобы продолжить...\n");
getchar(); getchar();
sig_flag = 0;
fprintf(gp, "exit\n"); fprintf(gp, "exit\n");
term.c_lflag |= (ECHO | ICANON); tcsetattr(STDIN_FILENO, TCSANOW, &old_term);
tcsetattr(STDIN_FILENO, TCSANOW, &term);
return; return;
} }
@@ -117,11 +121,11 @@ void choose_path() // Функция выбора действия после в
tcgetattr(0, &default_term); tcgetattr(0, &default_term);
modif_term = default_term; modif_term = default_term;
// Отключение символа ECHO // Отключение символа ECHO
modif_term.c_lflag &= ~ECHO; modif_term.c_lflag &= ~(ECHO | ICANON);
// Применение новых настроек терминала // Применение новых настроек терминала
tcsetattr(0, TCSANOW, &modif_term); tcsetattr(0, TCSANOW, &modif_term);
printf("\nПродолжить поиск корня? Напечатайте букву и нажмите Enter\n"); printf("\nПродолжить поиск корня?\n");
printf("\nC - продолжить, A - закончить работу программы, \ printf("\nC - продолжить, A - закончить работу программы, \
R - начать поиск на другом отрезке: \n"); R - начать поиск на другом отрезке: \n");
@@ -129,8 +133,8 @@ R - начать поиск на другом отрезке: \n");
{ {
// Очистка стандартного потока ввода от "лишних" // Очистка стандартного потока ввода от "лишних"
__fpurge(stdin); __fpurge(stdin);
scanf("%c", &choice); // Запись буквы, введенной пользователем в переменную choice. choice = getchar();
// scanf("%c", &choice); // Запись буквы, введенной пользователем в переменную choice.
switch (choice) switch (choice)
{ {
case 'C': // Выбор вида "Продолжить вычисление". case 'C': // Выбор вида "Продолжить вычисление".
@@ -146,7 +150,6 @@ R - начать поиск на другом отрезке: \n");
case 'R': // Выбор вида "Продолжить вычисления с новым отрезком". case 'R': // Выбор вида "Продолжить вычисления с новым отрезком".
case 'r': case 'r':
// Возврат к обычному выводу // Возврат к обычному выводу
tcsetattr(0, TCSANOW, &default_term); tcsetattr(0, TCSANOW, &default_term);
@@ -174,7 +177,6 @@ R - начать поиск на другом отрезке: \n");
} }
sig_flag = 0; sig_flag = 0;
__fpurge(stdin);
return; return;
default: default:
@@ -207,3 +209,90 @@ void exit_777()
tcsetattr(0, TCSANOW, &term); tcsetattr(0, TCSANOW, &term);
exit(1); exit(1);
} }
void input_diap()
{
double tmp;
char input[50];
sig_flag = 1;
printf("\nПоочередно вводите через Enter: левую границу, правую и точность\n\
(или нажимайте Enter для значений по умолчанию: -10000/10000/0.0001): ");
// printf("Введите левую границу отрезка (или нажмите Enter для значения по умолчанию): ");
fgets(input, sizeof(input), stdin);
if (input[0] == '\n')
{
*pa = A; // значение по умолчанию
}
else
{
sscanf(input, "%lf", pa);
}
// printf("Введите правую границу отрезка (или нажмите Enter для значения по умолчанию): ");
fgets(input, sizeof(input), stdin);
if (input[0] == '\n')
{
*pb = B; // значение по умолчанию
}
else
{
sscanf(input, "%lf", pb);
}
// printf("Введите точность вычисления (или нажмите Enter для значения по умолчанию): ");
fgets(input, sizeof(input), stdin);
if (input[0] == '\n')
{
eps = EPS; // значение по умолчанию
}
else
{
sscanf(input, "%lf", &eps);
}
__fpurge(stdin);
printf("Выберите метод вычисления корня:\
0 - метод вилки, 1 - метод хорд, 2 - метод касательных\n(По умолчанию: 0): ");
*mth = getchar();
if (*pa > *pb) // Если пользователь перепутал границы
{
printf("Границы указаны неверно, запуск задачи с исправленным условием\n");
tmp = *pa;
*pa = *pb;
*pb = tmp;
}
if (f(*pa) * f(*pb) > 0)
{
sig_flag = 0;
printf("В указанных границах нуля функции не существует.\n");
printf("Поменяйте границы\n");
choose_path();
}
if (eps < 0) // Если пользователь указал отрицательную точность
{
eps = eps * (-1);
printf("Точность отрицательна, условие приведено в порядок, запуск решения...\n");
}
if (*pa == *pb)
{
if (f(*pa) == 0)
{
printf("\nКорень уравнения: %lf\n", *pa);
printf("Работа программы завершена.\n");
exit_777();
}
else
{
printf("Нажмите Ctrl+C и поменяйте границы\n");
}
}
sig_flag = 0;
return;
}
+63
View File
@@ -0,0 +1,63 @@
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <stdio_ext.h>
#include "declare.h"
double a, b, eps, x, *pa, *pb, *px;
short method, *mth, sig_flag;
int main()
{
sig_flag = 0;
method = 0;
mth = &method;
pa = &a;
pb = &b;
px = &x;
struct sigaction sig; // Инициализация структуры, отвечающей за обработку сигнала.
// Замена стандартного алгоритма на необходимый для вызова меню действий.
sig.sa_handler = ctrlc_handler;
sig.sa_flags = 0; // Очистка флагов "на всякий случай".
sigemptyset(&sig.sa_mask); // Очистка маски "на всякий случай".
if (sigaction(SIGINT, &sig, NULL) == -1) // Обработчик ошибок и инициализация сигнала SIGINT.
{
perror("sigaction");
return 1;
}
show_grapgh();
input_diap();
if (*mth == 0)
{
printf("Fork\n");
fork_method();
}
else if (*mth == 1)
{
printf("Chord\n");
chord_method();
}
else if (*mth == 2)
{
printf("Newton\n");
newton_method();
}
else
{
printf("Fork\n");
fork_method();
}
printf("\nКорень уравнения: %lf\n", *px);
printf("Работа программы завершена.\n");
return 0;
}
// MEEEEEEEOW
Binary file not shown.