diff --git a/assets/chapter-10-images/01.Simple-method-01.png b/assets/chapter-10-images/01.Simple-method-01.png
new file mode 100644
index 00000000..14abfc6f
Binary files /dev/null and b/assets/chapter-10-images/01.Simple-method-01.png differ
diff --git a/assets/chapter-10-images/02.Declaring-methods-02.png b/assets/chapter-10-images/02.Declaring-methods-02.png
new file mode 100644
index 00000000..9a348880
Binary files /dev/null and b/assets/chapter-10-images/02.Declaring-methods-02.png differ
diff --git a/assets/chapter-10-images/02.Declaring-methods-03.png b/assets/chapter-10-images/02.Declaring-methods-03.png
new file mode 100644
index 00000000..49d5215f
Binary files /dev/null and b/assets/chapter-10-images/02.Declaring-methods-03.png differ
diff --git a/assets/chapter-10-images/03.Invoking-methods-01.png b/assets/chapter-10-images/03.Invoking-methods-01.png
new file mode 100644
index 00000000..e6fededd
Binary files /dev/null and b/assets/chapter-10-images/03.Invoking-methods-01.png differ
diff --git a/assets/chapter-10-images/03.Invoking-methods-02.png b/assets/chapter-10-images/03.Invoking-methods-02.png
new file mode 100644
index 00000000..fb2ce0c1
Binary files /dev/null and b/assets/chapter-10-images/03.Invoking-methods-02.png differ
diff --git a/assets/chapter-10-images/03.Invoking-methods-03.png b/assets/chapter-10-images/03.Invoking-methods-03.png
new file mode 100644
index 00000000..7457133c
Binary files /dev/null and b/assets/chapter-10-images/03.Invoking-methods-03.png differ
diff --git a/assets/chapter-10-images/04.Print-receipt-01.png b/assets/chapter-10-images/04.Print-receipt-01.png
new file mode 100644
index 00000000..4a0912b2
Binary files /dev/null and b/assets/chapter-10-images/04.Print-receipt-01.png differ
diff --git a/assets/chapter-10-images/04.Print-receipt-02.png b/assets/chapter-10-images/04.Print-receipt-02.png
new file mode 100644
index 00000000..5a20bdc9
Binary files /dev/null and b/assets/chapter-10-images/04.Print-receipt-02.png differ
diff --git a/assets/chapter-10-images/04.Print-receipt-03.png b/assets/chapter-10-images/04.Print-receipt-03.png
new file mode 100644
index 00000000..93a5856b
Binary files /dev/null and b/assets/chapter-10-images/04.Print-receipt-03.png differ
diff --git a/assets/chapter-10-images/05.Method-parameters-01.png b/assets/chapter-10-images/05.Method-parameters-01.png
new file mode 100644
index 00000000..5006a938
Binary files /dev/null and b/assets/chapter-10-images/05.Method-parameters-01.png differ
diff --git a/assets/chapter-10-images/05.Method-parameters-02.png b/assets/chapter-10-images/05.Method-parameters-02.png
new file mode 100644
index 00000000..ffbf1f14
Binary files /dev/null and b/assets/chapter-10-images/05.Method-parameters-02.png differ
diff --git a/assets/chapter-10-images/05.Method-parameters-03.png b/assets/chapter-10-images/05.Method-parameters-03.png
new file mode 100644
index 00000000..1ea1562f
Binary files /dev/null and b/assets/chapter-10-images/05.Method-parameters-03.png differ
diff --git a/assets/chapter-10-images/05.Method-parameters-04.png b/assets/chapter-10-images/05.Method-parameters-04.png
new file mode 100644
index 00000000..5f5e797c
Binary files /dev/null and b/assets/chapter-10-images/05.Method-parameters-04.png differ
diff --git a/assets/chapter-10-images/06.Print-sign-01.png b/assets/chapter-10-images/06.Print-sign-01.png
new file mode 100644
index 00000000..6e18d701
Binary files /dev/null and b/assets/chapter-10-images/06.Print-sign-01.png differ
diff --git a/assets/chapter-10-images/06.Print-sign-02.png b/assets/chapter-10-images/06.Print-sign-02.png
new file mode 100644
index 00000000..eae4f0bf
Binary files /dev/null and b/assets/chapter-10-images/06.Print-sign-02.png differ
diff --git a/assets/chapter-10-images/07.Optional-parameters-01.png b/assets/chapter-10-images/07.Optional-parameters-01.png
new file mode 100644
index 00000000..7b9a819a
Binary files /dev/null and b/assets/chapter-10-images/07.Optional-parameters-01.png differ
diff --git a/assets/chapter-10-images/07.Optional-parameters-02.png b/assets/chapter-10-images/07.Optional-parameters-02.png
new file mode 100644
index 00000000..f3b75ccf
Binary files /dev/null and b/assets/chapter-10-images/07.Optional-parameters-02.png differ
diff --git a/assets/chapter-10-images/08.Print-triangle-01.png b/assets/chapter-10-images/08.Print-triangle-01.png
new file mode 100644
index 00000000..245bd6b0
Binary files /dev/null and b/assets/chapter-10-images/08.Print-triangle-01.png differ
diff --git a/assets/chapter-10-images/08.Print-triangle-02.png b/assets/chapter-10-images/08.Print-triangle-02.png
new file mode 100644
index 00000000..265fefe1
Binary files /dev/null and b/assets/chapter-10-images/08.Print-triangle-02.png differ
diff --git a/assets/chapter-10-images/08.Print-triangle-03.png b/assets/chapter-10-images/08.Print-triangle-03.png
new file mode 100644
index 00000000..729afdd8
Binary files /dev/null and b/assets/chapter-10-images/08.Print-triangle-03.png differ
diff --git a/assets/chapter-10-images/08.Print-triangle-04.png b/assets/chapter-10-images/08.Print-triangle-04.png
new file mode 100644
index 00000000..4ad4b3ad
Binary files /dev/null and b/assets/chapter-10-images/08.Print-triangle-04.png differ
diff --git a/assets/chapter-10-images/09.Draw-filled-square-01.png b/assets/chapter-10-images/09.Draw-filled-square-01.png
new file mode 100644
index 00000000..1e12536b
Binary files /dev/null and b/assets/chapter-10-images/09.Draw-filled-square-01.png differ
diff --git a/assets/chapter-10-images/09.Draw-filled-square-02.png b/assets/chapter-10-images/09.Draw-filled-square-02.png
new file mode 100644
index 00000000..2cdb6ce3
Binary files /dev/null and b/assets/chapter-10-images/09.Draw-filled-square-02.png differ
diff --git a/assets/chapter-10-images/09.Draw-filled-square-03.png b/assets/chapter-10-images/09.Draw-filled-square-03.png
new file mode 100644
index 00000000..5563c512
Binary files /dev/null and b/assets/chapter-10-images/09.Draw-filled-square-03.png differ
diff --git a/assets/chapter-10-images/11.Return-operator-01.png b/assets/chapter-10-images/11.Return-operator-01.png
new file mode 100644
index 00000000..f61ff500
Binary files /dev/null and b/assets/chapter-10-images/11.Return-operator-01.png differ
diff --git a/assets/chapter-10-images/11.Return-operator-02.png b/assets/chapter-10-images/11.Return-operator-02.png
new file mode 100644
index 00000000..88b80e83
Binary files /dev/null and b/assets/chapter-10-images/11.Return-operator-02.png differ
diff --git a/assets/chapter-10-images/11.Return-operator-03.png b/assets/chapter-10-images/11.Return-operator-03.png
new file mode 100644
index 00000000..4fde37b0
Binary files /dev/null and b/assets/chapter-10-images/11.Return-operator-03.png differ
diff --git a/assets/chapter-10-images/12.Return-value-01.png b/assets/chapter-10-images/12.Return-value-01.png
new file mode 100644
index 00000000..135fd2af
Binary files /dev/null and b/assets/chapter-10-images/12.Return-value-01.png differ
diff --git a/assets/chapter-10-images/12.Return-value-02.png b/assets/chapter-10-images/12.Return-value-02.png
new file mode 100644
index 00000000..30d40ce1
Binary files /dev/null and b/assets/chapter-10-images/12.Return-value-02.png differ
diff --git a/assets/chapter-10-images/12.Return-value-03.png b/assets/chapter-10-images/12.Return-value-03.png
new file mode 100644
index 00000000..7e0ecfa3
Binary files /dev/null and b/assets/chapter-10-images/12.Return-value-03.png differ
diff --git a/assets/chapter-10-images/13.Calculate-triangle-area-01.png b/assets/chapter-10-images/13.Calculate-triangle-area-01.png
new file mode 100644
index 00000000..ba5d2151
Binary files /dev/null and b/assets/chapter-10-images/13.Calculate-triangle-area-01.png differ
diff --git a/assets/chapter-10-images/13.Calculate-triangle-area-02.png b/assets/chapter-10-images/13.Calculate-triangle-area-02.png
new file mode 100644
index 00000000..41cb7cca
Binary files /dev/null and b/assets/chapter-10-images/13.Calculate-triangle-area-02.png differ
diff --git a/assets/chapter-10-images/14.Number-power-01.png b/assets/chapter-10-images/14.Number-power-01.png
new file mode 100644
index 00000000..ce43e787
Binary files /dev/null and b/assets/chapter-10-images/14.Number-power-01.png differ
diff --git a/assets/chapter-10-images/15.Return-multiple-values-01.png b/assets/chapter-10-images/15.Return-multiple-values-01.png
new file mode 100644
index 00000000..1e864b91
Binary files /dev/null and b/assets/chapter-10-images/15.Return-multiple-values-01.png differ
diff --git a/assets/chapter-10-images/15.Return-multiple-values-02.png b/assets/chapter-10-images/15.Return-multiple-values-02.png
new file mode 100644
index 00000000..1201965a
Binary files /dev/null and b/assets/chapter-10-images/15.Return-multiple-values-02.png differ
diff --git a/assets/chapter-10-images/15.Return-multiple-values-03.png b/assets/chapter-10-images/15.Return-multiple-values-03.png
new file mode 100644
index 00000000..d8da954b
Binary files /dev/null and b/assets/chapter-10-images/15.Return-multiple-values-03.png differ
diff --git a/assets/chapter-10-images/15.Return-multiple-values-04.png b/assets/chapter-10-images/15.Return-multiple-values-04.png
new file mode 100644
index 00000000..007877de
Binary files /dev/null and b/assets/chapter-10-images/15.Return-multiple-values-04.png differ
diff --git a/assets/chapter-10-images/15.Return-multiple-values-05.png b/assets/chapter-10-images/15.Return-multiple-values-05.png
new file mode 100644
index 00000000..d63e3689
Binary files /dev/null and b/assets/chapter-10-images/15.Return-multiple-values-05.png differ
diff --git a/assets/chapter-10-images/19.Local-functions-01.png b/assets/chapter-10-images/19.Local-functions-01.png
new file mode 100644
index 00000000..77c4910d
Binary files /dev/null and b/assets/chapter-10-images/19.Local-functions-01.png differ
diff --git a/assets/chapter-10-images/19.Local-functions-02.png b/assets/chapter-10-images/19.Local-functions-02.png
new file mode 100644
index 00000000..ee2d12cc
Binary files /dev/null and b/assets/chapter-10-images/19.Local-functions-02.png differ
diff --git a/assets/chapter-10-images/20.Good-practice-01.png b/assets/chapter-10-images/20.Good-practice-01.png
new file mode 100644
index 00000000..06647788
Binary files /dev/null and b/assets/chapter-10-images/20.Good-practice-01.png differ
diff --git a/assets/chapter-10-images/20.Good-practice-02.png b/assets/chapter-10-images/20.Good-practice-02.png
new file mode 100644
index 00000000..8da9c6d0
Binary files /dev/null and b/assets/chapter-10-images/20.Good-practice-02.png differ
diff --git a/assets/chapter-10-images/20.Good-practice-03.png b/assets/chapter-10-images/20.Good-practice-03.png
new file mode 100644
index 00000000..9fcb027d
Binary files /dev/null and b/assets/chapter-10-images/20.Good-practice-03.png differ
diff --git a/assets/chapter-10-images/20.Good-practice-04.png b/assets/chapter-10-images/20.Good-practice-04.png
new file mode 100644
index 00000000..98780041
Binary files /dev/null and b/assets/chapter-10-images/20.Good-practice-04.png differ
diff --git a/assets/chapter-10-images/21.Repeated-string-01.png b/assets/chapter-10-images/21.Repeated-string-01.png
new file mode 100644
index 00000000..ca8434ad
Binary files /dev/null and b/assets/chapter-10-images/21.Repeated-string-01.png differ
diff --git a/assets/chapter-10-images/23.Notifications-01.png b/assets/chapter-10-images/23.Notifications-01.png
new file mode 100644
index 00000000..d348aaeb
Binary files /dev/null and b/assets/chapter-10-images/23.Notifications-01.png differ
diff --git a/assets/chapter-10-images/23.Notifications-02.png b/assets/chapter-10-images/23.Notifications-02.png
new file mode 100644
index 00000000..cc6f24b1
Binary files /dev/null and b/assets/chapter-10-images/23.Notifications-02.png differ
diff --git a/chapter-10-functions.md b/chapter-10-functions.md
index e5e4b7ce..0721bacb 100644
--- a/chapter-10-functions.md
+++ b/chapter-10-functions.md
@@ -1,77 +1,95 @@
# Глава 10. Функции
+**JavaScript** е известен като **функционален език** за програмиране. Самото наименование подсказва, че **функциите** са изключително важна част от езика.
+
В настоящата глава ще се запознаем с **функциите** и ще научим какво **представляват** те, както и кои са **базовите концепции** при работа с тях. Ще научим защо е **добра практика** да ги използваме, как да ги **декларираме** и **извикваме**. Ще се запознаем с **параметри** и **връщана стойност от функция**, както и как да използваме тази връщана стойност. Накрая на главата, ще разгледаме **утвърдените практики** при използване на функциите.
## Какво е "функция"?
До момента установихме, че при **писане** на код на програма, която решава дадена задача, ни **улеснява** това, че **разделяме** задачата на **части**. Всяка част отговаря за **дадено действие** и по този начин не само ни е **по-лесно** да решим задачата, но и значително се подобрява както **четимостта** на кода, така и проследяването за грешки.
-Всяко едно парче код, което изпълнява дадена функционалност и което сме отделили логически, може да изземе функционалността на метода. Точно това представляват **методите – парчета код, които са именувани** от нас по определен начин и които могат да бъдат **извикани** толкова пъти, колкото имаме нужда.
+Всяко едно парче код, което изпълнява дадена функционалност и което сме отделили логически се нарича **функция**. Точно това представляват **функциите – парчета код, които са именувани** от нас по определен начин и които могат да бъдат **извикани** толкова пъти, колкото имаме нужда и ще бъдат изпълнени съответния брой пъти.
+
+Една **функция** може да бъде **извиканa** толкова пъти, колкото ние преценим, че ни е нужно за решаване на даден проблем. Това ни **спестява** повторението на един и същи код няколко пъти, както и **намалява** възможността да пропуснем грешка при евентуална корекция на въпросния код.
+
+### Прости функции
+
+**Простите** функции отговарят за изпълнението на дадено **действие**, което **спомага** за решаване на определен проблем. Такива действия могат да бъдат разпечатване на даден низ на конзолата, извършване на някаква проверка, изпълнение на цикъл и други.
+
+Нека разгледаме следния **пример за проста функция**:
-Един метод може да бъде извикан толкова пъти, колкото ние преценим, че ни е нужно за решаване на даден проблем. Това ни **спестява** повторението на един и същи код няколко пъти, както и **намалява** възможността да пропуснем грешка при евентуална корекция на въпросния код.
+
-### Прости методи
+Тази **функция** има задачата да отпечата заглавие, което представлява поредица от символа **`-`**. Поради тази причина името ѝ е **`printHeader`**. Кръглите скоби **`( `** и **`)` винаги** следват името, независимо как сме именували функцията. По-късно ще разгледаме как трябва да именуваме функциите, с които работим, а за момента ще отбележим само, че е важно **името на функцията да описва действието**, което тя извършва.
-**Простите** методи отговарят за изпълнението на дадено **действие**, което **спомага** за решаване на определен проблем. Такива действия могат да бъдат разпечатване на даден низ на конзолата, извършване на някаква проверка, изпълнение на цикъл и други.
+**Тялото** на функцията съдържа **програмния код**, който се намира между къдравите скоби **`{`** и **`}`**. Между тях поставяме кода, който решава проблема, описан от името на функцията.
-Нека разгледаме следния **пример за прост метод**:
+### Защо да използваме функции?
-
+До тук установихме, че функциите спомагат за **разделянето на обемна задача на по-малки части**, което води до **по-лесно решаване** на въпросното задание. Това прави програмата ни не само по-добре структурирана и **лесно четима**, но и по-разбираема.
-Този метод има задачата да отпечата заглавие, което представлява поредица от символа **`-`**. Поради тази причина името му е **`PrintHeader`**. Кръглите скоби **`( `** и **`)` винаги** следват името, независимо как сме именували метода. По-късно ще разгледаме как трябва да именуваме методите, с които работим, а за момента ще отбележим само, че е важно **името му да описва действието**, което той извършва.
+Чрез функциите **избягваме повторението** на програмен код. **Повтарящият** се код е **лоша** практика, тъй като силно **затруднява поддръжката** на програмата и води до грешки. Ако дадена част от кода ни присъства в програмата няколко пъти и се наложи да променим нещо, то промените трябва да бъдат направени във всяко едно повторение на въпросния код. Вероятността да пропуснем място, на което трябва да нанесем корекция, е много голяма, което би довело до некоректно поведение на програмата. Това е причината, поради която е **добра практика**, ако използваме даден фрагмент код **повече от веднъж** в програмата си, да го **дефинираме като отделена функция**.
-**Тялото** на метода съдържа **програмния код**, който се намира между къдравите скоби **`{`** и **`}`**. Тези скоби **винаги** следват **декларацията** му и между тях поставяме кода, който решава проблема, описан от името на метода.
+Функциите ни предоставят **възможността** да използваме даден **код няколко пъти**. С решаването на все повече и повече задачи ще установите, че използването на вече декларирани функции спестява много време и усилия.
-### Защо да използваме методи?
+## Деклариране на функции
-До тук установихме, че методите спомагат за **разделянето на обемна задача на по-малки части**, което води до **по-лесно решаване** на въпросното задание. Това прави програмата ни не само по-добре структурирана и лесно четима, но и по-разбираема.
+В езика JavaScript можем да **декларираме** функции буквално навсякъде, по същият начин, по който можем да декларираме и променливи навсякъде. Декларирането представлява **регистрирането на функцията** в програмата, за да бъде разпозната в останалата част от нея.
-Чрез методите **избягваме повторението** на програмен код. **Повтарящият** се код е **лоша** практика, тъй като силно **затруднява поддръжката** на програмата и води до грешки. Ако дадена част от кода ни присъства в програмата няколко пъти и се наложи да променим нещо, то промените трябва да бъдат направени във всяко едно повторение на въпросния код. Вероятността да пропуснем място, на което трябва да нанесем корекция, е много голяма, което би довело до некоректно поведение на програмата. Това е причината, поради която е **добра практика**, ако използваме даден фрагмент код **повече от веднъж** в програмата си, да го **дефинираме като отделен метод**.
+JavaScript не е **strongly typed** език (силно типизиран). Затова и когато **декларираме функция** тя няма тип (string, number, array и т.н.), какъвто имат методите и функциите в другите езици за програмиране.
-Методите ни предоставят **възможността** да използваме даден **код няколко** пъти. С решаването на все повече и повече задачи ще установите, че използването на вече съществуващи методи спестява много време и усилия.
+Има 2 основни начина, по които могат да се декларирате функции в JavaScript - **декларативно - function declaration** и **експресивно - function expression**.
-### Деклариране на методи
+### Декларативно (function declaration)
-В езика JavaScript **декларираме** методите в рамките на даден клас, т.е. между отварящата **`{`** и затваряща **`}`** скоби на класа. Декларирането представлява регистрирането на метода в програмата, за да бъде разпознаван в останалата част от нея. Най-добре познатият ни пример за метод е метода **`Main(…)`**, който използваме във всяка една програма, която пишем.
+Със следващия пример ще разгледаме задължителните елементи в декларацията на една функция **чрез function declaration**.
-
+
-Със следващия пример ще разгледаме задължителните елементи в декларацията на един метод.
+* **Ключовата думичка function**. Започваме с използването на **ключовата думичка** ***function***, чрез която заявяваме, че предстои декларация на функция. Наричаме я ключова, защото тя е запазена в езика или с други думи казано - не можем да имаме променлива, която да именуваме по този начин.
+* **Име на функцията**. Името на функцията е **определено от нас**, като не забравяме, че трябва да **описва задачата**, която се изпълнявана от кода в тялото на функцията. В примера името е **`getSquare`**, което ни указва, че задачата на тази функция е да изчисли лицето на квадрат.
+* **Списък с параметри**. Декларира се между скобите **`(`** и **`)`**, които изписваме след името му. Тук изброяваме поредицата от **параметри**, които функцията ще използва. Може да присъства **само един** параметър, **няколко** такива или да е **празен** списък. Ако няма параметри, то ще запишем само скобите **`()`**. В конкретния пример декларираме параметъра **`n`**.
+* **Тяло на функцията**. Декларира се между скобите **`{`** и **`}`**, които изписваме веднага след затварящата **`)`**. В **тялото на функцията** описваме **чрез код** всички операции, които искаме функцията да извърши. В тялото на функцията описваме **алгоритъма**, по който фунцкията решава даден проблем. Реализираме **логиката** на функцията. В показания пример изчисляваме лицето на квадрат, а именно **`n * n`**.
-
+При деклариране на функции е важно да спазваме **последователността** на основните елементи - първо **ключовата думичка function**, след това **име на функцията**, **списък от параметри**, ограден с кръгли скоби **`()`** и накрая **тяло на функцията**, оградено с фигурни скоби **`{}`**.
-* **Тип на връщаната стойност**. В случая типа е **`double`**, което означава, че методът от примера ще **върне резултат**, който е от тип **`double`**. Връщаната стойност може да бъде както **`int`**, **`double`**, **`string`** и **т.н.**, така и **`void`**. Ако типът е **`void`**, то това означава, че методът **не връща** резултат, а само **изпълнява дадена операция**.
-* **Име на метода**. Името на метода е **определено от нас**, като не забравяме, че трябва да **описва функцията**, която е изпълнявана от кода в тялото му. В примера името е **`GetSquare`**, което ни указва, че задачата на този метод е да изчисли лицето на квадрат.
-* **Списък с параметри**. Декларира се между скобите **`(`** и **`)`**, които изписваме след името му. Тук изброяваме поредицата от **параметри**, които метода ще използва. Може да присъства **само един** параметър, **няколко** такива или да е **празен** списък. Ако няма параметри, то ще запишем само скобите **`()`**. В конкретния пример декларираме параметъра **`double num`**.
-* Декларация **`static`** в описанието на метода. За момента може да приемем, че **`static`** се пише винаги, когато се декларира метод, а по-късно, когато се запознаем с обектно-ориентираното програмиране (ООП), ще разберем разликата между **статични методи** (споделени за целия клас) и **методи на обект**, които работят върху данните на конкретна инстанция на класа (обект).
+## Експресивно (function expression)
-При деклариране на методи е важно да спазваме **последователността** на основните му елементи - първо **тип на връщаната стойност**, след това **име на метода** и накрая **списък от параметри**, ограден с кръгли скоби **`()`**.
+Със следващия пример ще разгледаме задължителните елементи в декларацията на една функция **чрез function expression**. То доста наподобява **декларативното**, което вече разгледахме и може да се каже, че е **комбинация** от **деклариране на променлива** и **деклариране на функция с function declaration**.
-След като сме декларирали метода, следва неговата **имплементация (тяло)**. В тялото на метода описваме **алгоритъма**, по който той решава даден проблем, т.е. тялото съдържа кода (програмен блок), който реализира **логиката** на метода. В показания пример изчисляваме лицето на квадрат, а именно **`num * num`**.
+
-Когато декларираме дадена променлива в тялото на един метод, я наричаме **локална** променлива за метода. Областта, в която съществува и може да бъде използвана тази променлива, започва от реда, на който сме я декларирали и стига до затварящата къдрава скоба `}` на тялото на метода. Тази област се нарича **област на видимост** на променливата (variable scope).
+* **Ключовата думичка let**. Започваме с използването на **ключовата думичка** **let**, чрез която заявяваме, че предстои декларация на променлива.
+* **Име на променливата**. Името на променливата е **определено от нас**. В примера името е **`getSquare`**, което ни указва, че задачата на тази функция е да изчисли лицето на квадрат.
+* **Декларация на функция**. Използвайки същата структура, която вече научихме при **function declaration** - първо **ключовата думичка function**, след това **име на функцията**, **списък от параметри**, ограден с кръгли скоби **`()`** и накрая **тяло на функцията**, оградено с фигурни скоби **`{}`**. Особеното в случая е, че **името на функцията** не е задължителен елемент, но е препоръчително да свикнете да го добавяте. В примерът програмата ще работи без проблеми, дори и да пропуснем да изпишем името **`getSquareFunc`**. Ако пропуснем името, функцията се нарича **анонимна**.
-### Извикване на методи
+Когато декларираме дадена променлива в тялото на една функция (чрез ключовата думичка **let** или **const**), я наричаме **локална** променлива за функцията. Областта, в която съществува и може да бъде използвана тази променлива, започва от реда, на който сме я декларирали и стига до затварящата къдрава скоба `}` на тялото на функцията. Тази област се нарича **област на видимост** на променливата (variable scope).
-Извикването на метод представлява **стартирането на изпълнението на кода**, който се намира в **тялото на метода**. Това става като изпишем **името** му, последвано от кръглите скоби **`()`** и знака **`;`** за край на реда. Ако методът ни изисква входни данни, то те се подават в скобите **`()`**, като последователността на фактическите параметри трябва да съвпада с последователността на подадените при декларирането на метода. Ето един пример:
+### Декларативно или експресивно
-
+Разликата между деклариране на функция чрез **деклараиия** или **експресия** е сравнително проста. Всички функции, декларирани чрез **function declaration**, се зареждат в паметта на програмата преди да започне нейното изпълнение, докато програмата разбира за функции, декларирани с **function expression** едва когато започне да се изпълнява и стигне до реда, на който е декларирана функцията.
-Даден метод може да бъде извикан от **няколко места** в нашата програма. Единият начин е да бъде извикан от **главния метод**.
+На практика това означава, че можете да **извикате функция**, декларирана с **function declaration** дори и в някои от предните редове - преди нейната декларация, докато ако опитате да направите това с **function expression** програмата ще ви **даде грешка**, че не разпознава тази функция по време на изпълнението.
-
+## Извикване на функции
-Метод може да бъде извикан и от **тялото на друг метод**, който **не** е главния метод на програмата ни.
+Извикването на функции представлява **стартирането на изпълнението на кода**, който се намира в **тялото на функцията**. Това става като изпишем **името** на функцията, последвано от кръглите скоби **`()`** и знака **`;`** за край на реда. Ето един пример:
-
+
-Съществува вариант методът да бъде извикан от **собственото си тяло**. Това се нарича **рекурсия** и можете да намерите повече информация за нея в [Wikipedia](https://bg.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F) или да потърсите сами в Интернет.
+Дадена функция може да бъде извикана от **няколко места** в нашата програма. Единият начин е да бъде извикана от **главната област на програмата** (global scope).
-Важно е да знаем, че ако един метод е деклариран в даден клас, то той може да бъде извикван преди реда, на който е деклариран.
+
+
+Функция може да бъде извикана и от **тялото на друга функция**, която **не** е главната област на програмата ни.
+
+
+
+Съществува вариант функцията да бъде извикана от **собственото си тяло**. Това се нарича **рекурсия** и можете да намерите повече информация за нея в [Wikipedia](https://bg.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F) или да потърсите сами в Интернет.
### Пример: празна касова бележка
-Да се напише метод, който печата празна касова бележка. Методът трябва да извиква други три метода: един за принтиране на заглавието, един за основната част на бележката и един за долната част.
+Да се напише функция, която печата празна касова бележка. Функцията трябва да извиква други три функции: една за принтиране на заглавието, една за основната част на бележката и една за долната част.
|Част от касовата бележка|Текст|
|---|---|
@@ -87,51 +105,61 @@
#### Насоки и подсказки
-Първата ни стъпка е да създадем **`void`** метод за **принтиране на заглавната част** от касовата бележка (header). Нека му дадем смислено име, което описва кратко и ясно задачата му, например **`PrintReceiptHeader`**. В тялото му ще напишем кода от примера по-долу:
+Първата ни стъпка е да създадем функция за **принтиране на заглавната част** от касовата бележка (header). Нека му дадем смислено име, което описва кратко и ясно задачата му, например **`printReceiptHeader`**. В тялото му ще напишем кода от примера по-долу:
-
+
-Съвсем аналогично ще създадем още два метода **за разпечатване на средната част** на бележката (тяло) **`PrintReceiptBody`** и **за разпечатване на долната част** на бележката (footer) **`PrintReceiptFooter`**.
+Съвсем аналогично ще създадем още два функции **за разпечатване на средната част** на бележката (тяло) **`printReceiptBody`** и **за разпечатване на долната част** на бележката (footer) **`printReceiptFooter`**.
-След това ще създадем и **още един метод**, който ще извиква трите метода, които написахме до момента един след друг:
+След това ще създадем и **още една функция**, която ще извиква трите функции, които написахме до момента една след друга:
-
+
-Накрая ще **извикаме** метода **`PrintReceipt`** от тялото на главния **`Main`** метод за нашата програма:
+Накрая ще **извикаме** функцията **`printReceipt`** от global scope-a на нашата програма:
-
+
#### Тестване в Judge системата
-Програмата с общо пет метода, които се извикват един от друг, е готова и можем **да я изпълним и тестваме**, след което да я пратим за проверка в judge системата: [https://judge.softuni.bg/Contests/Practice/Index/594#0](https://judge.softuni.bg/Contests/Practice/Index/594#0).
+Програмата с общо четири функции, които се извикват една от друга, е готова и можем **да я изпълним и тестваме**, след което да я пратим за проверка в judge системата: [https://judge.softuni.bg/Contests/Practice/Index/943#0](https://judge.softuni.bg/Contests/Practice/Index/943#0).
+
+## Функции с параметри
-## Методи с параметри
+Много често в практиката, за да бъде решен даден проблем, функцията, с чиято помощ постигаме това, се нуждае от **допълнителна информация**, която зависи от задачата ѝ. Именно тази информация представляват **параметрите на функцията** и нейното поведение зависи от тях.
-Много често в практиката, за да бъде решен даден проблем, методът, с чиято помощ постигаме това, се нуждае от **допълнителна информация**, която зависи от задачата му. Именно тази информация представляват **параметрите на метода** и неговото поведение зависи от тях.
+### Използване на параметри във функции
-### Използване на параметри в методите
+Ако функцията ни изисква **входни данни**, то те се подават в скобите **`()`**, като последователността на **фактическите параметри** трябва да съвпада с последователността на подадените при декларирането на функцията.
-Както отбелязахме по-горе, **параметрите освен нула на брой, могат също така да са един или няколко**. При декларацията им ги разделяме със запетая. Те могат да бъдат от всеки един тип (**`int`**, **`string`** и т.н.), а по-долу е показан пример как точно ще бъдат използвани от метода.
+Както отбелязахме по-горе, **параметрите освен нула на брой, могат също така да са един или няколко**. При декларацията им ги разделяме със запетая.
-**Декларираме** метода и **списъка** му с **параметри**, след което пишем кода, който той ще изпълнява.
+**Декларираме** функцията `printNumbers` и **списъка** с **параметри**, от които тя се нуждае, за да работи коректно, след което пишем кода, който ще изпълнява.
-
+
-След това **извикваме** метода и му **подаваме конкретни стойности**:
+След това **извикваме** функцията, като ѝ **подаваме конкретни стойности**:
-
+
-При **декларирането на параметри** можем да използваме **различни** типове променливи, като трябва да внимаване всеки един параметър да има **тип** и **име**. Важно е да отбележим, че при последващото извикване на метода, трябва да подаваме **стойности** за параметрите по **реда**, в който са **декларирани** самите те. Ако имаме подадени параметри в реда **`int`** и след това **`string`**, при извикването му не можем да подадем първо стойност за **`string`** и след това за **`int`**. Единствено можем да разменяме местата на подадените параметри, ако изрично изпишем преди това името на параметъра, както ще забележим малко по-нататък в един от примерите. Това като цяло не е добра практика!
+При **декларирането на параметри** трябва да внимаване всеки един параметър да има **име**. Важно е при извикване на функцията, да подаваме **стойности** за параметрите по **реда**, в който са **декларирани** самите те. В примера, който разгледахме на променливата `start` ще бъде присвоена стойността на първият подаден параметър - в нашият случай числото 5. На променливата `end` ще бъде присвоена стойността на вторият параметър, който сме подали - в случая числото 10.
+Важно е да се отбележи, че в езикът **JavaScript** декларирането на функция с даден **брой параметри**, не ни задължава да извикваме функцията със **същият брой параметри**. Можем да извикаме функция като и подадем както **повече**, така и **по - малко** параметри, като това няма да доведе до грешка.
+Нека разгледаме следния пример:
+
+
+
+В случая извикваме функцията **`printNumbers`** като и подаваме 4, вместо **декларираните** 2 параметъра. Всички излишни параметри ще бъдат **игнорирани**. Т.е. числата 15 и 20, няма да стигнат до функцията, защото нямаме **деклариран параметър**, който да ги приеме.
-Нека разгледаме примера за декларация на метод, който има няколко параметъра от различен тип.
+Нека разгледаме още един пример:
-
+
+
+В случая извикваме функцията **`printNumbers`** като и подаваме 1, вместо **декларираните** 2 параметъра. Всички параметри, за които **не е подадена стойност**, ще получат автоматично стойност **`undefined`**. В нашият случай променливата **`secondNumber`** ще има стойност **`undefined`**.
### Пример: знак на цяло число
-Да се създаде метод, който печата знака на цяло число n.
+Да се създаде функция, която печата знака на цяло число n.
#### Примерен вход и изход
@@ -143,36 +171,38 @@
#### Насоки и подсказки
-Първата ни стъпка е **създаването** на метод и даването му на описателно име, например **`PrintSign`**. Този метод ще има само един параметър от тип **`int`**.
+Първата ни стъпка е **декларирането** на функция и даването ѝ на описателно име, например **`printSign`**. Тази функция ще има само един параметър.
-
+
-Следващата ни стъпка е **имплементирането** на логиката, по която програмата ни ще проверява какъв точно е знакът на числото. От примерите виждаме, че има три случая - числото е по-голямо от нула, равно на нула или по-малко от нула, което означава, че ще направим три проверки в тялото на метода.
+Следващата ни стъпка е **имплементирането** на логиката, по която програмата ни ще проверява какъв точно е знакът на числото. От примерите виждаме, че има три случая - числото е по-голямо от нула, равно на нула или по-малко от нула, което означава, че ще направим три проверки в тялото на функцията.
-Следващата ни стъпка е да прочетем входното число и да извикаме новия метод от тялото на **`Main`** метода.
+Следващата ни стъпка е да извикаме функцията, която създадохме.
-
+
#### Тестване в Judge системата
-Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/594#1](https://judge.softuni.bg/Contests/Practice/Index/594#1).
+Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/943#1](https://judge.softuni.bg/Contests/Practice/Index/943#1).
### Незадължителни параметри
-Езикът JavaScript поддържа използването на **незадължителни** параметри. Те позволяват **пропускането** на параметри при извикването на метода. Декларирането им става чрез **осигуряване на стойност по подразбиране** в описанието на съответния параметър.
+Езикът JavaScript поддържа използването на **незадължителни** параметри. Те позволяват **пропускането** на параметри при извикването на функцията. Декларирането им става чрез **осигуряване на стойност по подразбиране** в описанието на съответния параметър.
Следващият пример онагледява употребата на незадължителните параметри:
-
+
+
+Показаната функция **`printNumbers`** може да бъде извикана по няколко начина:
-Показаният метод **`PrintNumbers`** може да бъде извикан по няколко начина:
+
-
+При липсата на **подадена стойност** на параметър, той ще **приеме стойността**, с която сме го **декларирали** при декларацията на функцията.
### Пример: принтиране на триъгълник
-Да се създаде метод, който принтира триъгълник, както е показано в примерите.
+Да се създаде функция, която принтира триъгълник, както е показано в примерите.
#### Примерен вход и изход
@@ -182,27 +212,27 @@
#### Насоки и подсказки
-Преди да създадем метод за принтиране на един ред с дадени начало и край, прочитаме входното число от конзолата. След това избираме смислено име за метода, което описва целта му, например **`PrintLine`**, и го имплементираме.
+Избираме смислено име за функцията, което описва целта ѝ, например **`printLine`**, и го имплементираме.
-
+
От задачите за рисуване на конзолата си спомняме, че е добра практика **да разделяме фигурата на няколко части**. За наше улеснение ще разделим триъгълника на три части - горна, средна линия и долна.
Следващата ни стъпка е с цикъл да разпечатаме **горната половина** от триъгълника:
-
+
След това разпечатваме **средната линия**:
-
+
Накрая разпечатваме **долната част** от триъгълника, като този път стъпката на цикъла намалява.
-
+
#### Тестване в Judge системата
-Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/594#2](https://judge.softuni.bg/Contests/Practice/Index/594#2).
+Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/943#2](https://judge.softuni.bg/Contests/Practice/Index/943#2).
### Пример: рисуване на запълнен квадрат
@@ -217,88 +247,77 @@
#### Насоки и подсказки
-Първата ни стъпка е да прочетем входа от конзолата. След това трябва да създадем метод, който ще принтира първия и последен ред, тъй като те са еднакви. Нека не забравяме, че трябва да му дадем **описателно име** и да му зададем като **параметър** дължината на страната. Ще използваме конструктора **`new string`**.
+Създаваме функция, която ще принтира първия и последен ред, тъй като те са еднакви. Нека не забравяме, че трябва да му дадем **описателно име** и да му зададем като **параметър** дължината на страната. Ще използваме вградената функция **`repeat`**.
-
+
-Следващата ни стъпка е да създадем метод, който ще рисува на конзолата средните редове. Отново задаваме описателно име, например **`PrintMiddleRow`**.
+Следващата ни стъпка е да създадем функция, която ще рисува на конзолата средните редове. Отново задаваме описателно име, например **`printMiddleRow`**.
-
+
-Накрая извикваме създадените методи в главния метод **`Main()`** на програмата, за да нарисуваме целия квадрат:
+Накрая извикваме създадените функции за да нарисуваме целия квадрат:
-
+
#### Тестване в Judge системата
-Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/594#3](https://judge.softuni.bg/Contests/Practice/Index/594#3).
-
-
-## Връщане на резултат от метод
-
-До момента разгледахме методи, които извършват дадено действие, например отпечатване на даден текст, число или фигура на конзолата. Освен този тип методи, съществуват и такива, които могат да **връщат** някакъв **резултат**. Именно тези методи ще разгледаме в следващите редове.
-
-### Типове на връщаната от метода стойност
+Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/943#3](https://judge.softuni.bg/Contests/Practice/Index/943#3).
-До сега разглеждахме примери, в които при декларация на методи използвахме ключовата дума **`void`**, която указва, че методът **не** връща резултат, а изпълнява определено действие.
-
+## Връщане на резултат от функция
-Ако **заместим** **`void`** с **тип** на променлива, то това ще укаже на програмата, че метода трябва да върне някаква стойност от указания тип. Тази върната стойност може да бъде от всякакъв тип – **`int`**, **`string`**, **`double`** и т.н.
+До момента разгледахме функции, които извършват дадено действие, например отпечатване на даден текст, число или фигура на конзолата. Освен този тип функции, съществуват и такива, които могат да **връщат** някакъв **резултат** от своето изпълнение - например резултатът от умножението на две числа. Именно тези функции ще разгледаме в следващите редове.
-
- | За да върне един метод резултат е нужно да внимаваме да напишем очаквания тип на резултата при декларацията на метода на мястото на void . |
-
+### Оператор return
-
+За да получим резултат от функцията, на помощ идва операторът **`return`**. Той трябва да бъде **използван в тялото** на функцията и указва на програмата да **спре изпълнението** на функцията и да **върне** на извиквача определена **стойност**. Тази стойност се определя от израза след въпросния оператор **`return`**.
-Важно е да отбележим, че **резултатът**, който се връща от метода, може да е от **тип, съвместим с типа на връщаната стойност** на метода. Например, ако декларираният тип на връщаната стойност е **`double`**, то можем да върнем резултат от тип **`int`**.
+В примера по-долу имаме **функция**, която получава име и фамилия като **параметри**, съединява ги и **връща** като резултат пълното име.
-### Оператор return
+
-За да получим резултат от метода, на помощ идва операторът **`return`**. Той трябва да бъде **използван в тялото** на метода и указва на програмата да **спре изпълнението** му и да **върне** на извиквача на метода определена **стойност**, която се определя от израза след въпросния оператор **`return`**.
+**Има случаи**, в които **`return`** може да бъде извикван от няколко места във функцията, но само ако има **определени** входни условия.
-В примера по-долу имаме метод, който чете две имена от конзолата, съединява ги и ги връща като резултат. Връщаната стойност е от тип **`string`**:
+В примера по-долу имаме функция, която сравнява две числа и **връща** резултат съответно **`-1`**, **`0`** или **`1`** според това дали първият аргумент е по-малък, равен или по-голям от втория аргумент, подаден на функцията. Функцията използва ключовата дума **`return`** на три различни места, за да върне три различни стойности според логиката на сравненията на числата:
-
+
-Операторът **`return`** може да бъде използван и във **`void`** методи. Тогава самият метод ще спре изпълнението си, без да връща никаква стойност, а след него не трябва да има израз, който да бъде върнат. В този случай употребата на **`return`** е единствено за излизане от метода.
+#### Кодът след return е недостъпен
-**Има случаи**, в които **`return`** може да бъде извикван от няколко места в метода, но само ако има **определени** входни условия.
+В случай, че **return** операторът не се намира в условна конструкция като `if`, след него, в текущия блок, **не** трябва да има други редове код, тъй като тогава Visual Studio Code ще покаже предупреждение, съобщавайки ни, че е засякъл код, който **не може да бъде достъпен**:
-В примера по-долу имаме метод, който сравнява две числа и връща резултат съответно **`-1`**, **`0`** или **`1`** според това дали първият аргумент е по-малък, равен или по-голям от втория аргумент, подаден на функцията. Методът използва ключо-вата дума **`return`** на три различни места, за да върне три различни стойности според логиката на сравненията на числата:
+
-
+Операторът **`return`** може да бъде използван и без да бъде специфицирана **конкретна стойност**, която да бъде върната. В този случай, просто ще бъде **прекратено** изпълнението на кода във функцията и ще бъде върната стойност по подразбиране **`undefined`**.
-#### Кодът след return е недостъпен
+-----
-След **`return`** оператора, в текущия блок, **не** трябва да има други редове код, тъй като тогава Visual Studio ще покаже предупреждение, съобщавайки ни, че е засякъл код, който **не може да бъде достъпен**:
+В посоченият пример...
-
| В програмирането не може да има два пъти оператор return един след друг, защото изпълнението на първия няма да позволи да се изпълни вторият. Понякога програмистите се шегуват с фразата “пиши return; return; и да си ходим”, за да обяснят, че логиката на програмата е объркана. |
-### Употреба на връщаната от метода стойност
+### Употреба на върнатата от функцията стойност
-След като даден метод е изпълнен и върне стойност, то тази стойност може да се използва по **няколко** начина.
+След като дадена функция е изпълнена и върне стойност, то тази стойност може да се използва по **няколко** начина.
-Първият е да **присвоим резултата като стойност на променлива** от съвместим тип:
+Първият е да **присвоим резултата като стойност на променлива**:
-
+
Вторият е резултатът да бъде използван **в израз**:
-
+
-Третият е да **подадем** резултата от работата на метода към **друг метод**:
+Третият е да **подадем** резултата от работата на функцията към **друга функция**:
-
+
### Пример: пресмятане на лицето на триъгълник
-Да се напише метод, който изчислява лицето на триъгълник по дадени основа и височина и връща стойността му.
+Да се напише функция, която изчислява лицето на триъгълник по дадени основа и височина и връща стойността му.
#### Примерен вход и изход
@@ -308,22 +327,22 @@
#### Насоки и подсказки
-Първата ни стъпка е да прочетем входа. След това **създаваме** метод, но този път внимаваме при **декларацията** да подадем коректния **тип** данни, които искаме метода да върне, а именно **`double`**.
+**Създаваме** функция, с коректно име.
-
+
-Следващата ни стъпка е да **извикаме новия** метод от нашия **`Main()`** метод и да **запишем върнатата стойност в подходяща променлива**.
+Следващата ни стъпка е да **извикаме новата** функция и да **запишем върнатата стойност в подходяща променлива**.
-
+
#### Тестване в Judge системата
-Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/594#4](https://judge.softuni.bg/Contests/Practice/Index/594#4).
+Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/943#4](https://judge.softuni.bg/Contests/Practice/Index/943#4).
### Пример: степен на число
-Да се напише метод, който изчислява и връща резултата от повдигането на число на дадена степен.
+Да се напише функция, която изчислява и връща резултата от повдигането на число на дадена степен.
#### Примерен вход и изход
@@ -333,183 +352,116 @@
#### Насоки и подсказки
-Първата ни стъпка отново ще е да прочетем входните данни от конзолата. Следващата стъпка е да създадем метод, който ще приема два параметъра (числото и степента) и ще връща като резултат число от тип **`double`**.
+Първата ни стъпка отново ще е да създадем функция, която ще приема два параметъра (числото и степента) и ще връща като резултат числото повдигнато на съответната степен.
-
+
-След като сме направили нужните изчисления, ни остава да разпечатаме резултата в главния метод **`Main()`** на програмата.
+След като сме направили нужните изчисления, ни остава да извикаме декларираната функция.
#### Тестване в Judge системата
-Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/594#5](https://judge.softuni.bg/Contests/Practice/Index/594#5).
-
-
-### Методи, връщащи няколко стойности
-
-[TODO: да се редактира и адаптира за JS]
-В практиката се срещат случаи, в които се нуждаем даден метод да върне повече от един елемент като резултат. За да е възможен подобен сценарий във Visual Studio Code и JavaScript (от ES6 нататък) е интегриран стойностният тип **`ValueTuple`**, както и литерал от тип **`ValueTuple`**. Накратко типът **`ValueTuple`** представлява съвкупност от две стойности, позволяващи временното съхранение на **множество стойности**. Стойностите биват съхранявани в променливи (полета - какво са полета, ще разгледаме на по-късен етап) от съответните типове. Въпреки, че типът **`Tuple`** съществува и преди C# 7, той не е добре поддържан от езика в предишните му версии и е неефективен. Затова в предходните версии на езика C# елементите в един **`Tuple`** са представяни като **`Item1`**, **`Item2`** и т.н. и имената на техните променливи (променливите, в които се съхраняват) е било невъзможно да бъдат променяни. В C# 7 е въведена поддръжка на типа (**`ValueTuple`**), което позволява задаване на смислови имена на елементите в един **`ValueTuple`**.
-
-#### Деклариране на ValueTuple
-
-Нека разгледаме примерна декларация на променлива от тип **`ValueTuple`**:
-
-```javascript
-var personInfo = (name: "Steeve", age: 27, "Bulgaria");
-```
-
-За улеснение при декларирането използваме ключовата дума **`var`**, а в скобите изброяваме **имената на желаните стойности**, следвани от **самите стойности**. Нека погледнем и в дебъг режим какво се съдържа в променливата **`personInfo`**:
-
-
-
-Виждаме, че се състои от няколко **полета с имена и стойности**, описани при инициализацията на променливата. Забелязваме, че последната променлива е именувана **`Item3`**. Това е така, защото по време на инициализацията не сме уточнили име за променливата, в която се пази стойността **"Bulgaria"**. В такъв случай именуването е **по подразбиране**, т.е. променливите са именувани с **`Item1`**,** `Item2`**, **`Item3`** и т.н.
+Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/943#5](https://judge.softuni.bg/Contests/Practice/Index/943#5).
-#### Метод, връщащ няколко стойности
-Следният метод приема за параметри две целочислени числа (**`x`** и **`y`**) и **връща две стойности** - резултата от целочислено деление на двете числа и остатъка от делението им:
+### Функции, връщащи няколко стойности
-```javascript
-static (int result, int reminder) Divide(int x, int y)
-{
- int result = x / y;
- int reminder = x % y;
-
- return (result, reminder);
-}
-```
-
-Този метод връща резултат от тип **`ValueTuple`**, съдържащ две променливи (полета) от тип **`int`**, съответно именувани **`result`** и **`reminder`**. Извикването на метода се осъществява по следния начин:
-
-```javascript
-var division = Divide(1, 3);
-```
-
-За да достъпим резултатите, върнати от метода, прилагаме **точковата нотация към променливата** **`division`**:
+В практиката се срещат случаи, в които се нуждаем дадена функция да върне повече от един елемент като резултат. В езикът **JavaScript** има 2 начина по които може да бъде постигнато това - чрез **деструкция** и чрез **връщане на обект**.
-
+#### Деструкция
-## Варианти на методи
+Когато желаем функция да върне **повече от една стойност**, използваме ключовата думичка **`return`**, след което изброяваме всички стойности, които желаем да върнем, като ги ограждаме в квадратни скоби - **`[`**, **`]`**:
-В много езици за програмиране един и същ метод може да е деклариран в **няколко варианта** с еднакво име и различни параметри. Това е известно с термина “**method overloading**”. Сега нека разгледаме как се пишат тези overloaded methods.
+
-### Сигнатура на метода
+След това за да получим върнатите стойности, отново на помощ идват квадратните скоби. Изброяваме параметри, които да получат тези стойности, като присвояването ще стане по реда, по който стойностите са върнати:
-В програмирането **начинът**, по който се **идентифицира** един метод, е чрез **двойката елементи** от декларацията му – **име** на метода и **списък** от неговите параметри. Тези два елемента определят неговата **спецификация**, т. нар. **сигнатура** на метода.
+
-
+В горният пример променливата `name` ще получи стойността "John Doe", която е първата върната стойност от функцията `getNames`, а `fullName` ще получи "John Silver Doe", която е втората върната стойност.
-В този пример сигнатурата на метода е неговото име (**`Print`**), както и неговият параметър (**`string text`**).
+#### Обекти
-Ако в програмата ни има **методи с еднакви имена**, но с **различни сигнатури**, то казваме, че имаме **варианти на методи (method overloading)**.
+Този подход е много подобен на предния, като разликата е, че не просто **изброяваме** стойностите, които искаме да върнем, но и им даваме **имена**. **Обектите** са изключително важна и основна част от езика **JavaScript**. За сега е достатъчно да знаете, че се декларират с фигурните скоби **`{`** **`}`**, като между тях изброяваме **името** на стойността (нарича се **ключ**), последвано от знака две точки - **`:`** и самата стойност. Разделяме отделните двойки **ключ-стойност** със символа `,`.
-### Варианти на методи
+
-Както споменахме, ако използваме **едно и също име за няколко метода с различни сигнатури**, то това означава, че имаме **варианти на метод**. Кодът по-долу показва как три различни метода могат да са с едно и също име, но да имат различни сигнатури и да изпълняват различни действия.
+В този пример връщаме обект, който държи 2 стойности - `name` и `fullName`.
-
+
-### Сигнатура и тип на връщаната стойност
-Важно е да отбележим, че **връщаният тип като резултат** на метода **не е част от сигнатурата му**. Ако връщаната стойност беше част от сигнатурата на метода, то няма как компилаторът да знае кой метод точно да извика.
+Тук променливата `personNames` ще получи всички върнати стойности. Като `name` и `fullName` са част от тези стойности и могат да бъдат достъпени със символа `.`.
-Нека разгледаме следния пример - имаме два метода с различен тип на връщаната стойност. Въпреки това Visual Studio ни показва, че има грешка, защото сигнатурите и на двата са еднакви. Съответно при опит за извикване на метод с име **`Print(…)`**, компилаторът не би могъл да прецени кой от двата метода да изпълни.
+
-
-
-### Пример: по-голямата от две стойности
-
-Като входни данни са дадени две стойности от един и същ тип. Стойностите могат да са от тип **`int`**, **`char`** или **`string`**. Да се създаде метод **`GetMax()`**, който връща като резултат по-голямата от двете стойности.
-
-#### Примерен вход и изход
-
-|Вход|Изход|Вход|Изход|Вход|Изход|
-|---|---|---|---|---|---|
-|int
2
16|16|char
a
z|z|string
Ivan
Todor|Todor|
-
-#### Насоки и подсказки
+## Варианти на функции
-За да създадем този метод, първо трябва да създадем три други метода с едно и също име и различни сигнатури. Първо създаваме метод, който ще сравнява цели числа.
+В много езици за програмиране едина и съща функция може да е декларирана в **няколко варианта** с еднакво име и различни параметри. Това е известно с термина “**method overloading**”. За добро или лошо **JavaScript** не поддържа тази възможност.
-
+Когато декларирате **две или повече функции с еднакви имена**, програмата ще използва **последно декларираната** такава. Декларирайки втора функция със същото име, вие реално премахвате старата функция и записвате на нейно място новата.
-Следвайки логиката от предходния метод, създаваме такъв със същото име, който обаче ще сравнява символи.
-
-
-
-Следващият метод, който трябва да създадем, ще сравнява низове. Тук логиката ще е малко по-различна, тъй като стойностите от тип **`string`** не позволяват да бъдат сравнявани чрез операторите **`<`** и **`>`**. Ще използваме метода **`CompareTo(…)`**, който връща числова стойност: по-голяма от 0 (сравняваният обект е по-голям), по-малка от 0 (сравняваният обект е по-малък) и 0 (при два еднакви обекта).
-
-
-
-Последната стъпка е да прочетем входните данни, да използваме подходящи променливи и да извикаме метода **`GetMax()`** от тялото на метода **`Main()`**.
-
-
-
-#### Тестване в Judge системата
-
-Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/594#6](https://judge.softuni.bg/Contests/Practice/Index/594#6).
-
-
-## Вложени методи (локални функции)
+## Вложени функции
Нека разгледаме следния пример:
-
+
### Какво е локална функция?
-[TODO: да се редактира и адаптира за JS]
-
-Виждаме, че в този код, в главния метод **`Main()`** има **друг** деклариран метод **`Result()`**. Такъв **вложен** метод се нарича **локална** функция и е нововъведение в C# 7. Локалните функции могат да се декларират във всеки един друг метод. Когато C# компилаторът компилира такива функции, те биват превърнати в private методи. Тъй като разликата между **`public`** и **`private`** методи се изучава на по-късен етап, за момента ще отбележим, че **`private`** методите могат да се използват само в класа, в който са декларирани. Програмите, които пишем на това ниво, използват само един клас, затова и приемаме, че можем да използваме вложените методи без каквито и да било притеснения.
+Виждаме, че в този код, в нашата функция **`solve()`** има **другa** декларирана функция **`sum()`**. Такъвa **вложенa** функция се нарича **локална** функция. Локалните функции могат да се декларират във всяка една друга функция.
### Защо да използваме локални функции?
-С времето и практиката ще открием, че когато пишем код, често се нуждаем от методи, които бихме използвали само един път, или пък нужният ни метод става твърде дълъг. По-нагоре споменахме, че когато един метод съдържа в себе си прекалено много редове код, то той става труден за поддръжка и четене. В тези случаи на помощ идват локалните функции - те предоставят възможност в даден метод да се декларира друг метод, който ще бъде използван например само един път. Това спомага кода ни да е по-добре подреден и по-лесно четим, което от своя страна спомага за по-бърза корекция на евентуална грешка в кода и намалява възможността за грешки при промени в програмната логика.
+С времето и практиката ще открием, че когато пишем код, често се нуждаем от функции, които бихме използвали само един път, или пък нужната ни функция става твърде дълга. По-нагоре споменахме, че когато една функция съдържа в себе си прекалено много редове код, то той става труден за поддръжка и четене. В тези случаи на помощ идват локалните функции - те предоставят възможност в дадена функция да се декларира друга функция, която ще бъде използвана например само един път. Това спомага кода ни да е по-добре подреден и по-лесно четим, което от своя страна спомага за по-бърза корекция на евентуална грешка в кода и намалява възможността за грешки при промени в програмната логика.
### Деклариране на локални функции
Нека отново разгледаме примера от по-горе.
-
+
-В този пример, методът **`Result()`** е локална функция, тъй като е вложен в метода **`Main()`**, т.е. **`Result()`** е локален за **`Main()`**. Това означава, че методът **`Result()`** може да бъде използван само в метода **`Main()`**, тъй като е деклариран в него. Единствената разлика между вложените методи и обикновените методи е, че вложените методи не могат да бъдат **`static`**. Тъй като дефиницията за **`static`** метод се разглежда на по-късен етап, за момента ще приемем, че при декларирането на една локална функция, изписваме единствено типa на връщаната стойност, името на метода и списъка му с параметри. В конкретния разглеждан случай, това е **`double Result(double a, double b)`**.
+В този пример, функцията **`sum()`** е локална функция, тъй като е вложена във функцията **`solve()`**, т.е. **`sum()`** е локална за **`solve()`**. Това означава, че функцията **`sum()`** може да бъде използван **само** във функцията **`solve()`**, тъй като е **декларирана в нея**.
-Локалните функции имат достъп до променливи, които се използват в съдържащия ги метод. Следващият пример демонстрира как се случва това.
+Локалните функции имат достъп до променливи, които са декларирани на същото или по - горно ниво като тях. Следващият пример демонстрира как се случва това.
-
+
-Тази особеност на вложените методи ги прави много удобни помощници при решаването на дадена задача. Те спестяват време и код, които иначе бихме вложили, за да предаваме на вложените методи параметри и променливи, които се използват в методите, в които са вложени.
+Тази особеност на вложените функции ги прави много удобни помощници при решаването на дадена задача. Те спестяват време и код, които иначе бихме вложили, за да предаваме на вложените функции параметри и променливи, които се използват във функциите, в които са вложени.
-## Именуване на методи. Добри практики при работа с методи
+## Именуване на функции. Добри практики при работа с функции
-В тази част ще се запознаем с някои **утвърдени практики** при работа с методи, свързани с именуването, подредбата на кода и неговата структура.
+В тази част ще се запознаем с някои **утвърдени практики** при работа с функции, свързани с именуването, подредбата на кода и неговата структура.
-### Именуване на методи
+### Именуване на функции
-Когато именуваме даден метод е препоръчително да използваме **смислени имена**. Тъй като всеки метод **отговаря** за някаква част от нашия проблем, то при именуването му трябва да вземем предвид **действието, което той извършва**, т.е. добра практика е **името да описва неговата цел**.
+Когато именуваме дадена функция е препоръчително да използваме **смислени имена**. Тъй като всяка функция **отговаря** за някаква част от нашия проблем, то при именуването ѝ трябва да вземем предвид **действието, което тя извършва**, т.е. добра практика е **името да описва целта**.
-Задължително е името да започва с **главна буква** и трябва да е съставено от глагол или от двойка: глагол + съществително име. Форматирането на името става, спазвайки **Upper Case Camel** конвенцията, т.е. **всяка дума, включително първата, започва с главна буква**. Кръглите скоби **`( `** и **`)`** винаги следват името му.
+Задължително е името да започва с **малка буква** и трябва да е съставено от глагол или от двойка: глагол + съществително име. Форматирането на името става, спазвайки **Lower Camel Case** конвенцията, т.е. **всяка дума, с изключение на първата, започва с главна буква**. Кръглите скоби **`( `** и **`)`** винаги следват името на функцията.
-Всеки метод трябва да изпълнява самостоятелна задача, а името на метода трябва да описва каква е неговата функция.
+Всяка функция трябва да изпълнява самостоятелна задача, а името на функцията трябва да описва каква е неговата роля.
-Няколко примера за **коректно** именуване на методи:
-* **`FindStudent`**
-* **`LoadReport`**
-* **`Sine`**
+Няколко примера за **коректно** именуване на функции:
+* **`findStudent`**
+* **`loadReport`**
+* **`sine`**
-Няколко примера за **лошо** именуване на методи:
-* **`Method1`**
-* **`DoSomething`**
-* **`HandleStuff`**
-* **`SampleMethod`**
-* **`DirtyHack`**
+Няколко примера за **лошо** именуване на функции:
+* **`method1`**
+* **`doSomething`**
+* **`handleStuff`**
+* **`sampleMethod`**
+* **`dirtyHack`**
+* **`FindStudent`**
+* **`LoadReport`**
-Ако не можем да измислим подходящо име, то най-вероятно методът решава повече от една задача или няма ясно дефинирана цел и тогава трябва да помислим как да го разделим на няколко отделни метода.
+Ако не можем да измислим подходящо име, то най-вероятно функцията решава повече от една задача или няма ясно дефинирана цел и тогава трябва да помислим как да я разделим на няколко отделни функции.
-### Именуване на параметрите на методите
+### Именуване на параметрите на функциите
-При именуването на **параметрите** на метода важат почти същите правила, както и при самите методи. Разликите тук са, че за имената на параметрите е добре да използваме съществително име или двойка от прилагателно и съществително име, както и че при именуване на параметрите се спазва **`lowerCamelCase`** конвенцията, т.е. **всички думи без първата започват с главна буква**. Трябва да отбележим, че е добра практика името на параметъра да **указва** каква е **мерната единица**, която се използва при работа с него.
+При именуването на **параметрите** на функцията важат почти същите правила, както и при самите функции. Разликите тук са, че за имената на параметрите е добре да използваме съществително име или двойка от прилагателно и съществително име. Трябва да отбележим, че е добра практика името на параметъра да **указва** каква е **мерната единица**, която се използва при работа с него.
-Няколко примера за **коректно** именуване на параметри на методи:
+Няколко примера за **коректно** именуване на параметри на функции:
* **`firstName`**
* **`report`**
* **`speedKmH`**
@@ -525,50 +477,50 @@ var division = Divide(1, 3);
* **`LastName`**
* **`last_name`**
-### Добри практики при работа с методи
+### Добри практики при работа с функции
-Нека отново припомним, че един метод трябва да изпълнява **само една** точно определена **задача**. Ако това не може да бъде постигнато, тогава трябва да помислим как да **разделим** метода на няколко отделни такива. Както казахме, името на метода трябва точно и ясно да описва неговата цел. Друга добра практика в програмирането е да **избягваме** методи, по-дълги от екрана ни (приблизително). Ако все пак кода стане много обемен, то е препоръчително метода да се **раздели** на няколко по-кратки, както в примера по-долу.
+Нека отново припомним, че едина функция трябва да изпълнява **само една** точно определена **задача**. Ако това не може да бъде постигнато, тогава трябва да помислим как да **разделим** функцията на няколко отделни такива. Както казахме, името на функцията трябва точно и ясно да описва неговата цел. Друга добра практика в програмирането е да **избягваме** функции, по-дълги от екрана ни (приблизително). Ако все пак кода стане много обемен, то е препоръчително функцията да се **раздели** на няколко по-кратки, както в примера по-долу.
-
+
### Структура и форматиране на кода
-При писането на методи трябва да внимаваме да спазваме коректна **индентация** (отместване по-навътре на блокове от кода).
+При писането на функции трябва да внимаваме да спазваме коректна **индентация** (отместване по-навътре на блокове от кода).
Пример за **правилно** форматиран JavaScript код:
-
+
Пример за **некоректно** форматиран JavaScript код:
-
+
-Когато заглавният ред на метода е **твърде дълъг**, се препоръчва той да се раздели на няколко реда, като всеки ред след първия се отмества с две табулации надясно (за по-добра четимост):
+Когато заглавният ред на функцията е **твърде дълъг**, се препоръчва той да се раздели на няколко реда, като всеки ред след първия се отмества с две табулации надясно (за по-добра четимост):
-
+
-Друга добра практика при писане на код е да **оставяме празен ред** между методите, след циклите и условните конструкции. Също така, опитвайте да **избягвате** да пишете **дълги редове и сложни изрази**. С времето ще установите, че това подобрява четимостта на кода и спестява време.
+Друга добра практика при писане на код е да **оставяме празен ред** между функциите, след циклите и условните конструкции. Също така, опитвайте да **избягвате** да пишете **дълги редове и сложни изрази**. С времето ще установите, че това подобрява четимостта на кода и спестява време.
Препоръчваме винаги да се **използват къдрави скоби за тялото на проверки и цикли**. Скобите не само подобряват четимостта, но и намалят възможността да бъде допусната грешка и програмата ни да се държи некоректно.
## Какво научихме от тази глава?
-В тази глава се запознахме с базовите концепции при работа с методи:
-* Научихме, че **целта** на методите е да **разделят** големи програми с много редове код на по-малки и кратки задачи.
-* Запознахме се със **структурата** на методите, как да ги **декларираме** и **извикваме** по тяхното име.
-* Разгледахме примери за методи с **параметри** и как да ги използваме в нашата програма.
-* Научихме какво представляват **сигнатурата** и **връщаната стойност** на метода, както и каква е функцията на оператора **`return`** в методите.
-* Запознахме се с **добрите практики** при работа с методи, как да именуваме методите и техните параметри, как да форматираме кода и други.
+В тази глава се запознахме с базовите концепции при работа с функции:
+* Научихме, че **целта** на функциите е да **разделят** големи програми с много редове код на по-малки и кратки задачи.
+* Запознахме се със **структурата** на функциите, как да ги **декларираме** и **извикваме** по тяхното име.
+* Разгледахме примери за функции с **параметри** и как да ги използваме в нашата програма.
+* Научихме какво представляват **сигнатурата** и **връщаната стойност** на функцията, както и каква е ролята на оператора **`return`**.
+* Запознахме се с **добрите практики** при работа с функции, как да именуваме функциите и техните параметри, как да форматираме кода и други.
## Упражнения
-За да затвърдим работата с методи, ще решим няколко задачи. В тях се изисква да напишете метод с определена функционалност и след това да го извикате като му подадете данни, прочетени от конзолата, точно както е показано в примерния вход и изход.
+За да затвърдим работата с функции, ще решим няколко задачи. В тях се изисква да напишете функция с определена функционалност и след това да я извикате като ѝ подадете данни, точно както е показано в примерния вход и изход.
### Задача: "Hello, Име!"
-Да се напише метод, който получава като параметър име и принтира на конзолата "*Hello, \!*".
+Да се напише функция, която получава като параметър име и принтира на конзолата "*Hello, \!*".
#### Примерен вход и изход
@@ -578,16 +530,16 @@ var division = Divide(1, 3);
#### Насоки и подсказки
-Дефинирайте метод **`PrintName(string name)`** и го имплементирайте, след което в главната програма прочетете от конзолата име на човек и извикайте метода като му подадете прочетеното име.
+Дефинирайте функция **`printName(name)`** и го имплементирайте. Да се напише функция **`solve`**, която получава като входни данни име на човек и извиква `printName` функцията като подава прочетеното име.
#### Тестване в Judge системата
-Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/594#7](https://judge.softuni.bg/Contests/Practice/Index/594#7).
+Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/943#7](https://judge.softuni.bg/Contests/Practice/Index/943#7).
### Задача: по-малко число
-Да се създаде метод **`GetMin(int a, int b)`**, който връща по-малкото от две числа. Да се напише програма, която чете като входни данни от конзолата три числа и печата най-малкото от тях. Да се използва метода **`GetMin(…)`**, който е вече създаден.
+Да се създаде функция **`getMin(a, b)`**, която връща по-малкото от две числа. Да се напише функция **`solve`**, която получава като входни данни три числа и печата най-малкото от тях. Да се използва функцията **`getMin(…)`**, която е вече създадена.
#### Примерен вход и изход
@@ -597,20 +549,22 @@ var division = Divide(1, 3);
#### Насоки и подсказки
-Дефинирайте метод **`GetMin(int a, int b)`** и го имплементирайте, след което го извикайте от главната програма както е показано по-долу. За да намерите минимума на три числа, намерете първо минимума на първите две от тях и след това минимума на резултата и третото число:
+Дефинирайте функция **`getMin(int a, int b)`** и я имплементирайте, след което я извикайте от функцията **`solve`** както е показано по-долу. За да намерите минимума на три числа, намерете първо минимума на първите две от тях и след това минимума на резултата и третото число:
```javascript
-var min = GetMin(GetMin(num1, num2), num3);
+function solve([num1, num2, num3]) {
+ let min = getMin(getMin(num1, num2), num3);
+}
```
#### Тестване в Judge системата
-Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/594#8](https://judge.softuni.bg/Contests/Practice/Index/594#8).
+Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/943#8](https://judge.softuni.bg/Contests/Practice/Index/943#8).
### Задача: повтаряне на низ
-Да се напише метод **`RepeatString(str, count)`**, който получава като параметри променлива от тип **`string`** и цяло число **`n`** и връща низа, повторен **`n`** пъти. След това резултатът да се отпечата на конзолата.
+Да се напише функция **`repeatString(str, count)`**, която получава като параметри стрингова променлива **`str`** и цяло число **`n`** и връща низа, повторен **`n`** пъти. След това резултатът да се отпечата на конзолата.
#### Примерен вход и изход
@@ -620,22 +574,18 @@ var min = GetMin(GetMin(num1, num2), num3);
#### Насоки и подсказки
-Допишете метода по-долу като добавите съединяването входния низ към резултата в цикъла:
-
-
+Допишете функцията по-долу като добавите входния низ към резултата в цикъла:
-[TODO: да се редактира и адаптира за JS]
-
-Имайте предвид, че в езика JavaScript съединяването на низове в цикъл води до лоша производителност и не се препоръчва. Потърсете и пробвайте по-ефективни решения тук: https://stackoverflow.com/questions/411752.
+
#### Тестване в Judge системата
-Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/594#9](https://judge.softuni.bg/Contests/Practice/Index/594#9).
+Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/943#9](https://judge.softuni.bg/Contests/Practice/Index/943#9).
### Задача: n-та цифра
-Да се напише метод **`FindNthDigit(number, index)`**, който получава число и индекс N като параметри и печата N-тата цифра на числото (като се брои от дясно на ляво, започвайки от 1). След това, резултатът да се отпечата на конзолата.
+Да се напише функция **`findNthDigit(number, index)`**, която получава число и индекс N като параметри и печата N-тата цифра на числото (като се брои от дясно на ляво, започвайки от 1). След това, резултатът да се отпечата на конзолата.
#### Примерен вход и изход
@@ -649,12 +599,12 @@ var min = GetMin(GetMin(num1, num2), num3);
#### Тестване в Judge системата
-Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/594#10](https://judge.softuni.bg/Contests/Practice/Index/594#10).
+Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/943#10](https://judge.softuni.bg/Contests/Practice/Index/943#10).
### Задача: число към бройна система
-Да се напише метод **`IntegerToBase(number, toBase)`**, който получава като параметри цяло число и основа на бройна система и връща входното число, конвертирано към посочената бройна система. След това, резултатът да се отпечата на конзолата. Входното число винаги ще е в бройна система 10, а параметърът за основа ще е между 2 и 10.
+Да се напише функция **`integerToBase(number, toBase)`**, която получава като параметри цяло число и основа на бройна система и връща входното число, конвертирано към посочената бройна система. След това, резултатът да се отпечата на конзолата. Входното число винаги ще е в бройна система 10, а параметърът за основа ще е между 2 и 10.
#### Примерен вход и изход
@@ -670,13 +620,13 @@ var min = GetMin(GetMin(num1, num2), num3);
* **Разделяме** числото на основата.
* **Повтаряме** алгоритъма, докато входното число не стане 0.
-Допишете липсващата логика в метода по-долу:
+Допишете липсващата логика във функцията по-долу:
```javascript
-static string IntegerToBase(int number, int toBase) {
+function integerToBase(number, toBase) {
string result = "";
- while (number != 0) {
- // Implement the missing conversion logic
+ while (number !== 0) {
+ // implement the missing conversion logic
}
return result;
}
@@ -684,21 +634,21 @@ static string IntegerToBase(int number, int toBase) {
#### Тестване в Judge системата
-Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/594#11](https://judge.softuni.bg/Contests/Practice/Index/594#11).
+Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/943#11](https://judge.softuni.bg/Contests/Practice/Index/943#11).
### Задача: известия
-Да се напише програма, която прочита цяло число **`n`** и на следващите редове въвежда **`n`** **съобщения** (като за всяко съобщение се прочитат по няколко реда). Всяко съобщение започва с **`messageType`**: **`success`**, **`warning`** или **`error`**:
- - Когато **`messageType`** е **`success`** да се четат **`operation`** + **`message`** (всяко на отделен ред).
- - Когато **`messageType`** е **`warning`** да се чете само **`message`**.
- - Когато **`messageType`** е **`error`** да се четат **`operation`** + **`message`** + **`errorCode`** (всяко на отделен ред).
+Да се напише функцията **`solve`** която приема като първи параметър цяло число **`n`** - брой на съобщения и допълнителен брой параметри, които са самите части на **съобщенията**. За всяко съобщение може да се получи различен брой параметри. Първият параметър за всяко съобщение е **`messageType`**, който може да бъде **`success`**, **`warning`** или **`error`**:
+ - Когато **`messageType`** е **`success`**, следващите 2 получени параметъра са **`operation`** и **`message`**
+ - Когато **`messageType`** е **`warning`** следващият параметър е **`message`**.
+ - Когато **`messageType`** е **`error`** следващите 3 получени параметъра са **`operation`** + **`message`** + **`errorCode`** (всяко е отделен параметър).
На конзолата да се отпечата **всяко прочетено съобщение**, форматирано в зависимост от неговия **`messageType`**. Като след заглавния ред за всяко съобщение да се отпечатат толкова на брой символа **`=`**, **колкото е дълъг** съответният **заглавен ред** и да се сложи по един **празен ред** след всяко съобщение (за по-детайлно разбиране погледнете примерите).
-Задачата да се реши с дефиниране на четири метода: **`ShowSuccessMessage()`**, **`ShowWarningMessage()`**, **`ShowErrorMessage()`** и **`ReadAndProcessMessage()`**, като само последният метод да се извиква от главния **`Main()`** метод:
+Задачата да се реши с дефиниране на четири функции: **`showSuccessMessage()`**, **`showWarningMessage()`**, **`showErrorMessage()`** и **`processMessage()`**, като само последната функция да се извиква от главната **`solve()`** функция:
-
+
#### Примерен вход и изход
@@ -708,18 +658,20 @@ static string IntegerToBase(int number, int toBase) {
#### Насоки и подсказки
-Дефинирайте и имплементирайте посочените четири метода.
+Дефинирайте и имплементирайте четирите функции. След това извикайте **`processMessage()`** от главната **`solve()`** функция.
+
+
-В **`ReadAndProcessMessage()`** прочетете типа съобщение от конзолата и според прочетения тип прочетете останалите данни (още един два или три реда). След това извикайте съответния метод за печатане на съответния тип съобщение.
+В **`processMessage()`** извадете първо броят на съобщенията и след това ги обработете едно по едно спрямо техният тип и извикайте съответната функция за печатане.
#### Тестване в Judge системата
-Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/594#12](https://judge.softuni.bg/Contests/Practice/Index/594#12).
+Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/943#12](https://judge.softuni.bg/Contests/Practice/Index/943#12).
### Задача: числа към думи
-Да се напише метод **`Letterize(number)`**, който прочита цяло число и го разпечатва с думи на английски език според условията по-долу:
+Да се напише функция **`letterize(number)`**, която получава цяло число и го разпечатва с думи на английски език според условията по-долу:
* Да се отпечатат с думи стотиците, десетиците и единиците (и евентуални минус) според правилата на английския език.
* Ако числото е по-голямо от **999**, трябва да се принтира "**too large**".
* Ако числото е по-малко от **-999**, трябва да се принтира "**too small**".
@@ -748,18 +700,18 @@ static string IntegerToBase(int number, int toBase) {
#### Тестване в Judge системата
-Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/594#13](https://judge.softuni.bg/Contests/Practice/Index/594#13).
+Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/943#13](https://judge.softuni.bg/Contests/Practice/Index/943#13).
### Задача: криптиране на низ
-Да се напише метод **`Encrypt(char letter)`**, който криптира дадена буква по следния начин:
+Да се напише функция **`еncrypt(char letter)`**, която криптира дадена буква по следния начин:
* Вземат се първата и последна цифра от ASCII кода на буквата и се залепят една за друга в низ, който ще представя резултата.
* Към началото на стойността на низа, който представя резултата, се залепя символа, който отговаря на следното условие:
* ASCII кода на буквата + последната цифра от ASCII кода на буквата.
* След това към края на стойността на низа, който представя резултата, се залепя символа, който отговаря на следното условие:
* ASCII кода на буквата - първата цифра от ASCII кода на буквата.
-* Методът трябва да върне като резултат криптирания низ.
+* Функцията трябва да върне като резултат криптирания низ.
Пример:
* j → **p16i**
@@ -768,9 +720,9 @@ static string IntegerToBase(int number, int toBase) {
* Към **началото** на стойността на низа, който представя резултата, залепяме символа, който се получава от сбора на ASCII кода + последната цифра → 106 + 6 → 112 → **p**.
* Към **края** на стойността на низа, който представя резултата, залепяме символа, който се получава от разликата на ASCII кода - първата цифра → 106 - 1 → 105 → **i**.
-Използвайки метода, описан по-горе, да се напише програма, която чете **поредица от символи**, **криптира ги** и отпечатва резултата на един ред.
+Използвайки метода, описан по-горе, да се дефинира функцията **`solve()`**, която получава **поредица от символи**, **криптира ги** и отпечатва резултата на един ред.
-Приемаме, че входните данни винаги ще бъдат валидни. Главният метод трябва да прочита входните данни, подадени от потребителя – цяло число **`n`**, следвани от по един символ на всеки от следващите **`n`** реда.
+Приемаме, че входните данни винаги ще бъдат валидни. **`solve()`** функцията трябва да получава входните данни, подадени от потребителя – цяло число **`n`**, последвано от по един символ за всеки следващ **`n`** елемент.
Да се криптират символите и да се добавят към криптирания низ. Накрая като резултат трябва да се отпечата **криптиран низ от символи** като в следващия пример.
@@ -788,10 +740,10 @@ static string IntegerToBase(int number, int toBase) {
|7
B
i
r
a
H
a
x| H66