Как се решава задача
Проблем
Празният екран
Имаш задача: първия ден спестяваш 1 €, втория 2 €, третия 3 € и така нататък. Колко евро ще имаш след N дни?
Отваряш редактора и… не знаеш с кой ред да започнеш. Това се случва на всеки, а причината рядко е, че не знаеш езика. Обикновено още не е ясно какво точно трябва да направи програмата. Затова решението започва преди кода: на хартия или в главата.
Идеята
Прочети условието
Задачите в курса изглеждат така:
Спестявания. Първия ден спестяваш 1 €, втория 2 €, третия 3 € и така нататък. Въвежда се броят на дните N. Изведи колко евро си спестил общо.
Вход:
5Изход:15
Преди да мислиш за решение, отговори си на три въпроса:
- Какво получавам? Едно цяло число N, броя на дните.
- Какво трябва да изведа и в какъв вид? Едно число, без друг текст.
- Разбирам ли примера? Сметни го на ръка: 1 + 2 + 3 + 4 + 5 = 15. Съвпада с изхода.
Ако сметката на ръка не дава изхода от примера, значи не си разбрал условието. Прочети го пак, преди да пишеш каквото и да е.
Идеята
Раздели задачата
Голямата задача се решава трудно наведнъж. Раздели я на части, всяка от които знаеш как да направиш:
1. прочети броя на дните N2. събери числата от 1 до N3. изведи сбораПървата и третата част са ясни. Втората още е голяма, затова я раздели и нея. Как събираш на ръка? Държиш сбора в главата си и към него добавяш следващото число, едно по едно. Така прави и касиерът, който маркира покупките ти.
Разделяй, докато всяка част стане толкова малка, че да е ясно как се прави.
До анимацията е програмата, която следва тези части. Думите в нея ще научиш в следващия модул. Засега гледай как всяка част става ред или два код.
int n = int.Parse(Console.ReadLine());int sum = 0;for (int day = 1; day <= n; day++){ sum += day;}Console.WriteLine(sum);Стъпка по стъпка, с думи
- Наведнъж задачата е голяма: колко евро спестяваш за N дни?
- Разделяш я на три части. Всяка е ясна сама за себе си.
- Част 1: прочети N. В примера N = 5.
- Част 2: сборът започва от 0 и към него се добавя всяко число от 1 до N.
- Тест на сухо: 0 + 1 + 2 + 3 + 4 + 5 = 15.
- Част 3: изведи сбора. Изходът е 15, както в примера.
Идеята
Напиши плана с думи
Сега подреди стъпките с обикновени думи:
прочети Nсума = 0за всяко число от 1 до N: добави числото към суматаизведи суматаТова се казва псевдокод: описание на решението, което прилича на програма, но не е на никой език. Няма строги правила. Важното е всяка стъпка да е ясна и да са в правилния ред.
Отстъпът на четвъртия ред показва, че тази стъпка се повтаря за всяко число. Скоро ще видиш как се пише това на истински език.
Виж го
Тест на сухо
Работи ли планът? Провери го, преди да има код. Вземи стойността от примера (N = 5) и мини през стъпките на ръка, като записваш сумата след всяка:
| Стъпка | Число | Сума преди | Сума след |
|---|---|---|---|
| начало | 0 | ||
| 1 | 1 | 0 | 1 |
| 2 | 2 | 1 | 3 |
| 3 | 3 | 3 | 6 |
| 4 | 4 | 6 | 10 |
| 5 | 5 | 10 | 15 |
Последната стъпка извежда 15, точно колкото е в примера. Планът е верен поне за този случай.
Това се казва тест на сухо: минаваш през решението с примерни стойности, без да го пускаш. Отнема няколко минути, а хваща грешки в логиката, преди да си написал и ред код.
По-точно, за любопитните
- Има и друг начин за същата сума: N × (N + 1) / 2. За N = 5 това е 5 × 6 / 2 = 15. Два различни плана дават еднакъв резултат. Вторият е по-бърз, но за да го измислиш, трябва да знаеш формулата. Първият следва точно как би смятал на ръка.
- Същото следене на стойностите ред по ред ще правиш и с истински код. Редакторите имат инструмент за това, дебъгер (debugger): спира програмата на избран ред и показва стойностите на всичко в нея.
Пробвай
Намери грешката
Този план за N = 5 дава 16 вместо 15. Направи тест на сухо наум. На кой ред е грешката?
Избери реда с грешката.
Сумата започва от 1, а не от 0. Така към първото число се добавя още една единица, която не е спестена: 1 + 1 + 2 + 3 + 4 + 5 = 16. Преди да си добавил нещо, сборът е 0.
Идеята
Провери решението срещу примера
Когато вече имаш програма, проверката е същата, само че вместо на ръка я пускаш:
- Въведи входа от примера и сравни своя изход с този от условието. Сравнявай знак по знак: „Сумата е 15“ не е „15“. Решенията често се проверяват автоматично и излишният текст прави отговора грешен.
- Пробвай и свои стойности, особено крайни: най-малкото позволено, нулата, много голямо число.
- Ако изходът не съвпада, направи тест на сухо на кода си с примерната стойност. Мястото, където стойностите се разминат с очакваното, е грешката.
Опитай го с плана за спестяванията: колко дава той за N = 1? А за N = 0?
Отговорът
- За N = 1 стъпката се повтаря веднъж: сумата става 0 + 1 = 1. Вярно е: след един ден имаш 1 €.
- За N = 0 няма числа от 1 до 0, затова стъпката не се изпълнява нито веднъж. Сумата остава 0. И това е вярно: за нула дни не си спестил нищо.
Тест