Файл: Разработка модуля для выполнения операций с натуральными числами в 16-ричной системе счисления (1 Выбор и проработка программных средств).pdf
Добавлен: 04.07.2023
Просмотров: 52
Скачиваний: 2
Введение
Системой счисления называют систему приемов и правил, позволяющих устанавливать взаимно-однозначное соответствие между любым числом и его представлением в виде совокупности конечного числа символов. Множество символов, используемых для такого представления, называют цифрами.
В зависимости от способа изображения чисел с помощью цифр системы счисления делятся на позиционные и непозиционные.
В непозиционных системах любое число определяется как некоторая функция от численных значений совокупности цифр, представляющих это число. Цифры в непозиционных системах счисления соответствуют некоторым фиксированным числам. Пример непозиционной системы – рассмотренная ранее римская система счисления. Древние египтяне применяли систему счисления, состоящую из набора символов, изображавших распространенные предметы быта. Совокупность этих символов обозначала число. Расположение их в числе не имело значения, отсюда и появилось название.
Исторически первыми системами счисления были именно непозиционные системы. Одним из основных недостатков является трудность записи больших чисел. Запись больших чисел в таких системах либо очень громоздка, либо алфавит системы чрезвычайно велик.
В вычислительной технике непозиционные системы не применяются.
Систему счисления называют позиционной, если одна и та же цифра может принимать различные численные значения в зависимости от номера разряда этой цифры в совокупности цифр, представляющих заданное число. Пример такой системы – арабская десятичная система счисления.
Количества и количественные составляющие, существующие реально могут отображаться различными способами. В общем случае в позиционной системе счисления число N может быть представлено как:
где b – основание системы счисления; n – цифры в интервале от 0 до b-1.
Основание позиционной системы счисления определяет ее название. В вычислительной технике применяются двоичная, восьмеричная, десятичная и шестнадцатеричная системы. В дальнейшем, чтобы явно указать используемую систему счисления, будем заключать число в скобки и в нижнем индексе указывать основание системы счисления.
Каждой позиции в числе соответствует позиционный (разрядный) коэффициент или вес.
Шестнадцатеричная система счисления (шестнадцатеричные числа) — позиционная система счисления по целочисленному основанию 16.
Обычно в качестве шестнадцатеричных цифр используются десятичные цифры от 0 до 9 и латинские буквы от A до F для обозначения цифр от 10 до 15, то есть (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F). Широко используется в низкоуровневом программировании и компьютерной документации, поскольку в современных компьютерах минимальной единицей памяти является 8-битный байт, значения которого удобно записывать двумя шестнадцатеричными цифрами. Такое использование началось с системы IBM/360, где вся документация использовала шестнадцатеричную систему, в то время как в документации других компьютерных систем того времени (даже с 8-битными символами, как, например, PDP-11 или БЭСМ-6) использовали восьмеричную систему.
Глава 1. Выбор и проработка программных средств
Для разработки данного проекта был выбран достаточно молодой и прогрессивно развивающийся язык C#. В качестве среды проектирования использовался свободно-распространяемый проект Mono, как бесплатный аналог Microsoft Visual Studio и средство разработки с помощью платформы .NET на не- Windows платформах.
"Си шарп" (официально C#) является новым объектно-ориентированным языком программирования, разработанным для максимально удобного использования всех возможностей платформы Microsoft.NET. Во многом является схожим с другими популярными объектно-ориентированными языками, такими как C++ и Java, но имеет свои особенности. Благодаря появлению нового свободного проекта Mono, в Linux появилась возможность разрабатывать приложения на C#.
Mono — программная платформа, позволяющая разработчикам достаточно просто создавать развитые кроссплатформенные приложения. Технология Mono разрабатывается в виде open source реализации технологии .NET Framework от Microsoft и поддерживает стандарты ECMA-334 (стандарт языка C#) и ECMA-335 (стандарт среды исполнения Common Language Runtime, CLI). Открытость указанных стандартов позволяет уменьшить проблемы создания кроссплатформенных приложений.
В настоящее время в рамках этого проекта реализованы два стандарта: язык программирования C# (Стандарт ECMA-334) и "инфраструктура обобщенного языка программирования" (CLI) (Стандарт ECMA-335). Обе спецификации были разработаны в корпорации Microsoft и представлены ECMA (Европейской Ассоциации Производителей Компьютеров) в октябре 2000 г. Формальное одобрение было получено в декабре 2001 г., и эти предложения становятся стандартами ISO (благодаря соглашению, существующему между ISO и ECMA).
Проект Mono спонсируется компанией Ximian — той самой, которая предоставила миру графический рабочий стол GNOME. Лидером проекта является мексиканский программист, главный технический директор компании Ximian — Miguel de Icaza. Специалисты, привлеченные к разработке проекта Mono, в очень короткое время проделали огромный объем работ.
В базовом варианте Mono состоит из нескольких компонентов:
- компилятор языка C# — компилятор с полной поддержкой версий 1.0 и 2.0 языка C#. Кроме того в последних версиях поддерживаются практически все возможности версии C# 3.0, а начиная с версии Mono 2.6 включена поддержка возможностей версии C# 4.0 (пока только как опция, полноценная поддержка заявлена в версии 2.8);
- среда исполнения Mono — состоит из среды исполнения (CLI) непосредственно, компилятора среды исполнения (Just-In-Time, JIT), генератора машинного кода (Ahead-Of-Time, AOT), загрузчика сборок, сборщика мусора, подсистемы управления многопоточностью и компонентов поддержки взаимодействия между сборками и COM (или аналогами в Linux, например XCOM);
- базовая библиотека классов — набор стандартных классов, совместимых с классами Microsoft .NET Framework;
- библиотека классов Mono — набор классов, поддерживающих дополнительные функции для разработки Linux-приложений. Например, классы для поддержки Zip, OpenGL, Cairo, Gtk+.
На представленной на рисунке 1.1 диаграмме показан путь, который проходит программа на языке C# от компиляции до исполнения.
Компилятор Mono C# поддерживает версии языков C# 1.0-4.0 (про совместимость с .NET 4.5 данных нет). Для создания кода можно использовать один из нескольких вариантов компилятора, в зависимости от потребностей:
- mcs — компилятор, поддерживающий версию 1.1 среды исполнения. Компилирует код на языке C# (без поддержки generic и всего, что с ним связано). Данный компилятор планируется исключить в версии Mono 2.8, как устаревший.
-gmcs — компилятор, поддерживающий версии от 2.0 до 3.5 среды исполнения и обладающий полной поддержкой C# 3.0.
- smcs — опциональный компилятор для создания Moonlight (аналог Microsoft Silverlight) приложений.
- dmcs — опциональный компилятор, реализованный в тестовом варианте в версии Mono 2.6 и планируемый к включению в версию 2.8. Поддерживает среду исполнения версии 4.0 и язык C# 4.0.
Рисунок 1.1 – Логическая модель работы C#-программы, написанной с использованием проекта Mono
Начиная с версии Mono 2.2 реализована поддержка классов компилятора Mono.CSharp.Evaluator (сборка Mono.Sharp.dll) для создания собственных сервисов компиляции.
Среда исполнения Mono поддерживает инфраструктуру промежуточного языка CLI (Common Language Infrastructure), соответствующую стандарту ECMA-335. Виртуальная машина среды исполнения допускает возможность запуска приложений и сборок, скомпилированных в других системах (например, возможно запускать в Linux без перекомпиляции приложения, созданные при помощи Microsoft Visual Studio для исполнения в Microsoft Windows).
Также, вместо использования виртуальной машины, среда исполнения может быть интегрирована в приложение с целью создания встраиваемой системы, не требующей установки Mono для запуска и обладающей высоким быстродействием. При этом, в приложение включаются только необходимые компоненты среды исполнения.
В среде Mono реализован Ahead-Of-Time (AOT) компилятор промежуточного языка. Цель этого компилятора в том, чтобы уменьшить время запуска программы и оптимизировать ее код, путем компиляции промежуточного языка CLI в машинный код. Аналогом в Microsoft .NET Framework является утилита Ngen. Для запуска приложения в этом режиме можно воспользоваться опцией --aot среды исполнения (также можно включить полную оптимизацию кода при помощи опцее -O=all).
В качестве сборщика мусора в данный момент используется Boehm's GC, однако в текущей разрабатываемой ветке SVN присутствует совершенно новый сборщик мусора, разработанный специально для Mono.
Глава 2. Проект программы
Проект программы представлен в виде четырех основных классов: класс Program, являющийся классом по умолчанию, содержащем в себе точку входа приложения (static void Main(string[] args)), класса HEX, описывающего основную логику создания и взаимодействия шестнадцатеричных чисел, а также оставшиеся два класса в пространстве имен HEXNumbers.test для проведения тестов и проверки правильности разработанного приложения: Sorting и Involution.
Приведем данные о представленных классах и опишем их сигнатуру.
Program
Этот класс содержит в себе только лишь точку входа в приложение, в котором вызываются два теста, заданных по условию технического задания: сортировка массива в порядке убывания и возведение шестнадцатеричного числа в степень, также представленную в шестнадцатеричном представлении.
HEX
Представление этого класса обозначено на рисунке 2.1.
Рисунок 2.1 – Класс HEX
Новый экземпляр класса НЕХ можно создать, передав в качестве аргумента конструктору либо число в десятичном представлении, либо строку, содержащую шестнадцатеричный вид числа.
Перегруженный метод ToString() возвращает строковый вариант текущего hex- значения.
Остальные статические методы класса НЕХ позволяет производить арифметические операции над объектами класса, а также конвертацию представлений: десятичное и шестнадцатеричное. Также отдельный статический метод позволяет провести проверку на корректность данного числа как шестнадцатеричного.
- CorrectHEXNumber – метод, позволяющий провести проверку шестнадцатеричного числа. Возвращает булево значение как результат проверки, принимает строковое выражение в качестве аргумента.
- ConvertFromHEX – позволяет провести конвертацию из шестнадцатеричного представления в десятичное. Метод перегружен и может принимать в качестве аргумента строковую константу либо объект типа НЕХ. Метод возвращает значение типа int.
- ConvertFromDecimal – проводит конвертацию числа из десятичной системы счисления. Метод принимает в качестве аргумента объект типа int, а возвращаемое значение – HEX.
- «operator +», «operator –«, «operator *», «operator /» – статические операторы, проводящие арифметические операции. Все методы возвращают значение типа HEX, в качестве аргументов принимаются два аргумента того же типа.
Оставшийся скрытый метод предназначается для проведения проверки числа на совместимость с шестнадцатеричным представлением и генерацию исключения в случае, если проверка не проходит. Этот метод используется во всех членах, где в качестве аргумента используется строковая константа, которая после используется для создания нового НЕХ-объекта.
Sorting
Статический класс, находящийся в пространстве имен HEXNumbers.test предназначен для решения задачи сортировки массива по убыванию. Единственный публичный метод Start начинает тестирование. Для более компактного и осмысленного прочтения кода весь процесс тестирования был разнесен на методы:
- creating – метод, добавляющий в динамический масив заданное параметром количество случайных шестнадцатеричных чисел;
- showArray и showArrayDec – методы, выводящие в консоль представление массива в шестнадцатеричном и десятичном соответственно представлении элементы массива, созданном ранее;
- sortList – производит сортировку массива с помощью указанного правила. Метод возвращает число типа int для вывода в консоль интервала времени в миллисекундах, затраченного на выполнение сортировки.
Involution
Оставшийся статический класс из пространства имен HEXNumbers.test, он позволяет возвести указанное число в указанную степень, представленных в шестнадцатеричном представлении.