Угнежђене петље¶
У приручнику Увод у програмирање у програмском језику C# погледајте поглавље 4.10 (стране 100-109).
Унутар тела петље може се налазити једна или више других петљи. За такве петље кажемо да су уметнуте или угнежђене. Када имамо две угнежђене петље, често их зовемо спољашња и унутрашња петља, а обе заједно називамо двострука петља. Број петљи које ћемо сместити једну у другу није ограничен и зависи само од наших потреба при решавању конкретног проблема. Тако можемо да пишемо и троструке петље, четвороструке петље, итд. Такође, можемо слободно да комбинујемо све три врсте петљи (for, while и do-while) и њихов међусобни распоред.
Да би било јасније како угнежђене петље раде, погледајмо одмах пример.
Написати програм који исписује ознаке шаховских поља, распоређене као на (шаховској) табли:
A8 B8 C8 D8 E8 F8 G8 H8
A7 B7 C7 D7 E7 F7 G7 H7
A6 B6 C6 D6 E6 F6 G6 H6
A5 B5 C5 D5 E5 F5 G5 H5
A4 B4 C4 D4 E4 F4 G4 H4
A3 B3 C3 D3 E3 F3 G3 H3
A2 B2 C2 D2 E2 F2 G2 H2
A1 B1 C1 D1 E1 F1 G1 H1
У шаху се редови означавају бројевима 1-8 одоздо на горе, а колоне словима A-H слева на десно. Да бисмо исписали ознаку сваког поља, треба свако од слова да се појави са сваким од бројева, а за то нам требају две петље:
Видимо да се у свакој итерацији спољашње петље извршава цела унутрашња петља. При томе број итерација унутрашње петље не мора да буде исти у свакој итерацији спољашње петље (ускоро ћемо видети и такве примере).
Приметите да у унутрашњој петљи не користимо наредбу Console.WriteLine него Console.Write, зато што желимо да курсор остане у истом реду. Тек по завршетку унутрашње петље, којом се исписују ознаке поља једног реда табле, користимо наредбу Console.WriteLine да бисмо прешли у нови ред.
Написати програм који црта квадратну таблу попут шаховске, али величине n, при чему се n задаје. Наизменично се ређају црна и бела поља, а представљена су словом ’X’ и тачком, с тим да је горње лево поље црно. На пример, за n = 8, добија се:
X.X.X.X.
.X.X.X.X
X.X.X.X.
.X.X.X.X
X.X.X.X.
.X.X.X.X
X.X.X.X.
.X.X.X.X
Поново ћемо користити две угнежђене петље, при чему спољња петља броји редове, а унутрашња колоне. Остаје да утврдимо када који знак треба приказати. Посматрањем слике можемо да уочимо да су на црним пољима редни број реда и редни број колоне исте парности, а на белим пољима су различите парности, па то можемо да искористимо као критеријум.
Проверу да ли су два броја исте парности, заменићемо равноправном, али нешто ефикаснијом провером да ли је збир та два броја паран (операција + се извршава нешто брже него %).
У задатку који смо решили, поља су мала и нису квадратног облика, јер висина једног карактера није једнака његовој ширини. Следећи пример донекле отклања овај недостатак.
Преправити претходни програм тако да се свако поље представља блоком истих карактера који се простире у 3 реда и 6 колона. На пример, за таблу величине 6 добија се:
XXXXXX......XXXXXX......XXXXXX......
XXXXXX......XXXXXX......XXXXXX......
XXXXXX......XXXXXX......XXXXXX......
......XXXXXX......XXXXXX......XXXXXX
......XXXXXX......XXXXXX......XXXXXX
......XXXXXX......XXXXXX......XXXXXX
XXXXXX......XXXXXX......XXXXXX......
XXXXXX......XXXXXX......XXXXXX......
XXXXXX......XXXXXX......XXXXXX......
......XXXXXX......XXXXXX......XXXXXX
......XXXXXX......XXXXXX......XXXXXX
......XXXXXX......XXXXXX......XXXXXX
XXXXXX......XXXXXX......XXXXXX......
XXXXXX......XXXXXX......XXXXXX......
XXXXXX......XXXXXX......XXXXXX......
......XXXXXX......XXXXXX......XXXXXX
......XXXXXX......XXXXXX......XXXXXX
......XXXXXX......XXXXXX......XXXXXX
Овде су нам потребне чак 4 угнежђене петље. Прва петља броји редове табле, друга броји редове карактера који представљају један ред табле, трећа броји колоне табле, а четврта карактере у једној колони.
Треба водити рачуна о месту наредбе Console.WriteLine - у нови ред се прелази када се испише један ред карактера, а то је после две унутрашње петље.