Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C# Лекция_1 Язык программирования и среда разра....docx
Скачиваний:
53
Добавлен:
18.12.2018
Размер:
1.81 Mб
Скачать
      1. Связывание с dll

Первым делом свяжем два построенных проекта, для чего в консольный проект добавим ссылку на проект с DLL MathTools. В окне Solution Explorer подведем указатель мыши к имени консольного проекта и из контекстного меню, появляющегося при щелчке правой кнопки, выберем пункт меню "Add Reference". В открывшемся окне добавления ссылок выберем вкладку "Projects". Поскольку проект MathTools включен в Решение, то он автоматически появится в открывшемся окне. Если ссылку нужно установить на проект, не включенный в Решение, то в окне добавления ссылок нужно задать путь к проекту. Нам проще, путь указывать не нужно, достаточно щелкнуть по появившемуся в окне имени MathTools. Ссылка на DLL появится в папке "References" консольного проекта. Теперь проекты связаны и из консольного проекта доступны сервисы, предоставляемые DLL.

      1. Организация консольного интерфейса

Задача кода, который мы встроим непосредственно в уже созданную процедуру Main, достаточно понятна. Необходимо объявить и создать объекты, представляющие входные данные, организовать диалог с пользователем для ввода этих данных, обратиться к сервисам DLL для получения результата и результаты вывести на консоль. Приведу вначале код консольного проекта с построенным методом Main, а затем его прокомментирую. Вот этот код:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleToMathTools

{

class Program

{

/// <summary>

/// Точка входа в консольный проект

/// организация интерфейса к DLL MathTools

/// </summary>

/// <param name="args"></param>

static void Main(string[] args)

{

//Входные данные

double x = 0;

const string INVITE =

"Введите вещественное число x" +

"- аргумент функции Sin(x)";

const string CONTINUE =

"Продолжим? (Yes/No)";

string answer = "yes";

do

{

//Организация ввода данных

Console.WriteLine(INVITE);

string temp = Console.ReadLine();

x = Convert.ToDouble(temp);

//Вычисления и вывод результата

double res = 0;

res = Math.Sin(x);

Console.WriteLine("Math.Sin(x) = " +

res.ToString());

res = MathTools.MyMath.Sin(x);

Console.WriteLine("MathTools.MyMath.Sin(x) = " +

res.ToString());

res = MathTools.MyMath.SinOld(x);

Console.WriteLine("MathTools.MyMath.SinOld(x) = " +

res.ToString());

//диалог с пользователем

Console.WriteLine(CONTINUE);

answer = Console.ReadLine();

} while (answer == "yes");

}

}

}

Дадим краткие комментарии к этому коду.

Входные данные устроены просто - задается лишь одна переменная x типа double. Помните, что в языке C# все переменные являются объектами.

Вводу значения x предшествует, как и положено для хорошего стиля программирования, приглашение к вводу. Для ввода и вывода значений используются статические методы ReadLine и WriteLine класса Console, входящего в библиотеку FCL и предоставляющего свои сервисы пользователям консольных приложений. Для преобразования введенных данных, представляющих собой строки текста, к нужному типу (в нашем случае к типу double) используются статические методы класса Convert, сервисы которого позволяют проводить различные преобразования между типами данных.

Значение функции вычисляется тремя разными методами - методом стандартного класса Math и двумя методами класса MyMath, входящего в состав библиотеки MathTools.

Следуя правилу стиля "Имена - константам", в коде метода используются именованные константы.

Применяется стандартный прием зацикливания тела метода Main, позволяющий пользователю самому решать, когда прервать выполнение метода.

На рис. 1.8 показаны результаты работы консольного проекта.

увеличить изображение Рис. 1.8. Результаты работы консольного проекта

Анализируя эти результаты, можно видеть, что все три метода на всех исследуемых аргументах дают одинаковые результаты, совпадающие с точностью до 9 цифр после запятой. Точность методов в классе MyMath обеспечивается константой EPS этого класса. Достигнутая точность вполне достаточна для большинства практических задач. Остается понять, насколько написанные нами методы проигрывают методу стандартного класса по времени. Это исследование оставим для следующего проекта - Windows-проекта, обеспечивающего интерфейс, который дает пользователю больше возможностей.