Loading...
joto_to avatar joto_to 40 Точки

Решение на Домашно 06 от Основи на програмирането с Java - декември 2016

Чертане на фигурки с цикли

Дата: 11-ти февруари 2017

Отново ви привтствам да разгледаме решенията на задачите, да споделите вашите решения, да задавате въпроси, да си помагаме.

 

Задача 01 ( Правоъгълник от 10 x 10 звездички )

Решена на лекцията.

Задача 02 ( Правоъгълник от N x N звездички )

Решена на лекцията.

Задача 03 ( Квадрат от звездички )

Решена на лекцията.

Задача 04 ( Триъгълник от долари )

Решена на лекцията.

Задача 05 ( Квадратна рамка )

Различното което правя тук е, че използвам MessageFormat.format("{0}{1}{0}", arggument0, argument1) за да построявам стринговете. Особеното тук е че мога един аргумент да го печатам два пъти в стринга, както и плейсхолдърите ({0}) не са зависими от типа на даани които използваме като аргумент. Числото в плейсхолдъра отговаря на поредният аргумент. {0} отговаря на първият аргумент, {1} отговаря на вторият и т.н. Другата особеност в задачата е, че имам променливи за всеки символ който се използва. Това е с цел на по-късен етап да могат да се виждат лесно и да се променят лесно.

Задача 06 ( Ромбче от звездички )

Разделил ромба условно на две части и го печатам с два цикъла. Тъй като печатането на ромба е идентично и за двата цикъла съм го извел в отделен метод на който подавам стойности/аргументи.

Задача 07 ( Коледна елха )

Отново имам променливи за символите с които рисуваме и отново използвам MessageFormat.format(). Другата особеност е че започвам да въртя цикъла от нула до <= treeHeight (височината на дървото). По този начин мога да си принтирам връхчето на дървото без клонки, защото индексът в цикъла е равен на нула и го използвам за броят на звездичките на всеки ред.

Задача 08 ( Слънчеви очила )

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

Задача 09 ( Къщичка )

Къщата я делим на горна и долна част, респективно покрив и стени. Току що видях че стените ги смятам в цикъла което е излишно. За това изведох променлива в която да построя стринга веднъж и само го принтирам в долният цикъл. Използвам същият медот, като при мостчето за очилата, за да изчисля височината на покрива правилно и лесно.

Задача 10 ( * Диамант )

Задачата е хубава защото е гадна. Иска да се замислите повече (за това е хубава) и решението никак не е интуитивно (за това е гадна). Основното тук е да сметнем правилно горната и долната част. Повтарям алгоритъмът от очилата и тънкият момент е че долната част се смята според началната стойност която задаваме, ако входното число е четно тогава намаляме размера на долната част с единица за да печатаме правилн брой редове. Мисля че за първи път използвам тернарен оператор в задачите, за това ще се опитам да го обясня. тернарният оператор се сътои от условие ? аргумент1 : аргумент 2 на практика го приемете като if() на един ред. ако условието е true (boolean) се изпълнява аргумент1 ако е false се изпълнява аргумент 2. Циклите за печатане на диаманта ги броим от 1 и до >0 защото използваме индексът за да определим броят на външните тирета от едната страна на диаманта. Правим си стринг с нужната бройка тирета. От общата ширина на диаманта вадим бройката тирета умножена по 2 и получаваме текущичт брой на звездички с тирета меду тях. Проверяваме полученото число дали е >1 ако не е печатаме само една звезда ако мине проверката(true) построяваме стринг от тирета със звезди в двата края на стринга. С тази проверка решаваме проблемът колко звезди да има на първият ред на диаманта (1 или 2) и си правим стринга кото е тяло на диаманта. За извеждането ползвам конкатанация (стринг + стринг + стринг) вместо MessageFormat.format() просто така за разнообразие.

Задача 11 ( Чертане на крепост )

Единственото особено на крепостта е че на предпоследният ред добаваме долни чети, а нма последният празни пространства под тях. Този път съм си сметнал всички различни стрингове и накрая просто си ги извеждам. Замалко да пропусна интересните неща и да мина на следващата задача :) Освен че отново използвам MessageFormat.format() (защото... защо не) всъщност защото ми е по лесмно да си представя крайният резултат. За последните два стринга/реда вместо да използвам методът който всички си създадохме за повтаряне на символ N пъти, използвам вече създадени стрингове(които са с нужната дължина) и заменям символите с други като запазвам дължината на стринга. За тази цел използвам името-на-вашата-стринг-променлива.replace('^','_'). Първият аргумен се замества с вторият. Обърнете внимание че кавичките са единични защото аргумените са от char тип на данни. И вече минавам на следващата задача.

Задача 12 ( Пеперуда )

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

 

Ами това е. Ако има нещо неясно питайте, ще обърна внимание на всеки. Публикувайте и вашите решения и нека ги обсъдим. И да не забравя.. поемам критики всякакви. Можем само да се поучим от тях ;)

0
Programming Basics 16/02/2017 22:08:12
MartinBG avatar MartinBG 4803 Точки

Ето някои от моите решения.

Опитал съм се да намеря по-изчистени решения (един основен цикъл, без помощен метод, по-кратък код), тъй като тези, които направихме на лекцията са доста далече от естетическите ми възгледи за добре организиран код :)

Задача 06 ( Ромбче от звездички ) - http://pastebin.com/ebfTK8tA

Задача 07 ( Коледна елха ) - http://pastebin.com/CeSqSY3k

Задача 08 ( Слънчеви очила ) - http://pastebin.com/dXTZCLjP

Задача 09 ( Къщичка ) - http://pastebin.com/nziidp2C

Задача 10 ( * Диамант ) - http://pastebin.com/rq7C0Yew

 

По-късно ще постна и решенията си на последните 2 задачи.

Като цяло, предизвикателството в този тип задачи е да се намери математическата зависимост и най-оптималното ѝ реализиране.

 

EDIT:

Ето и решенията ми на допълнителните задачи.

Не блестят с изящество, но са донякъде различни от другите решения, тъй като реших да използвам char[] масиви за някои редове и умишлено не използвам методи.

Задача 11 ( Чертане на крепост ) - http://pastebin.com/SyzwVntT

Задача 12 ( Пеперуда ) - http://pastebin.com/iEvJAweG

0
26/02/2017 22:33:03
joto_to avatar joto_to 40 Точки

Много интересни решение. Може ли да ги пипна малко и да си кажеш мнението?

0
MartinBG avatar MartinBG 4803 Точки

Благодаря!

Да, разбира се! :)

0
joto_to avatar joto_to 40 Точки

Оказа се че няма какво да пипам. Всичко е много добре написано и не мисля че има смисъл да издребнявам. yes

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