Содержание
1. Введение…………………………………………………….………………2
2. Общие сведения…………………………………………….………………3
3. Сведения о реализации курсовой работы……………….………………..5
4. Структура организаци проекта…………………………………….……...6
4.1. О структуре проекта……………………………….…….………6
4.2. Содержание «Calc_Evgen.fla»……………………………….…..6
4.3. Содержание «Interpretater.as»……………………………….………12
4.4. Содержание «Calc_Evgen.swf»………………………………...16
5. Заключение………………………………………………………………..17
6. Список использованной литературы…………………………………….18
1. Введение
В настоящее время интернет-технологии развиваются быстрыми темпами, и все большее распространение находят программные продукты позволяющие создавать приложения и анимацию, доступные для отображения и использования непосредственно в веб-браузере пользователя.
К таким программным продуктам можно отнести: Adobe Gif Animator, 3DS Max, Corel R.A.V.E., Adobe Flash, Maya и многие другие.
Adobe Flash (ранее Macromedia Flash), или просто Flash — мультимедийная платформа компании Adobe для создания веб-приложений или мультимедийных презентаций. Широко используется для создания рекламных баннеров, анимации, игр, а также воспроизведения на веб-страницах видео- и аудиозаписей.
Платформа включает в себя ряд средств разработки, прежде всего Adobe Flash Professional и Adobe Flash Builder (ранее Adobe Flex Builder); а также программу для воспроизведения flash-контента — Adobe Flash Player, хотя flash-контент умеют воспроизводить и многие плееры сторонних производителей. Например, SWF-файлы можно просматривать с помощью свободных плееров Gnash или swfdec, а FLV-файлы воспроизводятся через мультимедийные проигрывателиQuicktime, Windows Media Player и различные проигрыватели в UNIX-подобных системах при наличии соответствующих плагинов.
Adobe Flash позволяет работать с векторной, растровой и ограниченно с трёхмерной графикой, а также поддерживает двунаправленную потоковую трансляцию аудио и видео. Для КПК и других мобильных устройств выпущена специальная «облегчённая» версия платформы Flash Lite, чья функциональность ограничена в расчёте на возможности мобильных устройств и их операционных систем.
ActionScript — объектно-ориентированный язык программирования, который добавляет интерактивность, обработку данных и многое другое в содержимое Flash-приложений. ActionScript исполняется виртуальной машиной (ActionScript Virtual Machine), которая является составной частью Flash Player.
ActionScript компилируется в байткод, который включается в SWF-файл.
SWF-файлы исполняются Flash Player -ом. Flash Player существует в виде дополнение к веб-браузеру, а также как самостоятельное исполняемое приложение. Flash придает сайтам динамичность и интерактивность.
Целью данной работы является создание игры «Калькулятора », используя технологии Flash и ActionScript 3.0.
Общие сведения
Калькуля́тор -Электронное вычислительное устройство для выполнения операций над числами или алгебраическими формулами;
Современный инженерный калькулятор
В Советском Союзе для обозначения малогабаритного вычислительного устройства использовался термин «микрокалькулятор», впервые применённый в 1973 году для микрокалькулятора «Электроника Б3-04». Просто «калькуляторами» называли большие по размеру настольные вычислительные устройства. И настольные и микрокалькуляторы официально назывались «ЭКВМ — электронные клавишные вычислительные машины».
В настоящее время, в связи с тем, что в английском языке используется только термин «калькулятор» (calculator), термин «микрокалькулятор» вышел из обращения.
Типы калькуляторов:
§ Простейшие калькуляторы имеют небольшие размеры и вес, один-два регистра памяти и минимальное число функций (как правило, только арифметические операции). Предназначены для широкого круга потребителей.
§ Бухгалтерские калькуляторы имеют дополнительные средства для работы с денежными суммами (кнопки «00» и «000», фиксированное количество разрядов дробной части, автоматическое округление). Как правило, имеют настольные габариты. Предназначены для всех, кто по долгу работы вынужден считать деньги: бухгалтеров, кассиров и так далее.
§ Финансовые калькуляторы ориентированы в первую очередь на выполнение различных расчетов со сложными процентами и имеют набор специфических функций, применяемых в банковской сфере и иных финансовых приложениях: расчет аннуитета, перпетуитета, дисконтов, размера выплат по кредитам, приведенного денежного потока и тому подобное.
§ Инженерные (англ. scientific, изредка употребляется русская калька «научный калькулятор »): предназначены для сложных научных и инженерных расчётов. Имеют большое количество функций, включая вычисление всех элементарных функций, статистические расчёты, задание углов в градусах, минутах и секундах. Для сложных вычислений применяются скобки или обратная польская запись. Часто интегрированы с визуальными.
§ Программируемые калькуляторы дают возможность вводить и исполнять программы пользователя. Имеют большое количество регистров памяти (10 и более). По функциональности приближаются к простейшим компьютерам. В зависимости от модели программируемые калькуляторы имеют несколько типов встроенных языков программирования: простейший (запоминает только нажатия клавиш без вывода на экран), показывающий коды команд (обычно используя обратную польскую запись),Бейсик или собственный язык программирования, приближённый к Бейсику.
§ Графические калькуляторы имеют графический экран, что позволяет отображать графики функций или даже выводить на экран произвольные рисунки.
Сведения о реализации курсовой работы
В данной курсовой работе мною был реализован слегка улучшенный простой калькулятор.
Мы видим форму, где расположены цифры от 0-9,мы можем нажать на любую из них и она появиться на экране формы. Так же есть возможность находить квадратный корень из чисел, возводить их в степень, находить тригонометрические функции, заносить и удалять в память калькулятора значения, и делать простые арифметические действия с числами.
4. Структура реализации проекта
4.1. О структуре проекта
Курсовая работа была реализована в среде Adobe Flash CS4 с использованием языка программирования ActionScript 3.0, как говорилось ранее.
Вся курсовая работа состоит из трех файлов:
- Основной файл проекта Adobe Flash CS4 – «Calc_Evgen.fla »
- Основной файл-класс с кодом ActionScript – «Interpretater.as »
- Файл программы – «Calc_Evgen.swf », который является скомпилированной версией файла проекта «Calc_Evgen.fla» и предназначен для работы во Flash-проигрывателе.
4.2. Содержание «Calc_Evgen..fla»
import flash.events.MouseEvent;
var memory: Number = 0;
results_txt.text = "0";
var operator: String;
// Кнопки ввода цифр:
But1.addEventListener(MouseEvent.CLICK, But1_click); // 1
But2.addEventListener(MouseEvent.CLICK, But2_click); // 2
But3.addEventListener(MouseEvent.CLICK, But3_click); // 3
But4.addEventListener(MouseEvent.CLICK, But4_click); // 4
But5.addEventListener(MouseEvent.CLICK, But5_click); // 5
But6.addEventListener(MouseEvent.CLICK, But6_click); // 6
But7.addEventListener(MouseEvent.CLICK, But7_click); // 7
But8.addEventListener(MouseEvent.CLICK, But8_click); // 8
But9.addEventListener(MouseEvent.CLICK, But9_click); // 9
But0.addEventListener(MouseEvent.CLICK, But0_click); // 0
PointBtn.addEventListener(MouseEvent.CLICK, PointBtn_click); //.
PlusMinusBtn.addEventListener(MouseEvent.CLICK, PlusMinusBtn_click); // +-
leftBracket.addEventListener(MouseEvent.CLICK, leftBracket_click); // (
rightBracket.addEventListener(MouseEvent.CLICK, rightBracket_click); //)
//results_txt.text += "1"; не стал делать т.к. appendText быстрее
function But1_click(e:MouseEvent):void{
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText("1");
}
function But2_click(e:MouseEvent):void{
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText("2");
}
function But3_click(e:MouseEvent):void{
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText("3");
}
function But4_click(e:MouseEvent):void{
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText("4");
}
function But5_click(e:MouseEvent):void{
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText("5");
}
function But6_click(e:MouseEvent):void{
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText("6");
}
function But7_click(e:MouseEvent):void{
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText("7");
}
function But8_click(e:MouseEvent):void{
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText("8");
}
function But9_click(e:MouseEvent):void{
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText("9");
}
function But0_click(e:MouseEvent):void{
if (results_txt.text!= "0") results_txt.appendText("0");
}
function PointBtn_click(e:MouseEvent):void{
//if(results_txt.text.indexOf(".") == -1)
if (checkPoints(results_txt.text) == true)
results_txt.appendText(".");
}
function PlusMinusBtn_click(e:MouseEvent):void{
if (results_txt.text!= "0"){
if (results_txt.text.indexOf("-") == 0)
results_txt.text = results_txt.text.slice(1, results_txt.length);
else
results_txt.text = "-"+results_txt.text;
}
}
function leftBracket_click(e:MouseEvent):void{
if (checkFuncs(results_txt.text) == true){
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText("(");
}
}
function rightBracket_click(e:MouseEvent):void{
if (checkBrackets(results_txt.text) == true)
results_txt.appendText(")");
}
// Математические операции:
PlusBtn.addEventListener(MouseEvent.CLICK, PlusBtn_click); // +
MinusBtn.addEventListener(MouseEvent.CLICK, MinusBtn_click); // -
MultBtn.addEventListener(MouseEvent.CLICK, MultBtn_click); // *
DivBtn.addEventListener(MouseEvent.CLICK, DivBtn_click); //:
GradeBtn.addEventListener(MouseEvent.CLICK, GradeBtn_click); // ^
RootBtn.addEventListener(MouseEvent.CLICK, RootBtn_click); //v
function PlusBtn_click(e:MouseEvent):void{
if (checkOperations(results_txt.text) == true)
results_txt.appendText("+");
}
function MinusBtn_click(e:MouseEvent):void{
if (checkOperations(results_txt.text) == true)
results_txt.appendText("-");
}
function MultBtn_click(e:MouseEvent):void{
if (checkOperations(results_txt.text) == true)
results_txt.appendText("*");
}
function DivBtn_click(e:MouseEvent):void{
if (checkOperations(results_txt.text) == true)
results_txt.appendText("/");
}
function GradeBtn_click(e:MouseEvent):void{
if (checkOperations(results_txt.text) == true)
results_txt.appendText("^");
}
function RootBtn_click(e:MouseEvent):void{ //корень считается ТУТ
if (checkOperations(results_txt.text) == true){
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText("√");
}
}
//Тригонометрические операции:
CosBtn.addEventListener(MouseEvent.CLICK, CosBtn_click); // cos
CtgBtn.addEventListener(MouseEvent.CLICK, CtgBtn_click); // ctg
TgBtn.addEventListener(MouseEvent.CLICK, TgBtn_click); // tg
SinBtn.addEventListener(MouseEvent.CLICK, SinBtn_click); // sin
LogBtn.addEventListener(MouseEvent.CLICK, LogBtn_click);
function CosBtn_click(e:MouseEvent):void{
if (checkFuncs(results_txt.text) == true){
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText("cos(");
}
}
function CtgBtn_click(e:MouseEvent):void{
if (checkFuncs(results_txt.text) == true){
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText("ctg(");
}
}
function TgBtn_click(e:MouseEvent):void{
if (checkFuncs(results_txt.text) == true){
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText("tan(");
}
}
function SinBtn_click(e:MouseEvent):void{
if (checkFuncs(results_txt.text) == true){
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText("sin(");
}
}
function LogBtn_click(e:MouseEvent):void{
if (checkFuncs(results_txt.text) == true){
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText("ln(");
}
}
//Операции с памятью
MCBtn.addEventListener(MouseEvent.CLICK, MCBtn_click); // MC
MRBtn.addEventListener(MouseEvent.CLICK, MRBtn_click); // MR
MSBtn.addEventListener(MouseEvent.CLICK, MSBtn_click); // MS
MPlusBtn.addEventListener(MouseEvent.CLICK, MPlusBtn_click); // M+
MMinusBtn.addEventListener(MouseEvent.CLICK, MMinusBtn_click); // M-
function MCBtn_click(e:MouseEvent):void{
memory = 0;
}
function MRBtn_click(e:MouseEvent):void{
if (results_txt.text == "0") results_txt.text = "";
results_txt.appendText(memory.toString());
}
function MSBtn_click(e:MouseEvent):void{
var results_new:String = stringForParse(results_txt.text);
results_txt.text = results_new;
results_txt.text = String(parsingString(results_txt.text));
memory = Number(results_txt.text);
}
function MPlusBtn_click(e:MouseEvent):void{
var results_new:String = stringForParse(results_txt.text);
results_txt.text = results_new;
results_txt.text = String(parsingString(results_txt.text));
memory += Number(results_txt.text);
}
function MMinusBtn_click(e:MouseEvent):void{
var results_new:String = stringForParse(results_txt.text);
results_txt.text = results_new;
results_txt.text = String(parsingString(results_txt.text));
memory -= Number(results_txt.text);
}
//Операции с окном вывода
EqualityBtn.addEventListener(MouseEvent.CLICK, EqualityBtn_click); // =
ClearBtn.addEventListener(MouseEvent.CLICK, ClearBtn_click); // C
RemoveBtn.addEventListener(MouseEvent.CLICK, RemoveBtn_click); // <-
function EqualityBtn_click(e:MouseEvent):void{
var results_new:String = stringForParse(results_txt.text);
results_txt.text = results_new;
results_txt.text = String(parsingString(results_txt.text));
}
function checkBrackets(str:String):Boolean{ //чтобы нельзя было поставить функцию после числа
var counter:int = 0;
for (var i = 0; i < str.length; i++) {
if (str.charAt(i) == "("){
counter++;
}
}
for (i = 0; i < str.length; i++) {
if (str.charAt(i) == ")"){
counter--;
}
}
if (counter > 0)
return true;
else
return false;
}
function checkOperations(str:String):Boolean{ //чтобы нельзя было поставить 2 математических знака рядом
var flag:Boolean = false;
var j:int = str.length - 1;
if (str.charAt(j) == "(" || str.charAt(j) == "+" || str.charAt(j) == "-" ||
str.charAt(j) == "*" || str.charAt(j) == "/" || str.charAt(j) == "^" || str.charAt(j) == "√")
{
flag = true;
}
if (flag == true)
return false;
else
return true;
}
function checkFuncs(str:String):Boolean{
var flag:Boolean = false;
var j:int = str.length - 1;
if (str.charAt(j) == "1" || str.charAt(j) == "2" || str.charAt(j) == "3" ||
str.charAt(j) == "4" || str.charAt(j) == "5" || str.charAt(j) == "6" ||
str.charAt(j) == "7" || str.charAt(j) == "8" || str.charAt(j) == "9")
{
flag = true;
}
if (str.length!= 1 && str.charAt(j) == "0")
{
flag = true;
}
if (flag == true)
return false;
else
return true;
}
function checkPoints(str:String):Boolean{
var flag:Boolean = false;
for (var i = 0; i < str.length; i++) {
if (str.charAt(i) == "."){
flag = true;
}
else if (str.charAt(i) == "+" || str.charAt(i) == "-" || str.charAt(i) == "*" ||
str.charAt(i) == "/" || str.charAt(i) == "^" || str.charAt(i) == "√")
{
flag = false;
}
}
var j:int = str.length - 1;
if (str.charAt(j) == "(" || str.charAt(j) == "+" || str.charAt(j) == "-" ||
str.charAt(j) == "*" || str.charAt(j) == "/" || str.charAt(j) == "^" || str.charAt(j) == "√")
{
flag = true;
}
if (flag == true)
return false;
else
return true;
}
function stringForParse(str:String):String{
var s_fin: String = "";
for (var i = 0; i < str.length; i++) {
if (str.charAt(i) == "c")
{
if (str.charAt(i+1) == "o") //cos
s_fin += "c"
else if (str.charAt(i+1) == "t") //ctg
s_fin += "g";
i += 2;
} else if (str.charAt(i) == "s"){ //sin
s_fin += "s";
i += 2;
}
else if (str.charAt(i) == "l"){ //ln
s_fin += "l";
i += 1;
}
else if (str.charAt(i) == "t"){ //tan
s_fin += "t";
i += 2;
}
else{
s_fin += str.charAt(i);
}
}
return s_fin;
}
function stringForSlice(str:String):String{
var s_fin: String = "";
if (str.charAt(str.length-1) == "(")
{
if (str.charAt(str.length-2) == "s"){ //Cos
s_fin = str.slice(0, str.length - 4);
}
else if (str.charAt(str.length-2) == "n"){ //Sin, tan
if (str.charAt(str.length-3) == "l") //ln
s_fin = str.slice(0, str.length - 3);
else
s_fin = str.slice(0, str.length - 4);
}
else if (str.charAt(str.length-2) == "g"){ //Ctg
s_fin = str.slice(0, str.length - 4);
}
else{
s_fin = str.slice(0, str.length - 1);
}
}
else
{
s_fin = str.slice(0, str.length - 1);
}
return s_fin;
}
function ClearBtn_click(e:MouseEvent):void{
results_txt.text = "0";
}
function RemoveBtn_click(e:MouseEvent):void{
results_txt.text = stringForSlice(results_txt.text);
if (results_txt.text == "") results_txt.text = "0";
}
4.3. Содержание «Interpretater.as»
package
{
import flash.display.MovieClip;
public class Interpretater extends MovieClip
{
//Стек для переменных
private var stack2:Array = new Array();
//Математические операции
private var opPlus:String = "+";
private var opMinus:String = "-";
private var opDivide:String = "/";
private var opMult:String = "*";
private var opPow:String = "^";
private var opSqrt:String = "√";
private var opCos:String = "c"; //Косинус
private var opSin:String = "s"; //Синус
private var opTg:String = "t"; //Тангенс
private var opCtg:String = "g"; //Катангенс
private var opLn:String = "l"; //Логарифм
private var opLeftBracket:String = "(";
private var opRightBracket:String = ")";
public function Interpretater() { }
public function parsingString(formula:String):Number
{//Проверяем на предмет скобок
switch(bracketsControl(formula)){
case 1: { /*Alert.show("Error:Отсутствует открывающая скобка");*/ return 0; break; }
case 2: { /*Alert.show("Error:Отсутствует закрывающая скобка"); */ return 0; break; }
}
var locStringRes:String = " " + calcualtePrimitive(bracketsCalculate(formula));
var locFloatRsultL:Number = parseFloat(locStringRes);
return locFloatRsultL;
//return 1;
}
public function calcualtePrimitive(formula:String):String
{
var stack:Array = new Array();
//Количество переменных в стеке
var st:int = 1;
//Временная переменная собираемя в цикле
var tmpVar:String = "";
for (var i:int = 1; i <= formula.length; i++)
{
var char:String = formula.substring(i - 1, i);
if (char == opPlus || char == opMinus || char == opDivide || char == opMult || char == opPow || char == opSqrt
|| char == opCos || char == opSin || char == opTg || char == opCtg || char == opLn) {
stack.push(tmpVar);
stack.push(char);
tmpVar = new String();
st = st + 2;
}
else {
//Продложаем считывать элемент
tmpVar = tmpVar + formula.substring(i - 1, i);
}
}
//Заносим последний элемент в стек
stack.push(tmpVar);
for (var i1:int = 1; i1 <= 11; i1++)
{
//Порядок арифметических действий
switch(i1)
{
case 1: { tmpVar = opCos; break; }
case 2: { tmpVar = opSin; break; }
case 3: { tmpVar = opTg; break; }
case 4: { tmpVar = opCtg; break; }
case 5: { tmpVar = opLn; break; }
case 6: { tmpVar = opSqrt; break; }
case 7: { tmpVar = opPow; break; }
case 8: { tmpVar = opMult; break; }
case 9: { tmpVar = opDivide; break; }
case 10: { tmpVar = opMinus; break; }
case 11: { tmpVar = opPlus; break; }
}
for (var j:int = 0; j <= st; j = j + 1)
{
if (stack[j] == tmpVar)
{
//Умножаем
if (tmpVar == opMult) {
stack[j - 1] = stack[j - 1] * stack[j + 1];
} else if (tmpVar == opDivide) { //Делим
stack[j - 1] = stack[j - 1] / stack[j + 1];
} else if (tmpVar == opPlus) { //Складываем
stack[j - 1] = stack[j - 1] * 1 + stack[j + 1] * 1
} else if (tmpVar == opMinus) { //Вычитаем
//if (j == 1) stack[j - 1] = 0;
stack[j - 1] = stack[j - 1] * 1 - stack[j + 1] * 1;
} else if (tmpVar == opPow) { //Cтепень
stack[j - 1] = Math.pow(stack[j - 1]*1,stack[j + 1]*1);
} else if (tmpVar == opSqrt) {
stack[j - 1] = Math.sqrt(stack[j + 1]*1);
} else if (tmpVar == opCos) { //Косинус
stack[j - 1] = Math.cos(stack[j + 1]*1);
} else if (tmpVar == opSin) { //Косинус
stack[j - 1] = Math.sin(stack[j + 1]*1);
} else if (tmpVar == opCtg) { //Косинус
stack[j - 1] = Math.cos(stack[j + 1]*1)/Math.sin(stack[j + 1]*1);
} else if (tmpVar == opTg) { //Косинус
stack[j - 1] = Math.sin(stack[j + 1]*1)/Math.cos(stack[j + 1]*1);
} else if (tmpVar == opLn) { //Косинус
stack[j - 1] = Math.log(stack[j + 1]*1);
}
//Запомним рассчитанное значение, а ячейки на основе которых велся расчет обнулим
stack[j] = "";
stack[j + 1] = "";
for (var t:int = j; t <= st - 1; t++){
stack[t] = stack[t + 2];
}
stack[st - 1] = "";
stack[st - 2] = "";
j = j - 1;
}
}
}
return stack[0];
}
//Проверка на пары открывающих-закрывающих скобок
private function bracketsControl(formula:String):int
{
//Количество переменных в стеке
var openBracketNum:int = 0;
var closeBracketNum:int = 0;
//Временная переменная собираемя в цикле
var tmpVar:String = "";
for (var i:int = 1; i <= formula.length; i++)
{
var char:String = formula.substring(i - 1, i);
if(char == opLeftBracket){
openBracketNum++;
}
//Закрывающая скобка
else if(char == opRightBracket){
closeBracketNum++;
}
}
if (openBracketNum < closeBracketNum)
return 1;
else if (openBracketNum > closeBracketNum)
return 2;
return 0;
}
//Вычисление через скобки
private function bracketsCalculate(formula:String):String
{
//Количество переменных в стеке
var openBracketIndex:int = 0;
var closeBracketIndex:int = 0;
//Временная переменная собираемя в цикле
var tmpVar:String = "";
for (var i:int = 0; i <= formula.length; i++)
{
var char:String = formula.substring(i - 1, i);
if(char == opLeftBracket){
openBracketIndex = i;
tmpVar = new String();
}
//Закрывающая скобка
else if(char == opRightBracket){
closeBracketIndex = i;
var replString:String = calcualtePrimitive(tmpVar).toString();
formula = formula.substr(0, openBracketIndex - 1) + replString +
formula.substr(closeBracketIndex, formula.length);
i = 0;
tmpVar = new String();
}
else
tmpVar = tmpVar + char;
}
return formula;
}
}
}
4.4. Содержание «Calc_Evgen.swf»
«Calc_Evgen.swf» - это скомпилированная версия файла проекта «Calc_Evgen.fla», предназначенная для работы во Flash-проигрывателе.
Кадры тестирования программы во Flash-проигрывателе:
Заключение
В ходе выполнения курсовой работы мною были рассмотрены основные аспекты программирования на языке ActionScript 3.0 в среде Adobe Flash CS4, были усвоены способы формирования кнопок, подключение классов, а так же приобретены практические навыки в создании игровых приложений в среде Flash.
Список использованной литературы
Литература:
1. Action Script 3.0 для Adobe Flash CS4 Professional; Официальный учебный курс.
2. ActionScript 3.0 для Flash. Подробное руководство; Колин Мук.
Интернет-ресурсы:
1. https://ru.wikipedia.org/wiki/calculator
2. https://ru.wikipedia.org/wiki/Adobe_Flash
3. https://google.com