Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум по ВМСиС.doc
Скачиваний:
25
Добавлен:
05.06.2015
Размер:
2.31 Mб
Скачать

Дробные числа

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

Дробная часть десятичного числа записывается в начале колонки (см. рис.1.9), затем последовательно умножается на два. Результат записывается ниже в колонку. Если в произведении получилось больше разрядов, чем было до умножения, то старший разряд (единица) отбрасывается в колонку слева. Если разрядов не прибавилось, то в колонку слева пишется нуль. Дробное двоичное число собирается из левой колонки, записывая верхний ряд первым разрядом после точки и далее по порядку.

Процесс умножения на 2 заканчивается, если произведение становится равным нулю или если точность полученного числа не меньше точности искомого. Приблизительно можно считать, что каждый десятичный разряд соответствует 3,32 разрядам двоичного числа (). Например, два разряда десятичного дробного числа по точности соответствуют семи разрядам двоичного числа (– округление следует проводить в бόльшую сторону).

Рис. 1.10. Преобразование дробного десятичного числа 0.17 в двоичное.

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

1й способ. Суммирование отрицательных степеней двойки, которые соответствуют единичным битам двоичного числа:

Рис. 1.11. Преобразование дробного двоичного числа 0.00101012в десятичное (1йспособ).

2й способ.Дробная часть двоичного числа записывается по одному биту колонкой сверху вниз. Крайний правый бит находится внизу. Нижняя строка это 0.5. Число из нижнего ряда переходит вверх, суммируясь с битом текущего ряда, а сумма делится на 2. Результат получается в самом верхнем ряду:

Рис. 1.12. Преобразование дробного двоичного числа 0.00101012в десятичное (2йспособ).

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

Таблица 1.4. Стандартные числовые типы данных языка Си.

Имя типа

Длина в битах

Диапазон значений

unsigned char

8

0 … 255

char

8

-128 … 127

enum

16

-32768 …32767

unsigned int

16

0 … 65,535

short int

16

-32768 …32767

int

16

-32768 … 32767

unsigned long

32

0 … 4294967295

long

32

-2147483648 … 2147483647

float

32

3.4 * (10-38) … 3.4 * (10+38)

double

64

1.7 * (10-308) … 1.7 * (10+308)

longdouble

80

3.4 * (10-4932) … 1.1 * (10+4932)

Для того чтобы успешно выполнить лабораторное задание, напомним функции и приемы языка Си, которые могут понадобиться при написании программы.

Пример 1.1. Поиск символа «.» в строке s и вывод номера его позиции.

#include <stdio.h>

#include <string.h>

void main()

{ char s [80];

scanf("%s",s);

char * ptr = strchr(s, '.');

if (ptr)

printf("\n Символ точка стоит на %d месте", ptr-s);

}

В примере 1.1 используется функция strchr, которая возвращает указатель на первый встретившийся символ «.» строки, указанный вторым аргументом. Если таких символов несколько, то программа их не обнаружит. При выводе номера позиции используется разница между адресом строки и указателем на символ.

Пример 1.2. Программа преобразования целых двоичных чисел в шестнадцатеричные.

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>

int i;

char s [80], bin [16];

char bin2hex (char * s); // объявление функции

void main ()

{

clrscr();

scanf("%s",s);

for(int i=0; i<strlen(s);i++)

if ((s[i]!='0')&&(s[i]!='1'))

{

printf("\n Не верный символ %c\n",s[i]);

abort();

}

if ((strlen(s)%4)!=0)

do {

strrev(s);

strcat(s,"0");

strrev(s);

} while ((strlen(s)%4)!=0);

for(i=strlen(s)/4;i>0;i--)

{

memcpy (bin, s, 4);

strrev(s);

s[(i-1)*4]='\0';

strrev(s);

printf("\nbin2hex %s = %c",bin,bin2hex(bin));

}

getch();

}

char bin2hex (char * s)

{

if (strlen(s)>4) return '*';

if (strcmp(s,"0000")==0) return '0';

.......

if (strcmp(s,"1111")==0) return 'F';

}

В примере 1.2 используются следующие функции:

strrev(s)– изменяет порядок следования символов в строкеsна противоположный;

strlen(s)– определяет число символов в строкеs;

strcmp(s,"1111") –сравнивает строки; если результат равен нулю, то это означает, что строки равны;

memcpy (bin, s, 4) –копирует 4 символа из строкиsв строкуbin.

Пример 1.3. Программа преобразования десятичных чисел в двоичные (1й способ)

#include <STDIO.H>

#include <STDLIB.H>

int x, // вводимое число

x1, // промежуточная переменная

i; // счетчик

int a[9]; // массив степеней двойки

char s[9];// выходной массив двоичного представления

void main()

{ a[0]=1; // первое число массива

for (i=1;i<=8;i++)

{ a[i]=a[i-1]*2; //... остальные значения массива

s[i]='0'; //двоичное представление числа "0" }

printf("\n Введите десятичное число-->");

scanf("%i",&x);

if ((x<0)||(x>255)){printf(" Число д.б. от 0 до 255!");

_exit(10); };

if (x==0) goto ans;

x1=x; i=1;

while (1)

{if (x1<a[i])

{ s[i]='1';

x1-=a[i-1];

if (x1==0) break;

i=1; };

if (x1>=a[i]) i++; };

ans: printf(" Двоичный вид числа %i=",x);

for (i=8;i>=1;i--)

printf("%c",s[i]);

}

В примере 1.3 используется функция scanf(), которая вводит данные со стандартного устройства ввода (клавиатуры). Обратите внимание, для ввода строковых данных не используется префикс адреса &.

Пример 1.4. Программа преобразования двоичных чисел в десятичные (1й способ)

#include <STDIO.H>

#include <STDLIB.H>

#include <String.h>

int x, // выводимое число

i; // счетчик

int a[9]; // массив степеней двойки

char s[100];// входной массив двоичного представления

void main()

{

a[0]=1; // первое число массива

for (i=1;i<=8;i++) a[i]=a[i-1]*2;// остальные значения

printf("\n Введите двоичное число-->");

scanf("%s",&s);

if (strlen(s)>8)

{ printf("Длина вводимого числа не д.б. больше 8\n");

_exit(10); }

for (i=0;i<=7;i++)

{

if ((s[i]!='0')&&(s[i]!='1')&&(s[i]!=0))

{printf("Плохой символ двоичного числа s[%i]=%c\n",

i,s[i]);

_exit(10); }

if (s[i]==0) break;

}

x=0;

for (i=0;i<strlen(s);i++)

x+=a[strlen(s)-1-i]*(s[i]-48);

printf("Десятичное число =%i",x);

}