6227

Реализация компонента, осуществляющего перевод чисел в различные системы счисления

Курсовая

Информатика, кибернетика и программирование

В курсовой работе разработан собственный компонент, осуществляющий перевод чисел в различные системы счисления. Реализация модулей, описанных при создании данного компонента, произведена в среде программирования Borland C++ Builder Содержание...

Русский

2012-12-30

189.5 KB

71 чел.

В курсовой работе разработан собственный компонент, осуществляющий перевод чисел в различные системы счисления. Реализация модулей, описанных при создании данного компонента, произведена в среде программирования Borland C++Builder 6.

Содержание

Введение……………………………………………………………………………….5

1 Анализ технического задания……………………………………………………7

2 Проектирование структуры программы и базовых алгоритмов…………..10

3 Программная реализация разработанной структуры и алгоритмов……..12

4 Руководство программиста……………………………………………………..18

5 Руководство пользователя……………………………………………………...20

6 Результаты тестирования созданного программного продукта…………..22

Заключение…………………………………………………………………………..24

Список использованной литературы…………………………………………….25

ПРИЛОЖЕНИЕ А……………………………………………………………………26


Введение

Система счисления – это способ наименования и изображения чисел с помощью символов, имеющих определенные количественные значения.

Для изображения чисел в настоящее время используются в основном позиционные системы счисления. Привычной для всех является десятичная система счисления. В этой системе для записи всех чисел используются только десять различных знаков (цифр): 0,1,2,..,9.

В современной вычислительной технике, в устройствах автоматики и связи широко используется двоичная система счисления. Эта система с наименьшим возможным основанием. В ней для изображения числа используются только две цифры: 0 и 1.

Неудобство использования двоичной системы счисления заключается в громоздкости записи чисел. Это неудобство не имеет существенного значения для ЭВМ. Однако, если возникает необходимость кодировать информацию «вручную», например, при составлении программы на машинном языке, то предпочтительнее оказывается пользоваться восьмеричной или шестнадцатеричной системой счисления.

В восьмеричной системе счисления базисными числами являются 0,1,….,7. Запись каждого числа в этой системе счисления основывается на его разложении по степеням числа восемь с коэффициентами, являющимися базисными числами.

В шестнадцатеричной системе счисления базисными числами являются числа от нуля до девяти и буквы A,B,C,D,E,F.

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


1 Анализ технического задания

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

Компонент перевода будет разработан в среде Borland C++ Builder 6, которая представляет собой совершенную интерактивную среду программирования на языке C++. Система обеспечивает высокую продуктивность и производительность, удовлетворяя современным требованиям к разработке приложений под Windows. C++Builder предоставляет неограниченные возможности создания новых компонентов и обладает такими элементами языка, как свойства, методы, события, которые в свою очередь обеспечивают ускоренную разработку приложений в рамках объектно-ориентированного программирования.

В ходе выполнения работы необходимо выполнить следующие действия:

  •  Создание модуля нового компонента.
  •  Наследование производного компонентного класса от базового.
  •  Добавление нужных свойств, событий и методов.
  •  Регистрация компонента в C++Builder.
  •  Испытание компонента.
  •  Установка компонента на Палитру компонентов.
  •  Сохранение файлов компонента.

Первым шагом создания компонента будет определение базового класса. Компоненты разделяются на видимые (визуальные) и невидимые (невизуальные). Визуальные компоненты появляются во время выполнения точно так же, как и во время проектирования. Примерами являются кнопки и редактируемые поля. Невизуальные компоненты появляются во время проектирования как пиктограммы на форме. Они никогда не видны во время выполнения, но обладают определенной функциональностью. Анализируя поставленные задачи, можно сделать вывод, что создаваемый компонент будет невизуальным, т.к. он будет содержать метод перевода и нет необходимости в том, чтобы он был видимым на форме в процессе выполнения приложения.

Метод перевода числа можно описать различными способами, например, описать методы перевода числа для каждой из возможных систем счисления, но это сделает код функции очень громоздким. Также можно воспользоваться стандартными функциями перевода среды C++ Builder (IntToHex, IntToBin, HexToBin, BinToHex), но тогда придется включать в компонент лишние модули, в которых они описаны. К тому же придется вводить размер (длину) получаемого результата, что сделает неудобной работу с компонентом. Кроме того, если воспользоваться этими функциями, то будет возможной работа только с тремя системами счисления (десятичной, двоичной и шестнадцатеричной). Удобнее всего написать собственные функции перевода – перевод в десятичную систему счисления и перевод из десятичной системы счисления в нужную. Этих функций будет достаточно для работы со всеми системами счисления, т. к. для различных систем счисления используются одинаковые алгоритмы перевода. Таким образом, функция перевода будет вызывать еще две функции в зависимости от задаваемых систем счисления. Чтобы не возникали ошибки в работе функций, необходимо проверять, соответствует ли введенное число заданной системе счисления. Для этого функция перевода будет вызывать и функцию проверки. При несоответствии введенного числа заданной системе счисления будет выдано сообщение об ошибке.

Следует отметить, что существуют программные продукты, выполняющие похожие функции, например Калькулятор. Но Калькулятор позволяет переводить числа в двоичную, восьмеричную, десятичную и шестнадцатеричную системы счисления. Компонент перевода позволит работать с системами счисления с основаниями 2..10 и 16.

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


2 Проектирование структуры программы и базовых алгоритмов

Создаваемый компонент «Перевод чисел из одной системы счисления в другую» имеет два новых свойтва и четыре метода. Новыми свойствами являются исходная и конечная системы счисления, а методами – перевод числа, проверка правильности ввода, перевод в десятичную систему счисления и из десятичной.

Структуру создаваемого компонента можно представить следующим образом (в схеме сокращение СС – система счисления):

Рисунок 1 – Структурная схема компонента

Как видно из схемы, при переводе числа сначала вызывается функция, проверяющая соответствие введенного числа исходной системе счисления, т. е. проверяющая, не содержит ли переводимое число символы, не входящие в набор базовых символов исходной системы счисления. Если число введено неверно, то выдается соответствующее сообщение. Если заданные системы счисления не являются системами счисления с основаниями 2..10 и 16, то также будет выдаваться сообщение об ошибке. Если все правильно, то осуществляется перевод числа.

Перевод числа проходит два этапа: перевод числа в десятичную систему счисления, а затем в конечную, заданную соответствующим свойством. Переводы осуществляются по известным алгоритмам.

Задача перевода произвольного числа Х, заданного в системе счисления с основанием q в десятичную систему сводится к вычислению полинома вида:

X=anqn+an-1qn-1+…+a1q1+a0q0

где anan-1a1a0 – запись любого числа в виде последовательности цифр.

Для перевода числа из десятичной системы счисления в систему счисления с основанием q, его последовательно делят на q, пока не останется остаток, меньший или равный (q-1). Число в системе счисления с основанием q записывается как последовательность остатков от деления, записанных в обратном порядке, причем первое число будет частным от последнего деления.

Таким образом, структура компонента «Перевод чисел из одной системы счисления в другую» разработана так, чтобы обеспечить выполнение всех его функций, а именно перевода числа и проверки правильности ввода в зависимости от заданных систем счисления.


3 Программная реализация разработанной структуры и алгоритмов

Компонент «Перевод чисел из одной системы счисления в другую» разработан в среде программирования Borland C++ Builder 6. Создание компонента проходит несколько этапов:

1. Выбор базового класса и создание нового класса наследованием от выбранного базового.

Разрабатываемый компонент называется NumberConverter. Как уже было сказано, при использовании компонента пользователю важна лишь функция перевода числа, поэтому нет необходимости в том, чтобы компонент был визуальным, значит наследование нужно осуществлять от класса TСomponent.

2. Теперь нужно описать новые свойства и методы компонента.

NumberConverter имеет два свойства: SourceSysS – исходная система счисления и FinalSysS – конечная система счисления. Эти свойства должны отображаться в инспекторе объектов, поэтому их описание нужно поместить в раздел published.

__published:

       __property int SourceSysS = {read = FSourceSysS,

                                    write = FSourceSysS,

                                    default = 10};

       __property int FinalSysS = {read = FFinalSysS,

                                   write = FFinalSysS,

                                   default = 2};

Так как компонент позволяет работать только с определенными системами счисления, то для избежания ошибок лучше создать редакторы этих свойств в виде выпадающих списков. Для этого в файле заголовков компонента необходимо привести описание класса редактора свойств.

class TSysSPropertyEditor : public TIntegerProperty

{

public:

       TPropertyAttributes __fastcall GetAttributes ();

       void __fastcall GetValues (TGetStrProc IntVal);

};

В файле кодов нужно описать функции редактора свойств. Разрешить раскрывающийся список значений свойства:

TPropertyAttributes __fastcall TSysSPropertyEditor::GetAttributes()

{

 return TPropertyAttributes () << paValueList;

}

Задать значения:

void __fastcall TSysSPropertyEditor::GetValues(TGetStrProc IntVal)

{

 IntVal("2");

……………

 IntVal("10");

 IntVal("16");

}

Затем нужно зарегистрировать созданный редактор свойств:

PTypeInfo typeinfo = *GetPropInfo (__typeinfo(TNumberConverter), "SourceSysS")->PropType;

RegisterPropertyEditor(typeinfo, __classid(TNumberConverter),

                "SourceSysS", __classid(TSysSPropertyEditor));

RegisterPropertyEditor(typeinfo, __classid(TNumberConverter),

                "FinalSysS", __classid(TSysSPropertyEditor));

Кроме двух новых свойств компонент содержит метод перевода, т. к. он доступен пользователю, то его объявление должно быть в разделе public.

AnsiString __fastcall Convert (AnsiString);

Параметр, передаваемый в функцию, и возвращаемый результат имеют тип AnsiString, т. к. переводимое число и результат могут содержать буквы.

Кроме метода Convert, компонент имеет еще три метода: CheckingNumber, ConvToDec и ConvFromDec. Все три метода являются недоступными пользователю, поэтому их объявления помещены в раздел protected:

int __fastcall ConvToDec (AnsiString);

AnsiString __fastcall ConvFromDec (int);

int __fastcall CheckingNumber (AnsiString);

Метод Convert действует следующим образом. Сначала вызывается функция проверки. Метод CheckingNumber осуществляет проверку правильности ввода числа, тип которого AnsiString, а также проверяет, являются ли введенные системы счисления возможными для работы компонента. Функция возвращает одно из значений: 0, 1, 2. Значение “0” соответствует верному вводу, “1” – несоответствие числа системе счисления, ”2” – одна из введенных систем счисления или обе не являются системами счисления с основаниями 2..10 или 16. В зависимости от ошибки или ее отсутствия выводятся соответствующие сообщения или выполняется перевод.

switch (CheckingNumber(Numb))

{

  case 1:ShowMessage("Ошибка! Проверьте правильность ввода числа");

              return "Error";

  case 2:ShowMessage("Ошибка! NumberConverter не позволяет работать с введенной системой счисления");

            return "Error";

  case 0:RezultNumber = IntToStr (ConvToDec (Numb));

              if (FinalSysS != 10)

                  RezultNumber = ConvFromDec (StrToInt (RezultNumber));

              return RezultNumber;

}

Как уже было сказано, перевод осуществляется в два этапа. Сначала число переводится в десятичную систему счисления, а затем если конечная система счисления не десятичная, число переводится в нее.

Метод CheckingNumber основан на проверке принадлежности символа числа определенному набору символов, соответствующему каждой системе счисления. Здесь описаны три набора символов:

Set <char, 'A', 'F'> Lett;

Set <char, '0', '9'> Numb;

Set <int, 2, 16> SysS;

SysS<<2<<3<<4<<5<<6<<7<<8<<9<<10<<16;

Numb<<'0'<<'1'<<'2'<<'3'<<'4'<<'5'<<'6'<<'7'<<'8'<<'9';

Lett<<'A'<<'B'<<'C'<<'D'<<'E'<<'F';

Lett – набор букв, соответствующий шестнадцатеричной системе счисления,Numb – набор цифр от 0 до 9, SysS – набор чисел, содержащий основания всех систем счисления, работа с которыми возможна в созданном компоненте. Проверка осуществляется с определения длины числа.

int leng = StrLen(Number.c_str());

Затем осуществляется проверка каждого символа числа. При этом если встречается символ, не содержащийся в наборах Lett и Numb, возвращается единица.

if (!(Lett.Contains(Number[elem])) && (!(Numb.Contains(Number[elem]))))

{

  Mistake = 1;

  return Mistake;

}

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

if (SourceSysS != 16)

  if (!(Numb.Contains(Number[elem]))) Mistake = 1;

  else

     if (SourceSysS <= StrToInt(Number[elem]))

     Mistake = 1;

После этого идет последний шаг проверки – основания исходной и конечной систем счисления должны содержаться в наборе SysS. Если это условие не выполняется, то возвращается значение 2.

if ((!(SysS.Contains(SourceSysS)))||(!(SysS.Contains(FinalSysS))))

  Mistake = 2;

Проверка на данном шаге заканчивается и начинается непосредственно перевод числа в нужную систему счисления. Не зависимо от конечной, число переводится в десятичную систему счисления.

RezultNumber = IntToStr (ConvToDec (Numb));

Затем если конечная система счисления не десятичная, осуществляется перевод из десятичной системы счисления в конечную.

if (FinalSysS != 10)

  RezultNumber = ConvFromDec (StrToInt (RezultNumber));

Здесь перевод заканчивается и возвращается результат.

return RezultNumber;

Алгоритмы функций ConvFromDec и ConvToDec показаны в приложении.

После описания новых свойств и методов нужно откомпилировать модули компонента, зарегистрировать его и провести установку на палитру компонент. Регистрация компонента:

namespace Numberconverter

{

       void __fastcall PACKAGE Register()

       {

                TComponentClass classes[1] = {__classid (TNumberConverter)};

                RegisterComponents("MyComponents", classes, 0);

       }

}

Таким образом был создан собственный компонент NumberConverter, осуществляющий перевод чисел из одной системы счисления в другую. Для проверки работоспособности компонента было создано тестирующее приложение.


4 Руководство программиста

Компонент NumberConverter разработан в среде Borland C++ Builder 6 и предназначен для перевода чисел из одной системы счисления в другую. В качестве базового класса был выбран класс TСomponent, т.к. наследование от него предполагает создание невизуального компонента. В компонент были добавлены два новых свойства: исходная система счисления SourceSysS и конечная система счисления FinalSysS, имеющие тип int. Эти свойства отображаются в инспекторе объектов и описаны в разделе published следующим образом:

__property int SourceSysS = {read = FSourceSysS,

                              write = FSourceSysS,

                              default = 10};

__property int FinalSysS = {read = FFinalSysS,

                              write = FFinalSysS,

                              default = 2};

Еще в компонент добавлены четыре метода: Convert – перевод числа, CheckingNumber - проверка, ConvToDec – перевод в десятичную систему счисления, ConvFromDec – перевод из десятичной системы счисления. Пользователю доступен только метод Convert, поэтому он объявлен в разделе public. Остальные три метода объявлены в разделе protected для того, чтобы их можно было изменять при дальнейшем наследовании.

В компонент были включены следующие дополнительныые модули: DesignIntf.hpp и DesignEditors.hpp – для создания редактора свойств, math.h – для использования функции возведения в степень pow, dialogs.hpp – для использования функции ShowMessage.

Дальнейшее редактирование компонента возможно при наличии среды программирования Borland C++ Builder версии 6, т. к. в предыдущих версиях редакторы свойств описываются по-другому.

Созданный компонент может переводить только целые числа. К существующим возможностям компонента можно добавить возможность перевода дробных чисел, путем использования алгоритмов отдельного перевода целой и дробной частей числа с последующим объединением результатов. Для этого число должно быть предварительно разделено.

NumberConverter работает с системами счисоения с основаниями 2..10 и 16. Можно усовершенствовать его, добавив новые системы счисления.


5 Руководство пользователя

Компонент NumberConverter был разработан в среде Borland C++ Builder 6. Для того чтобы произвести инсталляцию компонента необходимо в меню Component выбрать пункт Install Component, затем в появившемся диалоговом окне (смотри рисунок 2) следует выбрать нужную вкладку – Into exsisting package или Into new package, т.е. установить компонент в существующий пакет, либо в новый пакет. Если происходит установка компонента в новый пакет, то необходимо выбрать с помощью Browse имя модуля компонента с расширением .cpp (NumberConverter.cpp) и имя пакета, куда будет помещен компонент (PackNumberConverter.bpk), причем имя пакета программист может задать любым. Только после установки компонента можно работать с ним.

Рисунок 2 - Диалоговое окно установки компонента

После установки компонента его пиктограмма появится на палитре компонент (смотри рисунок 3).

Рисунок3  - Пиктограмма компонента NumberConverter

Компонент используется для перевода чисел из одной системы счисления в другую. Данный компонент имеет два свойства SourceSysS и FinalSysS, значения которых выбираются из выпадающего списка (смотри рисунок 4) или задаются программно. По умолчаию значения свойств следующие: FinalSysS = 2, SourceSysS = 10. Возможна работа с системами счисления с основаниями 0..10 и 16. При задании другой системы счисления будет выдано сообщение об ошибке.

 

Рисунок 4 - Редакторы свойств – выпадающие списки

Для перевода числа должна быть вызвана функция Convert, в которую передается переводимое число, имеющее тип AnsiString. Функция также возвращает значение типа AnsiString.


6 Результаты тестирования созданного программного продукта

Как было сказано выше, для проверки работоспособности созданного компонента было создано тестирующее приложение. Форма тестирующего приложения выглядит следующим образом:

Рисунок 5 - Форма тестирующего приложения

Работа компонента показана на рисунках 6-8.

Рисунок 6 - Перевод чисел

Рисунок 7 - Ошибка ввода числа

Рисунок 8 - Неправильный ввод системы счисления

Результаты тестирования показали, что компонент NumberConverter полностью работоспособен.


Заключение

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

В ходе тестирования было разработано тертирующее приложение, демонстрирующее работу компонента. В результате была проверена работа всех функций компонента и установлено, что компонент полностью работоспособен.

Допустимо и дальнейшее усовершенствование компонента. Например, можно реализовать алгоритмы перевода дробных чисел. Также можно описать работу с другими системами счисления.

В целом поставленная в курсовой работе задача была выполнена. Достоинством созданного компонента является удобство и простота его использования при создании разнообразных программ.


Список использованной литературы

1 Архангельский А.Я. Программирование в C++Builder 6. – М.:ЗАО «Издательство БИНОМ», 2004.

2 Страуструп Б. Язык программирования C++. Ч 1: Пер. с англ. – Киев: ДиаСофт, 1993.

3 Страуструп Б. Язык программирования C++. Ч 2: Пер. с англ. – Киев: ДиаСофт, 1993.


ПРИЛОЖЕНИЕ А

(обязательное)

Блок – схемы функций перевода чисел

Рисунок 9 – Блок-схема алгоритма перевода числа

в десятичную систему счисления


Рисунок 10 – Блок-схема алгоритма перевода числа из десятичной системы счисления


компонент

исходная СС

конечная СС

еревод

проверка

перевод в

десятичную СС

перевод в

конечную СС

ConvToDec

начало

Len=StrLen(Number)

SisS=16

i=1(1)len

Numberi=A

Numberi=B

Numberi=C

Numberi=E

Numberi=D

Numberi=F

masi=10

masi=11

masi=12

masi=13

masi=Numberi

masi=14

masi=15

+

-

+

-

+

-

+

-

+

-

+

-

i=1(1)len

masi=Numberi

+

-

RezNum=0

i=1(1)len

RezNum=RezNum+masi*SisSlen-i

Return (RezNum)

ConvToDec

конец

ConvFromDec

начало

Number>=NewSisS

ai=Number%NewSisS

i=i+1

Number=Number/NewSisS

lg=i

alg=Number

NewSisS=16

j=1(1)lg

alg-j

RezNum=RezNum+’A’

RezNum=RezNum+’B’

RezNum=RezNum+’C’

RezNum=RezNum+’D’

RezNum=RezNum+’E’

RezNum=RezNum+’F’

RezNum=RezNum+IntToStr(alg-j)

RezNum=RezNum+IntToStr (a[lg - j])

Return (RezNum)

ConvFromDec

конец

i=1(1)len