restore 2

This commit is contained in:
ada-dmitry
2023-11-30 15:01:25 +03:00
parent 5634e41e21
commit 8bbd79d0b0
31 changed files with 0 additions and 0 deletions
+170
View File
@@ -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
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+176
View File
@@ -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
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
Компилировать с ключом -lm
+200
View File
@@ -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);
}
}
}
*/
+231
View File
@@ -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;
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
+144
View File
@@ -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();
}
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
View File
View File
+144
View File
@@ -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;
}
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+18
View File
@@ -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;
}
+31
View File
@@ -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;
}
+126
View File
@@ -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
+63
View File
@@ -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;
}
View File