01.03.2013, 19:05
|
|
Профессор
|
|
Регистрация: 22.06.2012
Сообщений: 168
|
|
rgl, как бы не принято писать 1 перед неизвестными. Также о нулевых коэффициентах нужно позаботиться.
Но, естественно, вопрос не к Вам, а к ТС.
|
|
01.03.2013, 19:07
|
|
Профессор
|
|
Регистрация: 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");
|
|
01.03.2013, 19:09
|
|
Профессор
|
|
Регистрация: 22.06.2012
Сообщений: 168
|
|
rgl, не понял, чем отличается результат от предыдущего?
|
|
01.03.2013, 19:15
|
|
Профессор
|
|
Регистрация: 28.02.2011
Сообщений: 349
|
|
Сообщение от Demath
|
как бы не принято писать 1 перед неизвестными. Также о нулевых коэффициентах нужно позаботиться.
|
Если "вылизывать" код, то в полученном варианте новичку сложнее будет найти ответ на свой вопрос (а не новичок такого вопроса бы не задал).
|
|
01.03.2013, 19:16
|
|
Профессор
|
|
Регистрация: 28.02.2011
Сообщений: 349
|
|
Сообщение от Demath
|
rgl, не понял, чем отличается результат от предыдущего?
|
Тем, что строчка "Уравнения прямой: " не обрабатывается понапрасну регэкспом.
|
|
01.03.2013, 19:19
|
Новичок на форуме
|
|
Регистрация: 01.03.2013
Сообщений: 5
|
|
Сообщение от rgl
|
Или даже
var a=1, b=-2, m=-3;
alert( "Уравнения прямой: " + a + ("*x+" + b + "*y+" + m + "=0").replace( /\+-/g, '-' ) );
|
Спасибо
|
|
01.03.2013, 19:38
|
|
Профессор
|
|
Регистрация: 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.
|
|
02.03.2013, 19:14
|
|
Профессор
|
|
Регистрация: 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, которому передать функцию, возвращающую плюс или минус в зависимости от...
|
|
02.03.2013, 19:53
|
|
Профессор
|
|
Регистрация: 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?
То есть интересуют "чистые" алгоритмы с минимальным использованием готовых методов.
|
|
|
|