Материал: Разработка приложения для выполнения математических операций и вычислений

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

addMem(answer)

{= Mem + eval(answer);.calculator.mem.value = " M ";

Status = "blank";

}

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

Следующей создается функция сброса калькулятора до исходного состояния. Называться она будет clearCalc и выполнять инициализацию перменных исходными значениями (как в блоке объявления переменных).

clearCalc()

{= "";= "";= "blank";

out2Display("");

}

Дальше создаем функцию предназначение которой стирать неверные символы из числа при ошибке пользователя. Название функции будет неоригинальным - Backspace. Листинг функции приведен ниже:

Backspace(answer)

{= answer.length;= answer.substring(0, answerlength - 1);(Digit2 != "")

{= answer.toString();Display(Digit2);

}

{= answer.toString();

out2Display(Digit1);

}

}

Алгоритм работы функции следующий. Для начала вычисляем длину строки выведенной на дисплей калькулятора. Для того, чтобы это было возможно, функция принимает параметр, в котором ей передается содержимое дисплея. У параметра имеется свойство length, которое возвращает длину строки во временную локальную переменную answerlenght. В следующей строке при помощи встроенной функции substring, которая принимает два параметра - точку начала отсчета выделяемой подстроки (равную в данном случае нулю, т. е. с начала строки) и точку конца отсчета выделяемой подстроки (в данном случае равную длине строки выведенной на дисплей минус один), выполняется уменьшение длины записи на дисплее на один символ. Дальше нужно новое укороченное значение вывести на дисплей. Это делается в следующих строках, общий смысл работы которых таков: если переменная Digit2 не пуста, значит мы работаем с ее значением, так как переменной Digit1 уже просто нет на дисплее. Чтобы вывести укороченное число назад на дисплей, нужно сначала привести его к строковому виду, так как в качестве содержимого текстового поля изображающего дисплей должна быть строка. Это выполняется через вызов встроенной функции toString. Преобразованное в строку число присваивается переменной Digit2, которая выводится на дисплей с помощью вызова ранее описанной функции out2Display. Иначе (если Digit2 пустое) выполняются те же процедуры (приведение к строковому типу и вывод посредством вызова функции out2Display) для переменной Digit1.

Теперь создадим функцию для сброса последнего набранного числа. Называться она будет ceCalc. Листинг функции приведен ниже:

ceCalc()

{= "";= "yes";Display("");

}

Работа функции незатейлива. Она очищает переменную Digit2, изменяет значение флага Status на «yes», которое используется в функции форматирования вывода numControl и вызывает функцию out2Display, передавая ей в качестве параметра пустую строку которая и выводится на дисплей.

Теперь самое время создать функцию для проверки и форматирования вывода на дисплей символов. Листинг функции как всегда приведен ниже:

numControl(answer)

{(answer == ".")

{= document.calculator.answer.value;(Number.indexOf(".") != -1)

{= "";

}

}(Status == "yes")

{+= answer;Display(Digit2);

}

{(Status == "blank")

{= answer;= "";= "no";

}

{+= answer;

}Display(Digit1);

}

}

Алгоритм работы следующий. Функция принимает в качестве параметра любое вводимое пользователем или выводимое функцией на дисплей значение. Для реализации этого функция вызывается как при нажатии цифровых клавиш, так и при изменении состояния дисплея вызванного работой каких либо реализующих математические действия функций, так как это проще чем вызывать ее при каждой операции. Поэтому при вызове по событию onChange элемента answer, ей передается значение this.value, которое хранит содержимое дисплея, а по событию onClick вызванному при нажатии любой цифровой клавиши передается значение этой клавиши. Кроме того функция вызывается при нажатии клавиши «.» принимая в качестве параметра ее значение. Затем начинается обработка полученного параметра. Если в функцию передан символ точка, выполняется проверка допустимости введения данного символа. Берется значение выведенное в данный момент на дисплее через обращение по иерархии - document.calculator.answer.value, и присвается локальной переменной Number, которая затем проверяется на присутствие в ней уже введенного ранее символа точка. Это выполняется при помощи функции indexOf которая возвращает позицию первого вхождения искомого символа или -1 если символ не найден. Если возвращенное этой функцией значение не равно -1, то есть точка уже присутствует в введенном числе, данный символ удаляется в без вывода на дисплей. Идем далее. Если флаг Status равен «yes», что означает что вводится второе число и оно пока пустое, то к значению хранящемуся в переменной Digit2 добавляется содержимое параметра (точка или цифра), и выводится на дисплей. Иначе, если флаг Status в исходном состоянии, значит работаем с первым вводимым числом и соответственно, добавляем в пустую переменную Digit1 содержимое параметра и выводим на дисплей. Иначе, если число уже вводится, добавляем к нему содержимое принятое в параметре и опять же выводим на дисплей.

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

operPlus(x)

{(x == 1) operEqual();

if(Digit2 != "")

{= parseFloat(Digit1) + parseFloat(Digit2);

}= "yes";= '+';

out2Display(Digit1);

}

Функция принимает в качестве параметра 1или 0 которые применяются как флаги состояний операции. Если в параметре передана 1, это означает нажатие клавиши плюс, вызывается функция operEqual, которая будет описана позже. Если передан параметр 0, это знак начала выполнения сложения, то проверяем пусто ли значение переменой Digit2. Если не пусто, нужно сложить его со значением Digit1 и освободить для принятия следующего числа, что мы и делаем, считывая строковое значение из переменных и приводя его к типу с плавающей точкой при помощи функции JavaScript parseFloat для повышения точности вычисления.. Затем переводим флаг Status в состояние «yes», что означает готовность к приему новой цифры, запоминаем операцию в переменной CurrOper и выводим на дисплей результат операции сложения находящийся на текущий момент в переменной Digit1.

Следующей я хочу описать функцию вычитания. Она будет отличаться от предыдущей только выполняемым действием - вычитание из переменной Digit1 переменной Digit2, с выводом на дисплей. Листинг функции ниже:

operMinus(x)

{(x == 1) operEqual();(Digit2 != "")

{= parseFloat(Digit1) - parseFloat(Digit2);

}= "yes";= '-';

out2Display(Digit1);

}

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

Так как процедуры умножения и деления подобны сложению и вычитанию (алгоритмически) не будем выдумывать колесо и используем уже готовое описание функций сложения и вычитания для создания функций умножения и деления. Листинг функции умножения:

function operMult(x)

{(x == 1) operEqual();(Digit2 != "")

{= parseFloat(Digit1) * parseFloat(Digit2);

}= "yes";= '*';

out2Display(Digit1);

}

А теперь листинг функции деления:

function operDiv(x)

{(x == 1) operEqual();(Digit2 != "")

{= parseFloat(Digit1) / parseFloat(Digit2);

}= "yes";= '/';

out2Display(Digit1);

}

Данные функции работают так же как сложение и в дополнительном описании не нуждаются.

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

operSqrt()

{= Math.sqrt(Digit1);= "blank";Display(Digit1);

}

Алгоритм прост. Так как операция извлечения корня унарная, то к моменту ее применения число либо результат предыдущего действия будет записано в переменную Digit1 (вспомните описание предыдущих функций), а это значит, что и встроенную функцию sqrt объекта Math нужно применять только к этой переменной. Math является встроенным объектом JavaScript и предоставляет доступ к математическим операциям. После вычисления корня, флаг сбрасывается в исходное состояние а результат вычисления выводится на дисплей.

Теперь пора научить калькулятор вычислять заданный процент от числа.

operPercent()

{(Status != "blank")

{*= .01;= "blank";Display(Digit2);

}

}

Сначала выполняется проверка не нажата ли клавиша вычисления процента до набора числа из которого процент вычисляется. Затем, в случае успешности проверки, число содержащееся в переменной Digit2 и обозначающее количество вычисляемых процентов, приводится к виду десятичной дроби при помощи умножения на 0.01. Затем после сброса флага, эта десятичная дробь выводится на дисплей. И все. А вычисление процента выполняется в функции умножения, умножением числа из переменной Digit1 на переданную в Digit2 десятичную дробь.

Далее опишем операцию вычисления функции f(x) = 1/x . Листинг:

operRecip()

{= 1/Digit1;= "blank";Display(Digit1);

}

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

Унарная операция присвоения числу знака минус. Листинг функции реализующей этот функционал приведен ниже:

operNegative()

{= parseFloat(-Digit1);

Status = "no";Display(Digit1);

}

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

И вот последняя функция вызываемая по нажатию клавиши равно и запускающая процесс вычисления. Называется она operEqual:

operEqual()

{(CurrOper == '+') operPlus(0);(CurrOper == '-') operMinus(0);(CurrOper == '*') operMult(0);(CurrOper == '/') operDiv(0);

Digit2 = "";= "";

}

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

На этом описание функционала калькулятора закончено и скрипт закрывается тегом </script>.

2. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

При запуске файла calc.html пользователю выводится калькулятор на странице браузера. Как уже было указано выше браузер можно использовать любой и в любой операционной системе. Для примера запустим программу поочередно в трех разных браузерах Opera, Mozilla Firefox и Google Chrome (все под GNU/Linux).

Рисунок 1. Калькулятор в Opera.

Рисунок 2. Калькулятор в Mozilla Firefox.

Рисунок 3. Калькулятор в Google Chrome

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

2.1 Выполнение операций сложения, вычитания, умножения и деления

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

. Нажимая цифровые клавиши «0» - «9» набираем первое число

. Нажимаем клавишу выполняемой операции «+», «-», «*» или «/»

. Набираем второе число при помощи цифровых клавиш «0» - «9»

. Если действие одно то нажимаем клавишу «=» и результат вычисления перед нами, если предполагается сделать еще одно вычисление то нажимаем клавишу следующей операции и на дисплее видим промежуточный результат, далее набираем следующее число и т. д.

2.2    Выполнение унарных операций - смены знака, вычисления процента, извлечения квадратного корня числа и функции f(x)=1/x

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

.Вводим при помощи цифровых клавиш «0» - «9» число над которым планируется провести унарную операцию или завершаем предыдущую операцию для получения операнда.

.Нажимаем клавишу выполняемой унарной операции:

a) если вычисляем процент от числа, то «*» и переходим к третьему пункту алгоритма.

b) если изменяем знак числа на противоположный, то «+/-» и на этом данная операция закончена.)          если извлекаем корень, то «sqrt», и на этом данная операция закончена.)         если вычисляем знечение функции f(x) = 1/x, то «1/x» и на этом данная операция закончена.

. Нажимая цифровые клавиши «0» - «9» набираем второе число, равное количеству вычисляемых процентов.

.Нажимаем клавишу «%» и получаем на дисплее результат операции.

2.3 Использование клавиш редактирования и очистки

Клавиша редактирования введенного числа - «Backspace», клавиши очистки - «С» и «СЕ». Используются они в следующих случаях:

.Если введенное на дисплей число с ошибкой - нажимаем клавишу «Backspace» столько раз, сколько символов нужно удалить.

.Если введенное число неверно вообще - нажимаем клавишу «СЕ», в результате текущее число удалено и калькулятор готов к приему правильного числа, а все предыдущие результаты ввода / вычисления остались в памяти калькулятора.

.Если операции завершены и нужно сбросить калькулятор в исходное состояние - нажимаем клавишу «С».

2.4 Применение клавиш управления памятью калькулятора

У калькулятора есть ячейка памяти для запоминания одного значения. Для управления этой памятью используются клавиши начинающиеся с буквы «М» (от англ. memory - память). Использовать их можно для следующих целей:

.Если нужно запомнить некоторое число для выполнения с ним операции позже или сложить текущее значение на дисплее с числом ранее сохраненном в памяти нажимаем клавишу «М+» и число заносится в память, на вспомогательном дисплее отображается буква «М», напоминающая о хранении числа.

.Если из этого числа нужно вычесть другое, находящееся в настоящий момент на дисплее калькулятора, нажимаем клавишу «MS» и в память записывается результат операции.

.Если нужно вывести сохраненное значение из памяти на дисплей, нужно нажать клавишу «MR».

.И наконец, если нужно удалить число из памяти жмем «MC».

На этом описание использования калькулятора заканчено.

ЗАКЛЮЧЕНИЕ

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

В процессе создания курсовой работы, был разработан и реализован алгоритм решения поставленной задачи. Программа реализована на базе смешения языка разметки гипертекста HTML и скриптового языка программирования JavaScript, с использованием каскадных таблиц стилей CSS в среде программирования Bluefish Editor.

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

ПРИЛОЖЕНИЕ А

ЛИСТИНГ ПРОГРАММЫ

Листинг 1.1. Файл calc.html

<html>

<head>

<title>JsCalculator</title>

<META http-equiv="Content-Type" content="text/html; charset=UTF-8">