From 0aed24179b3a6c427e166af331db3ef3705942fe Mon Sep 17 00:00:00 2001 From: ElectronixTM Date: Wed, 22 Oct 2025 15:52:47 +0300 Subject: [PATCH] feat: libraries lab complete --- OSs/lab-libs/Makefile | 22 +++++++++++++++++++++ OSs/lab-libs/lib.c | 45 +++++++++++++++++++++++++++++++++++++++++++ OSs/lab-libs/lib.h | 21 ++++++++++++++++++++ OSs/lab-libs/main.c | 17 ++++++++++++++++ 4 files changed, 105 insertions(+) create mode 100644 OSs/lab-libs/Makefile create mode 100644 OSs/lab-libs/lib.c create mode 100644 OSs/lab-libs/lib.h create mode 100644 OSs/lab-libs/main.c diff --git a/OSs/lab-libs/Makefile b/OSs/lab-libs/Makefile new file mode 100644 index 0000000..3e7c0bc --- /dev/null +++ b/OSs/lab-libs/Makefile @@ -0,0 +1,22 @@ +all: dynamic static + +dynamic: main.o lib.so + gcc $^ -o $@ $(CFLAGS) -lm + +static: main.o lib.a + gcc $^ -o $@ $(CFLAGS) -lm + +lib.so: lib.o + gcc -shared $^ -o $@ $(CFLAGS) + +lib.a: lib.o + ar r $@ $^ + +main.o: main.c + gcc -c $^ -o $@ $(CFLAGS) + +lib.o: lib.c + gcc -c -o $@ -fPIC $^ $(CFLAGS) + +clean: + rm -f dynamic static *.so *.o diff --git a/OSs/lab-libs/lib.c b/OSs/lab-libs/lib.c new file mode 100644 index 0000000..65d2e37 --- /dev/null +++ b/OSs/lab-libs/lib.c @@ -0,0 +1,45 @@ +#include "lib.h" + +#include + +#define ZEROIN_MAX_ITERATIONS 1000 + +size_t fibo(size_t n) +{ + size_t prev = 0, cur = 1, tmp = 0; + for (size_t i = 0; i < n; i++) { + tmp = cur; + cur = cur + prev; + prev = tmp; + } + return cur; +} + +double zeroin(double (*f)(double), double err, double a, double b) +{ + double left = f(a); + if (fabs(left) < err) return left; + double right = f(b); + if (fabs(right) < err) return right; + if (left * right > 0) { + return NAN; + } + + double x = NAN; + double cur = NAN; + size_t n = 0; + do { + x = (a + b) / 2; + cur = f(x); + if (cur * left > 0) { + left = cur; + a = x; + } + else { + right = cur; + b = x; + } + n++; + } while (fabs(cur) > err || n < ZEROIN_MAX_ITERATIONS); + return x; +} diff --git a/OSs/lab-libs/lib.h b/OSs/lab-libs/lib.h new file mode 100644 index 0000000..eebb419 --- /dev/null +++ b/OSs/lab-libs/lib.h @@ -0,0 +1,21 @@ +#ifndef LIB_H_ +#define LIB_H_ + +#include + +/** + * Это будет просто какая-то не очень умная библиотечка с двумя функциями, + * просто чтобы их типа собрать + */ + +/** + * Считает n-ное число фибоначи + */ +size_t fibo(size_t n); + +/** + * Считает ноль функции на интервале с указанной погрешностью + */ +double zeroin(double (*f)(double), double err, double a, double b); + +#endif diff --git a/OSs/lab-libs/main.c b/OSs/lab-libs/main.c new file mode 100644 index 0000000..9e61317 --- /dev/null +++ b/OSs/lab-libs/main.c @@ -0,0 +1,17 @@ +#include +#include +#include "lib.h" + +#define FIBO_NUM 15 + +#define SIN_A 1.6 +#define SIN_B 3.7 +#define ZEROIN_ERR 0.001 + +int main() +{ + printf("fibonachi number under index %u: %zu\n", FIBO_NUM, fibo(FIBO_NUM)); + printf("zero of sin(x) in interval (%lf %lf) is %lf\n", + SIN_A, SIN_B, zeroin(sin, ZEROIN_ERR, SIN_A, SIN_B)); + return 0; +}