Помощник
|
Калькулятор во flash, Проблема с типизацией переменных, выдает NaN вместо числа |
dreemix
|
Сообщение
#1
|
||
|
|
||
|
|||
ZiTosS |
11.6.2009, 1:39;
Ответить: ZiTosS
Сообщение
#2
|
|
Renovatio, а что такое null? Ты думаешь это ноль? Ты глубоко ошибаешься. null - пустота.
|
|
|
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
|
Сообщение
#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
|
Сообщение
#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 |
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
|
Сообщение
#7
|
|
Дааааа, что-то я не туда ссылку дал, но точно на том форуме был отличный инженерный калькулятор.
Я пишу во flash CS3. На ActionScript 2.0 пока что, решил что он легче и начинать надо с малого. Когда объявлял со строгой типизацией, то постоянно были проблемы типи Not a Number!! И это очень огорчало, поэтому от этого отказался. Да уж, калькулятор конечно у тебя простейший. Ну ничего, я наверное на Flash и такого бы не сделал. Так это и не я как бы. Это урок у Гурского. Кто по нем не учился??? |
|
|
ZiTosS |
7.7.2009, 2:20;
Ответить: ZiTosS
Сообщение
#8
|
|
Renovatio, про строгую типизацию... Там нет преобразования типа и локальных переменных?
|
|
|
dreemix
|
Сообщение
#9
|
|
Да вроде переменная result является локальной. А преобразования типов я что-то не заметил. А к чему вы это спросили??? Думаете это как-то было связано с ошибкой???
|
|
|
ZiTosS |
11.7.2009, 23:57;
Ответить: ZiTosS
Сообщение
#10
|
|
Вот работающий код: 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 является локальной. А преобразования типов я что-то не заметил. А к чему вы это спросили??? Думаете это как-то было связано с ошибкой??? Я спросил это к тому, что использовать глобальные переменные это ужасный тон. Потому что не всегда увидишь, где меняются значения переменных. Что же нам нельзя возвращать значение во временную память? Про преобразования типов я заговорил, потому что в большинстве языков программирования присуствуют специальные функции или операторы для преобразования типов. Если бы я писал калликулятор, то естественно бы сделал возможность записи выражения с подстановками, а затем его проверки. Это более правильно, чем возвращать пользователю сразу результат. Тут нужна математическая логика. |
|
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Кальку, точнее калькулятор в строительной тематике Нужен 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 |
Текстовая версия | Сейчас: 26.4.2024, 0:47 |