Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.09.2011, 00:03
Аспирант
Отправить личное сообщение для qwertyuiop10 Посмотреть профиль Найти все сообщения от qwertyuiop10
 
Регистрация: 29.09.2011
Сообщений: 42

погрешности калькулятора
<html>
<head>
</head>
<body>
<script language="javascript">
str="5*8/3*6/10";
ss1=str.split(/\+|\-|\*|\//);
ss2=str.split(/0|1|2|3|4|5|6|7|8|9/);
//строка, числовой массив и массив действий

//------функции---
function clear(){
ss4=[];
ss3=[];

j=0;
for(i=0;i<ss1.length;i++){
if(ss1[i]!=""){
ss4[j++]=ss1[i];
}}
ss1=ss4;

j=0;
for(i=0;i<ss2.length;i++){
if(ss2[i]!=""){
ss3[j++]=ss2[i];
}}
ss2=ss3;}
//-----------чистка массивов------------
clear();
//-----------делим---------------------------
for(i=0;i<ss2.length;i++){
 if(ss2[i]=="/"){
  ss1[i]=ss1[i]/ss1[i+1];
  ss1[i]=Math.round(ss1[i]*100000)/100000;
  ss1[i+1]='';
  ss2[i]='';
  clear();
  i=0;
alert("Строка: "+str+"\nМассив числел: "+ss1+"\nМассив дейсивий: "+ss2+"\n");
}}
for(i=0;i<ss2.length;i++){
 if(ss2[i]=="/"){
  ss1[i]=ss1[i]/ss1[i+1];
  ss1[i]=Math.round(ss1[i]*100000)/100000;
  ss1[i+1]='';
  ss2[i]='';
  clear();
  i=0;
alert("Строка: "+str+"\nМассив числел: "+ss1+"\nМассив дейсивий: "+ss2+"\n");
}}


//--------------------------------------
for(i=0;i<ss2.length;i++){
 if(ss2[i]=="*"){
  ss1[i]=ss1[i]*ss1[i+1];
  ss1[i+1]='';
  ss2[i]='';
  clear();
  i=0;
alert("Строка: "+str+"\nМассив числел: "+ss1+"\nМассив дейсивий: "+ss2+"\n");
}}
for(i=0;i<ss2.length;i++){
 if(ss2[i]=="*"){
  ss1[i]=ss1[i]*ss1[i+1];
  ss1[i+1]='';
  ss2[i]='';
  clear();
  i=0;
alert("Строка: "+str+"\nМассив числел: "+ss1+"\nМассив дейсивий: "+ss2+"\n");
}}
document.getElementsByTagName("body")[0].innerHTML=document.getElementsByTagName("body")[0].innerHTML+"Строка: "+str+"<br>Массив числел: "+ss1+"<br>Массив дейсивий: "+ss2+"<br>";
</script>
</body>
</html>

это калькулятор (часть кода убрал, оставил * и /), смысл в том, что он разбирает готовую строку (str) на подстроки чисел и действий, и считает. проблема при .../3*6... при этом всплывают погрешности, пытался убрать округлив, не получилось, конечно лучше сначала умножать, потом делить, но это намного сложнее, так как скрипт умножает соседние числа и получится .../18... что делать? как убрать погрешности?
пс. циклы дважды поставил, потому, что последнее действие не выполнялось, долго искал ошибку, не нашёл и оставил так покашто.

Последний раз редактировалось qwertyuiop10, 30.09.2011 в 00:07.
Ответить с цитированием
  #2 (permalink)  
Старый 30.09.2011, 01:14
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

А обязательно так страшно реализовывать? Если очень хочется парсить строку, можешь посмотреть, как это делается здесь. Но, по-моему, проще сделать так:
function evaluate(expression){
  try {
    return + Function( "return " + expression )();
  } catch(error) {
    return NaN;
  };
};

alert( evaluate( "5*8/3*6/10" ) );
Ответить с цитированием
  #3 (permalink)  
Старый 30.09.2011, 01:44
Аспирант
Отправить личное сообщение для qwertyuiop10 Посмотреть профиль Найти все сообщения от qwertyuiop10
 
Регистрация: 29.09.2011
Сообщений: 42

Sweet,
да, парсить обязательно, по твоей ссылке прошел, но не понял ничего, завтра буду думать. ещё небольшой вопрос: как в .replace() закинуть в порвое значение элем. массива? что-то вроде .replace(bb[8],"blabla")?
Ответить с цитированием
  #4 (permalink)  
Старый 30.09.2011, 11:34
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от qwertyuiop10
да, парсить обязательно, по твоей ссылке прошел, но не понял ничего
Обязательно разбери материал по ссылке и пойми его.
Сообщение от qwertyuiop10
что-то вроде .replace(bb[8],"blabla")?
Такой код является рабочим.
Ответить с цитированием
  #5 (permalink)  
Старый 30.09.2011, 14:34
Аспирант
Отправить личное сообщение для qwertyuiop10 Посмотреть профиль Найти все сообщения от qwertyuiop10
 
Регистрация: 29.09.2011
Сообщений: 42

Sweet,
нет нужен глоб. поиск, вроде /bb[1]/g чтобы произошла замена всех найденных bb[1].

Последний раз редактировалось qwertyuiop10, 30.09.2011 в 15:31.
Ответить с цитированием
  #6 (permalink)  
Старый 02.10.2011, 23:08
Аспирант
Отправить личное сообщение для qwertyuiop10 Посмотреть профиль Найти все сообщения от qwertyuiop10
 
Регистрация: 29.09.2011
Сообщений: 42

x=RegExp(bb[i],"g");
y=y.replace(x,"bebe");
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скрипт калькулятора, не работает. mypaku Общие вопросы Javascript 17 09.02.2010 23:15
Хочу скрипт! (скрипт калькулятора на сайт) Georgiy Общие вопросы Javascript 6 28.01.2010 15:09
Скрипт калькулятора (не могу добавить еще одно значение) Jee_Day Я не знаю javascript 2 22.05.2009 13:19
Скрипт калькулятора ЕМС-почты России battrack Ваши сайты и скрипты 2 03.03.2009 20:20
скрипт калькулятора krIvo jQuery 0 25.09.2008 18:44