Софтуерно Инженерство
Loading...
+ Нов въпрос
antonp1p2 avatar antonp1p2 17 Точки

Homework { Javascript Syntax [Problem05] } - Някой реши ли я ?

Някой реши ли я тази ? Аз почти я измислих, но нещо забих и мисля да се откажа. Някой ще пусне ли тук решение, за да видя все пак как се решава.

Ето какво измислих до тук - http://pastebin.com/TKqKcAD4

Логиката във фор-а ми не е много вярна. Идеята ми е да стигна до масив който да има в себе си полученото от разделените и умножените числа + числата, които само се събират и вадят  и до масива за знаци само с + и - .

Тагове:
0
Advanced Level: Front-End 13/01/2016 03:39:30
moholovka avatar moholovka 168 Точки

Колега, има готова функциа в JavaScript - 'var result = eval(expression);'

Може би е добре само да се премахнат празните пространства ако има такива.

 

Другият начин за който се сещам е с опашка и стек, видях го и го писах в курса по алгоритми, ама мисля че целта на задачата е друга.

3
13/01/2016 08:55:47
antonp1p2 avatar antonp1p2 17 Точки

Axa... въобще не бях помислил за готова функция. Мислех че целта на задачата е сами да направим логиката за смятането на израза.

0
vladopanov avatar vladopanov 21 Точки

Привет, колега,

Тук можеш да видиш решението без готовата функция eval:

https://github.com/vladopanov/CalculateExpression/

Иначе резултатът от примера в самото условие на задачата според мен е грешен. На калкулатор ми дава друго чисо.

1
13/01/2016 20:59:56
PetyaAngelova avatar PetyaAngelova 5 Точки

vladopanov, твоето решение не приоритизира умножение и деление. 2+5+8/3=5 ;3+7*2-3=17.

Stanimir.B, не тръгва при мен кода, опитах с хром и с мозила.

Резултатът в примера е абсолютно верен, първо трябва да се смятат деление и умножение. Мен това ме спря на задачката, а много искам да я довърша. Според мен трябва да разпознава знаците за делене и умножение -> да търси къде са следващите знаци на ляво и дясно, за да отдели числата -> да поставя скоби около числата, които се умножават/делят, за да не се извършват действията по последователността в която са въведени.

 

Допълвам и нещо друго- употребата на eval май не е особено препоръчителна.

0
14/01/2016 00:33:13
PetyaAngelova avatar PetyaAngelova 5 Точки

antonp1p2, би ли обяснил какво се случва, че нещо се загубих- защо .split(/[+,\-,*,\/]+/); има толкова много разделителя? Не би ли трябвало да има само един разделител?

От твоята логика ми хрумва следното- търсят се знаците умножение, деление и заобикалящите ги числа се отделят отделни стрингове и се отрязват от първоначалния, като се заделят и знака + или - пред числото, което стои непосредстсвено пред * или /. Стрингът с останали + и - само се превръща в числени стойности и знаци (някак ;-) ) , както и този с умножение/деление и се смятат, след което се събират/изваждат.

0
antonp1p2 avatar antonp1p2 17 Точки

Ами моята логика е малко странна, но все пак мисля че има начин да се реши с нея. Моята идея е да изкарам в отделен масив числата и в отделен масив знаците ( затова има толкова разделители, за да разделям числата по знаците).

Дължината на масива със знаците винаги ще е с 1 по-малко от дължината на този с числата.

Обхождам знаците и записвам в нов масив само знаците + и - в същия ред, в който са си.

Обхождам и записвам в нов масив с числа тези числа, които пред тях и зад тях има + и - ( или няма нищо отпред за първото и че няма нищо отзад за последното).

Там където има * или / извършвам действието на съответното число и на това зад него и получения резултат записвам в новия масив за числа.

Накрая само събирам и изваждам. Не знам дали ме разбра малко ми е странна логиката, както ти казах. Бях се отказал да я решавам, но сега ще пробвам пак ако успея ще я постна.  И аз мисля че не трябва да ползваме eval()

0
PetyaAngelova avatar PetyaAngelova 5 Точки

Разбрах  какво имаш предвид.

Може ли да потвърдиш правилно ли разчитам разделителите ти за сплита:

1. /[ .... ]+/   се поставя, за да се изплозва който и да е от символите вътре за разделител

2. * няма нужда да се ескейпва, когато е между [ ]

3. за + същото ли се отнася?

 

0
antonp1p2 avatar antonp1p2 17 Точки

Да с "/"  ескейвам. А за + и * по-добре прочети в нета точно каква функция имат тъй като и аз не съм много наясно с тия регекси и не мога да се наема да ги обеснявам.
 

Иначе имам почти работещо решение виж най-долу го постнах. Колкото и да се мъчих обаче пак не работи на 100% :(

0
Mironov avatar Mironov 4 Точки

Колеги, пробвайте по този начин

expression = expression.replace(/[^0-9\-+*/()%|&^><!~]/g, ''); - маха всичко различно от необходимото ни
document.getElementById('result').innerHTML = eval(expression); - изпълнява го и го слага в HTML-a

Работи и смята правилно (поне от 2-3 теста ми се получи ок)

0
boyanst avatar boyanst 28 Точки

Здравейте, ето го е моето решение на задачата Problem.05 

Като цяло първо проверявам дали я има сътветната операция (checkForDivition....) и после я звършвам (calculateDivition...). Регексите хващат: число(отрицателно/положително) - знака на опрацията - число(отрицателно/положително) . Стана дълго решението, но това засега.

0
14/01/2016 16:16:54
antonp1p2 avatar antonp1p2 17 Точки

Ето го и моето решение.  - http://pastebin.com/v9796CCX

 

Не работи напълно и дава недоизчислен израз при наличието на 4 или повече знака за умножение или за деление един след друг... Например израза 1*1*1*2*13 = 1 * 26 ... не знам защо. Проверих две домашни с решена тази задача без вградената функция и при тях подобен тип изрази не се изчислява до край. При boqnst също този израз не ми го смята до край... не мога да разбера какво точно бъркаме обаче не смята перфектно.

1
PetyaAngelova avatar PetyaAngelova 5 Точки

Използвах твоята идея за масивите и ето до къде стигнах: http://pastebin.com/PfDtnBGR

Смята и повече умножени числа едно след друго.

Взима входящия стринг и го разделя на два масива- единият А съдържа елементите на стринга между знаците + и -, а другият масив Б съдържа + и -.

След това взима А и отново разделя на масиви- числа и знаци *  /

Изчислява произведението на елементите, след което го поставя на мястото на съответния елемент в масив А. Прави изчисленията и за масив А.

п.с.Оправен е проблемът с умножение на двуцифрени.

Забележка- при въвеждане примерно 5*8/4*6 приема, че искате да разделите (5*8)/4, а не (5*8)/(4*6). За другият случай трябва да се направи още една вложена проверка за деление.

 

1
15/01/2016 11:46:02
quickben avatar quickben 976 Точки

Колеги сигурен съм че са ви казали да НЕ използвате eval, даже има един "лаф" -> eval is evil, гледам, че имате колеги които са решили задачата без eval, това е правилния начин. - това не съм го измислил аз, а така наречените js гурута ;)

Почти съм сигурен, че идеята зад това домашно е това да се разбере по-трудния начин :)

2
14/01/2016 18:29:21
moholovka avatar moholovka 168 Точки

Казаха ни на последната лекция, а домашното е от три лекции напред :) 

 

https://en.wikipedia.org/wiki/Shunting-yard_algorithm това е алгоритъм за решаване на аритметични задачи на който му се занимава да го имплементира. Има хубави видео клипове в youtube как се прави, но ме съмнява това да е идеята на авторите на задачата :)

1
15/01/2016 01:30:16