From 231e507ef564870e1ea8d9ff98e63e6881032ce3 Mon Sep 17 00:00:00 2001 From: AZEN-SGG Date: Tue, 6 May 2025 00:05:54 +0300 Subject: [PATCH] Task 3 is done --- 2025.05.09/03Ex/Makefile | 42 +++++++++++++++++++++++++++ 2025.05.09/03Ex/init_f.c | 61 ++++++++++++++++++++++++++++++++++++++++ 2025.05.09/03Ex/init_f.h | 13 +++++++++ 2025.05.09/03Ex/main.c | 45 +++++++++++++++++++++++++++++ 2025.05.09/03Ex/solve.c | 14 +++++++++ 2025.05.09/03Ex/solve.h | 9 ++++++ 6 files changed, 184 insertions(+) create mode 100644 2025.05.09/03Ex/Makefile create mode 100644 2025.05.09/03Ex/init_f.c create mode 100644 2025.05.09/03Ex/init_f.h create mode 100644 2025.05.09/03Ex/main.c create mode 100644 2025.05.09/03Ex/solve.c create mode 100644 2025.05.09/03Ex/solve.h diff --git a/2025.05.09/03Ex/Makefile b/2025.05.09/03Ex/Makefile new file mode 100644 index 0000000..4a596c2 --- /dev/null +++ b/2025.05.09/03Ex/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 = a03.$(EXE) +OBJ = main.o solve.o init_f.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/03Ex/init_f.c b/2025.05.09/03Ex/init_f.c new file mode 100644 index 0000000..584d534 --- /dev/null +++ b/2025.05.09/03Ex/init_f.c @@ -0,0 +1,61 @@ +#include "init_f.h" + +#include + + +static int cl = 0; + +int get_call_count (void) +{ + return cl; +} + +double f0 (double x) +{ + cl++; + (void)x; + + return 1; +} + +double f1 (double x) +{ + cl++; + return x + 1; +} + +double f2 (double x) +{ + cl++; + return x * x + x + 1; +} + +double f3 (double x) +{ + double x_2 = x * x; + cl++; + + return x * x_2 + x_2 + x + 1; +} + +double f4 (double x) +{ + double x_2 = x * x; + double x_3 = x_2 * x; + cl++; + + return x * x_3 + x_3 + x_2 + x + 1; +} + +double f5 (double x) +{ + cl++; + return exp(-x); +} + +double f6 (double x) +{ + cl++; + return 1 / (25 * x * x + 1); +} + diff --git a/2025.05.09/03Ex/init_f.h b/2025.05.09/03Ex/init_f.h new file mode 100644 index 0000000..ee5e8e8 --- /dev/null +++ b/2025.05.09/03Ex/init_f.h @@ -0,0 +1,13 @@ +#ifndef INIT_F_H +#define INIT_F_H + +int get_call_count (void); +double f0 (double x); +double f1 (double x); +double f2 (double x); +double f3 (double x); +double f4 (double x); +double f5 (double x); +double f6 (double x); + +#endif diff --git a/2025.05.09/03Ex/main.c b/2025.05.09/03Ex/main.c new file mode 100644 index 0000000..03f49a1 --- /dev/null +++ b/2025.05.09/03Ex/main.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include + +#include "init_f.h" +#include "solve.h" + +/* ./a03.out x h k */ +int main (int argc, char *argv[]) +{ + double t, x, h, d; + int k, cl, task = 3; + + double (*f_lst[]) (double) = {f0, f1, f2, f3, f4, f5, f6}; + int len_f = sizeof(f_lst) / sizeof(f_lst[0]); + + if ( + !((argc == 4) && + sscanf(argv[1], "%lf", &x) == 1 && + ((sscanf(argv[2], "%lf", &h) == 1) && (h > 0)) && + ((sscanf(argv[3], "%d", &k) == 1) && ((0 <= k) && (k <= len_f)))) + ) { + fprintf(stderr, "Usage: %s x h k\n", argv[0]); + return -1; + } + + + t = clock(); + d = t3_solve(f_lst[k], x, h); + t = (clock() - t) / CLOCKS_PER_SEC; + + cl = get_call_count(); + + if (fabs(d - DBL_MAX) < DBL_EPSILON) + { + fprintf (stdout, "%s : Task = %d Method is not applicable Count = %d T = %.2f\n", argv[0], task, cl, t); + return -2; + } else + { + fprintf (stdout, "%s : Task = %d Res = %e Count = %d T = %.2f\n", argv[0], task, d, cl, t); + return 0; + } +} + diff --git a/2025.05.09/03Ex/solve.c b/2025.05.09/03Ex/solve.c new file mode 100644 index 0000000..5270648 --- /dev/null +++ b/2025.05.09/03Ex/solve.c @@ -0,0 +1,14 @@ +#include "solve.h" + +#include +#include + +int t3_solve ( + double (*f) (double), + double x, double h +) { + if (h < DBL_EPSILON) + return DBL_MAX; + return (f(x + h) - 2 * f(x) + f(x - h)) / (h * h); +} + diff --git a/2025.05.09/03Ex/solve.h b/2025.05.09/03Ex/solve.h new file mode 100644 index 0000000..c36855e --- /dev/null +++ b/2025.05.09/03Ex/solve.h @@ -0,0 +1,9 @@ +#ifndef SOLVE_H +#define SOLVE_H + +int t3_solve ( + double (*f) (double), + double x, double h +); + +#endif