Loading...
MilushT avatar MilushT 1 Точки

Machine (JA2-Task-3-Machine)

На тази задача получавам грешен отговор в тест 3 и 7. Не мога обаче да видя input-а обаче на тези тестове за да знам къде да си търся грешката. Някаква насока?

Тагове:
0
C++ Fundamentals
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Здравей,

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

Тоест:

- проверяваш всяка една фукнция дали се държи правилно за всякакви данни

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

-- тестваш дали първа и втора функция една след друга се държат правилно, след това първа и трета, първа и четвърта и т.н.

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

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

Вторият ти проблем е интеграцията на функциите, които си написал, в основния цикъл на програмата ти. И по-конкретно не на самите функции, а на начина, по който решаваш коя функция да викаш. Помисли колко операции искаш да обработиш за всяка итерация на цикъла. Логично е, и предполагам това си искал да постигнеш - за всяка итерация да обработваш по една команда, нали? Защото ако се замислиш за условията, които си написал, не винаги ще обработваш по една команда.

Пробвай да помислиш върху тези насоки и питай отново ако нещо не ти е ясно - но се постарай добре да изпробваш нещата, които споменах.

Поздрави,

Жоро

P.S.: Нещо друго - имаш малко излишно усложнение в програмата. Има ли смисъл всеки път да добавяш самата команда в стека, след като веднага ще я извадиш след това (да не говорим че заради това си принуждаваш функциите да правят един повече pop(), отколкото името им казва, че правят, което означава, че тези функции не са независими от останалата част от програмата ти). В момента повечето неща в стека ще са числа, и от време на време ще имаш команди вътре, които веднага вадиш - не е ли по-лесно да имаш само числа в този стек (и стека да е от int, не от string дето трябва постоянно да преобразуваш), а командите така или иначе си ги имаш в string-а който четеш? Това е донякъде свързано и с първия, и с втория проблем, които казах, че имаш - може би ако беше ползвал стек от интове единия от двата (а може би и двата) проблема нямаше да ги имаш. Не съм сигурен, защото не съм пробвал такива промени, но най-вероятно ако ги направиш поне единия от двата проблема ще ти се махне (за втория проблем - дори да се махне, така както стои кодът в основния ти цикъл е подвеждащ и най-вероятно е добре да го оправиш така или иначе).

0
MilushT avatar MilushT 1 Точки

Здравей,

Много благодаря за детайлния отговор. Схванах, че concat на 0 и 1 е 1, а не 01 и го оправих. Това ми оправи грешката в 7 тест. Схванах коментара ти за функциите и махнах излишните операции - т.е. входната команда не я вкарвам в стека, а просто я чета и вкарвам само числата, махнах и излишното изтриване в самите функции. Оправих if-овете на else if-ове за да не влиза във всеки if и оправих concat функцията да не търси string "0", а stoi от string =0. Това ми оправи грешката в тест 3, ама изобщо не мога да си обясня защо.

Сега по-интересната част за стека от int-ове. Това много бих искал да знам как може да стане. Проблема ми е че при смесен вход - команда и цифри, ако задам входа да бъде int не мога да намеря начин, когато се вкара команда примерно "sum" да го накарам да я разпознае като string  "sum". За стека от int-ове тази команда няма значение - тя не влиза, ама как да се разчете "sum" за да се сметне сумата? Ако вземам входа като string всичко работи ама пак се минава през преобразуване от string към int. Т.е. дори да го вкарвам в стека като int пак трябва да го преобразувам преди това. Да преобразуването ще е по-мако - в основната програма само, като може да се махне от фунциите, ама пак си го има. Може ли да поясниш как може да стане по прицип.

 

Поздрави,

Милуш

 

0
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Здравей отново,

Да, правилно си се ориентирал. Общо взето проблемът с if-else-овете е, че в определени ситуации прочиташ по няколко команди и това ти обърква програмата (не съм сигурен дали е pop() от празен stack, или просто не прочиташ правилно end командата) и не изкарваш изход. Като приключи JA2 ще бъдат публикувани тестовете (и авторските решения) и ще можеш да изтестваш с тестовете, които са ти правили проблеми.

Иначе нямах предвид, че може да се реши без преобразувания. Пак трябват преобразувания, но както си забелязал - те са по-малко. Също така всяка една функция знае със сигурност, че нещата, които получава, са числа. Това намалява отговорността на тези функции и съответно улеснява четенето на кода. Тоест четеш 1 string, гледаш дали съвпада с някоя команда, ако да- правиш съответната операция, ако не - значи е число и го преобразуваш в int и го пъхаш в стека. Така печелиш и памет, защото числата като цяло заемат по-малко памет от string-овете (стига да са повече от 4 цифри - string пази по 1 byte за всеки символ, a int обикновено е 4 bytes).

Поздрави,

Жоро

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