diff --git a/DON`T TOUCH/main.c b/DON`T TOUCH/main.c new file mode 100644 index 0000000..2294c1f --- /dev/null +++ b/DON`T TOUCH/main.c @@ -0,0 +1,201 @@ +#include +#include +#include +#include +#include + +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(*pb - *pa) < 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); + } + } +} +*/ \ No newline at end of file diff --git a/PROJECT/out_p/prog1 b/DON`T TOUCH/out_p/prog1 similarity index 100% rename from PROJECT/out_p/prog1 rename to DON`T TOUCH/out_p/prog1 diff --git a/PROJECT/out_p/prog2 b/DON`T TOUCH/out_p/prog2 similarity index 100% rename from PROJECT/out_p/prog2 rename to DON`T TOUCH/out_p/prog2 diff --git a/DON`T TOUCH/out_p/prog4 b/DON`T TOUCH/out_p/prog4 new file mode 100755 index 0000000..d2d1376 Binary files /dev/null and b/DON`T TOUCH/out_p/prog4 differ diff --git a/PROJECT/func.c b/PROJECT/func.c deleted file mode 100644 index 0405b0a..0000000 --- a/PROJECT/func.c +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include -#include -#include - -double f(double x) -{ - return x * x - 16; -} - -void find_zero(double *pa, double *pb, double eps, double *px) -{ - *px = (*pa + *pb) / 2; // метод деления отрезка пополам - if (f(*pa) * f(*px) < 0) - *pb = *px; - else - *pa = *px; - printf("Текущее приближение: %lf\n", *px); -} - -void ctrlc_handler(int signum) -{ - printf("\nПолучен сигнал Ctrl+C\n"); - printf("\nПродолжить поиск корня? (C - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке): \n"); -} - -// void choose_path() -// { -// char choice = getchar(); -// if(choice == 'A') -// break; -// else if(choice == 'C') -// find_zero() - -// } -// void new_row(double *pa, double *pb); \ No newline at end of file diff --git a/PROJECT/main.c b/PROJECT/main.c deleted file mode 100644 index d1bb21c..0000000 --- a/PROJECT/main.c +++ /dev/null @@ -1,42 +0,0 @@ -#include -#include -#include -#include - -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; - 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); - find_zero(pa, pb, eps, px); - - if (sigaction(SIGINT, &sa, NULL) == -1) - { - perror("sigaction"); - return 1; - } - - printf("Ожидание сигнала Ctrl+C...\n"); - - while (1) - { - sleep(1); - } - - printf("\nКорень уравнения: %lf\n", *px); - printf("Работа программы завершена.\n"); - - return 0; -} diff --git a/PROJECT/out_p/prog4 b/PROJECT/out_p/prog4 deleted file mode 100755 index 9399eaf..0000000 Binary files a/PROJECT/out_p/prog4 and /dev/null differ diff --git a/Prod_with_G/declare.h b/Prod_with_G/declare.h deleted file mode 100644 index b28b04f..0000000 --- a/Prod_with_G/declare.h +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Prod_with_G/func.c b/Prod_with_G/func.c deleted file mode 100644 index cf1e70d..0000000 --- a/Prod_with_G/func.c +++ /dev/null @@ -1,33 +0,0 @@ -#include "declare.h" - -double f(double x) -{ - return x * x - 16; -} - -void find_zero() -{ - *px = (*pa + *pb) / 2; // метод деления отрезка пополам - if (f(*pa) * f(*px) < 0) - *pb = *px; - else - *pa = *px; - printf("Текущее приближение: %lf\n", *px); -} - -void ctrlc_handler(int signum) -{ - printf("\nПолучен сигнал Ctrl+C\n"); - printf("\nПродолжить поиск корня? (C - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке): \n"); -} - -// void choose_path() -// { -// char choice = getchar(); -// if(choice == 'A') -// break; -// else if(choice == 'C') -// find_zero() - -// } -// void new_row(double *pa, double *pb); \ No newline at end of file diff --git a/Prod_with_G/main b/Prod_with_G/main deleted file mode 100755 index f14ee7c..0000000 Binary files a/Prod_with_G/main and /dev/null differ diff --git a/Prod_with_G/main.c b/Prod_with_G/main.c index 0ee97be..88836e3 100644 --- a/Prod_with_G/main.c +++ b/Prod_with_G/main.c @@ -8,6 +8,7 @@ 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; @@ -38,6 +39,7 @@ int main() if (eps < 0) // Если пользователь указал отрицательную точность { eps = eps * (-1); + printf("Точность отрицательна, условие приведено в порядок, запуск решения...\n"); } if (*pa == *pb) { @@ -71,9 +73,9 @@ int main() return 0; } -double f(double x) +double f(double x) // Функция обязана быть линейной { - return x * x - 16; + return x + x - 16; } void find_zero() @@ -106,34 +108,35 @@ void ctrlc_handler(int signum) void choose_path() { - // printf("\nПродолжить поиск корня?\ - (C - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке): \n"); - // choice = 'Q'; - // *ch = getchar(); + /* + printf("\nПродолжить поиск корня? (C - продолжить, A - закончить работу программы, R - начать поиск на другом отрезке): \n"); + choice = 'Q'; + *ch = getchar(); - // if (*ch == 'A') - // { - // printf("Работа программы завершена.\n"); - // exit(0); - // } + 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(); - // } + 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 @@ -152,6 +155,24 @@ void choose_path() 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; @@ -160,3 +181,20 @@ void choose_path() 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); + } + } +} +*/ \ No newline at end of file diff --git a/Prod_with_G/main_wo_struct.c b/Prod_with_G/main_wo_struct.c new file mode 100644 index 0000000..a2d2d36 --- /dev/null +++ b/Prod_with_G/main_wo_struct.c @@ -0,0 +1,231 @@ +#include +#include +#include +#include +#include + +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; + } +} diff --git a/Prod_with_G/out_prod/main__app1 b/Prod_with_G/out_prod/main__app1 new file mode 100755 index 0000000..d1b73d8 Binary files /dev/null and b/Prod_with_G/out_prod/main__app1 differ diff --git a/Prod_with_G/out_prod/main_app1 b/Prod_with_G/out_prod/main_app1 index f6af47d..b16be07 100755 Binary files a/Prod_with_G/out_prod/main_app1 and b/Prod_with_G/out_prod/main_app1 differ