Ответственный за курсовой проект: я3РОЗМАХОВ Олег Георгиевичя0 _______________ Руководитель курсового проекта: я3ИОНИНА Татьяна Давыдовная0 _______________ К У Р С О В О Й П Р О Е К Т Тема курсового проекта: ИЗУЧЕНИЕ ПРОБЛЕМЫ ПЕРЕВОДА ИЗ ОДНОЙ СИСТЕМЫ ИСЧИСЛЕНИЯ В ДРУГУЮ И РАЗРАБОТКА ПРОГРАММЫ ДЛЯ ЭТОЙ ОПЕРАЦИИ Студента: гр. 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. Значит старший разряд нашего результата будет равен я22я0, и ре- зультат примет вид 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, то во втором разряде будет стоять цифра я23я0. Оста- ток=55-3*16^1=7. Определяем первый разряд: т.к. 16^0=1 то цифра первого разряда равна остатку, т.е. я27я0. Таким образом мы получили число я2237я0, но уже в шестнадцатирич- ной системе исчисления. Операция перевода из десятеричной системы выглядит гораздо проще. Рассмотрим ее на примере перевода из шестнадцатиричной системы в десятеричную. Допустим нам нужно перевести число я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. Конечная сумма равна я219007я0. Мы получили результат в десятеричной системе исчисления. я2IV. МЕТОДОЛОГИЧЕСКИЙ ПОДХОД Рассматривая перевод из десятеричной системы исчисления в двоичную и шестнадцатиричную, можно найти много общего. В обоих случаях мы ищем максимальную сте- пень, затем в обоих случаях сравниваем остаток с числом возведенным в степень разряда. Единственная разница заключается в том, что при переводе в двоичную систему основанием степени служит двойка, а при переводе в шестнадцатиричную систему основанием служит число шест- надцать. Возникает вопрос: а нельзя ли объединить оба этих перевода в одну процедуру, в которую в качестве параметров передавать основание степени? При более под- робном рассмотрении перевода в двоичную систему можно заметить, что сравнивая остаток со степенью двойки мы
- 7 - отмечаем только как бы два состояния: да или нет, т.е. 1 или 0, а при переводе в шестнадцатиричную систему мы рассматриваем не просто степень числа шестнадцати, а произведение этой степени на величину будущего разряда. Возникает вопрос: а не одно ли это и тоже. Ведь умножив число на единицу мы его не изменяем, а следовательно нет разницы между тем, сравнивать степень с остатком или с остатком умноженным на единицу. Таким образом вы- яснилось, что перевод из десятеричной системы исчисле- ния в двоичную и в шестнадцатиричную можно осуществлять одной процедурой, в которую в качестве параметра пере- давать основание степени, т.е. основание конечной системы исчисления. Чтобы не усложнять программу и не делать множество операторов условного перехода в зависимости от то