Какъв е начина за съставяне на алгоритми ?


3

Здравейте, 

курсовете напреднаха и за мен стана все по - трудно да си решавам задачите и изоставам. Има ли някаква методика за съставяне на алгоритми? Мисля че трябва да си намеря книга. Мисля, че правя грешка като се опитвам да измисля алгоритъма в момента на писане. Трябва да има някаква методика за съставянето им или начин за изобразяването им в схеми на хартия без значение от езика на програмиране. 




Отговори



6

Ако успееш да разбиеш проблема на части и да ги анализираш, по всяка вероятност ще си съставиш и алгоритъм. Може да е правилния, може да е заобиколния, а може и да е съвсем грешен... зависи. :) Като цяло е полезно да се замислиш как ти решаваш проблема - през какви стъпки минаваш, за да изчислиш нещо, и след това да се замислиш как можеш да имплементираш това като код.

Алгоритмичното мислене, както и всяко друго мислене, може да се развие с упражнения (решаване на задачи в конкретния случай). Засега задачите, които решаваме са банални и е по-важно да се научиш да намираш готовите вече алгоритми, а ако се сблъскаш с нерешен до момента проблем... е, никой не може да ти каже как да подходиш към него. :)


от dentia (12519 точки)


1

Определено трябва доста голям опит докатато почнеш да виждаш алгоритъма на решението на задачата от първия път. Като съвет бих ти казал, че трябва да си разписваш всякакви условия в самата задача на 1 лист и след това да пробваш да си ги сглобяваш, по някакъв начин в някаква схема как ще ти работи програмата. Много е трудно за начинаещи хора като нас да помнят всичко и да виждат всичко.

Също така няма да е лошо да гледаш много решения, на някакви много сложни задачи и след това да ги пререшаваш.

Абе колкото повече решаваш, толкова повече ще схващаш.

( На мен ми е много трудно също, но си мисля че тази е методиката, която трябва да спазваме, за да станем по-добри)


от nerazzul (325 точки)


3

 Ами няма лесен начин. На някои хора им е по-развито алгоритмичното мислене, на други не нужно да се развива. Аз съм от вторите и още не съм му измислил лесното. Рисуването помага, също и визуализациите но си е нужен опит. Когато разучиш повече алгоритми в един момент ще ти светва още като видиш проблема, ще започнеш и да ги навръзваш.

 П.С. Ако притеснението ти идва от настоящия изпит, някой от алгоритмите наистна са доста сложни особено за 5-тите задачи. Та задачите за този изпит са гаднички, не се спичай, че ти си зле :). Не всичко в програмирането е алгоритми, не си мисли че ако не си алго супер - нинджа не ставаш за програмист.


от ivan.mihov1 (4988 точки)


1

Подкрепям поста ти колега, щях да напиша същото, добре че рефрешнах :)

А иначе моето мнение е, че ако човек се сблъсква за пръв път с програмиране нещата са сложни. Когато улегнат в главата ти ще видиш, че алгоритмичното мислене ще се появи и развие. Но това зависи от теб дали ще продължиш или ще се откажеш!


от lowry (275 точки)

2
Не си и мисли обаче, че без алгоритми ще станеш супер мега добрия програмист. Упражнявай ги и тях. ;)

от ivaylo.kenov (30760 точки)



3

Алгоритъма трябва да ти "следва" условието на задачата. Най-добрия момент е ако някъде в твоя си алгоритъм откриеш неща, които се повтарят - моментално се изнасят в методи и се преизползват.

Много важно е също така да откриеш т.нар. гранични условия. Например като погледнеш входните параметри да си сметнеш най-големия, респективно най-малкия теоретично възможен резултат, който ще получиш с твоя алгоритъм. Така ще си определиш и структурата от данни, която ще използваш. Много важно е да имаш измислен алгоритъм и след това да определяш как ще го реализираш, това е принципно положение. Не трябва структурата да ти определя алгоритъма, например да решиш че ще ползваш int и да се чудиш как да се вместиш в него.

Иначе с две думи вървиш по условието и стъпка по стъпка каквото е описано вътре го правиш в твоя алгоритъм. Оптимизираш, ако можеш и тестваш граничните варианти за които се сетиш.

Не е лесно, но това е чара на програмирането. На края като тръгне кефа е огромен винаги :)


от wnvko (3123 точки)


3

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

Оправи скобите в уравнението: (х(х+у)(х+у))(х*у)

1) Какво се иска от мен? Да проверя дали скобите са на място. Как? Да проверя дали отварящите и затварящите скоби са еднаква бройка. Да проверя дали всички скоби са в двойки отвяряща-затваряща.

1-а) Как ще проверя общата бройка? с for и брояч, който се увеличава за всяка срещната скоба. Тогава ти изниква мисълта "абе всъщност тука мога да оптимизирам. Ако накрая брояча не се дели на две(тука просто забравих как се наричаха тея числа), значи няма как да са равни"
1-б)Как ще проверя дали всички са в двойки? Един for да сканира последна и първа скоба, после да върви по-навътре? Няма как защото може да има (х(х+у)(х+у))(х*у), при което няма да стане
1-в)Имаме ли излишни неща в това уравнение, които не помагат със сметките? Да: х,у,+,* Извод? Махни всичко и остави само скобите. Как? Копирам само скобите в нов string. Резултат: (()())(). Улеснява ли ни? Да? Продължаваме. Не? Връщаме се до 1-б). Стигнахме до извод че с тоя начин няма надежда? Връщаме се до 1-а)

2) Ок. Сега стигнахме до нещо. Имаме (()())(), което вече знаем, че ни улеснява. Въпроса остава, какво да я правим тая гад?
2-а)Идея! Ами ако махне всичко, което вече е двойка, това улеснява ли ни?
Стигаме до (), защото махнахме (()())()
2-б)Абе всъщност т'ва взе, че ми реши задачата! Само ми трябва да се повтори няколко пъти! Значи ще пробвам да го имплементимрам и ще видя резултатите! Ама сега как ще го имплементирам? Ще разгледам методите на string и ако няма, значи сам ще си имплементирам. Какво трябва да имплементирам? Трябва да изтрива всички string-ове в нашият string, които са "()". Как? String.Replace("()",string.empty). Разбира се, за улеснение ще използвам stringbuilder. Готов ли съм? Да? Тествам и поправям! Не? Значи сам трябва да  имплементирам! Как? Трябва да се сканира - значи for. И какво още? Той ще сканира по двойки: index и index+1 дали са равни съответно на "(" и ")". Готови ли сме? Да. Оптимизации?
-Ако скобите не са равна бройка спирам да работя и връщам false.
-За скобите ще ползвам StringBuilder вместо string
-Колко пъти се повтаря for-а? Докато string-а остане същия размер в продължение на две повторения. Как? Със променлива, която запазва размера му преди следващия replace. Ако сегашната и предишната стойност на размера, която вече е стойност и на променливата са еднакви, значи е време да спрем цикъла

Ако искаш книга, ето я на Наков: http://www.introprogramming.info/intro-csharp-book/read-online/
За мен тетрадката е безценна. Там мога да си рисувам алгоритми както си искам. Съветвам те и ти да пробваш. Първо на тетрадката да си го направиш, после да го напишеш :)


от Beardhammer (285 точки)


0
Много добър коментар, колега! И аз се питам същото, като задаващия въпроса в тази тема... блъскам си главата за отговор на дадена задача, ама пусто нямам опит, в главата ми става пусто и празно и си цикля на едно място... а, когато човек чува разсъжденията на другите, започва да си задава същите въпроси, като тях, и вече знае през какво преминават те, за да стигнат до правилното решение. Така, поглеждайки техния код, вече знае какво означава всеки ред и нещата са малко по-ясни вече. Много помагат постовете, като твоя! Да изградим нашата практика в мисленето :)

от pavleta (507 точки)


2

Здравей,

За началния период на обучение по програмиране (включително по C#), докато все още не се използва паралелна обработка, транзакции, прекъсвания, асинхронна обработка, ООП и т.н. - термини, които ако не си срещал, ще научиш по-нататък, мога да ти препоръчам един остарял метод, който ще ти помогне засега. Недей да свикваш с този метод, защото за съвременното програмиране той е почти неприложим.

На този линк има простичко описание на т. нар. "блок-схеми" (flowcharts) - дадена е мнемониката и начинът на използване при писане на програмен код. Обмисли програмата, разбий я на стъпки и направи блок-схема - мисля, че ще ти се изяснят много неща. А когато започне обучението по ООП, забрави - там се работи по друг начин, съставят се диаграми на класовете и когато си изчистваш кода от грешки, най-добрият помощник е дебъгерът :)


от ellapt (6303 точки)


4

Напълно те разбирам - и аз срещам тези трудности. Мой приятел програмист ми показа един ден какво да правя, за да ми се избистри малко в главата. Накратко:

- Прочиташ си внимателно условието;

- Взимаш лист и химикалка/молив;

- Ред по ред по условието на задачата правш блок схема - кръгче ти е началото, правоъгъник за действие, ромб за проверка/условие, със стрелки се посочва пътя на действието и отново кръгче за финал. 

- Разписваш условието на задачата по този начин с простчки думи, така, както го разбираш.

- Намираш методите, които сме учили в академията, с които може да се решат съответните проблеми. 

Естествено, това е изключително повърхностно, но е някакво начало. Всяка задача е различна и решението й е различно. Според мен алгоритмите ще дойдат сами с решаването на задачи, така както беше в пети клас. 

И също много важно нещо - нужно е да схванем точно как работят отделните елементи на езика и съответно как си влияят. Мисля, че за това си трябва малко време. Ако не си се занимавал до сега (както и аз не съм) предполагам, че е нужно някакво време, което за всеки е индивидуално, за осъзнаване на цялата тази нова информация. 


от Milenkata (259 точки)