From 17a04e4bee1c36d6f19935828f2f282bd4dc40e8 Mon Sep 17 00:00:00 2001 From: AZEN-SGG Date: Tue, 13 May 2025 20:06:25 +0300 Subject: [PATCH] Start task 9 --- 2025.05.09/09Ex/Makefile | 42 +++++++++++++++++++++++++ 2025.05.09/09Ex/init_f.h | 66 ++++++++++++++++++++++++++++++++++++++++ 2025.05.09/09Ex/main.c | 44 +++++++++++++++++++++++++++ 2025.05.09/09Ex/solve.c | 53 ++++++++++++++++++++++++++++++++ 2025.05.09/09Ex/solve.h | 10 ++++++ 5 files changed, 215 insertions(+) create mode 100644 2025.05.09/09Ex/Makefile create mode 100644 2025.05.09/09Ex/init_f.h create mode 100644 2025.05.09/09Ex/main.c create mode 100644 2025.05.09/09Ex/solve.c create mode 100644 2025.05.09/09Ex/solve.h diff --git a/2025.05.09/09Ex/Makefile b/2025.05.09/09Ex/Makefile new file mode 100644 index 0000000..047192a --- /dev/null +++ b/2025.05.09/09Ex/Makefile @@ -0,0 +1,42 @@ +WFLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused \ +-Wempty-body -Wlogical-op -Wold-style-declaration -Wmissing-parameter-type \ +-Wignored-qualifiers -Winit-self -Wshadow -Wtype-limits \ +-Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 \ +-Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs \ +-Wmissing-prototypes -Wmissing-declarations -Wold-style-definition \ +-Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal \ +-Wwrite-strings -Wno-long-long -std=gnu99 -Wstrict-prototypes \ +-Wmissing-field-initializers -Wpointer-sign + +LDFLAGS = -std=gnu99 -mfpmath=sse -O3 +LDLIBS = -lm + +ifeq ($(OS),Windows_NT) + EXE = exe + CLEAN = del + LDLIBS += -lssp +else + EXE = out + CLEAN = rm -f +endif + +TARGET = a09.$(EXE) +OBJ = main.o solve.o + +%.o: %.c + gcc $(WFLAGS) $(LDFLAGS) -c $< -o $@ + +$(TARGET): $(OBJ) + gcc $^ -o $@ $(LDLIBS) + +# Отладочная сборка (gdb) +gdb: LDFLAGS = -std=gnu99 -mfpmath=sse -g -O0 +gdb: clean $(TARGET) + +# Профилировочная сборка (gprof) +prof: LDFLAGS += -pg +prof: LDLIBS += -pg +prof: clean $(TARGET) + +clean: + $(CLEAN) *.o *.$(EXE) diff --git a/2025.05.09/09Ex/init_f.h b/2025.05.09/09Ex/init_f.h new file mode 100644 index 0000000..98407b5 --- /dev/null +++ b/2025.05.09/09Ex/init_f.h @@ -0,0 +1,66 @@ +#ifndef INIT_F_H +#define INIT_F_H + +#include + +static int cl = 0; + +static inline int get_call_count (void) +{ + return cl; +} + +static inline double f0 (double x) +{ + cl++; + (void)x; + + return 1; +} + +static inline double f1 (double x) +{ + cl++; + return x + 1; +} + +static inline double f2 (double x) +{ + double x_2 = x * x; + cl++; + return x_2 + x + 1; +} + +static inline double f3 (double x) +{ + double x_2 = x * x; + double x_3 = x_2 * x; + cl++; + + return x_3 + x_2 + x + 1; +} + +static inline double f4 (double x) +{ + double x_2 = x * x; + double x_3 = x_2 * x; + double x_4 = x_3 * x; + cl++; + + return x_4 + x_3 + x_2 + x + 1; +} + +static inline double f5 (double x) +{ + cl++; + return exp(-x); +} + +static inline double f6 (double x) +{ + double x_2 = x * x; + cl++; + return 1 / (25 * x_2 + 1); +} + +#endif diff --git a/2025.05.09/09Ex/main.c b/2025.05.09/09Ex/main.c new file mode 100644 index 0000000..d62be4a --- /dev/null +++ b/2025.05.09/09Ex/main.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include + +#include "init_f.h" +#include "solve.h" + +/* ./a09.out a b eps k */ +int main (int argc, char *argv[]) +{ + double t, integral, a, b, eps; + int k, n, calls, task = 9; + + double (*f_lst[]) (double) = {f0, f1, f2, f3, f4, f5, f6}; + int len_f = sizeof(f_lst) / sizeof(f_lst[0]); + + if ( + !((argc == 5) && + sscanf(argv[1], "%lf", &a) == 1 && + sscanf(argv[2], "%lf", &b) == 1 && + ((sscanf(argv[3], "%lf", &eps) == 1) && (eps > 0)) && + ((sscanf(argv[4], "%d", &k) == 1) && ((0 <= k) && (k < len_f)))) + ) { + fprintf(stderr, "Usage: %s a b eps k\n", argv[0]); + return -1; + } + + + t = clock(); + n = t9_solve(f_lst[k], a, b, eps, &integral); + t = (clock() - t) / CLOCKS_PER_SEC; + + calls = get_call_count(); + + if (n < 0) { + fprintf (stdout, "%s : Task = %d Method is not applicable Count = %d T = %.2f\n", argv[0], task, calls, t); + return -2; + } else { + fprintf (stdout, "%s : Task = %d Res = %e N = %d Count = %d T = %.2f\n", argv[0], task, integral, n, calls, t); + return 0; + } +} + diff --git a/2025.05.09/09Ex/solve.c b/2025.05.09/09Ex/solve.c new file mode 100644 index 0000000..3f6d758 --- /dev/null +++ b/2025.05.09/09Ex/solve.c @@ -0,0 +1,53 @@ +#include "solve.h" + +#include +#include + +#define MAX_ITER 30 + +int t9_solve ( + double (*f) (double), + double a, double b, + double eps, double *res +) { + int it; + double integ_n; + + double n = 2; + double h = (b - a) * 0.5; + double s1 = (f(a) + f(b)) * h/3; + double s2 = f(a + h) * h*4/3; + + for (it = 1; it <= MAX_ITER; ++it) + { + double x = a + h*0.5; + double s2_2n = 0; + + for (int i = 1; i < n; i++) + { + s2_2n += f(x); + x += h; + } + + s2_2n *= h*2/3; + + if (fabs(s2_2n - s1 * 0.5 - s2 * 0.75) < eps) { + integ_n = s1 + s2; + break; + } + + s1 = s1 * 0.5 + s2 * 0.25; + s2 = s2_2n; + + h *= 0.5; + n *= 2; + } + + if (it > MAX_ITER) + return -1; + + *res = integ_n; + + return n; +} + diff --git a/2025.05.09/09Ex/solve.h b/2025.05.09/09Ex/solve.h new file mode 100644 index 0000000..d68bcb4 --- /dev/null +++ b/2025.05.09/09Ex/solve.h @@ -0,0 +1,10 @@ +#ifndef SOLVE_H +#define SOLVE_H + +int t9_solve ( + double (*f) (double), + double a, double b, + double eps, double *res +); + +#endif