From 51d37a0dee21ee11a1002db42877d0f5561703b9 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Mon, 1 Dec 2025 19:26:33 +0300 Subject: [PATCH 1/8] Add homework 12-1 --- src/hw_12-1_binary/hw_12-1_binary.c | 177 ++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 src/hw_12-1_binary/hw_12-1_binary.c diff --git a/src/hw_12-1_binary/hw_12-1_binary.c b/src/hw_12-1_binary/hw_12-1_binary.c new file mode 100644 index 0000000..c7d42f9 --- /dev/null +++ b/src/hw_12-1_binary/hw_12-1_binary.c @@ -0,0 +1,177 @@ +#include +#include +#include + +// функция для определения необходимого количества бит (двоичное представление зависит от количества бит) +int calculateRequiredBits(int num1, int num2) +{ + int max_abs = 0; + + // находим максимальное по модулю число из двух + if (abs(num1) > abs(num2)) { + max_abs = abs(num1); + } else { + max_abs = abs(num2); + } + + // вычисляем сумму (для определения возможного переполнения) + long long sum = (long long)num1 + num2; + + // находим максимальное значение из трёх: |num1|, |num2|, |sum| + if (abs(sum) > max_abs) { + max_abs = abs(sum); + } + + // вычисляем необходимое количество бит + int bits_needed = 0; + while ((1LL << bits_needed) <= max_abs * 2LL) { + bits_needed++; + } + + // минимальное количество бит + if (bits_needed < 4) { + bits_needed = 4; + } + + // ограничим максимальное количество бит для нормального вывода + if (bits_needed > 32) { + bits_needed = 32; + } + + return bits_needed; +} + +// функция для перевода десятичного числа в двоичную строку (8-битное представление) +char* decimalToBinary(int num, int bits) +{ + // выделяем память для строки: bits символов + 1 для завершающего нуля + char* binary = (char*)malloc(bits + 1); + if (binary == NULL) { + return NULL; + } + + // заполняем строку нулями + for (int i = 0; i < bits; i++) { + binary[i] = '0'; + } + binary[bits] = '\0'; // завершаем строку + + // обрабатываем отрицательные числа (дополнительный код) + unsigned int unsigned_num; + if (num < 0) { + // для отрицательных чисел используем дополнительный код + unsigned_num = (1 << bits) + num; // 2^bits + num + } else { + unsigned_num = num; + } + + // преобразуем в двоичный вид + for (int i = bits - 1; i >= 0; i--) { + binary[i] = (unsigned_num & 1) ? '1' : '0'; + unsigned_num >>= 1; // сдвигаем вправо для проверки следующего бита + } + + return binary; +} + +// функция для сложения двух двоичных чисел (строк) в столбик +char* addBinaryStrings(const char* bin1, const char* bin2, int bits) +{ + char* result = (char*)malloc(bits + 1); + if (result == NULL) { + return NULL; + } + + int carry = 0; // перенос + // проходим от младшего бита к старшему + for (int i = bits - 1; i >= 0; i--) { + int bit1 = bin1[i] - '0'; + int bit2 = bin2[i] - '0'; + int sum = bit1 + bit2 + carry; + + // текущий бит результата + result[i] = (sum % 2) + '0'; + // вычисляем перенос для следующего бита + carry = sum / 2; + } + + result[bits] = '\0'; // завершаем строку + return result; +} + +// функция для перевода двоичной строки в десятичное число +int binaryToDecimal(const char* binary, int bits) +{ + int result = 0; + + // если число положительное (старший бит = 0) + if (binary[0] == '0') { + for (int i = 0; i < bits; i++) { + result = result * 2 + (binary[i] - '0'); + } + } + // если число отрицательное (старший бит = 1, дополнительный код) + else { + // инвертируем все биты + int inverted = 0; + for (int i = 0; i < bits; i++) { + inverted = inverted * 2 + (binary[i] == '0' ? 1 : 0); + } + // добавляем 1 и берем со знаком минус + result = -(inverted + 1); + } + + return result; +} + +int main() +{ + int num1, num2; + + printf("Введите первое число: "); + scanf("%d", &num1); + printf("Введите второе число: "); + scanf("%d", &num2); + + printf("\n"); + + // автоматически определяем необходимое количество бит + int bits = calculateRequiredBits(num1, num2); + + // перевод чисел в двоичный вид + char* bin1 = decimalToBinary(num1, bits); + char* bin2 = decimalToBinary(num2, bits); + if (bin1 == NULL || bin2 == NULL) { + printf("Ошибка выделения памяти\n"); + return 1; + } + + // вывод двоичных представлений + printf("Первое число в двоичном представлении в дополнительном коде: %s\n", bin1); + printf("Второе число в двоичном представлении в дополнительном коде: %s\n\n", bin2); + + // сложение в двоичном виде + char* binarySum = addBinaryStrings(bin1, bin2, bits); + if (binarySum == NULL) { + printf("Ошибка выделения памяти\n"); + free(bin1); + free(bin2); + return 1; + } + + // вывод суммы в двоичном виде + printf("Сумма в двоичном коде: %s\n", binarySum); + + // перевод суммы в десятичное + int decimalSum = binaryToDecimal(binarySum, bits); + + // вывод суммы в десятичном виде + printf("Сумма в десятичном виде: %d\n", decimalSum); + + // освобождаем память + free(bin1); + free(bin2); + free(binarySum); + + return 0; +} From 08de153b45abce9852c722b119db8e1b4b4c90d4 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Mon, 24 Nov 2025 21:03:26 +0300 Subject: [PATCH 2/8] Add configuration for clang --- .clang-format | 245 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..f00c630 --- /dev/null +++ b/.clang-format @@ -0,0 +1,245 @@ +--- +Language: Cpp +# BasedOnStyle: WebKit +AccessModifierOffset: -4 +AlignAfterOpenBracket: DontAlign +AlignArrayOfStructures: None +AlignConsecutiveAssignments: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveBitFields: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveDeclarations: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveMacros: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveShortCaseStatements: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCaseColons: false +AlignEscapedNewlines: Right +AlignOperands: DontAlign +AlignTrailingComments: + Kind: Never + OverEmptyLines: 0 +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowBreakBeforeNoexceptSpecifier: Never +AllowShortBlocksOnASingleLine: Empty +AllowShortCaseLabelsOnASingleLine: false +AllowShortCompoundRequirementOnASingleLine: true +AllowShortEnumsOnASingleLine: true +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: All +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +AttributeMacros: + - __capability +BinPackArguments: true +BinPackParameters: true +BitFieldColonSpacing: Both +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterExternBlock: false + AfterFunction: true + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakAdjacentStringLiterals: true +BreakAfterAttributes: Leave +BreakAfterJavaFieldAnnotations: false +BreakArrays: true +BreakBeforeBinaryOperators: All +BreakBeforeConceptDeclarations: Always +BreakBeforeBraces: WebKit +BreakBeforeInlineASMColon: OnlyMultiline +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeComma +BreakInheritanceList: BeforeColon +BreakStringLiterals: true +ColumnLimit: 0 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: false +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: false +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '(Test)?$' +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseBlocks: false +IndentCaseLabels: false +IndentExternBlock: AfterExternBlock +IndentGotoLabels: true +IndentPPDirectives: None +IndentRequiresClause: true +IndentWidth: 4 +IndentWrappedFunctionNames: false +InsertBraces: false +InsertNewlineAtEOF: false +InsertTrailingCommas: None +IntegerLiteralSeparator: + Binary: 0 + BinaryMinDigits: 0 + Decimal: 0 + DecimalMinDigits: 0 + Hex: 0 + HexMinDigits: 0 +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +KeepEmptyLinesAtEOF: false +LambdaBodyIndentation: Signature +LineEnding: DeriveLF +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: Inner +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 4 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: true +ObjCSpaceBeforeProtocolList: true +PackConstructorInitializers: BinPack +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakScopeResolution: 500 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyIndentedWhitespace: 0 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Left +PPIndentWidth: -1 +QualifierAlignment: Leave +ReferenceAlignment: Pointer +ReflowComments: true +RemoveBracesLLVM: false +RemoveParentheses: Leave +RemoveSemicolon: false +RequiresClausePosition: OwnLine +RequiresExpressionIndentation: OuterScope +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SkipMacroDefinitionBody: false +SortIncludes: CaseSensitive +SortJavaStaticImport: Before +SortUsingDeclarations: LexicographicNumeric +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceAroundPointerQualifiers: Default +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: true +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeJsonColon: false +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterOverloadedOperator: false + AfterPlacementOperator: true + AfterRequiresInClause: false + AfterRequiresInExpression: false + BeforeNonEmptyParentheses: false +SpaceBeforeRangeBasedForLoopColon: true +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: true +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInContainerLiterals: true +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParens: Never +SpacesInParensOptions: + InCStyleCasts: false + InConditionalStatements: false + InEmptyParentheses: false + Other: false +SpacesInSquareBrackets: false +Standard: Latest +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 8 +UseTab: Never +VerilogBreakBetweenInstancePorts: true +WhitespaceSensitiveMacros: + - BOOST_PP_STRINGIZE + - CF_SWIFT_NAME + - NS_SWIFT_NAME + - PP_STRINGIZE + - STRINGIZE +... From 12abc4ffdae0b92a27fb8eb08f3893e88391c921 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Mon, 24 Nov 2025 21:04:58 +0300 Subject: [PATCH 3/8] Add dependabot.yml --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..58865cf --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: "weekly" From b313a5007726fe734ea7389046d67310e22a7067 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Mon, 24 Nov 2025 21:05:34 +0300 Subject: [PATCH 4/8] Add built-and-lint.yml --- .github/workflows/build-and-lint.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/workflows/build-and-lint.yml diff --git a/.github/workflows/build-and-lint.yml b/.github/workflows/build-and-lint.yml new file mode 100644 index 0000000..a2c12fd --- /dev/null +++ b/.github/workflows/build-and-lint.yml @@ -0,0 +1,14 @@ +name: Build and lint + +on: + - push + - pull_request + +jobs: + build-and-lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - name: Check format + run: | + find . -path ./build -prune -o -type f -name '*.[c|h]' -print | xargs clang-format-18 --style=file --dry-run -Werror From 17e1a4c982f396e5724fca7293e892aab371f93c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 11:28:08 +0000 Subject: [PATCH 5/8] Bump actions/checkout from 5 to 6 Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build-and-lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-lint.yml b/.github/workflows/build-and-lint.yml index a2c12fd..6797f75 100644 --- a/.github/workflows/build-and-lint.yml +++ b/.github/workflows/build-and-lint.yml @@ -8,7 +8,7 @@ jobs: build-and-lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Check format run: | find . -path ./build -prune -o -type f -name '*.[c|h]' -print | xargs clang-format-18 --style=file --dry-run -Werror From f150c5f6cbcff049afec73f91d3227cf62e05803 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Thu, 11 Dec 2025 12:09:35 +0300 Subject: [PATCH 6/8] Fix format in homework --- src/hw_12-1_binary/hw_12-1_binary.c | 43 ++--------------------------- 1 file changed, 2 insertions(+), 41 deletions(-) diff --git a/src/hw_12-1_binary/hw_12-1_binary.c b/src/hw_12-1_binary/hw_12-1_binary.c index c7d42f9..0728d19 100644 --- a/src/hw_12-1_binary/hw_12-1_binary.c +++ b/src/hw_12-1_binary/hw_12-1_binary.c @@ -2,45 +2,6 @@ #include #include -// функция для определения необходимого количества бит (двоичное представление зависит от количества бит) -int calculateRequiredBits(int num1, int num2) -{ - int max_abs = 0; - - // находим максимальное по модулю число из двух - if (abs(num1) > abs(num2)) { - max_abs = abs(num1); - } else { - max_abs = abs(num2); - } - - // вычисляем сумму (для определения возможного переполнения) - long long sum = (long long)num1 + num2; - - // находим максимальное значение из трёх: |num1|, |num2|, |sum| - if (abs(sum) > max_abs) { - max_abs = abs(sum); - } - - // вычисляем необходимое количество бит - int bits_needed = 0; - while ((1LL << bits_needed) <= max_abs * 2LL) { - bits_needed++; - } - - // минимальное количество бит - if (bits_needed < 4) { - bits_needed = 4; - } - - // ограничим максимальное количество бит для нормального вывода - if (bits_needed > 32) { - bits_needed = 32; - } - - return bits_needed; -} - // функция для перевода десятичного числа в двоичную строку (8-битное представление) char* decimalToBinary(int num, int bits) { @@ -135,8 +96,8 @@ int main() printf("\n"); - // автоматически определяем необходимое количество бит - int bits = calculateRequiredBits(num1, num2); + // определяем необходимое количество бит + int bits = 8; // перевод чисел в двоичный вид char* bin1 = decimalToBinary(num1, bits); From 02cb5c33fe359f2924a07d06f58dad31b9ac686b Mon Sep 17 00:00:00 2001 From: ada1ra Date: Fri, 26 Dec 2025 15:05:45 +0300 Subject: [PATCH 7/8] Add cmake for hw12-1 --- CMakeLists.txt | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..97e28ea --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.10) +project(MultiProject) + +# переменная для управления подпроектами +set(SUBPROJECTS src/hw_12-1_binary) + +# Добавляем все подпроекты +foreach(subproject ${SUBPROJECTS}) + add_subdirectory(${subproject}) +endforeach() + +# Опционально: создаем цель для сборки всех проектов +add_custom_target(all_projects DEPENDS ${SUBPROJECTS}) From 93bf0b204286d5fb6071811fac90bb15b85472ac Mon Sep 17 00:00:00 2001 From: ada1ra Date: Fri, 26 Dec 2025 15:05:59 +0300 Subject: [PATCH 8/8] Add cmake for hw12-1 --- src/hw_12-1_binary/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/hw_12-1_binary/CMakeLists.txt diff --git a/src/hw_12-1_binary/CMakeLists.txt b/src/hw_12-1_binary/CMakeLists.txt new file mode 100644 index 0000000..2dfae0b --- /dev/null +++ b/src/hw_12-1_binary/CMakeLists.txt @@ -0,0 +1 @@ +add_executable(hw_12-1_binary hw_12-1_binary.c)