13.2. Комбиновање гранања и петље¶
Наизменично смењивање облика и боја¶
У многим ситуацијама су цртежи такви да се наизменично смењују два правила на основу којих се црта. На пример, ако желимо да нацртамо „црта-тачка“ линију, тада у непарним корацима цртамо црте, а у парним тачке. Размотримо неколико примера цртежа у којима се јавља овај облик правилности и прикажимо неке могућности да се такви цртежи нацртају.
Жуто-зелени квадрати¶
Напиши програм који ширину прозора попуњава помоћу 10 квадратића, пет жутих и пет зелених, који се наизменично ређају почевши од жутог.
Пошто знамо укупан број квадрата и ширину целог прозора дуж којег су
они распоређени, ширину једног квадрата можемо једноставно израчунати
дељењем укупне ширине бројем квадрата. Квадрате цртамо у петљи. Ако
вредност бројачке променљиве почиње од 0, тада се координата \(x\) левог
горњег темена i-тог квадрата може добити множењем ширине квадрата
бројем \(i\) (заиста, ако је ширина квадрата \(a\), тада квадрати
редом почињу на координатама \(0, a, 2 a, \ldots, (n-1)\cdot
a\). Координата \(y\) горњег левог темена сваког квадрата се добија
одузимањем половине висине квадрата од половине висине прозора. На тај начин се
центри квадрата налазе на средини висине прозора. На крају, боју квадрата
можемо одредити у зависности од парности редног броја квадрата који се
црта. Када је бројач у петљи i
паран (када му је вредност 0, 2, 4,
6 или 8, што можемо израчунати поређењем остатка при дељењу i % 2
са нулом), тада квадрат бојимо у жуто, а када је непаран (када му је
вредност 1, 3, 5, 7 или 9), тада квадрат бојимо у зелено.
Још један начин да се наизменично мењају боје је да се уведе логичка
променљива којом се означава да ли цртамо жути квадрат. У почетку је
постављамо на вредност тачно, у сваком кораку петље јој мењамо
истинитосну вредност (тако што је негирамо оператором not
), а у
телу петље боју одређујемо на основу те вредности, гранањем.
Приметимо да смо наредбом гранања (наредби if-else) само поставили боју, а да смо сâм квадрат цртали независно, након гранања. Наиме, да смо у наредби гранања цртали квадрат, непотребно бисмо понављали кôд и тиме начинили програм тежим за одржавање.
Могуће је још једно, суштински другачије решење овог задатка, које се
не заснива на гранању, већ на листи у којој се памте боје које се
циклично смењују. Редни број квадрата је одређен бројачком променљивом
i
, која редом узима вредности 0, 1, 2, 3, 4, … Са друге стране
позиција боје у листи редом треба да узима вредности 0, 1, 0, 1, 0,
… Можемо приметити да се та позиција може добити од вредности i
тако што се израчуна остатак при дељењу са 2. Ово се лако може
уопштити и на више од две боје. Када би се наизменично смењивале 3
боје, тада би позиције требало да узимају вредности 0, 1, 2, 0, 1, 2,
… и добијале би се израчунавањем остатка при дељењу са 3. У општем
случају, потребно је израчунати остатак при дељењу дужином листе. На
основу ове дискусије покушај да допуниш наредни кôд:
Патент затварач¶
Напиши програм који исцртава шару која подсећа на патент-затварач (рајсфершлус, цибзар).
Покушај и овај задатак да решиш коришћењем листе, без гранања (овај пут ћеш у листу сместити две позиције почетка линије).