diff --git a/Project 1.1.tar.xz b/Project 1.1.tar.xz new file mode 100644 index 0000000..c09251d Binary files /dev/null and b/Project 1.1.tar.xz differ diff --git a/Project 1.1/readme b/Project 1.1/readme index cd4b968..65a5426 100644 --- a/Project 1.1/readme +++ b/Project 1.1/readme @@ -1 +1 @@ -Очередная попытка вывести в функцию подсчет корня. \ No newline at end of file +Компилировать с ключом -lm diff --git a/Project 1.2/Makefile b/Project 1.2/Makefile new file mode 100644 index 0000000..d22bfb7 --- /dev/null +++ b/Project 1.2/Makefile @@ -0,0 +1,21 @@ +CC = gcc +CFLAGS = -Wall -Wextra -std=c99 + +SRCS = main.c functions.c +OBJS = $(SRCS:.c=.o) +DEPS = declare.h + +TARGET = ./out/app + +.PHONY: all clean + +all: $(TARGET) + +$(TARGET): $(OBJS) + $(CC) $(CFLAGS) $^ -o $@ + +%.o: %.c $(DEPS) + $(CC) $(CFLAGS) -c $< -o $@ + +clean: + rm -f $(TARGET) $(OBJS) \ No newline at end of file diff --git a/Project 1.2/declare.h b/Project 1.2/declare.h new file mode 100644 index 0000000..ec1d0b1 --- /dev/null +++ b/Project 1.2/declare.h @@ -0,0 +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(); \ No newline at end of file diff --git a/Project 1.2/functions.c b/Project 1.2/functions.c new file mode 100644 index 0000000..4335aa4 --- /dev/null +++ b/Project 1.2/functions.c @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include +#include + +#include "declare.h" + + + +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(); +} \ No newline at end of file diff --git a/Project 1.2/main.c b/Project 1.2/main.c new file mode 100644 index 0000000..f7be3fe --- /dev/null +++ b/Project 1.2/main.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include +#include + +#include "declare.h" + +double a, b, eps, x, *pa, *pb, *px; + + +int main(){ + + double tmp; + pa = &a; pb = &b; px = &x; + + 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 \ No newline at end of file diff --git a/Project 1.2/out/app b/Project 1.2/out/app new file mode 100755 index 0000000..e1fe845 Binary files /dev/null and b/Project 1.2/out/app differ diff --git a/Project 1.2/out/app1 b/Project 1.2/out/app1 new file mode 100755 index 0000000..bd9370f Binary files /dev/null and b/Project 1.2/out/app1 differ diff --git a/Project 1.2/readme b/Project 1.2/readme new file mode 100644 index 0000000..facd312 --- /dev/null +++ b/Project 1.2/readme @@ -0,0 +1,5 @@ +Цель: разбить программу на несколько файлов и, опционально, написать makefile// + +Изменения: +1. Программа разбита на основной - main.c, где лежит функция main(). +2. \ No newline at end of file