Професионална програма
Loading...
+ Нов въпрос
manito_17711 avatar manito_17711 43 Точки

[Useful Info] Evaluate expression

Здравейте,

първата задача от домашното, от втората лекция на курса по Linux е да се напише програма, която да решава уравнение от порядъка на:

f = a + b * c - d / k

Парсването си е гадно, това е ясно, но по-важното са приоритетите на операторите - умножение, деление, изваждане.. !

След известно ровене из интернет се натъкнах на нещо наречено Shunting-yard algorithm и Reverse Polish notation (RPN).

Също така, след 4-5 часа нагласяне стигнах до този резултат:

За момента решава само уравнения с операторите +, -, * и / като спазва приоритета на оператора. Следва да се пробвам да вкарам и скобите и степенуването.. линк към моето решение github

На всеки, на когото му е интересно нека отдели 30 мин да изгледа долните клипове..

1. https://www.youtube.com/watch?v=QzVVjboyb0s
2. https://www.youtube.com/watch?v=LQ-iW8jm6Mk
3. https://www.youtube.com/watch?v=zMDm2MbRG6w

За мен бе полезно...

Поздрави

Тагове:
5
Linux Курсове
Filkolev avatar Filkolev 4482 Точки

Shunting Yard съм го правил преди време и си беше доста занимавка, затова сега по-скоро ще се спра на нещо по-изпипано: http://en.literateprograms.org/Shunting_yard_algorithm_(C). Нямам никакво желание да преоткривам топлата вода.

Не съм сигурен каква е целта на това домашно. Тази задача е доста сложна. В крайна сметка не ми става много ясно Линукс ли учим или алгоритми и какво в крайна сметка се очаква да научим от курса и да може да правим след като го завършим.

7
manito_17711 avatar manito_17711 43 Точки

Би ли споделил тоето решение.. интересно ми е да видя друг подход, благодаря.

 

Поздрави,

0
RosenKrumov avatar RosenKrumov 203 Точки

И аз не съм сигурен, че това са правилните домашни за целите на този курс. Първото беше горе-долу добре, поне имаше да се прави Makefile, но на второто се чувствам като на курс по алгоритми на С (с изключение на 3-тата задача да кажем). Надявам се на изпита това, което се има предвид под "C task" да е нещо символично, колкото да имаме код, върху който да правим другите неща от курса. Естествено, не на два реда, но не и за 2-3 часа.

4
25/01/2016 13:19:59
g.stoyanov avatar g.stoyanov 776 Точки

Относно типа на задачата - напълно ви подкрепям колеги! Относно решението: правил съм я на друг език - малко хинт за скобите (не съм го имплементирал в това домашно :D) търсите първата затваряща и като стигнете до нея взимате субстринг до нея от последната отваряща и това ви е събекспрешън който решевате и резултата го слагате на мястото на субстринга ;). Другото вече е тривиално!

2
vladiant avatar vladiant 41 Точки

Благодаря за информацията! Тази задача я има и в онлайн книгите “Въведение в програмирането със C#” и “Въведение в програмирането с Java”:

http://www.introprogramming.info/intro-csharp-book/read-online/glava25-prakticheski-zadachi-za-izpit-po-programirane-tema-2/

http://www.introprogramming.info/intro-java-book/read-online/glava24-primerna-tema-ot-izpit-po-programirane-08-04-2006/

Тук основната трудност изглежда е парсването на числа и оператори, както и имплементацията на стек и опашка. Това си е немалко писане, а на C++/C#/Java са няколко реда, както подобава на езици от високо ниво.

0
vladiant avatar vladiant 41 Точки

Също така смятам, че информацията в Wikipepia е достатъчно добра:

https://en.wikipedia.org/wiki/Shunting-yard_algorithm

И за другата половина на задачата:

https://en.wikipedia.org/wiki/Reverse_Polish_notation

където е описанието на нужния Postfix algorithm.

1