Файл: Разработка модуля для выполнения операций с натуральными числами в шестнадцатеричной системе счисления (Теоретические основы систем счисления ).pdf
Добавлен: 29.02.2024
Просмотров: 51
Скачиваний: 0
СОДЕРЖАНИЕ
1 Теоретические основы систем счисления
1.1 Общие сведения о системах счисления
1.3 Перевод натурального q-ичного числа в десятичную систему счисления
1.5 Арифметические операции над натуральными числами в позиционных системах счисления
2.1 Выбор языка программирования и среды разработки
2.2 Постановка задачи на программирование
begin
r[i - 1] := r[i - 1] + 1;//единица переноситься на разряд
r[i] := r[i] - 16;//вычисление текущей цифры суммы
end;
for i := 1 to (length(c1) + 1) do s := s + q[r[i] + 1];//переводим 10ные числа в 16ричные символы
if s[1] = '0' then delete(s, 1, 1);//удаляем незначащий ноль слева (если он есть),он может быть только 1
sum := s;
end;
function proiz(c1, c2: string): string;//произведение 16ричных чисел
var
i: integer;//номер цифры в строке (числе)
s, p: string;//количество сложений и слагаемое
begin
s := '0';//обнуляем количество слагаемых
p := '0';//обнуляем слагаемое
for i := 1 to Length(c2) do c2[i] := Upcase(c2[i]);//малые буквы в большие
while (s <> c2) do//пока сложение не выполниться нужно количество раз
begin
s := sum('1', s);//количество суммирований
p := sum(p, c1);//суммирующиеся слагаемые
end;
proiz := p;
end;
function raz(c1, c2: string): string;//разность 16ричных чисел
var
i: integer;//номер цифры в строке (числе)
s: string;//строка, в которую записывается разность (без знака)
p: char;//знак числа
r: array[1..100] of integer;//массив с разностями цифр
q: string[16] = '0123456789ABCDEF';//цифры в 16ной сс
a, b: uint64;//10ные числа (для сравнения)
begin
p := '+';//знак числа
val(iz16v10(c1), a, i);//преобразуем строку в 10ное число
val(iz16v10(c2), b, i);//преобразуем строку в 10ное число
if a < b then//если из меньшего вычитается большее
begin
p := '-';//число будет отрицательное (с минусом)
swap(c1, c2);//первое число (уменьшаемое) должно быть больше
end;
while length(c1) > length(c2) do insert('0', c2, 1);//вставляем незначащие нули слева пока числа не будут одинаковой длины
while length(c1) < length(c2) do insert('0', c1, 1);//вставляем незначащие нули слева пока числа не будут одинаковой длины
for i := 1 to length(c1) do r[i] := zam(c1[i]) - zam(c2[i]);//вычитание без займов
for i := length(c1) downto 2 do//займы у цифр слева и окончательные вычисления
if (r[i] < 0) then//если требуется занять единицу
begin
r[i] := r[i] + 16;//вычисление разности цифр
r[i - 1] := r[i - 1] - 1;//у предыдущей цифры занимаем единицу
end;
for i := 1 to length(c1) do s := s + q[r[i] + 1];//переводим 10ные числа в 16ричные символы
while ((s[1] = '0') and (length(s) > 1)) do delete(s, 1, 1);//удаляем незначащие нули слева
raz := p + s;//добавляем к числу знак
end;
function del(c1, c2: string): string;//деление 16ричных чисел
var
i: integer;//номер цифры в строке (числе)
s, p: string;//частное
z: char;//знак разности
begin
if (c2[1] = '0') then//если попытка поделить на 0
begin
del := 'На ноль делить нельзя!';
exit;
end;
p := c1;
z := '+';
i := 0;//обнуляем счетчик
while (z = '+') do//вычитаем делитель, пока знак делимого не поменяется
begin
i := i + 1;//считаем вычитание
p := raz(p, c2);//вычитаем из делимого делитель
z := p[1];//запоминаем знак
delete(p, 1, 1);//удаляем знак из разности
end;
str(i - 1, s);//записываем полученное 10ное частное в строку
del := iz10v16(s);//считали в 10ной сс, переводим в 16ричную
end;
end.
2.4 Результаты работы программы
При демонстрации работы созданного приложения будем сравнивать (для проверки) полученные в нем результаты с результатами, вычисленными с помощью математического пакета Scilab (рисунки 1, 2 и 3).
Рисунок 1. Результаты выполнения арифметических операций в Scilab
Рисунок 2. Перевод шестнадцатеричного числа в двоичную, восьмеричную и десятичную системы счисления в Scilab
Рисунок 3. Перевод чисел из двоичной, восьмеричной и десятичной систем счисления в шестнадцатеричную в Scilab
Сложение шестнадцатеричных натуральных чисел в разработанном приложении приведено на рисунке 4.
Рисунок 4. Сложение натуральных шестнадцатеричных чисел в программе
Умножение шестнадцатеричных натуральных чисел в созданном приложении показано на рисунке 5.
Рисунок 5. Умножение натуральных шестнадцатеричных чисел в программе
Вычитание шестнадцатеричных натуральных чисел в разработанной программе представлено на рисунке 6.
Рисунок 6. Вычитание натуральных шестнадцатеричных чисел в разработанной программе
Деление шестнадцатеричных натуральных чисел в созданной программе продемонстрированно на рисунке 7.
Рисунок 7. Деление натуральных шестнадцатеричных чисел в созданной программе
Перевод шестнадцатеричного натурального числа в двоичную, восьмеричную и десятичную системы счисления в разработанном приложении показан на рисунке 8.
Рисунок 8. Перевод шестнадцатеричного натурального числа в другие системы счисления в разработанной программе
Переводы из двоичной, восьмеричной и десятичной системы счисления в шестнадцатеричную в созданном приложении представлены на рисунках 9, 10 и 11 соответственно.
Рисунок 9. Перевод двоичного числа в шестнадцатеричную систему счисления в созданной программе
Рисунок 10. Перевод восьмеричного числа в шестнадцатеричную систему счисления в разработанной программе
Рисунок 11. Перевод десятичного числа в шестнадцатеричную систему счисления в созданной программе
Результаты, полученные в созданном приложении, и, вычисленные с помощью Scilab совпадают, следовательно, можем сделать вывод о том, что разработанная программа верно выполняет операции с натуральными шестнадцатеричными числами.
Работа созданной программы при ошибках ввода приведена в Приложении Б.
ЗАКЛЮЧЕНИЕ
В результате выполнения настоящей курсовой работы на языке высокого уровня Паскаль в свободно распространяемой интегрированной среде разработки PascalABC.NET успешно реализован требуемый программный продукт – консольное приложение-калькулятор для выполнения операций с натуральными числами в шестнадцатеричной системе счисления.
При написании программы были использованы операторы ввода и вывода, три вида циклов (с предусловием, с постусловием и с параметром), условный оператор, оператор выбора, применены многочисленные встроенные функции языка, созданы пользовательские подпрограммы и модуль, вследствие чего были освоены и закреплены навыки программирования на языке Паскаль.
Таким образом, выполнены ранее поставленная цель и задачи работы, приобретены важные практические навыки, позволяющие составлять математические модели, алгоритмы и программы для решения практических задач, что является необходимостью практически для любого современного специалиста.
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ
-
- Абрамов В. Г., Трифонов Н. П., Трифонова Г. Н. Введение в язык Паскаль. Учебное пособие. – М.: Кронус. 2016. – 384 с.
- Андреева Е. В. Математические основы информатики. – М.: Бином. Лаборатория знаний, 2015. – 328 с.
- Андреева Т. А. Программирование на языке Pascal. Учебное пособие. – М.: Интуит.ру, 2015. – 234 с.
- Гашков С. Б. Системы счисления и их применение. – М.: МЦНМО, 2017. – 52 с.
- Медведик В. И. Практика программирования на языке Паскаль. Задачи и решения. – М.: ДМК-Пресс. 2015. – 590 с.
- Учебник по информатике и программированию на языке высокого уровня [Электронный ресурс] – URL: http://kuzelenkov.narod.ru/mati/book/informat_prog.html (дата обращения: 18.07.2019).
- Учебник по информатике [Электронный ресурс] – URL: http://solidstate.karelia.ru/p/tutorial/informatics/index.htm (дата обращения: 20.07.2019).
Блок-схемы алгоритмов программы
Блок-схема алгоритма основной программы приведена на рисунке 12.
Сначала пользователь решает, какую операцию нужно выполнить и, в зависимости от его выбора сначала запрашивается ввод (через отдельную подпрограмму-процедуру vvod, в которой происходит так же проверка допустимости введенных значений) исходных данных, а затем вызывается нужная подпрограмма из модуля modul16 и выводится результат.
Рисунок 12. Блок-схема алгоритма основной программы
Блок-схема алгоритма подпрограммы-функции для проверки правильности введенного числа (proverk) представлена на рисунке 13.
Данная функция (в нее передается введенное число в виде строки и основание системы счисления, в которой записано число), возвращает true, если число введено верно (то есть все цифры числа входят в алфавит заданной системы счисления и введена не пустая строка) и false – в противном случае. Основание системы счисления, передаваемое в функцию, может быть только числом 2, 8, 16 (проверка этого организована в основной программе).
Рисунок 13. Блок-схема подпрограммы-функции proverk
Блок-схема алгоритма (подробно описан в пункте 1.4 настоящей работы) подпрограммы-функции для перевода шестнадцатеричного числа в двоичную систему счисления (iz16v2) изображена на рисунке 14.
Рисунок 14. Блок-схема подпрограммы-функции iz16v2
Блок-схема алгоритма (подробно описан в пункте 1.3 настоящей работы) подпрограммы-функции для перевода шестнадцатеричного числа в десятичную систему счисления (iz16v10) приведена на рисунке 15.
Рисунок 15. Блок-схема подпрограммы-функции iz16v10
Блок-схема алгоритма (подробно описан в пункте 1.4 настоящей работы) подпрограммы-функции для перевода двоичного числа в восьмеричную систему счисления (iz2v8) представлена на рисунке 16.
Рисунок 16. Блок-схема подпрограммы-функции iz2v8
Алгоритмы подпрограмм-функций для перевода из восьмеричной системы в двоичную систему счисления и из двоичной системы в шестнадцатеричную систему счисления (iz8v2 и iz2v16 соответственно) работают по тому же принципу, что и iz16v2 и iz2v8, только в первом случае вместо триад используются тетрады и наоборот – во втором случае.
Блок-схема алгоритма (подробно описан в пункте 1.2 настоящей работы) подпрограммы-функции для перевода десятичного числа в шестнадцатеричную систему счисления (iz10v16) представлена на рисунке 17.
Рисунок 17. Блок-схема подпрограммы-функции iz10v16
Блок-схема алгоритма (описан в пункте 1.5 настоящей работы) подпрограммы-функции для сложения натуральных шестнадцатеричных (sum) изображена на рисунке 18.
Рисунок 18. Блок-схема подпрограммы-функции sum
Блок-схема алгоритма (описан в пункте 1.5 настоящей работы) подпрограммы-функции для умножения натуральных шестнадцатеричных (proiz) приведена на рисунке 19.
Рисунок 19. Блок-схема подпрограммы-функции proiz
Блок-схема алгоритма (описан в пункте 1.5 настоящей работы) подпрограммы-функции для вычитания натуральных шестнадцатеричных (raz) изображена на рисунке 20. Данная функция, если из меньшего числа вычитается большее число, выводит результат со знаком «минус» (вычитает из большего числа меньшее и добавляет минус к разности), в противном случае – результат печатается со знаком «плюс».
Рисунок 20. Блок-схема подпрограммы-функции raz
Блок-схема алгоритма (описан в пункте 1.5 настоящей работы) подпрограммы-функции для нахождения частного от деления натуральных шестнадцатеричных (del) изображена на рисунке 21. Остаток от деления вычисляется в основной программе и выводится на экран только если частное и делитель не равны нулю, а рассчитывается он по формуле (5) из пункта 1.5 с использованием ранее описанных функций raz, proiz и del.
Рисунок 21. Блок-схема подпрограммы-функции del
Работа разработанной программы при ошибочном вводе
Случай, когда введен несуществующий номер операции или номер действия не введен вовсе, приведен на рисунке 22.
Рисунок 22. Работа программы
Случаи, когда исходное число вводится с ошибками (с недопустимыми цифрами, ненужными нулями слева или не введено вовсе), отображен на рисунке 23.
Рисунок 23. Работа программы
Случай, когда исходное уменьшаемое меньше вычитаемого, то есть результат вычитания должен получиться отрицательным, представлен на рисунке 24.