diff --git a/assets/chapter-4-1-images/01.Personal-titles-01.jpg b/assets/chapter-4-1-images/01.Personal-titles-01.jpg new file mode 100644 index 00000000..f8c21d8e Binary files /dev/null and b/assets/chapter-4-1-images/01.Personal-titles-01.jpg differ diff --git a/assets/chapter-4-1-images/01.Personal-titles-02.png b/assets/chapter-4-1-images/01.Personal-titles-02.png new file mode 100644 index 00000000..a5a27e11 Binary files /dev/null and b/assets/chapter-4-1-images/01.Personal-titles-02.png differ diff --git a/assets/chapter-4-1-images/02.Small-shop-01.png b/assets/chapter-4-1-images/02.Small-shop-01.png new file mode 100644 index 00000000..aa287a7c Binary files /dev/null and b/assets/chapter-4-1-images/02.Small-shop-01.png differ diff --git a/assets/chapter-4-1-images/03.Point-in-rectangle-01.png b/assets/chapter-4-1-images/03.Point-in-rectangle-01.png new file mode 100644 index 00000000..dbde8150 Binary files /dev/null and b/assets/chapter-4-1-images/03.Point-in-rectangle-01.png differ diff --git a/assets/chapter-4-1-images/03.Point-in-rectangle-03.png b/assets/chapter-4-1-images/03.Point-in-rectangle-03.png new file mode 100644 index 00000000..d8ac3073 Binary files /dev/null and b/assets/chapter-4-1-images/03.Point-in-rectangle-03.png differ diff --git a/assets/chapter-4-1-images/04.Fruit-or-vegetable-01.png b/assets/chapter-4-1-images/04.Fruit-or-vegetable-01.png new file mode 100644 index 00000000..0d79fd2e Binary files /dev/null and b/assets/chapter-4-1-images/04.Fruit-or-vegetable-01.png differ diff --git a/assets/chapter-4-1-images/05.Invalid-number-01.png b/assets/chapter-4-1-images/05.Invalid-number-01.png new file mode 100644 index 00000000..ff7d035d Binary files /dev/null and b/assets/chapter-4-1-images/05.Invalid-number-01.png differ diff --git a/assets/chapter-4-1-images/06.Point-on-rectangle-border-01.png b/assets/chapter-4-1-images/06.Point-on-rectangle-border-01.png new file mode 100644 index 00000000..b6831cfd Binary files /dev/null and b/assets/chapter-4-1-images/06.Point-on-rectangle-border-01.png differ diff --git a/assets/chapter-4-1-images/06.Point-on-rectangle-border-02.png b/assets/chapter-4-1-images/06.Point-on-rectangle-border-02.png new file mode 100644 index 00000000..2b19b048 Binary files /dev/null and b/assets/chapter-4-1-images/06.Point-on-rectangle-border-02.png differ diff --git a/assets/chapter-4-1-images/06.Point-on-rectangle-border-03.png b/assets/chapter-4-1-images/06.Point-on-rectangle-border-03.png new file mode 100644 index 00000000..b8214adf Binary files /dev/null and b/assets/chapter-4-1-images/06.Point-on-rectangle-border-03.png differ diff --git a/assets/chapter-4-1-images/07.Fruit-shop-01.png b/assets/chapter-4-1-images/07.Fruit-shop-01.png new file mode 100644 index 00000000..f1425171 Binary files /dev/null and b/assets/chapter-4-1-images/07.Fruit-shop-01.png differ diff --git a/assets/chapter-4-1-images/08.Trade-comissions-01.png b/assets/chapter-4-1-images/08.Trade-comissions-01.png new file mode 100644 index 00000000..3d57fabe Binary files /dev/null and b/assets/chapter-4-1-images/08.Trade-comissions-01.png differ diff --git a/assets/chapter-4-1-images/09.Day-of-week-01.png b/assets/chapter-4-1-images/09.Day-of-week-01.png new file mode 100644 index 00000000..0b0e87d4 Binary files /dev/null and b/assets/chapter-4-1-images/09.Day-of-week-01.png differ diff --git a/assets/chapter-4-1-images/10.Animal-type-01.png b/assets/chapter-4-1-images/10.Animal-type-01.png new file mode 100644 index 00000000..a79d8e5b Binary files /dev/null and b/assets/chapter-4-1-images/10.Animal-type-01.png differ diff --git a/assets/chapter-4-1-images/11.Cinema-01.png b/assets/chapter-4-1-images/11.Cinema-01.png new file mode 100644 index 00000000..6371b0bb Binary files /dev/null and b/assets/chapter-4-1-images/11.Cinema-01.png differ diff --git a/assets/chapter-4-1-images/12.Volleyball-01.png b/assets/chapter-4-1-images/12.Volleyball-01.png new file mode 100644 index 00000000..a38a2bcd Binary files /dev/null and b/assets/chapter-4-1-images/12.Volleyball-01.png differ diff --git a/assets/chapter-4-1-images/13.Point-in-the-figure-01.png b/assets/chapter-4-1-images/13.Point-in-the-figure-01.png new file mode 100644 index 00000000..a2ce1062 Binary files /dev/null and b/assets/chapter-4-1-images/13.Point-in-the-figure-01.png differ diff --git a/assets/chapter-4-1-images/13.Point-in-the-figure-02.png b/assets/chapter-4-1-images/13.Point-in-the-figure-02.png new file mode 100644 index 00000000..491528a1 Binary files /dev/null and b/assets/chapter-4-1-images/13.Point-in-the-figure-02.png differ diff --git a/assets/chapter-4-1-images/13.Point-in-the-figure-03.png b/assets/chapter-4-1-images/13.Point-in-the-figure-03.png new file mode 100644 index 00000000..c87a6b1b Binary files /dev/null and b/assets/chapter-4-1-images/13.Point-in-the-figure-03.png differ diff --git a/chapter-04-complex-conditions.md b/chapter-04-complex-conditions.md index c4acc67b..61ec4362 100644 --- a/chapter-04-complex-conditions.md +++ b/chapter-04-complex-conditions.md @@ -5,8 +5,9 @@ ## Видео
Гледайте видео-урок по тази глава тук: - https://www.youtube.com/watch?v=z8XxYIyesz0. + + href="https://www.youtube.com/watch?v=aeeje4nIzas&feature=youtu.be"> + https://www.youtube.com/watch?v=aeeje4nIzas&feature=youtu.be.
@@ -15,18 +16,12 @@ Доста често програмната логика налага използването на **`if`** или **`if-else`** конструкции, които се съдържат една в друга. Те биват наричани **вложени** **`if`** или **`if-else`** конструкции. Както се подразбира от названието **"вложени"**, това са **`if`** или **`if-else`** конструкции, които са поставени в други **`if`** или **`else`** конструкции. -```csharp -if (condition1) -{ - if (condition2) - { - // тяло; - } - else - { - // тяло; - } -} +```python +if condition1: + if condition2: + # тяло + else: + # тяло ``` Влагането на повече от три условни конструкции една в друга не се счита за добра практика и трябва да се избягва, най-вече чрез оптимизиране на структурата/алгоритъма на кода и/или чрез използването на друг вид условна конструкция, който ще разгледаме по-надолу в тази глава. @@ -42,26 +37,26 @@ if (condition1) #### Примерен вход и изход |Вход|Изход|Вход|Изход| -|----|----|----|----| +|----|----|----|------| |12
f|Miss|17
m|Mr.| |Вход|Изход|Вход|Изход| -|----|----|----|----| +|----|----|----|------| |25
f|Ms.|13.5
m|Master| #### Решение -Можем да забележим, че **изходът** на програмата **зависи от няколко неща**. **Първо** трябва да проверим какъв **пол** е въведен и **после** да проверим **възрастта**. Съответно ще използваме **няколко** **`if-else`** блока. Тези блокове ще бъдат **вложени**, т.е. от **резултата** на първия ще **определим** кои от **другите** да изпълним. +Можем да забележим, че **изходът** на програмата **зависи от няколко неща**. Първо трябва да проверим какъв **пол** е въведен и **после** да проверим **възрастта**. Съответно ще използваме няколко **`if-else`** блока. Тези блокове ще бъдат **вложени**, т.е. от **резултата** на първия ще се **определи** кои от **другите** да се изпълни: -![](/assets/old-images/chapter-4-images/01.Personal-titles-01.jpg) +![](/assets/chapter-4-1-images/01.Personal-titles-01.jpg) След прочитане на входните данни от конзолата ще трябва да се изпълни следната примерна програмна логика: -![](/assets/old-images/chapter-4-images/01.Personal-titles-02.png) +![](/assets/chapter-4-1-images/01.Personal-titles-02.png) #### Тестване в Judge системата -Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/508#0](https://judge.softuni.bg/Contests/Practice/Index/508#0). +Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/1051#0](https://judge.softuni.bg/Contests/Practice/Index/1051#0). ### Пример: квартално магазинче @@ -78,55 +73,55 @@ if (condition1) |Вход|Изход|Вход|Изход| |-------|-------|-------|-------| -|coffee
Varna
2|0.9|peanuts
Plovdiv
1|1.5| +|coffee
Varna
2|0.90|peanuts
Plovdiv
1|1.50| |Вход|Изход|Вход|Изход| |-------|-------|-------|-------| -|beer
Sofia
6|7.2|water
Plovdiv
3|2.1| +|beer
Sofia
6|7.20|water
Plovdiv
3|2.10| #### Решение -**Прехвърляме** всички букви в **долен регистър** с функцията **`.ToLower()`**, за да сравняваме продукти и градове **без значение** от малки/главни букви. +**Прехвърляме** всички букви в **долен регистър** с функцията **`.lower()`**, за да сравняваме продукти и градове **без значение** от малки/главни букви: -![](/assets/old-images/chapter-4-images/02.Small-shop-01.png) +![](/assets/chapter-4-1-images/02.Small-shop-01.png) #### Тестване в Judge системата -Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/508#1](https://judge.softuni.bg/Contests/Practice/Index/508#1). +Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/1051#1](https://judge.softuni.bg/Contests/Practice/Index/1051#1). ## По-сложни проверки -Нека разгледаме как можем да правим по-сложни логически проверки. Може да използваме логическо "**И**" (**`&&`**), логическо "**ИЛИ**" (**`||`**), логическо **отрицание** (**`!`**) и **скоби** (**`()`**). +Нека разгледаме как можем да правим по-сложни логически проверки. Може да използваме логическо "**И**" (**`and`**), логическо "**ИЛИ**" (**`or`**), логическо **отрицание** (**`not`**) и **скоби** (**`()`**). ### Логическо "И" -Както видяхме, в някои задачи се налага да правим **много проверки наведнъж**. Но какво става, когато за да изпълним някакъв код, трябва да бъдат изпълнени **повече** условия и **не искаме** да правим **отрицание** (**`else`**) за всяко едно от тях? Вариантът с вложените **`if` блокове** е валиден, но кодът би изглеждал много **неподреден** и със сигурност - **труден** за четене и поддръжка. +Както видяхме, в някои задачи се налага да правим **много проверки наведнъж**. Но какво става, когато за да изпълним някакъв код, трябва да бъдат изпълнени **няколко** условия едновременно и **не искаме** да правим **отрицание** (**`else`**) за всяко едно от тях? Вариантът с вложените **`if` блокове** е валиден, но кодът би изглеждал много **неподреден** и със сигурност - **труден** за четене и поддръжка. -Логическо "**И**" (оператор **`&&`**) означава няколко условия да са **изпълнени едновременно**. В сила е следната таблица на истинност: +Логическо "**И**" (оператор **`and`**) означава няколко условия да са **изпълнени едновременно**. В сила е следната таблица на истинност: -|a|b|a && b| +|a|b|a and b| |-----|-----|-----| -|true
true
false
false|true
false
true
false|true
false
false
false| +|True
True
False
False|True
False
True
False|True
False
False
False| -### Как работи операторът && ? +### Как работи операторът `and` ? -Операторът **`&&`** приема **няколко булеви** (условни) израза, които имат стойност **`true`** или **`false`**, и ни връща **един** булев израз като **резултат**. Използването му **вместо** редица вложени **`if`** блокове прави кода **по-четлив**, **подреден** и **лесен** за поддръжка. Но как **работи**, когато поставим **няколко** условия едно след друго? Както видяхме по-горе, логическото **"И"** връща **`true`**, **само** когато приема като **аргументи изрази** със стойност **`true`**. Съответно, когато имаме **последователност** от аргументи, логическото "И" **проверява** или докато **свършат** аргументите, или докато не **срещне** аргумент със стойност **`false`**. +Операторът **`and`** приема **няколко булеви** (условни) израза, които имат стойност **`True`** или **`False`**, и ни връща **един** булев израз като **резултат**. Използването му вместо редица вложени **`if`** блокове прави кода **по-четлив**, **подреден** и **лесен** за поддръжка. Но как работи, когато поставим **няколко** условия едно след друго? Както видяхме по-горе, логическото **"И"** връща **`True`**, **само** когато приема като **аргументи изрази** със стойност **`True`**. Съответно, когато имаме **последователност** от аргументи, логическото "И" **проверява** или докато **свършат** аргументите, или докато не **срещне** аргумент със стойност **`False`**. **Пример**: -```csharp -bool a = true; -bool b = true; -bool c = false; -bool d = true; -bool result = a && b && c && d; -// false (като d не се проверява) +```python +a = True +b = True +c = False +d = True + +result = a and b and c and d +# False (като d не се проверява) ``` -Програмата ще се изпълни по **следния** начин: **започва** проверката от **`а`**, **прочита** я и отчита, че има стойност **`true`**, след което **проверява** **`b`**. След като е **отчела**, че **`a`** и **`b`** връщат стойност **`true`**, **проверява следващия** аргумент. Стига до **`c`** и отчита, че променливата има стойност **`false`**. След като програмата отчете, че аргументът **`c`** има стойност **`false`**, тя изчислява израза **до `c`**, **независимо** каква е стойността на **`d`**. За това проверката на **`d`** се **прескача** и целият израз бива изчислен като **`false`**. +Програмата ще се изпълни по **следния** начин: **започва** проверката от **`а`**, **прочита** я и отчита, че има стойност **`True`**, след което **проверява** **`b`**. След като е **отчела**, че **`a`** и **`b`** връщат стойност **`True`**, **проверява следващия** аргумент. Стига до **`c`** и отчита, че променливата има стойност **`False`**. След като програмата отчете, че аргументът **`c`** има стойност **`False`**, тя изчислява израза **до `c`**, **независимо** каква е стойността на **`d`**. За това проверката на **`d`** се **прескача** и целият израз бива изчислен като **`False`**. -![](/assets/old-images/chapter-4-images/00.Logical-and-01.png) ### Пример: точка в правоъгълник @@ -136,7 +131,7 @@ bool result = a && b && c && d; |Вход |Изход |Визуализация| |-----|------|:------:| -|2
-3
12
3
8
-1|Inside|![shop](/assets/chapter-4-images/03.Point-in-rectangle-01.png)| +|2
-3
12
3
8
-1|Inside|![shop](/assets/chapter-4-1-images/03.Point-in-rectangle-01.png)| #### Решение @@ -147,44 +142,45 @@ bool result = a && b && c && d; * Точката е надолу от горната страна на правоъгълника. * Точката е нагоре от долната страна на правоъгълника. -![](/assets/old-images/chapter-4-images/03.Point-in-rectangle-03.PNG) +![](/assets/chapter-4-1-images/03.Point-in-rectangle-03.png) #### Тестване в Judge системата -Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/508#2](https://judge.softuni.bg/Contests/Practice/Index/508#2). +Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/1051#2](https://judge.softuni.bg/Contests/Practice/Index/1051#2). ## Логическо "ИЛИ" -Логическо **"ИЛИ"** (оператор **`||`**) означава да е **изпълнено поне едно** измежду няколко условия. Подобно на оператора **`&&`**, логическото **"ИЛИ"** приема няколко аргумента от **булев** (условен) тип и връща **`true`** или **`false`**. Лесно можем да се досетим, че **получаваме** като стойност **`true`**, винаги когато поне **един** от аргументите има стойност **`true`**. Типичен пример за логиката на този оператор е следният: +Логическо **"ИЛИ"** (оператор **`or`**) означава да е **изпълнено поне едно** измежду няколко условия. Подобно на оператора **`and`**, логическото **"ИЛИ"** приема няколко аргумента от **булев** (условен) тип и връща **`True`** или **`False`**. Лесно можем да се досетим, че **получаваме** като стойност **`True`**, винаги когато поне **един** от аргументите има стойност **`True`**. Типичен пример за логиката на този оператор е следният: -В училище учителят казва: "Иван или Петър да измият дъската". За да бъде изпъл¬нено това условие (дъската да бъде измита), е възможно само Иван да я измие, само Петър да я измие или и двамата да го направят. +В училище учителят казва: "Иван или Петър да измият дъската". За да бъде изпълнено това условие (дъската да бъде измита), е възможно само Иван да я измие, само Петър да я измие или и двамата да го направят. -|a|b|a || b| +|a|b|a or b| |:-----:|:-----:|:-----:| -|true
true
false
false|true
false
true
false|true
true
true
false| +|True
True
False
False|True
False
True
False|True
True
True
False| -### Как работи операторът || ? +### Как работи операторът `or` ? -Вече научихме какво **представлява** логическото **"ИЛИ"**. Но как всъщност се реализира? Както при логическото **"И"**, програмата **проверява** от ляво на дясно **аргументите**, които са зададени. За да получим **`true`** от израза, е необходимо **само един** аргумент да има стойност **`true`**, съответно проверката **продължава** докато се срещне **аргумент** с **такава** стойност или докато **не свършат** аргументите. +Вече научихме какво **представлява** логическото **"ИЛИ"**. Но как всъщност се реализира? Както при логическото **"И"**, програмата **проверява** от ляво на дясно **аргументите**, които са зададени. За да получим **`True`** от израза, е необходимо **само един** аргумент да има стойност **`True`**, съответно проверката **продължава** докато се срещне **аргумент** с **такава** стойност или докато **не свършат** аргументите. -Ето един **пример** за оператора **`||`** в действие: +Ето един **пример** за оператора **`or`** в действие: -```csharp -bool a = false; -bool b = true; -bool c = false; -bool d = true; -bool result = a || b || c || d; -// true (като c и d не се проверяват) +```python +a = False +b = True +c = False +d = True + +result = a or b or c or d +# True (като c и d не се проверяват) ``` -Програмата **проверява `а`**, отчита, че има стойност **`false`** и продължава. Стигайки до **`b`**, отчита, че има стойност **`true`** и целият **израз** получава стойност **`true`**, **без** да се проверява **`c`** и **`d`**, защото техните стойности **не биха променили** резултата на израза. +Програмата **проверява `а`**, отчита, че има стойност **`False`** и продължава. Стигайки до **`b`**, отчита, че има стойност **`True`** и целият **израз** получава стойност **`True`**, **без** да се проверява **`c`** и **`d`**, защото техните стойности **не биха променили** резултата на израза. ### Пример: плод или зеленчук -Нека проверим дали даден **продукт** е **плод** или **зеленчук**. Плодовете "**fruit**" са **banana**, **apple**, **kiwi**, **cherry**, **lemon** и **grapes**. Зеленчуците "**vegetable**" са **tomato**, **cucumber**, **pepper** и **carrot**. Всички останали са "**unknown**". +Нека проверим дали даден продукт е **плод** или **зеленчук**. Плодовете "**fruit**" са **banana**, **apple**, **kiwi**, **cherry**, **lemon** и **grapes**. Зеленчуците "**vegetable**" са **tomato**, **cucumber**, **pepper** и **carrot**. Всички останали са "**unknown**". #### Примерен вход и изход @@ -194,24 +190,24 @@ bool result = a || b || c || d; #### Решение -Трябва да използваме няколко условни проверки с логическо "**ИЛИ**" (**`||`**): +Трябва да използваме няколко условни проверки с логическо "**ИЛИ**" (**`or`**): -![](/assets/old-images/chapter-4-images/04.Fruit-or-vegetable-01.png) +![](/assets/chapter-4-1-images/04.Fruit-or-vegetable-01.png) #### Тестване в Judge системата -Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/508#3](https://judge.softuni.bg/Contests/Practice/Index/508#3). +Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/1051#3](https://judge.softuni.bg/Contests/Practice/Index/1051#3). ## Логическо отрицание -**Логическо отрицание** (оператор **`!`**) означава да **не е изпълнено** дадено условие. +**Логическо отрицание** (оператор **`not`**) означава да **не е изпълнено** дадено условие. -|a|!a| +|a|not a| |:----:|:----:| -|true|false| +|True|False| -Операторът **`!`** приема като **аргумент** булева променлива и **обръща** стойността ѝ. +Операторът **`not`** приема като **аргумент** булева променлива и **обръща** стойността ѝ. ### Пример: невалидно число @@ -227,16 +223,16 @@ bool result = a || b || c || d; #### Решение -![](/assets/old-images/chapter-4-images/05.Invalid-number-01.png) +![](/assets/chapter-4-1-images/05.Invalid-number-01.png) #### Тестване в Judge системата -Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/508#4](https://judge.softuni.bg/Contests/Practice/Index/508#4). +Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/1051#4](https://judge.softuni.bg/Contests/Practice/Index/1051#4). ## Операторът скоби `()` -Както останалите оператори в програмирането, така и операторите **`&&`** и **`||`** имат приоритет, като в случая **`&&`** е с по-голям приоритет от **`||`**. Операторът **`()`** служи за **промяна на приоритета на операторите** и се изчислява пръв, също както в математиката. Използването на скоби също така придава по-добра четимост на кода и се счита за добра практика. +Както останалите оператори в програмирането, така и операторите **`and`** и **`or`** имат приоритет, като в случая **`and`** е с по-голям приоритет от **`or`**. Операторът **`()`** служи за **промяна на приоритета на операторите** и се изчислява пръв, също както в математиката. Използването на скоби също така придава по-добра четимост на кода и се счита за добра практика. ## По-сложни логически условия @@ -247,7 +243,7 @@ bool result = a || b || c || d; Да се напише програма, която проверява дали **точка {x, y}** се намира **върху някоя от страните на правоъгълник {x1, y1} - {x2, y2}**. Входните данни се четат от конзолата и се състоят от 6 реда: десетичните числа **x1**, **y1**, **x2**, **y2**, **x** и **y** (като се гарантира, че **x1 < x2** и **y1 < y2**). Да се отпечата "**Border**" (точката лежи на някоя от страните) или "**Inside / Outside**" (в противен случай). -![](/assets/old-images/chapter-4-images/06.Point-on-rectangle-border-01.png) +![](/assets/chapter-4-1-images/06.Point-on-rectangle-border-01.png) #### Примерен вход и изход @@ -258,22 +254,23 @@ bool result = a || b || c || d; #### Решение Точка лежи върху някоя от страните на правоъгълник, ако: + * **x** съвпада с **x1** или **x2** и същевременно **y** е между **y1** и **y2** или * **y** съвпада с **y1** или **y2** и същевременно **x** е между **x1** и **x2**. -![](/assets/old-images/chapter-4-images/06.Point-on-rectangle-border-02.png) +![](/assets/chapter-4-1-images/06.Point-on-rectangle-border-02.png) Предходната проверка може да се опрости по този начин: -![](/assets/old-images/chapter-4-images/06.Point-on-rectangle-border-03.png) +![](/assets/chapter-4-1-images/06.Point-on-rectangle-border-03.png) Вторият начин с допълнителните булеви променливи е по-дълъг, но е много по-разбираем от първия, нали? Препоръчваме ви когато пишете булеви условия, да ги правите **лесни за четене и разбиране**, а не кратки. Ако се налага, ползвайте допълнителни променливи със смислени имена. Имената на булевите променливи трябва да подсказват каква стойност се съхранява в тях. -Остава да допишете кода, за да отпечатва “**Inside / Outside**”, ако точката не е върху някоя от страните на правоъгълника. +Остава да се допише кода, за да отпечатва "**Inside / Outside**", ако точката не е върху някоя от страните на правоъгълника. #### Тестване в Judge системата -След като допишете решението, може да го тествате тук: [https://judge.softuni.bg/Contests/Practice/Index/508#5](https://judge.softuni.bg/Contests/Practice/Index/508#5). +След като допишете решението, може да го тествате тук: [https://judge.softuni.bg/Contests/Practice/Index/1051#5](https://judge.softuni.bg/Contests/Practice/Index/1051#5). ### Пример: магазин за плодове @@ -290,7 +287,7 @@ bool result = a || b || c || d; |:-----:|:-----:| |banana
apple
orange
grapefruit
kiwi
pineapple
grapes|2.70
1.25
0.90
1.60
3.00
5.60
4.20| -Напишете програма, която **чете** от конзолата **плод** (banana / apple / …), **ден от седмицата** (Monday / Tuesday / …) и **количество (десетично число)** и **пресмята цената** според цените от таблиците по-горе. Резултатът да се отпечата **закръглен с 2 цифри след десетичния знак**. При **невалиден ден** от седмицата или **невалидно име** на плод да се отпечата **“error”**. +Напишете програма, която чете от конзолата **плод** (banana / apple / …), **ден от седмицата** (Monday / Tuesday / …) и **количество (десетично число)** и **пресмята цената** според цените от таблиците по-горе. Резултатът да се отпечата **закръглен с 2 цифри след десетичния знак**. При **невалиден ден** от седмицата или **невалидно име** на плод да се отпечата **“error”**. #### Примерен вход и изход @@ -304,11 +301,11 @@ bool result = a || b || c || d; #### Решение -![](/assets/old-images/chapter-4-images/07.Fruit-shop-01.png) +![](/assets/chapter-4-1-images/07.Fruit-shop-01.png) #### Тестване в Judge системата -Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/508#6](https://judge.softuni.bg/Contests/Practice/Index/508#6). +Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/1051#6](https://judge.softuni.bg/Contests/Practice/Index/1051#6). ### Пример: търговски комисионни @@ -319,7 +316,7 @@ bool result = a || b || c || d; |:----:|:----:|:----:|:----:|:----:| |Sofia
Varna
Plovdiv|5%
4.5%
5.5%|7%
7.5%
8%|8%
10%
12%|12%
13%
14.5%| -Напишете **програма**, която чете име на **град** (стринг) и обем на **продажбите** (десетично число) и изчислява размера на комисионната. Резултатът да се изведе закръглен с **2 десетични цифри след десетичния знак**. При **невалиден град или обем на продажбите** (отрицателно число) да се отпечата "**error**". +Напишете програма, която чете име на **град** (стринг) и обем на **продажбите** (десетично число) и изчислява размера на комисионната. Резултатът да се изведе закръглен с **2 десетични цифри след десетичния знак**. При **невалиден град или обем на продажбите** (отрицателно число) да се отпечата "**error**". #### Примерен вход и изход @@ -329,91 +326,36 @@ bool result = a || b || c || d; #### Решение -При прочитането на входа можем да обърнем града в малки букви (с функцията **`.ToLower()`**). Първоначално задаваме комисионната да е **`-1`**. Тя ще бъде променена, ако градът и ценовият диапазон бъдат намерени в таблицата с комисионните. -За да изчислим комисионната според града и обема на продажбите се нуждаем от няколко вложени **`if` проверки**, както е в примерния код по-долу: +При прочитането на входа можем да обърнем града в малки букви (с функцията **`.lower()`**). Първоначално задаваме комисионната да е **`-1`**. Тя ще бъде променена, ако градът и ценовият диапазон бъдат намерени в таблицата с комисионните. За да изчислим комисионната според града и обема на продажбите, се нуждаем от няколко вложени **`if` проверки**, както е в примерния код по-долу: -![](/assets/old-images/chapter-4-images/08.Trade-comissions-01.png) +![](/assets/chapter-4-1-images/08.Trade-comissions-01.png) #### Тестване в Judge системата -Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/508#7](https://judge.softuni.bg/Contests/Practice/Index/508#7). - - - - -
Добра практика е да използваме блокове, които заграждаме с къдрави скоби { } след if и else. Също така, препоръчително e при писане да отместваме кода след if и else с една табулация навътре, за да направим кода по-лесно четим.
- - -## Условна конструкция switch-case - -Конструкцията **`switch-case`** работи като поредица **`if-else`** блокове. Когато работата на програмата ни зависи от стойността на **една променлива**, вместо да правим последователни проверки с **`if-else`** блокове, можем да **използваме** условната конструкция **`switch`**. Тя се използва за **избор измежду списък с възможности**. Конструкцията сравнява дадена стойност с определени константи и в зависимост от резултата предприема действие. - -**Променливата**, която искаме да **сравняваме**, поставяме в **скобите след оператора `switch`** и се нарича "**селектор**". Тук **типът трябва да е сравним** (числа, стрингове). **Последователно** започва **сравняването** с всяка една **стойност**, която **се намира** след **`case` етикетите**. При съвпадение започва изпълнението на кода от съответното място и продължава, докато стигне оператора **`break`**. В някои програмни езици (като C и C++) **`break`** може да се изпуска, за да се изпълнява код от друга **`case`** конструкция, докато не стигне до въпросния оператор. В Python обаче, наличието на **`break`** е **задължителен** за **всеки `case`**, който съдържа изпълнение на програмна логика. При **липса** на **съвпадение**, се изпълнява **`default`** конструкцията, **ако** такава **съществува**. - -```csharp -switch (селектор) -{ - case стойност1: - конструкция; - break; - case стойност2: - конструкция; - break; - case стойност3: - конструкция; - break; - … - default: - конструкция; - break; -} -``` +Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/1051#7](https://judge.softuni.bg/Contests/Practice/Index/1051#7). ### Пример: ден от седмицата -Нека напишем програма, която принтира **деня от седмицата** (на английски) според **въведеното число** (1 … 7) или "**Error!**", ако е подаден невалиден ден. +Нека напишем програма, която принтира **деня от седмицата** (на английски) според **въведеното число** (1 … 7) или "**Error**", ако е подаден невалиден ден. #### Примерен вход и изход |Вход|Изход| |-----|-----| -|1
7
-1|Monday
Sunday
Error!| +|1
7
-1|Monday
Sunday
Error| #### Решение -![](/assets/old-images/chapter-4-images/09.Day-of-week-01.png) +![](/assets/chapter-4-1-images/09.Day-of-week-01.png) - +
Добра практика е на първо място да поставяме онези case случаи, които обработват най-често случилите се ситуации, а case конструкциите, обработващи по-рядко възникващи ситуации, да оставим в края преди default конструкцията. Друга добра практика е да подреждаме case етикетите в нарастващ ред, без значение дали са целочислени или символни.Добра практика е на първо място да поставяме онези условия, които обработват най-често случилите се ситуации, а конструкциите, обработващи по-рядко възникващи ситуации, да оставим в края на конструкцията. Друга добра практика е да подреждаме случайте в нарастващ ред, без значение дали са целочислени или символни.
#### Тестване в Judge системата -Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/508#8](https://judge.softuni.bg/Contests/Practice/Index/508#8). - - -### Множество етикети в switch-case - -В **Python** имаме възможността да **използваме множество `case`** етикети, когато те трябва да изпълняват **един и същи** код. При този начин на записване, когато **програмата** ни намери **съвпадение**, ще изпълни **следващия** срещнат код, тъй като **след** съответния **`case`** етикет **липсва код** за изпълнение и **`break`** оператор. - -```csharp -switch (селектор) -{ - case стойност1: - case стойност2: - case стойност3: - конструкция; - break; - case стойност4: - case стойност5: - конструкция; - break; - … - default: - конструкция; - break; -} -``` +Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/1051#8](https://judge.softuni.bg/Contests/Practice/Index/1051#8). + ### Пример: вид животно @@ -426,63 +368,41 @@ switch (селектор) #### Примерен вход и изход |Вход|Изход|Вход|Изход|Вход|Изход| -|-----|-----|-----|-----|-----|-----| +|------|------|------|------|------|-----| |tortoise|reptile|dog|mammal|elephant|unknown| #### Решение -Можем да решим задачата чрез **`switch`**-**`case`** проверки с множество етикети по следния начин: +Можем да решим задачата чрез няколко **`if-elif`** проверки по следния начин: -![](/assets/old-images/chapter-4-images/10.Animal-type-01.png) +![](/assets/chapter-4-1-images/10.Animal-type-01.png) #### Тестване в Judge системата -Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/508#9](https://judge.softuni.bg/Contests/Practice/Index/508#9). +Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/1051#9](https://judge.softuni.bg/Contests/Practice/Index/1051#9). ## Какво научихме от тази глава? -Да си припомним новите конструкции и програмни техники, с които се запознахме в тази глава. +Да си припомним новите конструкции и програмни техники, с които се запознахме в тази глава: ### Вложени проверки -```csharp -if (condition1) -{ - if (condition2) - // тяло; - else - // тяло; -} +```python +if condition1: + if condition2: + # тяло + else: + # тяло ``` -### По-сложни проверки с &&, ||, ! и () - -```csharp -if ((x == left || x == right) && y >= top && y <= bottom) - Console.WriteLine(…); -``` +### По-сложни проверки с and, or, not и () -#### Switch-case проверки - -```csharp -switch (селектор) -{ - case стойност1: - конструкция; - break; - case стойност2: - case стойност3: - конструкция; - break; - … - default: - конструкция; - break; -} +```python +if (x == left or x == right) and (y >= top or y <= bottom): + print(...) ``` - ## Упражнения: по-сложни проверки Нека сега да упражним работата с по-сложни проверки. Да решим няколко практически задачи. @@ -505,15 +425,15 @@ switch (селектор) #### Насоки и подсказки -При прочитането на входа можем да обърнем типа на прожекцията в малки букви (с функцията **`.ToLower()`**). Създаваме и инициализираме променлива, която ще ни съхранява изчислените приходи. В друга променлива пресмятаме пълния капацитет на залата. Използваме **`switch-case`** условна конструкция, за да изчислим прихода в зависимост от вида на прожекцията и отпечатваме резултата на конзолата в зададения формат (потърсете нужната **Python** функционалност в интернет). +При прочитането на входа можем да обърнем типа на прожекцията в малки букви (с функцията **`.lower()`**). Създаваме и променлива, която ще ни съхранява изчислените приходи. В друга променлива пресмятаме пълния капацитет на залата. Използваме **`if-elif`** условна конструкция, за да изчислим прихода в зависимост от вида на прожекцията и отпечатваме резултата на конзолата в зададения формат (потърсете нужната **Python** функционалност в интернет). -Примерен код (части от кода са замъглени с цел да се стимулира самостоятелно мислене и решение): +Примерен код на описаната идея (части от кода са замъглени с цел да се стимулира самостоятелно мислене и решение): -![](/assets/old-images/chapter-4-images/11.Cinema-01.png) +![](/assets/chapter-4-1-images/11.Cinema-01.png) #### Тестване в Judge системата -Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/508#10](https://judge.softuni.bg/Contests/Practice/Index/508#10). +Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/1051#10](https://judge.softuni.bg/Contests/Practice/Index/1051#10). ### Задача: волейбол @@ -539,22 +459,22 @@ switch (селектор) #### Насоки и подсказки -Стандартно прочитаме входните данни от конзолата като за избягване на грешки при въвеждане обръщаме текста в малки букви с функцията **`.ToLower()`**. Последователно пресмятаме **уикендите прекарани в София**, **времето за игра в София** и **общото време за игра**. Накрая проверяваме дали годината е **високосна**, правим допълнителни изчисления при необходимост и извеждаме резултата на конзолата **закръглен надолу** до най-близкото **цяло число** (потърсете **Python** функция с такава функционалност в интернет). +Стандартно прочитаме входните данни от конзолата като за избягване на грешки при въвеждане обръщаме текста в малки букви с функцията **`.lower()`**. Последователно пресмятаме **уикендите прекарани в София**, **времето за игра в София** и **общото време за игра**. Накрая проверяваме дали годината е **високосна**, правим допълнителни изчисления при необходимост и извеждаме резултата на конзолата **закръглен надолу** до най-близкото **цяло число** (потърсете **Python** функция с такава функционалност в интернет). -Примерен код (части от кода са замъглени с цел да се стимулира самостоятелно мислене и решение): +Примерен код на описаната идея (части от кода са замъглени с цел да се стимулира самостоятелно мислене и решение): -![](/assets/old-images/chapter-4-images/11.Volleyball-01.png) +![](/assets/chapter-4-1-images/12.Volleyball-01.png) #### Тестване в Judge системата -Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/508#11](https://judge.softuni.bg/Contests/Practice/Index/508#11). +Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/1051#11](https://judge.softuni.bg/Contests/Practice/Index/1051#11). ### Задача: * точка във фигурата Фигура се състои от **6 блокчета с размер h \* h**, разположени като на фигурата. Долният ляв ъгъл на сградата е на позиция {0, 0}. Горният десен ъгъл на фигурата е на позиция {**2\*h**, **4\*h**}. На фигурата координатите са дадени при **h = 2**: -![](/assets/old-images/chapter-4-images/13.Point-in-the-figure-01.png) +

Да се напише програма, която въвежда цяло число **h** и координатите на дадена **точка {x, y}** (цели числа) и отпечатва дали точката е вътре във фигурата (**inside**), вън от фигурата (**outside**) или на някоя от стените на фигурата (**border**). @@ -586,7 +506,7 @@ switch (селектор) * Може да разделим фигурата на **два правоъгълника** с обща стена: -

+

* Една точка е **външна (outside)** за фигурата, когато е едновременно **извън** двата правоъгълника. * Една точка е **вътрешна (inside)** за фигурата, ако е вътре в някой от правоъгълниците (изключвайки стените им) или лежи върху общата им стена. @@ -594,240 +514,8 @@ switch (селектор) Примерен код (части от кода са замъглени с цел да се стимулира самостоятелно мислене и решение): -![](/assets/old-images/chapter-4-images/13.Point-in-the-figure-02.png) +![](/assets/chapter-4-1-images/13.Point-in-the-figure-02.png) #### Тестване в Judge системата -Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/508#12](https://judge.softuni.bg/Contests/Practice/Index/508#12). - - -## Упражнения: графично приложение с по-сложни проверки - -В тази глава научихме как можем да правим **проверки с нетривиални условия**. Нека сега приложим тези знания, за да създадем нещо интересно: настолно приложение, което визуализира точка и правоъгълник. Това е прекрасна визуализация за една от задачите от упражненията. - -### Задача: * точка и правоъгълник – графично (GUI) приложение - -Задачата, която си поставяме е да се разработи графично (**GUI**) приложение за **визуализация на точка и правоъгълник**. Приложението трябва да изглежда приблизително по следния начин: - -![](/assets/old-images/chapter-4-images/14.Point-in-rectangle-gui-01.png) - -![](/assets/old-images/chapter-4-images/14.Point-in-rectangle-gui-02.png) - -![](/assets/old-images/chapter-4-images/14.Point-in-rectangle-gui-03.png) - -От контролите вляво се задават координатите на **два от ъглите на правоъгълник** (десетични числа) и координатите на **точка**. Приложението **визуализира графично** правоъгълника и точката и изписва дали точката е **вътре** в правоъгълника (**Inside**), **вън** от него (**Outside**) или на някоя от стените му (**Border**). -Приложението **премества и мащабира** координатите на правоъгълника и точката, за да бъдат максимално големи, но да се събират в полето за визуализация в дясната страна на приложението. - - - -
Внимание: това приложение е значително по-сложно от предходните графични приложения, които разработвахме до сега, защото изисква ползване на функции за чертане и нетривиални изчисления за преоразмеряване и преместване на правоъгълника и точката. Следват инструкции за изграждане на приложението стъпка по стъпка.
- -Създаваме нов проект **Windows Forms Application** с подходящо име, например “Point-and-Rectangle”: - -![](/assets/old-images/chapter-4-images/14.Point-in-rectangle-gui-04.png) - -**Нареждаме контролите** във формата, както е показано на фигурата по-долу: -* 6 кутийки за въвеждане на число (**`NumericUpDown`**). -* Надписи (**`Label`**) пред всяка кутийка за въвеждане на число. -* Бутон (**`Button`**) за изчертаване на правоъгълника и точката. -* Текстов блок за резултата (**`Label`**). - -Нагласяме **размерите** и **свойствата** на контролите, за да изглеждат приблизително като на картинката: - -![](/assets/old-images/chapter-4-images/14.Point-in-rectangle-gui-05.png) - -Задаваме следните препоръчителни настройки на контролите: - -* За **главната форма (`Form`)**, която съдържа всички контроли: - * (name) = **`FormPointAndRectangle`** - * **`Text`** = **`Point and Rectangle`** - * **`Font.Size`** = **`12`** - * **`Size`** = **`700`**, **`410`** - * **`MinimumSize`** = **`500`**, **`400`** - * **`FormBorderStyle`** = **`FixedSingle`** -* За **полетата за въвеждане на число (`NumericUpDown`)**: - * (name) = **`numericUpDownX1`**; **`numericUpDownY1`**; **`numericUpDownX2`**; **`numericUpDownY2`**; **`numericUpDownX`**; **`numericUpDownY`** - * **`Value`** = **`2`**; **`-3`**; **`12`**; **`3`**; **`8`**; **`-1`** - * **`Minimum`** = **`-100000`** - * **`Maximum`** = **`100000`** - * **`DecimalPlaces`** = **`2`** -* За **бутона (`Button`)** за **визуализация** на правоъгълника и точката: - * (name) = **`buttonDraw`** - * **Text** = **`Draw`** -* За **текстовия блок за резултата (`Label`)**: - * (name) = **`labelLocation`** - * **`AutoSize`** = **`false`** - * **`BackColor`** = **`PaleGreen`** - * **`TextAlign`** = **`MiddleCenter`** -* За **полето с чертежа (`PictureBox`)**: - * (name) = **`pictureBox`** - * **`Anchor`** = **`Top`**, **`Bottom`**, **`Left`**, **`Right`** - -Следва да хванем следните **събития**, за да напишем C# кода, който ще се изпълни при настъпването им: - -* Събитието **`Click`** на бутона **`buttonDraw`** (извиква се при натискане на бутона). -* Събитието **`ValueChanged`** на контролите за въвеждане на числа **`numericUpDownX1`**, **`numericUpDownY1`**, **`numericUpDownX2`**, **`numericUpDownY2`**, **`numericUpDownX`** и **`numericUpDownY`** (извиква се при промяна на стойността в контролата за въвеждане на число). -* Събитието **`Load`** на формата **`FormPointAndRectangle`** (извиква се при стартиране на приложението, преди да се появи главната форма на екрана). -* Събитието **`Resize`** на формата **`FormPointAndRectangle`** (извиква се при промяна на размера на главната формата). - -Всички изброени по-горе събития ще изпълняват едно и също действие – **`Draw()`**, което ще визуализира правоъгълника и точката и ще показва дали тя е вътре, вън или на някоя от страните. Кодът трябва да изглежда така: - -```csharp -private void buttonDraw_Click(object sender, EventArgs e) -{ - Draw(); -} - -private void FormPointAndRectangle_Load(object sender, EventArgs e) -{ - Draw(); -} - -private void FormPointAndRectangle_Resize(object sender, EventArgs e) -{ - Draw(); -} - -private void numericUpDownX1_ValueChanged(object sender, EventArgs e) -{ - Draw(); -} - - /* TODO: implement in the same way event handlers - numericUpDownY1_ValueChanged, - numericUpDownX2_ValueChanged, - numericUpDownY2_ValueChanged, - numericUpDownX_ValueChanged and - numericUpDownY_ValueChanged */ - -private void Draw() -{ - // TODO: implement this a bit later … -} -``` - -Нека започнем от по-лесната част: **печат на информация къде е точката спрямо правоъгълника** (Inside, Outside или Border). Кодът трябва да изглежда така: - -```csharp -private void Draw() -{ - // Get the rectangle and point coordinates from the form - var x1 = this.numericUpDownX1.Value; - var y1 = this.numericUpDownY1.Value; - var x2 = this.numericUpDownX2.Value; - var y2 = this.numericUpDownY2.Value; - var x = this.numericUpDownX.Value; - var y = this.numericUpDownY.Value; - - // Display the location of the point: Inside / Border / Outside - DisplayPointLocation(x1, y1, x2, y2, x, y); -} - -private void DisplayPointLocation( - decimal x1, decimal y1, decimal x2, decimal y2, decimal x, decimal y) -{ - var left = Math.Min(x1, x2); - var right = Math.Max(x1, x2); - var top = Math.Min(y1, y2); - var bottom = Math.Max(y1, y2); - if (x > left && x < right && …) - { - this.labelLocation.Text = "Inside"; - this.labelLocation.BackColor = Color.LightGreen; - } - else if (… || y < top || y > bottom) - { - this.labelLocation.Text = "Outside"; - this.labelLocation.BackColor = Color.LightSalmon; - } - else - { - this.labelLocation.Text = "Border"; - this.labelLocation.BackColor = Color.Gold; - } -} -``` -Горният код взима координатите на правоъгълника и точките и проверява дали точката е вътре, вън или на страната на правоъгълника. При визуализацията на резултата се сменя и цвета на фона на текстовия блок, който го съдържа. - -Помислете как **да допишете** недовършените (нарочно) условия в **`if` проверките**! Кодът по-горе **нарочно не се компилира**, защото целта му е да помислите как и защо работи и да **допишете сами липсващите части**. - -Остава да се имплементира най-сложната част: визуализация на правоъгълника и точката в контролата **`pictureBox`** с преоразмеряване. Може да си помогнем с **кода по-долу**, който прави малко изчисления и рисува син правоъгълник и тъмносиньо кръгче (точката) според зададените във формата координати. За съжаление сложността на кода надхвърля изучавания до момента материал и е сложно да се обясни в детайли как точно работи. Оставени са коментари за ориентация. Това е пълната версия на действието **`Draw()`**: - -```csharp -private void Draw() -{ - // Get the rectangle and point coordinates from the form - var x1 = this.numericUpDownX1.Value; - var y1 = this.numericUpDownY1.Value; - var x2 = this.numericUpDownX2.Value; - var y2 = this.numericUpDownY2.Value; - var x = this.numericUpDownX.Value; - var y = this.numericUpDownY.Value; - - // Display the location of the point: Inside / Border / Outside - DisplayPointLocation(x1, y1, x2, y2, x, y); - - // Calculate the scale factor (ratio) for the diagram holding the - // rectangle and point in order to fit them well in the picture box - var minX = Min(x1, x2, x); - var maxX = Max(x1, x2, x); - var minY = Min(y1, y2, y); - var maxY = Max(y1, y2, y); - var diagramWidth = maxX - minX; - var diagramHeight = maxY - minY; - var ratio = 1.0m; - var offset = 10; - if (diagramWidth != 0 && diagramHeight != 0) - { - var ratioX = (pictureBox.Width - 2 * offset - 1) / diagramWidth; - var ratioY = (pictureBox.Height - 2 * offset - 1) / diagramHeight; - ratio = Math.Min(ratioX, ratioY); - } - - // Calculate the scaled rectangle coordinates - var rectLeft = offset + (int)Math.Round((Math.Min(x1, x2) - minX) * ratio); - var rectTop = offset + (int)Math.Round((Math.Min(y1, y2) - minY) * ratio); - var rectWidth = (int)Math.Round(Math.Abs(x2 - x1) * ratio); - var rectHeight = (int)Math.Round(Math.Abs(y2 - y1) * ratio); - var rect = new Rectangle(rectLeft, rectTop, rectWidth, rectHeight); - - // Calculate the scalled point coordinates - var pointX = (int)Math.Round(offset + (x - minX) * ratio); - var pointY = (int)Math.Round(offset + (y - minY) * ratio); - var pointRect = new Rectangle(pointX - 2, pointY - 2, 5, 5); - - // Draw the rectangle and point - pictureBox.Image = new Bitmap(pictureBox.Width, pictureBox.Height); - using (var g = Graphics.FromImage(pictureBox.Image)) - { - // Draw diagram background (white area) - g.Clear(Color.White); - - // Draw the rectangle (scalled to the picture box size) - var pen = new Pen(Color.Blue, 3); - g.DrawRectangle(pen, rect); - - // Draw the point (scalled to the picture box size) - pen = new Pen(Color.DarkBlue, 5); - g.DrawEllipse(pen, pointRect); - } -} - -private decimal Min(decimal val1, decimal val2, decimal val3) -{ - return Math.Min(val1, Math.Min(val2, val3)); -} - -private decimal Max(decimal val1, decimal val2, decimal val3) -{ - return Math.Max(val1, Math.Max(val2, val3)); -} -``` - -В горния код се срещат доста **преобразувания на типове**, защото се работи с различни типове числа (десетични числа, реални числа и цели числа) и понякога се изисква да се преминава между тях. - -Накрая **компилираме кода**. Ако има грешки, ги отстраняваме. Най-вероятната **причина** за грешка е **несъответстващо име на някоя от контролите** или ако **сте написали кода на неправилно място**. - -**Стартираме приложението** и го **тестваме**. Въвеждаме различни данни, за да видим дали се държи коректно. - -Ако имате проблеми с примерния проект по-горе, **гледайте видеото** в началото на тази глава. Там приложението е направено на живо стъпка по стъпка с много обяснения. Или питайте във **форума на СофтУни**: https://softuni.bg/forum. +Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/1051#12](https://judge.softuni.bg/Contests/Practice/Index/1051#12).