From c8f77825528ffd12f280223f27ef631468728faf Mon Sep 17 00:00:00 2001 From: matyushev_mo Date: Wed, 25 Feb 2026 18:09:22 +0300 Subject: [PATCH] initial commit --- .gitignore | 1 + CMakeLists.txt | 18 +++++++ include/LAB1.h | 11 +++++ include/LAB2.h | 8 +++ include/LAB3.h | 24 +++++++++ include/LAB4.h | 8 +++ include/LAB5.h | 8 +++ include/LAB6.h | 30 ++++++++++++ include/shared.h | 11 +++++ src/LAB1.c | 34 +++++++++++++ src/LAB2.c | 39 +++++++++++++++ src/LAB3.c | 99 ++++++++++++++++++++++++++++++++++++++ src/LAB4.c | 66 +++++++++++++++++++++++++ src/LAB5.c | 109 +++++++++++++++++++++++++++++++++++++++++ src/LAB6.c | 123 +++++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 33 +++++++++++++ 16 files changed, 622 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 include/LAB1.h create mode 100644 include/LAB2.h create mode 100644 include/LAB3.h create mode 100644 include/LAB4.h create mode 100644 include/LAB5.h create mode 100644 include/LAB6.h create mode 100644 include/shared.h create mode 100644 src/LAB1.c create mode 100644 src/LAB2.c create mode 100644 src/LAB3.c create mode 100644 src/LAB4.c create mode 100644 src/LAB5.c create mode 100644 src/LAB6.c create mode 100644 src/main.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..0de21cc --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.21) + +project(LAB16 C) + +set(CMAKE_C_STANDARD 23) +set(CMAKE_C_STANDARD_REQUIRED ON) + +add_executable(LAB16 + src/main.c + src/LAB1.c + src/LAB2.c + src/LAB3.c + src/LAB4.c + src/LAB5.c + src/LAB6.c +) + +target_include_directories(LAB16 PRIVATE include) diff --git a/include/LAB1.h b/include/LAB1.h new file mode 100644 index 0000000..69c4a91 --- /dev/null +++ b/include/LAB1.h @@ -0,0 +1,11 @@ +#ifndef LAB1_H +#define LAB1_H + +#include "shared.h" + +double y(double x); +double z(double v, double w); + +void lab_1(); + +#endif diff --git a/include/LAB2.h b/include/LAB2.h new file mode 100644 index 0000000..991c2dd --- /dev/null +++ b/include/LAB2.h @@ -0,0 +1,8 @@ +#ifndef LAB2_H +#define LAB2_H + +#include "shared.h" + +void lab_2(); + +#endif diff --git a/include/LAB3.h b/include/LAB3.h new file mode 100644 index 0000000..cc4ef85 --- /dev/null +++ b/include/LAB3.h @@ -0,0 +1,24 @@ +#ifndef LAB3_H +#define LAB3_H + +#include + +#include "shared.h" + +typedef struct +{ + double x; +} Context; + +typedef double (IterFn)(double, uint32_t); +typedef double (LoopFn)(Context* ctx, uint32_t, uint32_t max, IterFn* iter_fn); + +double iter_fn(double x, uint32_t i); + +double for_fn(Context* ctx, uint32_t min, uint32_t max, IterFn* iter_fn); +double while_fn(Context* ctx, uint32_t min, uint32_t max, IterFn* fiter_fn); +double do_while_fn(Context* ctx, uint32_t min, uint32_t max, IterFn* iter_fn); + +void lab_3(); + +#endif diff --git a/include/LAB4.h b/include/LAB4.h new file mode 100644 index 0000000..60ef6ae --- /dev/null +++ b/include/LAB4.h @@ -0,0 +1,8 @@ +#ifndef LAB4_H +#define LAB4_H + +#include "shared.h" + +void lab_4(); + +#endif diff --git a/include/LAB5.h b/include/LAB5.h new file mode 100644 index 0000000..e2e5377 --- /dev/null +++ b/include/LAB5.h @@ -0,0 +1,8 @@ +#ifndef LAB5_H +#define LAB5_H + +#include "shared.h" + +void lab_5(); + +#endif diff --git a/include/LAB6.h b/include/LAB6.h new file mode 100644 index 0000000..0fcbc18 --- /dev/null +++ b/include/LAB6.h @@ -0,0 +1,30 @@ +#ifndef LAB6_H +#define LAB6_H + +#include +#include + +#include "shared.h" + +typedef struct { + char* name; + int32_t* ptr; + size_t size; +} ArrayI32; + +void read_array(ArrayI32* a); +void print_array(ArrayI32* a); + +void swap_indices(ArrayI32* array, size_t a, size_t b); +void swap_sign(ArrayI32* a); + +size_t positive_count(ArrayI32* a); + +size_t min_element_index(ArrayI32* a); +size_t max_element_index(ArrayI32* a); + +ArrayI32 make_an_array(char* name, size_t size); + +void lab_6(); + +#endif diff --git a/include/shared.h b/include/shared.h new file mode 100644 index 0000000..4081cdd --- /dev/null +++ b/include/shared.h @@ -0,0 +1,11 @@ +#ifndef SHARED_H +#define SHARED_H + +#define READ_EXACT(t, out) do { \ + if (scanf((t), &(out)) == 1) break; \ + printf("Incorrect input for " #out ", try again: "); \ + while (getchar() != '\n'); \ + } \ + while (1) \ + +#endif diff --git a/src/LAB1.c b/src/LAB1.c new file mode 100644 index 0000000..4d9275f --- /dev/null +++ b/src/LAB1.c @@ -0,0 +1,34 @@ +#include +#include + +#include "../include/LAB1.h" + +double z(double v, double w) +{ + return (w <= -3 ) ? v + w + 3 + : (w < 2) + ? w + 4.5 + : v - w; +} + +double y(double x) +{ + return (x <= 0) + ? (log10(fabs(x) / 100 - 0.01) + 2 * x) / (2 * x - 2) + : (log10(fabs(x) / 100 - 0.01) + 2 * x) / (x - 1); +} + +void lab_1() +{ + double x = 0.0; + printf("Enter [x]: "); + READ_EXACT("%lf", x); + + printf("y(x=%lf) = %lf\n", x, y(x)); + + double v = x, w = 0.0; + printf("V = %lf\nEnter [W]: ", v); + READ_EXACT("%lf", w); + + printf("Z(V=%lf,W=%lf) = %lf\n", v, w, z(v, w)); +} diff --git a/src/LAB2.c b/src/LAB2.c new file mode 100644 index 0000000..0663998 --- /dev/null +++ b/src/LAB2.c @@ -0,0 +1,39 @@ +#include +#include + +#include "../include/LAB2.h" +#include "../include/LAB1.h" + +void lab_2() +{ + double v = 0.0, w_min = 0.0, w_max = 0.0; + uint32_t d = 0; + + printf("Enter [V]: "); + READ_EXACT("%lf", v); + + printf("Enter [W_min]: "); + READ_EXACT("%lf", w_min); + + printf("Enter [W_max]: "); + READ_EXACT("%lf", w_max); + + printf("Enter [d]: "); + READ_EXACT("%d", d); + + printf("Z(V=%lf, W=[%lf; %lf]): [ ", v, w_min, w_max); + + for (uint32_t i = 0; i < d; ++i) + { + double w = w_min + (w_max - w_min) * ((double)i / (d - 1)); + + if (i > 0) + { + printf(", "); + } + + printf("%lf", z(v, w)); + } + + printf(" ]\n"); +} diff --git a/src/LAB3.c b/src/LAB3.c new file mode 100644 index 0000000..7d05bc7 --- /dev/null +++ b/src/LAB3.c @@ -0,0 +1,99 @@ +#include +#include + +#include "../include/LAB3.h" + +double iter_fn(double x, uint32_t i) +{ + return tan(fabs(x)) * sqrt(i); +} + +double for_fn(Context* ctx, uint32_t min, uint32_t max, IterFn *iter_fn) +{ + double r = 0.0; + + for (uint32_t i = min; i <= max; ++i) + { + r += iter_fn(ctx->x, i); + } + + return r; +} + +double while_fn(Context* ctx, uint32_t min, uint32_t max, IterFn *iter_fn) +{ + double r = 0.0; + + uint32_t i = min; + while (i <= max) + { + r += iter_fn(ctx->x, i); + ++i; + } + + return r; +} + +double do_while_fn(Context* ctx, uint32_t min, uint32_t max, IterFn *iter_fn) +{ + double r = 0.0; + + uint32_t i = min; + do + { + r += iter_fn(ctx->x, i); + ++i; + } + while (i <= max); + + return r; +} + +void lab_3() +{ + Context ctx = { .x = 0 }; + uint32_t n = 0; + + printf("Enter [x]: "); + READ_EXACT("%lf", ctx.x); + + printf("Enter [N]: "); + READ_EXACT("%u", n); + + LoopFn* loop_fn; + + while (1) + { + printf("Select option:\n\t(f|F|1): for\n\t(w|W|2): while\n\t(d|D|3): do-while\n\t(e|E|4): exit\nOption: "); + + uint8_t opt; + READ_EXACT(" %c", opt); + + switch (opt) + { + case 'f': + case 'F': + case '1': + loop_fn = for_fn; + break; + case 'w': + case 'W': + case '2': + loop_fn = while_fn; + break; + case 'd': + case 'D': + case '3': + loop_fn = do_while_fn; + break; + case 'e': + case 'E': + case '4': + return; + default: + continue; + } + + printf("y(x=%lf,N=%u) = %lf\n", ctx.x, n, tan(fabs(ctx.x)) * loop_fn(&ctx, 1, n, iter_fn)); + } +} diff --git a/src/LAB4.c b/src/LAB4.c new file mode 100644 index 0000000..4354aeb --- /dev/null +++ b/src/LAB4.c @@ -0,0 +1,66 @@ +#include +#include +#include +#include + +#include "../include/LAB4.h" + +#define MAX_SIZE 15 + +void lab_4() +{ + size_t size; + do + { + printf("Enter array size (1..=15): "); + READ_EXACT("%zu", size); + + if (size == 0) + { + printf("Size cannot be zero, try again\n"); + continue; + } + else if (size > MAX_SIZE) + { + printf("Size cannot be greater than %d, try again\n", MAX_SIZE); + continue; + } + + break; + } + while (1); + + int32_t* array = malloc(size * sizeof(int32_t)); + if (array == NULL) + { + printf("Allocation failure"); + return; + } + + for (size_t i = 0; i < size; ++i) + { + printf("Enter array[%zu]: ", i); + READ_EXACT("%d", array[i]); + } + + uint8_t r = 0; + + printf("Array = [ "); + for (size_t i = 0; i < size; ++i) + { + if (array[i] < 0 && abs(array[i]) > 10) + { + r += 1; + } + + if (i > 0) + { + printf(", "); + } + + printf("%d", array[i]); + } + printf(" ]\nCount of |x| > 10: %d\n", r); + + free(array); +} diff --git a/src/LAB5.c b/src/LAB5.c new file mode 100644 index 0000000..d4dc36a --- /dev/null +++ b/src/LAB5.c @@ -0,0 +1,109 @@ +#include +#include +#include + +#include "../include/LAB5.h" + +#define N_MAX 5 +#define M_MAX 5 + +void lab_5() +{ + size_t n = 0, m = 0; + do + { + printf("Enter array size N=(1..=5): "); + READ_EXACT("%zu", n); + + printf("Enter array size M=(1..=5): "); + READ_EXACT("%zu", m); + + if (n == 0) + { + printf("N size cannot be zero, try again\n"); + continue; + } + else if (n > N_MAX) + { + printf("N size cannot be greater than %d, try again\n", N_MAX); + } + + if (m == 0) + { + printf("M size cannot be zero, try again\n"); + continue; + } + else if (m > M_MAX) + { + printf("M size cannot be greater than %d, try again\n", M_MAX); + } + + break; + } + while (1); + + int32_t** array = malloc(n * sizeof(int32_t*)); + if (array == NULL) + { + printf("Allocation failure"); + return; + } + + for (size_t i = 0; i < n; ++i) + { + array[i] = malloc(m * sizeof(int32_t)); + + for (size_t j = 0; j < m; ++j) + { + printf("Enter array[%zu][%zu]: ", i, j); + READ_EXACT("%d", array[i][j]); + } + } + + printf("Array = [\n"); + for (size_t i = 0; i < n; ++i) + { + printf(" [\t"); + + for (size_t j = 0; j < m; ++j) + { + + if (j > 0) + { + printf(",\t"); + } + + printf("%d", array[i][j]); + } + + printf("\t]\n"); + } + printf("]\n"); + + // ==PRODUCT_OF_MAIN_DIAGONAL== + int32_t r = 1; + + size_t d = n < m ? n : m; + for (size_t i = 0; i < d; ++i) + { + r *= array[i][i]; + } + printf("Product of main diagonal = %d\n", r); + + // ==SUM_OF_EVEN_BY_COLUMNS== + printf("Sum of even numbers by columns:\n"); + for (size_t c = 0; c < m; ++c) + { + int32_t res = 0; + + for (size_t r = 0; r < n; ++r) + { + if (array[r][c] % 2 == 0) + { + res += array[r][c]; + } + } + + printf(" Column[%zu] = %d\n", c, res); + } +} diff --git a/src/LAB6.c b/src/LAB6.c new file mode 100644 index 0000000..b64bd86 --- /dev/null +++ b/src/LAB6.c @@ -0,0 +1,123 @@ +#include +#include + +#include "../include/LAB6.h" + +void read_array(ArrayI32* a) +{ + for (size_t i = 0; i < a->size; ++i) + { + printf("Enter %s[%zu]: ", a->name, i); + READ_EXACT("%d", a->ptr[i]); + } +} + +void print_array(ArrayI32* a) +{ + printf("%s = [ ", a->name); + for (size_t i = 0; i < a->size; ++i) + { + if (i > 0) + { + printf(", "); + } + + printf("%d", a->ptr[i]); + } + printf(" ]\n"); +} + +void swap_indices(ArrayI32* array, size_t a, size_t b) +{ + int32_t t = array->ptr[a]; + + array->ptr[a] = array->ptr[b]; + array->ptr[b] = t; +} + +void swap_sign(ArrayI32* a) +{ + for (size_t i = 0; i < a->size; ++i) + { + a->ptr[i] *= -1; + } +} + +size_t positive_count(ArrayI32* a) +{ + size_t r = 0; + + for (size_t i = 0; i < a->size; ++i) + { + if (a->ptr[i] > 0) + { + ++r; + } + } + + return r; +} + +size_t min_element_index(ArrayI32* a) +{ + if (a->size == 0) return 0; + + int32_t r = 0; + + for (size_t i = 1; i < a->size; ++i) + { + if (a->ptr[i] < a->ptr[r]) + { + r = i; + } + } + + return r; +} + +size_t max_element_index(ArrayI32* a) +{ + if (a->size == 0) return 0; + + int32_t r = 0; + + for (size_t i = 1; i < a->size; ++i) + { + if (a->ptr[i] > a->ptr[r]) + { + r = i; + } + } + + return r; +} + +ArrayI32 make_an_array(char* name, size_t size) +{ + ArrayI32 r = {.name = name, .size = size}; + + r.ptr = (void*)malloc(size * sizeof(int32_t)); + read_array(&r); + + return r; +} + +void lab_6() +{ + ArrayI32 array_4 = make_an_array("array_4", 4); + ArrayI32 array_5 = make_an_array("array_5", 5); + ArrayI32 array_6 = make_an_array("array_6", 6); + + swap_sign(&array_4); + swap_sign(&array_5); + swap_sign(&array_6); + + print_array(&array_4); + printf("\tPositive count = %zu\n\n", positive_count(&array_4)); + + print_array(&array_5); + printf("\tPositive count = %zu\n\n", positive_count(&array_5)); + + print_array(&array_6); + printf("\tPositive count = %zu\n", positive_count(&array_6)); +} diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..b57de5e --- /dev/null +++ b/src/main.c @@ -0,0 +1,33 @@ +#include +#include +#include + +#include "../include/LAB1.h" +#include "../include/LAB2.h" +#include "../include/LAB3.h" +#include "../include/LAB4.h" +#include "../include/LAB5.h" +#include "../include/LAB6.h" + +#define LABS_COUNT 6 + +static void(*LABS[LABS_COUNT])() = { lab_1, lab_2, lab_3, lab_4, lab_5, lab_6 }; + +int main(int argc, char** argv) +{ + + printf("Select LAB [1-6]: "); + + uint32_t opt = 0; + READ_EXACT("%d", opt); + + if (opt < 1 || opt > LABS_COUNT) + { + printf("Incorrect index of LAB\n"); + return 1; + } + + LABS[opt - 1](); + + return 0; +}