![](/stc/img/evkova.png)
Разработка модуля для выполнения операций с натуральными числами в 16-ричной системе счисления (1 Выбор и проработка программных средств)
Содержание:
Введение
Системой счисления называют систему приемов и правил, позволяющих устанавливать взаимно-однозначное соответствие между любым числом и его представлением в виде совокупности конечного числа символов. Множество символов, используемых для такого представления, называют цифрами.
В зависимости от способа изображения чисел с помощью цифр системы счисления делятся на позиционные и непозиционные.
В непозиционных системах любое число определяется как некоторая функция от численных значений совокупности цифр, представляющих это число. Цифры в непозиционных системах счисления соответствуют некоторым фиксированным числам. Пример непозиционной системы – рассмотренная ранее римская система счисления. Древние египтяне применяли систему счисления, состоящую из набора символов, изображавших распространенные предметы быта. Совокупность этих символов обозначала число. Расположение их в числе не имело значения, отсюда и появилось название.
Исторически первыми системами счисления были именно непозиционные системы. Одним из основных недостатков является трудность записи больших чисел. Запись больших чисел в таких системах либо очень громоздка, либо алфавит системы чрезвычайно велик.
В вычислительной технике непозиционные системы не применяются.
Систему счисления называют позиционной, если одна и та же цифра может принимать различные численные значения в зависимости от номера разряда этой цифры в совокупности цифр, представляющих заданное число. Пример такой системы – арабская десятичная система счисления.
Количества и количественные составляющие, существующие реально могут отображаться различными способами. В общем случае в позиционной системе счисления число 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, он позволяет возвести указанное число в указанную степень, представленных в шестнадцатеричном представлении.
Так же, как и в классе Sorting, публичный метод Start начинает тестирование. Инкапсулированный метод creatingNumbers предоставляет пользователю возможность ввести основание и степень для вычислений с проведением соответствующих проверок.
Структурная схема разработанного приложения представлена на рисунке 2.2.
Рисунок 2.2 – Структурная схема приложения HEXNumbers
Глава 3. Описание алгоритмов и текст программы
3.1 Создание и конвертация шестнадцатеричных чисел
Конструктор класса HEX перегружен и может принимать как число в десятичном представлении, так и строку, содержащую шестнадцатеричный вариант числа.
public HEX(int decNumber)
{ _number = decNumber; }
public HEX(string hexNumber)
: this(ConvertFromHEX(hexNumber))
{}
_number является скрытым членом типа int, который содержит десятичное представление создаваемого числа. В случае первого конструктора аргумент просто присваивается инкапсулированному члену. При применении перегруженного варианта конструктора к члену _number присваивается результат статического метода ConvertFromHEX.
public static int ConvertFromHEX(string hex)
{
ThrowExceprtionIfNotValidHEX(hex);
return int.Parse(hex, NumberStyles.HexNumber);
}
В этом случае производится проверка на правильность указания шестнадцатеричного числа в строке с помощю метода ThrowExceprtionIfNotV alidHEX.
static void ThrowExceprtionIfNotValidHEX(string hex)
{
if (!CorrectHEXNumber(hex)) throw new ApplicationException();
}
Проверка производится с помощью публичного статического метода CorrectHEXNumber. Если проверка оказывается провальной, вызывается исключение типа ApplicationException, как безопасного типа исключения для системы.
public static bool CorrectHEXNumber(string hex)
{
return HEXExpression.Match(hex).Value == hex;
}
Для проведения проверки используется регулярное выражение, с помощью метода можно возвратить ту часть строки, которая удовлетворяет заданному шаблону. В данном случае проводится проверка на равенство исходной строки и результата сравнения регулярного выражения.
Регулярное выражение, которое определяет символы шестнадцатеричного представления числа, создается следующим образом:
static Regex HEXExpression;
HEXExpression = new Regex("[0-9a-fA-F]+");
Для присваивания значения члену _number используется перегруженный метод int.Parse, в параметрах которого указывается строка, содержащая нужное число, и система счисления, которая используется в представлении.
Открытый рефлектором метод Parse выглядит следующим образом.
public static int Parse(string s, NumberStyles style)
{
NumberFormatInfo.V alidateParseStyleInteger(style);
return Number.ParseInt32(s, style, NumberFormatInfo.CurrentInfo);
}
internal static unsafe int ParseInt32(string s, NumberStyles style, NumberFormatInfo info)
{
byte* stackBuffer = stackalloc byte[114];
Number.NumberBuffer number = new Number.NumberBuffer(stackBuffer);
int num = 0; Number.StringToNumber(s, style, ref number, info, false);
if ((style & NumberStyles.AllowHexSpecifier) != NumberStyles.None)
{
if (!Number.HexNumberToInt32(ref number, ref num)) throw new OverflowException (Environment.GetResourceString ("Overflow_Int32"));
} else if (!Number.NumberToInt32(ref number, ref num))
throw newOverflowException(Environment.GetResourceString("Overflow_Int32"));
return num;
}
Метод ConvertFromHEX перегружен и может иметь следующее представление.
public static int ConvertFromHEX(HEX hex)
{
return ConvertFromHEX(hex.ToString());
}
Преобразование из десятичного представления в шестнадцатеричное обеспечивается следующим кодом.
public static HEX ConvertFromDecimal(int dec)
{
return new HEX(dec.ToString("X"));
}
Метод ToString целочисленного типа данных (int) позволяет преобразовать число в форматированную строку, с форматом, указанным в качестве аргумента метода. Сам метод ToString(string) выглядит так, как представлено в коде ниже.
public string ToString(string format)
{
return Number.FormatInt32(this, format, NumberFormatInfo.CurrentInfo);
}
3.2 Арифметические операции HEX
По условию задания класс должен обеспечивать следующие математические операции над HEX-числами:
- сложение;
- вычитание;
- умножение;
- деление.
Для выполнения этих действий были разработаны статические операторы типа HEX, которые преобразовали аргумент типа HEX в десятичный вид, далее выполнялись необходимые математические действия, а дальше конечный результат преобразовывался обратно в шестнадцатеричное представление.
Представим код разработанных операторов.
public static HEX operator +(HEX h1, HEX h2)
{ return new HEX(h1._number + h2._number); }
public static HEX operator -(HEX h1, HEX h2)
{ return new HEX(h1._number - h2._number); }
public static HEX operator *(HEX h1, HEX h2)
{ return new HEX(h1._number * h2._number); }
public static HEX operator /(HEX h1, HEX h2)
{ return new HEX(h1._number / h2._number); }
Так как операторы принадлежит тому типу данных, над которым происходят операции, у методов есть доступ к скрытым данным, в данном случае это член _number.
3.3 Сортировка чисел
Для пользователя статический класс для сортировки массива данных типа HEX представлен единственным методом Start. Код этого класса для удобства чтения и модификаций разбит на несколько частей (методов) и выглядит так, как показано ниже.
public static void Start(int count)
{
Console.WriteLine(string.Format("создание массива из {0} случайных HEX-чисел:", count));
creating(count);
showArray();
Console.Write("\nсортировка массива...");
Console.WriteLine(string.Format("{0} ms", sortList())); Console.WriteLine("\nрезультат в шестнадцатиричном представлении:"); showArray(); Console.WriteLine("\nрезультат в десятичном представлении:"); showArrayDec(); Console.WriteLine("\nнажмите любую клавишу для завершения..."); Console.ReadKey();
}
Аргумент count определяет количество чисел в динамическом массиве, который будет содержать данные, предназначенные для сортировки.
Все действия класса оповещаются соответствующими подсказками в консоли. Первым этапом является создание массива в коде creating.
static List<HEX> _array; static void creating(int count) {
_array.Clear(); for (int i = 0; i < count; i++)
_array.Add(new HEX(_random.Next(byte.MaxValue))); }
Сам массив представляет собой динамическую коллекцию объектов типа HEX. Особенностью такого выбора явился широкий спектр возможностей данного типа коллекций. В частности, размер коллекции не является фиксированным, что удобно при создании массивов, истинное число членов которого не может быть неизвестно заранее, или блоки данных могут добавляться в несколько заходов. Также интерфейсы IList и IList<T> позволяют конвертировать коллекцию в массив типа T[], производить сортировку по заданному алгоритму, динамически добавлять и удалять данные, производить поиск по определенному выражению и так далее.
Метод showArray выводит данные массива на консоль. Также присутствует похожий метод showArrayDec, который выводит данные этого же массива, но в десятичном представлении. Код этих методов представлен ниже.
static void showArray()
{
foreach (HEX h in _array) Console.Write(string.Format("{0}, ", h.ToString()));
Console.WriteLine();
}
static void showArrayDec()
{
foreach (HEX h in _array) Console.Write(string.Format("{0}, ", HEX.ConvertFromHEX(h.ToString())));
Console.WriteLine();
}
Оба метода используют для вывода форматированную строку, которая создается методом string.Format. Использование этого метода позволяет создавать новый объект строчного типа в одну строку без создания «временных» строковых констант и конкатенаций строк. Такой способ, как известно, существенно экономит ресурсы управляемой кучи .NET. Для перебора всех значений массива используется итератор foreach, который поддерживается типом данных List<T>.
Последним шагом является сортировка массива, а также вывод данных на консоль. Сортировка производится с помощью метода sortList, который, к тому же, возвращает количество занятого процессом времени в миллисекундах.
static long sortList()
{
long time = DateTime.Now.Ticks;
_array.Sort((h1, h2) =>
{
int _h1 = HEX.ConvertFromHEX(h1.ToString()),
_h2 = HEX.ConvertFromHEX(h2.ToString());
return _h1 == _h2 ? 0 : _h1 > _h2 ? -1 : 1;
});
return (DateTime.Now.Ticks - time) / 10000;
}
Сортировка массива производится по заданному в параметрах метода Sort делегата возвращаемому значению. Начиная с версии .NET Framework 3.5 пользователю предоставляется возможность оперировать лямбда-выражениями, которые во многих случаях заменяют многострочные операции создания и инициализацию предикатов и делегатов.
Сама сортировка коллекций данных выполняется по следующему принципу: если значения двух объектов равны, делегатом возвращается значение 0, если первый операнд больше второго, возвращается 1 и в противоположном случае – -1. Так как по условию задания задана сортировка по убыванию, условия возврата значений 1 и -1 необходимо поменять местами.
Для упрощения записи использовался тринарный оператор ?:, который заменяет присваивание данных в конструкции if-else.
Блок-схема алгоритма сортировки объектов класса HEX представлена на рисунке 3.1.
Рисунок 3.1 – Блок-схема алгоритма сортировки объектов HEX
3.4 Возведение в степень
Класс, позволяющий возвести число в степень, указанные в шестнадцатеричном виде, также представляет из себя метод Start(), который содержит основную логику действия.
public static void Start()
{
creatingNumbers();
Console.WriteLine(string.Format("число '{0}' будет возведено в степень '{1}'", _number, _power));
Console.WriteLine(string.Format("результат в шестнадцатеричном представлении: {0}", _result
new HEX((int)Math.Pow(HEX.ConvertFromHEX(_number.ToString()), HEX.ConvertFromHEX(_power.ToString())))));
Console.WriteLine(string.Format("результат в десятичном представлении: {0}", HEX.ConvertFromHEX(_result.ToString())));
Console.WriteLine(string.Format("нажмите любую клавишу для завершения...{0}", Console.ReadKey()));
}
Вторым и последним методом в классе является метод creatingNumbers, содержащий в себе интерфейс ввода пользователем необходимых чисел и функции их проверки.
Для начала пользователю предлагается ввести необходимые число и показатель степени с консоли. Следующим этапом является проверка правильности введенного шестнадцатеричного числа методом HEX.CorrectHEXNumber. Если обе проверки прошли успешно, инициализируются соответствующие HEX-члены класса, которые далее, в методе Start, участвуют в вычислениях.
Результат вычислений записывается в объект _result и подсчитывается с использованием стандартного класса Math и его метода, позволяющего произвести подсчет степени, Pow, который принимает два числа типа double, или совместимые с ним, и возвращает тоже тип double, который после явно приводится к целочисленному типу данных.
static HEX _number, _power, _result; static void creatingNumbers()
{
string number, power; do
{
Console.Clear(); Console.Write("введите число, возводимое в степень в HEX-представлении: ");
number = Console.ReadLine();
Console.Write("введите степень в HEX-представлении: ");
power = Console.ReadLine();
} while (!(HEX.CorrectHEXNumber(number) && HEX.CorrectHEXNumber(power)));
_number = new HEX(number);
_power = new HEX(power);
}
Блок-схема алгоритма возведения числа в степень представлена на рисунке 3.2.
Правильность расчетов, производимых разработанными классами, определяется проверочными тестами в разделе 4 данной работы.
Рисунок 3.2 – Блок-схема алгоритма возведения числа в степень
Глава 4. Тестирование и анализ результатов работы программы
Первым тестом при запуске приложения запускается сортировка массива из 100 случайных чисел. Результат работы программы представлен на рисунке 4.1.
Рисунок 4.1 – Сортировка массива
Как видно на рисунке, данные отсортированы по убыванию от 253 до 1, а на процесс сортировки ушло 20 миллисекунд.
После нажатия клавиши происходит переход к тесту возведения числа в степень. И первым пользователю предлагается ввести число, которое нужно возвести в степень, и сам показатель степени.
В качестве теста введем неверные данные (“az” и “-15”). Так как программа не приняла один из ответов (а в нашем случае оба) правильными, данные не записываются, и предлагается повторить попытку еще раз.
Введем для числа, возводимого в степень значение 10, что соответствует шестнадцатеричному представлению «А», а для показателя степени – 4, в hex-виде значение будет таким же.
Приложение оповестило, что число «А» будет возведено в степень «4» и представила результаты – в десятичном представлении это 10000, в представлении hex – 2710.
Рисунок 4.2 – Ввод неверных данных в окно тестирования
Рисунок 4.3 – Возведение А в степень 4
В качестве проверки на правильность расчетов воспользуемся стандартным Windows-калькулятором, в котором есть возможность конвертировать текущее число в различные системы счисления. 10000 в представлении hex отображена на рисунке 4.4.
Рисунок 4.4 – Проверка правильности расчетов стандартными средствами
Заключение
В результате выполненной работы был представлен модуль, позволяющий проводить с числами в шестнадцатеричном представлении различные математические операции: сложение, вычитание, умножение и деление. Также этот модуль позволяет конвертировать числа в двустороннем порядке – из десятичной системы счисления в шестнадцатеричную и наоборот. Отдельной функцией, представленной пользователю, реализована проверка на правильность введенного числа в hex-представлении. Модуль выполнен как класс HEX с возможностью создания новых экземпляров, в котором также присутствуют статические методы.
Используя разработанный класс были выполнены поставленные задачи: сортировка заданного массива в порядке убывания, а также возведение числа в степень с указанием данных в шестнадцатеричном представлении. Результаты обоих задач выводятся как в десятичном виде, так и в виде hex-чисел.
Для представления работы классов, а также оценки правильности результатов, были проведены тесты, результаты которых были представлены и проверены.
Для разработки проекта использовался платформа .NET и поддерживаемый ею язык программирования C#. В качестве IDE использовался open-source проект Mono.
Список использованной литературы
1. Троелсен Э. Язык программирования C# 2010 и платформа .NET 4.0, 5-е изд.: Пер. с англ. – М.: ООО «И.Д.Вильямс», 2011. – 1392 с.: ил. – Парал. тит. англ.
2. Ватсон К. C#. – М.: Издательство «Лори», 2001. – 879 с.: ил.
3. Шилдт Г. Полный справочник по C#.: Пер. с англ. – М.: Издательский дом «Вильямс», 2004. – 752 с.: ил. – Парал. тит. англ.
4. Фаулер М. Рефакторинг: улучшение существующего кода. – Пер. с англ. – СПб.: Символ-Плюс, 2003. – 432 с.: ил.
- ПРОЕКТИРОВАНИЕ РЕАЛИЗАЦИИ ОПЕРАЦИЙ БИЗНЕС-ПРОЦЕССА «СКЛАДСКОЙ УЧЕТ» (1. Глава. АНАЛИТИЧЕСКАЯ ЧАСТЬ)
- Проектирование реализации операций бизнес-процесса «Складской учет» (1. АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ И ПОСТАНОВКА ЗАДАЧИ)
- Система защиты информации в банковских системах (ГЛАВА 1. БАНКОВСКАЯ СИСТЕМА)
- Сравнения эффективности использования различных маркетинговых концепций (на примере Управления социальной защиты населения Восточного административного округа (УC3H ВАО) г. Москвы) (1. Теоретические аспекты внедрения маркетинговых концепций)
- Понятие правонарушения
- Изучение политики мотивации персонала организации и оценка ее эффективности
- Эффективность менеджмента организации (Глава1. Эффективность менеджмента организации как фактор повышения конкурентоспособности)
- Политика развития персонала в системе стратегического управления кадровым направлением деятельности организации (1. Теоретические аспекты политики развития персонала)
- Организация управленческого учета в компании (Глава 1. Теоретические аспекты управленческого учета)
- Бухгалтерский баланс организации: порядок составления и аналитические возможности (Глава 1. Бухгалтерский баланс как основа анализа финансового состояния организации)
- Корпоративная культура в организации (Глава 1. Поддержание и формирование корпоративной культуры как функция управления персоналом)
- Роль кадровой службы в формировании и реализации кадровой стратегии (1.Понятие кадровая стратегия организации)