IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
  • Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом
  • VINegative
    сообщение 16.06.2012 - 21:18
    Сообщение #1


    Новичок
    *

    Группа: Новичок
    Сообщений: 3
    Регистрация: 16.06.2012
    Пользователь №: 11036



    Прога на 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
    сообщение 17.06.2012 - 00:01
    Сообщение #2


    Ветеран конференции
    *****

    Группа: Flash Zone Team
    Сообщений: 4739
    Регистрация: 10.03.2005
    Из: Киев
    Пользователь №: 5



    Цитата
    Т.е. при введении сначала дробного числа, а потом любого другого не работает. Что с этим делать, подскажите пожалуйста!

    VINegative

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

    Помимо операции добавления более нигде таких глюков нет? В операции удаления и т.д. (обязательно детально протестируй все операции). Если нет, то значит только код добавления улучшай.


    --------------------
    Best wishes & regards,
    MustLive
    Администратор сайта
    http://mlfun.org.ua
    Вернуться в начало страницы
     
    +Ответить с цитированием данного сообщения

    Ответить в эту темуОткрыть новую тему
    1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
    Пользователей: 0

     

    - Текстовая версия Сейчас: 19.01.2013 - 01:09