Професионална програма
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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.