Loading...

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

daskalov.iv avatar daskalov.iv 17 Точки

Brackets - открий грешката

Здравейте.

Това е задачката с вложените скоби { [ ( ) ] }

Не мога да си открия грешката, въртях условията как ли не, нещо ми убягва.

Ще помоля за малко съдействие.

Ето го кода: 

https://pastebin.com/nH8guhH7

 

Тагове:
0
C++ Fundamentals
MartinBG avatar MartinBG 4803 Точки
Best Answer

При бърз пеглед на решението по зададеното условие, виждам няколко проблема:

1. Функцията brackets може да не отпечата нищо в доста от сценариите, заради използването на retrun в switch-a (функцията прекъсва, без да стигне до частта в края, която печата резултата). Отделно е много лоша практика една функция да се занимава с повече от едно нещо. В този случай, освен за валидация на израза, тя е натоварена и с отпечатване на резултата. По-правилно е типа на функцията да бъде променен от void на bool, който да се използва в main за отпечатване на резултата.

2. Логиката за валидация на израза ще връща грешни резултати за изрази като {[]}, които са напълно валидни по условие, но не и според тази проверка: 

if( square <= 0 || round > 0 || curly > 0) return;

В горният пример, когато проверката стигне до 3-тата скоба (]) ще имаме square == 1, round == 0, но curly == 1, което логиката на програмата третира като грешка.

Аналогично ще фейлне и за изрази като [()], {[()]}, [[()]] и т.н., но в други проверки.

3. Решението с броячи за типовете скоби не е подходящо за решаване на тази задача, защото - както демонстрирах с примера по-горе, не се пази информация за последователността, в която се появяват тези скоби.

Класическото решение на този тип задача е с използването на стек, като в тази тема съм качил едно примерно решение, което може да се адаптира към тази задача (трябва да се добави проверката за правилна йерархия на типовете скоби).

 

Упех!

0
06/01/2018 13:51:42
MartinBG avatar MartinBG 4803 Точки

А условието какво е?

0
daskalov.iv avatar daskalov.iv 17 Точки

Write a program which reads a single line from the console, containing brackets for a mathematical expression (only
the brackets will appear in the input), and determines whether the brackets in the expression are correct. There are
3 types of brackets – {}, [] and (). {} can contain {}, [] and () brackets. Square brackets [] can contain [] and
() brackets. Curved () brackets can contain only () brackets. Said simply, each type of brackets can contain the
same type of brackets inside, or a “lower” type of brackets (() is lower than [] which is lower than {}). If a bracket
of one type is opened, it needs to be closed before a bracket of another type is closed.

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