diff --git a/project/ada_712.tar b/project/ada_712.tar new file mode 100644 index 0000000..78eed57 Binary files /dev/null and b/project/ada_712.tar differ diff --git a/test/ada_712.tar b/test/ada_712.tar new file mode 100644 index 0000000..9df6499 Binary files /dev/null and b/test/ada_712.tar differ diff --git a/test/other/Vova`s Proj/main.c b/test/other/Vova`s Proj/main.c index 18b5dd7..cdd358c 100644 --- a/test/other/Vova`s Proj/main.c +++ b/test/other/Vova`s Proj/main.c @@ -13,12 +13,13 @@ int linesWritten = 0; void signalHandler(int signal) { - printf("Number of lines written: %d\n", linesWritten); + printf("\b\bNumber of lines written: %d\n", linesWritten); + fflush(stdout); } void writeFile(const char *fileName, int numLines, const char *placeholder) { - int fd = open(fileName, O_CREAT | O_WRONLY | O_TRUNC, 0666); + int fd = open(fileName, O_CREAT | O_WRONLY, 0666); if (fd == -1) { @@ -32,9 +33,13 @@ void writeFile(const char *fileName, int numLines, const char *placeholder) exit(EXIT_FAILURE); } - signal(SIGINT, signalHandler); + if (ftruncate(fd, 0) == -1) + { + printf("Failed to truncate the file\n"); + exit(EXIT_FAILURE); + } - // lseek(fd, 0, SEEK_END); + signal(SIGINT, signalHandler); for (int i = 0; i < numLines; i++) { @@ -75,18 +80,9 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - char *placeholder = argv[3]; - while (*placeholder) - { - if (!isalnum(*placeholder) && !isspace(*placeholder)) - { - printf("The placeholder must consist of letters and numbers\n"); - exit(EXIT_FAILURE); - } - placeholder++; - } + const char *placeholder = argv[3]; - writeFile(fileName, numLines, argv[3]); + writeFile(fileName, numLines, placeholder); return 0; } \ No newline at end of file diff --git a/test/other/Vova`s Proj/out/app b/test/other/Vova`s Proj/out/app index 6d7c039..5096dac 100755 Binary files a/test/other/Vova`s Proj/out/app and b/test/other/Vova`s Proj/out/app differ diff --git a/test/other/Vova`s Proj/text.txt b/test/other/Vova`s Proj/text.txt index 2cf66c7..e69de29 100644 --- a/test/other/Vova`s Proj/text.txt +++ b/test/other/Vova`s Proj/text.txt @@ -1,36 +0,0 @@ -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia -mia diff --git a/test/ver1.6/Makefile b/test/ver1.6/Makefile index e83b3af..a6184e2 100644 --- a/test/ver1.6/Makefile +++ b/test/ver1.6/Makefile @@ -1,25 +1,19 @@ # Это комментарий, который говорит, что переменная CC указывает компилятор, используемый для сборки CC= gcc #Это еще один комментарий. Он поясняет, что в переменной CFLAGS лежат флаги, которые передаются компилятору -CFLAGS= -c -Wall +CFLAGS= -Wall -pedantic default: build -general: main.o functions.o - $(CC) ./out/main.o ./out/functions.o -o ./out/function_zeros_calculator -lm -main.o: main.c - $(CC) $(CFLAGS) main.c -o ./out/main.o - -functions.o: functions.c - - $(CC) $(CFLAGS) functions.c -o ./out/functions.o clean: - rm -rf ./out/main.o ./out/functions.o + rm ./out/function_zeros_calculator -build: general clean +build: + $(CC) ./main.c ./functions.c $(CFLAGS) -o ./out/function_zeros_calculator -lm run: - ./out/function_zeros_calculator \ No newline at end of file + ./out/function_zeros_calculator + \ No newline at end of file diff --git a/test/ver1.6/README b/test/ver1.6/README.md similarity index 51% rename from test/ver1.6/README rename to test/ver1.6/README.md index 344d4d1..1ef78af 100644 --- a/test/ver1.6/README +++ b/test/ver1.6/README.md @@ -1,35 +1,53 @@ # Function Zeros Calculator ## Описание + Эта программа предназначена для вычисления нулей функции на языке C в среде Linux. -## Установка +## Установка (с помощью репозитория на GitHub) + 1. Склонируйте репозиторий: git clone https://github.com/ada-dmitry/tmp_project.git -2. Перейдите в каталог проекта: cd /Project_1.2 +2. Перейдите в директорию проекта: cd /done_project +3. Следуйте указаниям пункта "Использование" + +## Установка (с помощью архива .tar) + +1. Распакуйте архив в любую удобную вам директорию. +2. С помощью терминала зайдите в распакованную директорию по заданному пути. +3. Следуйте указаниям пункта "Использование" ## Использование -0. Для нормальной работы программы необходимо установить программу GNU PLot - (sudo apt install gnuplot) + +0. Для нормальной работы программы необходимо установить программу GNU PLot и сборщик make + (sudo apt install gnuplot || sudo apt install make) 1. Соберите программу: make -2. Запустите программу: ./out/function_zeros_calculator -3. Введите необходимые параметры для вычисления нуля функции: a - ЛЕВАЯ граница отрезка - b - ПРАВАЯ граница отрезка, eps > 0 - точность вычисления корня(до 10^-6). +2. Запустите программу: make run +3. Строго следуйте указаниям программы, вводя границы отрезка, точность вычисления корня и + выбирая метод вычисления. ## Замечания + 1. Для корректной работы программы, необходимо вводить отрезок, на котором есть лишь один корень - (это можно проверить благодаря графику). + (это можно проверить благодаря графику). 2. После вызова меню выбора действий (Ctrl+C) можно использовать как верхний регистр, так и нижний. 3. Не рекомендуется бесконечно вызывать Ctrl+C без выбора действия, это может повлечь ошибки - вследствие переполнения памяти. - + вследствие переполнения памяти. ## Обработка сигнала SIGINT + Программа обрабатывает сигнал SIGINT, что позволяет давать пользователю выбор действия + при нажатии сочетания клавиш Ctrl+C. +## Обработка сигнала SIGTSTP + + Программа обрабатывает сигнал SIGTSTP, переводящий программу в фоновый режим, + +вновь предоставляя пользователю управлять терминалом, но возвращающий настройки терминала к исходным. + ## Авторы + Антипенко Дмитрий Андреевич [C22-712] - https://github.com/ada-dmitry/ Кузнецов Даниил Евгеньевич [C22-712] Никитин Михаил Андреевич [C22-712] Ускова Екатерина Александровна [C22-712] - diff --git a/test/ver1.6/declare.h b/test/ver1.6/declare.h index bbd4d80..0a7d609 100644 --- a/test/ver1.6/declare.h +++ b/test/ver1.6/declare.h @@ -1,3 +1,5 @@ +#include + extern double a, b, eps, x, *pa, *pb, *px; extern short method, *mth, sig_flag; extern struct termios default_term, modif_term; @@ -20,4 +22,10 @@ double numerical_derivative(double x); void __exit(); void show_grapgh(); void input_diap(); -void change_diap(); \ No newline at end of file +void change_diap(); +// double input_number(char ch); +bool is_digit(char c); +bool is_sign(char c); +bool is_dot(char c); +double read_parse(char ch); +bool is_enter(char c); \ No newline at end of file diff --git a/test/ver1.6/functions.c b/test/ver1.6/functions.c index e29fe53..95f9f6c 100644 --- a/test/ver1.6/functions.c +++ b/test/ver1.6/functions.c @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include "declare.h" @@ -15,7 +17,6 @@ double f(double x) // Функция, заданная пользователе void show_grapgh() { char func[100] = "x+20"; - tcsetattr(0, TCSANOW, &modif_term); // Подключение GNU Plot FILE *gp = popen("gnuplot -persist", "w"); @@ -34,7 +35,6 @@ void show_grapgh() getchar(); sig_flag = 0; fprintf(gp, "exit\n"); - tcsetattr(0, TCSANOW, &default_term); return; } @@ -176,53 +176,29 @@ void __exit() void input_diap() { double tmp; - char input[50]; sig_flag = 1; system("clear"); - printf("\n\nТекущие значения: [%lf : %lf] eps = %lf\n\n\ -Введите левую границу отрезка и нажмите Enter (по умолчанию: %lf): ", + printf("\n\nТекущие значения: [%g] : %g | eps = %g\n\n\ +Введите левую границу отрезка и нажмите Enter (по умолчанию: %g): ", *pa, *pb, eps, *pa); - fgets(input, sizeof(input), stdin); - if (input[0] == '\n') - { - *pa = A; // значение по умолчанию - } - else - { - sscanf(input, "%lf", pa); - } + *pa = read_parse('A'); system("clear"); - printf("\n\nТекущие значения: [%lf : %lf] eps = %lf\n\n\ -Введите правую границу отрезка и нажмите Enter (по умолчанию: %lf): ", + printf("\nТекущие значения: %g : [%g] | eps = %g\n\n\ +Введите правую границу отрезка и нажмите Enter (по умолчанию: %g): ", *pa, *pb, eps, *pb); - fgets(input, sizeof(input), stdin); - if (input[0] == '\n') - { - *pb = B; // значение по умолчанию - } - else - { - sscanf(input, "%lf", pb); - } + *pb = read_parse('B'); system("clear"); - printf("\n\nТекущие значения: [%lf : %lf] eps = %lf\n\n\ -Введите точность вычисления и нажмите Enter (по умолчанию: %lf): ", + printf("\nТекущие значения: %g : %g | eps = [%g]\n\n\ +Введите точность вычисления и нажмите Enter (по умолчанию: %g): ", *pa, *pb, eps, eps); - fgets(input, sizeof(input), stdin); - if (input[0] == '\n') - { - eps = EPS; // значение по умолчанию - } - else - { - sscanf(input, "%lf", &eps); - } + eps = read_parse('E'); + system("clear"); __fpurge(stdin); printf("\nВыберите метод вычисления корня и нажмите Enter:\ @@ -242,7 +218,6 @@ void input_diap() sig_flag = 0; printf("В указанных границах нуля функции не существует.\n"); printf("Поменяйте границы\n"); - // choose_path(); change_diap(); } if (eps < 0) // Если пользователь указал отрицательную точность @@ -273,16 +248,18 @@ void change_diap() // Возврат к обычному выводу tcsetattr(0, TCSANOW, &default_term); - printf("Введите новые значения границ a и b: "); + system("clear"); - scanf("%lf%lf", pa, pb); + printf("Введите новое значение левой границы: "); + *pa = read_parse('A'); + printf("Введите новое значение правой границы: "); + *pb = read_parse('B'); if (f(*pa) * f(*pb) > 0) { printf("\nВ указанных границах нуля функции не существует.\n"); printf("Поменяйте границы\n"); choose_path(); - // change_diap(); } if (*pa == *pb) { @@ -300,4 +277,88 @@ void change_diap() sig_flag = 0; return; -} \ No newline at end of file +} + +bool is_digit(char c) +{ + return (c >= '0' && c <= '9'); +} + +bool is_sign(char c) +{ + return (c == '+' || c == '-'); +} + +bool is_dot(char c) +{ + return (c == '.'); +} + +bool is_enter(char c) +{ + return (c == '\n'); +} + +double read_parse(char ch) +{ + char input[50]; + double number; + + __fpurge(stdin); + + fgets(input, sizeof(input), stdin); + + __fpurge(stdin); + int i = 0; + bool is_valid = true; + bool has_dot = false; + // Проверка первого символа, который может быть знаком или переносом строки + if (is_sign(input[0])) + { + i++; + } + else if (is_enter(input[0])) + { + switch (ch) + { + case 'A': + return A; + case 'B': + return B; + case 'E': + return EPS; + } + } + // Проверка символов, формирующих цифры числа + while (input[i] != '\0') + { + if (is_digit(input[i])) + { + i++; + continue; + } + else if (is_dot(input[i]) && !has_dot) + { + has_dot = true; + i++; + continue; + } + else + { + is_valid = false; + break; + } + } + + if (is_valid) + { + number = atof(input); + return number; + } + else + { + printf("Ошибка: некорректный ввод\nЗавершение выполнения программы...\n"); + __exit(); + } + return 1; +} diff --git a/test/ver1.6/main.c b/test/ver1.6/main.c index 1c4ac1f..6031a38 100644 --- a/test/ver1.6/main.c +++ b/test/ver1.6/main.c @@ -53,22 +53,22 @@ int main() system("clear"); if (*mth == 0) { - printf("Fork\n"); + printf("\nFork\n"); fork_method(); } else if (*mth == 1) { - printf("Chord\n"); + printf("\nChord\n"); chord_method(); } else if (*mth == 2) { - printf("Newton\n"); + printf("\nNewton\n"); newton_method(); } else { - printf("Fork\n"); + printf("\nFork\n"); fork_method(); } diff --git a/test/ver1.6/out/app b/test/ver1.6/out/app deleted file mode 100755 index 84ae7f9..0000000 Binary files a/test/ver1.6/out/app and /dev/null differ diff --git a/test/ver1.6/out/function_zeros_calculator b/test/ver1.6/out/function_zeros_calculator index d7e77cd..756d228 100755 Binary files a/test/ver1.6/out/function_zeros_calculator and b/test/ver1.6/out/function_zeros_calculator differ