Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Лекция 11.

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

 

Двоичная система счисления – позиционная система счисления с основанием 2. Благодаря непосредственной реализации в цифровых электронных схемах на логических вентилях, двоичная система используется практически во всех современных компьютерах и прочих вычислительных электронных устройствах.

В двоичной системе счисления числа записываются с помощью двух символов (0 и 1). Чтобы не путать, в какой системе счисления записано число, его снабжают указателем справа внизу. Например, число в десятичной системе 510, в двоичной 1012. Иногда двоичное число обозначают префиксом 0b или символом & (амперсанд), например 0b101 или соответственно & 101.

В двоичной системе счисления (как и в других системах счисления, кроме десятичной) знаки читаются по одному. Например, число 1012 произносится «один ноль один». Прежде чем читать материал лекции, вспомните, как выполняется преобразование чисел из одной системы счисления в другую. Если вы впервые слышите о двоичной системе счисления – Привет Буряку! Если вы не знаете, как преобразовывать из десятичной системы счисления в двоичную – Салют Буряку!

О двоичной системе: https://ru.wikipedia.org/wiki/Двоичная_система_счисления

 

Отрывки из книги «Над пропастью во ржи»:

 

Но самое лучшее в музее было то, что там всё оставалось на местах. Ничто не двигалось. Можно было сто тысяч раз проходить, и всегда эскимос ловил рыбу и двух уже поймал, птицы всегда летели на юг, олени пили воду из ручья, и рога у них были всё такие же красивые, а ноги такие же тоненькие, а эта индианка с голой грудью всегда ткала тот же самый ковёр. ничто не менялось. Менялся только ты сам. И не то, чтобы ты сразу становился много старше. Дело не в этом. Но ты менялся, и всё. То на тебе было новое пальто. То ты шёл в паре с кем-нибудь другим, потому что прежний твой товарищ был болен скарлатиной. А то другая учительница вместо мисс Эглетингер приводила класс в музей. Или ты утром слышал, как отец с матерью ссорились в ванной. А может быть, ты увидел на улице лужу и по ней растеклись радужные пятна от бензина. Словом, ты уже чем-то стал не тот — я не умею как следует объяснить, чем именно. А может быть, и умею, но что-то не хочется.

 

– Не хочу внушать тебе, что только люди ученые, образованные могут внести ценный вклад в жизнь, – продолжал он. – Это не так. Но я утверждаю, что образованные и ученые люди при условии, что они вместе с тем люди талантливые, творческие – что, к сожалению, встречается редко, – эти люди оставляют после себя гораздо более ценное наследие, чем люди п р о с т о талантливые и творческие. Они стремятся выразить свою мысль как можно яснее, они упорно и настойчиво доводят свой замысел до конца. И что самое важное, в девяти случаях из десяти люди науки гораздо скромнее, чем люди неученые, хотя и мыслящие. Ты понимаешь, о чем я говорю?

 

 

– … Если ты достаточно углубишься в занятия, ты получишь представление о возможностях твоего разума. Что ему показано, а что – нет. И через какое-то время ты поймешь, какой образ мысли тебе подходит, а какой – нет. И это поможет тебе не затрачивать много времени на то, чтобы прилаживать к себе какой-нибудь образ мышления, который тебе совершенно не годится, не идет тебе. Ты узнаешь свою истинную меру и по ней будешь подбирать одежду своему уму.

 

Странная штука: если взрослые спят открыв рот, у них вид противный, а у ребятишек – нисколько. С ребятишками все по‑ другому. Даже если у них слюнки текут во сне – и то на них смотреть не противно.

 

 

«Над пропастью во ржи» («The Catcher in the Rye») – роман писателя Джерома Дэвида Сэлинджера, написанный в 1951 году.

 

Пример 1. Дано целое неотрицательное число N. При записи N в двоичной системе счисления получается последовательность из 0 и 1. Например, при N=19 получается 1910=1· 24+0· 23+0· 22+1· 21+1· 20, то есть в двоичной системе счисления число 1910 запишется как 100112. При циклическом сдвиге вправо получаются другие числа. Найти максимальное среди этих чисел. Так, для числа 19 результат циклического сдвига следующий:

 

110012=2510

111002=2810

011102=1410

001112=710

100112=1910

 

Соответственно, максимальным является число 28.

Привести результаты работы программы для чисел 181, 234759, 4078945139.

Текст программы (компилятор VC++.NET 10.0):

#include " stdafx.h" // подключение стандартной системной библиотеки

#include " iostream" // подключение библиотеки ввода/вывода

#include " math.h" // подключение библиотеки математических функций

 

using namespace System; // используем системное пространство имен

using namespace std; // используем пространство имен стандартной библиотеки

 

int main(array< System:: String ^> ^args) // точка входа в программу

{

unsigned int val=181; // целое неотрицательное число, заданное по условию задачи

// переменная для хранения максимального значения, начальное значение равно 181

unsigned int max=val;

unsigned int d=val; // переменная для использования в алгоритме программы

int pos=0; // переменная для определения разрядности числа

int mask=0; // переменная для создания маски, которая используется для реализации циклического сдвига вправо

 

// определение разрядности числа

while(d/2> 0) // цикл выполняется пока переменная больше 0

{

d=d/2; // делим значение переменной на 2, дробная часть отбрасывается

pos++; // увеличиваем значение переменной на 1

}

 

mask=(1< < pos); // формирование маски

 

for(int i=0; i< =mask; i++) // количество сдвигов зависит от разрядности числа

{

d=val& 0x00000001; // выделяем младший бит числа

val=val> > 1; // сдвигаем на 1 бит вправо

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

if(d==1) val|=mask;

// сравниваем новое значение с максимальным, и если оно больше,

то присваиваем переменной max новое значение

if(val> max) max=val;

}

cout< < " max=" < < max< < " \n"; // вывод результата на экран

// чтобы окно программы не закрылось, запрашиваем ввод любых данных

Console:: ReadLine();

return 0; // завершение работы программы

}

Проверка работы программы. Для числа 19 результат выполнения программы представлена на рис. 1.

Рис. 1.

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

Рис. 2.

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

Рис. 3.

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

Рис. 4.

Пример 2. Рассмотрим еще один пример – консольное приложение «Двоичный калькулятор». Внимание! Ахтунг! Компилятор VC++ 6.0.

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

 

#include < stdio.h>

#include < math.h>

#include < conio.h>

 

int vvod1(); // функция запроса ввода первого числа

int vvod2(); // функция запроса ввода второго числа

int rez(int d); // функция вывода результата на экран в двоичном виде

int main() // программа начинает выполнятся с этого места

{

int ch1, ch2; // объявление переменных целочисленного типа

int c, d, dd, a, b; // объявление переменных символьного типа

while (c! = 0) // до тех пор пока пользователь не введет 0 программа выполняется

{

// вывод на экран меню

printf(" \n1 - Slozhenie\n"); // 1 - сложение

printf(" 2 - Vychitanie\n"); // 2- вычитание

printf(" 3 - Delenie\n"); // 3 - деление

printf(" 4 - Umnozhenie\n"); // 4 - умножение

printf(" 0 - Exit\n\n"); // 0 - выход из программы

scanf(" %d", & c); // запрос ввода значения в переменную с

switch (c) // конструкция выбора, проверяем значение переменной с

{

//Сложение

case 1: // если введено значение 1

{

ch1 = vvod1(); // вызов функции ввода первого числа

ch2 = vvod2(); // вызов функции ввода второго числа числа

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

// а затем выполняют преобразование в десятичный формат

d=ch1+ch2; // сложение чисел

rez(d); // вызов функции вывода результата на экран в двоичном виде

getch(); // ожидание нажатия клавиши пользователем

}

break;

//Вычитание

case 2:

{

ch1 = vvod1(); // вызов функции ввода первого числа

ch2 = vvod2(); // вызов функции ввода второго числа числа

d=ch1-ch2; // вычитание чисел

rez(d); // вызов функции вывода результата на экран в двоичном виде

getch(); // ожидание нажатия клавиши пользователем

}

break;

//Деление

case 3:

{

ch1 = vvod1(); // вызов функции ввода первого числа

ch2 = vvod2(); // вызов функции ввода второго числа числа

d=ch1/ch2; // деление чисел

rez(d); // вызов функции вывода результата на экран в двоичном виде

getch(); // ожидание нажатия клавиши пользователем

}

break;

//Умножение

case 4:

{

ch1 = vvod1(); // вызов функции ввода первого числа

ch2 = vvod2(); // вызов функции ввода второго числа числа

d=ch1*ch2; // умножение чисел

rez(d); // вызов функции вывода результата на экран в двоичном виде

getch(); // ожидание нажатия клавиши пользователем

}

break;

}

}

return 0;

}

 

int vvod1() // функция запроса ввода первого числа

{

int a=0, i, count=0, j, as, sa; // объявление переменных

char str[50]; // масив символов для ввода числа в двоичном виде

printf(" Vvedite pervoe dvoichnoe chislo: \n"); // вывод сообщения на экран

scanf(" %s", str); // ожидание ввода строки символов,

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

for (i=0; str[i]! ='\0'; i++) // в цикле проверяем символы на неравенство пробелу

{

if (str[i]! =' ') // если введенный символ не пробел

{

count++; // увеличивваем значение переменной для подсчета количества разрядов

}

}

int* mas=new int[count]; // создаем динамически массив

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

char popo; // объявление дополнительной переменной

for (i=0; i< count; i++) // в цикле проверяем каждый элемент массива символов

{

popo=str[i]; // копируем элемент массива в переменную

switch (popo) // проверяем значение переменной

{

case '0': {mas[i]=0; } break; // если 0, то в массив mas записываем число 0

case '1': {mas[i]=1; } break; // если 1, то в массив mas записываем число 1

}

}

for (i=0; i< count; i++) // в цикле вычисляем десятичное значение введенного числа

{

sa=((count-i)-1);

a+=mas[i]*pow(2, sa); // возводим 1 в степень, равную позиции разряда в числе

}

return a; // возвращаем число

}

 

int vvod2()

{

int b=0, i, count=0, j, as, sa; // объявление переменных

char str[50]; // масив символов для ввода числа в двоичном виде

printf(" Vvedite vtoroe chislo: \n"); // вывод сообщения на экран

scanf(" %s", str); // ожидание ввода строки символов,

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

for (i=0; str[i]! ='\0'; i++)// в цикле проверяем символы на неравенство пробелу

{

if (str[i]! =' ')// если введенный символ не пробел

{

count++; // увеличивваем значение переменной для подсчета количества разрядов

}

}

int*mas=new int[count]; // создаем динамически массив

char popo; // объявление дополнительной переменной

for (i=0; i< count; i++)// в цикле проверяем каждый элемент массива символов

{

popo=str[i]; // копируем элемент массива в переменную

switch (popo)// проверяем значение переменной

{

case '0': {mas[i]=0; } break; // если 0, то в массив mas записываем число 0

case '1': {mas[i]=1; } break; // если 1, то в массив mas записываем число 1

}

}

for (i=0; i< count; i++)// в цикле вычисляем десятичное значение введенного числа

{

sa=((count-i)-1);

b=b+(mas[i]*(pow(2, sa))); // возводим 1 в степень, равную позиции разряда в числе

}

return b; // возвращаем число

}

 

int rez(int d) // функция вывода результата на экран в двоичном виде

{

int i=0, b=0, dd=0, bb=0; // объявление целочисленных переменных

dd = d;

bb = d;

for (i=0;; i++) // в цикле выполняем деление исходного числа,

{

b++; // инкремент переменной для подсчета количества двоичных разрядов в числе

d=d/2; // делим исходное число на 2

if (d< 2) // проверяем результат деления, и если он меньше 2

{

break; // прерываем выполенние цикла

}

}

b=b+1; //из скольки чисел будет состоять двоичное число

int *cel=new int[b]; // создаем массивы с количеством элементов,

int *ost=new int[b]; // равным количеству разрядов в числе

int *dvoich=new int[b]; // массив для хранения результирующего значения

for (i=0; i< b; i++) // в цикле выполняется преобразование числа из десятичного в двоичный код

{

cel[i]=bb/2; // делим число на 2 и записываем результат деления в массив

ost[i]=cel[i]; // копируем элемент массива

bb=bb/2; // уменьшаем значение числа в 2 раза

cel[i]=dd-(cel[i]*2); // находим целую часть

dd=ost[i]; // записываем остаток

dvoich[(b-1)-i]=cel[i]; // записываем значение очередного бита в соотвтествующую позицию массива

}

printf(" Rezultat: "); // вывод строки на экран

for (i=0; i< b; i++) // в цикле выводится значение элементов массива

{

printf(" %d", dvoich[i]); // вывод значения элемента массива

}

return dvoich[i]; // выход из функции, возвращается значение последнего бита

}

 

После компиляции программы можно проверить ее работу. На рис. 5 представлено окно программы в режиме выполнения.

Рис. 5.

Для проверки операции сложения введены числа в двоичном виде 0101 (5 в десятичном виде) и 0011 (3 в десятичном виде). В результате сложения этих чисел результат получился 1000, что соответствует числу 8 в десятичном виде (5+3=8). Для проверки вычитания введены числа 1000 и 0011 (8 и 3 в десятичном виде). В результате вычитания получилось значение 101 (5 в десятичном виде, 8-3=5). Для проверки деления введены числа 1100 и 0100 (12 и 4 в десятичном виде). В результате деления получилось число 11 (3 в двоичном виде, 12/4=3). Для проверки умножения введены числа 0011 и 0100 (3 и 4 в двоичном виде). В результате умножения получилось число 1100 (12 в десятичном виде, 3*4=12). Анализ результатов подтверждает корректность работы программы.

<== предыдущая лекция | следующая лекция ==>
Внешняя политика | Сущность и виды организационных решений




© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.