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

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

Содержание:

ВВЕДЕНИЕ

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

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

Целью данного курсового проекта является создание прикладного программного обеспечения, а конкретнее – приложения-калькулятора для осуществления операций с натуральными[1] числами в шестнадцатеричной системе счисления.

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

  • изучение и анализ литературы, посвященной системам счисления;
  • краткое изложение общих сведений о системах счисления;
  • классификация и систематизация алгоритмов для преобразования чисел из одной системы счисления в другую и правил арифметических операций, которые будут использованы в создаваемой программе;
  • проработка и исследование литературы, посвященной языкам программирования высокого уровня;
  • выбор (и его обоснование) языка программирования и среды разработки;
  • постановка задачи на программирование и определение требований к разрабатываемому программному продукту;
  • разработка и реализация модуля для выполнения операций с натуральными числами в шестнадцатеричной системе счисления;
  • демонстрация работы созданного приложения;
  • подведение итогов и формирование выводов.

Объектом настоящего исследования являются системы счисления, алгоритмы для перевода чисел между ними и для осуществления арифметических действий в них.

Предмет исследования – разработка программного продукта для выполнения операций с натуральными числами в шестнадцатеричной системе счисления.

Настоящая учебно-исследовательская работа включает в себя две главы.

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

Вторая глава посвящена описанию разработки и реализации программного обеспечения (консольного приложения-калькулятора) на языке высокого уровня для выполнения операций с натуральными числами в шестнадцатеричной системе счисления.

1 Теоретические основы систем счисления

1.1 Общие сведения о системах счисления

«Система счисления или нумерация – это способ записи (обозначения) чисел. Символы, при помощи которых записываются числа, называются цифрами, а их совокупность – алфавитом системы счисления. Количество цифр, составляющих алфавит, называется его размерностью». [2, с. 13]

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

Наиболее известный представитель непозиционных систем – римская система счисления. Значение (величина) цифры в непозиционной системе счисления не зависит от ее положения в числе.

В позиционной системе счисления значение числа определяется не только набором входящих в него знаков, но и их местом (разрядом) в последовательности цифр, образующих это число, так, цифра 3 в числах 36 и 123 обозначает соответственно 30 и 3

«Количество символов, применяемых в позиционной системе счисления, называется ее основанием. Например, в десятичной системе счисления используется десять символов (цифр): 0 – 9, а основанием системы является число десять.

В общем случае в такой позиционной системе счисления с основанием q любое число x может быть представлено в виде полинома разложения:

,

(1)

где – запись числа в системе счисления с основанием q; q – основание системы счисления; – целые числа, меньше q; n – число разрядов в целой части числа; m – число разрядов в дробной части числа.

Для обозначения системы счисления ее основание указывается в индексе. Изображение числа A в виде последовательности коэффициентов полинома является его условной сокращенной (свернутой) записью (кодом):

(2)

В информатике применяют позиционные системы счисления с недесятичным основанием: двоичную, восьмеричную и шестнадцатеричную, т. е. системы счисления с основанием q = 2k , где k = 1, 2, 3, 4».[7]

В шестнадцатеричной системе счисления алфавит состоит из 16 знаков (латинских букв и цифр): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, А (10), В (11), С (12), D (13), Е (14), F (15). Основание этой системы счисления .

1.2 Перевод натурального десятичного числа в q-ичную систему счисления

Перевод натурального десятичного числа в q-ичную систему счисления производится по следующему алгоритму:

  1. Исходное число a делится на q в десятичной системе счисления и в качестве нового значения десятичного числа a запоминается целая часть результата от деления.
  2. Остаток от деления меняется на эквивалентную цифру в q-ичной системе счисления и добавляется слева к вычисленным ранее символам
    q-ичной записи числа a (так, первая вычисленная цифра будет последней в
    q-ичном числе).
  3. Выполнение двух предыдущих пунктов повторяется до тех пор, пока число a (то есть очередное частное от деления) не станет меньше q. Полученная таким образом целая часть последнего результата деления также приписывается слева к полученным ранее цифрам q-ичного числа a, то есть первое частное, меньшее q будет являться первой цифрой в q-ичной записи числа a.

1.3 Перевод натурального q-ичного числа в десятичную систему счисления

Перевод натурального q-ичного числа в десятичную систему счисления производится по следующему алгоритму:

  1. Каждая цифра q-ичного числа переводится в десятичную систему.
  2. Полученные числа нумеруются по возрастанию справа налево, начиная с нуля.
  3. Десятичное число, эквивалентное каждой q-ичной цифре, умножается на qk , где k – номер этой цифры, результаты суммируются, при этом все арифметические действия производятся в десятичной системе.

1.4 Перевод натуральных чисел между системами счисления с основаниями 2, 8, 16

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

Таблица 1 – Соответствие чисел позиционных систем счисления[2]

Двоичная

Восьмеричная

Шестнадцате­ричная

0

0

0

1

1

1

10

2

2

11

3

3

100

4

4

101

5

5

110

6

6

111

7

7

1000

10

8

1001

11

9

1010

12

A

1011

13

B

1100

14

C

1101

15

D

1110

16

E

1111

17

F

1.5 Арифметические операции над натуральными числами в позиционных системах счисления

Все арифметические операции в позиционных системах выполняются по известным по десятичной системе правилам, так как они опираются на правила выполнения действий над соответствующими полиномами.

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

При вычитании из меньшего числа большего производится заем из старшего разряда».[4, c. 36]

Умножение можно рассматривать как суммирование:

(3)

Деление можно рассматривать как многократное вычитание (из делимого вычитается делитель до тех пор, пока результат не станет неположительным):

(4)

Остаток от деления вычисляется по формуле (при делении нацело равен нулю):

.

(5)

где r – остаток от деления; c – частное; a – делимое; b – делитель.

Для всех позиционных систем счисления справедливы одинаковые законы арифметики: переместительный, сочетательный, распределительный.

2 Реализация на языке высокого уровня модуля для выполнения операций над натуральными шестнадцатеричными числами

2.1 Выбор языка программирования и среды разработки

Создаваемое программное обеспечение будет написано на языке программирования высокого уровня Паскаль в свободно распространяемой интегрированной среде разработки PascalABC.NET.

Паскаль – один из самых популярных языков программирования высокого уровня. Его автором в 1968 году стал профессор Цюрихского Института информатики Никлаус Вирт.

«Важнейшей особенностью Паскаля является воплощенная идея структурного программирования. Другой существенной особенностью является концепция структуры данных как одного из фундаментальных понятий». [3, c. 15]

Основные достоинства языка Паскаль:

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

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

2.2 Постановка задачи на программирование

Разрабатываемый программный продукт должен представлять собой законченное приложение с понятным консольным интерфейсом, созданное на языке высокого уровня Паскаль (в среде разработки PascalABC.NET).

Назначение составляемой программы – выполнение операций с натуральными числами в шестнадцатеричной системе счисления.

Создаваемое приложение-калькулятор должно функционировать следующим образом:

  1. Запрашивать у пользователя номер действия (операции), которое потребуется выполнить (если введен несуществующий номер операции, программа должна завершать работу, выводя перед этим сообщение об ошибке на экран, иначе – продолжать работу):
  • сложение шестнадцатеричных чисел (1);
  • умножение шестнадцатеричных чисел (2);
  • вычитание шестнадцатеричных чисел (3);
  • деление шестнадцатеричных чисел (4);
  • перевод шестнадцатеричного числа в двоичную, восьмеричную и десятичную системы счисления (5);
  • перевод в шестнадцатеричную из двоичной, восьмеричной или десятичной системы счисления (6);
  1. Осуществлять ввод данных для выбранной операции, то есть натуральных шестнадцатеричных чисел и при преобразовании в шестнадцатеричное число основания системы счисления (2, 8 или 10), из которой осуществляется перевод, с клавиатуры.
  2. Производить проверку входных данных, если введены некорректные значения, программа должна запрашивать повторный ввод, выводя перед этим соответствующее сообщение на экран. Также для исключения ошибок при дальнейших вычислениях из чисел должны удаляться незначащие нули слева, и не должно иметь значения, какие латинские буквы введены в качестве шестнадцатеричных цифр – большие или малые.
  3. Выполнять выбранное действие (причем, при выполнении деления должна производиться проверка – не введен ли в качестве делителя ноль, при вычитании – должен выводиться знак разности – «+» или «−»).
  4. Выводить результат на экран.

Также программа должна выводить все необходимые пояснения и подсказки, быть законченной и удобной для использования.

2.3 Листинг программного кода

Для каждой операции с натуральными шестнадцатеричными числами, а также для проверки правильности введенных чисел написаны отдельные подпрограммы-функции, все они вынесены в отдельный модуль modul16.pcu.

Ниже представлены листинги основной программы и вышеупомянутого модуля modul16.

Блок-схемы алгоритмов основной программы и подпрограмм, выполненные в MS Visio, приведены в Приложении А.

2.3.1 Текст основной программы

program ss16;

uses crt, modul16;

procedure vvod(var s: string; e: string; ss: byte);//ввод ss-ного числа

begin

repeat//цикл для ввода и проверки ss-ного числа

write(e);

readln(s);

writeln;

if (proverk(s, ss) = false) then writeln('Число введено неверно, повторите ввод!');

until proverk(s, ss);//пока условие ложно цикл работает

while ((s[1] = '0') and (length(s) > 1)) do delete(s, 1, 1);//удаляем незначащие нули слева числа

end;

var

s, s1: string;//введенное число

n: char;//цифра из меню, которую выбирает пользователь

o: integer;//основание сс

i: integer;//код ошибки процедуры val

begin

clrscr;//процедура очистки экрана из модуля crt

textcolor(10);//далее вывод салатовым цветом

writeln('ПРОГРАММА ДЛЯ ВЫПОЛНЕНИЯ ОПЕРАЦИЙ С НАТУРАЛЬНЫМИ 16РИЧНЫМИ ЧИСЛАМИ');

textcolor(14);//далее вывод желтым цветом

writeln(#10, 'Выберите действие:');//#10 - переход на следующую строку

textcolor(15);//далее вывод белым цветом

writeln(' * 1 - сложение 16ричных чисел');

writeln(' * 2 - умножение 16ричных чисел');

writeln(' * 3 - вычитание 16ричных чисел');

writeln(' * 4 - деление 16ричных чисел');

writeln(' * 5 - перевод из 16ричной в 2ную, 8ричную и 10ную системы cчисления');

writeln(' * 6 - перевод в 16ричную из 2ной, 8ричной или 10ной системы cчисления');

writeln(' * любая другая цифра или буква - выход из программы.');

write('Ваш выбор - ? ');

readln(n);

writeln;//пропуск строки

textcolor(14);//далее вывод желтым цветом

if n in ['1'..'7'] then writeln('Выполнение выбранной операции:')//если введен существующий номер действия

else writeln('Операции с таким номером не существует!');//если введен несуществующий номер действия

textcolor(15);//далее вывод белым цветом

case n of

'1'://если выбран пункт 1

begin

vvod(s, 'Введите первое 16ричное слагаемое (должно состоять из цифр от 0 до 9 и латинскихбукв от A до F): ', 16);

vvod(s1, 'Введите второе 16ричное слагаемое (должно состоять из цифр от 0 до 9 и латинскихбукв от A до F): ', 16);

writeln('Сумма данных 16ричных чисел: ', sum(s, s1));

end;

'2': // если выбран пункт 2

begin

vvod(s, 'Введите первый 16ричный множитель (должно состоять из цифр от 0 до 9 и латинскихбукв от A до F): ', 16);

vvod(s1, 'Введите второй 16ричный множитель (должно состоять из цифр от 0 до 9 и латинскихбукв от A до F): ', 16);

writeln('Произведение данных 16ричных чисел: ', proiz(s, s1));

end;

'3':// если выбран пункт 3

begin

vvod(s, 'Введите 16ричное уменьшаемое (должно состоять из цифр от 0 до 9 и латинскихбукв от A до F): ', 16);

vvod(s1, 'Введите 16ричное вычитаемое (должно состоять из цифр от 0 до 9 и латинских букв от A до F): ', 16);

writeln('Разность данных 16ричных чисел: ', raz(s, s1));

end;

'4':// если выбран пункт 4

begin

vvod(s, 'Введите 16ричное делимое (должно состоять из цифр от 0 до 9 и латинских букв от A до F): ', 16);

vvod(s1, 'Введите 16ричный делитель (должно состоять из цифр от 0 до 9 и латинских букв отA до F): ', 16);

writeln('Частное от деления данных 16ричных чисел: ', del(s, s1));

if (del(s, s1) <> 'На ноль делить нельзя!') and (del(s, s1) <> '0') then writeln('Остаток от деления данных 16ричных чисел: ', raz(s, proiz(s1, del(s, s1))));

end;

'5':// если выбран пункт 5

begin

vvod(s, 'Введите 16ричное число для перевода в 2ную, 8ричную и 10ную сс (должно состоятьиз цифр от 0 до 9 и латинских букв от A до F): ', 16);

writeln('Число в 2ной системе счисления: ', iz16v2(s));

writeln('Число в 8ной системе счисления: ', iz2v8(iz16v2(s)));

writeln('Число в 10ной системе счисления: ', iz16v10(s));

end;

'6':// если выбран пункт 6

begin

repeat//ввод и проверка основания сс

write('Введите основание системы счисления (2, 8 или 10): ');

readln(s);

val(s, o, i);//преобразуем строку в число

if not ((o = 2) or (o = 8) or (o = 10)) then writeln('Основание системы счисления введено неверно, повторите ввод!');

writeln;

until (o = 2) or (o = 8) or (o = 10);

vvod(s, 'Введите число для перевода (должно состоять из цифр от 0 до ' + chr(47 + o) + '): ', o);

write('Число в 16ричной системе счисления: ');

if o = 2 then writeln(iz2v16(s))

else if o = 8 then writeln(iz2v16(iz8v2(s)))

else writeln(iz10v16(s));

end;

end;

writeln;

textcolor(14);//далее вывод желтым цветом

writeln('-----------------------------------------------------');

textcolor(15);//далее вывод белым цветом

writeln;

writeln('Для завершения программы нажмите любую клавишу...');

readkey;//пауза перед закрытием консоли

end.

2.3.2 Текст модуля modul16

unit modul16;

interface//интерфейсная часть модуля

function proverk(chislo: string; ss: integer): boolean;

function iz16v2(c16: string): string;

function iz16v10(c16: string): string;

function iz2v8(c2: string): string;

function iz2v16(c2: string): string;

function iz8v2(c8: string): string;

function iz10v16(c10: string): string;

function sum(c1, c2: string): string;

function proiz(c1, c2: string): string;

function raz(c1, c2: string): string;

function del(c1, c2: string): string;

implementation//исполняемая часть модуля

function zam(s: char): integer;//замена 16ричной цифры на 10ное число

begin

case s of//цифра заменяется соответствующей 10ной

'a', 'A': zam := 10;

'b', 'B': zam := 11;

'c', 'C': zam := 12;

'd', 'D': zam := 13;

'e', 'E': zam := 14;

'f', 'F': zam := 15;

else zam := ord(s) - 48;

end;

end;

function proverk(chislo: string; ss: integer): boolean;//проверяет введено ли 2ное, 8ричное, 10ное или 16ричное число правильно

var

c: set of char = ['0'..'9'];//символы, из которых состоит 10ричное число

flag: boolean;//логическая переменная равна true, только если число введено правильно

i: integer;//номер цифры в числе

begin

flag := true;

//далее формирование алфавита сс

if ss <> 16 then for i := ss to 9 do c := c - [chr(48 + i)]//цикл запускается, если число 2ное или 8ричное

else c := c + ['a'..'f', 'A'..'F'];//если число 16ричное

//далее проверка правильно ли введено число

for i := 1 to length(chislo) do if not (chislo[i] in c) then flag := false;//если символ числа имеет недопустимое значение

if length(chislo) = 0 then flag := false;//если число не введено

proverk := flag;

end;

function iz16v2(c16: string): string;//перевод из 16ричной сс в 2ную

var

i: integer;//номер цифры в числе

n: string;//строка, в которую записывается 2ное число

begin

n := '';//очистка строки

for i := 1 to length(c16) do//проходим все цифры 16ричного числа

case c16[i] of//цифра заменяется соответствующей 2ной тетрадой

'0': n := n + '0000';

'1': n := n + '0001';

'2': n := n + '0010';

'3': n := n + '0011';

'4': n := n + '0100';

'5': n := n + '0101';

'6': n := n + '0110';

'7': n := n + '0111';

'8': n := n + '1000';

'9': n := n + '1001';

'a', 'A': n := n + '1010';

'b', 'B': n := n + '1011';

'c', 'C': n := n + '1100';

'd', 'D': n := n + '1101';

'e', 'E': n := n + '1110';

'f', 'F': n := n + '1111';

end;

while ((n[1] = '0') and (length(n) > 1)) do delete(n, 1, 1);//удаляем незначащие нули слева

iz16v2 := n;

end;

function iz16v10(c16: string): string;//перевод из 16ричной сс в 10ную

var

i, j: integer;//счетчики циклов

n, m: uint64;//искомое 10ное число

s: string;

begin

n := 0;//обнуляем 10ное число

for i := 1 to length(c16) do//проходим все цифры 16ричного числа

begin

m := 1;

for j := 1 to length(c16) - i do m := m * 16;//возведение 16 в степень

if (18446744073709551615 - zam(c16[i]) * m) <= n then//проверка не выходит ли полученное число за границы uint64

begin

iz16v10 := 'слишком большое число для перевода';

exit;

end;

n := n + zam(c16[i]) * m;//сложение цифры, умноженных на 16 в степени разряда

end;

str(n, s);//перевод числа в строку

iz16v10 := s;

end;

function iz2v8(c2: string): string;//перевод из 2ной сс в 8ричную

var

i: integer;//номер цифры в числе

n: string;//строка, в которую записывается 8ричное число

n1: string;//строка, в которую записывается триада

j: integer;//8ричная цифра

a: array [0..7] of string = ('000', '001', '010', '011', '100', '101', '110', '111');//все триады

begin

n := '';//очистка строки

while length(c2) mod 3 <> 0 do insert('0', c2, 1);//вставляем незначащие нули слева, для разбивки по 3 цифры (триады)

i := 1;//номер первой цифры 2ного числа

repeat//замена 2ных триад на 8ричные цифры

n1 := copy(c2, i, 3);//запись триады

for j := 0 to 7 do if a[j] = n1 then n := n + j;

i := i + 3;

n1 := '';//очистка строки

until i >= length(c2);//пока число не закончится

while ((n[1] = '0') and (length(n) > 1)) do delete(n, 1, 1);//удаляем незначащие нули слева

iz2v8 := n;

end;

function iz2v16(c2: string): string;//перевод из 2ной сс в 16ричную

var

i: integer;//номер цифры в числе

n: string;//строка, в которую записывается 16ричное число

n1: string;//строка, в которую записывается триада

j: integer;//16ричная цифра в 10сс

a: array [0..15] of string = ('0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111');//все тетрады

begin

n := '';//очистка строки

while length(c2) mod 4 <> 0 do insert('0', c2, 1);//вставляем незначащие нули слева, для разбивки по 4 цифры (тетрады)

i := 1;//номер первой цифры 2ного числа

repeat//замена 2ных тетрад на 16ричные цифры

n1 := copy(c2, i, 4);//запись тетрады

for j := 0 to 9 do if a[j] = n1 then n := n + j;

for j := 10 to 15 do if a[j] = n1 then n := n + chr(j + 55);

i := i + 4;

n1 := '';//очистка строки

until i >= length(c2);//пока число не закончится

while ((n[1] = '0') and (length(n) > 1)) do delete(n, 1, 1);//удаляем незначащие нули слева

iz2v16 := n;

end;

function iz8v2(c8: string): string;//перевод из 8ричной сс в 2ную

var

i: integer;//номер цифры в числе

n: string;//строка, в которую записывается 2ное число

begin

n := '';//очистка строки

for i := 1 to length(c8) do//проходим все цифры 16ричного числа

case c8[i] of//цифра заменяется соответствующей 2ной тетрадой

'0': n := n + '000';

'1': n := n + '001';

'2': n := n + '010';

'3': n := n + '011';

'4': n := n + '100';

'5': n := n + '101';

'6': n := n + '110';

'7': n := n + '111';

end;

while ((n[1] = '0') and (length(n) > 1)) do delete(n, 1, 1);//удаляем незначащие нули слева

iz8v2 := n;

end;

function iz10v16(c10: string): string;//перевод из 10ной сс в 16ричную

var

i: integer;//код ошибки процедуры val

n: string;//искомое 16ное число

c: uint64;//10ное число

q: string[16] = '0123456789ABCDEF';//цифры 16ной сс

begin

val(c10, c, i);//преобразуем строку в число

if i <> 0 then//проверка не выходит ли полученное число за границы uint64

begin

iz10v16 := 'слишком большое число для перевода';

exit;

end;

n := '';//очищаем строку

if c = 0 then n := '0';//если введен 0

while c > 0 do

begin

n := q[c mod 16 + 1] + n;//остаток от деления на 16 записываем в начало строки

c := c div 16;//сокращаем

end;

iz10v16 := n;

end;

function sum(c1, c2: string): string;//сумма 16ричных чисел

var

i: integer;//номер цифры в строке (числе)

s: string;//строка, в которую записывается сумма

r: array[1..100] of integer;//массив с суммами цифр

q: string[16] = '0123456789ABCDEF';//цифры в 16ной сс

begin

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 + 1] := zam(c1[i]) + zam(c2[i]);//сложение без переноса разряда

r[1] := 0;

for i := length(c1) + 1 downto 2 do//переносы разрядов

if r[i] > 15 then//если переполнение в текущей цифре суммы

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 успешно реализован требуемый программный продукт – консольное приложение-калькулятор для выполнения операций с натуральными числами в шестнадцатеричной системе счисления.

При написании программы были использованы операторы ввода и вывода, три вида циклов (с предусловием, с постусловием и с параметром), условный оператор, оператор выбора, применены многочисленные встроенные функции языка, созданы пользовательские подпрограммы и модуль, вследствие чего были освоены и закреплены навыки программирования на языке Паскаль.

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

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

    1. Абрамов В. Г., Трифонов Н. П., Трифонова Г. Н. Введение в язык Паскаль. Учебное пособие. – М.: Кронус. 2016. – 384 с.
    2. Андреева Е. В. Математические основы информатики. – М.: Бином. Лаборатория знаний, 2015. – 328 с.
    3. Андреева Т. А. Программирование на языке Pascal. Учебное пособие. – М.: Интуит.ру, 2015. – 234 с.
    4. Гашков С. Б. Системы счисления и их применение. – М.: МЦНМО, 2017. – 52 с.
    5. Медведик В. И. Практика программирования на языке Паскаль. Задачи и решения. – М.: ДМК-Пресс. 2015. – 590 с.
    6. Учебник по информатике и программированию на языке высокого уровня [Электронный ресурс] – URL: http://kuzelenkov.narod.ru/mati/book/informat_prog.html (дата обращения: 18.07.2019).
    7. Учебник по информатике [Электронный ресурс] – 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.

Рисунок 24. Работа программы

Случай, введен делитель равный нулю, продемонстрирован на рисунке 25.

Рисунок 25. Работа программы

Случаи, когда основание системы счисления вводится с ошибками (число не равно 2, 8 или 10, имеет ненужные нули слева или не введено вовсе), отображен на рисунке 26.

Рисунок 26. Работа программы

  1. Натуральные числа – числа, с помощью которых можно посчитать предметы (то есть целые неотрицательные числа).

  2. Заливкой выделены ячейки, в которых находятся цифры соответствующей системы счисления.