From e405b960a79c2c97fc7ce83a970370469243d47a Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Thu, 21 Dec 2023 11:44:34 +0300 Subject: [PATCH] added 1.6 --- patch_note.md | 2 + project/ver1.4/Makefile | 1 - project/ver1.4/README.md | 19 +- project/ver1.4/functions.c | 11 +- project/ver1.4/out/function_zeros_calculator | Bin 21584 -> 21552 bytes test/ver1.5/additional_finc.c | 48 +++ test/ver1.5/functions.c | 36 ++- test/ver1.5/main.c | 6 +- test/ver1.5/out/function_zeros_calculator | Bin 21584 -> 21432 bytes test/ver1.6/Makefile | 25 ++ test/ver1.6/README | 35 +++ test/ver1.6/declare.h | 23 ++ test/ver1.6/functions.c | 303 +++++++++++++++++++ test/ver1.6/main.c | 81 +++++ test/ver1.6/out/app | Bin 0 -> 21552 bytes test/ver1.6/out/function_zeros_calculator | Bin 0 -> 21736 bytes 16 files changed, 568 insertions(+), 22 deletions(-) create mode 100644 test/ver1.5/additional_finc.c create mode 100644 test/ver1.6/Makefile create mode 100644 test/ver1.6/README create mode 100644 test/ver1.6/declare.h create mode 100644 test/ver1.6/functions.c create mode 100644 test/ver1.6/main.c create mode 100755 test/ver1.6/out/app create mode 100755 test/ver1.6/out/function_zeros_calculator diff --git a/patch_note.md b/patch_note.md index 7b2e784..2b8f93b 100644 --- a/patch_note.md +++ b/patch_note.md @@ -1,3 +1,5 @@ 1.4 Добавлен вывод графиков функций, добавлена проприетарная функция выхода с возвратом значений настроек системы по умолчанию. 1.5 Добавлен второй обработчик сигналов для комбинации Ctrl+Z - переход в exit_777(выход из программы с возвратом настроек по умолчанию.) + +1.6 Обработчик Ctrl+Z включен в работу, настройки терминала вынесены в глобальную переменную diff --git a/project/ver1.4/Makefile b/project/ver1.4/Makefile index 92fa3cb..e83b3af 100644 --- a/project/ver1.4/Makefile +++ b/project/ver1.4/Makefile @@ -6,7 +6,6 @@ CFLAGS= -c -Wall default: build general: main.o functions.o - killall -9 function_zeros_calculator $(CC) ./out/main.o ./out/functions.o -o ./out/function_zeros_calculator -lm main.o: main.c diff --git a/project/ver1.4/README.md b/project/ver1.4/README.md index 344d4d1..76235ef 100644 --- a/project/ver1.4/README.md +++ b/project/ver1.4/README.md @@ -1,35 +1,40 @@ # Function Zeros Calculator ## Описание + Эта программа предназначена для вычисления нулей функции на языке C в среде Linux. ## Установка + 1. Склонируйте репозиторий: git clone https://github.com/ada-dmitry/tmp_project.git 2. Перейдите в каталог проекта: cd /Project_1.2 ## Использование -0. Для нормальной работы программы необходимо установить программу GNU PLot - (sudo apt install gnuplot) + +0. Для нормальной работы программы необходимо установить программу GNU PLot + (sudo apt install gnuplot) 1. Соберите программу: make 2. Запустите программу: ./out/function_zeros_calculator 3. Введите необходимые параметры для вычисления нуля функции: a - ЛЕВАЯ граница отрезка - b - ПРАВАЯ граница отрезка, eps > 0 - точность вычисления корня(до 10^-6). + b - ПРАВАЯ граница отрезка, eps > 0 - точность вычисления корня(до 10^-6). ## Замечания + 1. Для корректной работы программы, необходимо вводить отрезок, на котором есть лишь один корень - (это можно проверить благодаря графику). + (это можно проверить благодаря графику). 2. После вызова меню выбора действий (Ctrl+C) можно использовать как верхний регистр, так и нижний. 3. Не рекомендуется бесконечно вызывать Ctrl+C без выбора действия, это может повлечь ошибки - вследствие переполнения памяти. - + вследствие переполнения памяти. ## Обработка сигнала SIGINT + Программа обрабатывает сигнал SIGINT, что позволяет давать пользователю выбор действия + при нажатии сочетания клавиш Ctrl+C. ## Авторы + Антипенко Дмитрий Андреевич [C22-712] - https://github.com/ada-dmitry/ Кузнецов Даниил Евгеньевич [C22-712] Никитин Михаил Андреевич [C22-712] Ускова Екатерина Александровна [C22-712] - diff --git a/project/ver1.4/functions.c b/project/ver1.4/functions.c index c325363..92f16f4 100644 --- a/project/ver1.4/functions.c +++ b/project/ver1.4/functions.c @@ -2,7 +2,6 @@ #include #include #include -// #include #include #include @@ -114,6 +113,7 @@ void choose_path() // Функция выбора действия после в sig_flag = 1; char choice; + double tmp; struct termios default_term, modif_term; // Задание структуры, определяющей терминал Linux. @@ -140,6 +140,7 @@ R - начать поиск на другом отрезке: \n"); case 'C': // Выбор вида "Продолжить вычисление". case 'c': sig_flag = 0; + tcsetattr(0, TCSANOW, &default_term); return; // Выход из функции без каких-либо изменений. case 'A': // Выбор вида "Завершить вычисление". @@ -157,6 +158,14 @@ R - начать поиск на другом отрезке: \n"); scanf("%lf%lf", pa, pb); + if (*pa > *pb) // Если пользователь перепутал границы + { + printf("Границы указаны неверно, запуск задачи с исправленным условием\n"); + tmp = *pa; + *pa = *pb; + *pb = tmp; + } + if (f(*pa) * f(*pb) > 0) { printf("\nВ указанных границах нуля функции не существует.\n"); diff --git a/project/ver1.4/out/function_zeros_calculator b/project/ver1.4/out/function_zeros_calculator index 75b4bd6f821653ba299ba538b5a42bc262045c7c..e168668394ba4a29416544b4927186d6c7bd0485 100755 GIT binary patch delta 3873 zcmZu!dr(y86~A}o%45X4s0+*TaK+MKj37pN_(()tS;bhWT8SefQHj>7=xD5IbvuF0 zWV3Fi^QqBHW@;vXbjRvc*rXDh@Q@7nNKzk7LRu$~)WnNK5j2({diy)ycXuHscV_SR zopXNY_nmXT*WHVL`J`X2Ns}x8G^r!<9gD=DcUX*^5%pfAklu?7ERxgZ33IcB{AgP( z)KWD&V(J+8)Pv*e+Kc1<(tjnP+`Q?^C1p>M9@sY`!fZM!u|s25%NLk^oZa==16_Ce z+-r1QKTZBlPivzIt+oV)s(yWEywj(gPas2^7WGiq>t$HGuHjXWpQL3#7CmV+P+sM` zS(2olk}BLyI}_l0*zmnI2w(28I$V;vw*q-#mgM5ls(zVcw;R}&5H?%^c0RC24c4lD z6Nf%yKo5tYdqx0C(LQFF_Jm9~NAk!PgTv{SDxB(;Cg3c<*^m~`NUH%F%1MTE-XPm= zi8GZ9GQTB5-o@H2dGdN@i`_4O&5p(Ho^v6dO416C7T#;qHr@w;#~p!6I;-BNM&iYL z+pzB*(Dg>dC}~^SnmC)Q#?Y@KKd%7!_>&^R%`69V8bwu{&mjD zVX0~0-l1rCxw(vn%FHCH~tj#(dbeS|fLS@{@EpK3PssWBur3X!_UIY6pV)6NF# zz0XP|YpdtWYp|aJw)h0k-XHR86`~om%QcXd8DunZ+A2&GD~gXWEy!jo;}bSz3a~@# zQ&%;MKrBhzK}i-S9$q8WR9lP!fbc;UkDCI$A-WOdeMj9J{d$swsF#7s9Nhq0g__a4 z%hWvw&{M24zG%u8C?V_;ew@4O0LY7OyJLq{v+EvD>m@cNVP-;s0p``3 zjtRxM4hkoE274(Xb!|AeEB(`l=B_&ybI}6@Q0>F?qG+-IJein)espIXukF;|Guy*3IVl(5Y}0TGVwBMDz0H!R^5-|>(-S!1GA zZe;C=6J!7SB+o}-yp55%i@*QfnN%vbGCj#6|C(8npDT{Li@ znj5cI+|T2@P#bttrR7!iXR5EAslKeb-(Y8xQ%9=qgIK++Cpp$N&v`lwefl{kTy(md z)PqgcO=|T#Y%6T}H$V-G&s|C9kmpPTiH-Eq3NcVu3t)(#j3O913L`{(;v{^lkH?&7 z#JmimIApru>-tIRUg45r(D30(N$0iPn#u?4poX89PYnlY9HcbEigiShHHdBmEvFX> zQA&#u$49-y=TZ(CSgdOI21?Rv@e;XL`Mt0NPoteeQ!!Mgi^Yh!Lsd1YAZCsnrkh0 z*;;#=YyU7E*qkv`CF4f=?`=N9DxuR3KolcP!fDg30^U4^!?oQoVeU7840p31FBq>G z##KavYdKwDH$(ix`?TEhRJSV}!3yb@s(Sz@s}S;4_sx({uDUxz!gketB_ym>-K`~Y&v>${ani(HF;pU)AO~n>RYpC&!Bor*$+5< zQ=}u8O_a;f>YXhz6|47e@E2vO#I0GwY$=m*WiLoc9`z|KV$YAd%_>vuuFfgO^?1oB zJ72fs0K=Nv45QQMXllTYr#aC^L9hPZ(KI`1XAEN413Okm6RoW76gd3GaB%vfOL;&; zxAO!+Y5O6it4(|NR*2IA&S?N(8z=)NUX@ScY|Ms9iHkx-u-q8&qgb%IYh z4IpAgR!*Pggp0dH*YV_sf_;ILDqG2lw6EW!X;f;4m*@_3+GyZBXAt#4AS*m(niuqp zZM;Er#Wr?;pmDU|+eLi15uU)eA7PQFqaI1*(0Dj}g9vY#20Z}ZS4t$*;xafUw zp-JZ3e=?QwMQG?VVLPUxLR~?3wNgQ2`;Q~BHv)#Pu}K-g8ulB4!rfFAO;VGr6S}Hg-#0#g?t3tjUNh`MmAmD{7`5InI!$_ zo9;fW=UR|T@&NW>O{{h!z6k34EA3J&HA%%ym;wnwT}~w}F$>a^%2<>9sPeo3@(u zWPReI{~9WOo$aDz_J8YoC*-MU`_ZoXkFFm@yYQ;6n{ix4eWB}9(Jn+=gtoR**DKME z|5DfK<7w|#;6Z!rnyz0(JL?-=A4FSqL)Q~=?fet%Y_vZ^*d->373QSM^=w;CoXOtK zUd{P=an9!$2m=Nmd@M*i@S6%f4IF$D(b{Zh58kcpMDF;MYy|71i#WvbbXbt%Fu2P!b}KhF$_fPK z=G9pG%vj}L=zb7bIJ3jVnxgzHZBCBt50uZz4l~u~ve)w#$aC43c|CFqyELy%_Os0V z40#bN&yO?RNMJAKe;V~We4x_f3}Y+jzieuVXJ5@vm&;g;V}*Q;ZFFR3_Qnas7STwb zp>Sg)v*f`sKo8Fw?Nvj+j$Lx}$SP}IP$qlWgo3e_7|ABhE#hD)LNwAhf%1ZZ5rK_` z&&yaGBLf!~caD(5S#429q(4<){H&{}0P$xQXT<#I-znQxoH6DszR2kbws++~UGYO% bwzJx$*^z4sgtdqDLi$CakZf$*lJWlsEh~;f delta 4127 zcmZu!3s6+o8NPS%3R2d)fD0?2t|A6Sc_;$fYKpkBF}8}2QBwhlNHC$AS~VsUSsUEw z21qc+SRb8FfFphtcbAqLgP%kn{}4S2qra>8G)jwO#3g z&Lsl99*bYlu0#aC+c4^O^T~i)speMece?@;7al=L0Rd(nRaJu$qJ49zr8P__iY zmR5OM!(#n3w+6G!ZcL|xP-2zWx?$(!cB~OfGK`^X*L=GklS#&C-Gj$ujxk02glsZq zi$TO?{79@I)~L5@)!4zV<5~#g_gF*wH@0APA!sQl8w7DJG@a&jVvbE%b&%oGZVbL9?TNw?RdfBO06p*8-#Ghf4$yoS@+s>Y z?bKw*=oD?#i-40zZERj~_Y@W&1d8wY6!Dg|LG0k7UdA;LP_Rq0g2h2hpDWltETG`~ zeXQVek{@Rh^U0>T_^6k-x0J@laG_@bc+$yVVem6@HZFeg?a3@3sf&%_0xxd-ea7@H z2WfHbeCpp4|HZ-aZHfKBv_k2Q*hO9(ksnlj;2P(p}v#H)FY_n@kl zS|V8T%C%l5c4=Y<6)UAT(>SU?RN~>W!@dqwatj+OlCwU6|PAuSQ zb!chH5cze}Kz)6MooJzayt+D=l%TLqjfNtMiPBUW52dnz`{=-K&WC|UpD`opU1p>m z^-EX;>{9zO+Q3SwG!SbgVP@0R&$ZNEy~`T-SQ8gPYr3puj=cYdKrwio+_^|F1bUsxsE z=lX?T$@Uq3;kU9q6~a%h*k5?IoymegPttQ&zj%kVj*fcmFi`qFPe$t1mvu{y3=D{dMbTb`g3S2YLP9p!-Efxa0@*q9`-gJg{vX*&ym zpTuXF1+c6vwpQ{tlhtAAPjjQwUr*9rbLRu82g47$t`MNL+Tw1ROcw$zfA#~8&=HIK z7oi)&QO-KxCGu@I_L^HX%Ft0i zudF$NR(OuK8SaSOIMJUfKBs7|iwAfkDB)O6DAmCd$+9GkpE5Un9V>ny*HT6*6;Tva z7jMxGAbk+nqN~s;0_+?oko9(0mN*QU?YO)GEv6y#dfQ|H!*FdUuc3sM(qxX) zIxQ{~F@eUblw!Hs_hm4QixwAc2jC}3)Ji+%zroR>?zI4VIACKR4azKrEVtBRh0d`I z(y-pwU<3DRDOgLT>n5vh^H5%@2O>ZHQ}8*11Ig!MEEj%vSa^OdT&Fzf z@#VJ{-!km(_(IRjl}mt7;a4CNgdcr~-2!^o=WXF^XHcySG!Bg+u>T!9FdX9TqJdI}0m!5hk8@*e-J3Nh0x~Q@hHZ2|}e(OEW zo@Q_5L^F(9VBA1;-uKL&CNqrdy?^k&$83*!ny4*YJuPN$1-x23$GqF21Eu%FtExRR`g{)O}r5$6}mxLse&E%*R-) z69x+nm~16&nJ>hoBGfp95@rX}jD)dx((&x+AiAt^dG*MU=_!Uk96DhGo?7Tr5y|%# zhY79f5a{9&Nw5qxysyjA4-Sgag$0KQ6tANXc{^(qKAiXBHAd4T=6E{DP_h6{K%aJ=IN@YfhD;G0{x0Q@fS zC4o5RG`~Jz6BO0?*|bg_Nt}@-x|~HbG6(5aPAB`a=ZJ37oqb#UGx5$U6kQ}OCq=9y zMLE&Bd2!^OoPULO;OV(I2(-zSL@VAx^LI?U3 zfqmeJc%_$Un$mrZiBelLYnp?99F}+LDa-+pQ=S#Vdg7m94 ztS@_~u(W7xaoOti&RH*)iq86ZmxDwj*|{KPh%14+y2!Z&xu_>RFD3j(|C^J%yp)Iq nS=`b$4%0b5&U+?`S!Cy;%psd|Ir@}%A#Hq_OEDzx*Q5Ri-fa-& diff --git a/test/ver1.5/additional_finc.c b/test/ver1.5/additional_finc.c new file mode 100644 index 0000000..d0caec6 --- /dev/null +++ b/test/ver1.5/additional_finc.c @@ -0,0 +1,48 @@ +/* + * $gcc -Wall main.c -o main -ldl + * $./main sin\(x\) 1.62 + * 0.998790 + * $./main sin\(x\)*exp\(x\) 1.62 + * 5.046975 + */ + +#include +#include +#include + +#define BEGIN "#include \ndouble func(double x){\nreturn " +#define END ";\n}\n" +#define MAKELIB "gcc -c -Wall func.c -o func.o && gcc -L. -shared func.o -o libfunc.so -lm" + +int main(int argc, char *argv[]) +{ + void *handle; + double (*fun)(double); + char *error; + FILE *f; + + f = fopen("func.c", "w"); + fprintf(f, "%s%s%s", BEGIN, argv[1], END); + fclose(f); + system(MAKELIB); + + handle = dlopen("./libfunc.so", RTLD_LAZY); + if (!handle) + { + fprintf(stderr, "%s\n", dlerror()); + exit(EXIT_FAILURE); + } + dlerror(); + + fun = (double (*)(double))dlsym(handle, "func"); + + error = dlerror(); + if (error != NULL) + { + fprintf(stderr, "%s\n", error); + exit(EXIT_FAILURE); + } + printf("%f\n", (*fun)(atof(argv[2]))); + dlclose(handle); + exit(EXIT_SUCCESS); +} \ No newline at end of file diff --git a/test/ver1.5/functions.c b/test/ver1.5/functions.c index 5f8093c..9ae429f 100644 --- a/test/ver1.5/functions.c +++ b/test/ver1.5/functions.c @@ -22,25 +22,37 @@ void show_grapgh() new_term.c_lflag &= ~(ECHO | ICANON); tcsetattr(STDIN_FILENO, TCSANOW, &new_term); - char func[100] = "x - x * x + 1349"; + // char *gnuplotCommand = "gnuplot -persist -e \"plot sin(x)\" pause -1"; + // system(gnuplotCommand); // Подключение GNU Plot - FILE *gp = popen("gnuplot -persist", "w"); + // FILE *gp = system("gnuplot -persist"); + + // if (gp == NULL) + // { + // printf("GNUerror\n"); + // exit(3); + // } + // fprintf(gp, "set xrange [-500:500]\n"); + // fprintf(gp, "set yrange [0:500]\n"); + // fprintf(gp, "plot %s, 0\n", func); + // fflush(gp); // очищение буфера вывода + + printf("set terminal wxt enhanced\n"); + printf("plot sin(x)\n"); + printf("pause mouse keypress\n"); + + // system("echo 'set term x11' | gnuplot -persist"); + // system("set xrange [-500:500]\n set yrange [0:500]\n echo 'plot x - x * x + 1349'\n gnuplot -persist"); + // system("exit\n"); + // system("set yrange [0:500]\n | gnuplot -persist"); + // system("echo 'plot x - x * x + 1349' | gnuplot -persist"); - if (gp == NULL) - { - printf("GNUerror\n"); - exit(3); - } - fprintf(gp, "set xrange [-500:500]\n"); - fprintf(gp, "set yrange [0:500]\n"); - fprintf(gp, "plot %s, 0\n", func); - fflush(gp); // очищение буфера вывода sig_flag = 1; printf("Нажмите любую клавишу, чтобы продолжить...\n"); getchar(); sig_flag = 0; - fprintf(gp, "exit\n"); + // fprintf(gp, "exit\n"); tcsetattr(STDIN_FILENO, TCSANOW, &old_term); return; } diff --git a/test/ver1.5/main.c b/test/ver1.5/main.c index dfbd1dd..83601a4 100644 --- a/test/ver1.5/main.c +++ b/test/ver1.5/main.c @@ -18,6 +18,10 @@ int main() pb = &b; px = &x; + printf("set terminal wxt enhanced\n"); + printf("plot sin(x)\n"); + printf("pause mouse keypress\n"); + struct sigaction sig_int, sig_tstp; // Инициализация структуры, отвечающей за обработку сигнала. // Замена стандартного алгоритма на необходимый для вызова меню действий. sig_int.sa_handler = ctrlc_handler; @@ -38,7 +42,7 @@ int main() return 1; } - show_grapgh(); + // show_grapgh(); input_diap(); if (*mth == 0) diff --git a/test/ver1.5/out/function_zeros_calculator b/test/ver1.5/out/function_zeros_calculator index 2b1fd113d01fac139c9165163f823a7d4f616fa9..19e7f6b70c9867aaa9d5945c4c06ef6c3191108c 100755 GIT binary patch delta 6118 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 D&TA%{ delta 6915 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 diff --git a/test/ver1.6/Makefile b/test/ver1.6/Makefile new file mode 100644 index 0000000..e83b3af --- /dev/null +++ b/test/ver1.6/Makefile @@ -0,0 +1,25 @@ +# Это комментарий, который говорит, что переменная CC указывает компилятор, используемый для сборки +CC= gcc +#Это еще один комментарий. Он поясняет, что в переменной CFLAGS лежат флаги, которые передаются компилятору +CFLAGS= -c -Wall + +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 + + +build: general clean + +run: + ./out/function_zeros_calculator \ No newline at end of file diff --git a/test/ver1.6/README b/test/ver1.6/README new file mode 100644 index 0000000..344d4d1 --- /dev/null +++ b/test/ver1.6/README @@ -0,0 +1,35 @@ +# Function Zeros Calculator + +## Описание +Эта программа предназначена для вычисления нулей функции на языке C в среде Linux. + +## Установка +1. Склонируйте репозиторий: git clone https://github.com/ada-dmitry/tmp_project.git +2. Перейдите в каталог проекта: cd /Project_1.2 + +## Использование +0. Для нормальной работы программы необходимо установить программу GNU PLot + (sudo apt install gnuplot) +1. Соберите программу: make +2. Запустите программу: ./out/function_zeros_calculator +3. Введите необходимые параметры для вычисления нуля функции: a - ЛЕВАЯ граница отрезка + b - ПРАВАЯ граница отрезка, eps > 0 - точность вычисления корня(до 10^-6). + +## Замечания +1. Для корректной работы программы, необходимо вводить отрезок, на котором есть лишь один корень + (это можно проверить благодаря графику). +2. После вызова меню выбора действий (Ctrl+C) можно использовать как верхний регистр, так и нижний. +3. Не рекомендуется бесконечно вызывать Ctrl+C без выбора действия, это может повлечь ошибки + вследствие переполнения памяти. + + +## Обработка сигнала SIGINT + Программа обрабатывает сигнал SIGINT, что позволяет давать пользователю выбор действия +при нажатии сочетания клавиш Ctrl+C. + +## Авторы +Антипенко Дмитрий Андреевич [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 new file mode 100644 index 0000000..bbd4d80 --- /dev/null +++ b/test/ver1.6/declare.h @@ -0,0 +1,23 @@ +extern double a, b, eps, x, *pa, *pb, *px; +extern short method, *mth, sig_flag; +extern struct termios default_term, modif_term; + +// Декларирование глобальных переменных, +// как внешних для последующего использования их во всей программе. +#define H 0.000001 +#define A -10000 +#define B 10000 +#define EPS 0.001 + +double f(double x); +void ctrlc_handler(int signum); +void ctrlz_handler(int signum); +void choose_path(); +void fork_method(); +void chord_method(); +void newton_method(); +double numerical_derivative(double x); +void __exit(); +void show_grapgh(); +void input_diap(); +void change_diap(); \ No newline at end of file diff --git a/test/ver1.6/functions.c b/test/ver1.6/functions.c new file mode 100644 index 0000000..e29fe53 --- /dev/null +++ b/test/ver1.6/functions.c @@ -0,0 +1,303 @@ +#include +#include +#include +#include +#include +#include + +#include "declare.h" + +double f(double x) // Функция, заданная пользователем, для которой происходит поиск корней. +{ + return x + 20; +} + +void show_grapgh() +{ + char func[100] = "x+20"; + tcsetattr(0, TCSANOW, &modif_term); + // Подключение GNU Plot + FILE *gp = popen("gnuplot -persist", "w"); + + if (gp == NULL) + { + printf("GNUerror\n"); + exit(3); + } + fprintf(gp, "set xrange [-5000:5000]\n"); + fprintf(gp, "set yrange [-5000:5000]\n"); + fprintf(gp, "set grid\n"); + fprintf(gp, "plot %s\n", func); + fflush(gp); // очищение буфера вывода + sig_flag = 1; + printf("Вернитесь в терминал и нажмите Enter, чтобы продолжить...\n"); + getchar(); + sig_flag = 0; + fprintf(gp, "exit\n"); + tcsetattr(0, TCSANOW, &default_term); + return; +} + +// Приближенное вычисление производной по методу конечных разностей +double numerical_derivative(double x) +{ + return (f(x + H) - f(x)) / H; +} + +void newton_method() +{ + *pb = *pa; + do + { + printf("%lf %lf\n", *pa, *pb); + *pa = *pb; + *pb = *pa - f(*pa) / numerical_derivative(*pa); + // Используем численно вычисленную производную + *px = *pb; + sleep(1); + } while (fabs(*pb - *pa) > eps && f(x) != 0); + return; +} + +void chord_method() +{ + *px = *pa; + while ((*pb - *pa) > eps && f(x) != 0) + { + // Находим точку пересечения хорды с осью x + *px = (*pa * f(*pb) - *pb * f(*pa)) / (f(*pb) - f(*pa)); + printf("%lf %lf\n", *pa, *pb); + // Проверяем знаки функции в точках a и x + if (f(*px) == 0) + break; + else if (f(*px) * f(*pa) < 0) + *pb = *px; + else + *pa = *px; + sleep(1); + } + return; +} + +void fork_method() // Функция поиска корней, использующая метод вилки. +{ + do + { + *px = (*pa + *pb) / 2; // метод деления отрезка пополам + + // Печать границ для отладки и для отслеживания хода вычислений + printf("%lf %lf\n", *pa, *pb); + + // Проверка, какой из отрезков [a, x] или [x, b] подходит под условие существования корня, + // т.е. различие знаков на границе. + + 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() // Функция выбора действия после вызова сигнала. +{ + sig_flag = 1; + char choice; + tcsetattr(0, TCSANOW, &modif_term); + + printf("\nПродолжить поиск корня?\n"); + printf("\nC - продолжить, A - закончить работу программы, \ +R - начать поиск на другом отрезке: \n"); + + do + { + // Очистка стандартного потока ввода от "лишних" + __fpurge(stdin); + choice = getchar(); + // scanf("%c", &choice); // Запись буквы, введенной пользователем в переменную choice. + switch (choice) + { + case 'C': // Выбор вида "Продолжить вычисление". + case 'c': + sig_flag = 0; + system("clear"); + return; // Выход из функции без каких-либо изменений. + + case 'A': // Выбор вида "Завершить вычисление". + case 'a': + printf("\nКорень уравнения: %lf\n", *px); + printf("Работа программы завершена.\n"); + __exit(); // Принудительное завершение программы с выводом текущего приближения корня. + + case 'R': // Выбор вида "Продолжить вычисления с новым отрезком". + case 'r': + change_diap(); + return; + + default: + system("clear"); + printf("Ошибка ввода, повторная попытка...\n"); + __fpurge(stdin); + } + } while (choice != 'A' || choice != 'R' || choice != 'C' || choice != 'a' || choice != 'r' || choice != 'c' || choice != 'M' || choice != 'm'); + + // Применение новых настроек терминала + tcsetattr(0, TCSANOW, &default_term); + + sig_flag = 0; +} + +void ctrlc_handler(int signum) // Функция, заменяющая стандартный алгоритм для сигнала SIGINT. +{ + if (sig_flag == 0) + { + system("clear"); + printf("\nТекущее приближение: %lf\n", *px); + choose_path(); + } + return; +} + +void ctrlz_handler(int signum) +{ + printf("Аварийное завершение программы, возврат к настройкам по умолчанию..."); + __exit(); +} + +void __exit() +{ + tcsetattr(0, TCSANOW, &default_term); // Применение новых настроек терминала + exit(1); +} + +void input_diap() +{ + double tmp; + char input[50]; + sig_flag = 1; + + system("clear"); + printf("\n\nТекущие значения: [%lf : %lf] eps = %lf\n\n\ +Введите левую границу отрезка и нажмите Enter (по умолчанию: %lf): ", + *pa, *pb, eps, *pa); + fgets(input, sizeof(input), stdin); + + if (input[0] == '\n') + { + *pa = A; // значение по умолчанию + } + else + { + sscanf(input, "%lf", pa); + } + + system("clear"); + printf("\n\nТекущие значения: [%lf : %lf] eps = %lf\n\n\ +Введите правую границу отрезка и нажмите Enter (по умолчанию: %lf): ", + *pa, *pb, eps, *pb); + fgets(input, sizeof(input), stdin); + + if (input[0] == '\n') + { + *pb = B; // значение по умолчанию + } + else + { + sscanf(input, "%lf", pb); + } + + system("clear"); + printf("\n\nТекущие значения: [%lf : %lf] eps = %lf\n\n\ +Введите точность вычисления и нажмите Enter (по умолчанию: %lf): ", + *pa, *pb, eps, eps); + fgets(input, sizeof(input), stdin); + + if (input[0] == '\n') + { + eps = EPS; // значение по умолчанию + } + else + { + sscanf(input, "%lf", &eps); + } + system("clear"); + __fpurge(stdin); + printf("\nВыберите метод вычисления корня и нажмите Enter:\ + 0 - метод вилки, 1 - метод хорд, 2 - метод касательных\n(По умолчанию: 0): "); + *mth = getchar(); + + if (*pa > *pb) // Если пользователь перепутал границы + { + printf("Границы указаны неверно, запуск задачи с исправленным условием\n"); + tmp = *pa; + *pa = *pb; + *pb = tmp; + } + + if (f(*pa) * f(*pb) > 0) + { + sig_flag = 0; + printf("В указанных границах нуля функции не существует.\n"); + printf("Поменяйте границы\n"); + // choose_path(); + change_diap(); + } + if (eps < 0) // Если пользователь указал отрицательную точность + { + eps = eps * (-1); + printf("Точность отрицательна, условие приведено в порядок, запуск решения...\n"); + } + + if (*pa == *pb) + { + if (f(*pa) == 0) + { + printf("\nКорень уравнения: %lf\n", *pa); + printf("Работа программы завершена.\n"); + __exit(); + } + else + { + printf("Нажмите Ctrl+C и поменяйте границы\n"); + } + } + sig_flag = 0; + return; +} + +void change_diap() +{ + // Возврат к обычному выводу + tcsetattr(0, TCSANOW, &default_term); + + printf("Введите новые значения границ a и b: "); + + scanf("%lf%lf", pa, pb); + + if (f(*pa) * f(*pb) > 0) + { + printf("\nВ указанных границах нуля функции не существует.\n"); + printf("Поменяйте границы\n"); + choose_path(); + // change_diap(); + } + if (*pa == *pb) + { + if (f(*pa) == 0) + { + printf("\nКорень уравнения: %lf\n", *pa); + printf("Работа программы завершена.\n"); + __exit(); + } + else + { + printf("Нажмите Ctrl+C и поменяйте границы\n"); + } + } + + sig_flag = 0; + return; +} \ No newline at end of file diff --git a/test/ver1.6/main.c b/test/ver1.6/main.c new file mode 100644 index 0000000..1c4ac1f --- /dev/null +++ b/test/ver1.6/main.c @@ -0,0 +1,81 @@ +#include +#include +#include +#include +#include +#include + +#include "declare.h" + +double a, b, eps, x, *pa, *pb, *px; +short method, *mth, sig_flag; +struct termios default_term, modif_term; // Задание структур, определяющих терминал Linux. + +int main() +{ + tcgetattr(0, &default_term); // Получение текущих настроек терминала + modif_term = default_term; + modif_term.c_lflag &= ~(ECHO | ICANON); // Отключение символа ECHO и канонического ввода + + sig_flag = 0; + method = 0; + mth = &method; + a = A; + b = B; + eps = EPS; + pa = &a; + pb = &b; + px = &x; + + struct sigaction sig_int, sig_tstp; // Инициализация структуры, отвечающей за обработку сигнала. + // Замена стандартного алгоритма на необходимый для вызова меню действий. + sig_int.sa_handler = ctrlc_handler; + sig_int.sa_flags = 0; // Очистка флагов "на всякий случай". + sigemptyset(&sig_int.sa_mask); // Очистка маски "на всякий случай". + sig_tstp.sa_handler = ctrlz_handler; + sig_tstp.sa_flags = 0; + sigemptyset(&sig_tstp.sa_mask); + + if (sigaction(SIGINT, &sig_int, NULL) == -1) // Обработчик ошибок и инициализация сигнала SIGINT. + { + perror("sigaction"); + return 1; + } + if (sigaction(SIGTSTP, &sig_tstp, NULL) == -1) // Обработчик ошибок и инициализация сигнала SIGTSTP. + { + perror("sigaction"); + return 1; + } + + show_grapgh(); + input_diap(); + + system("clear"); + if (*mth == 0) + { + printf("Fork\n"); + fork_method(); + } + else if (*mth == 1) + { + printf("Chord\n"); + chord_method(); + } + else if (*mth == 2) + { + printf("Newton\n"); + newton_method(); + } + else + { + printf("Fork\n"); + fork_method(); + } + + printf("\nКорень уравнения: %lf\n", *px); + printf("Работа программы завершена.\n"); + + return 0; +} + +// MEEEEEEEOW \ No newline at end of file diff --git a/test/ver1.6/out/app b/test/ver1.6/out/app new file mode 100755 index 0000000000000000000000000000000000000000..84ae7f9ac6032969c4468428afef4ab6f0f4af5a GIT binary patch literal 21552 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 literal 0 HcmV?d00001 diff --git a/test/ver1.6/out/function_zeros_calculator b/test/ver1.6/out/function_zeros_calculator new file mode 100755 index 0000000000000000000000000000000000000000..d7e77cd24c8cf6d5678e065426e7a8c9c4f8bcd1 GIT binary patch literal 21736 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 Mg~S+}f(>Q=2RE=ap8x;= literal 0 HcmV?d00001