This commit is contained in:
ada-dmitry
2023-12-27 16:23:28 +03:00
parent e405b960a7
commit 133d1abffa
12 changed files with 161 additions and 120 deletions
Binary file not shown.
BIN
View File
Binary file not shown.
+11 -15
View File
@@ -13,12 +13,13 @@ int linesWritten = 0;
void signalHandler(int signal) 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) 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) if (fd == -1)
{ {
@@ -32,9 +33,13 @@ void writeFile(const char *fileName, int numLines, const char *placeholder)
exit(EXIT_FAILURE); 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++) for (int i = 0; i < numLines; i++)
{ {
@@ -75,18 +80,9 @@ int main(int argc, char *argv[])
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
char *placeholder = argv[3]; const 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++;
}
writeFile(fileName, numLines, argv[3]); writeFile(fileName, numLines, placeholder);
return 0; return 0;
} }
Binary file not shown.
-36
View File
@@ -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
+6 -12
View File
@@ -1,25 +1,19 @@
# Это комментарий, который говорит, что переменная CC указывает компилятор, используемый для сборки # Это комментарий, который говорит, что переменная CC указывает компилятор, используемый для сборки
CC= gcc CC= gcc
#Это еще один комментарий. Он поясняет, что в переменной CFLAGS лежат флаги, которые передаются компилятору #Это еще один комментарий. Он поясняет, что в переменной CFLAGS лежат флаги, которые передаются компилятору
CFLAGS= -c -Wall CFLAGS= -Wall -pedantic
default: build 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: 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: run:
./out/function_zeros_calculator ./out/function_zeros_calculator
+29 -11
View File
@@ -1,35 +1,53 @@
# Function Zeros Calculator # Function Zeros Calculator
## Описание ## Описание
Эта программа предназначена для вычисления нулей функции на языке C в среде Linux. Эта программа предназначена для вычисления нулей функции на языке C в среде Linux.
## Установка ## Установка (с помощью репозитория на GitHub)
1. Склонируйте репозиторий: git clone https://github.com/ada-dmitry/tmp_project.git 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 1. Соберите программу: make
2. Запустите программу: ./out/function_zeros_calculator 2. Запустите программу: make run
3. Введите необходимые параметры для вычисления нуля функции: a - ЛЕВАЯ граница отрезка 3. Строго следуйте указаниям программы, вводя границы отрезка, точность вычисления корня и
b - ПРАВАЯ граница отрезка, eps > 0 - точность вычисления корня(до 10^-6). выбирая метод вычисления.
## Замечания ## Замечания
1. Для корректной работы программы, необходимо вводить отрезок, на котором есть лишь один корень 1. Для корректной работы программы, необходимо вводить отрезок, на котором есть лишь один корень
(это можно проверить благодаря графику). (это можно проверить благодаря графику).
2. После вызова меню выбора действий (Ctrl+C) можно использовать как верхний регистр, так и нижний. 2. После вызова меню выбора действий (Ctrl+C) можно использовать как верхний регистр, так и нижний.
3. Не рекомендуется бесконечно вызывать Ctrl+C без выбора действия, это может повлечь ошибки 3. Не рекомендуется бесконечно вызывать Ctrl+C без выбора действия, это может повлечь ошибки
вследствие переполнения памяти. вследствие переполнения памяти.
## Обработка сигнала SIGINT ## Обработка сигнала SIGINT
Программа обрабатывает сигнал SIGINT, что позволяет давать пользователю выбор действия Программа обрабатывает сигнал SIGINT, что позволяет давать пользователю выбор действия
при нажатии сочетания клавиш Ctrl+C. при нажатии сочетания клавиш Ctrl+C.
## Обработка сигнала SIGTSTP
Программа обрабатывает сигнал SIGTSTP, переводящий программу в фоновый режим,
вновь предоставляя пользователю управлять терминалом, но возвращающий настройки терминала к исходным.
## Авторы ## Авторы
Антипенко Дмитрий Андреевич [C22-712] - https://github.com/ada-dmitry/ Антипенко Дмитрий Андреевич [C22-712] - https://github.com/ada-dmitry/
Кузнецов Даниил Евгеньевич [C22-712] Кузнецов Даниил Евгеньевич [C22-712]
Никитин Михаил Андреевич [C22-712] Никитин Михаил Андреевич [C22-712]
Ускова Екатерина Александровна [C22-712] Ускова Екатерина Александровна [C22-712]
+9 -1
View File
@@ -1,3 +1,5 @@
#include <stdbool.h>
extern double a, b, eps, x, *pa, *pb, *px; extern double a, b, eps, x, *pa, *pb, *px;
extern short method, *mth, sig_flag; extern short method, *mth, sig_flag;
extern struct termios default_term, modif_term; extern struct termios default_term, modif_term;
@@ -20,4 +22,10 @@ double numerical_derivative(double x);
void __exit(); void __exit();
void show_grapgh(); void show_grapgh();
void input_diap(); void input_diap();
void change_diap(); 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);
+102 -41
View File
@@ -4,6 +4,8 @@
#include <math.h> #include <math.h>
#include <termios.h> #include <termios.h>
#include <stdio_ext.h> #include <stdio_ext.h>
#include <ctype.h>
#include <stdbool.h>
#include "declare.h" #include "declare.h"
@@ -15,7 +17,6 @@ double f(double x) // Функция, заданная пользователе
void show_grapgh() void show_grapgh()
{ {
char func[100] = "x+20"; char func[100] = "x+20";
tcsetattr(0, TCSANOW, &modif_term);
// Подключение GNU Plot // Подключение GNU Plot
FILE *gp = popen("gnuplot -persist", "w"); FILE *gp = popen("gnuplot -persist", "w");
@@ -34,7 +35,6 @@ void show_grapgh()
getchar(); getchar();
sig_flag = 0; sig_flag = 0;
fprintf(gp, "exit\n"); fprintf(gp, "exit\n");
tcsetattr(0, TCSANOW, &default_term);
return; return;
} }
@@ -176,53 +176,29 @@ void __exit()
void input_diap() void input_diap()
{ {
double tmp; double tmp;
char input[50];
sig_flag = 1; sig_flag = 1;
system("clear"); system("clear");
printf("\n\nТекущие значения: [%lf : %lf] eps = %lf\n\n\ printf("\n\nТекущие значения: [%g] : %g | eps = %g\n\n\
Введите левую границу отрезка и нажмите Enter (по умолчанию: %lf): ", Введите левую границу отрезка и нажмите Enter (по умолчанию: %g): ",
*pa, *pb, eps, *pa); *pa, *pb, eps, *pa);
fgets(input, sizeof(input), stdin);
if (input[0] == '\n') *pa = read_parse('A');
{
*pa = A; // значение по умолчанию
}
else
{
sscanf(input, "%lf", pa);
}
system("clear"); system("clear");
printf("\n\nТекущие значения: [%lf : %lf] eps = %lf\n\n\ printf("\nТекущие значения: %g : [%g] | eps = %g\n\n\
Введите правую границу отрезка и нажмите Enter (по умолчанию: %lf): ", Введите правую границу отрезка и нажмите Enter (по умолчанию: %g): ",
*pa, *pb, eps, *pb); *pa, *pb, eps, *pb);
fgets(input, sizeof(input), stdin);
if (input[0] == '\n') *pb = read_parse('B');
{
*pb = B; // значение по умолчанию
}
else
{
sscanf(input, "%lf", pb);
}
system("clear"); system("clear");
printf("\n\nТекущие значения: [%lf : %lf] eps = %lf\n\n\ printf("\nТекущие значения: %g : %g | eps = [%g]\n\n\
Введите точность вычисления и нажмите Enter (по умолчанию: %lf): ", Введите точность вычисления и нажмите Enter (по умолчанию: %g): ",
*pa, *pb, eps, eps); *pa, *pb, eps, eps);
fgets(input, sizeof(input), stdin);
if (input[0] == '\n') eps = read_parse('E');
{
eps = EPS; // значение по умолчанию
}
else
{
sscanf(input, "%lf", &eps);
}
system("clear"); system("clear");
__fpurge(stdin); __fpurge(stdin);
printf("\nВыберите метод вычисления корня и нажмите Enter:\ printf("\nВыберите метод вычисления корня и нажмите Enter:\
@@ -242,7 +218,6 @@ void input_diap()
sig_flag = 0; sig_flag = 0;
printf("В указанных границах нуля функции не существует.\n"); printf("В указанных границах нуля функции не существует.\n");
printf("Поменяйте границы\n"); printf("Поменяйте границы\n");
// choose_path();
change_diap(); change_diap();
} }
if (eps < 0) // Если пользователь указал отрицательную точность if (eps < 0) // Если пользователь указал отрицательную точность
@@ -273,16 +248,18 @@ void change_diap()
// Возврат к обычному выводу // Возврат к обычному выводу
tcsetattr(0, TCSANOW, &default_term); 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) if (f(*pa) * f(*pb) > 0)
{ {
printf("\nВ указанных границах нуля функции не существует.\n"); printf("\nВ указанных границах нуля функции не существует.\n");
printf("Поменяйте границы\n"); printf("Поменяйте границы\n");
choose_path(); choose_path();
// change_diap();
} }
if (*pa == *pb) if (*pa == *pb)
{ {
@@ -300,4 +277,88 @@ void change_diap()
sig_flag = 0; sig_flag = 0;
return; return;
} }
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;
}
+4 -4
View File
@@ -53,22 +53,22 @@ int main()
system("clear"); system("clear");
if (*mth == 0) if (*mth == 0)
{ {
printf("Fork\n"); printf("\nFork\n");
fork_method(); fork_method();
} }
else if (*mth == 1) else if (*mth == 1)
{ {
printf("Chord\n"); printf("\nChord\n");
chord_method(); chord_method();
} }
else if (*mth == 2) else if (*mth == 2)
{ {
printf("Newton\n"); printf("\nNewton\n");
newton_method(); newton_method();
} }
else else
{ {
printf("Fork\n"); printf("\nFork\n");
fork_method(); fork_method();
} }
Binary file not shown.
Binary file not shown.