Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: Калькулятор. Проблема с точкой.
Flash Zone Forum > Macromedia Flash > ActionScript
VINegative
Прога на ActionScript 2.0
Казалось бы, простейшая программа. Вроде бы всё дописано правильно. Не будем брать в расчёт точность вычисления математических функций cos, sin и пр.
Возникает единственная ПРОБЛЕМА С ТОЧКОЙ! Срабатывает по непонятной схеме.
Вот пример:
1 + 8.1 = 9.1 (всё ОК)
8.1 + 1 = 8.11 (WTF?)
0.1 + 0.1 = 0.101 и т.д.
Т.е. при введении сначала дробного числа, а потом любого другого не работает. Что с этим делать, подскажите пожалуйста!
Мне очень важно как можно скорее довести алгоритм до ума и использовать его в ДИПЛОМЕ! sad.gif
Код
// Объявляем переменные
var tablo = 0;
var num = 0;
var tochka = true;
var Numbers = 0;
var n = 1;
var Str = "";
var memory = null;
var operation = null;
// Отключаем кнопку "равно"
But_RAVNO.enabled = false;
// Код для кнопки очистки экрана
But_CLEAR.onPress = function() {
        tablo = 0;
        num = 0;
        tochka = true;
        Numbers = 0;
        n = 1;
        Str = "";
        But_RAVNO.enabled = false;
        block2(true);
        block(true);
        block3(true);
};
// Обработчики нажатия кнопок с цифрами
But_0.onPress = function() {
        num = 0;
        MyAdd();
};
But_1.onPress = function() {
        num = 1;
        MyAdd();
};
But_2.onPress = function() {
        num = 2;
        MyAdd();
};
But_3.onPress = function() {
        num = 3;
        MyAdd();
};
But_4.onPress = function() {
        num = 4;
        MyAdd();
};
But_5.onPress = function() {
        num = 5;
        MyAdd();
};
But_6.onPress = function() {
        num = 6;
        MyAdd();
};
But_7.onPress = function() {
        num = 7;
        MyAdd();
};
But_8.onPress = function() {
        num = 8;
        MyAdd();
};
But_9.onPress = function() {
        num = 9;
        MyAdd();
};
// Функция, отвечающая за добавление десятичной точки
But_TOCHKA.onPress = function() {
        if (tochka) {
                tochka = false;
                Str += ".";
        }
};
// Код для кнопки изменения знака
But_ZNAK.onPress = function() {
        if (Str != 0 && Str != "") {
                Numbers *= -1;
                if (Str.substring(0, 1) != "-") {
                        Str = "-"+Str;
                } else {
                        Str = Str.substring(1);
                }
                if (Str.length<17) {
                        tablo = Str;
                } else {
                        tablo = Numbers;
                }
        }
};
// Функция, формирующая по нажатиям кнопок операнды 
function MyAdd() {
        if (tochka) {
                Numbers = Numbers*10+num;
        } else {
                Numbers += num/Math.pow(10, n);
                n++;
        }
        if (Str != 0) {
                Str = Str+num;
        } else {
                Str = String(num);
        }
        if (Str.length<17) {
                tablo = Str;
        } else {
                tablo = Numbers;
        }
}
// Обработчики события нажатия кнопок арифметических операций
But_PLUS.onPress = function() {
        calc("plus");
};
But_MINUS.onPress = function() {
        calc("minus");
};
But_UMN.onPress = function() {
        calc("umn");
};
But_DEL.onPress = function() {
        calc("del");
};
But_STEPEN.onPress = function() {
        calc("stepen");
};
// Функция, вызываемая при нажатии кнопки арифметической операции
function calc(operat) {
        memory = Numbers;
        Numbers = 0;
        Str = "";
        operation = operat;
        block(false);
        But_RAVNO.enabled = true;
        block2(true);
        block3(false);
}
// Код, производящий вычисления при нажатии кнопки "равно"
But_RAVNO.onPress = function() {
        var result = null;
        if (operation == "plus") {
                result = memory+Numbers;
        }
        if (operation == "minus") {
                result = memory-Numbers;
        }
        if (operation == "umn") {
                result = memory*Numbers;
        }
        if (operation == "del") {
                result = memory/Numbers;
        }
        if (operation == "stepen") {
                result = Math.pow(memory, Numbers);
        }
        Numbers = result;
        Str = result;
        tablo = result;
        block(true);
        block2(false);
        block3(true);
        But_ravno.enabled = false;
};
// Функция, включающая или выключающая кнопки операций
function block(par) {
        But_PLUS.enabled = par;
        But_UMN.enabled = par;
        But_MINUS.enabled = par;
        But_DEL.enabled = par;
        But_STEPEN.enabled = par;
}
// Функция, отвечающая за активность кнопок с цифрами
function block2(par) {
        for (var i = 0; i<=9; i++) {
                eval("But_"+i).enabled = par;
        }
        But_TOCHKA.enabled = par;
        But_E.enabled = par;
        But_PI.enabled = par;
}
// Обработчики нажатия кнопок математических функций
But_SIN.onPress = function() {
        func("sin");
};
But_COS.onRelease = function() {
        func("cos");
};
But_TAN.onPress = function() {
        func("tan");
};
But_LN.onPress = function() {
        func("ln");
};
But_ASIN.onPress = function() {
        func("asin");
};
But_ACOS.onPress = function() {
        func("acos");
};
But_SQRT.onPress = function() {
        func("sqrt");
};
But_ROUN.onPress = function() {
        func("roun");
};
// Функция, отвечающая за вычисления при нажатии кнопки математической функции
function func(par) {
        var result = null;
        if (par == "sin") {
                result = Math.sin(Numbers/180*Math.PI);
        }
        if (par == "cos") {
                result = Math.cos(Numbers/180*Math.PI);
        }
        if (par == "tan") {
                result = Math.tan(Numbers/180*Math.PI);
        }
        if (par == "ln") {
                result = Math.log(Numbers);
        }
        if (par == "asin") {
                result = Math.asin(Numbers)/Math.PI*180;
        }
        if (par == "acos") {
                result = Math.acos(Numbers)/Math.PI*180;
        }
        if (par == "sqrt") {
                result = Math.sqrt(Numbers);
        }
        if (par == "roun") {
                result = Math.round(Numbers);
        }
        tablo = result;
        Numbers = result;
        Str = String(result);
}
// Функция, отвечающая за активность кнопок математических функций
function block3(par) {
        But_SIN.enabled = par;
        But_COS.enabled = par;
        But_TAN.enabled = par;
        But_LN.enabled = par;
        But_ASIN.enabled = par;
        But_ACOS.enabled = par;
        But_SQRT.enabled = par;
        But_ROUN.enabled = par;
}
// Обработчики нажатия кнопок математических констант
But_PI.onPress = function() {
        Numbers = Math.PI;
        Str = String(Math.PI);
        block2(false);
        tablo = Math.PI;
};
But_E.onPress = function() {
        Numbers = Math.E;
        Str = String(Math.E);
        block2(false);
        tablo = Math.E;
};

Исходник тут http://rghost.ru/38702893
MustLive
Цитата
Т.е. при введении сначала дробного числа, а потом любого другого не работает. Что с этим делать, подскажите пожалуйста!

VINegative

Это у тебя в коде срабатывает "преобразование операции". Т.е. после дробного числа вместо добавления срабатывает конкатенация. Сколько я создавал калькуляторов, такого у меня не случалось. Так что улучшать свой код wink.gif.

Помимо операции добавления более нигде таких глюков нет? В операции удаления и т.д. (обязательно детально протестируй все операции). Если нет, то значит только код добавления улучшай.
Русская версия IP.Board © 2001-2013 IPS, Inc.