Файл: Разработка модуля для выполнения операций с натуральными числами в 16-ричной системе счисления (Теоретически основы выполнения вычислительных операций в 16-ричной системе счисления).pdf
Добавлен: 31.03.2023
Просмотров: 160
Скачиваний: 2
Рис. 1.2
Рассмотри операцию вычитания 16-ричных чисел. Начнем мы снова с привычной нам десятичной системы счисления. Давайте решим пример: 123-85.
123
–
85
38
Вычитание снова происходит поразрядно, но переносы делаются на сей раз слева направо. Поясню. В нашем примере необходимо из 3 отнять 5. Этого сделать нельзя, поэтому мы занимаем один десяток из левого разряда. Теперь 5 нужно отнять от 13. В результате мы получим 8, запишем этот результат под разрядом единиц. От десятков в уменьшаемом (число 123) мы один десяток заняли в разряд единиц. Теперь здесь только 1 десяток. Нам нужно из одного вычесть 8. Для этого снова приходится занять единицу из левого разряда (теперь уже сотен). Значит нужно из 11 вычесть 8. В результате получаем – 3 и записываем его под разрядом десятков. А единственную сотню мы заняли для вычитания десятков. Пример решён: 123-85 = 38.
Перейдем к вычитанию шестнадцатеричных чисел. Все делается аналогично, надо только помнить, что в случае необходимости из левых разрядов мы будем занимать не 10, а 16.
Давайте решим пример BC4-AF.
BC4
–
AF
B15
Из 4 нельзя вычесть F, значит, из левого разряда мы займем 16. Теперь F надо вычитать из 20. В результате – 5, записываем его под разрядом единиц. Цифра C уменьшилась на 1, теперь это B. Значит надо A вычесть из B. Нетрудно догадаться, что в результате будет 1. Записываем этот результат в разряде десятков. Из сотен в этот раз мы ничего не занимали и в вычитаемом только 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.
Разработка модуля для выполнения операций с натуральными числами в 16-ричной системе счисления в языке C#
Разрабатываемый модуль представляет собой калькулятор, позволяющий реализовать операции сложения и вычитания двух натуральных 16-ричных чисел.
Описание интерфейса модуля
Интерфейс представлен на рисунке 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.
Таким образом, разработанный модуль удовлетворяет всем необходимым требованиям при выполнении операций сложения и вычитания. Така
Заключение
Вопросы изучения систем счисления являются одними из базовых вопросов информатики и теории программирования, так как один разряд двоичной системы представляет собой не что иное, как один бит, а два разряда шестнадцатеричной системы представляют собой один байт. В современных компьютерах информация кодируется в байтах, поэтому во многих случаях удобно использовать шестнадцатеричную систему счисления. Помимо прочего, шестнадцатеричную систему используют в низкоуровневом программировании, в компьютерном дизайне при кодировании цветов изображений, в некоторых системах кодировки информационных символов и т.п.
В представленной курсовой работе проанализированы основные существующие системы позиционного счисления. Подробно исследованы вопросы выполнения арифметических операций над натуральными числами в шестнадцатеричной системе счисления. Разработан программный модуль на языке C# в среде Visual Studio 2017, позволяющий реализовать сложение и вычитание натуральных чисел в шестнадцатеричной системе счисления. Проведены исследования разработанного модуля на примерах, рассмотренных в теоретической части и дополнительных примерах, позволяющих сделать вывод о надежности разработанного программного обеспечения в различных нестандартных ситуациях.
Список используемой литературы
- Гашков С. Б. Системы счисления и их применение. – М.: МЦНМО, 2004. – 52 с.
- Микушин А.В., Сажнев А.М., Сединин В.И. Цифровые устройства и микропроцессоры. СПб, БХВ-Петербург, 2010. – 832 с.
- Стахов А. Роль систем счисления в истории компьютеров // https://mirznanii.com/a/118900/rol-sistem-schisleniya-v-istorii-kompyuterov
- Двоичная и шестнадцатиричная системы счисления// https://microkontroller.ru/programmirovanie-mikrokontrollerov-avr/dvoichnaya-i-shestnadtsatirichnaya-sistemyi-schisleniya.
- Смирнов В. Шестнадцатеричная арифметика // http://www.vsmirnov. ru /articles/hexmetric.html.
- Шилдт Г. C# 4.0: полное руководство. : Пер. с англ. – М. : ООО "И.Д. Вильямс", 2011. – 1056 с.
Приложение. Листинг программы
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"; }