initial commit

This commit is contained in:
2026-02-25 18:09:22 +03:00
commit c8f7782552
16 changed files with 622 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
build/

18
CMakeLists.txt Normal file
View File

@@ -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)

11
include/LAB1.h Normal file
View File

@@ -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

8
include/LAB2.h Normal file
View File

@@ -0,0 +1,8 @@
#ifndef LAB2_H
#define LAB2_H
#include "shared.h"
void lab_2();
#endif

24
include/LAB3.h Normal file
View File

@@ -0,0 +1,24 @@
#ifndef LAB3_H
#define LAB3_H
#include <stdint.h>
#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

8
include/LAB4.h Normal file
View File

@@ -0,0 +1,8 @@
#ifndef LAB4_H
#define LAB4_H
#include "shared.h"
void lab_4();
#endif

8
include/LAB5.h Normal file
View File

@@ -0,0 +1,8 @@
#ifndef LAB5_H
#define LAB5_H
#include "shared.h"
void lab_5();
#endif

30
include/LAB6.h Normal file
View File

@@ -0,0 +1,30 @@
#ifndef LAB6_H
#define LAB6_H
#include <stddef.h>
#include <stdint.h>
#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

11
include/shared.h Normal file
View File

@@ -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

34
src/LAB1.c Normal file
View File

@@ -0,0 +1,34 @@
#include <stdio.h>
#include <math.h>
#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));
}

39
src/LAB2.c Normal file
View File

@@ -0,0 +1,39 @@
#include <stdio.h>
#include <stdint.h>
#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");
}

99
src/LAB3.c Normal file
View File

@@ -0,0 +1,99 @@
#include <stdio.h>
#include <math.h>
#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));
}
}

66
src/LAB4.c Normal file
View File

@@ -0,0 +1,66 @@
#include <stdint.h>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#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);
}

109
src/LAB5.c Normal file
View File

@@ -0,0 +1,109 @@
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#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);
}
}

123
src/LAB6.c Normal file
View File

@@ -0,0 +1,123 @@
#include <stdio.h>
#include <stdlib.h>
#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));
}

33
src/main.c Normal file
View File

@@ -0,0 +1,33 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#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;
}