Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Как заставить Флеш решать простые уравнения? (http://www.flasher.ru/forum/showthread.php?t=89773)

Flash'OK 23.12.2006 11:11

Как заставить Флеш решать простые уравнения?
 
Нужно научиться заставить Флеш решать простые уравнения (+, -, *, /) с натуральными числами. Выглядит это так: на титульном листе документа написано: (допустим) x+25= после равно стоит Imput текст, который просит ввести пользователя число. Далее пользователь, после того как ввел число, жмет на кнопку, и выводится (переменную, введенную юзером, назову I):
x+25=I
x=I-25
x=ответ уравнения.
Вот и вопрос: как заставить Флеш решать уравнения с введенной пользователем переменной?

Flash'OK 23.12.2006 11:12

А, и кстати, Actions знаю плохо. Очень плохо.

iNils 23.12.2006 11:29

Писать парсер. Который разбирает строку с уравнением на числа, переменные и математические действия согласно их приоретету.

etc 23.12.2006 12:16

http://as3.ru/?p=3
Только надо переписать под AS1/AS2 :)

Kinsler 23.12.2006 14:29

Блин чего на человека накинулись
2 __etc он же написал что ПЛОХО знает
а ты хошь чтоб он класс переписал
2 Автор - идем в магазин и покупаем книжку чессно-слово....
ну либо платим мне и в пон. у тя будет научный калькулятор :)

miramax 23.12.2006 14:45

Цитата:

Сообщение от Kinsler
а ты хошь чтоб он класс переписал

Там ничего переписывать не надо, просто нужно скопировать функцию calculate() куда нужно ( без объявления пакета и класса), поменять пару строк и юзать в своих целях. :)
Навсякий случай, по совету __etc , выложил вариант н AS1/AS2
http://as3.ru/?p=3

etc 23.12.2006 14:45

Цитата:

Сообщение от Kinsler
2 __etc он же написал что ПЛОХО знает
а ты хошь чтоб он класс переписал

я? Я не хочу. Я вообще не говорил, кто будет этим заниматься.

Flash'OK 23.12.2006 23:10

Да нет. Скрипт в ссылке, как я понял, заставляет Флеш решать примеры, введенные в строку юзером. А задача другая: уже даны два числа - х+25, далее следует строка ввода. допустим я ввел в строку число 30. то есть: х+25=30. Флеш должен распознать это 30, сопоставить его с 2 данными, х и 25, и выписать в нижнее отведенное место:
х+25=30
х=30-25
х=5.
То есть вставляется только одно число, все остальное с помощью данных Флеш находит сам. И уж ясно, что здесь не обойтись без скрипта. Но не писать же в 250 строк :wacko: !

miramax 23.12.2006 23:29

Цитата:

Сообщение от Flash'OK
Да нет. Скрипт в ссылке, как я понял, заставляет Флеш решать примеры, введенные в строку юзером. А задача другая: уже даны два числа - х+25, далее следует строка ввода. допустим я ввел в строку число 30. то есть: х+25=30. Флеш должен распознать это 30, сопоставить его с 2 данными, х и 25, и выписать в нижнее отведенное место:
х+25=30
х=30-25
х=5.
То есть вставляется только одно число, все остальное с помощью данных Флеш находит сам. И уж ясно, что здесь не обойтись без скрипта. Но не писать же в 250 строк :wacko: !

Нет, надо в два раза больше строк :D

Flash'OK 24.12.2006 10:23

Разве? Не верю. Мне казалось надо то и только обозначить переменную, потом вставить ее в строку, ну и решить пример 30-25. Неужели Флеш не может обойтись... ну в крайнем случае 50 строками?

miramax 24.12.2006 11:59

Цитата:

Сообщение от Flash'OK
Разве? Не верю. Мне казалось надо то и только обозначить переменную, потом вставить ее в строку, ну и решить пример 30-25. Неужели Флеш не может обойтись... ну в крайнем случае 50 строками?

Причём тут строки ? Даже в 10 строках может быть заложен огромный смысл.

DarkLight 24.12.2006 14:49

а можно еще __bytecode__("...") - и одной строчки хватит:)

Flash'OK 24.12.2006 15:50

Цитата:

Сообщение от miramax
Причём тут строки?

А очень даже притом. Количество строк имеет большое значение. Много писанины - большой труд ( :wacko: ). А у меня определенный вопрос: куда и какой код вставлять.
Цитата:

Сообщение от DarkLight
_bytecode_("...")

Это еще что? Функция ето ясно, а что она делает?

wvxvw 25.12.2006 05:26

пример х-25=[user_input]
Код:

var l1_txt:TextField = _root.createTextField("l1_txt", 0, 0, 0, 200, 20);
with (l1_txt) {
        type = "input";
        border = true;
        borderColor = 0x000000;
        text = "X - 25 = ";
}
Key.addListener(l1_txt);
l1_txt.onKeyDown = function() {
        if (Key.getCode() == Key.ENTER) {
                _root.calculate(this.text);
        }
};
function calculate(_str:String):Void {
        var _l1:Number = Number(_str.split("=").pop());
        trace("X = "+(25-_l1));
}

Это только принцип действия, тут нету обработчика нелегитимного ввода, нету реального парсера и анализатора уравнения, просто, чтобы начать разбираться

Flash'OK 25.12.2006 16:58

Спасибо! все работает. Только вопрос. Надо сделать, чтоб ответ появлялся прямо в файле, а не в OutPut. Отвести в документе место, пусть туда и выводит. Или это сложно?

wvxvw 25.12.2006 17:55

2 Flash'OK:
Смотри... это просто пример для облегчения понимания, на самом деле для того, чтобы все "по-честному" работало надо больше писать. Если ты понял, как это работает, то у тебя не должно быть проблемы создать еще одно текстовое поле (по аналогии с первыми семью строчками кода) и выводить результат туда...
Я могу написать готовое решение, но это довольно долго + нет особой необходимости - спасибо Miramax =) Просто это задача не совсем для новичков. Попробуй разобрать этот пример. Если что-то непонятно, можно действовать следующим образом:
если пишешь код во флешевском редакторе, то зарезервированные слова и выражения отображаются синим цветом, выделяешь такое слово и жмешь F1 - откроется соответствующая страница хелпа, там читаешь и смотришь, что это такое и что оно делает. Ну... я так понял, что книжку достать проблема. Если читать по-английски тоже проблема - тут в прикрепленных топах есть ссылки на русифицированый хелп.

Flash'OK 25.12.2006 21:01

Код:

var l1_txt:TextField = _root.createTextField("l1_txt", 0, 0, 0, 200, 20);
Wvxvw, если что неправильно, поправьте.
В первой строке с помощью кода создаем Impyt-строку, переменную. В скобках даем ей имя, размер и координаты положения на листе. Далее настраиваем текст, который будет вносится пользователем:
Код:

with (l1_txt) {
        type = "input";
        border = true;
        borderColor = 0x000000;
        text = "X - 25 = ";
}

тип строки - Imput, вроде бы шрифт true, цвет текста и то, какой текст там уже есть (в строке). Далее:
Код:

Key.addListener(l1_txt);
l1_txt.onKeyDown = function()

Это никак не могу понять :umnik2: .
Код:

if (Key.getCode() == Key.ENTER) {
                _root.calculate(this.text);
        }

Это, кажется, нужно для того, чтобы активировать кнопку Еnter. После того, как текст будет введен в строку, можно ее нажать, и тогда переходим к следующему разделу кода:
Код:

function calculate(_str:String):Void {
        var _l1:Number = Number(_str.split("=").pop());
        trace("X = "+(25-_l1));
}

Понял, наверное, только третью строчку: она выводит в окно "X=", а дальше считает. Непонял, для чего стоит плюс после "Х=". Последнее l1 выражает переменную. В строке вписано выражение, которое и считает. Нечто подобное видел на С.

wvxvw 25.12.2006 22:52

эээ...
type - тип текстового поля есть варианты static, dinamic, input
border - отображать ли рамку вокруг текста
borderColor - цвет рамки
addListener - метод объекта, активировав этот метод и передав ему в качестве параметра ссылку на другой объект - добавляем объект указанный в ссылке в массив "слушателей" объекта (если один объект "слушает" события другого, это значит, что если "говорящий" объект что-то скажет - слушатель об этом узнает и среагирует соответственно). В данном случае мы говорим текстовому полю l1_txt что нужно слушать все события объекта Key (кнопка). Одно из таких событий - onKeyDown (кнопка нажата). Дальше описываем, что нужно сделать, если кнопка нажата.

Последняя цитата:
- первая строчка объявляет функцию, задает ей количество и тип параметров, тип возвращаемого значения. В нашем случае, принимаемых параметров - 1, принадлежит к классу String (строка), функция ничего не возвращает (Void - пустота) это писать не обязательно, но желательно т.как в АС3 это влияет на производительность.
Дальше объявляем локальную переменную функции, задаем ее тип как Number (число) и присваеваем ей значение возвращаемое глобальной функцией Number().
Выражение в скобках: берем переданный функции параметр и выполняем с ним действие преобразующее его в массив, состоящий в нашем случае из двух частей - часть строки до знака "=" и после. Следующая операция pop() - это уже метод массива, она возвращает последний член массива.
"+" в последней строчке нужен потому, что trace() в качестве аргумента принимает всего 1 параметр. Т.е. как и в случае с Number() сначала выполняются действия в скобках, потом все выражение преобразуется в нужный тип и передается функции вывода.

Flash'OK 26.12.2006 18:01

Я подумал, что мне надо начинать с чего нибудь попроще. Математические функции пока мне не по зубам. Да и физические. Точно... Для меня это оказалось тяжелее, чем предполагал :( .

Skoder 26.12.2006 18:29

Вложений: 1
вот это твой пример, если я правильно понял что ты хотел

Flash'OK 26.12.2006 19:57

Да, это то :) ! Все правильно. Я вроде как понял скрипт. Сейчас сделаю чего нибудь с другим уравнением.

Skoder 26.12.2006 20:01

всё очень просто, но если что непонятно спрашивай!

Flash'OK 26.12.2006 20:13

Вложений: 1
Уря! Все получилось! Это другое выражение. 32-у

Skoder 26.12.2006 20:22

поздравляю!!!!


Часовой пояс GMT +4, время: 03:29.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.