Към съдържанието
wannacode

Как се решава задача

Проблем

Празният екран

Имаш задача: първия ден спестяваш 1 €, втория 2 €, третия 3 € и така нататък. Колко евро ще имаш след N дни?

Отваряш редактора и… не знаеш с кой ред да започнеш. Това се случва на всеки, а причината рядко е, че не знаеш езика. Обикновено още не е ясно какво точно трябва да направи програмата. Затова решението започва преди кода: на хартия или в главата.

Идеята

Прочети условието

Задачите в курса изглеждат така:

Спестявания. Първия ден спестяваш 1 €, втория 2 €, третия 3 € и така нататък. Въвежда се броят на дните N. Изведи колко евро си спестил общо.

Вход: 5 Изход: 15

Преди да мислиш за решение, отговори си на три въпроса:

  1. Какво получавам? Едно цяло число N, броя на дните.
  2. Какво трябва да изведа и в какъв вид? Едно число, без друг текст.
  3. Разбирам ли примера? Сметни го на ръка: 1 + 2 + 3 + 4 + 5 = 15. Съвпада с изхода.

Ако сметката на ръка не дава изхода от примера, значи не си разбрал условието. Прочети го пак, преди да пишеш каквото и да е.

Идеята

Раздели задачата

Голямата задача се решава трудно наведнъж. Раздели я на части, всяка от които знаеш как да направиш:

Частите
1. прочети броя на дните N
2. събери числата от 1 до N
3. изведи сбора

Първата и третата част са ясни. Втората още е голяма, затова я раздели и нея. Как събираш на ръка? Държиш сбора в главата си и към него добавяш следващото число, едно по едно. Така прави и касиерът, който маркира покупките ти.

Разделяй, докато всяка част стане толкова малка, че да е ясно как се прави.

До анимацията е програмата, която следва тези части. Думите в нея ще научиш в следващия модул. Засега гледай как всяка част става ред или два код.

n = int(input())
total = 0
for day in range(1, n + 1):
total += day
print(total)
Стъпка по стъпка, с думи
  1. Наведнъж задачата е голяма: колко евро спестяваш за N дни?
  2. Разделяш я на три части. Всяка е ясна сама за себе си.
  3. Част 1: прочети N. В примера N = 5.
  4. Част 2: сборът започва от 0 и към него се добавя всяко число от 1 до N.
  5. Тест на сухо: 0 + 1 + 2 + 3 + 4 + 5 = 15.
  6. Част 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. Въведи входа от примера и сравни своя изход с този от условието. Сравнявай знак по знак: „Сумата е 15“ не е „15“. Решенията често се проверяват автоматично и излишният текст прави отговора грешен.
  2. Пробвай и свои стойности, особено крайни: най-малкото позволено, нулата, много голямо число.
  3. Ако изходът не съвпада, направи тест на сухо на кода си с примерната стойност. Мястото, където стойностите се разминат с очакваното, е грешката.

Опитай го с плана за спестяванията: колко дава той за N = 1? А за N = 0?

Отговорът
  • За N = 1 стъпката се повтаря веднъж: сумата става 0 + 1 = 1. Вярно е: след един ден имаш 1 €.
  • За N = 0 няма числа от 1 до 0, затова стъпката не се изпълнява нито веднъж. Сумата остава 0. И това е вярно: за нула дни не си спестил нищо.

Тест

Провери се

1. Какво е псевдокод?
2. Какво правиш при тест на сухо?
3. Условието казва: вход 3, изход 6. Твоето решение отпечатва „Сумата е 6“. Вярно ли е?
4. Планът събира числата от 1 до N, като започва от сума = 0. Колко е сумата след третата стъпка?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·