Skip to content

Commit 106b29a

Browse files
authored
Problem 5 converted to Python
1 parent faf88df commit 106b29a

File tree

1 file changed

+11
-11
lines changed

1 file changed

+11
-11
lines changed

chapter-02-simple-calculations-exam-problems.md

+11-11
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ str = firstName + " " + lastName + " is " + age + " years old";
417417

418418
## Задача: дневна печалба
419419

420-
Иван е програмист в **американска компания** и **работи** от вкъщи **средно N дни в месеца**, като изкарва **средно по M долара на ден**. В края на годината Иван **получава бонус**, който е **равен на 2.5 месечни заплати. От спечеленото през годината му се удържат 25% данъци**. Напишете програма, която да **пресмята колко е чистата средна печалба на Иван на ден в лева**, тъй като той харчи изкараното в България. Приема се, че **в годината има точно 365 дни. Курсът на долара** спрямо лева ще **се чете от конзолата**.
420+
Иван е програмист в американска компания и **работи** от вкъщи **средно N дни в месеца**, като изкарва **средно по M долара на ден**. В края на годината Иван **получава бонус**, който е **равен на 2.5 месечни заплати**. От спечеленото през годината му се у**държат 25% данъци**. Напишете програма, която да **пресмята колко е чистата средна печалба** на Иван на ден в лева, тъй като той харчи изкараното в България. Приема се, че в годината има точно 365 дни. Курсът на долара спрямо лева ще **се подава на функцията**.
421421

422422
### Входни данни
423423

@@ -428,7 +428,7 @@ str = firstName + " " + lastName + " is " + age + " years old";
428428

429429
### Изходни данни
430430

431-
На конзолата **да се отпечата 1 число – средната печалба на ден в лева**. Резултатът да се **форматира до втората цифра след десетичния знак**.
431+
На конзолата да се отпечата едно число – **средната печалба на ден в лева**. Резултатът да се **форматира до втората цифра след десетичния знак**.
432432

433433
### Примерен вход и изход
434434

@@ -453,33 +453,33 @@ str = firstName + " " + lastName + " is " + age + " years old";
453453

454454
#### Идея за решение
455455

456-
Нека първо пресметнем **колко е месечната заплата** на Иван. Това ще направим като **умножим работните дни в месеца по парите**, които той печели на ден. **Умножаваме получения резултат** първо по 12, за да изчислим колко е заплатата му за 12 месеца, а след това и **по 2.5**, за да пресметнем бонуса. Като съберем двете получени стойности, ще изчислим **общия му годишен доход**. От него **трябва да извадим 25%**. Това може да направим като умножим общия доход по **0.25** и извадим резултата от него. Спрямо дадения ни курс **преобразуваме доларите в лева**, след което **разделяме резултата на дните в годината**, за които приемаме, че са 365.
456+
Нека първо пресметнем **колко е месечната заплата** на Иван. Това ще направим като **умножим работните дни в месеца по парите**, които той печели на ден. **Умножаваме получения резултат** първо по 12, за да изчислим колко е заплатата му за 12 месеца, а след това и **по 2.5**, за да пресметнем бонуса. Като съберем двете получени стойности, ще изчислим **общия му годишен доход**. От него **трябва да извадим 25%**. Това може да направим като умножим общия доход по **0.25** и извадим резултата от него. Спрямо дадения ни курс **преобразуваме доларите в лева**, след което **разделяме резултата на дните в годината**, за които приемаме, че са 365.
457457

458458
#### Избор на типове данни
459459

460-
**Работните дни за месец** са дадени като **цяло число**, следователно за тяхната стойност може да декларираме променлива от **тип `int`**. За **изкараните пари**, както и за **курса на долара спрямо лева**, ще получим **реално число**, следователно за тях използваме **`double`**. Тъй като **`double`** e типът данни с **по-голям обхват**, а за изходната стойност също се изисква **реално число** (с цяла и дробна част), ще използваме него и за останалите променливи, които създаваме.
460+
**Работните дни за месец** са дадени като **цяло число**, следователно за тяхната стойност може да декларираме променлива, в която да конвертираме подадената стрингова стойност до число с функцията **`int(…)`**. За **изкараните пари**, както и за **курса на долара спрямо лева**, ще ни бъдат подадени **реални числа**, следователно за тях ще използваме функцията **`float(…)`**.
461461

462462
#### Решение
463463

464-
Отново: след като имаме идея как да решим задачата и сме помислили за типовете данни, с които ще работим, пристъпваме към **писането на програмата**. Както и в предходните задачи, можем да разделим решението на три подзадачи:
464+
Отново, след като имаме идея как да решим задачата и сме помислили за типовете данни, с които ще работим, пристъпваме към **писането на програмата**. Както и в предходните задачи, можем да разделим решението на три подзадачи:
465465
* **Прочитане на входните данни**.
466466
* **Извършване на изчисленията**.
467467
* **Извеждане на изход** на конзолата.
468468

469-
**Декларираме променливите**, които ще използваме, като отново се стараем да изберем **подходящи имена**. С **`Console.ReadLine(…)`** четем подадените числа на конзолата и **преобразуваме** въведения от потребителя стринг към **`int`** или **`double`** с **`int/double.Parse(…)`**.
469+
**Декларираме променливите**, които ще използваме, като отново се стараем да изберем **подходящи имена**. Създаваме си променливи, в които запазваме прочетените стойности от конзолата, като **преобразуваме** стринга към цяло или дробно число с **`int(…)/float(…)`**:
470470

471-
![](/assets/old-images/chapter-2-2-images/05.Daily-earnings-01.png)
471+
![](/assets/chapter-2-2-images/05.Daily-earnings-01.png)
472472

473473
Извършваме изчисленията:
474474

475-
![](/assets/old-images/chapter-2-2-images/05.Daily-earnings-02.png)
475+
![](/assets/chapter-2-2-images/05.Daily-earnings-02.png)
476476

477477
Бихме могли да напишем израза, с който пресмятаме общия годишен доход, и без скоби. Тъй като умножението е операция с по-висок приоритет от събирането, то ще се извърши първо. Въпреки това **писането на скоби се препоръчва, когато използваме повече оператори**, защото така кодът става **по-лесно четим** и възможността да се допусне грешка е по-малка.
478478

479-
Накрая остава да изведем резултата на конзолата. Забелязваме, че се **изисква форматиране на числената стойност до втория знак след десетичната точка**. За целта можем да използваме **placeholder, т.е. място, което ще бъде заместено с конкретна стойност при отпечатването**. В C# за **placeholder** се използва цифра, оградена с къдрави скоби. Тъй като **в програмирането броенето започва от 0**, изразът **`{0}`** означава, че на негово място ще бъде поставен първият подаден аргумент. Цяло или дробно число можем да форматираме със спецификаторите **F** или **f**. След него следва цяло положително число, което указва броя на знаците след десетичния знак (повече за форматирането може да прочетете на [Светлин Наков, Веселин Колев и колектив: "Въведение в програмирането със C#", стр. 155-158](http://www.introprogramming.info/intro-csharp-book/read-online/glava4-vhod-i-izhod-ot-konzolata/#_Toc298863992)):
479+
Накрая остава да изведем резултата на екрана. Забелязваме, че се **изисква форматиране на числената стойност до втория знак след десетичната точка**. Можем да използваме същия подход от предходната задача: форматиране стринг по зададен шаблон:
480480

481-
![](/assets/old-images/chapter-2-2-images/05.Daily-earnings-03.png)
481+
![](/assets/chapter-2-2-images/05.Daily-earnings-03.png)
482482

483483
### Тестване в Judge системата
484484

485-
Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/505#4](https://judge.softuni.bg/Contests/Practice/Index/505#4).
485+
Тествайте решението си тук: [https://judge.softuni.bg/Contests/Practice/Index/1048#4](https://judge.softuni.bg/Contests/Practice/Index/1048#4).

0 commit comments

Comments
 (0)