You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: chapter-02-simple-calculations-exam-problems.md
+11-11
Original file line number
Diff line number
Diff line change
@@ -417,7 +417,7 @@ str = firstName + " " + lastName + " is " + age + " years old";
417
417
418
418
## Задача: дневна печалба
419
419
420
-
Иван е програмист в **американска компания** и **работи** от вкъщи **средно N дни в месеца**, като изкарва **средно по M долара на ден**. В края на годината Иван **получава бонус**, който е **равен на 2.5 месечни заплати. От спечеленото през годината му се удържат 25% данъци**. Напишете програма, която да **пресмята колко е чистата средна печалба на Иван на ден в лева**, тъй като той харчи изкараното в България. Приема се, че **в годината има точно 365 дни. Курсът на долара** спрямо лева ще **се чете от конзолата**.
420
+
Иван е програмист в американска компания и **работи** от вкъщи **средно N дни в месеца**, като изкарва **средно по M долара на ден**. В края на годината Иван **получава бонус**, който е **равен на 2.5 месечни заплати**. От спечеленото през годината му се у**държат 25% данъци**. Напишете програма, която да **пресмята колко е чистата средна печалба** на Иван на ден в лева, тъй като той харчи изкараното в България. Приема се, че в годината има точно 365 дни. Курсът на долара спрямо лева ще **се подава на функцията**.
421
421
422
422
### Входни данни
423
423
@@ -428,7 +428,7 @@ str = firstName + " " + lastName + " is " + age + " years old";
428
428
429
429
### Изходни данни
430
430
431
-
На конзолата **да се отпечата 1 число – средната печалба на ден в лева**. Резултатът да се **форматира до втората цифра след десетичния знак**.
431
+
На конзолата да се отпечата едно число – **средната печалба на ден в лева**. Резултатът да се **форматира до втората цифра след десетичния знак**.
432
432
433
433
### Примерен вход и изход
434
434
@@ -453,33 +453,33 @@ str = firstName + " " + lastName + " is " + age + " years old";
453
453
454
454
#### Идея за решение
455
455
456
-
Нека първо пресметнем **колко е месечната заплата** на Иван. Това ще направим като **умножим работните дни в месеца по парите**, които той печели на ден. **Умножаваме получения резултат** първо по 12, за да изчислим колко е заплатата му за 12 месеца, а след това и **по 2.5**, за да пресметнем бонуса. Като съберем двете получени стойности, ще изчислим **общия му годишен доход**. От него **трябва да извадим 25%**. Това може да направим като умножим общия доход по **0.25** и извадим резултата от него. Спрямо дадения ни курс **преобразуваме доларите в лева**, след което **разделяме резултата на дните в годината**, за които приемаме, че са 365.
456
+
Нека първо пресметнем **колко е месечната заплата** на Иван. Това ще направим като **умножим работните дни в месеца по парите**, които той печели на ден. **Умножаваме получения резултат** първо по 12, за да изчислим колко е заплатата му за 12 месеца, а след това и **по 2.5**, за да пресметнем бонуса. Като съберем двете получени стойности, ще изчислим **общия му годишен доход**. От него **трябва да извадим 25%**. Това може да направим като умножим общия доход по **0.25** и извадим резултата от него. Спрямо дадения ни курс **преобразуваме доларите в лева**, след което **разделяме резултата на дните в годината**, за които приемаме, че са 365.
457
457
458
458
#### Избор на типове данни
459
459
460
-
**Работните дни за месец** са дадени като **цяло число**, следователно за тяхната стойност може да декларираме променлива от **тип `int`**. За **изкараните пари**, както и за **курса на долара спрямо лева**, ще получим **реално число**, следователно за тях използваме **`double`**. Тъй като **`double`** e типът данни с **по-голям обхват**, а за изходната стойност също се изисква **реално число** (с цяла и дробна част), ще използваме него и за останалите променливи, които създаваме.
460
+
**Работните дни за месец** са дадени като **цяло число**, следователно за тяхната стойност може да декларираме променлива, в която да конвертираме подадената стрингова стойност до число с функцията **`int(…)`**. За **изкараните пари**, както и за **курса на долара спрямо лева**, ще ни бъдат подадени **реални числа**, следователно за тях ще използваме функцията **`float(…)`**.
461
461
462
462
#### Решение
463
463
464
-
Отново: след като имаме идея как да решим задачата и сме помислили за типовете данни, с които ще работим, пристъпваме към **писането на програмата**. Както и в предходните задачи, можем да разделим решението на три подзадачи:
464
+
Отново, след като имаме идея как да решим задачата и сме помислили за типовете данни, с които ще работим, пристъпваме към **писането на програмата**. Както и в предходните задачи, можем да разделим решението на три подзадачи:
465
465
***Прочитане на входните данни**.
466
466
***Извършване на изчисленията**.
467
467
***Извеждане на изход** на конзолата.
468
468
469
-
**Декларираме променливите**, които ще използваме, като отново се стараем да изберем **подходящи имена**. С **`Console.ReadLine(…)`** четем подадените числа на конзолата и**преобразуваме**въведения от потребителя стринг към **`int`** или **`double`**с **`int/double.Parse(…)`**.
469
+
**Декларираме променливите**, които ще използваме, като отново се стараем да изберем **подходящи имена**. Създаваме си променливи, в които запазваме прочетените стойности от конзолата, като**преобразуваме**стринга към цяло или дробно число с **`int(…)/float(…)`**:
Бихме могли да напишем израза, с който пресмятаме общия годишен доход, и без скоби. Тъй като умножението е операция с по-висок приоритет от събирането, то ще се извърши първо. Въпреки това **писането на скоби се препоръчва, когато използваме повече оператори**, защото така кодът става **по-лесно четим** и възможността да се допусне грешка е по-малка.
478
478
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
+
Накрая остава да изведем резултата на екрана. Забелязваме, че се **изисква форматиране на числената стойност до втория знак след десетичната точка**. Можем да използваме същия подход от предходната задача: форматиране стринг по зададен шаблон:
0 commit comments