Photoshop – Course Project

dobe_Photoshop_Cs

Abbout my Course Project:

After quite a few hours of hard work, another course is finished! So in this post, i decided to share my course project. Based on it we are allowed (or denied) to take our exam.

So here is the link to a png picture of my project:

https://www.dropbox.com/s/hnhl9zom9cf3jow/photography.png

And here is a link to the PSD file + some annimations I made 🙂 .

https://www.dropbox.com/s/vgve9ctrqh7quyt/PhotoshopCourseProject.rar

P.S. Bare in mind that if you want to open the animations you will need the Extended version of Photoshop 🙂

Aboute the Photoshop course:

If you are interested in the course and what to see what we were you to this past few months, you can visit it’s official page: Photoshop Course  , where you can find all of the materials and videos 🙂 .

All and all – it was a great course!

My GitHub repository

След като пресметнах колко време ми остава до изпита се оказа, че най-вероятно няма да мога въобще да наваксам със статиите за задачите от домашните и за това реших да споделя всичко каквото съм направил до сега от двата трака в GitHub  за тези от вас който има е интересно 🙂  Като цяло мисля че пиша относително лесен за разбиране код и не би трябвало да имате големи проблеми с разчитането му. Ако все пак възникнат такива – не се притеснявайте да ме питате за всичко което ви интересува.

GitHub Repo

П.С. Най-вероятно след изпита ще сменя адреса на блога ми ( най-после имам нов хостиг 🙂 ), така че очаквайте доста промени 🙂

 

 

Домашни от масиви – решения и обяснения. Част трета.

C-To-Go-300x300

След относително голямото прекъсване най-накрая съм свободен ( сесията свърши! 😀 ) да почна отново да пускам решенията на задачите си със обяснение, като ще се постарая да постна всички решения, плюс още няколко полезни статии в близките седмици до изпита 🙂

Задача 13. Write a program that sorts an array of integers using the merge sort algorithm (find it in Wikipedia).

Решение: PasteBin

Обяснение:

Един от по-сложните сортиращи алгоритми. Основната идея зад него е:

  1. Разделяме рекурсивно несортирания масив/лист на N на брой подмасиви/листове с дължина 1 т.к. масив/лист със дължина 1 се счита за подреден ( за тази операция отговаря метода – MergeSortAlg.
  2. Рекурсивно сливаме подлистовте/масивите докато не остане само 1 сортиран масив.

За по-лесна визуализация вижте линка в допълнителна информация

Допълнителна информация:

  • Графично представяне на сортиращите алгоритми: Цък

Задача 14. Write a program that sorts an array of strings using the quicksort algorithm (find it in Wikipedia).

Решение: PasteBin

Обяснение:

Конкретната реализация, която съм направил аз тук се нарича Simple Quick Sort и по-неефективна от така наречения Inplace Quick Sort ( Ако ви е интересно ви препоръчвам да се пробвате да реализирате нея, лично аз при първа възможност ще го направя ). Основната логика Simple Quick Sort е следната:

  1. Избираме елемент наречен pivot елемент от нашия масив ( Определяме като подаденя масив разделим на 2 )
  2. Подреждаме елементите по-малки от pivot елемента в подлиста lesser, а който са по-големи в подлиста greater
  3. Повтаряме стъпка 2 рекурсивно и добавяме резултата в крайния лист result.

Допълнителна информация:

  • Графично представяне на сортиращите алгоритми: Цък

Задача 15. Write a program that finds all prime numbers in the range [1…10 000 000]. Use the sieve of Eratosthenes algorithm (find it in Wikipedia).

Решение: PasteBin

Обяснение:

В какво се състой този алгоритъм ? Започваме от 2 и премахваме всички числа който се делят без остатък на 2, след това вземаме следващото число 3 и премахваме всички числа който се делят на това число и т.н. до края.

Как съм го направил в задачата аз ?

  1. Декларирам bool масив с 10 000 000 елемента, като индексите му отговарят на всяко число което искаме да проверим. ( по подразбиране всички елементи са false ).
  2. С първия цикъл обикалям до корен квадратен от всички числа ( може да обикаля до всички числа, но така е по-бързо. Тази оптимизация бе показана в домашните от предишната част на курса )
  3. Проверяваме дали числото е false, ако е влизаме в 2рия цикъл и го инициализираме с j = i*i със стъпка j = j + i. На всяка стъпка променяме стойността на даден елемент на true.
  4. Накрая отпечатваме индексите само на тези елементи, които са false.

П.С. Алгоритъма работи, но докато сe изпише всичко на конзолата, ще пуснете 2 чифта брада 😀

Задача 16.* We are given an array of integers and a number S. Write a program to find if there exists a subset of the elements of the array that has a sum S. Example: arr={2, 1, 2, 4, 3, 5, 2, 6}, S=14 -> yes (1+2+5+6)

Решение: PasteBin

Обяснение:

В основата на това решение, стои решението на задачата за намиране на броя на подмножествата от Примерния изпит за първата част на курса, обяснена на моята група от Николай Костов при подготовката ни за изпит ( Видео от лекцията: http://www.youtube.com/watch?v=Sk0PX0YSHtk  ).

Ето в общи линии в какво се състой решението на задачата:

  1. Попълваме си в един масив всички елементи.
  2. Определяме максимални брой на подмножествата по формулата – 2 на степен броя на елементите ( тук взимаме в предивид и нулевото множество ).
  3. И сега идва ядрото на задачата – как да определим кой са нашите подмножества. В общи лини, това става чрез побитовата репрезентация на числата от 0 до броя на всички възможни подмножества.

Ще ви покажа с пример как може да видим всички подмножества на елементите 1, 2, 3, 4. Всички възможно подмножества тук са – 15.

SubSetSum

Т.е. на всяка единица съответства елемнт от всички елементи.

  1. Реализацията в задачата – с първия for цикъл обхождаме всички възможно комбинация в задачата, а със втория – всички елементи в масива. С помощта на побитови операция проверяваме следното – 0 бит от първия цикъл 1 или нула е ? Ако е 1 взимаме елемента и го добавяме към общата сума, ако не го игнорираме. Същото става и за 1вия бит – ако е 0 го игнорираме, ако не е прибавяме елемента с индекс 1 към текущия сбор.
  2. Текущата редичка си я съхраняваме в обикновен стринг ( със StringBuilder е по-добре, но тук използвах конкитенация )
  3. И последната проверка е дали текущата сума е равна на търсената сума – ако това е вярно, я изписваме на конзолата.

Забележка: При всяка проверка на възможна комбинация трябва да изпразваме string – a където държим редичката си.

ВАЖНО: Този алгоритъм работи, но НЕ е ефективен. Вижте форума на Академията за решения с динамично оптимиране.

Задача 17.* Write a program that reads three integer numbers N, K and S and an array of N elements from the console. Find in the array a subset of K elements that have sum S or indicate about its absence.

Решение: PasteBin

Обяснение:

Основата на задачата е аналогична с тази от 16та. Основаните разлики тук са – от входа взимаме дължината на желаната редичка, правим си още една променлива, която да пази дължината на текущата редичка и само тогава когато тези 2 променливи съвпадат, принтираме редичката си.

Задача 18.* Write a program that reads an array of integers and removes from it a minimal number of elements in such way that the remaining array is sorted in increasing order. Print the remaining sorted array. Example:

{6, 1, 4, 3, 0, 3, 6, 4, 5} -> {1, 3, 3, 4, 5}

Решение: PasteBin

Обяснение: И отново използвам основната логика от 16 задача за да намеря най-дългата нарастваща редица.

Допълнителна информация:

Задача 20.Write a program that reads two numbers N and K and generates all the variations of K elements from the set [1..N]. Example:

N = 3, K = 2 -> {1, 1}, {1, 2}, {1, 3}, {2, 1}, {2, 2}, {2, 3}, {3, 1}, {3, 2}, {3, 3}

Решение: PasteBin

Обяснение: Стандартно рекурсивно решение на проблема. Ето графично представяне на извикването на метода VariationsGen(int[] array, int index, int N). Червените методи са дъното на рекурсията.

Arrays.20.variatons

21.Write a program that reads two numbers N and K and generates all the combinations of K distinct elements from the set [1..N]. Example:

N = 5, K = 2 à {1, 2}, {1, 3}, {1, 4}, {1, 5}, {2, 3}, {2, 4}, {2, 5}, {3, 4}, {3, 5}, {4, 5}

Решение: PasteBin

Обяснение: Използвам подхода за генериране на комбинациите от 16та задача. Ако имате време бих ви препоръчал да пробвате да направите рекурсивно решение на задачата 🙂

Домашни от масиви – решения и обяснения. Част втора.

C_Sharp

Задача 7. Sorting an array means to arrange its elements in increasing order. Write a program to sort an array. Use the “selection sort” algorithm: Find the smallest element, move it at the first position, find the smallest from the rest, move it at the second position, etc.

Решение: PasteBin

Обяснение:  Първия сортиращ алгоритъм с който се сблъскваме, един от най-лесните, но и един от най-неефективните. Основанта логика тук е:

Първия и обикаля по всички елементи на цикъла, а втория обикаля всички елементи, започвайки от позицията на брояча на първия цикъл + 1, като с него търсим най-малкия елемент и записваме индекса му в отделна променлива. След като сме намерили най-малкия елемент с помощта на 2рия цикъл правим размяна на елемента с индекс брояча на първия цикъл и най-малкия елемент ( индекса му записахме в отделна променлива.

Накрая отпечатваме сортирания масив.

Допълнителна информация:

  1. Визуализация на търсещите алгоритми
  2. Статия във Wikipedia

Задача 8. Write a program that finds the sequence of maximal sum in given array. Example: {2, 3, -6, -1, 2, -1, 6, 4, -8, 8}  ->  {2, -1, 6, 4} Can you do it with only one loop (with single scan through the elements of the array)?

Решение: PasteBin

Обяснение: Каква хитрина може да използваме за да не е нужно да използваме 2 цикъла ? Просто проверяваме дали текущата сума е паднала под нула. Ето моята логика:

1. С for цикъла обхождаме всеки елемент по-отделно.

2. След това добавяме стойността на текущия елемент към текущата сума.

3. Използваме StringBuilder за да запазим текущата редичка ( може и с начален и краен индекс, но реших да пробвам по друг начин ). Ако не знаете какво е StringBuilder или метода AppendFormat,не ви е познат вижте тук:

StringBuilder: http://www.dotnetperls.com/stringbuilder

AppendFormat: http://www.dotnetperls.com/appendformat

4. Следващата стъпка е да проверим дали, текущата сума е по-голяма, от най-голямата до сега, ако да присвояваме я като най-голяма и превръщаме редичката от StringBuilder – a в най-добрата редичка до сега.

5. Следващата проверка е дали текущата сума е паднала под нула. Ако това е вярно, нулираме текущата сума и изчистваме съдържанието на StringBuilder – a с метода .Clear()

Забележка: Алгоритъма ще работи и при масив със само отрицателни числа. Там най-малката редица е най-малкия отрицателен елемент.

Задача 9. Write a program that finds the most frequent number in an array. Example: {4, 1, 1, 4, 2, 3, 4, 4, 1, 2, 4, 9, 3} -> 4(5 times)

Решение: PasteBin

Обяснение: Ето основните стъпки през който минавам:

1. Ако не знаете какво е речник, потърсете в Интернет. Основната ми идея в задачата се базира в/у тази структура.

Препоръчвам ви да погледнете тук: http://www.dotnetperls.com/dictionary

2. С един цикъл обикалям по всички стойности на масива си ( този който го взимам от входа ). Ако стойността на даден елемент не съществува в речника ми, добавям я с ключ стойност на елемента и стойност към този ключ 1 ( до сега съм я срещнал 1 път ) , а ако съществува просто увеличава стойността на дадения ключ с 1.

Забележка: При работа с речници използвате: TryGetValue(), а не ContainsKey() . Първия е по-бърз. Източник: http://www.dotnetperls.com/trygetvalue

3. След като сме попълнили нащия речник с обикновен foreach обикаляме всичките му елементи и ги сравняваме по стойност (Value) и ако стойноста им е по-голяма от най-голямата срещана до сега я запзваме в отделна променлива. Също така имам и променлива пазеща ключа на най-често срещания елемент в речника ( на често срещания елемент в нашия вход ).

Забелжека: Защо присвоявам на int bestFrequnecy = int.MinValue; ? Ами така се подсигурявам, че при сравнението първия елемент ще бъде присвоен веднага на променливата т.к. което и да е число винаги е по-голямо от най-малката стойност на int.

Задача 10. Write a program that finds in given array of integers a sequence of given sum S (if present). Example:  {4, 3, 1, 4, 2, 5, 8}, S=11 -> {4, 2, 5}

Решение: PasteBin

Обяснение: Основните ми стъпки тук са следните:

1.  Имам 2 цикъла с който генерирам всички възможно суми на последователности на елементи.

2. Редицата я пазя във string, като я конструирам със StringBuilder ( WTF е StringBuilder ? Виж няколко задачи по-горе. )

3. Ако текущата сумата е станала по-голяма от търсената сума – break; – ваме цикъла и изчистваме StringBuilder – a с .Clear().

4. Aко е станала равна на търсената превръщаме редицата в string и я изписваме на конзолата.

Задача 11. Write a program that finds the index of given element in a sorted array of integers by using the binary search algorithm (find it in Wikipedia).

Решение: PasteBin

Обяснение:

Преди да почнем трябва да отбележим, че този алгоритъм трябва да се прилага само в/у сортирани масиви. Какво правя:

1. Създава ме си един метод ( Може и без отделен метод, но така е по-прегледно ) , който приема аргументи – сортирания масив, в който търсим и стойността ( ключа ) на елемента който търсим. Връщаната от него стойност показва индекса, на който се намира елемента или ако върне -1 означава, че няма такъв елемент в масива.

2. Каква е основната логика тук ? Ще се опитам да я обясня с пример.

Има една игричка, която се състой в това да се познае число в дадена рамка, да кажем 0 до 100, като този който си е намислил числото, при наш опит ни казва дали сме познали, дали числото се намира под това което сме казали ( по-малко ), дали над това което сме казали ( по – голямо ). Една игра протича така:

Намислено число: 80 в рамка 0 -100.

1ви опит – 50 -> по-голямо

2ри опит – 75 -> по-голямо

3ти опит – 87 -> по-малко

и т.н. -> винаги определяме дали числото е по-малко или по-голямо и делим дадения интревал 2 за да го стесним 🙂

Ето малко визуално обяснение:

BinSearch

И като цяло това е основата на алгоритъма. Разпишете си го на лист хартия за да видите, колко е лесен 🙂

Ето още един пример, като този е конкретно за имплементацията на алгоритъма в/у масив:

BinSearchOnArray

 

Задача 12. Write a program that creates an array containing all letters from the alphabet (A-Z). Read a word from the console and print the index of each of its letters in the array.

Решение: PasteBin

Обяснение:

Ще приемем, че “а” съответства на позиция 1, а не на 0 в масива с букви, с чисто естетическа цел ( няма нищо грешно да се направи и като 0, зависи как се разбира задачата )

1. Декларираме си char масив за всички букви – малки и големи – с големина 53 т.к. искаме да започва от 1, а не от 0.

2. Пръвия for цикъл пълни масива с малко букви, с помощта на един просто трик -> ‘a’ + 1 = ‘b’ . Като вместо 1 използваме брояча на цикъла.

3. Със втория for попълваме масива със големите букви, пак с трика от предишната точка, но тук декларираме една допълнителна променлива k която се увеличава до 25 т.к. броенето на главния брояч започва от 26 ( това е с цел да започнем попълването на масива от 26та позиция )

4. Сравнението се извършва по елементарен начин – с един цикъл обикаляме по буквите на думата ( най-подходящи според мен тук са for или foreach ) а със втория по масива с букви. Ако има съвпадение изписваме резултата и break; – ваме обхождането по масива с букви. Защо break; – ваме ? Ами една буква може да се среща само 1 път в масива с букви 🙂

Очаквайте скоро следващата порция 🙂

 

Домашни от масиви – решения и обяснения. Част първа.

C-To-Go-300x300

В тази тема ще поместя, част от решенията на задачите от Лекцията за масиви.

Задача 1. Write a program that allocates array of 20 integers and initializes each element by its index multiplied by 5. Print the obtained array on the console.

Решение: PasteBin

Обяснение: Доста праволинейна задача като по мое лично мнение, най-подходящо тук е да използваме for цикъл. Защо? Ами нужно ни е да знаем индекса на масива и инициализацията на отделните елементи става много лесно, като просто умножим брояча на for цъкала по 5 и го присвоим към дадения елемент.

Задача 2: Write a program that reads two arrays from the console and compares them element by element.

Решение: PasteBin

Обяснение: Относително лесна задача, като първите няколко стъпки са доста праволинейни – попълваме 2 масива, чрез for цикли и четене на отделните елементи от конзолата. Същинската част е след това.

Инициализираме bool променлива която индикира дали дадени два елемента си равни ( началната и стойност е true т.к. двата масива са равни до доказване на противното ). След това обхождаме 2та масива едновременно ( с помощта на индекса на for цикъла, който индикира кореспондиращия индекс в 2та масива ) и ако някой от двата елемента не са равни, то променяме стойността на bool променливата на false и break-ваме цикъла. Защо го break-ваме ? Ами за нас е достатъчно, че 2 елемента са различни за да заключим, че двата масива са различни.

Задача 3: Write a program that compares two char arrays lexicographically (letter by letter).

Решение: PasteBin

Обяснение: Основната логика, тук е – първо проверяваме дали двата масива имат равна дължина, ако не то те не са равни. Ако има равна дължина проверяваме по отделно всеки елемент и ако има даже един различен двата масива не са равни.

Задача 4: Write a program that finds the maximal sequence of equal elements in an array. Example: {2, 1, 1, 2, 3, 3, 2, 2, 2, 1} -> {2, 2, 2}.

Решение: PasteBin

Обяснение: Използвал си 3 променливи, за следните цели:

len – текущата дължина на проверяваната редица.

bestLen – най-голяма дължина срещана до сега;

bestLenElement  – елемента, който се е срещал най-много до сега.

След това обхождам масива си от ляво на дясно и започвам да проверявам дали текущия елемент е равен на следващия ( myArray[i] == myArray[i+1] ). Ако да увеличавам дължината на текущата редичка, ако не проверявам дали дължината на текущата редица е по-голяма от най-голямата до сега. Ако е така, присвоявам bestLen = len; и отбелязван, на кой елемент съм за bestLenElement .

Следващата стъпка е да ресетна len на 1.

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

Забележка: Защо len=1; ? Ами понеже елемента който сравняваме със следващия е редичка сам за себе си с дължина 1.

Забележка 2: Не забравяйте при задаване на условието на цъкал то, да е с едно по-малко от максималното ( myArray.Length-1 ) т.к. проверяваме с 1 елемент напред и ако не счетем това ще имаме IndexOutOfRange изключение.

Задача 5:  Write a program that finds the maximal increasing sequence in an array. Example: {3, 2, 3, 4, 2, 2, 4} -> {2, 3, 4}.

Решение: PasteBin

Обяснение: Логиката тук е аналогична с тази от 4та задача, с малки изключения. Условието при което увеличаваме дължината на текущата редица е следващия елемент да е по-голям от текущия и вместо да взимаме на-добрия елемент, взимаме последния елемент от редицата и чрез него си принтваме цялата на-добра редичка, чрез намаляващ for.

Задача 6: Write a program that reads two integer numbers N and K and an array of N elements from the console. Find in the array those K elements that have maximal sum.

Решение: PasteBin

Обяснение: Доста интресна задачка. Основната ми логика тук е:

Първия for цикъл обикаля по отделните елементи на масива.

Когато влезем в този for имаме следната проверка: (i + k > arrayLen) т.е. дали к елемента ( дължината на търсената редица ) напред няма да излезем извън нашия масив т.е. ако е вярно няма смисъл да правим други проверки и за това break; – ваме цикъла.

Следва същинската проверка за сумата с втори for цикъл , който върти до i + k – дължината на търсената ни редица от елемента на който сме.

След това просто имаме проверка дали, текущата сума е по-голяма от най-голямата сума до сега. Ако да заместваме най-голямата сума до сега с нея.

И накрая нулираме текущата сума.

Очаквайте, скоро Част втора от домашната за масиви 🙂

CSS въведение: селектори, стилове, класове – Домашни

html5-css3

След курса по HTML основи, логично преминаваме в CSS, за да се научим да правим всякакви шарении и глезотии 😀 .  В първата тема – CSS въведение: селектори, стилове, класове , ни бяха представени основните механизми на CSS, начини за избиране на дадени елементи, важност на CSS правилата и т.н. В следващите няколко реда ще представя моите решения и логиката ми зад тях.

Задача 1 – Simple Ticket

Тук създавам структурата с таблица ( може и без, но за това се изискват знания, които още нямаме ), слагам класове на текста с един и същ цвят, и добавям точката, чрез картинка ( може да се направи и само с CSS ).
За сваляне от DropBox: – Цък

HTML и CSS в jsFiddle: –  Цък

Задача 2 – Simple Styled Table

В общи линии пак създавам структурата с таблица, стилизирам заглавните клетки с нужния фон, използвам някои от новите псевдо селектори за останала стилизация ( Примерно да се редува оцветяването на редовете през едно ).
За сваляне от DropBox: – Цък

HTML и CSS в jsFiddle: – Цък

Задача 3 – Simple Web Page

Целта ( според мен ) тук е да стилизираме предоставения ни HMTL без да го променяме. За целта използвам новите CSS3 селектори.
За сваляне от DropBox: – Цък

HTML и CSS в jsFiddle: – Цък