diff --git a/BinaryNumbers/BinaryNumbers.sln b/BinaryNumbers/BinaryNumbers.sln new file mode 100644 index 0000000..6eda164 --- /dev/null +++ b/BinaryNumbers/BinaryNumbers.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BinaryNumbers", "BinaryNumbers\BinaryNumbers.vcxproj", "{5C800CDD-E117-44CE-B92D-4BB73C1CE4E6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5C800CDD-E117-44CE-B92D-4BB73C1CE4E6}.Debug|x64.ActiveCfg = Debug|x64 + {5C800CDD-E117-44CE-B92D-4BB73C1CE4E6}.Debug|x64.Build.0 = Debug|x64 + {5C800CDD-E117-44CE-B92D-4BB73C1CE4E6}.Debug|x86.ActiveCfg = Debug|Win32 + {5C800CDD-E117-44CE-B92D-4BB73C1CE4E6}.Debug|x86.Build.0 = Debug|Win32 + {5C800CDD-E117-44CE-B92D-4BB73C1CE4E6}.Release|x64.ActiveCfg = Release|x64 + {5C800CDD-E117-44CE-B92D-4BB73C1CE4E6}.Release|x64.Build.0 = Release|x64 + {5C800CDD-E117-44CE-B92D-4BB73C1CE4E6}.Release|x86.ActiveCfg = Release|Win32 + {5C800CDD-E117-44CE-B92D-4BB73C1CE4E6}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {0862E17A-C16E-473A-A416-F533D44A449A} + EndGlobalSection +EndGlobal diff --git a/BinaryNumbers/BinaryNumbers/BinaryNumbers.vcxproj b/BinaryNumbers/BinaryNumbers/BinaryNumbers.vcxproj new file mode 100644 index 0000000..59488c8 --- /dev/null +++ b/BinaryNumbers/BinaryNumbers/BinaryNumbers.vcxproj @@ -0,0 +1,147 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {5c800cdd-e117-44ce-b92d-4bb73c1ce4e6} + BinaryNumbers + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + false + + + true + + + false + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + false + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/BinaryNumbers/BinaryNumbers/BinaryNumbers.vcxproj.filters b/BinaryNumbers/BinaryNumbers/BinaryNumbers.vcxproj.filters new file mode 100644 index 0000000..669bc4e --- /dev/null +++ b/BinaryNumbers/BinaryNumbers/BinaryNumbers.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Исходные файлы + + + \ No newline at end of file diff --git a/BinaryNumbers/BinaryNumbers/main.c b/BinaryNumbers/BinaryNumbers/main.c new file mode 100644 index 0000000..cf184dc --- /dev/null +++ b/BinaryNumbers/BinaryNumbers/main.c @@ -0,0 +1,168 @@ +#include +#include +#include +#include + +int scanOne(); +void print(int number); + +int binaryToDecimal(bool *binaryNumber) +{ + int multiplier = 1; + int number = 0; + for (int i = 11; i >= 0; --i) { + number += multiplier * binaryNumber[i]; + multiplier = multiplier << 1; + } + + return binaryNumber[0] ? number - 4096 : number; +} +int sizeBinary(int number) { + int size = 0; + while (number) { + number = number >> 1; + ++size; + } + return size; +} + +void translateDecimalToBinary(bool *binaryNumber, int size, int number) { + for (int i = 11; i >= 12 - size; --i) { + binaryNumber[i] = (number & 1); + number = number >> 1; + } +} + +void printArrayBinary(bool *binaryNumber, int size, int maxPow2) { + for (int i = maxPow2 - size; i < maxPow2; ++i) { + printf("%d", binaryNumber[i]); + } + printf("\n"); +} + +void sumToBinary(bool *binaryNumber1, bool *binaryNumber2, bool binaryNumber3[], int size1, int size2) { + bool pastSum = false; + int i = 11; + int size3 = 0; + + while (i >= 0) { + if (binaryNumber1[i] && binaryNumber2[i] && !pastSum || !binaryNumber1[i] && binaryNumber2[i] && pastSum || binaryNumber1[i] && !binaryNumber2[i] && pastSum) { + binaryNumber3[i] = false; + pastSum = true; + } else if (binaryNumber1[i] && binaryNumber2[i] && pastSum) { + binaryNumber3[i] = binaryNumber1[i] + binaryNumber2[i] + pastSum; + pastSum = true; + } else { + binaryNumber3[i] = binaryNumber1[i] + binaryNumber2[i] + pastSum; + pastSum = false; + } + if (binaryNumber3[i]) { + size3 = 12 - i; + } + --i; + } + + if (binaryNumber1[0] && binaryNumber2[0]) { + binaryNumber3[0] = true; + size3 = 12; + } +} + +int toChangeNegativeNumbers(int number) { + return number < 0 ? 4096 + number : number; +} + +bool testStandart(void) { + int size1 = sizeBinary(12); + int size2 = sizeBinary(13); + bool* binaryNumber1 = (bool*)calloc(12, sizeof(int)); + bool* binaryNumber2 = (bool*)calloc(12, sizeof(int)); + translateDecimalToBinary(binaryNumber1, size1, 12); + translateDecimalToBinary(binaryNumber2, size2, 13); + bool* binaryNumber3 = (bool*)calloc(12, sizeof(int)); + sumToBinary(binaryNumber1, binaryNumber2, binaryNumber3, size1, size2); + free(binaryNumber1); + free(binaryNumber2); + int result = binaryToDecimal(binaryNumber3); + free(binaryNumber3); + return result == 25; +} + +bool testNotStandart() { + int number1 = toChangeNegativeNumbers(1001); + int number2 = toChangeNegativeNumbers(-1002); + int size1 = sizeBinary(number1); + int size2 = sizeBinary(number2); + bool* binaryNumber1 = (bool*)calloc(12, sizeof(int)); + bool* binaryNumber2 = (bool*)calloc(12, sizeof(int)); + translateDecimalToBinary(binaryNumber1, size1, number1); + translateDecimalToBinary(binaryNumber2, size2, number2); + bool* binaryNumber3 = (bool*)calloc(12, sizeof(int)); + sumToBinary(binaryNumber1, binaryNumber2, binaryNumber3, size1, size2); + free(binaryNumber1); + free(binaryNumber2); + int result = binaryToDecimal(binaryNumber3); + free(binaryNumber3); + return result == -1; +} + +int main() { + setlocale(LC_ALL, "RUS"); + + if (!testStandart() || !testNotStandart()) { + printf("%s", " \n"); + return 0; + } else { + printf("%s", " \n"); + } + + printf("%s", " , . 2048 \n"); + int number1 = scanOne(); + while (abs(number1) >= 2048) { + printf("%s\n", " ! "); + number1 = scanOne(); + } + int number2 = scanOne(); + while (abs(number2) >= 2048 || abs(number1 + number2) >= 2048) { + printf("%s\n", " ! "); + number1 = scanOne(); + number2 = scanOne(); + } + number1 = toChangeNegativeNumbers(number1); + number2 = toChangeNegativeNumbers(number2); + int size1 = sizeBinary(number1); + int size2 = sizeBinary(number2); + bool *binaryNumber1 = (bool*)calloc(12, sizeof(int)); + bool *binaryNumber2 = (bool*)calloc(12, sizeof(int)); + translateDecimalToBinary(binaryNumber1, size1, number1); + translateDecimalToBinary(binaryNumber2, size2, number2); + printArrayBinary(binaryNumber1, size1, 12); + printArrayBinary(binaryNumber2, size2, 12); + int size3 = 12; + bool *binaryNumber3 = (bool*)calloc(12, sizeof(int)); + sumToBinary(binaryNumber1, binaryNumber2,binaryNumber3, size1, size2); + printArrayBinary(binaryNumber3, size3, 12); + printf("%d", binaryToDecimal(binaryNumber3)); + free(binaryNumber1); + free(binaryNumber2); + free(binaryNumber3); +} + +void print(int number) { + printf("%d\n", number); +} + +int scanOne() { + int number = 0; + int checkScanf = scanf("%d", &number); + + while (checkScanf != 1) { + while (getchar() != '\n') { + } + + printf("%s", "... \n"); + checkScanf = scanf("%d", &number); + } + + return number; +} \ No newline at end of file