Перейти к содержимому

Реферальная программа Мегаплана

Выбрать шаблон и создать сайт

Калькулятор во flash

#1 Renovatio

Renovatio
  • Пользователь
  • 183 сообщений
  • Репутация: 4
0

Отправлено 10 Июнь 2009 - 09:50

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....oad/7626094-83c

 

 

  • 0

#2 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 11 Июнь 2009 - 00:39

Renovatio, а что такое null? Ты думаешь это ноль? Ты глубоко ошибаешься. null - пустота.
  • 0

#3 Renovatio

Renovatio
    Topic Starter
  • Пользователь
  • 183 сообщений
  • Репутация: 4

Отправлено 11 Июнь 2009 - 07:16

"Тип 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; происходит динамическое изменение типов?? Но не должно ведь.
  • 0

#4 Renovatio

Renovatio
    Topic Starter
  • Пользователь
  • 183 сообщений
  • Репутация: 4

Отправлено 11 Июнь 2009 - 08: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
  • 0

#5 Renovatio

Renovatio
    Topic Starter
  • Пользователь
  • 183 сообщений
  • Репутация: 4

Отправлено 06 Июль 2009 - 12:17

Доработал калькулятор по книгу Гурского. Вот что вышло:
//Объявляем переменные
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....oad/7839853-38c
  • 0

#6 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 06 Июль 2009 - 18:53

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

Ты в чём пишешь? Macromedia Flash 2004? Если да, то там ActionScript 2.0 удобнее. Ещё бы имело аспект объявлять переменные со строгой типизацией. Это бы улучшило понимание кода. + половине кода можно было назначить один и тот же обработчик, например для кнопок 1,2,3,4...
Просто параметр бы нужный передавался.
Да уж, калькулятор конечно у тебя простейший. :) Ну ничего, я наверное на Flash и такого бы не сделал.
  • 0

#7 Renovatio

Renovatio
    Topic Starter
  • Пользователь
  • 183 сообщений
  • Репутация: 4

Отправлено 07 Июль 2009 - 00:02

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

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

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

Так это и не я как бы. Это урок у Гурского. Кто по нем не учился??? :)
  • 0

#8 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 07 Июль 2009 - 01:20

Renovatio, про строгую типизацию... Там нет преобразования типа и локальных переменных?
  • 0

#9 Renovatio

Renovatio
    Topic Starter
  • Пользователь
  • 183 сообщений
  • Репутация: 4

Отправлено 07 Июль 2009 - 07:53

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

#10 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 11 Июль 2009 - 22:57

Вот работающий код:

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 является локальной. А преобразования типов я что-то не заметил. А к чему вы это спросили??? Думаете это как-то было связано с ошибкой???

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

Про преобразования типов я заговорил, потому что в большинстве языков программирования присуствуют специальные функции или операторы для преобразования типов.
Если бы я писал калликулятор, то естественно бы сделал возможность записи выражения с подстановками, а затем его проверки. Это более правильно, чем возвращать пользователю сразу результат. Тут нужна математическая логика.
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru