Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 01.03.2013, 19:05
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

rgl, как бы не принято писать 1 перед неизвестными. Также о нулевых коэффициентах нужно позаботиться.

Но, естественно, вопрос не к Вам, а к ТС.
Ответить с цитированием
  #12 (permalink)  
Старый 01.03.2013, 19:07
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

function toPlusStr( n )
{
  n += "";
  return n.charAt(0) == "-" ? n : "+" + n;
}

var a=1, b=-2, m=-3;

alert("Уравнения прямой: " + a + "*x" + toPlusStr(b) + "*y" + toPlusStr(m) + "=0");
Ответить с цитированием
  #13 (permalink)  
Старый 01.03.2013, 19:09
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

rgl, не понял, чем отличается результат от предыдущего?
Ответить с цитированием
  #14 (permalink)  
Старый 01.03.2013, 19:15
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Сообщение от Demath Посмотреть сообщение
как бы не принято писать 1 перед неизвестными. Также о нулевых коэффициентах нужно позаботиться.
Если "вылизывать" код, то в полученном варианте новичку сложнее будет найти ответ на свой вопрос (а не новичок такого вопроса бы не задал).
Ответить с цитированием
  #15 (permalink)  
Старый 01.03.2013, 19:16
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Сообщение от Demath Посмотреть сообщение
rgl, не понял, чем отличается результат от предыдущего?
Тем, что строчка "Уравнения прямой: " не обрабатывается понапрасну регэкспом.
Ответить с цитированием
  #16 (permalink)  
Старый 01.03.2013, 19:19
Новичок на форуме
Отправить личное сообщение для LLIyRiK911 Посмотреть профиль Найти все сообщения от LLIyRiK911
 
Регистрация: 01.03.2013
Сообщений: 5

Сообщение от rgl Посмотреть сообщение
Или даже
var a=1, b=-2, m=-3;
alert( "Уравнения прямой: " + a + ("*x+" + b + "*y+" + m + "=0").replace( /\+-/g, '-' ) );
Спасибо
Ответить с цитированием
  #17 (permalink)  
Старый 01.03.2013, 19:38
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Сообщение от rgl
Тем, что строчка "Уравнения прямой: " не обрабатывается понапрасну регэкспом.
Теперь понял.

Сообщение от rgl
Если "вылизывать" код, то в полученном варианте новичку сложнее будет найти ответ на свой вопрос (а не новичок такого вопроса бы не задал).
Просто я делал очень похожее для своих нужд. Поэтому спросил.

Нужна была функция для упрощения (преобразования к привычному виду) уравнений любого порядка.
Получилось так:

<script type="text/javascript">
function simplifyEq(an,xn)
{  var axn = [], sign;

   xn[an.length-1] = '';

  for (i=0; i<an.length; i++)
        { if (an[i]<0) {sign = ''}
          else         {sign = '+'}
          
          if (an[i]==-1)     {axn[i]='-'+xn[i]; axn[an.length-1]='-1'}
          else if (an[i]==0) {axn[i]=''}
          else if (an[i]==1) {axn[i]='+'+xn[i]; axn[an.length-1]='+1'}
          else               {axn[i]=sign+an[i]+xn[i]}  
        }

  var newEq = axn.join('');

  if (/\+/.test(newEq.charAt(0)))         //Если перед самым 1-м коэф. будет '+', то удаляем этот '+'
     { newEq = newEq.replace(/\+/,'') }

  if (/-/.test(newEq.charAt(0)))              
     { newEq = newEq.replace(/-/,'').replace(/(-|\+)/g,'$1+').replace(/-\+/g,'+').replace(/\+\+/g,'-') }
                                          //Если перед самым 1-м коэф. будет '-', то удаляем этот '-'
                                          //и изменяем остальные знаки на противоположные

  return newEq+'=0';
}
</script>
<button onclick="alert( '-2x^2+1y^2-1xy+0x+5y-4=0\n<=>\n'
                        + simplifyEq([-2,1,-1,0,5,-4],['x^2','y^2','xy','x','y'])
                       )">
Преобразовать <b>-2x^2+1y^2-1xy+0x+5y-4=0</b> к привычному виду</button>

Последний раз редактировалось Demath, 01.03.2013 в 19:45.
Ответить с цитированием
  #18 (permalink)  
Старый 02.03.2013, 19:14
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Demath,
Почитал. Зачем нужны зачеркнутые части?

if (an[i]==-1) {axn[i]='-'+xn[i]; axn[an.length-1]='-1'}
else if (an[i]==0) {axn[i]=''}
else if (an[i]==1) {axn[i]='+'+xn[i]; axn[an.length-1]='+1'}
else {axn[i]=sign+an[i]+xn[i]}


Зачем проверять и заменять регэкспом в таком простом случае?
if (/\+/.test(newEq.charAt(0))) //Если перед самым 1-м коэф. будет '+', то удаляем этот '+'
{ newEq = newEq.replace(/\+/,'') }

Почему не:
if ( newEq.charAt(0) == '+' ) newEq = newEq.slice(1)



if (/-/.test(newEq.charAt(0)))
{ newEq = newEq.replace(/-/,'').replace(/(-|\+)/g,'$1+').replace(/-\+/g,'+').replace(/\+\+/g,'-') }
//Если перед самым 1-м коэф. будет '-', то удаляем этот '-'
//и изменяем остальные знаки на противоположные

Аналогично первый минус можно удалить слайсом, а остальные знаки инвертировать одним вызовом replace, которому передать функцию, возвращающую плюс или минус в зависимости от...
Ответить с цитированием
  #19 (permalink)  
Старый 02.03.2013, 19:53
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Сообщение от rgl
Почитал. Зачем нужны зачеркнутые части?

if (an[i]==-1) {axn[i]='-'+xn[i]; axn[an.length-1]='-1'}
else if (an[i]==0) {axn[i]=''}
else if (an[i]==1) {axn[i]='+'+xn[i]; axn[an.length-1]='+1'}
else {axn[i]=sign+an[i]+xn[i]}
Это для свободного члена уравнения. Так как он не имеет неизвестной, то и обрабатываю его отдельно.
Мне показалось, что так проще всего его учесть.

Сообщение от rgl
Зачем проверять и заменять регэкспом в таком простом случае?
if (/\+/.test(newEq.charAt(0))) //Если перед самым 1-м коэф. будет '+', то удаляем этот '+'
{ newEq = newEq.replace(/\+/,'') }

Почему не:
if ( newEq.charAt(0) == '+' ) newEq = newEq.slice(1)
Мало знаний и опыта работы с готовыми методами, поэтому так получается.


Сообщение от rgl
Аналогично первый минус можно удалить слайсом, а остальные знаки инвертировать одним вызовом replace, которому передать функцию, возвращающую плюс или минус в зависимости от...
Спасибо, понял!


P.S. А где почитать продвинутое использование циклов в JavaScript?
То есть интересуют "чистые" алгоритмы с минимальным использованием готовых методов.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод переменных MasterHrust Javascript под браузер 4 03.08.2011 15:41
Вывод данных в Друпал 6 из MySQL, небольшая работа torquemada Работа 1 22.05.2011 17:05
Вывод данных из mysql Евген AJAX и COMET 3 22.08.2010 17:55
число 76.4705882.. сделать 76.47? (числа всегда разные) TongaG Ваши сайты и скрипты 3 19.01.2010 07:35
Пошаговый вывод скрипта для IE всех версий. Zidky Элементы интерфейса 10 17.06.2009 18:27