Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Расчеты 
:(
    Опции темы
GoldFinch
Дата 21.5.2009, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



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

Получилось примерно следующее:
Код

<!DOCTYPE HTML>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="formuls.js"></script>
<script type="text/javascript" src="tools.js"></script>
</head><body>

x1=<input type="text" value="5" id="x1"><br>
x2=<input type="text" value="5" id="x2"><br>
<input type="button" value="посчитать" onclick="calc(Foo)"><br>
y1=<span id="y1"></span><br>
y2=<span id="y2"></span><br>

</body></html>

Код

//////////////
// tools.js //
//////////////
function loadValues(Obj){
    for(var i in Obj)Obj[i]=document.getElementById(i).value;
    return Obj;
}
function storeHTML(Obj){
    for(var i in Obj)document.getElementById(i).innerHTML=Obj[i];
}
function calc(Func) {
    storeHTML(Func(loadValues(Func(0))));
}

Код

////////////////
// formuls.js //
////////////////
function f1(x,m){with(Math)return pow(x,m) }
function Foo(inp) {
    if(inp==0)return {x1:0,x2:0};
    with(inp)return {y1:f1(x1,2),y2:f1(x2,3)};
}


можно ли как-то улучшить такой код?
PM MAIL ICQ   Вверх
Aliance
Дата 21.5.2009, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Могу посоветовать не использовать with - он тормозит скрипт.
Так же, возможно, в твоей функции calc стоит использовать метод call() / apply()
Потом, мне кажется у тебя слишком уж много лишних функций. Попробуй упростить это.
PM MAIL WWW ICQ Skype   Вверх
GoldFinch
Дата 22.5.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Действительно, идея возврата функцией списка своих входных параметров хоть и хороша, но
    function foo©{ if©return {x1:0,x2:0}; ... }
синтаксически мало отличается от
    function foo(){args('x1','x2'); ... }
причем последняя запись короче.
Функцию storeHTML можно занести в Foo, заменив return {y1:...,y2:...} на ret('y1','y2')
Минусы такого подхода - небольшое повышение связей между кодом расчетов и кодом работающим с DOM, впрочем 2 функции с очевидными названиями и применением погоды не сделают.
Получился такой код:
Код

////////////////
// formuls.js //
////////////////
function Foo() {
    args('x1','x2'); 
    with(Math) {
        y1=x1+2;
        y2=pow(x2,3);
    };
    ret('y1','y2');
}
//////////////
// tools.js //
//////////////
function ret() {
    for(var i=0;i<arguments.length;i++) {
        var arg=arguments[i];
        var el=document.getElementById(arg);
        el[(el.value)?'value':'innerHTML']=this[arg];        
    };
}
function args() {
    for(var i=0;i<arguments.length;i++) {
        var arg=arguments[i];
        this[arg]=document.getElementById(arg).value;
    };
}

....
<input type="button" value="посчитать" onclick="Foo()"><br>

однако хотелось бы еще избавиться от with(Math)

Добавлено через 6 минут
мде... в firefox'е 
 x=expr
добавляет свойство в объект, а в IE надо писать
 this.x=expr

это можно както обойти, чтобы this. не писать?
PM MAIL ICQ   Вверх
youri
Дата 22.5.2009, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 2
Всего: 16



Цитата(GoldFinch @  22.5.2009,  13:35 Найти цитируемый пост)
однако хотелось бы еще избавиться от with(Math)

Код

pow = Math.pow


Цитата(GoldFinch @  22.5.2009,  13:35 Найти цитируемый пост)
мде... в firefox'е  x=exprдобавляет свойство в объект, а в IE надо писать this.x=expr

а можно пример кода?
PM   Вверх
GoldFinch
Дата 22.5.2009, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



youri, само собой и не Math.pow()

пример кода - выше
Код

<!DOCTYPE HTML>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
function Foo() {
    args('x1','x2'); 
    with(Math) {
        y1=x1+2; //this.y1=x1+2; для IE
        y2=pow(x2,3);
    };
    ret('y1','y2');
}
function ret() {
    for(var i=0;i<arguments.length;i++) {
        var arg=arguments[i];
        var el=document.getElementById(arg);
        el[(el.value)?'value':'innerHTML']=this[arg];        
    };
}
function args() {
    for(var i=0;i<arguments.length;i++) {
        var arg=arguments[i];
        this[arg]=document.getElementById(arg).value;
    };
}
</script>
</head><body>

x1=<input type="text" value="5" id="x1" onchange="Foo()"><br>
x2=<input type="text" value="5" id="x2" onchange="Foo()"><br>
<input type="button" value="посчитать" onclick="Foo()"><br>
y1=<span id="y1"></span><br>
y2=<input type="text" value="-" id="y2"><br>

</body></html>

PM MAIL ICQ   Вверх
youri
Дата 22.5.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 2
Всего: 16



Цитата(GoldFinch @  22.5.2009,  13:35 Найти цитируемый пост)
мде... в firefox'е  x=exprдобавляет свойство в объект, а в IE надо писать this.x=expr

в качестве объекта в данном случае - window (т.е. это глобальные переменные получаются)
ie создает глобальные переменные для элементов с id, но почему он так ругается O_o можно к id элементов добавлять подчеркивание
PM   Вверх
Aliance
Дата 22.5.2009, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



А что не устраивает в написании this?

Цитата

однако хотелось бы еще избавиться от with(Math)

А что мешает?

Кстати, по поводу with() {}, в ECMAScript 5.0 он вообще считается устаревшим и не рекомендован к использованию:
Цитата

with(){} statements are dead when strict mode is enabled - in fact it even appears as a syntax error.

(с) с блога John Resig
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 22.5.2009, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



GoldFinch, требуется ли большая скорость вычисления выражений или массовоое (в большом цикле) выполнение введенных формул? Можел оказаться эффективнее создавать функцию-формулу на ходу методом new Function...
Код

function sum(a, b) {
  return a + b;
}

var sum = new Function("a", "b", "return a + b");





--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
GoldFinch
Дата 23.5.2009, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



требуется наиболее удобная форма записи, позволяющая писать и читать математические формулы
поэтому запись this.x=Math.sqrt(1+Math.log(1+2*Math.pi/theta)) нежелательна

скорость не принципиальна
PM MAIL ICQ   Вверх
ksnk
Дата 23.5.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



GoldFinch, Наиболее удобная форма, позволяющая читать мат формулы - нормальная математическая. В Маткаде реализован довольно удобный способ ввода формул. Возможно, будет правильным поискать на флеш какую-нибудь реализацию ввода-отображения формул в MathCad-like стиле.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
GoldFinch
Дата 23.5.2009, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



ksnk, у dhtml+javascript зависимостей практически нет, и писать на нем приятно.
вместо флеш+маткад проще тогда на C# или на С++/CLI, но хотелось бы на javascript
PM MAIL ICQ   Вверх
ksnk
Дата 23.5.2009, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Вот еще почитать. Оказывается, отображение формул уже практически стандартизовано. Но как всегда через жW3С.  
Отображение формул можно и проще сделать, вот так, к примеру. 

А вот ввод формул в стиле МатКада в нужное место с выделением необходимых частей формулы уже очень сложно делать на JavaScript.  Так что придется, наверное вводить в TEX виде... На флешке, по идее, это сделать было бы проще...




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
GoldFinch
Дата 23.5.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



ksnk, мне отображение формул в хтмл вообще не надо, я говорил про код. про читаемость кода.
PM MAIL ICQ   Вверх
ksnk
Дата 23.5.2009, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



GoldFinch, Хм... А я как всегда какую-то свою задачу начал решать smile Возможно, ввело в заблуждение вот это 
Цитата

требуется наиболее удобная форма записи, позволяющая писать и читать математические формулы
поэтому запись this.x=Math.sqrt(1+Math.log(1+2*Math.pi/theta)) нежелательна
 Ну да ладно...

А почему это нежелательна? Потому что слишком длинная конструкция Math.sqrt? А вот так
Код

var SQRT=Math.sqrt, PI=Math.pi, LOG=Math.log;
...
this.x=SQRT(1+LOG(1+2*PI/theta))

более приемлемо? 

для кого пишется код? Какого вида формулы будут желательны?



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
GoldFinch
Дата 23.5.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



ksnk, "var SQRT=Math.sqrt" действительно хорошее решение

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.