mirror of
https://github.com/ada-dmitry/tmp_project.git
synced 2026-09-24 01:10:31 +00:00
restore 2
This commit is contained in:
@@ -0,0 +1,170 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <math.h>
|
||||
#include <termios.h>
|
||||
|
||||
double a, b, eps, x, *pa = &a, *pb = &b, *px = &x;
|
||||
|
||||
double f(double x);
|
||||
void ctrlc_handler(int signum);
|
||||
void choose_path();
|
||||
|
||||
double f(double x)
|
||||
{
|
||||
return x*x - 256;
|
||||
}
|
||||
|
||||
void choose_path()
|
||||
{
|
||||
char choice, *ch = &choice;
|
||||
|
||||
struct termios term;
|
||||
|
||||
// Получение текущих настроек терминала
|
||||
tcgetattr(0, &term);
|
||||
|
||||
// Отключение символа ECHO
|
||||
term.c_lflag &= ~ECHO;
|
||||
|
||||
// Применение новых настроек терминала
|
||||
tcsetattr(0, TCSANOW, &term);
|
||||
|
||||
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':
|
||||
// Включение символа ECHO
|
||||
term.c_lflag |= ECHO;
|
||||
|
||||
// Применение новых настроек терминала
|
||||
tcsetattr(0, TCSANOW, &term);
|
||||
|
||||
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");
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
||||
default:
|
||||
printf("Ошибка ввода, повторная попытка...");
|
||||
}
|
||||
} while (*ch != 'A' || *ch != 'R' || *ch != 'C' || *ch != 'a' || *ch != 'r' || *ch != 'c');
|
||||
|
||||
// Включение символа ECHO
|
||||
term.c_lflag |= ECHO;
|
||||
|
||||
// Применение новых настроек терминала
|
||||
tcsetattr(0, TCSANOW, &term);
|
||||
}
|
||||
|
||||
void ctrlc_handler(int signum)
|
||||
{
|
||||
printf("\nТекущее приближение: %lf\n", *px);
|
||||
choose_path();
|
||||
}
|
||||
|
||||
int main(){
|
||||
|
||||
double tmp;
|
||||
|
||||
|
||||
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) // Если пользователь перепутал границы
|
||||
{
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
*px = (*pa + *pb) / 2; // метод деления отрезка пополам
|
||||
printf("%lf %lf\n", *pa, *pb);
|
||||
if (f(*pa) * f(x) <= 0)
|
||||
*pb = x;
|
||||
else if(f(*pb) * f(x) <= 0)
|
||||
*pa = x;
|
||||
sleep(1);
|
||||
} while(fabs(*pb - *pa) > eps && f(x) != 0);
|
||||
|
||||
printf("\nКорень уравнения: %lf\n", *px);
|
||||
printf("Работа программы завершена.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// MEEEEEEEOW
|
||||
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
@@ -0,0 +1,176 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <math.h>
|
||||
#include <termios.h>
|
||||
|
||||
double a, b, eps, x, *pa = &a, *pb = &b, *px = &x;
|
||||
|
||||
double f(double x);
|
||||
void ctrlc_handler(int signum);
|
||||
void choose_path();
|
||||
void fork_method();
|
||||
|
||||
double f(double x)
|
||||
{
|
||||
return x - 16;
|
||||
}
|
||||
|
||||
void fork_method()
|
||||
{
|
||||
do
|
||||
{
|
||||
*px = (*pa + *pb) / 2; // метод деления отрезка пополам
|
||||
printf("%lf %lf\n", *pa, *pb);
|
||||
if (f(*pa) * f(x) <= 0)
|
||||
*pb = x;
|
||||
else if(f(*pb) * f(x) <= 0)
|
||||
*pa = x;
|
||||
sleep(1);
|
||||
} while(fabs(*pb - *pa) > eps && f(x) != 0);
|
||||
return;
|
||||
}
|
||||
|
||||
void choose_path()
|
||||
{
|
||||
char choice, *ch = &choice;
|
||||
|
||||
struct termios term;
|
||||
|
||||
// Получение текущих настроек терминала
|
||||
tcgetattr(0, &term);
|
||||
|
||||
// Отключение символа ECHO
|
||||
term.c_lflag &= ~ECHO;
|
||||
|
||||
// Применение новых настроек терминала
|
||||
tcsetattr(0, TCSANOW, &term);
|
||||
|
||||
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':
|
||||
// Включение символа ECHO
|
||||
term.c_lflag |= ECHO;
|
||||
|
||||
// Применение новых настроек терминала
|
||||
tcsetattr(0, TCSANOW, &term);
|
||||
|
||||
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");
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
||||
default:
|
||||
printf("Ошибка ввода, повторная попытка...");
|
||||
}
|
||||
} while (*ch != 'A' || *ch != 'R' || *ch != 'C' || *ch != 'a' || *ch != 'r' || *ch != 'c');
|
||||
|
||||
// Включение символа ECHO
|
||||
term.c_lflag |= ECHO;
|
||||
|
||||
// Применение новых настроек терминала
|
||||
tcsetattr(0, TCSANOW, &term);
|
||||
}
|
||||
|
||||
void ctrlc_handler(int signum)
|
||||
{
|
||||
printf("\nТекущее приближение: %lf\n", *px);
|
||||
choose_path();
|
||||
}
|
||||
|
||||
int main(){
|
||||
|
||||
double tmp;
|
||||
|
||||
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) // Если пользователь перепутал границы
|
||||
{
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
fork_method();
|
||||
|
||||
printf("\nКорень уравнения: %lf\n", *px);
|
||||
printf("Работа программы завершена.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// MEEEEEEEOW
|
||||
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
@@ -0,0 +1 @@
|
||||
Компилировать с ключом -lm
|
||||
@@ -0,0 +1,200 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <math.h>
|
||||
|
||||
double f(double x);
|
||||
void find_zero();
|
||||
void ctrlc_handler(int signum);
|
||||
void choose_path();
|
||||
// int cnt_root();
|
||||
|
||||
double a, b, eps, x, *pa = &a, *pb = &b;
|
||||
char choice, *ch = &choice;
|
||||
|
||||
int main()
|
||||
{
|
||||
double tmp;
|
||||
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 (*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();
|
||||
|
||||
if (sigaction(SIGINT, &sa, NULL) == -1)
|
||||
{
|
||||
perror("sigaction");
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("Ожидание сигнала Ctrl+C...\n");
|
||||
// signal(SIGINT, ctrlc_handler);
|
||||
while (1)
|
||||
{
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
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);
|
||||
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();
|
||||
}
|
||||
/*
|
||||
int cnt_root()
|
||||
{
|
||||
if (fabs(*pb - *pa) < eps)
|
||||
return (f(*pa) * f(*pb) <= 0) ? 1 : 0;
|
||||
else
|
||||
{
|
||||
double m = (*pa + *pb) / 2;
|
||||
if(f(*pa)*f(m)<=0)
|
||||
{
|
||||
return cnt_root(*pa, m);
|
||||
} else {
|
||||
return cnt_root(m, *pb);
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
@@ -0,0 +1,231 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <math.h>
|
||||
|
||||
double f(double x);
|
||||
void find_zero_x();
|
||||
void ctrlc_handler(int signum);
|
||||
void choose_path();
|
||||
// int cnt_root();
|
||||
|
||||
double a, b, eps, x, *pa = &a, *pb = &b;
|
||||
char choice, *ch = &choice;
|
||||
|
||||
int main()
|
||||
{
|
||||
double tmp;
|
||||
/*
|
||||
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 (*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_x();
|
||||
/*
|
||||
if (sigaction(SIGINT, &sa, NULL) == -1)
|
||||
{
|
||||
perror("sigaction");
|
||||
return 1;
|
||||
}
|
||||
*/
|
||||
printf("Ожидание сигнала Ctrl+C...\n");
|
||||
signal(SIGINT, ctrlc_handler);
|
||||
while (1)
|
||||
{
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
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_x();
|
||||
printf("Ожидание сигнала Ctrl+C...\n");
|
||||
}
|
||||
else if (*ch == 'R')
|
||||
{
|
||||
printf("Введите новые значения границ a и b: ");
|
||||
scanf("%lf %lf", pa, pb);
|
||||
find_zero_x();
|
||||
printf("Ожидание сигнала Ctrl+C...\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Ошибка ввода, повторная попытка...");
|
||||
choose_path();
|
||||
}
|
||||
*/
|
||||
printf("\nПродолжить поиск корня?\
|
||||
(C - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке): \n");
|
||||
do
|
||||
{
|
||||
|
||||
*ch = getchar();
|
||||
switch (*ch)
|
||||
{
|
||||
case 'C':
|
||||
find_zero_x();
|
||||
printf("Ожидание сигнала Ctrl+C...\n");
|
||||
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_x();
|
||||
printf("Ожидание сигнала Ctrl+C...\n");
|
||||
return;
|
||||
}
|
||||
} while (*ch != 'A' || *ch != 'R' || *ch != 'C');
|
||||
printf("Ошибка ввода, повторная попытка...");
|
||||
choose_path();
|
||||
}
|
||||
/*
|
||||
int cnt_root()
|
||||
{
|
||||
if (fabs(*pb - *pa) < eps)
|
||||
return (f(*pa) * f(*pb) <= 0) ? 1 : 0;
|
||||
else
|
||||
{
|
||||
double m = (*pa + *pb) / 2;
|
||||
if(f(*pa)*f(m)<=0)
|
||||
{
|
||||
return cnt_root(*pa, m);
|
||||
} else {
|
||||
return cnt_root(m, *pb);
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
void find_zero_x()
|
||||
{
|
||||
float mid = (*pa + *pb) / 2;
|
||||
mid = (*pb + *pa) / 2;
|
||||
if (f(mid) > 0)
|
||||
{
|
||||
*pa = (f(*pa) > f(*pb)) ? mid : *pa;
|
||||
*pb = (f(*pa) < f(*pb)) ? mid : *pb;
|
||||
}
|
||||
else
|
||||
{
|
||||
*pa = (f(*pa) < f(*pb)) ? mid : *pa;
|
||||
*pb = (f(*pa) > f(*pb)) ? mid : *pb;
|
||||
}
|
||||
|
||||
printf("Текущее приближение: %lf\n", *pa);
|
||||
|
||||
if (fabs(f(mid)) < eps)
|
||||
{
|
||||
printf("\nКорень уравнения: %lf\n", *pa);
|
||||
printf("Работа программы завершена.\n");
|
||||
exit(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
@@ -0,0 +1,144 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <math.h>
|
||||
|
||||
double f(double x);
|
||||
void find_zero();
|
||||
void ctrlc_handler(int signum);
|
||||
void choose_path();
|
||||
// int cnt_root();
|
||||
|
||||
double a, b, eps, x, *pa = &a, *pb = &b;
|
||||
// char choice, *ch = &choice;
|
||||
|
||||
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)
|
||||
{
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
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(*pb - *pa) < eps)
|
||||
{
|
||||
printf("\nКорень уравнения: %lf\n", x);
|
||||
printf("Работа программы завершена.\n");
|
||||
exit(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void ctrlc_handler(int signum)
|
||||
{
|
||||
printf("\nПолучен сигнал Ctrl+C\n");
|
||||
find_zero();
|
||||
choose_path();
|
||||
}
|
||||
|
||||
void choose_path()
|
||||
{
|
||||
char choice, *ch = &choice;
|
||||
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);
|
||||
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();
|
||||
}
|
||||
|
||||
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
@@ -0,0 +1,144 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <math.h>
|
||||
|
||||
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 + 4;
|
||||
}
|
||||
|
||||
void choose_path()
|
||||
{
|
||||
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");
|
||||
choose_path();
|
||||
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);
|
||||
|
||||
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;
|
||||
}
|
||||
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
@@ -0,0 +1,18 @@
|
||||
#include <stdio.h>
|
||||
|
||||
void plus1(int *px)
|
||||
{
|
||||
*px += 1;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
static int x = 5;
|
||||
static int *px = &x;
|
||||
plus1(px);
|
||||
printf('%d %d\n', x, x+1);
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <math.h>
|
||||
|
||||
double f(double x);
|
||||
void find_zero(double *pa, double *pb, double eps, double *px);
|
||||
void ctrlc_handler(int signum);
|
||||
// void choose_path();
|
||||
// void new_row(double *pa, double *pb);
|
||||
|
||||
int main()
|
||||
{
|
||||
double a, b, eps, x, *pa = &a, *pb = &b, *px = &x;
|
||||
char choice, *ch = &choice;
|
||||
|
||||
printf("Введите интервал [a, b] и точность eps: ");
|
||||
scanf("%lf %lf %lf", pa, pb, &eps);
|
||||
find_zero(pa, pb, eps, px);
|
||||
|
||||
printf("Ожидание сигнала Ctrl+C...\n");
|
||||
signal(SIGINT, ctrlc_handler);
|
||||
raise(SIGINT);
|
||||
// while (1)
|
||||
// sleep(1);
|
||||
|
||||
printf("\nКорень уравнения: %lf\n", *px);
|
||||
printf("Работа программы завершена.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <math.h>
|
||||
|
||||
double a, b, eps, x, *pa = &a, *pb = &b, *px = &x; // Переписать для статики...
|
||||
|
||||
double f(double x);
|
||||
void ctrlc_handler(int signum);
|
||||
void choose_path();
|
||||
|
||||
double f(double x)
|
||||
{
|
||||
return x*x - 16;
|
||||
}
|
||||
|
||||
void choose_path() // Функция выбора после сигнала
|
||||
{
|
||||
char choice, *ch = &choice;
|
||||
printf("\nПродолжить поиск корня?\
|
||||
(C - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке): \n");
|
||||
do
|
||||
{
|
||||
*ch = getchar();
|
||||
switch (*ch)
|
||||
{
|
||||
case 'C':
|
||||
return;
|
||||
case 'A':
|
||||
printf("\nКорень уравнения: %lf\n", *px);
|
||||
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");
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
} while (*ch != 'A' || *ch != 'R' || *ch != 'C');
|
||||
printf("Ошибка ввода, повторная попытка...");
|
||||
choose_path();
|
||||
}
|
||||
|
||||
void ctrlc_handler(int signum)
|
||||
{
|
||||
printf("\nТекущее приближение: %lf\n", *px);
|
||||
choose_path();
|
||||
}
|
||||
|
||||
int main(){
|
||||
double tmp;
|
||||
signal(SIGINT, ctrlc_handler);
|
||||
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
*px = (*pa + *pb) / 2; // метод деления отрезка пополам
|
||||
printf("%lf %lf\n", *pa, *pb);
|
||||
sleep(1);
|
||||
|
||||
if (f(*pa) * f(x) <= 0)
|
||||
*pb = x;
|
||||
else if(f(*pb) * f(x) <= 0)
|
||||
*pa = x;
|
||||
} while(fabs(*pb - *pa) > eps && f(x) != 0);
|
||||
|
||||
printf("\nКорень уравнения: %lf\n", *px);
|
||||
printf("Работа программы завершена.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// MEEEEEEEOW
|
||||
@@ -0,0 +1,63 @@
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <signal.h>
|
||||
|
||||
double f(double x)
|
||||
{
|
||||
return x + x - 16; // пример уравнения, замените на свою функцию
|
||||
}
|
||||
|
||||
void ctrlc_handler(int signum)
|
||||
{
|
||||
printf("\nПолучен сигнал Ctrl+C\n");
|
||||
printf("Продолжить поиск корня? (C - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке): ");
|
||||
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
double a, b, x, eps;
|
||||
char choice;
|
||||
|
||||
signal(SIGINT, ctrlc_handler);
|
||||
|
||||
do
|
||||
{
|
||||
printf("Введите интервал [a, b] и точность eps: ");
|
||||
scanf("%lf %lf %lf", &a, &b, &eps);
|
||||
|
||||
do
|
||||
{
|
||||
x = (a + b) / 2; // метод деления отрезка пополам
|
||||
if (f(a) * f(x) < 0)
|
||||
{
|
||||
b = x;
|
||||
}
|
||||
else
|
||||
{
|
||||
a = x;
|
||||
}
|
||||
printf("Текущее приближение: %lf\n", x);
|
||||
printf("Продолжить вычисления? (C - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке): ");
|
||||
scanf(" %c", &choice);
|
||||
if (choice == 'A')
|
||||
{
|
||||
printf("Работа программы завершена.\n");
|
||||
return 0;
|
||||
}
|
||||
else if (choice == 'R')
|
||||
{
|
||||
break;
|
||||
}
|
||||
} while (fabs(b - a) > eps);
|
||||
|
||||
if (choice != 'R')
|
||||
{
|
||||
printf("Корень уравнения: %lf\n", x);
|
||||
printf("Работа программы завершена.\n");
|
||||
return 0;
|
||||
}
|
||||
} while (choice == 'R');
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user