Ответственный за курсовой проект 3РОЗМАХОВ Олег Георгиевич 0 Руководитель курсового проекта 3ИОНИНА Татьяна Давыдовна 0 2К У Р С О В О Й П Р О Е К Т Тема курсового проекта ИЗУЧЕНИЕ ПРОБЛЕМЫ ПЕРЕВОДА ИЗ ОДНОЙ СИСТЕМЫ ИСЧИСЛЕНИЯ В ДРУГУЮ И РАЗРАБОТКА ПРОГРАММЫ ДЛЯ ЭТОЙ ОПЕРАЦИИ Студента гр.
05-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, т.к. 29512, а 2101024 что больше нашего начального числа. Таким образом мы получили число разрядов результата. Оно равно 9110. Значит результат будет иметь вид 1х, где вместо х может стоять 1 или 0.
Найдем вторую цифру результата. Возведем двойку в степень 9 и вычтем из исходного числа 567-2955. Затем сравниваем с числом 28256. Так как 55 меньше 256 то девятый разряд будет нулем, т.е. результат уже примет вид 10х. Рассмотрим восьмой разряд 27128 55, значит и восьмой разряд будет нулем. Т.к. 2664 то седьмой разряд равен нулю. Таким образом мы получили четыре старших разряда и число примет вид 1000х. Вычисляем 2532 и видим, что 32 55, значит шестой разряд равен 1 результат 10001х, остаток 55-3223. 2416 23
- пятый раз- ряд 1 100011хххх. Остаток 23-167. 238 7 1000110ххх. 224 7 10001101хх, остаток 3. 212 3 100011011х, остаток 1. 201 1 1000110111. Мы получили конечный результат 5 - Теперь попробуем перевести тоже число 567, но уже в шестнадцатиричную систему. Подход примерно такой же. Определим максимальный разряд. Т.к. 162256 567, а 1634096 567, то максимальный разряд 213.
Опреде- лим число, которое будет стоять в третьем разряде. Ищется максимальный множитель в пределах от 1 до 15, чтобы текущая степень шестнадцати умноженная на этот множитель была меньше или равнялась исходному числу а в дальнейшем - остатку. В нашем примере этот множитель 2, т.к. 2562512 567, а 567. Значит старший разряд нашего результата будет равен 22 0, и ре- зультат примет вид 2хх, где вместо х
могут стоять любые цифры или буквы из ниже перечисленных 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F. Вычисляем остаток 567-216255. Определим что будет стоять во втором разряде. Так как 316148 55, а 416164 55, то во втором разряде будет стоять цифра 0. Оста- ток55-31617. Определяем первый разряд т.к. 1601 то цифра первого разряда равна остатку, т.е. 0. Таким образом мы получили число 2237 0, но уже в шестнадцатирич- ной системе исчисления.
Операция перевода из десятеричной системы выглядит гораздо проще. Рассмотрим ее на примере перевода из шестнадцатиричной системы в десятеричную. Допустим нам нужно перевести число 24A3F 0в десятерич- ную систему. Берем старший 4 ый разряд и возводим 16 в степень 4-13, получаем 1634096. Полученный резуль- тат умножаем на значение четвертого разряда, т.е.
4 6 - Получается 4096416384. Этот результат мы заносим в сумму. Переходим к следующему разряду 162256. 256 нужно умножить на значение третьего разряда т.е. A. Как известно в шестнадцатиричной системе исчисления буквы от A до F символизируют числа от 10 до 15 A10, B11, C12, D13, E14, F15. Умножив 256 на 10 получим 2560 и этот результат добавляем к сумме, в которой у нас по-
ка было 16384. В сумму у нас получилось 18944. Перехо- дим ко второму разряду 316148, добавив это в сумму получим 18992. И последний разряд 1516015. Конечная сумма равна 219007 0. Мы получили результат в десятеричной системе исчисления. 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 10 33 100001 26 11010 500 10100 3 11 34 ESC - ВЫХОД В МЕНЮ Однако вместо верхней строки может стоять любая из шести строк указанных в меню, в зависимости от того, стоя на какой строке меню Вы нажали ВВОД. В этом состоянии можно вводить исходное число, при- чем программа будет сама определять, допустимый символ Вы вводите или нет. Так например если Вы переводите из двоичной системы исчисления, то
Вы можете нажимать только клавиши 1 или 0, в противном случае програм- ма нажатую клавишу не проигнорирует 19 - После того как Вы ввели исходное число, нужно нажать клавишу ВВОД, после чего напротив исходного числа через знак равно появится эквивалент исходного числа, но уже в нужной системе исчисления. Если Вы ошиблись при вводе исходного числа, то можно нажать клавишу ЗАБОЙ, и последний введенный символ сот- рется. Чтобы завершить выполнение программы или осуществить
перевод из другой системы исчисления, нужно нажать кла- вишу ESC о чем указано в нижней строке экрана. В этом случае Вы окажетесь в начальном меню. Если Вы хотите продолжить перевод, то опять клавишами ВВЕРХ и ВНИЗ подведите курсор к нужной строке меню и нажмите ВВОД. Если же Вы хотите завершить выполнение программы, то это можно сделать двумя вышеописанными способами 8
- Program Perevod Uses Crt Const P1Перевод из константы для начального меню sarray 1 7 of string50p1десятеричного кода в двоичный p1двоичного кода в десятеричный p1десятеричного кода в шестнадцатиричный p1шестнадцатиричного кода в десятеричный p1двоичного кода в шестнадцатиричный p1шестнадцатиричного кода в двоичный ESC - ВЫХОД В DOS Var Promeg,ChastLongint Znach,jInteger KlavChar i,Stroka,Isx,Kon,y,Kol,HelpByte Keys Set of 0
F a Array 1 255 of Char Otv,Pom string Procedure Zast процедура вывода меню begin Window1,1,80,24 выделить окно 80х24 ClrScr очистить окно TextColor15 установить цвет - белый FOR I1 TO 7 do begin цикл по строкам GoToXY 15,I2 Write si формирование меню end end zast конец процедуры меню Function Stepen Chis,St Byte Longint функция возведения в степень var c
Byte Res longint begin Res1 For c1 to st do ResReschis StepenRes присвоение функции значения End Stepen конец функции возведения в сепень Begin НАЧАЛО ОСНОВНОЙ ПРОГРАММЫ y1 y - текущая строка в меню Zast вывести меню Repeat цикл для перемещения в меню TextColor13 GoToXY 13,y2 WriteChr16 вывести метку текущей строки меню klavReadKey считывание клавиши
в klav GoToXY 13,y2 Write стирание старой метки текущей строки if OrdKlav72 then if y 1 then yy-1 else y 7 если клавиша ВВЕРХ if OrdKlav80 then if y 7 then yy1 else y 1 если клавиша ВНИЗ if OrdKlav27 then begin y7 klavChr13 end если клавиша ESC if OrdKlav13 and y 7 then begin если клавиша ВВОД не на выходе
ClrScr очистить экран TextCOLOR 13 GoToXY 20, 1 Write sy вывести название перевода TextCOLOR 10 GoToXY 31,24 Write ESC - ВЫХОД В МЕНЮ вывести клавишу для выхода TextColor15 поменять цвет - белый Window1,2,80,23 установить окно со 2 по 23 строки Stroka2 текущая строка - 9 - Case y of определение клавиш которые можно будет нажимать 1,3 begin если перевод из десятиричного кода Isx10 Keys0 9 возможные клавиши
If y1 Then Kon2 else Kon16 присвоение системы исчисления результата end 2,5 begin Isx 2 Keys0,1 определение клавиш которые можно будет нажимать If y2 Then Kon10 else Kon16 присвоение системы исчисления результата end 4,6 begin isx16 keys0 9,A F определение клавиш которые можно будет нажимать if y4 then kon10 else kon2 присвоение системы исчисления результата end end Repeat основной цикл для перевода
Write Promeg0 Kol0 Otv подготовительные действия Repeat цикл для ввода числа klavReadKey чтение клавиши if UpCaseKlav in Keys then begin если клавиша допустимая kolkol1 количество символов в исходном числе akolUpCaseKlav запоминание введенного символа Write akol вывод нажатого символа end if OrdKlav8 and Kol 0 then begin если клавиша ЗАБОЙ kolkol-1 GoToXYWhereX-1,WhereY ClrEol end Until Ordklav13 or
Ordklav27 пока не нажата ВВОД или ESC if Ordklav13 then begin если клавиша ВВОД - начало обработки результата for i1 to kol do begin перевода введенного числа в десятеричную систему if ai A then ZnachOrdai-48 else ZnachOrdai-55 promegpromegZnachStepenisx,kol-i end i0 Repeat определение максимального порядка результата ii1 ChastTruncPromegStepenKon,i Until Chast Kon For ji downto 0 do begin перевод в нужную систему исчисления
HelpTruncPromegStepenKon,j If Help 9 Then PomChr55Help Else StrHelp,Pom OtvOtvPom PromegPromeg-HelpStepenKon,j end WriteLn ,Otv вывод результата end конец обработки результата Until OrdKlav27 если нажата ESC то выход в основное меню Zast вывод заставки end Until OrdKlav13 and y7 если в меню нажали
ESC или ВВОД на выходе ClrScr очистить экран end.
! |
Как писать рефераты Практические рекомендации по написанию студенческих рефератов. |
! | План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом. |
! | Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач. |
! | Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты. |
! | Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ. |
→ | Виды рефератов Какими бывают рефераты по своему назначению и структуре. |