X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Калькулятор во flash, Проблема с типизацией переменных, выдает NaN вместо числа
dreemix
dreemix
Topic Starter сообщение 10.6.2009, 10:50; Ответить: dreemix
Сообщение #1


Cтараюсь создать калькурятор на flash. Начал с простого, простой код:
tablo = 0;//переменная динамического поля
but_1.onPress = function():Void  {
    var num:Number = 1;
    numBer = numBer*10+num;
/*Прописываем чтобы, например, нажатие трижды на кнопку but_1 дало 111
Первоначальное значение переменной, хранящей введенное число, равно 0.
• Нажатие кнопки 1: переменная умножается на 10 и к ней прибавляется 1. Результат — 1.
• Второе нажатие кнопки 1: 1 • 10 + 1 = 11.*/
    tablo = numBer;
    trace(num);
    trace(isNaN(tablo));//выводит true
};

trace(Number(null)); // Выводит: Nan (приведение null к числовому типу)
Если у кого-то еще есть, может выложите исходники к книге Гурсого про ActionScript 2.0???

Что я делаю не так????
Исходник по адресу http://www.divshare.com/download/7626094-83c
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 11.6.2009, 1:39; Ответить: ZiTosS
Сообщение #2


Renovatio, а что такое null? Ты думаешь это ноль? Ты глубоко ошибаешься. null - пустота.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
dreemix
dreemix
Topic Starter сообщение 11.6.2009, 8:16; Ответить: dreemix
Сообщение #3


"Тип null практически аналогичен типу undefined. Единственная относящаяся к нему величина, задаваемая литералом null, подобно undefined, показывает, что некоторая переменная или свойство не имеет конкретного значения. Однако null, в отличие от undefined, никогда не присваивается автоматически. Эта величина введена в язык для того, чтобы было возможно различить две принципиально разные ситуации: переменная не существует или же она просто не содержит пока конкретного элемента данных."

Дело не в null. Я сам не пойму в чем дело. Этот код также вызывает ошибку:
tablo = 0;//переменная динамического поля
but_1.onPress = function():Void  {
    var num:Number = 1;
    var numBer:Number = null;
    numBer = numBer*10+num;
    tablo = numBer;
    trace(num);
    trace(isNaN(tablo));//выводит true
};

Вопрос именно почему когда переменные уже типизированы, возвращается NaN??? Потому что в строке numBer = numBer*10+num; одни числа. Но для компилятора это не число trace(isNaN(tablo));//выводит true.
Может, на этапе присвоения tablo = numBer; происходит динамическое изменение типов?? Но не должно ведь.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
dreemix
dreemix
Topic Starter сообщение 11.6.2009, 9:55; Ответить: dreemix
Сообщение #4


Вот работающий код:
tablo = 0;//переменная динамического поля
numBer = 0;
but_1.onPress = function():Void  {
    var num:Number = 1;
    numBer = numBer*10+num;
    /*Прописываем чтобы, например, нажатие трижды на кнопку but_1 дало 111
    Первоначальное значение переменной, хранящей введенное число, равно 0.
    • Нажатие кнопки 1: переменная умножается на 10 и к ней прибавляется 1. Результат — 1.
    • Второе нажатие кнопки 1: 1 • 10 + 1 = 11.*/
    tablo = numBer;
    trace(num);

};


Как мне сказали, нужно было инициализировать numBer.
trace(isNaN(tablo));//выводит false
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
dreemix
dreemix
Topic Starter сообщение 6.7.2009, 13:17; Ответить: dreemix
Сообщение #5


Доработал калькулятор по книгу Гурского. Вот что вышло:
//Объявляем переменные
tablo = 0;
numBer = 0;
num = null;
tochka = true;
n = 1;
str = "";
memory = null;
operat = null;
but_ravno.enabled = false;
//Обработчики нажатий кнопок
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_0.onPress = function() {
    num = 0;
    MyAdd();
};
//Обработка нажатий точки
but_tochka.onPress = function() {
    if (tochka) {
        tochka = false;
        str += ".";
    }
};
//Инверсия знака
but_znak.onPress = function() {
    if (stf != 0 && str != "") {
        numBer *= -1;
    }
    if (str.substring(0, 1) != "-") {
        str = "-"+str;
    } else {
        str = str.substring(1);
    }
    if (str.length<17) {
        tablo = str;
    } else {
        tablo = numBer;
    }
};
//Обнуление
but_clear.onPress = function() {
    tablo=0, num=0, tochka=true, numBer=0, n=1, str="";
    but_ravno.enabled=false, block(true), block2(true), block3(true);
};
//Тригонометрические функции
but_plus.onPress = function() {
    calc("plus");
};
but_minus.onPress = function() {
    calc("minus");
};
but_umnojit.onPress = function() {
    calc("umnojit");
};
but_delit.onPress = function() {
    calc("delit");
};
but_stepen.onPress = function() {
    calc("stepen");
};
//Наша функция, которая все обрабатывает
function MyAdd() {
    if (tochka) {
        numBer = numBer*10+num;
    } else {
        numBer += num/Math.pow(10, n);
        n++;
    }
    if (str != 0) {
        str = str+num;
    } else {
        str = String(num);
    }
    if (str.length<17) {
        tablo = str;
    } else {
        tablo = numBer;
    }
}
//Обработка нажатий операндов
function calc(opera) {
    memory = numBer;
    numBer = 0;
    str = "";
    operat = opera;
    but_ravno.enabled = true;
    block(false);
    block2(true);
    block3(false);
}
//Обработка при нажатии на знак равно
but_ravno.onPress = function() {
    var result = null;
    if (operat == "plus") {
        result = memory+numBer;
    }
    if (operat == "minus") {
        result = memory-numBer;
    }
    if (operat == "umnojit") {
        result = memory*numBer;
    }
    if (operat == "delit") {
        result = memmory/numBer;
    }
    if (operat == "stepen") {
        result = Math.pow(memory, numBer);
    }
    numBer = result;
    str = String(result);
    tablo = result;
    but_ravno.enabled = false;
    block(true);
    block2(false);
    block3(true);
};
//Функция блокировки арифметических операций
function block(par) {
    but_plus.enabled=par, but_umnojit.enabled=par, but_minus.enabled=par, but_delit.enabled=par, but_stepen.enabled=par;
}
//Функция блокировки кнопок с цифрами
function block2(par) {
    for (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.onPress = function() {
    func("cos");
};
but_tan.onPress = function() {
    func("tan");
};
but_ln.onPress = function() {
    func("ln");
};
but_sqrt.onPress = function() {
    func("sqrt");
};
but_round.onPress = function() {
    func("round");
};
function func(par) {//функция обрабатывает нажатие на тригонометрические кнопки
    result = null;
    if (par == "sin") {
        result = Math.sin(numBer/180*Math.PI);
    }
    if (par == "cos") {
        result = Math.cos(numBer/180*Math.PI);
    }
    if (par == "tan") {
        result = Math.tan(numBer/180*Math.PI);
    }
    if (par == "ln") {
        result = Math.log(numBer);
    }
    if (par == "sqrt") {
        result = Math.sqrt(numBer);
    }
    if (par == "round") {
        result = Math.round(numBer);
    }
    numBer = result;
    str = String(result);
    tablo = result;
}
function block3(par) {
    but_sin.enabled=par, but_cos.enabled=par, but_tan.enabled=par, but_ln.enabled=par, but_sqrt.enabled=par, but_round.enabled=par;
}
//Математические константы
but_PI.onPress = function() {
    numBer = Math.PI;
    str = String(Math.PI);
    block2(false);
    tablo = Math.PI;
};
but_E.onPress = function() {
    numBer = Math.E;
    str = String(Math.E);
    block2(false);
    tablo = Math.E;
};


Только есть проблема с умножением и делением, так что если кому надо, то исправьте.
Инженерный калькулятор можно посмотреть здесь!
Исходник здесь: http://www.divshare.com/download/7839853-38c
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 6.7.2009, 19:53; Ответить: ZiTosS
Сообщение #6


Renovatio, эх совсем это не инденерный каликулятор. Он не точно вычисляет значения sin и cos. Так как во Flash они не проработаны. Сам проверь простейшими углами: 0 90 180 270.

Ты в чём пишешь? Macromedia Flash 2004? Если да, то там ActionScript 2.0 удобнее. Ещё бы имело аспект объявлять переменные со строгой типизацией. Это бы улучшило понимание кода. + половине кода можно было назначить один и тот же обработчик, например для кнопок 1,2,3,4...
Просто параметр бы нужный передавался.
Да уж, калькулятор конечно у тебя простейший. :) Ну ничего, я наверное на Flash и такого бы не сделал.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
dreemix
dreemix
Topic Starter сообщение 7.7.2009, 1:02; Ответить: dreemix
Сообщение #7


Дааааа, что-то я не туда ссылку дал, но точно на том форуме был отличный инженерный калькулятор.

Я пишу во flash CS3. На ActionScript 2.0 пока что, решил что он легче и начинать надо с малого.
Когда объявлял со строгой типизацией, то постоянно были проблемы типи Not a Number!! И это очень огорчало, поэтому от этого отказался.

Да уж, калькулятор конечно у тебя простейший. Ну ничего, я наверное на Flash и такого бы не сделал.

Так это и не я как бы. Это урок у Гурского. Кто по нем не учился??? :)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 7.7.2009, 2:20; Ответить: ZiTosS
Сообщение #8


Renovatio, про строгую типизацию... Там нет преобразования типа и локальных переменных?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
dreemix
dreemix
Topic Starter сообщение 7.7.2009, 8:53; Ответить: dreemix
Сообщение #9


Да вроде переменная result является локальной. А преобразования типов я что-то не заметил. А к чему вы это спросили??? Думаете это как-то было связано с ошибкой???
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 11.7.2009, 23:57; Ответить: ZiTosS
Сообщение #10


(Renovatio @ 11.6.2009, 9:55) *
Вот работающий код:
tablo = 0;//переменная динамического поля
numBer = 0;
but_1.onPress = function():Void  {
    var num:Number = 1;
    numBer = numBer*10+num;
    /*Прописываем чтобы, например, нажатие трижды на кнопку but_1 дало 111
    Первоначальное значение переменной, хранящей введенное число, равно 0.
    • Нажатие кнопки 1: переменная умножается на 10 и к ней прибавляется 1. Результат — 1.
    • Второе нажатие кнопки 1: 1 • 10 + 1 = 11.*/
    tablo = numBer;
    trace(num);

};


Как мне сказали, нужно было инициализировать numBer.
trace(isNaN(tablo));//выводит false


Это само собой вытекает.
Если ты не иницыализируешь Переменную numBer - то даже если она имеет чисовой тип, она не имеет начального значения. То есть undifened.
Так вот, ты несуществующую сущность использовал в функции так:
    numBer = numBer*10+num;

Несуществующей сущности присвоить несуществующую сущность, умноженную на 10 и прибавить единицу.

Да вроде переменная result является локальной. А преобразования типов я что-то не заметил. А к чему вы это спросили??? Думаете это как-то было связано с ошибкой???

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

Про преобразования типов я заговорил, потому что в большинстве языков программирования присуствуют специальные функции или операторы для преобразования типов.
Если бы я писал калликулятор, то естественно бы сделал возможность записи выражения с подстановками, а затем его проверки. Это более правильно, чем возвращать пользователю сразу результат. Тут нужна математическая логика.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Кальку, точнее калькулятор в строительной тематике
Нужен PHP код
1 MihalychAIP 919 20.4.2022, 2:04
автор: sergogogo
Открытая тема (нет новых ответов) Ищется программист. Создать калькулятор цен на сайте
JS | DLE
0 Mukis 1674 1.4.2019, 15:24
автор: Mukis
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыРазработка баннеров для интернет-рекламы: html5, flash, gif и jpg
24 tolkunovdb 7515 25.2.2019, 15:38
автор: tolkunovdb
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыРазработка баннеров для интернет-рекламы: html5, flash, gif и jpg
34 twildd 19457 25.2.2019, 15:19
автор: twildd
Открытая тема (нет новых ответов) [Разработка плагина] Калькулятор WordPress
Необходимо написать плагин под WordPress
3 mimoplus 2958 9.10.2017, 15:07
автор: Alexandr_js


 



RSS Текстовая версия Сейчас: 26.4.2024, 3:14
Дизайн