Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Разработка модуля для выполнения операций с натуральными числами в 16-ричной системе счисления (Виды позиционных систем счисления)

Содержание:

Введение

В современном мире мы постоянно имеем дело с числами. Они окружают нас в повседневной деятельности. Историческая наука определяет, что и несколько тысячелетий назад (не менее пяти тысяч лет) уже существовала наука о числах и арифметических действиях над ними. При этом правила записи чисел и работы с ними, конечно, несколько отличались, чем сейчас. Однако, тем не менее, числа, так же как и сейчас, изображалось с помощью одного или нескольких символов. Подобные символы, используемые при записи числа в математике и информатике, называют цифрами [10].

Изначально понятие отвлеченного числа отсутствовало, так как оно было "привязано" к конкретным предметам, подлежащим счету. Отвлечённое понимание натуральных чисел появилось вместе с развитием письменности. При этом понятие дробных чисел появилось тогда, когда возникла необходимость производить измерения. Измерение, как известно, подразумевает сравнение измеряемой величины с эталоном. Эталон обычно называют единицей измерения. Известно, что единица измерения не всегда укладывается в целое число раз в измеряемой величине. Отсюда и возникает потребность использовать на практике именно дробные числа. Последующее развитие понятия числа было обусловлено уже развитием математики. Понятие числа – фундаментальное понятие, как математики, так и информатики. При этом существуют различные способы записи чисел.

Под системой счисления понимается способ записи (изображения) чисел. Системы счисления (как существовавшие ранее, так используемые и сегодня) делятся на две группы: позиционные и непозиционные. Наиболее разработанными являются позиционные системы счисления (ПСС) – системы записи чисел, в которых вклад каждой цифры в величину числа зависит от её положения (позиции) в последовательности цифр, изображающей число. Те системы счисления, в которых каждой цифре соответствует величина, не зависящая от её места в записи числа, называются непозиционными. Также существуют различные смешанные системы счисления. В настоящее время конечно используются ПСС, которые представляют собой результат длительного исторического развития непозиционных систем счисления. Причем наибольшее распространение получила десятичная система счисления, а также двоичная система счисления. Теме не менее, на практике используются и другие системы счисления.

Для представления двоичных чисел вне компьютера используют более компактные по длине чисел восьмеричную (для записи кодов чисел и машинных команд) и шестнадцатеричную (для записи адреса команд) системы счисления. Шестнадцатеричная система счисления широко используется в низкоуровневом программировании и компьютерной документации, поскольку в современных компьютерах минимальной адресуемой единицей памяти является 8-битный байт, значения которого удобно записывать двумя шестнадцатеричными цифрами. [2, 10]

Объект исследования: арифметические операции с натуральными числами в 16-ричной системе счисления.

Предмет исследования: программная реализация арифметических операций с натуральными числами в 16-ричной системе счисления.

Целью данной работы является разработка модуля для выполнения операций с натуральными числами в 16-ричной системе счисления.

Для достижения поставленной цели необходимо решить следующие задачи:

  • подобрать и проанализировать литературу по данной теме;
  • изучить теоретические основы выполнения вычислительных операций в 16-ричной системе счисления: особенности и правила выполнения арифметических операции с 16-ричными натуральными числами;
  • разработать на языке программирования C и протестировать программное приложение для выполнения операций с натуральными числами в 16-ричной системе счисления.

Для решения поставленных задач был подобрана научная литература по системам счисления ([2, 4, 7, 8, 9, 10]) и объектно-ориентированным языкам программирования, в частности по C# [1, 3, 5, 6, 11-15].

  1. Теоретически основы выполнения вычислительных операцийв 16-ричной системе счисления

Виды позиционных систем счисления

В ПСС цифры, используемые в записи числа, имеют различные значения в зависимости от их места (позиции) в числе. Создание подобной позиционной нумерации, основанной на привязке значений цифр к их позиции в числе, приписывается шумерам и вавилонянам. Такая нумерация также была развита индусами и имела важное значение в развитии человеческой цивилизации. К числу позиционных систем счисления также относится современная десятичная система счисления, возникновение которой связано со счётом на пальцах.

В Европе такая система счисления появилась в средние века через итальянских купцов, в свою очередь получивших ее от арабов [10].

Под ПСС обычно понимается с-ричная система, определяемая целым числом c > 1, которое называется основанием. Любое целое число y без знака в c-ричной системе счисления представляется в виде конечной линейной комбинации степеней числа c: , где zk – это целые числа (цифры), которые удовлетворят следующему неравенству [8]:

При этом коэффициенты сk в такой записи числа называются весовыми коэффициентами. Значимость коэффициентов и соответствующих им цифр определяется номером разряда k. Как правило, в записи ненулевых чисел начальные нули опускаются.

Обычно число y записывают в виде последовательности его c-ричных цифр, перечисляемых слева направо по убыванию старшинства разрядов [2, 8]:

y=zn-2zn-1….z0.

К примеру, число тридцать три представляется в десятичной системе счисления в виде: 3310=3*101+3*100.

Часто употребляемыми в настоящее время ПСС являются следующие [2]:

  1. ПСС с основанием два – в информатике, дискретной математике и программировании;
  2. ПСС с основанием три;
  3. ПСС с основанием восемь;
  4. ПСС с основанием десять – в обыденной жизни людей;
  5. ПСС с основанием двенадцать;
  6. ПСС с основанием шестнадцать – в программировании;
  7. ПСС с основанием двадцать;
  8. ПСС с основанием шестьдесят – при определении единиц измерения времени, углов, координат и т.д.

В ПСС с ростом основания количество разрядов (используемых при записи цифр) уменьшается. [2, 10, 7]

1.2 Особенности 16-ричной системы счисления

Шестнадцатеричная система счисления относится к классу ПСС по основанию 16. При этом цифрами в данной системе счисления используются цифры (0…9) и буквы (A…F), которые имеют значения: A – 1010, B – 1110, C – 1210, D – 1310, E – 1410, F 1510 соответственно [4, 9].

Шестнадцатеричная ПСС довольно часто используется в низкоуровневом программировании, а также при написании компьютерной документации, так как в современных персональных ЭВМ минимальной адресуемой единицей памяти является байт (8 бит), значения которого удобно записывать двумя шестнадцатеричными цифрами. Подобное обозначение было использовано в системе IBM/360, в то время как в документации других компьютерных систем использовали восьмеричную систему счисления (PDP-11, БЭСМ-6). Также в стандарте Unicode номер символа записывают в шестнадцатеричном виде, при этом используя не менее 4 цифр (при необходимости – с ведущими нулями) [4, 9].

Для перевода шестнадцатеричного числа в десятичное необходимо это число представить в виде суммы произведений степеней основания шестнадцатеричной системы счисления на соответствующие цифры в разрядах шестнадцатеричного числа.

Например, требуется перевести число «2A4»16 из шестнадцатеричной ПСС в десятичную ПСС. В числе «2A4» три цифры. В соответствии с вышеуказанным правилом представим число «2A4» как сумму степеней с основанием шестнадцать:

2A416 = 2·162+10·161+4·160= 2·256+10·16+4·1 = 512+160+4 = 676.

При реализации указанных преобразований следует помнить, что в шестнадцатеричной ПСС: A=10; B=11; C=12; D=13; E=14; F=15.

Шестнадцатеричная ПСС получила развитие вследствие того, что двоичные числа очень трудно читать, особенно если они очень большие. При этом перевод двоичного числа в десятичное достаточно труден, а в шестнадцатеричное – нет, так как в последнем случае существует ускоренные методы перевода многозначного двоичного числа в шестнадцатеричную систему на основе разбиения его на тетрады, справа налево и замены каждой тетрады соответствующей шестнадцатеричной цифрой. Для перевода числа из шестнадцатеричной системы в двоичную нужно заменить каждую его цифру на соответствующую тетраду из нижеприведённой таблицы перевода (таблица 1.1). К примеру, для числа 0101101000112 получим [9]:

0101101000112 = 0101 1010 0011 = 5A316.

Чтобы перевести десятичное число в шестнадцатеричное, необходимо выполнить следующие действия:

1. Проверяем, не меньше ли 16 наше число: если да, то результат достигнут. Действительно, такое десятичное число необходимо лишь заменить соответствующей ему шестнадцатеричной цифрой из таблицы 1. Если же наше десятичное число больше 16, переходим к шагу 2.

2. Делим наше число «нацело» на 16 и запоминаем целочисленный остаток от этого деления. Результат этого деления снова сравниваем с 16. Если результат деления меньше 16, то его стоит тоже запомнить как последний из остатков.

3. Шаг 2 повторяем до тех пор, пока результат деления не будет меньше 16. Целочисленные остатки на всех этапах запоминаем. Они понадобятся в шаге 4.

4. Все остатки записываем в обратном порядке и заменяем в них числа от 10 до 15 шестнадцатеричными цифрами от A до F.

Таблица 1.1

К примеру, переведем десятичное число 89 в шестнадцатеричное. Оно больше 16, поэтому разделим его на 16. Частное равно 5 и 9 в остатке. 5 меньше 16, значит, деление прекращается и 5 запомним как последний остаток. То есть у нас есть два остатка: 9 и 5. Теперь их надо записать в обратном порядке, получаем: 89 = 5916. Проверим, действительно ли 0×59 равно 89? Распишем его по привычной уже схеме: 5916= 5×161 + 9×160 = 5×16 + 9 = 89.

Действительно, получилось. Но в выбранном примере число 89 очень быстро закончилось, если так можно сказать. В противном случае деление потребовалось бы продолжить. Покажем это на более сложном примере. Возьмем число 3728: 3728 / 16 = 233 и 0 в остатке. Затем 233 / 16 = 14 и 9 в остатке. Результат этого деления равен 14, он меньше 16. Деление заканчиваем и запоминаем этот результат деления как последний остаток. Нам осталось лишь записать эти остатки в обратном порядке и заменить десятичное число 14 на шестнадцатеричную цифру E. Итак, искомое число E90.

На рисунке 1.1. представлен пример перевода десятичного числа 500 в шестнадцатеричную систему счисления на основе деления в столбик. [4, 2, 8, 9, 7]

Рис.1.1.

Результат перевода 1F416.

1.3 Арифметические операции с 16-ричными числами

Рассмотрим перечень необходимых для выполнения арифметических операций правил. Первое правило – нельзя забывать, что шестнадцатеричная система счисления есть ПСС, так как из этого правила следует важный момент: при сложении чисел нужно складывать только те цифры, которые находятся в одинаковых разрядах.

Рассмотрим сложение чисел в столбик в обычной десятичной ПСС и применим данный подход для сложения 16-ричных чисел.

Допустим, требуется сложить числа 134 и 59. Запишем данные числа друг под другом таким образом, чтобы разряды в них совпадали – единицы под единицами, десятки под десятками и так далее. При этом будем суммировать цифры одинаковых разрядов, начиная с единиц при этом двигаясь, справа налево:

134

+

59

193

При реализации данной арифметической операции помнить о том, что реализуется сложение десятичных чисел, у которых основанием является цифра 10, а сложение разрядов реализуется по очереди справа налево: 4 + 9 = 13. Полученный результат 13 является большим, чем основание 10. Если результат больше или равен основанию, необходимо из полученного результата это основание вычесть, то есть из 13 необходимо вычесть 10, а полученный результат необходимо записать под цифрами 4 и 9. При этом в левый разряд необходимо перенести единицу. В разряде с десятков мы складываем 3 + 5 и добавляем к ним перенесенный 1 десяток. Результат – 9. Результат меньше основания 10, поэтому под десятками просто записываем 9. Затем складываем сотни. Но единицу не с чем складывать, значит просто переносим ее в результат. Итак: 134 + 59 = 193.

Такие же правила сложения чисел действуют в любой ПСС. При этом отличие заключается только в том, что результаты сложения цифр в разрядах сравниваются с основаниями используемых ПСС.

Теперь рассмотрим шестнадцатеричные числа, у которых основание равно 16, а также имеются цифры обозначенные буквами латинского алфавита:

A = 10, B = 11, C = 12, D = 13, E = 14, F = 15.

Итак, рассмотри сложение 16-ричных чисел A15 и BC [4].

A15

+

BC

AD1

Поясним порядок сложения:

  1. Складываем разряды единиц: 5 и С. При этом учитываем, что С = 12, тогда получаем 5 + 12 = 17. Полученный результат превышает основание ПСС, равное шестнадцати. Поэтому вычитаем 16 из 17 и получаем 1, записываем полученный результат под правым разрядом, а в левый старший разряд переносим 1 (шестнадцать единиц соответствует 1-му десятку в 16-ричной ПСС).
  2. Далее складываем 1 и B. Прибавляем к данной сумме перенесенную единицу и учитываем, что B = 11, получаем: 1 + 1 + 11 = 13. Данный результат меньше 16, поэтому его можно записать под суммируемыми цифрами, при этом число 13 в 16-ричной системе записывается буквой D.
  3. Цифра A из верхнего слагаемого переносится в результат. В разряд сотен при этом ничего не переносится.

Таким образом, A15 + BC = AD1.

На рисунке 1.2 представлена графическая иллюстрация предложенного алгоритма для сложения двух других 16-ричных чисел 1С5216 и 89116.

Рис. 1.2

Рассмотрим операцию вычитания 16-ричных чисел. При этом опять рассмотрим пример вычитания для десятичной ПСС. Вычислим следующую разность:

223

95

128

Процесс вычитания реализуется поразрядно, при этом переносы реализуются слева направо. В рассмотренном примере необходимо от цифры три вычесть цифру пять. Так как это сделать не получится, необходимо занять один десяток из левого разряда. Теперь цифру пять необходимо вычесть из числа тринадцать. В результате получим цифру восемь, которую записываем под разрядом единиц. От десятков в уменьшаемом числе двести двадцать три мы один десяток заняли в разряд единиц. Теперь здесь только один десяток. Нам нужно из одного вычесть девять. Поэтому опять занимаем единицу из левого разряда, но уже сотен. Далее необходимо из одиннадцати отнять девять и получим два, которое запишем под разрядом десятков. При этом одну сотню мы заняли для вычитания десятков, поэтому в разряде сотен остается единица. Полученный результат: 223-95 = 128.

Далее перейдем к вычитанию 16-ричных чисел. Алгоритм вычитания аналогичен. При этом необходимо помнить, что при сравнении полученного результата вычитания необходимо использовать число 16, а не 10.

Рассмотрим пример BC4-AF [4].

BC4

AF

B15

От четырех нельзя отнять число F, поэтому из левого разряда мы будем занимать число шестнадцать. В результате из 20 вычитаем число F и получаем цифру 5, которую записываем под разрядом единиц. При этом число C уменьшилось на единицу и получилось число B. Далее из B необходимо отнять A. При этом получится единица, которую записываем в разряд десятков. Так как от сотен ничего не занималось, а в вычитаемом примере только 2 цифры, то переносим B из уменьшаемого в конечный результат: BC4-AF = B15.

На рисунке 1.3 представлены результаты вычитания двух чисел С5B16 и A7E16.

Рис.1.3.

Умножение и деление проводится также, как и в десятичной системе. На рисунке 1.4 представлены результаты перемножения двух чисел 20A416 и B1516.

Рис.1.4.

Для того, чтобы легче было проводить эти действия, лучше воспользоваться таблицей умножения, которая приведена в таблице 1.2.

Таблица 1.2

1

2

3

4

5

6

7

8

9

A

B

C

D

E

F

1

1

2

3

4

5

6

7

8

9

A

B

C

D

E

F

2

2

4

6

8

A

C

E

10

12

14

16

18

1A

1C

1E

3

3

6

9

C

F

12

15

18

1B

1E

21

24

27

2A

2D

4

4

8

C

10

14

18

1C

20

24

28

2C

30

34

38

3C

5

5

A

F

14

19

1E

23

28

2D

32

37

3C

41

46

4B

6

6

C

12

18

1E

24

2A

30

36

3C

42

48

4E

54

5A

7

7

E

15

1C

23

2A

31

38

3F

46

4D

54

5B

62

69

8

8

10

18

20

28

30

38

40

48

50

58

60

68

70

78

9

9

12

1B

24

2D

36

3F

48

51

5A

63

6C

75

7E

87

A

A

14

1E

28

32

3C

46

50

5A

64

6E

78

82

8C

96

B

B

16

21

2C

37

42

4D

58

63

6E

79

84

8F

9A

A5

C

C

18

24

30

3C

48

54

60

6C

78

84

90

9C

A8

B4

D

D

1A

27

34

41

4E

5B

68

75

82

8F

9C

A9

B6

C3

E

E

1C

2A

38

46

54

62

70

7E

8C

9A

A8

B6

C4

D2

F

F

1E

2D

3C

4B

5A

69

78

87

96

A5

B4

C3

D2

E1

Операция умножения довольно просто выполняется при использовании этой таблицы. Например, при умножении чисел 4А x C сначала выполним операцию умножения для 4 х С = 30 и затем А х С = 78. Для этого нужно найти числа, находящиеся на пересечении строк и столбцов чисел 4 и С, а затем А и С. Затем нужно сложить 300 и 78, в результате получим 378.

На рисунке 1.5 представлены результаты деления двух чисел 6F7816 и 816 в столбик.

Рис. 1.5.

При этом также можем воспользоваться данными из таблицы 1.2. Для операции деления нужно найти число в строке, в которой слева находится делитель или близкое к нему число. Например, при делении 378 на С, найдем в строке, где слева находится С, максимальное число, которое не превышает 37 – это будет 30. Запишем верхнее число, которое находится в этом столбце, это будет 4. 37 – 30 = 7. Далее найдем в этой же строке число 78 и запишем верхнее значение столбца, где оно находится. Получим А, значит, наше число 4A. [4, 2, 8, 9, 7]

Разработка модуля для выполнения операций с натуральными числами в 16-ричной системе счисления в языке C#

Разрабатываемый модуль представляет собой калькулятор, позволяющий реализовать операции сложения и вычитания двух натуральных 16-ричных чисел, выполненный в среде Visual Studio 2017 на языке программирования C#.

    1. Особенности языка программирования C#

Язык программирования C# предназначен для разработки программ на платформе .NET корпорации Microsoft. В этом языке присутствуют как надежные проверенные средства программирования, так и последние нововведения с возможностью эффективного и практичного создания программ, предназначенных для мощных вычислительных сред современных организаций [14].

Предшественником языка C# являются языки программирования С и C++. Кроме того, язык C# имеет сильную связь с таким языком как Java, который также происходит от С и C++ и обладает общим с ними синтаксисом.

В C# присутствует много новых средств, и одним из самых важных является встроенная поддержка программных компонентов. При этом язык C# по сути является компонентно-ориентированным языком программирования, так как в него встроена поддержка написания программных компонентов. К примеру, в C# присутствуют средства прямой поддержки программных компонентов, их свойств, методов и события. Другой важной особенностью языка C#, является возможность работы в безопасной среде многоязыкового программирования.

C# унаследовал от С многие ключевые слова и операторы. При этом C# построен на усовершенствованной объектной модели, использованной в C++. У C# имеется особая взаимосвязь со средой выполнения .NET Framework, что объясняется следующим:

  • он предназначался для создания кода, который должен выполняться в среде .NET Framework;
  • используемые в C# библиотеки определены в среде .NET Framework.

.NET Framework – среда для поддержки разработки и выполнения сильно распределенных компонентных приложений, которая обеспечивает совместное использование разных языков программирования, а также безопасность, переносимость программ и общую модель программирования для платформы Windows. При этом существуют и недостатки данного подхода, заключающиеся в необходимости использования дополнительной среды NET Framework, а также в увеличении требуемой памяти и снижении скорости выполнения разрабатываемых программы. Вместе с тем те достоинства, которые предоставляет .NET Framework значительно шире: однообразные средства API для разработки программ на разных языках; простота стыковки разноязыковых модулей; обширные библиотеки готовых классов; отсутствие необходимости использования программ-инсталляторов при установке программ под .NET и т.д. [14, 6, 1, 5].

2.2 Описание интерфейса модуля

Интерфейс представлен на рисунке 2.1 и включает: поле ввода, набор кнопок для ввода натуральных чисел в шестнадцатеричной системе счисления (от 0 до F), кнопки арифметических операций («+», «–»,«=») и очистки поля ввода.

Рис. 2.1.

Порядок выполнения вычислений

Для выполнения вычислений необходимо ввести первое число в поле ввода, к примеру, число 2 (рис. 2.2).

Рис. 2.2.

Далее нажимаем необходимую операцию, например сложения (рис.2.3).

Рис. 2.3.

Далее выбираем операцию равно (рис. 2.4) и получаем результат вычислений (рис. 2.5).

Рис. 2.4.

Рис. 2.5.

Исследование работы модуля

Проверим работу модуля при выполнении операций сложения на числах, приведенных ранее в разделе 1. На рисунке 2.6 и 2.7 представлен результат сложения двух натуральных чисел A15 и BC. Получен результат AD1.

Рис. 2.6.

Рис. 2.7.

На рисунке 2.8 и 2.9 представлен результат сложения двух натуральных чисел 1С5216 и 89116 . Получен результат 24E3.

Рис. 2.8

Рис. 2.9.

Далее рассмотрим операции вычитания.

На рисунке 2.10 и 2.11 представлен результат вычитания двух натуральных чисел BC416 и AF16 . Получен результат B1516.

Рис. 2.10

Рис. 2.11.

На рисунке 2.12 и 2.13 представлен результат вычитания двух натуральных чисел С5B16 и A7E16 . Получен результат 1DD16.

Рис. 2.12.

Рис. 2.13.

Проверим правильность работы модуля в дополнительных ситуациях.

Сложим числа FF16 и B16 (рис.2.14, 2.15, 2.16). Получим 10A16, что легко проверяется, так как сумма F и B дает 2610=1*16+10=1*16+A, запоминаем 1. А сумма F и 1 дает 1610 или 1016. Итого получается 10A16.

Рис. 2.14.

Рис. 2.15.

Рис. 2.16.

Вычтем из числа FF16 число F16 (рис. 2.17, 2.18, 2.19). Получаем верное число F016.

Рис. 2.17.

Рис. 2.18.

Рис. 2.19.

Таким образом, разработанный модуль удовлетворяет всем необходимым требованиям при выполнении операций сложения и вычитания. [12,13, 14, 15]

Заключение

Вопросы изучения систем счисления являются одними из базовых вопросов информатики и теории программирования, так как один разряд двоичной системы представляет собой не что иное, как один бит, а два разряда шестнадцатеричной системы представляют собой один байт. В современных компьютерах информация кодируется в байтах, поэтому во многих случаях удобно использовать шестнадцатеричную систему счисления. Помимо прочего, шестнадцатеричную систему используют в низкоуровневом программировании, в компьютерном дизайне при кодировании цветов изображений, в некоторых системах кодировки информационных символов и т.п.

В представленной курсовой работе проанализированы основные существующие системы позиционного счисления. Подробно исследованы вопросы выполнения арифметических операций над натуральными числами в шестнадцатеричной системе счисления. Разработан программный модуль на языке C# в среде Visual Studio 2017, позволяющий реализовать сложение и вычитание натуральных чисел в шестнадцатеричной системе счисления. Проведены исследования разработанного модуля на примерах, рассмотренных в теоретической части и дополнительных примерах, позволяющих сделать вывод о надежности разработанного программного обеспечения в различных нестандартных ситуациях.

Список используемой литературы

  1. Барков И.А. Объектно-ориентированное программирование. Учебник. – М.: Лань, 2019. – 700 с.
  2. Гашков С.Б. Системы счисления и их применение. – М.: МЦНМО, 2004. – 52 с.
  3. Городняя Л.В. Парадигма программирования. Учебное пособие. – М.: Лань, 2019. – 232 с.
  4. Двоичная и шестнадцатиричная системы счисления [Электронный ресурс] – URL: https://microkontroller.ru/programmirovanie-mikrokontrollerov-avr/dvoichnaya-i-shestnadtsatirichnaya-sistemyi-schisleniya (дата обращения: 04.10.2019)
  5. Евдокимов П.В. C# на примерах. – М.: Наука и техника, 2019. – 320 с.
  6. Зыков С.В. Введение в теорию программирования. Объектно-ориентированный подход. – М.: Национальный Открытый Университет «ИНТУИТ», 2016. – 189 с.
  7. Игнашева Е.П. Системы счисления, алгоритмизация и программирование. Учебное пособие. – М.: ИНФРА-М, 2019. – 224 с.
  8. Микушин А.В. Цифровые устройства и микропроцессоры. – СПб.: БХВ-Петербург, 2010. – 832 с.
  9. Смирнов В. Шестнадцатеричная арифметика [Электронный ресурс] – URL: http://www.vsmirnov.ru/articles/hexmetric.html (дата обращения: 04.10.2019)
  10. Стахов А. Роль систем счисления в истории компьютеров [Электронный ресурс] – URL: https://mirznanii.com/a/118900/rol-sistem-schisleniya-v-istorii-kompyuterov (дата обращения: 04.10.2019)
  11. Страуструп Б. Язык программирования С++. Специальное издание. – М.: Бином, 2018. – 1136 с.
  12. Шакин В.Н. Базовые средства программирования на Visual Basic в среде Visual Studio Net. Практикум. Учебное пособ. – М.: Форум, 2018. – 287 с.
  13. Шарп Дж. Microsoft Visual C#. Подробное руководство. – СПб.: Питер, 2017. – 848 с.
  14. Шилдт Г. C# 4.0. Полное руководство. Пер. с англ. – М.: ООО «И.Д. Вильямс», 2015. – 1056 с.
  15. Шилдт Г. C++. Полное руководство. Классическое издание. – М.: ООО «И.Д. Вильямс», 2019. – 800 с.

Приложение. Листинг программы

namespace WindowsFormsApp4

{

public partial class Form1 : Form

{

String str1 = "";

String str2 = "";

String Pr="";

String Vis = "";

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

str1 = str1 + 0;

textBox1.Text = str1;

}

private void panel2_Paint(object sender, PaintEventArgs e)

{

}

private void button2_Click(object sender, EventArgs e)

{

str1 = str1 + "1";

textBox1.Text = str1;

}

private void button3_Click(object sender, EventArgs e)

{

str1 = str1 + "2";

textBox1.Text = str1;

}

private void button4_Click(object sender, EventArgs e)

{

str1 = str1 + "3";

textBox1.Text = str1;

}

private void button5_Click(object sender, EventArgs e)

{

str1 = str1 + "4";

textBox1.Text = str1;

}

private void button6_Click(object sender, EventArgs e)

{

str1 = str1 + "5";

textBox1.Text = str1;

}

private void button7_Click(object sender, EventArgs e)

{

str1 = str1 + "6";

textBox1.Text = str1;

}

private void button8_Click(object sender, EventArgs e)

{

str1 = str1 + "7";

textBox1.Text = str1;

}

private void button9_Click(object sender, EventArgs e)

{

str1 = str1 + "8";

textBox1.Text = str1;

}

private void button10_Click(object sender, EventArgs e)

{

str1 = str1 + "9";

textBox1.Text = str1;

}

private void button11_Click(object sender, EventArgs e)

{

str1 = str1 + "A";

textBox1.Text = str1;

}

private void button12_Click(object sender, EventArgs e)

{

str1 = str1 + "B";

textBox1.Text = str1;

}

private void button13_Click(object sender, EventArgs e)

{

str1 = str1 + "C";

textBox1.Text = str1;

}

private void button14_Click(object sender, EventArgs e)

{

str1 = str1 + "D";

textBox1.Text = str1;

}

private void button15_Click(object sender, EventArgs e)

{

str1 = str1 + "E";

textBox1.Text = str1;

}

private void button16_Click(object sender, EventArgs e)

{

str1 = str1 + "F";

textBox1.Text = str1;

}

private void button17_Click(object sender, EventArgs e)

{

str1 = str1 + "10";

textBox1.Text = str1;

}

private void button18_Click(object sender, EventArgs e)

{

str2 = str1;

str1 = "";

textBox1.Text = "";

Pr = "+";

}

private void button19_Click(object sender, EventArgs e)

{

str2 = str1;

str1 = "";

textBox1.Text = "";

Pr = "-";

}

private void button20_Click(object sender, EventArgs e)

{

if (str1 != "")

{

if (str2 != "")

{

if (Pr == "+")

{

Vis = Summer(str2, str1);

textBox1.Text = Vis;

}

if (Pr == "-")

{

Vis = Minuser(str2, str1);

textBox1.Text = Vis;

}

}

}

}

public string Summer(String s2, String s1)

{

int n2 = s2.Length;

int n1 = s1.Length;

int prr = 0;

String pmj = "";

if (n2>n1)

{

int m = n2 - n1;

for (int j=1;j<=m;j++)

{

s1 = 0 + s1;

}

}

if (n1 > n2)

{

int m = n1 - n2;

for (int j = 1; j <= m; j++)

{

s2 = 0 + s2;

}

}

for (int j = 1; j <= s2.Length; j++)

{

String s2j = s2[s2.Length-j].ToString();

String s1j = s1[s1.Length - j].ToString();

if (s1j == "A") { s1j = "10"; }

if (s1j == "B") { s1j = "11"; }

if (s1j == "C") { s1j = "12"; }

if (s1j == "D") { s1j = "13"; }

if (s1j == "E") { s1j = "14"; }

if (s1j == "F") { s1j = "15"; }

if (s2j == "A") { s2j = "10"; }

if (s2j == "B") { s2j = "11"; }

if (s2j == "C") { s2j = "12"; }

if (s2j == "D") { s2j = "13"; }

if (s2j == "E") { s2j = "14"; }

if (s2j == "F") { s2j = "15"; }

int s2ji = Convert.ToInt32(s2j);

int s1ji = Convert.ToInt32(s1j);

int mj = s2ji + s1ji+prr;

if (mj >= 16)

{

int pmji = mj - 16;

if (pmji == 10) { pmj = "A" + pmj; }

if (pmji == 11) { pmj = "B" + pmj; }

if (pmji == 12) { pmj = "C" + pmj; }

if (pmji == 13) { pmj = "D" + pmj; }

if (pmji == 14) { pmj = "E" + pmj; }

if (pmji == 15) { pmj = "F" + pmj; }

if (pmji < 10) { pmj = pmji.ToString() + pmj; }

prr = 1;

}

if (mj < 16)

{

int pmji = mj;

if (pmji<10) { pmj = pmji.ToString()+pmj;}

if (pmji == 10) { pmj = "A" + pmj; }

if (pmji == 11) { pmj = "B" + pmj; }

if (pmji == 12) { pmj = "C" + pmj; }

if (pmji == 13) { pmj = "D" + pmj; }

if (pmji == 14) { pmj = "E" + pmj; }

if (pmji == 15) { pmj = "F" + pmj; }

prr = 0;

}

}

if (prr>0) { pmj = prr.ToString() + pmj; }

Vis = pmj;

return Vis;

}

public string Minuser(String s2, String s1)

{

int n2 = s2.Length;

int n1 = s1.Length;

int prr = 0;

String pmj = "";

if (n2 > n1)

{

int m = n2 - n1;

for (int j = 1; j <= m; j++)

{

s1 = 0 + s1;

}

}

if (n1 > n2)

{

int m = n1 - n2;

for (int j = 1; j <= m; j++)

{

s2 = 0 + s2;

}

}

for (int j = 1; j <= s2.Length; j++)

{

String s2j = s2[s2.Length - j].ToString();

String s1j = s1[s1.Length - j].ToString();

if (s1j == "A") { s1j = "10"; }

if (s1j == "B") { s1j = "11"; }

if (s1j == "C") { s1j = "12"; }

if (s1j == "D") { s1j = "13"; }

if (s1j == "E") { s1j = "14"; }

if (s1j == "F") { s1j = "15"; }

if (s2j == "A") { s2j = "10"; }

if (s2j == "B") { s2j = "11"; }

if (s2j == "C") { s2j = "12"; }

if (s2j == "D") { s2j = "13"; }

if (s2j == "E") { s2j = "14"; }

if (s2j == "F") { s2j = "15"; }

int s2ji = Convert.ToInt32(s2j);

int s1ji = Convert.ToInt32(s1j);

int mj = s2ji - s1ji - prr;

if (mj < 0)

{

int pmji = mj + 16;

if (pmji == 10) { pmj = "A" + pmj; }

if (pmji == 11) { pmj = "B" + pmj; }

if (pmji == 12) { pmj = "C" + pmj; }

if (pmji == 13) { pmj = "D" + pmj; }

if (pmji == 14) { pmj = "E" + pmj; }

if (pmji == 15) { pmj = "F" + pmj; }

if (pmji < 10) { pmj = pmji.ToString() + pmj; }

prr = 1;

}

if (mj >=0)

{

int pmji = mj;

if (pmji < 10) { pmj = pmji.ToString() + pmj; }

if (pmji == 10) { pmj = "A" + pmj; }

if (pmji == 11) { pmj = "B" + pmj; }

if (pmji == 12) { pmj = "C" + pmj; }

if (pmji == 13) { pmj = "D" + pmj; }

if (pmji == 14) { pmj = "E" + pmj; }

if (pmji == 15) { pmj = "F" + pmj; }

prr = 0;

}

}

if (prr > 0) { pmj = "-" + pmj; }

Vis = pmj;

return Vis;

}

private void button21_Click(object sender, EventArgs e)

{

str1 = "";

str2 = "";

textBox1.Text = "";

}

}

}