From b8e2bbf3c75272451b67dd8629f81d9c4d571603 Mon Sep 17 00:00:00 2001 From: Stepan Pilipenko Date: Fri, 29 Nov 2024 13:04:58 +0300 Subject: [PATCH] comit 1 --- .vscode/c_cpp_properties.json | 18 ++++ .vscode/launch.json | 23 +++++ .vscode/settings.json | 62 +++++++++++++ .vscode/tasks.json | 35 +++++++ my_c/main.c | 13 +++ my_c/my_funcs.c | 170 ++++++++++++++++++++++++++++++++++ my_c/my_funcs.h | 38 ++++++++ 7 files changed, 359 insertions(+) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 my_c/main.c create mode 100644 my_c/my_funcs.c create mode 100644 my_c/my_funcs.h diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..97c1779 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "macos-clang-x64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "/usr/bin/clang", + "cStandard": "${default}", + "cppStandard": "${default}", + "intelliSenseMode": "macos-clang-x64", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..2f56bae --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,23 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "clang++ - Build and debug active file", + "type": "lldb", + "request": "launch", + "program": "${fileDirname}/${fileBasenameNoExtension}", + "args": [ + "-arg1", + "-arg2" + ] + }, + { + "name": "C/C++ Runner: Debug Session", + "type": "lldb", + "request": "launch", + "args": [], + "cwd": "/Users/andreypilipenko/STUDY/code/my_c", + "program": "/Users/andreypilipenko/STUDY/code/my_c/build/Debug/outDebug" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..11cc276 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,62 @@ +{ + "C_Cpp_Runner.cCompilerPath": "clang", + "C_Cpp_Runner.cppCompilerPath": "clang++", + "C_Cpp_Runner.debuggerPath": "lldb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", + "C_Cpp_Runner.msvcBatchPath": "", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, + "C_Cpp_Runner.msvcSecureNoWarnings": false, + "files.associations": { + "my_funcs.h": "c" + } +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..bf48a44 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,35 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: clang сборка активного файла", + "command": "/usr/bin/clang", + "args": [ + "-fcolor-diagnostics", + "-fansi-escape-codes", + "-g", + "${file}", + "-o", + "${fileDirname}/${fileBasenameNoExtension}" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Задача создана отладчиком." + }, + { + "label": "Open Terminal", + "type": "shell", + "command": "osascript -e 'tell application \"Terminal\"\ndo script \"echo hello\"\nend tell'", + "problemMatcher": [] + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/my_c/main.c b/my_c/main.c new file mode 100644 index 0000000..a4ae08a --- /dev/null +++ b/my_c/main.c @@ -0,0 +1,13 @@ +#include +#include +#include + +#include "./my_funcs.h" + +int main(void) +{ + double A[256]; + scan_array(A, 3, "lf"); + print_array(A, 3, "%l"); + return 0; +} diff --git a/my_c/my_funcs.c b/my_c/my_funcs.c new file mode 100644 index 0000000..c04c98b --- /dev/null +++ b/my_c/my_funcs.c @@ -0,0 +1,170 @@ +#include +#include + +#include "my_funcs.h" + +int scan_array(void * p_array, size_t size, char * specifier) +{ + int scan_el_cnt = 0; + + size_t spec_size = strlen(specifier); + if (spec_size == 1) + { + switch (specifier[0]) + { + case 'c': + { + for (unsigned int i = 0; i < size; i++) + { + if (scanf("%c", ((char *) p_array) + i)) + scan_el_cnt++; + } + } break; + case 'd': + { + for (unsigned int i = 0; i < size; i++) + { + if (scanf("%d", ((int *) p_array) + i)) + scan_el_cnt++; + } + } break; + case 'f': + { + for (unsigned int i = 0; i < size; i++) + { + if (scanf("%f", ((float *) p_array) + i)) + scan_el_cnt++; + } + } break; + } + } + else if (spec_size == 2) + { + if (specifier[0] == 'l') + { + switch (specifier[1]) + { + case 'd': + { + for (unsigned int i = 0; i < size; i++) + { + if (scanf("%ld", ((long *) p_array) + i)) + scan_el_cnt++; + } + } break; + case 'f': + { + for (unsigned int i = 0; i < size; i++) + { + if (scanf("%lf", ((double *) p_array) + i)) + scan_el_cnt++; + } + } break; + } + } + } + + return scan_el_cnt; +} + +int print_array(void * p_array, size_t size, char * specifier) +{ + size_t spec_size = strlen(specifier); + if (spec_size > 1 && specifier[0] == '%') + { + switch (specifier[1]) + { + case 'c': + { + char * new_p = p_array; + for (unsigned int i = 0; i < size; i++) + printf(specifier, new_p[i]); + } break; + case 'd': + case 'x': + case 'X': + { + int * new_p = p_array; + for (unsigned int i = 0; i < size; i++) + printf(specifier, new_p[i]); + } break; + case 'f': + { + float * new_p = p_array; + for (unsigned int i = 0; i < size; i++) + printf(specifier, new_p[i]); + } break; + case 'e': + { + double * new_p = p_array; + for (unsigned int i = 0; i < size; i++) + printf(specifier, new_p[i]); + } break; + case 'l': + { + if (spec_size > 2) + { + switch (specifier[2]) + { + case 'd': + case 'x': + case 'X': + { + long * new_p = p_array; + for (unsigned int i = 0; i < size; i++) + printf(specifier, new_p[i]); + } break; + case 'f': + { + double * new_p = p_array; + for (unsigned int i = 0; i < size; i++) + printf(specifier, new_p[i]); + } break; + } + } + } break; + + default: + return 0; + } + } + else + return 0; + + printf("\n"); + return 1; +} + +void print_array_table(void * p_array, size_t size, char * specifier, int colomn) +{ + size_t spec_size = strlen(specifier); + if (spec_size == 1 && specifier[0] == 'e') + { + float * new_p = p_array; + for (unsigned int i = 0; i < size; i++) + { + for (int j = 0; j < colomn; i++) + { + if (i + j + 2 > size) + return; + printf("%5e ", new_p[i]); + } + printf("\n"); + } + } + else if (spec_size == 2 && specifier[0] == 'l' && specifier[1] == 'd') + { + long * new_p = p_array; + for (unsigned int i = 0; i < size; i++) + { + for (int j = 0; j < size / colomn; j++) + { + if (i + j + 1 > size) + return; + printf("%10ld ", *(new_p + i + j)); + } + printf("\n"); + } + } + printf("\n"); +} diff --git a/my_c/my_funcs.h b/my_c/my_funcs.h new file mode 100644 index 0000000..d406763 --- /dev/null +++ b/my_c/my_funcs.h @@ -0,0 +1,38 @@ +#ifndef my_funcs_h +#define my_funcs_h + +/* + Функция ввода массива через enter + void * p_array - указатель на первый элемент массива + size_t size - размер массива + char * specifier - спецификатор + Список спецификаторов: + с - char + d - int + f - float + ld -long + lf - double +*/ +int scan_array(void * p_array, size_t size, char * specifier); + +/* + Функция вывода массива с разделителей + void * p_array - указатель на первый элемент массива + size_t size - размер массива + char * specifier - спецификатор + char * separator - разделитель + Список спецификаторов: + с - char + d - int + f - float + e - экспонентная форма + x - шестнадцатиричная прописными + X - шестнадцатиричная заглавными + ld -long + lf - double +*/ +int print_array(void * p_array, size_t size, char * specifier); + +void print_array_table(void * p_array, size_t size, char * specifier, int colomn); + +#endif