Правило 2 Перевод целой части числа
Целую часть числа, записанную в р-йчной с/с, делят на основание новой с/с q до получения целого частного (все операции выполняются по правилам Р-ичной с/с). В остатке получается число, являющееся последней (младшей) цифрой записи числа в q-ичной с/с (эта цифра записана в Р-ичной с/с, надо перейти в q-ичную с/с). Полученное частное снова делят на основание q; в остатке будет число, являющееся предпоследней цифрой искомой записи, и т.д. Операцию деления повторяют до тех пор, пока в частном не получат число, меньшее чем q. Это и будет первая (старшая) цифра записи переводимого числа в q-ичную с/с.
Правило 3. Перевод дробной части числа.
Правило 2 Перевод целой части числа
Целую часть числа, записанную в р-йчной с/с, делят на основание новой с/с q до получения целого частного (все операции выполняются по правилам Р-ичной с/с). В остатке получается число, являющееся последней (младшей) цифрой записи числа в q-ичной с/с (эта цифра записана в Р-ичной с/с, надо перейти в q-ичную с/с). Полученное частное снова делят на основание q; в остатке будет число, являющееся предпоследней цифрой искомой записи, и т.д. Операцию деления повторяют до тех пор, пока в частном не получат число, меньшее чем q. Это и будет первая (старшая) цифра записи переводимого числа в q-ичную с/с.
Правило 3. Перевод дробной части числа.
Дробную часть числа, записанную в Р-ичной. с/с, умножают в Р-ичной системе на основание q. Целая часть произведения будет первой (старшей) цифрой изображения дроби в q-ичной с/с. Дробную часть произведения снова умножают на q. Целая часть произведения будет следующей цифрой записи дроби в q-ичной с/с. Процесс продолжают до тех пор, пока дробная часть произведения не будет нулевой, или пока не получат требуемое количество знаков записи дроби в q-ичной с/с.
При переводе смешанных чисел отдельно переводят целую и дробную части по вышеизложенным правилам, а затем записывают результаты перевода друг за другом, отделяя целую часть от дробной запятой.
Правило 4. Перевод чисел в 10 с/с.
Для исключения выполнения операций умножения и деления в других системах, рекомендуется выполнять способом суммирования с учетом "веса" разрядов по формуле:
R=asPs+ as-1Ps-1+…+ a2P2+a1P1+a0P0+a-1P-1+….+a-kP-k
где Р – основание системы счисления.
Выражение в правой части вычисляют в 10 с/с.
При переводе чисел в двоичную систему счисления проще сначала десятичное число перевести по общему правилу в восьмеричную систему счисления и далее каждую цифру представить триадами двоичной системы счисления.
Алгоритм перевода из 8-ной в 2-ную:
Начало алгоритма
1. Введем: i; j - переменные цикла
l - счетчик триад
y – переменная для целого восьмеричного числа
y1 - целое двоичное
char *z1,*z2; - указатели на начало строк
2. Вводим массив с данными для замены
s2[8][3]={“000”,”001”, ”010”, ”011”, ”100”, ”101”, ”110”, “111”};
3. Вводим целочисленное восьмеричное число y
4. Преобразовываем число в строку
itoa(y,z1,10);
k=strlen(z1); - длина строки = числу разрядов
5. Цикл перебора «символов цифр» строки
i=0 до i<k шаг по i=1
Цикл (выбор: какая цифра в текущем разряде)
j=’0’ до j<=’9’ шаг по j=1
Если z1[i] есть j, копируем соответствующую триаду (двоичную) в строку z2
strcat(z2,&s2[j-‘0’-1][3]); l+=3;
6. По завершении циклов z2[l]=’\0’; - устанавливаем конец строки
7. Переводим строку в число
y1=atoi(z2);
печатаем результат у1.
Конец алгоритма.
Алгоритм перевода дробной части числа
Должны ввести количество цифр после запятой и постоянно определять и запоминать целую часть от произведения дробной части предыдущего умножения на основание p системы счисления, в которую переводим
Начало алгоритма
1. Подключаем необходимые заголовочные файлы
2. Объявляем
double i1, y - целая и дробная части числа
z2[100] -
int p,k - основание системы и число знаков после запятой
3. Вводим число y=0,xxx и точность перевода
4. Выполняем от i=0 до i<k с шагом i=1
а) y=y*p - последовательное умножение только целой части
б) выделение целой части и дробной
y= modf(y,&i1);
функция modf(double x, double *i) - выделяет целую и дробную части числа типа double, дробная часть возвращается функцией, а целая записывается по адресу указателя i;
в) заносим целую часть в массив z2[i]=i1, если y=0, то прервать!
5. Печать дробной части:
printf (“ y1 = 0.”);
Меняя j от 0 до i с шагом 1 выводим z2[j]
Конец алгоритма.
Алгоритм перевода целой части
Должны выделять остаток от деления <p на текущем шаге и запоминать его. Потом запомнить частное от деления и вывести в обратном порядке
Начало алгоритма
1. Подключаем необходимые заголовочные файлы
2. Объявляем: целые
j=0 - переменная цикла
i=0 - счетчик разрядов нового числа
p - основание новой с\с
y - число для перевода
z2[100] - массив с разрядами нового числа
3. Вводим y и p
4. Выполнять пока y>=p
(начало цикла)
а) занесение остатка от текущего шага деления
z2[i]=y%p;
б) y=y/p; - выделяем частное, полученное на текущем шаге, использовали тот факт, что в С целое на целое= целое
в) i увеличили на единицу
(конец цикла)
i увеличили на единицу и запоминаем последнее частное от деления z2[i]=y;
5. Печатаем массив в обратном порядке
j от i-1 до j>=0 шаг уменьшаем на 1
печать z2[j];
Конец алгоритма.
Варианты заданий
Создать программу с пунктами меню:
- перевод из исходной системы счисления в указанную в соответствии с вариантом задания;
- перевод числа в десятичную систему счисления;
- перевод числа из десятичной системы в двоичную;
|
№ вАРИАНТА. ИсХОДНАЯ сИСТЕМА СЧИСЛЕНИЯ |
ИсходнЫе числА |
|
1. Перевести из С/С с основанием (2)в С/С с основанием (3) и наоборот |
11001.1101112 111.0213 |
|
2. Перевести из С/С с основанием (2) в С/С с основанием (4) и наоборот |
1001111.001112 203.2324 |
|
3. Перевести из С/С с основанием (2) в С/С с основанием (5) и наоборот |
1010011.101000112 300.12335 |
|
4. Перевести из С/С с основанием (2) в С/С с основанием (6) и наоборот |
100101.00011112 152.31236 |
|
5. Перевести из С/С с основанием (2) в С/С с основанием (7) и наоборот |
1011001.011112 104.12217 |
|
6. Перевести из С/С с основанием (2) в С/С с основанием (8) и наоборот |
11110111.0112 1336.7278 |
|
7. Перевести из С/С с основанием (2) в С/С с основанием (9) и наоборот |
1001001.001012 130.3779 |
|
8. Перевести из С/С с основанием (2) в С/С с основанием (11) и наоборот |
111111.10000012 170.8411 |
|
9. Перевести из С/С с основанием (2) в С/С с основанием (12) и наоборот |
11101010.00101112 D0.BA6812 |
|
10. Перевести из С/С с основанием (2) в С/С с основанием (13) и наоборот |
100000001.1101012 AC.48A13 |
|
11. Перевести из С/С с основанием (2) в С/С с основанием (14 и наоборот |
101100100.01001012 88.5A514 |
|
12. Перевести из С/С с основанием (2) в С/С с основанием (15 и наоборот |
110110101.1001012 84.A53B15 |
|
13.Перевести из С/С с основанием (2) в С/С с основанием (16) и наоборот |
101100111.1001112 1BD.BAE16 |
|
14. Перевести из С/С с основанием (2) в С/С с основанием (18) и наоборот |
100001001.11000012 8D.8EDC18 |
|
15.Перевести из С/С с основанием (2) в С/С с основанием (19) и наоборот |
101111000.111000112 D4.HG6819 |
Таблицы соответствия
|
10 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
|
~ |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
|
1/2 |
1/4 |
1/8 |
1/16 |
1/32 |
1/64 |
1/128 |
1/256 | ||||||||||||||
|
0,5 |
0,25 |
0,125 |
0,0625 |
0.03125 |
0,0156 |
0,0078 |
0,0039 |