Изучение методики перевода из одной системы исчисления в другую и разработка программы для этой операции

Загрузить архив:
Файл: programi.zip (13kb [zip], Скачиваний: 62) скачать

      Ответственный за курсовой проект:

                   3РОЗМАХОВ Олег Георгиевич0    _______________

      Руководитель курсового проекта:

                   3ИОНИНА Татьяна Давыдовна0    _______________

                   _2К У Р С О В О Й      П Р О Е К Т

                        Тема курсового проекта:

        ИЗУЧЕНИЕ ПРОБЛЕМЫ ПЕРЕВОДА ИЗ ОДНОЙ СИСТЕМЫ ИСЧИСЛЕНИЯ

           В ДРУГУЮ И РАЗРАБОТКА ПРОГРАММЫ ДЛЯ ЭТОЙ ОПЕРАЦИИ

                       Студента:      гр. 05-204

                            2ДЕНЕГИНА Сергея

   4г. Москва


                         - 1 -

                  2О Г Л А В Л Е Н И Е

   1. Введение

   2. Постановка задачи

   3. Теоретическая основа решения задачи

   4. Методологический подход

   5. Алгоритм программы для перевода из одной

      системы исчисления в другую

   6. Текст программы с комментариями

   7. Подробные разъяснения по программе

   8. Как пользоваться программой


                         - 2 -

                  2I.В В Е Д Е Н И Е

   Проблема перевода из одной системы исчисления в дру-

гую очень часто встречается при программировании.Осо-

бенно часто  появляется такая проблема при программиро-

вании на Ассемблере.  Например приопределенииадреса

ячейки памяти, для получения двоичного или шестнадцати-

ричного эквивалентов десятеричного числа. Иногда встает

проблема увеличения скорости вычислений, и тогда прихо-

дит напомощьдвоичная  системаисчисления.Вэтой

системе исчисления  оченьбыстропроизводить операцию

умножения путем сдвига одного из операндовв  двоичном

виде влевона такое число позиций в которой стоит еди-

ница во втором операнде.

   Рассмотрим подробнеекак это осуществляется.Пусть

нам надо умножить число 1101 на 101 (оба числа в двоич-

ной системе исчисления).  Машина делаетэтоследующим

образом: она  беретчисло 1101,и если первый элемент

второго множителя  равен1 то она заносит его в сумму.

Затем сдвигает число 1101 влево на одну позицию,полу-

чая тем самым 11010 и если второй элемент второгомно-

жителя равен единице то тоже заносит его в сумму.Если

элемент второго множителя равен нулю то сумма неизме-

няется. В связи с этим,  если второй множитель содержит

много нулей, то операция умножения выполняется довольно


                        - 3 -

долго, т.к.машина проверяет каждую цифру второго мно-

жителя, в том числе и нули.Если же самому делать опе-

рациюумножения то нули можно пропустить и тогда умно-

жение сделается быстрее.

   Что касаетсяпримененияшестнадцатиричнойсистемы

исчисления то здесь тоже большиевозможности.  Во-пер-

вых,некоторые стандартные процедуры Паскаля и Си тре-

буют задачи параметров в шестнадцатиричнойсистеме,  а

во-вторых, такая  системаисчисленияочень удобна для

хранения информации, т.к. число в шестнадцатиричном ви-

де занимаетменьше объема диска чем тоже число в деся-

теричном, а тем более в двоичном виде.

   Таким образом мы убедились, что проблема перевода из

двоичной системы исчисления в десятеричную, из шестнад-

цатиричной в десятеричную и обратно очень актуальна.

                2II.ПОСТАНОВКА ЗАДАЧИ

   Из введения стало понятно, что наиболее часто встре-

чающиеся системы исчисления это двоичная,шестнадцати-

ричная и десятеричная.  Иногда встречается и восьмирич-

ная система исчисления, но это бывает так редко, что не

стоит на этом останавливаться.Итак,  наша задача осу-

ществить перевод из двоичной системы исчисления в деся-

теричную и шестнадцатиричную,из десятеричной в двоич-

ную и шестнадцатиричную и из шестнадцатиричной в двоич-

ную и  десятеричную,т.е.взаимно связать все эти три

системы исчисления.


                        - 4 -

       2III.ТЕОРЕТИЧЕСКАЯ ОСНОВА РЕШЕНИЯ ЗАДАЧИ

   Как же на практике осуществляется переводизодной

системы исчисления в другую? Попробуем разобраться.

   Допустим нам нужно перевести число 567десятеричной

системы в двоичную систему.Делается это следующим об-

разом: отыскивается максимальная степень двойки,чтобы

два вэтойстепени  быломеньшеили равно исходному

числу. В нашем случае это 9,т.к. 2^9=512, а 2^10=1024

что больше  нашегоначального числа.Таким образом мы

получили число разрядов результата.Оно равно  9+1=10.

Значит результат будет иметь вид 1ххххххххх, где вместо

х может стоять 1 или 0. Найдем вторую цифру результата.

Возведем двойку  встепень9  ивычтемиз исходного

числа: 567-2^9=55.  Затем сравниваем с числом  2^8=256.

Так как55меньше  256 то девятый разряд будет нулем,

т.е. результат уже примет  вид10хххххххх.Рассмотрим

восьмой разряд:  2^7=128 > 55,значит и восьмой разряд

будет нулем.Т.к. 2^6=64 то седьмой разряд равен нулю.

Таким образом  мыполучиличетыре  старшихразряда и

число примет вид 1000хххххх.Вычисляем 2^5=32 и видим,

что 32<55,значит шестой разряд равен 1 (результат

10001ххххх), остаток 55-32=23. 2^4=16 < 23 - пятый раз-

ряд 1=>100011хххх.  Остаток23-16=7.2^3=8 > 7 =>

1000110ххх. 2^2=4 < 7 => 10001101хх, остаток 3. 2^1=2 <

3 => 100011011х, остаток 1. 2^0=1 = 1 => 1000110111. Мы

получили конечный результат.


                        - 5 -

   Теперь попробуем перевести тоже число 567,но уже в

шестнадцатиричную систему.Подход примернотакой  же.

Определим максимальный разряд.Т.к.  16^2=256 < 567, а

16^3=4096 > 567,  то максимальный разряд 2+1=3. Опреде-

лим число,  котороебудетстоять  втретьем разряде.

Ищется максимальный множитель в пределах от1  до15,

чтобы текущая  степеньшестнадцатиумноженная на этот

множитель была меньше или равнялась исходному числу(а

в дальнейшем - остатку). В нашем примере этот множитель

2, т.к.256*2=512 < 567,а 256*3=768>  567.Значит

старший разряд  нашего результата будет равен 220,и ре-

зультат примет вид 2хх, где вместо х могут стоять любые

цифры или      буквы     из     ниже     перечисленных:

0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F. Вычисляем     остаток:

567-2*16^2=55. Определим  чтобудетстоять  во втором

разряде. Так как 3*16^1=48 < 55,а 4*16^1=64 > 55,то

во втором   разряде   будет   стоять   цифра230.Оста-

ток=55-3*16^1=7. Определяем первый разряд:т.к. 16^0=1

то цифра первого разряда равна остатку,т.е.  270. Таким

образом мы получили число 22370, но уже в шестнадцатирич-

ной системе исчисления.

   Операция перевода из десятеричнойсистемывыглядит

гораздо проще.  Рассмотримеена  примере перевода из

шестнадцатиричной системы в десятеричную.

   Допустим нам нужно перевести число 24A3F 0в десятерич-

ную систему.Берем старший (4 ый) разряд и возводим 16

в степень 4-1=3, получаем 16^3=4096. Полученный резуль-

тат умножаем на значение четвертогоразряда,  т.е.4.


                        - 6 -

Получается 4096*4=16384.  Этотрезультатмы заносим в

сумму. Переходим к следующемуразряду:  16^2=256.256

нужно умножить на значение третьего разряда т.е. A. Как

известно в шестнадцатиричной системеисчисления  буквы

от A до F символизируют числа от 10 до 15 ( A=10, B=11,

C=12, D=13, E=14, F=15). Умножив 256 на 10 получим 2560

и этот результат добавляем к сумме, в которой у нас по-

ка было 16384. В сумму у нас получилось 18944. Перехо-

дим ко второму разряду:  3*16^1=48, добавив это в сумму

получим 18992. И последний разряд: 15*16^0=15. Конечная

сумма равна 2190070. Мы получили результат в десятеричной

системе исчисления.

             2IV.МЕТОДОЛОГИЧЕСКИЙ ПОДХОД

   Рассматривая перевод   из    десятеричной    системы

исчисления в двоичную и шестнадцатиричную,можно найти

много общего. В обоих случаях мы ищем максимальную сте-

пень, затем в обоих случаях сравниваем остаток с числом

возведенным в  степеньразряда.Единственная  разница

заключается в том,  что при переводе в двоичную систему

основанием степени служит  двойка,апри  переводев

шестнадцатиричную систему основанием служит число шест-

надцать. Возникает вопрос:а нельзя ли объединитьоба

этих перевода  водну процедуру,в которую в качестве

параметров передавать основание степени? При более под-

робном рассмотрении  переводав двоичную систему можно

заметить, что сравнивая остаток со степеньюдвойки  мы


                        - 7 -

отмечаем только как бы два состояния:да или нет, т.е.

1 или 0,а при переводе в шестнадцатиричную систему мы

рассматриваем не  простостепень числа шестнадцати,а

произведение этой степени на величину будущего разряда.

Возникает вопрос: а не одно ли это и тоже. Ведь умножив

число на единицу мы его неизменяем,  аследовательно

нет разницы  междутем,сравнивать степень с остатком

или с остатком умноженным на единицу. Таким образом вы-

яснилось, что  перевод из десятеричной системы исчисле-

ния в двоичную и в шестнадцатиричную можно осуществлять

одной процедурой,  в которую в качестве параметра пере-

давать основание  степени,т.е.   основание   конечной

системы исчисления.

   Чтобы не усложнять программу и неделатьмножество

операторов условного перехода в зависимости от того,к

какой системе исчисления  принадлежитисходноечисло,

ввод этого числа осуществляется единым блоком, и исход-

ное число в результате выполнения этого блока записыва-

ется ввиде строковой переменной и передается на обра-

ботку следующему блоку.  Второй блок поступившую в него

строку символов обрабатывает таким образом,что на вы-

ходе этого блока получается числовое значение в десяте-

ричной системе  исчисленияисходногочисла.  И третий

заключительный блок преобразует это числовое значение в

строку символов,  котораябудетсодержать результат в

системе исчисления, которая требовалась.

   В результатетакогоподхода к решению задачи алго-

ритм значительно упрощается, т.к. в нем нет ветвлений.


                        - 10 -

        2VII. ПОДРОБНЫЕ РАЗЪЯСНЕНИЯ ПО ПРОГРАММЕ

   Программа начинаетсястандартнойстрокой:

   Program Perevod;

   Далее следуетописательнаячасть  программы.   Она

состоит из нескольких разделов:

   - Uses:указывает какиевнешние  TPUфайлыбудет

использовать программа (это специфика Turbo Pascal).

   - Const: описывает используемые в программе констан-

ты. S - массив констант строк символов состоящих из пя-

тидесяти символов.  Им присваиваются значения,  которые

будут использоваться для составления меню.

   - Var: описывает переменные.

   Longint - целочисленный тип, значение которого может

изменяться от -2147483648 до 2147483647и  занимаетв

памяти 32 бита.

   Integer - целочисленный тип,может принимать значе-

ниеот-32768  до32767 и занимает объем памяти в 16

бит.

   Char - символьный тип, может приниматьзначение лю-

бого символа.

   Byte -целочисленный тип,может принимать значения

от 0 до 255 из занимает объем памяти в 8 бит.

   Set of'0'..'F' - тип множество,элементы которого

могут быть любые символы находящиесяв  промежуткеот

'0' до 'F'.

   Array [1..255] of Char - массив символов размеромв


                        - 11 -

255 знаков.

   String - строка символов переменной длины (длина мо-

жет изменяться от 1 до 255 символов).

   Далее в программе идет описание процедуры Zast.  Эта

процедура выводит на экран в столбик пункты меню, в ко-

торых указывается из какой и в какую систему исчисления

пользователь хочет перевести число. Структура процедуры

линейная. Она состоит из нескольких операторов:

   Window (1,1,80,24)- отводит окно доступное для вы-

вода.

   ClrScr - очищает экран.

   TextColor (15) - устанавливает цвет последующего вы-

вода (ярко белый).

   GoToXY (x,y) - переводит курсор в строку с номером y

и столбец с номером x.

   Write ( ) - выводит на экран от позиции курсоравы-

ражение указанное в скобках.

   Далее в программе следует функция возведения в  сте-

пень. Она  будетиспользоваться в дальнейшей программе

несколько раз для непосредственного переводаиз  одной

системы исчисления в другую,поэтому пришлось оформить

ее как функцию, чтобы не использовать каждый раз опера-

ции с логарифмом и экспонентой.Возведение в степень в

этой функции осуществляется обычным многократнымумно-

жением в цикле,и думаю,на ней не следует останавли-

ваться.

   Продолжим рассмотрение программы. После функции воз-

ведения в степень идет операторначала  исполнительной


                        - 12 -

части основной программы Begin.

   Переменной Y присваивается значение1-  начальное

положение курсора в меню.

   Далее идет вызов процедуры Zast, в результате выпол-

нения которойна экран выводится список возможных ком-

бинаций переводов.

   После выполнения процедуры Zast следует оператор ор-

ганизации цикла с пост-условиемRepeat.  Внутриэтого

цикла осуществляется  выполнениевсей дальнейшей прог-

раммы.

   Внутри негопоследовательно идет установка цвета на

малиновый, перемещение курсора в позицию 13,2и  вывод

символа меткитекущего положения курсора в меню ( 2>0 ).

Далее идет оператор  ожиданиявводаклавиши  ReadKey.

Когда клавиша будет нажата, ее значение будет присвоено

переменной Klav.  Затем идет стирание метки текущей по-

зиции курсора в меню.

   После этого идет блок условных операторов If,кото-

рые обрабатывают нажатую клавишу и выполняют определен-

ные действия в  соответствии с нажатой клавишей.

   Первый оператор If обрабатывает ситуацию,если была

нажата клавиша "ВВЕРХ".В  результатееговыполнения

значение переменной  Yуменьшается на единицу,а если

она была равна 1,  то ее значение становится равным  7.

Аналогично действует  второй условный оператор,только

он обрабатывает клавишу "ВНИЗ".

   Третий условныйоператорпринимает  значениеTrue

если была нажата клавиша ESC (выход). В этом случае пе-


                        - 13 -

ременной Y присваивается значение 7,а переменной Klav

значение клавиши ВВОД. Оба эти значения переменных сим-

волизируют выход  из внешнего цикла с пост-условием,  а

значит и выход из программы.

   Четвертый условный   операторобрабатывает  клавишу

ВВОД, но при условии,  что Y<7,т.е.курсор в меню не

подведен к  последнейстрокесо  значениемвыхода из

программы. Если значение выражения этого условного опе-

ратора примет  значение True,то начинается выполнение

основной части  программы,котораяосуществляет   не-

посредственно перевод  изоднойсистемы  исчисления в

другую.

   Сначала очищаетсяэкран.Затем  малиновым цветом в

первой строке выводится изкакой  ивкакую  систему

исчисления программа будет переводить числа. После это-

го, в нижней строке зеленым цветом выводится фраза "ESC

- ВЫХОДВ МЕНЮ".Затем устанавливается цвет вывода на

экран белый и выделяется окнодля  выводаисключающее

первую и  последнююстрокиэкрана.  Переменной Stroka

(переменная указывает строку положения курсора) присва-

ивается значение 2.

   После этих подготовительных процессов операторCase

в зависимости  оттогоиз  какойив  какую систему

исчисления мы будем переводить числа, определяет значе-

ния переменных Isx (основание исходной системы исчисле-

ния), Keys (клавиши,  которые можно нажимать дляввода

исходного числа)  иKon(основание  конечнойсистемы

исчисления).


                        - 14 -

   Далее в   программе   следует   оператор   цикла   с

пост-условием Repeat,  внутрикоторогоосуществляется

ввод исходного  числа.Сначалаидет  ожидание нажатия

клавиши, и если клавиша будет нажата,то значение этой

клавиши запишется в переменную Klav.Стандартная функ-

ция UpCase переводит символ из нижнего регистра в верх-

ний. Условный оператор If определяет, является ли нажа-

тая клавиша допустимой,  и если это так,то переменная

Kol (количество символов во введенном числе) увеличива-

ется на единицу, значение клавиши записывается в массив

A (массив символов с исходным числом) и введеннаякла-

виша отображается на экране.

   Следующий условныйоператор определяет,не была ли

нажата клавиша ЗАБОЙ.  В этом случае Kol уменьшается на

единицу, курсор  перемещаетсянаодну позицию влево и

стирается последний введенный символ.

   Оператор Until   осуществляет   выход   изциклас

пост-условием в том случае,если была  нажатаклавиша

ВВОД или клавиша ESC.

   Далее следует условный оператор, который обрабатыва-

ет условие нажатия клавиши ВВОД.Если это так,  то это

означает, что исходное число введено и пользователь хо-

чет получить  результат,и необходимо приступить к не-

посредственному переводу.

   Внутри этого условного оператора выполняется цикл от

1 до Kol (количество символов в исходном числе). Внутри

этого цикла  условнымоператором If определяется в за-

висимости от символа его числовой эквивалент длядаль-


                        - 15 -

нейшего умножения, а затем переменная Promeg увеличива-

ется на число равное произведению полученного числового

эквивалента на  основание исходной системы исчисления в

степени Kol-1.В результате выполнения этого цикламы

из исходногочисла в виде набора символов получили его

значение в десятеричной системе исчисления. Таким обра-

зом половину перевода мы осуществили.Теперь нам нужно

это значение перевести в необходимую систему исчисления.

   Далее следует обнуление переменной I,а после этого

циклом спост-условием определяется максимальный поря-

док результата (см. п.III. Теоретические основы решения

задачи).

   После того как мы определили этот порядок и записали

его в переменную I, организуется цикл от I до 0. Внутри

этого цикла проводятся следующие преобразования для по-

лучения необходимого результата:

   - переменной Helpприсваиваетсячисловое  значение

Jтого элемента в исходном результате;

   - условным оператором If из этого значенияполучает

символ, который будет стоять врезультате;

   - записывается полученный символ в строкусимволов,

которая будет содержать результат;

   - вычисляется остаток,который записывается в пере-

менную Promeg.

   Все эти действия были описаны в теоретическойчасти

настоящего реферата, а их практическое осуществление не

требует никакого труда.

   После выполнения этих операций,программа переходит


                        - 16 -

к получению следующего символа, пока не получит послед-

нийсимволискомого результата.Как только результат

получен, он выводится на экран оператором WriteLn.

   После этого   следует  переходнаначало  циклас

пост-условием, в котором будет опять вводиться исходное

число и получаться результат,если не была нажата кла-

виша ESC. Если все же была нажата клавиша ESC то выпол-

нение   программы    передается   основному   циклу   с

пост-условием который включает в себя выбор в меню.

   Условие выходаиз этого цикла - это нажатие клавиши

ВВОД, если курсор меню стоял на строке "ESC -ВЫХОД  В

DOS".

   Если это условие выполнилось, то осуществляется очи-

щение экрана и выполнение программы завершается.

           2VIII. КАК ПОЛЬЗОВАТЬСЯ ПРОГРАММОЙ

   Сразу послезапуска  программы на экране появляется

меню возможных переводов:


                        - 17 -

_____________________________________________________

|                                                     |

| > Перевод из десятеричного кода в двоичный.         |

|                                                     |

|   Перевод из двоичного кода в десятеричный.         |

|                                                     |

|   Перевод из десятеричного кода в шестнадцатиричный.|

|                                                     |

|   Перевод из шестнадцатиричного кода в десятеричный.|

|                    |

|   Перевод из двоичного кода в шестнадцатиричный.    |

|                                                     |

|   Перевод из шестнадцатиричного кода в двоичный.    |

|                                                     |

|               ESC - ВЫХОД В DOS                     |

|                                                     |

|_____________________________________________________|

   Слева от первой строки стоит метка выбора. Клавишами

ВВЕРХ и ВНИЗ можно перемещать метку по меню. После того

как метка  подведена к нужной строке нажимается клавиша

ВВОД. Если Вы хотите из главного менювыйти  изпрог-

раммы, тоэтоможно  сделать двумя способами:нажать

клавиши ESC или подвести курсор кпоследней  строкеи

нажать ВВОД.

   Если Вы нажали ВВОД на одной из верхнихстрокменю

то на экране появляется следующая картина:


                        - 18 -

_____________________________________________________

|                                                     |

|       Перевод из десятеричного кода в двоичный.     |

|                                                     |

| ? 32 = 100000                                       |

| ? 33 = 100001                                       |

| ? 26 = 11010                                        |

| ? 500 = 111110100                                   |

| ? 3 = 11                                            |

| ? 34_                                               |

|                                                     |

|                                                     |

|                                                     |

|                                                     |

|                                                     |

|                 ESC - ВЫХОД В МЕНЮ                  |

|_____________________________________________________|

   Однако вместоверхнейстроки может стоять любая из

шести строк указанных в меню,в зависимости  оттого,

стоя на какой строке меню Вы нажали ВВОД.

   В этом состоянии можно вводить исходное число,при-

чем программа будет сама определять,допустимый символ

Вы вводите или нет.  Так например если Вы переводите из

двоичной системы  исчисления,тоВы  можетенажимать

только клавиши '1' или '0', в противном случае програм-

ма нажатую клавишу не проигнорирует.


                        - 19 -

   После того как Вы ввели исходное число, нужно нажать

клавишу ВВОД, после чего напротив исходного числа через

знак равно появится эквивалент исходного числа,но уже

в нужной системе исчисления.

   Если Вы ошиблись при вводе исходного числа, то можно

нажать клавишу ЗАБОЙ, и последний введенный символ сот-

рется.

   Чтобы завершить выполнение программы или осуществить

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

вишу ESC (о чем указано в нижней строке экрана). В этом

случае Вы окажетесь в начальном меню.Если  Выхотите

продолжить перевод,  тоопятьклавишами  ВВЕРХ и ВНИЗ

подведите курсор к нужной строке меню инажмите  ВВОД.

Если жеВыхотите завершить выполнение программы,то

это можно сделать двумя вышеописанными способами.


                                     - 8 -

Program Perevod;

Uses Crt;

Const P1='Перевод из ';                                            { константы для начального меню }

        s:array [1..7] of string[50]=(p1+'десятеричного кода в двоичный.',

                                      p1+'двоичного кода в десятеричный.',

                                      p1+'десятеричного кода в шестнадцатиричный.',

                                      p1+'шестнадцатиричного кода в десятеричный.',

                                      p1+'двоичного кода в шестнадцатиричный.',

                                      p1+'шестнадцатиричного кода в двоичный.',

                                      'ESC - ВЫХОД В DOS');

Var Promeg,Chast:Longint;

      Znach,j:Integer;

      Klav:Char;

      i,Stroka,Isx,Kon,y,Kol,Help:Byte;

      Keys: Set of '0'..'F';

      a: Array [1..255] of Char;

      Otv,Pom: string;

Procedure Zast;                                                    { процедура вывода меню }

    begin

      Window(1,1,80,24);                                             { выделить окно 80х24 }

      ClrScr;                                                        { очистить окно }

      TextColor(15);                                                 { установить цвет - белый }

      FOR I:=1 TO 7 do begin                                         { циклпо строкам }

        GoToXY (15,I*2); Write (s[i]);                               { формированиеменю }

      end;

   end { zast };                                                    { конецпроцедурыменю }

Function Stepen (Chis,St: Byte): Longint;                          { функциявозведениявстепень }

    var c: Byte;

        Res: longint;

    begin

      Res:=1;

      For c:=1 to st do Res:=Res*chis;

      Stepen:=Res;                                                   { присвоение функции значения }

    End { Stepen };                                                  { конец функции возведения в сепень }

Begin                                                              { НАЧАЛО ОСНОВНОЙ ПРОГРАММЫ }

y:=1;                                                              { y - текущая строка в меню }

Zast;                                                              { вывести меню }

Repeat                                                             { цикл для перемещения в меню }

    TextColor(13);

    GoToXY (13,y*2); Write(Chr(16));{ вывести метку текущей строки меню }

    klav:=ReadKey;                                                   { считывание клавиши в klav }

    GoToXY (13,y*2); Write(' ');                                     { стирание старой метки текущей строки }

    if Ord(Klav)=72 then if y > 1 then y:=y-1 else y:= 7;{ есликлавишаВВЕРХ }

    if Ord(Klav)=80 then if y < 7 then y:=y+1 else y:= 1;{ есликлавишаВНИЗ }

    if Ord(Klav)=27 then begin y:=7; klav:=Chr(13) end;              { есликлавиша ESC }

    if (Ord(Klav)=13) and (y<7) then begin                           { есликлавишаВВОДнена выходе }

      ClrScr;                                                        { очиститьэкран }

      TextCOLOR (13); GoToXY (20, 1); Write (s[y]);                  { вывестиназваниеперевода }

      TextCOLOR (10); GoToXY (31,24); Write ('ESC - ВЫХОДВМЕНЮ');{ вывестиклавишудлявыхода }

      TextColor(15);                                                 { поменять цвет - белый }

      Window(1,2,80,23);                                             { установить окно со 2 по 23 строки }

      Stroka:=2;                                                     { текущая строка }

  

                                     - 9 -

      Case y of                                                      { определение клавиш которые можно будет нажимать }

        1,3 : begin                                                  { если перевод из десятиричного кода }

                Isx:=10;

                Keys:=['0'..'9'];                                    { возможные клавиши }

                If y=1 Then Kon:=2 else Kon:=16;                     { присвоение системы исчисления результата }

              end;

        2,5 : begin

                Isx:= 2;

                Keys:=['0','1'];                                     { определение клавиш которые можно будет нажимать }

                If y=2 Then Kon:=10 else Kon:=16;                    { присвоение системы исчисления результата }

              end;

        4,6 : begin

                isx:=16;

                keys:=['0'..'9','A'..'F'];                           { определение клавиш которые можно будет нажимать }

                if y=4 then kon:=10 else kon:=2;                     { присвоение системы исчисления результата }

              end;

      end;

      Repeat                                                         { основной цикл для перевода }

        Write('? '); Promeg:=0; Kol:=0; Otv:='';                     { подготовительные действия }

        Repeat                                                       { цикл для ввода числа }

          klav:=ReadKey;                                             { чтение клавиши }

          if UpCase(Klav) in Keys then begin                         { если клавиша допустимая }

            kol:=kol+1;                                              { количество символов в исходном числе }

            a[kol]:=UpCase(Klav);                                    { запоминание введенного символа }

Write (a[kol]);                                          { вывод нажатого символа }

          end;

          if (Ord(Klav)=8) and (Kol>0) then begin                    { есликлавишаЗАБОЙ }

kol:=kol-1;

GoToXY(WhereX-1,WhereY);

ClrEol;

          end;

        Until (Ord(klav)=13) or (Ord(klav)=27);                      { покане нажатаВВОДили ESC }

        if Ord(klav)=13 then begin                                   { если клавиша ВВОД - начало обработки результата }

          for i:=1 to kol do begin                                   { перевода введенного числа в десятеричную систему}

if a[i]<'A' then Znach:=Ord(a[i])-48

else Znach:=Ord(a[i])-55;

            promeg:=promeg+Znach*Stepen(isx,kol-i);

          end;

          i:=0;

          Repeat                                                     { определение максимального порядка результата }

i:=i+1;

Chast:=Trunc(Promeg/Stepen(Kon,i));

          Until Chast

          For j:=i downto 0 do begin{ переводв нужнуюсистемуисчисления }

Help:=Trunc(Promeg/Stepen(Kon,j));

If Help>9 Then Pom:=Chr(55+Help)

Else Str(Help,Pom);

            Otv:=Otv+Pom;

            Promeg:=Promeg-Help*Stepen(Kon,j);

          end;

          WriteLn(' = ',Otv);                                        { вывод результата }

        end;                                                         { конец обработки результата }

      Until Ord(Klav)=27;                                            { если нажата ESC то выход в основное меню }

      Zast;                                                          { вывод заставки }

    end;

Until (Ord(Klav)=13) and (y=7);                                    { если в меню нажали ESC или ВВОД на выходе }

ClrScr                                                             { очистить экран }

end.