initial commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
build/
|
||||
18
CMakeLists.txt
Normal file
18
CMakeLists.txt
Normal 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
11
include/LAB1.h
Normal 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
8
include/LAB2.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef LAB2_H
|
||||
#define LAB2_H
|
||||
|
||||
#include "shared.h"
|
||||
|
||||
void lab_2();
|
||||
|
||||
#endif
|
||||
24
include/LAB3.h
Normal file
24
include/LAB3.h
Normal 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
8
include/LAB4.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef LAB4_H
|
||||
#define LAB4_H
|
||||
|
||||
#include "shared.h"
|
||||
|
||||
void lab_4();
|
||||
|
||||
#endif
|
||||
8
include/LAB5.h
Normal file
8
include/LAB5.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef LAB5_H
|
||||
#define LAB5_H
|
||||
|
||||
#include "shared.h"
|
||||
|
||||
void lab_5();
|
||||
|
||||
#endif
|
||||
30
include/LAB6.h
Normal file
30
include/LAB6.h
Normal 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
11
include/shared.h
Normal 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
34
src/LAB1.c
Normal 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
39
src/LAB2.c
Normal 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
99
src/LAB3.c
Normal 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
66
src/LAB4.c
Normal 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
109
src/LAB5.c
Normal 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
123
src/LAB6.c
Normal 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
33
src/main.c
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user