diff --git a/assets/chapter-10-images/06.Print-sign-02.png b/assets/chapter-10-images/06.Print-sign-02.png index eae4f0bf..0c630705 100644 Binary files a/assets/chapter-10-images/06.Print-sign-02.png and b/assets/chapter-10-images/06.Print-sign-02.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 index 1e864b91..0d935c5e 100644 Binary files a/assets/chapter-10-images/15.Return-multiple-values-01.png and b/assets/chapter-10-images/15.Return-multiple-values-01.png differ diff --git a/chapter-10-functions.md b/chapter-10-functions.md index 0721bacb..f750903c 100644 --- a/chapter-10-functions.md +++ b/chapter-10-functions.md @@ -36,38 +36,38 @@ В езика JavaScript можем да **декларираме** функции буквално навсякъде, по същият начин, по който можем да декларираме и променливи навсякъде. Декларирането представлява **регистрирането на функцията** в програмата, за да бъде разпозната в останалата част от нея. -JavaScript не е **strongly typed** език (силно типизиран). Затова и когато **декларираме функция** тя няма тип (string, number, array и т.н.), какъвто имат методите и функциите в другите езици за програмиране. +JavaScript не е **силно типизиран** език (strongly typed). Затова и когато **декларираме функция** тя няма тип (string, number, array и т.н.), какъвто имат методите и функциите в другите езици за програмиране. Има 2 основни начина, по които могат да се декларирате функции в JavaScript - **декларативно - function declaration** и **експресивно - function expression**. ### Декларативно (function declaration) -Със следващия пример ще разгледаме задължителните елементи в декларацията на една функция **чрез function declaration**. +Със следващия пример ще разгледаме задължителните елементи в декларацията на една функция **декларативно (function declaration)**. ![](assets/chapter-10-images/02.Declaring-methods-02.png) -* **Ключовата думичка function**. Започваме с използването на **ключовата думичка** ***function***, чрез която заявяваме, че предстои декларация на функция. Наричаме я ключова, защото тя е запазена в езика или с други думи казано - не можем да имаме променлива, която да именуваме по този начин. +* **Ключовата думичка function**. Започваме с използването на **ключовата думичка** ***function***, чрез която заявяваме, че предстои декларация на функция. Наричаме я ключова, защото тя е запазена в езика JavaScript или с други думи казано - не можем да имаме променлива, която да именуваме по този начин. * **Име на функцията**. Името на функцията е **определено от нас**, като не забравяме, че трябва да **описва задачата**, която се изпълнявана от кода в тялото на функцията. В примера името е **`getSquare`**, което ни указва, че задачата на тази функция е да изчисли лицето на квадрат. * **Списък с параметри**. Декларира се между скобите **`(`** и **`)`**, които изписваме след името му. Тук изброяваме поредицата от **параметри**, които функцията ще използва. Може да присъства **само един** параметър, **няколко** такива или да е **празен** списък. Ако няма параметри, то ще запишем само скобите **`()`**. В конкретния пример декларираме параметъра **`n`**. * **Тяло на функцията**. Декларира се между скобите **`{`** и **`}`**, които изписваме веднага след затварящата **`)`**. В **тялото на функцията** описваме **чрез код** всички операции, които искаме функцията да извърши. В тялото на функцията описваме **алгоритъма**, по който фунцкията решава даден проблем. Реализираме **логиката** на функцията. В показания пример изчисляваме лицето на квадрат, а именно **`n * n`**. При деклариране на функции е важно да спазваме **последователността** на основните елементи - първо **ключовата думичка function**, след това **име на функцията**, **списък от параметри**, ограден с кръгли скоби **`()`** и накрая **тяло на функцията**, оградено с фигурни скоби **`{}`**. -## Експресивно (function expression) +### Експресивно (function expression) -Със следващия пример ще разгледаме задължителните елементи в декларацията на една функция **чрез function expression**. То доста наподобява **декларативното**, което вече разгледахме и може да се каже, че е **комбинация** от **деклариране на променлива** и **деклариране на функция с function declaration**. +Със следващия пример ще разгледаме задължителните елементи в декларацията на една функция **експресивно (function expression)**. То доста наподобява **декларативното**, което вече разгледахме и може да се каже, че е **комбинация** от **деклариране на променлива** и **деклариране на функция декларативно (function declaration)**. ![](assets/chapter-10-images/02.Declaring-methods-03.png) -* **Ключовата думичка let**. Започваме с използването на **ключовата думичка** **let**, чрез която заявяваме, че предстои декларация на променлива. +* **Ключовата думичка `let`**. Започваме с използването на **ключовата думичка** **`let`**, чрез която заявяваме, че предстои декларация на променлива. * **Име на променливата**. Името на променливата е **определено от нас**. В примера името е **`getSquare`**, което ни указва, че задачата на тази функция е да изчисли лицето на квадрат. * **Декларация на функция**. Използвайки същата структура, която вече научихме при **function declaration** - първо **ключовата думичка function**, след това **име на функцията**, **списък от параметри**, ограден с кръгли скоби **`()`** и накрая **тяло на функцията**, оградено с фигурни скоби **`{}`**. Особеното в случая е, че **името на функцията** не е задължителен елемент, но е препоръчително да свикнете да го добавяте. В примерът програмата ще работи без проблеми, дори и да пропуснем да изпишем името **`getSquareFunc`**. Ако пропуснем името, функцията се нарича **анонимна**. -Когато декларираме дадена променлива в тялото на една функция (чрез ключовата думичка **let** или **const**), я наричаме **локална** променлива за функцията. Областта, в която съществува и може да бъде използвана тази променлива, започва от реда, на който сме я декларирали и стига до затварящата къдрава скоба `}` на тялото на функцията. Тази област се нарича **област на видимост** на променливата (variable scope). +Когато декларираме дадена променлива в тялото на една функция (чрез ключовата думичка **`let`** или **`const`**), я наричаме **локална** променлива за функцията. Областта, в която съществува и може да бъде използвана тази променлива, започва от реда, на който сме я декларирали и стига до затварящата къдрава скоба `}` на тялото на функцията. Тази област се нарича **област на видимост** на променливата (variable scope). ### Декларативно или експресивно -Разликата между деклариране на функция чрез **деклараиия** или **експресия** е сравнително проста. Всички функции, декларирани чрез **function declaration**, се зареждат в паметта на програмата преди да започне нейното изпълнение, докато програмата разбира за функции, декларирани с **function expression** едва когато започне да се изпълнява и стигне до реда, на който е декларирана функцията. +Разликата между деклариране на функция чрез **декларация** или **експресия** е сравнително проста. Всички функции, декларирани чрез **function declaration**, се зареждат в паметта на програмата преди да започне нейното изпълнение, докато програмата разбира за функции, декларирани с **function expression** едва когато започне да се изпълнява и стигне до реда, на който е декларирана функцията. На практика това означава, че можете да **извикате функция**, декларирана с **function declaration** дори и в някои от предните редове - преди нейната декларация, докато ако опитате да направите това с **function expression** програмата ще ви **даде грешка**, че не разпознава тази функция по време на изпълнението. @@ -105,11 +105,11 @@ JavaScript не е **strongly typed** език (силно типизиран). #### Насоки и подсказки -Първата ни стъпка е да създадем функция за **принтиране на заглавната част** от касовата бележка (header). Нека му дадем смислено име, което описва кратко и ясно задачата му, например **`printReceiptHeader`**. В тялото му ще напишем кода от примера по-долу: +Първата ни стъпка е да създадем функция за **принтиране на заглавната част** от касовата бележка (header). Нека ѝ дадем смислено име, което описва кратко и ясно задачата ѝ, например **`printReceiptHeader`**. В тялото ѝ ще напишем следния код: ![](assets/chapter-10-images/04.Print-receipt-01.png) -Съвсем аналогично ще създадем още два функции **за разпечатване на средната част** на бележката (тяло) **`printReceiptBody`** и **за разпечатване на долната част** на бележката (footer) **`printReceiptFooter`**. +Съвсем аналогично ще създадем още две функции **за разпечатване на средната част** на бележката (тяло) **`printReceiptBody`** и **за разпечатване на долната част** на бележката (footer) **`printReceiptFooter`**. След това ще създадем и **още една функция**, която ще извиква трите функции, които написахме до момента една след друга: @@ -121,7 +121,7 @@ JavaScript не е **strongly typed** език (силно типизиран). #### Тестване в Judge системата -Програмата с общо четири функции, които се извикват една от друга, е готова и можем **да я изпълним и тестваме**, след което да я пратим за проверка в judge системата: [https://judge.softuni.bg/Contests/Practice/Index/943#0](https://judge.softuni.bg/Contests/Practice/Index/943#0). +Програмата с общо четири функции, които се извикват една от друга, е готова и можем **да я изпълним и тестваме**, след което да я пратим за проверка в Judge системата: [https://judge.softuni.bg/Contests/Practice/Index/943#0](https://judge.softuni.bg/Contests/Practice/Index/943#0). ## Функции с параметри @@ -129,11 +129,9 @@ JavaScript не е **strongly typed** език (силно типизиран). ### Използване на параметри във функции -Ако функцията ни изисква **входни данни**, то те се подават в скобите **`()`**, като последователността на **фактическите параметри** трябва да съвпада с последователността на подадените при декларирането на функцията. +Ако функцията ни изисква **входни данни**, то те се подават в скобите **`()`**, като последователността на **фактическите параметри** трябва да съвпада с последователността на подадените при декларирането на функцията. Както отбелязахме по-горе, **параметрите освен нула на брой, могат също така да са един или няколко**. При декларацията им ги разделяме със запетая. -Както отбелязахме по-горе, **параметрите освен нула на брой, могат също така да са един или няколко**. При декларацията им ги разделяме със запетая. - -**Декларираме** функцията `printNumbers` и **списъка** с **параметри**, от които тя се нуждае, за да работи коректно, след което пишем кода, който ще изпълнява. +**Декларираме** функцията **`printNumbers(...)`** и **списъка** с **параметри**, от които тя се нуждае, за да работи коректно, след което пишем кода, който ще изпълнява: ![](assets/chapter-10-images/05.Method-parameters-01.png) @@ -141,7 +139,7 @@ JavaScript не е **strongly typed** език (силно типизиран). ![](assets/chapter-10-images/05.Method-parameters-02.png) -При **декларирането на параметри** трябва да внимаване всеки един параметър да има **име**. Важно е при извикване на функцията, да подаваме **стойности** за параметрите по **реда**, в който са **декларирани** самите те. В примера, който разгледахме на променливата `start` ще бъде присвоена стойността на първият подаден параметър - в нашият случай числото 5. На променливата `end` ще бъде присвоена стойността на вторият параметър, който сме подали - в случая числото 10. +При **декларирането на параметри** трябва да внимаване всеки един параметър да има **име**. Важно е при извикване на функцията, да подаваме **стойности** за параметрите по **реда**, в който са **декларирани** самите те. В примера, който разгледахме на променливата **`start`** ще бъде присвоена стойността на първият подаден параметър - в нашият случай числото 5. На променливата **`end`** ще бъде присвоена стойността на вторият параметър, който сме подали - в случая числото 10. Важно е да се отбележи, че в езикът **JavaScript** декларирането на функция с даден **брой параметри**, не ни задължава да извикваме функцията със **същият брой параметри**. Можем да извикаме функция като и подадем както **повече**, така и **по - малко** параметри, като това няма да доведе до грешка. @@ -149,13 +147,13 @@ JavaScript не е **strongly typed** език (силно типизиран). ![](assets/chapter-10-images/05.Method-parameters-03.png) -В случая извикваме функцията **`printNumbers`** като и подаваме 4, вместо **декларираните** 2 параметъра. Всички излишни параметри ще бъдат **игнорирани**. Т.е. числата 15 и 20, няма да стигнат до функцията, защото нямаме **деклариран параметър**, който да ги приеме. +В случая извикваме функцията **`printNumbers(...)`** като и подаваме 4, вместо **декларираните** 2 параметъра. Всички излишни параметри ще бъдат **игнорирани**. Т.е. числата 15 и 20, няма да стигнат до функцията, защото нямаме **деклариран параметър**, който да ги приеме. Нека разгледаме още един пример: ![](assets/chapter-10-images/05.Method-parameters-04.png) -В случая извикваме функцията **`printNumbers`** като и подаваме 1, вместо **декларираните** 2 параметъра. Всички параметри, за които **не е подадена стойност**, ще получат автоматично стойност **`undefined`**. В нашият случай променливата **`secondNumber`** ще има стойност **`undefined`**. +В случая извикваме функцията **`printNumbers(...)`** като и подаваме 1, вместо **декларираните** 2 параметъра. Всички параметри, за които **не е подадена стойност**, ще получат автоматично стойност **`undefined`**. В нашият случай променливата **`secondNumber`** ще има стойност **`undefined`**. ### Пример: знак на цяло число @@ -171,13 +169,13 @@ JavaScript не е **strongly typed** език (силно типизиран). #### Насоки и подсказки -Първата ни стъпка е **декларирането** на функция и даването ѝ на описателно име, например **`printSign`**. Тази функция ще има само един параметър. +Първата ни стъпка е **декларирането** на функция и даването ѝ на описателно име, например **`printSign`**. Тази функция ще има само един параметър: ![](assets/chapter-10-images/06.Print-sign-01.png) Следващата ни стъпка е **имплементирането** на логиката, по която програмата ни ще проверява какъв точно е знакът на числото. От примерите виждаме, че има три случая - числото е по-голямо от нула, равно на нула или по-малко от нула, което означава, че ще направим три проверки в тялото на функцията. -Следващата ни стъпка е да извикаме функцията, която създадохме. +Следващата ни стъпка е да извикаме функцията, която създадохме: ![](assets/chapter-10-images/06.Print-sign-02.png) @@ -188,13 +186,13 @@ JavaScript не е **strongly typed** език (силно типизиран). ### Незадължителни параметри -Езикът JavaScript поддържа използването на **незадължителни** параметри. Те позволяват **пропускането** на параметри при извикването на функцията. Декларирането им става чрез **осигуряване на стойност по подразбиране** в описанието на съответния параметър. +Езикът **JavaScript** поддържа използването на **незадължителни** параметри. Те позволяват **пропускането** на параметри при извикването на функцията. Декларирането им става чрез **осигуряване на стойност по подразбиране** в описанието на съответния параметър. Следващият пример онагледява употребата на незадължителните параметри: ![](assets/chapter-10-images/07.Optional-parameters-01.png) -Показаната функция **`printNumbers`** може да бъде извикана по няколко начина: +Показаната функция **`printNumbers(...)`** може да бъде извикана по няколко начина: ![](assets/chapter-10-images/07.Optional-parameters-02.png) @@ -212,7 +210,7 @@ JavaScript не е **strongly typed** език (силно типизиран). #### Насоки и подсказки -Избираме смислено име за функцията, което описва целта ѝ, например **`printLine`**, и го имплементираме. +Избираме смислено име за функцията, което описва целта ѝ, например **`printLine`**, и я имплементираме: ![](assets/chapter-10-images/08.Print-triangle-01.png) @@ -247,11 +245,11 @@ JavaScript не е **strongly typed** език (силно типизиран). #### Насоки и подсказки -Създаваме функция, която ще принтира първия и последен ред, тъй като те са еднакви. Нека не забравяме, че трябва да му дадем **описателно име** и да му зададем като **параметър** дължината на страната. Ще използваме вградената функция **`repeat`**. +Създаваме функция, която ще принтира първия и последен ред, тъй като те са еднакви. Нека не забравяме, че трябва да му дадем **описателно име** и да му зададем като **параметър** дължината на страната. Ще използваме вградения метод **`repeat(...)`**: ![](assets/chapter-10-images/09.Draw-filled-square-01.png) -Следващата ни стъпка е да създадем функция, която ще рисува на конзолата средните редове. Отново задаваме описателно име, например **`printMiddleRow`**. +Следващата ни стъпка е да създадем функция, която ще рисува на конзолата средните редове. Отново задаваме описателно име, например **`printMiddleRow`**: ![](assets/chapter-10-images/09.Draw-filled-square-02.png) @@ -284,17 +282,12 @@ JavaScript не е **strongly typed** език (силно типизиран). #### Кодът след return е недостъпен -В случай, че **return** операторът не се намира в условна конструкция като `if`, след него, в текущия блок, **не** трябва да има други редове код, тъй като тогава Visual Studio Code ще покаже предупреждение, съобщавайки ни, че е засякъл код, който **не може да бъде достъпен**: +В случай, че **return** операторът не се намира в условна конструкция като **`if`**, след него, в текущия блок, **не** трябва да има други редове код, тъй като тогава Visual Studio Code ще покаже предупреждение, съобщавайки ни, че е засякъл код, който **не може да бъде достъпен**: ![](assets/chapter-10-images/11.Return-operator-03.png) Операторът **`return`** може да бъде използван и без да бъде специфицирана **конкретна стойност**, която да бъде върната. В този случай, просто ще бъде **прекратено** изпълнението на кода във функцията и ще бъде върната стойност по подразбиране **`undefined`**. ------ - -В посоченият пример... - -
В програмирането не може да има два пъти оператор return един след друг, защото изпълнението на първия няма да позволи да се изпълни вторият. Понякога програмистите се шегуват с фразата “пиши return; return; и да си ходим”, за да обяснят, че логиката на програмата е объркана.
@@ -377,26 +370,25 @@ JavaScript не е **strongly typed** език (силно типизиран). ![](assets/chapter-10-images/15.Return-multiple-values-02.png) -В горният пример променливата `name` ще получи стойността "John Doe", която е първата върната стойност от функцията `getNames`, а `fullName` ще получи "John Silver Doe", която е втората върната стойност. +В горният пример променливата **`name`** ще получи стойността "**John Doe**", която е първата върната стойност от функцията **`getNames`**, а **`fullName`** ще получи "**John Silver Doe**", която е втората върната стойност. #### Обекти -Този подход е много подобен на предния, като разликата е, че не просто **изброяваме** стойностите, които искаме да върнем, но и им даваме **имена**. **Обектите** са изключително важна и основна част от езика **JavaScript**. За сега е достатъчно да знаете, че се декларират с фигурните скоби **`{`** **`}`**, като между тях изброяваме **името** на стойността (нарича се **ключ**), последвано от знака две точки - **`:`** и самата стойност. Разделяме отделните двойки **ключ-стойност** със символа `,`. +Този подход е много подобен на предния, като разликата е, че не просто **изброяваме** стойностите, които искаме да върнем, но и им даваме **имена**. **Обектите** са изключително важна и основна част от езика **JavaScript**. За сега е достатъчно да знаете, че се декларират с фигурните скоби **`{`** **`}`**, като между тях изброяваме **името** на стойността (нарича се **ключ**), последвано от знака две точки - **`:`** и самата стойност. Разделяме отделните двойки **ключ-стойност** със символа **`,`**. ![](assets/chapter-10-images/15.Return-multiple-values-03.png) -В този пример връщаме обект, който държи 2 стойности - `name` и `fullName`. +В този пример връщаме обект, който държи 2 стойности - **`name`** и **`fullName`**. ![](assets/chapter-10-images/15.Return-multiple-values-04.png) - -Тук променливата `personNames` ще получи всички върнати стойности. Като `name` и `fullName` са част от тези стойности и могат да бъдат достъпени със символа `.`. +Тук променливата **`personNames`** ще получи всички върнати стойности. Като **`name`** и **`fullName`** са част от тези стойности и могат да бъдат достъпени със символа **`.`**: ![](assets/chapter-10-images/15.Return-multiple-values-05.png) ## Варианти на функции -В много езици за програмиране едина и съща функция може да е декларирана в **няколко варианта** с еднакво име и различни параметри. Това е известно с термина “**method overloading**”. За добро или лошо **JavaScript** не поддържа тази възможност. +В много езици за програмиране едина и съща функция може да е декларирана в **няколко варианта** с еднакво име и различни параметри. Това е известно с термина "**method overloading**". За добро или лошо **JavaScript** не поддържа тази възможност. Когато декларирате **две или повече функции с еднакви имена**, програмата ще използва **последно декларираната** такава. Декларирайки втора функция със същото име, вие реално премахвате старата функция и записвате на нейно място новата. @@ -408,7 +400,7 @@ JavaScript не е **strongly typed** език (силно типизиран). ### Какво е локална функция? -Виждаме, че в този код, в нашата функция **`solve()`** има **другa** декларирана функция **`sum()`**. Такъвa **вложенa** функция се нарича **локална** функция. Локалните функции могат да се декларират във всяка една друга функция. +Виждаме, че в този код, в нашата функция **`solve()`** има **другa** декларирана функция **`sum()`**. Такавa **вложенa** функция се нарича **локална** функция. Локалните функции могат да се декларират във всяка една друга функция. ### Защо да използваме локални функции? @@ -422,7 +414,7 @@ JavaScript не е **strongly typed** език (силно типизиран). В този пример, функцията **`sum()`** е локална функция, тъй като е вложена във функцията **`solve()`**, т.е. **`sum()`** е локална за **`solve()`**. Това означава, че функцията **`sum()`** може да бъде използван **само** във функцията **`solve()`**, тъй като е **декларирана в нея**. -Локалните функции имат достъп до променливи, които са декларирани на същото или по - горно ниво като тях. Следващият пример демонстрира как се случва това. +Локалните функции имат достъп до променливи, които са декларирани на същото или по - горно ниво от тях. Следващият пример демонстрира как се случва това: ![](assets/chapter-10-images/19.Local-functions-02.png) @@ -439,7 +431,7 @@ JavaScript не е **strongly typed** език (силно типизиран). Задължително е името да започва с **малка буква** и трябва да е съставено от глагол или от двойка: глагол + съществително име. Форматирането на името става, спазвайки **Lower Camel Case** конвенцията, т.е. **всяка дума, с изключение на първата, започва с главна буква**. Кръглите скоби **`( `** и **`)`** винаги следват името на функцията. -Всяка функция трябва да изпълнява самостоятелна задача, а името на функцията трябва да описва каква е неговата роля. +Всяка функция трябва да изпълнява самостоятелна задача, а името на функцията трябва да описва каква е нейната роля. Няколко примера за **коректно** именуване на функции: * **`findStudent`** @@ -462,7 +454,7 @@ JavaScript не е **strongly typed** език (силно типизиран). При именуването на **параметрите** на функцията важат почти същите правила, както и при самите функции. Разликите тук са, че за имената на параметрите е добре да използваме съществително име или двойка от прилагателно и съществително име. Трябва да отбележим, че е добра практика името на параметъра да **указва** каква е **мерната единица**, която се използва при работа с него. Няколко примера за **коректно** именуване на параметри на функции: -* **`firstName`** +* **`firstName`** * **`report`** * **`speedKmH`** * **`usersList`** @@ -473,13 +465,13 @@ JavaScript не е **strongly typed** език (силно типизиран). * **`p`** * **`p1`** * **`p2`** -* **`populate`** -* **`LastName`** -* **`last_name`** +* **`populate`** +* **`LastName`** +* **`last_name`** ### Добри практики при работа с функции -Нека отново припомним, че едина функция трябва да изпълнява **само една** точно определена **задача**. Ако това не може да бъде постигнато, тогава трябва да помислим как да **разделим** функцията на няколко отделни такива. Както казахме, името на функцията трябва точно и ясно да описва неговата цел. Друга добра практика в програмирането е да **избягваме** функции, по-дълги от екрана ни (приблизително). Ако все пак кода стане много обемен, то е препоръчително функцията да се **раздели** на няколко по-кратки, както в примера по-долу. +Нека отново припомним, че едина функция трябва да изпълнява **само една** точно определена **задача**. Ако това не може да бъде постигнато, тогава трябва да помислим как да **разделим** функцията на няколко отделни такива. Както казахме, името на функцията трябва точно и ясно да описва нейната цел. Друга добра практика в програмирането е да **избягваме** функции, по-дълги от екрана ни (приблизително). Ако все пак кода стане много обемен, то е препоръчително функцията да се **раздели** на няколко по-кратки, както в примера по-долу. ![](assets/chapter-10-images/20.Good-practice-01.png) @@ -530,7 +522,7 @@ JavaScript не е **strongly typed** език (силно типизиран). #### Насоки и подсказки -Дефинирайте функция **`printName(name)`** и го имплементирайте. Да се напише функция **`solve`**, която получава като входни данни име на човек и извиква `printName` функцията като подава прочетеното име. +Дефинирайте функция **`printName(name)`** и я имплементирайте. Да се напише функция **`solve(...)`**, която получава като входни данни име на човек и извиква **`printName`** функцията като подава прочетеното име. #### Тестване в Judge системата @@ -539,7 +531,7 @@ JavaScript не е **strongly typed** език (силно типизиран). ### Задача: по-малко число -Да се създаде функция **`getMin(a, b)`**, която връща по-малкото от две числа. Да се напише функция **`solve`**, която получава като входни данни три числа и печата най-малкото от тях. Да се използва функцията **`getMin(…)`**, която е вече създадена. +Да се създаде функция **`getMin(a, b)`**, която връща по-малкото от две числа. Да се напише функция **`solve(...)`**, която получава като входни данни три числа и печата най-малкото от тях. Да се използва функцията **`getMin(…)`**, която е вече създадена. #### Примерен вход и изход @@ -549,7 +541,7 @@ JavaScript не е **strongly typed** език (силно типизиран). #### Насоки и подсказки -Дефинирайте функция **`getMin(int a, int b)`** и я имплементирайте, след което я извикайте от функцията **`solve`** както е показано по-долу. За да намерите минимума на три числа, намерете първо минимума на първите две от тях и след това минимума на резултата и третото число: +Дефинирайте функция **`getMin(int a, int b)`** и я имплементирайте, след което я извикайте от функцията **`solve(...)`**, както е показано по-долу. За да намерите минимума на три числа, намерете първо минимума на първите две от тях и след това минимума на резултата и третото число: ```javascript function solve([num1, num2, num3]) { @@ -639,14 +631,14 @@ function integerToBase(number, toBase) { ### Задача: известия -Да се напише функцията **`solve`** която приема като първи параметър цяло число **`n`** - брой на съобщения и допълнителен брой параметри, които са самите части на **съобщенията**. За всяко съобщение може да се получи различен брой параметри. Първият параметър за всяко съобщение е **`messageType`**, който може да бъде **`success`**, **`warning`** или **`error`**: +Да се напише функция **`solve(...)`**, която приема като първи параметър цяло число **`n`** - брой на съобщения и допълнителен брой параметри, които са самите части на **съобщенията**. За всяко съобщение може да се получи различен брой параметри. Първият параметър за всяко съобщение е **`messageType`**, който може да бъде **`success`**, **`warning`** или **`error`**: - Когато **`messageType`** е **`success`**, следващите 2 получени параметъра са **`operation`** и **`message`** - Когато **`messageType`** е **`warning`** следващият параметър е **`message`**. - Когато **`messageType`** е **`error`** следващите 3 получени параметъра са **`operation`** + **`message`** + **`errorCode`** (всяко е отделен параметър). На конзолата да се отпечата **всяко прочетено съобщение**, форматирано в зависимост от неговия **`messageType`**. Като след заглавния ред за всяко съобщение да се отпечатат толкова на брой символа **`=`**, **колкото е дълъг** съответният **заглавен ред** и да се сложи по един **празен ред** след всяко съобщение (за по-детайлно разбиране погледнете примерите). -Задачата да се реши с дефиниране на четири функции: **`showSuccessMessage()`**, **`showWarningMessage()`**, **`showErrorMessage()`** и **`processMessage()`**, като само последната функция да се извиква от главната **`solve()`** функция: +Задачата да се реши с дефиниране на четири функции: **`showSuccessMessage(...)`**, **`showWarningMessage(...)`**, **`showErrorMessage(...)`** и **`processMessage(...)`**, като само последната функция да се извиква от главната **`solve(...)`** функция: ![](assets/chapter-10-images/23.Notifications-01.png) @@ -658,11 +650,11 @@ function integerToBase(number, toBase) { #### Насоки и подсказки -Дефинирайте и имплементирайте четирите функции. След това извикайте **`processMessage()`** от главната **`solve()`** функция. +Дефинирайте и имплементирайте четирите функции. След това извикайте **`processMessage(...)`** от главната **`solve(...)`** функция. ![](assets/chapter-10-images/23.Notifications-02.png) -В **`processMessage()`** извадете първо броят на съобщенията и след това ги обработете едно по едно спрямо техният тип и извикайте съответната функция за печатане. +В **`processMessage(...)`** извадете първо броят на съобщенията и след това ги обработете едно по едно спрямо техният тип и извикайте съответната функция за печатане. #### Тестване в Judge системата @@ -720,13 +712,9 @@ function integerToBase(number, toBase) { * Към **началото** на стойността на низа, който представя резултата, залепяме символа, който се получава от сбора на ASCII кода + последната цифра → 106 + 6 → 112 → **p**. * Към **края** на стойността на низа, който представя резултата, залепяме символа, който се получава от разликата на ASCII кода - първата цифра → 106 - 1 → 105 → **i**. -Използвайки метода, описан по-горе, да се дефинира функцията **`solve()`**, която получава **поредица от символи**, **криптира ги** и отпечатва резултата на един ред. - -Приемаме, че входните данни винаги ще бъдат валидни. **`solve()`** функцията трябва да получава входните данни, подадени от потребителя – цяло число **`n`**, последвано от по един символ за всеки следващ **`n`** елемент. +Използвайки метода, описан по-горе, да се дефинира функция **`solve(...)`**, която получава **поредица от символи**, **криптира ги** и отпечатва резултата на един ред. Приемаме, че входните данни винаги ще бъдат валидни. **`solve(...)`** функцията трябва да получава входните данни, подадени от потребителя – цяло число **`n`**, последвано от по един символ за всеки следващ **`n`** елемент. Да се криптират символите и да се добавят към криптирания низ. Накрая като резултат трябва да се отпечата **криптиран низ от символи** като в следващия пример. -Да се криптират символите и да се добавят към криптирания низ. Накрая като резултат трябва да се отпечата **криптиран низ от символи** като в следващия пример. - -Пример: +**Пример**: * S, o, f, t, U, n, i → V83Kp11nh12ez16sZ85Mn10mn15h #### Примерен вход и изход