Loading...
dmdbrv avatar dmdbrv 17 Точки

Enigmanation - задача от бгкодер

Здравейте, колеги

При подготовката си за изпита попаднах на задача от бгкодер с име Enigmanation (условието тук: цък) (която е давана преди година-две на изпит в телерик) и отделих скромните 6 часа + за да я реша, но за съжаление не успях.

С две думи логиката е следната: програмата отделя всеки знак или число като елемент на масив, а при наличие на скоби ги преобразува, така че да върнат стойността вътре в скобите. По този начин: "1*2+3*(4+5*6)=" създава масив от стрингове: {"1", "*", "2", "+", "3", "*", "34", "="}. При наличие на - или + действието се извършва накрая, затова всичко преди и след +ът или -ът става отделен елемент и накрая според знака се извършва необходимото действие.

Проблемът е, че при въвеждане на скоби ако след скобите има други числа/знаци програмата гърми. Тоест: "1*2+3*(4+5*6)=" работи коректно, но "3*(4+5*6)+1*2=" - гърми. Не знам дори дали е нещо малко или цялата ми логика е грешна.

Ето линк към кода, бая дългичък е, но ако се намери някой добър самарянин да помогне съм склонен да го черпя една бира innocentцък.

Тагове:
3
Programming Basics
Ventsislav avatar Ventsislav 343 Точки

Вече има отворена тема : 50++ примерни задачи и техните решения за изпита C# входно ниво . И на мене ми е интересно за решението на тази задача , трябва да порошив в нета , 100 % има решения .

Ето решение , ще го добавя и в другата тема , предлагам ти да я прегледаш има доста решения на примерни задачи wink

1
dmdbrv avatar dmdbrv 17 Точки
Видях я тази тема, но там нямаше Enigmanation и затова реших да отворя нов въпрос. А иначе мерси за примерното решение, ама аз исках да разбера моята грешка къде е. Някак си не мога да захвърля толкова мъки на вятъра, пък и логиката ми изглежда както трябва и не би трябвало да гърми така :(
1
iliev72 avatar iliev72 147 Точки

Излишно си усложнил нещата с тези методи !

Ще ти кажа каква идеята в авторското решение и да видиш пропуските в твоето.

Не виждам смисъл при теб да превъщаш един масив от chars в масив от strings.

В авторското решение се чете с readkey , а не readline.

Ако четеш с readline трябва да обиколиш целият стринг докато стигнеш до "=".

Завърта се един цикъл While(True) докато прочетана стойност стане "=" и се излиза от цикъла.И се печати резултата.

И така всеки прочетен символ се обработва. Има два начина да разбереш дали операция , скоби или операция.

Char - '0' ти дава число ако char e число или char.isdigit - ти си избери кое да ползваш.

Обработваш символите по реда който са докато стигнеш до скоби - отваряща.

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

След като я откриеш резултата от скобите , оператор и резултата преди скобите.

Надявам се да съм ти било полезен

1
dmdbrv avatar dmdbrv 17 Точки

Аз си мислех че няма как да стане без методи (и рекурсия даже), тъй като скобите се смятат отделно,  но пък от друга страна не може да има nested brackets, така че да- има логика. Моята логика, специално, изисква методи и не знам как ще стане без тях.

А аз правя масив от стрингове, защото ако евентуално резултатът в скобите е равен на двуцифрено число или число с десетична запетая (тоест да съдържа повече от 1 символ) - трябва да изпрати цялото число към главния масив от елементи, а не само първата цифра. 

За readKey изобщо не ми е минавало през главата, ама е хитро.

И още нещо не мога да разбера - ако има "+" или "-" би трябвало да извърши всички други действия и накрая да събере/извади. Затова аз разделям всичко на части - преди всеки "+", "-" или "=" ни е една част. Първо смятам в частите, накрая извършвам действията между отделните части. А при това решение, което ти ми обясни не виждам къде съобразяват това.

0
Samuil.Petrow avatar Samuil.Petrow 1550 Точки

Всичко необходимо за решаване на задачата по читавия начин - видео. 

1
iliev72 avatar iliev72 147 Точки

Това вече е C# част 2 wink

0
Samuil.Petrow avatar Samuil.Petrow 1550 Точки

Ако се ограничаваш само до материала от текущия курс не е добре. ;) Задачата беше извънредно сложна за нашия изпит и дадоха скалиране на точките само заради нея. Най-вярно и лесно се решава със стек. 

1
iliev72 avatar iliev72 147 Точки

Не се ограничавам wink

Дори това е като бонус към курса smile

Има и по-лесно решение и съм го обяснил !

Има го в форума на Телерик wink

0
Tr00peR avatar Tr00peR 566 Точки

Ако някой се интересува ето как я реших първия път като я видях (преди около 2 месеца, когато правих и първите си стъпки в програмирането), и ми се стори доста лесна.

http://dotnetfiddle.net/WRltxR

 

Изкарва 100/100 в бгкодер, но сега като я поогледах пак и се сещам, че няма да смята коректно приоритета на операциите, а ги взима подред (например ако имаме 2+2*3, ще сметне 4*3, а не 2+6), но изглежда в кодера няма такива тестове.

 

Моля ако някой види и друг проблем да сподели, защото мисля да си я пооправя тия дни. :)

2
HPetrov avatar HPetrov 822 Точки

Тя по условие така трябва да се смята подред :)

0
dmdbrv avatar dmdbrv 17 Точки

Трябва да смята подред ли? Прочетох поне 5 пъти условието и чак сега го разбирам. Още повече съм си усложнил задачата явно.

0
Tr00peR avatar Tr00peR 566 Точки

Да и аз сега видях - то всъщност никъде не е написано, а трябва да се загледаш в примера

0
dmdbrv avatar dmdbrv 17 Точки

Помъдрял от глупостите, които писах вчера във visual studio-то я направих тая задача наново, пак с мойта си логика, ама без методи и ми изкара 100/100 от първия път. Слава на листовете и while цикъла, да са живи и здрави.

Ето го и кода: http://pastebin.com/VN4vbxM9

Оказа се че грешката била, че декларирам променливи вътре в цикъл, демек следното:
for (int i=0; i< 43234324; i++)

{

int p = 4543;

}

-> така когато извърти цикъла повече от веднъж и гърми. Глупава грешка, ама 2 дни изгубих заради нея. 

Мерси на всички, които помогнаха с примерни решения и идеи! :)

1
RFilipov avatar RFilipov 136 Точки

Това е моето решение само със знания от Basic нивото (като изключим Regex, но това може да се замени с "||").

http://pastebin.com/87sUASAi

Това е една от не-тривиалните задачи, които съм решавал и не е лошо да разгледат условието и да се помъчат да я решат тези които ще сядат за 500.

0
01/07/2015 20:43:36
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.