Решение на Домашно 06 от Основи на програмирането с Java - декември 2016
Дата: 11-ти февруари 2017
Отново ви привтствам да разгледаме решенията на задачите, да споделите вашите решения, да задавате въпроси, да си помагаме.
Задача 01 ( Правоъгълник от 10 x 10 звездички )
Решена на лекцията.
Задача 02 ( Правоъгълник от N x N звездички )
Решена на лекцията.
Задача 03 ( Квадрат от звездички )
Решена на лекцията.
Задача 04 ( Триъгълник от долари )
Решена на лекцията.
Различното което правя тук е, че използвам MessageFormat.format("{0}{1}{0}", arggument0, argument1) за да построявам стринговете. Особеното тук е че мога един аргумент да го печатам два пъти в стринга, както и плейсхолдърите ({0}) не са зависими от типа на даани които използваме като аргумент. Числото в плейсхолдъра отговаря на поредният аргумент. {0} отговаря на първият аргумент, {1} отговаря на вторият и т.н. Другата особеност в задачата е, че имам променливи за всеки символ който се използва. Това е с цел на по-късен етап да могат да се виждат лесно и да се променят лесно.
Задача 06 ( Ромбче от звездички )
Разделил ромба условно на две части и го печатам с два цикъла. Тъй като печатането на ромба е идентично и за двата цикъла съм го извел в отделен метод на който подавам стойности/аргументи.
Отново имам променливи за символите с които рисуваме и отново използвам MessageFormat.format(). Другата особеност е че започвам да въртя цикъла от нула до <= treeHeight (височината на дървото). По този начин мога да си принтирам връхчето на дървото без клонки, защото индексът в цикъла е равен на нула и го използвам за броят на звездичките на всеки ред.
Интересното в това решение е начините по които може да се пресметне позицията на мостчето на очилата. Става на един ред с проста математика. Мисля че няма други особености, които да не съм споменал за горни задачи.
Къщата я делим на горна и долна част, респективно покрив и стени. Току що видях че стените ги смятам в цикъла което е излишно. За това изведох променлива в която да построя стринга веднъж и само го принтирам в долният цикъл. Използвам същият медот, като при мостчето за очилата, за да изчисля височината на покрива правилно и лесно.
Задачата е хубава защото е гадна. Иска да се замислите повече (за това е хубава) и решението никак не е интуитивно (за това е гадна). Основното тук е да сметнем правилно горната и долната част. Повтарям алгоритъмът от очилата и тънкият момент е че долната част се смята според началната стойност която задаваме, ако входното число е четно тогава намаляме размера на долната част с единица за да печатаме правилн брой редове. Мисля че за първи път използвам тернарен оператор в задачите, за това ще се опитам да го обясня. тернарният оператор се сътои от условие ? аргумент1 : аргумент 2 на практика го приемете като if() на един ред. ако условието е true (boolean) се изпълнява аргумент1 ако е false се изпълнява аргумент 2. Циклите за печатане на диаманта ги броим от 1 и до >0 защото използваме индексът за да определим броят на външните тирета от едната страна на диаманта. Правим си стринг с нужната бройка тирета. От общата ширина на диаманта вадим бройката тирета умножена по 2 и получаваме текущичт брой на звездички с тирета меду тях. Проверяваме полученото число дали е >1 ако не е печатаме само една звезда ако мине проверката(true) построяваме стринг от тирета със звезди в двата края на стринга. С тази проверка решаваме проблемът колко звезди да има на първият ред на диаманта (1 или 2) и си правим стринга кото е тяло на диаманта. За извеждането ползвам конкатанация (стринг + стринг + стринг) вместо MessageFormat.format() просто така за разнообразие.
Задача 11 ( Чертане на крепост )
Единственото особено на крепостта е че на предпоследният ред добаваме долни чети, а нма последният празни пространства под тях. Този път съм си сметнал всички различни стрингове и накрая просто си ги извеждам. Замалко да пропусна интересните неща и да мина на следващата задача :) Освен че отново използвам MessageFormat.format() (защото... защо не) всъщност защото ми е по лесмно да си представя крайният резултат. За последните два стринга/реда вместо да използвам методът който всички си създадохме за повтаряне на символ N пъти, използвам вече създадени стрингове(които са с нужната дължина) и заменям символите с други като запазвам дължината на стринга. За тази цел използвам името-на-вашата-стринг-променлива.replace('^','_'). Първият аргумен се замества с вторият. Обърнете внимание че кавичките са единични защото аргумените са от char тип на данни. И вече минавам на следващата задача.
Интересна задачка. Правя стрингове за горната и долната част на крилата. Замествам звездичките с тирета за да получа и вторите стрингове. Вкарал съм и саият цикъл в метода с който печатам горната и долната част на крилата, като само му подавам различните стрингове за горната и долната част на крилата.
Ами това е. Ако има нещо неясно питайте, ще обърна внимание на всеки. Публикувайте и вашите решения и нека ги обсъдим. И да не забравя.. поемам критики всякакви. Можем само да се поучим от тях ;)
Благодаря за споделените решения.