Сегодня: Суббота, 20.04.2024, 02:45 (МСК)| Здравствуйте, Гость| Мой профиль | Регистрация | Вход | RSS

Что такое matte painting?

Роботы и экзоскелеты

Устройства с беспроводным питанием

ТВ-тюнеры. Как выбирать?

Adobe Audition 3. Лучшая в 2010-м
Главная » ПРОГРАММИРОВАНИЕ

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

25.09.2010

Как утверждают современники, программирование и компьютерные технологии делают нашу жизнь эффективнее. Я вчера слушал радио, так один чиновник так прямо и сказал: «Фективнее». А раз правительство говорит: «надо!», значит, будем претворять:). 

Один уж очень активный читатель обратился сразу к нескольким авторам, пишущим на программную тематику с конкретным запросом — он делает серьезный инженерный калькулятор и достаточно сильно запутался. Как я понял, те авторы сразу же нашли какие-то важные срочные дела, а ваш покорный слуга не успел вовремя сориентироваться:)). Ну что же, на самом деле заложенные идеи интересны, хотя я бы изложил свою точку зрения на вопрос. 

Нельзя сказать, что калькуляторов столь же много, как и тетрисов, хотя при обучении тому или иному языку программирования написание таковых является заданиями начального уровня. С другой стороны... «труд обычного студента сравним с трудом шахтера». Действительно, очень часто нужен более наглядный инженерный калькулятор, в котором все расчеты были бы представлены в развернутом виде. Закравшаяся ошибка может отнять много времени. Нередко хочется видеть всю картину расчетов целиком во всех деталях, либо считать какую-либо формулу по частям, сверяя данные. Единственная панацея — Excel, но его использование не всегда оправдано в силу громоздкости этого многофункционального продукта для небольших задач. Специализированные математические пакеты — им нужно специально обучаться… Есть вариант создания и другого универсального средства. 


***


Если у вас есть под рукой Visual Studio либо конкретно С#, то вы можете создать уникальную вещь за полчаса. Причем мы не будем внедряться в программирование математических операций и сложных функций. Зачем? Если есть Excel. Мы просто изымем из него все необходимое, то есть, сам вычисляющий модуль, а интерфейс сделаем под свои нужды. Итак…


Описание программы


Нам нужны поля ввода, в которых мы будем вводить математические формулы с уже вставленными значениями, соответственно, нужны и поля вывода результатов. Помимо этого необходимо окошко, в которое можно помещать некоторые заметки и комментарии. Например, какие-либо коэффициенты, формулы в символьном отображении и т.п.
Расчетный блок у нас будет Excel’вский, то есть, основной задачей при проектировании является удобное расположение интерфейсных элементов.
В рамках представленного примера предложен вариант с 9-ю полями ввода формул, которым соответствует 9 кнопок «на выполнение» и 9 полей, в которых будут выводиться результаты. Отдельно расположено окно для ввода комментариев.


Реализация


Мы покажем все в рамках Visual C#, хотя это же можно сделать и в других языках сообщества Microsoft Visual Studio. Действия идентичны. 

Ход выполнения:
  1. Создаем новый проект C# Windows Application, называем его, например, StudyCalc.
  2. В результате у нас появляется форма, отображенная в закладке Form1.cs [Design].
  3. В свойствах Properties для Form1 меняем заголовок (поле Text) на «Студенческий калькулятор». При желании в поле Font можете выбрать шрифт и его характеристики, что будет автоматически распространяться на все последующие объекты, загружаемые на форму.
  4. Теперь обращаемся к панели с компонентами Toolbox и переносим оттуда поля ввода/вывода (элементы TextBox) и кнопки (элементы Button). Расставляем все, при этом следим за порядком имен, чтобы не запутаться. То есть, на первой «линии» будет textBox1, button1, textBox2, на второй textBox3, button2, textBox4 и так далее. Чтобы все происходило быстро, можно воспользоваться копированием, создав одну линию. Только обратите внимание, что последующие элементы изменят порядок имен на обратный, то есть textBox4, button2, textBox3. 
  5. Надписи делаем с помощью текстовых меток Label. 
  6. Окно для заметок — элемент richTextBox.
  7. Все, интерфейс готов, но как его заставить работать? На самом деле очень и очень просто. 
  8. Сейчас нам нужно добавить ссылку на библиотеку объектов Excel. Для этого в меню Project выбираем пункт Add Reference (либо же находим его в выпадающем меню после щелчка правой кнопкой мыши над именем проекта в окне Solution Explorer). 
  9. В открывшемся окне входим в закладку COM и из длиннющего списка выбираем Microsoft Excel 11.0 Object Library (если у вас Office 2003). После недолгих машинных раздумий в Solution Explorer у нас появится новый список в разделе References. Если мы выделим из него ссылку Excel, то в окне свойств отобразится заголовок Microsoft.Office.Interop.Excel. Это говорит о том, что введенное нами пространство имен Excel входит в более общее пространство имен Interop и далее по возрастающей. Если у вас в заголовке стоит просто Interop.Excel, то все будет проще.  



Добавление в проект ссылки на библиотеку объектов Excel. Для этого в меню Project выбираем пункт Add Reference, в открывшемся окне входим в закладку COM и из длиннющего списка выбираем Microsoft Excel 11.0 Object Library (если у вас Office 2003).

Теперь напишем самую главную часть кода… на самом деле несколько строк. Это будет функция, которая вызывается всякий раз при нажатиях кнопок «ОК» в каждой формульной линии. Она «активизирует» Excel, при этом преобразует строковые данные в выражение, получает результат и отсылает его в виде опять же в виде строки. 

Для удобства сделайте двойной клик на первой кнопке (button1), в результате чего появится отображение файла Form1.cs. Но ввод кода мы сейчас сделаем не в рамках события button1_click, а разместим над ним. Выглядеть все будет так:

public string Calc(string a1) {
Microsoft.Office.Interop.Excel.Application objectExcel =
new Microsoft.Office.Interop.Excel.ApplicationClass();
Object Result;
Result = objectExcel._Evaluate(a1);
objectExcel.Quit();
return (string) Result.ToString();
}

Прокомментируем. Итак, на вход подается строка (переменная a1), в которой содержится формульное выражение. Изначально мы объявляем объектную переменную objectExcel и общую объектную переменную Result. Объектная переменная objectExcel при помощи метода "Evaluate” вычисляет нашу формулу, которая передана через строчную переменную a1. После этого мы удаляем объектную переменную objExcel и освобождаем выделенную под нее память. И функция возвращает ответ в виде строковых данных. Так вот, если в заголовке у вас стоял Interop.Excel вместо Microsoft.Office.Interop.Excel, то объявление переменной objectExcel будет более простым:

Excel.Application objectExcel = new Excel.ApplicationClass();

Теперь имеет смысл перейти и к нашему button1_click, который пока пустует в одиночестве. Перед этим мы объявим строчную переменную myString (сразу вспоминается как один читатель в письме задал вопрос о стрингах, а я спросони не понял, что он имел в виду струнные музыкальные инструменты, стринги… хм-м). Итак, выглядит все очень просто:

string MyString;
private void button1_Click(object sender, EventArgs e)
{
MyString = textBox1.Text;
textBox2.Text=Calc(MyString);
}

Все, можете запускать на тест (Build -> Build Solution, Debug -> Start without Debugging). Первая формульная линия интерфейса должна заработать. То есть, в окно textBox1 вы вводите формулу, нажимаете кнопку и получаете результат в textBox2. Отдельно стоит отметить, что отделение дробной части в числах производится только запятыми, иначе будет выдаваться ошибка, которая проявляется в невероятном ответе (что-то около минус двух миллиардов:)). При желании вы можете вписать строку: 

if (textBox2.Text == "-2146826273") textBox2.Text="кривые руки";

Если есть ошибка с символьным вводом, то Excel’ом выдается ответ «-2146826259». Его можно обработать также. 

Теперь переходим к изображению формы, и делаем двойной клик на второй кнопке «ОК». Действия практически те же:

MyString = textBox3.Text;
textBox4.Text=Calc(MyString);

И так далее. Все, студенческий калькулятор готов. Как сказали бы игроделы, он работает «на Excel’вском движке».



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



Как вводить формулы


Вводить можно обычно, например, 180+45^2-5*ln(20)/sin(45). Помимо этого вы можете использовать и Excel’вский вариант f(x), то есть писать СУММ(5;48;79) и т.п. Все названия функций перечислены в этой программе. Не забывайте и о том, что разделителем дробной части в числах является запятая, а не точка. Причем и в Excel все также.  

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


Возможности апгрейда


Конечно, пределу совершенства нет. То есть, при желании вы можете заставить этот калькулятор воспроизводить DVD-диски, записывать CD-RW, играть с вами в шахматы и так далее. Но если говорить о конкретных нуждах, то достаточно хорошим вариантом будет реализация сохранения рабочих сессий в текстовые или XML-файлы, что реализуется достаточно просто. 

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

Раздел комментариев можно расширить до системы формирования отчетов. То есть, на самом деле получается ничто иное, как открытая архитектура.

Что касается более сложных математических вычислений, выходящих за рамки возможностей Excel, но развитых в математических пакетах уровня Matlab или MathCAD они возможны, то тут дело несколько сложнее, но все также реализуемо. 

Что касается формирования и вывода графиков, то тут можно пойти сразу по нескольким направлениям. Например, использовать опять же вcтроенные возможности Excel, во-вторых, «научить» программу рисовать не сложно. Единственное, что стоит учитывать в последнем варианте — ось Y в компьютерных интерфейсах отсчитывается вниз, то есть верхний левый угол является началом координат. Поэтому необходим дополнительный преобразователь. 


Изобретателям велосипедов


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

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


Кристофер

Перепечатка материалов или их фрагментов возможна только с согласия автора.







Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Ассоциация боевых роботов
Рекомендуем...
Новости

Разделы

Опросы

Какой язык программирования вы считаете наиболее актуальным сегодня?
Всего ответов: 329

Друзья

3D-кино






Найти на сайте:








Об авторе       Контакты      Вопрос-ответ        Хостинг от uCoz