Угнежђено гранање¶
Угнежђено гранање је уметање if наредби у друге if наредбе. У неким задацима до решења се најлакше долази управо помоћу угнежђених наредби гранања.
Пример - адреса:
Један булевар је пресечен са три велике попречне улице, које зграде дуж булевара раздвајају на по четири блока са сваке стране.
На левој страни булевара су редом блокови A, B, C и D, који садрже редом непарне бројеве од 1 до 73, од 75 до 129, од 131 до 225 и од 227 до 299.
На десној страни булевара су редом блокови E, F, G и H, који садрже редом парне бројеве од 2 до 58, од 60 до 144, од 146 до 216 и од 218 до 280.
Написати програм који учитава кућни број једне зграде у том булевару, а исписује слово које означава блок у коме се та зграда налази.
Намеће се решење у коме главна if наредба раздваја парне од непарних бројева, а онда се у свакој од грана надовезаним (вишеструким) if наредбама утврђује блок на одређеној страни булевара, коме припада учитани број.
Пошто наредба if може да се пише са или без else гране, потребно је разјаснити шта значи (како се извршава) следећи запис:
if (n % 2 == 0)
if (n > 10) Console.WriteLine("A");
else Console.WriteLine("B");
У оваквим случајевима реч else чини пар са најближом претходном речи if. Овде конкретно, биће исписано „A” ако је n паран број већи од 10, а „B” ако је n паран број мањи или једнак 10. Ако је n непаран број, неће бити исписано ништа. Правило о начину упаривања речи if и else се може истаћи добрим увлачењем (индентацијом) линија кода:
if (n % 2 == 0)
if (n > 10) Console.WriteLine("A");
else Console.WriteLine("B");
Уколико желимо да „A” буде исписано за парне бројеве веће од 10, а „B” за непарне бројеве, треба писати
if (n % 2 == 0)
{
if (n > 10) Console.WriteLine("A");
}
else Console.WriteLine("B");
О дубини гранања¶
Дубока гранања у програму могу да буду непрегледна и тешка за праћење, па при уметању наредби гранања треба бити умерен. Већу дубину гранања треба избегавати када постоји елегантније и јасније решење.
Врло сложена гранања могу да се избегну на разне начине. Најопштији начини су реорганизација програма тако да се користе само надовезане (вишеструке) if наредбе, употреба сложенијих логичких услова, или смањење дубине гранања употребом функција (види поглавље „Статички методи”).
У специфичним ситуацијама могу да се употребе специфичне идеје да би се ниво гранања „држао под контролом”. Понекад се број случајева које разматрамо знатно смањује ако најпре на погодан начин уредимо улазне велчине. Такође, у геометријским проблемима се број случајева може значајно смањити употребом симетрија (види задатке Оријентација троугла, Прозор и кутија и Једнакокраки од 4 дужи на крају поглавља о гранању).
Пример - мали црвени попуњен круг:
Замишљени објекат може да буде мали или велики, црвени или плави, попуњен или празан, круг или квадрат (ове могућности се комбинују свака са сваком, тако да их има укупно шеснаест). Написати програм који поставља питања да ли је тај објекат мали, да ли је црвени, да ли је попуњен и да ли је круг, прихвата одговоре у облику стринга (одговор d значи да, сваки други одговор значи не) и исписује четири речи које описују објекат.
На пример, ако су одговори d, n, n, d, програм треба да испише mali plavi prazan krug.
Овај задатак може да се реши угнежђеним наредбама гранања:
Овакво решење није сасвим једноставно за праћење (ово није неки екстреман пример - има и много горих, али је довољан да се разуме о чему је реч). У овом конкретном задатку могуће је написати знатно елегантније решење:
У задацима који следе после квиза, можете да вежбате употребу уметнутих наредби гранања у програму.
Настојте да вам програми не буду сложенији него што морају да буду.