Професионална програма
Loading...
+ Нов въпрос
joto_to avatar joto_to 39 Точки

Решение на Домашно 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
pavsavov avatar pavsavov 18 Точки

Това е моето решение за задача 6.

http://pastebin.com/M1CfqA3f

Принципно разликата е във използването на по-малко for цикли и повече изпозлване на метода. 

 

====

Това е решението ми пък за задача 5

http://pastebin.com/yJCVD3gz 

Тук пък(както и в страницата) исках да видя как би изглеждало само с for цикли и отбягване използването на метода!

 

0
joto_to avatar joto_to 39 Точки

Благодаря за споделените решения.

0
Jovtcho avatar Jovtcho 20 Точки

Здрасти,

Макар и позакъснял ето и моите решения на задачите, които ми се сториха по-трудни.

http://pastebin.com/wYYXJRUL - ромб от звезди

http://pastebin.com/dUWYHvTF - коледно дръвче

http://pastebin.com/4RWV9Y8d - слънчеви очила

http://pastebin.com/wq2wemnD - къща

http://pastebin.com/30wrEzVC - диамант

http://pastebin.com/CLSktqSg - крепост

http://pastebin.com/BP3YgGaA - пеперуда


Ако трябва да съм честен къщата ме затрудни най-много.

0
MartinBG avatar MartinBG 3600 Точки

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

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

Задача 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 39 Точки

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

0
MartinBG avatar MartinBG 3600 Точки

Благодаря!

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

0
joto_to avatar joto_to 39 Точки

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

0