Your SlideShare is downloading. ×
7. Methodology of Problem Solving - C# Fundamentals
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

7. Methodology of Problem Solving - C# Fundamentals

1,709
views

Published on

C# Programming Fundamentals Course @ Telerik Academy …

C# Programming Fundamentals Course @ Telerik Academy
http://academy.telerik.com
This presentation talks about how to most efficiently solve problems(and not just programming ones too). You'll learn how to approach a problem, how to analyze it, how to brainstorm ideas, and how to follow through from an idea to a viable solution.
Main points:
Analyzing problems
Brainstorming ideas
Having the right mindset/approach
Managing your time in a competitive environment
Following through from idea to solution

Published in: Education, Technology

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,709
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
99
Comments
0
Likes
4
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Methodology of Problem SolvingEfficiently Solving Computer Programming ProblemsDoncho MinkovTechnical Trainerhttp://minkov.it/Telerik Software Academyacademy.telerik.com
  • 2. Table of Contents1. Problem Solving2. Understanding the requirements3. Analyzing the problem4. Brainstorming5. Using Pen and Paper6. Checking your ideas 2
  • 3. Problems SolvingFrom Chaotic to Methodological Approach
  • 4. How to Solve Problems?1. Read and analyze the problems2. Use a sheet of paper and a pen for sketching3. Think up, invent and try ideas4. Break the problem into subproblems5. Check up your ideas6. Choose appropriate data structures7. Think about the efficiency8. Implement your algorithm step-by-step9. Thoroughly test your solution 4
  • 5. Understanding the Requirements
  • 6. Read and Analyze the Problems Consider you are at traditional computer programming exam or contest  You have 5 problems to solve in 6 hours First read carefully all problems and try to estimate how complex each of them is  Read the requirements, dont invent them! Start solving the most easy problem first  Leave the most complex problem last Approach the next problem when the previous is completely solved and well tested 6
  • 7. Analyzing the Problems Example: we are given 3 problems: 1. Set of Numbers  Count the occurrences of a number in set of numbers 2. Students  Read a set of students and print the name of the student with the highest mark 3. Binary Representation  Find the ones and zeros of a set of numbers in their binary representation 7
  • 8. Analyzing the Problems (2) Read carefully the problems and think a bit Order the problems from the easiest to the most complex: 1. Set of Numbers  Whenever find the number increase a count variable with one 2. Students  Temporary student with current highest mark 3. Binary representation  If we know the ones, we can easily find the zeros 8
  • 9. Using a Paper and a PenVisualizing and Sketching Your Ideas
  • 10. Use a Sheet of Paper and a Pen Never start solving a problem without a sheet of paper and a pen  You need to sketch your ideas  Paper and pen is the best visualization tool  Allows your brain to think efficiently  Paper works faster than keyboard / screen  Other visualization tool could also work well 10
  • 11. Paper and Pen Consider the "Binary representation" problem  We can sketch it to start thinking  Some ideas immediately come, e.g.  Divide by 2 and check for the remainder  Bitwise shift right and check for the rightmost bit  Bitwise shift left and check for the leftmost bit  Count only the "zeros"  Count only the "ones"  Count both "ones" and "zeros" 11
  • 12. Invent IdeasThink-up, Invent Ideas and Check Them
  • 13. Think up, Invent and Try Ideas First take an example of the problem  Sketch it on the sheet of paper Next try to invent some idea that works for your example Check if your idea will work for other examples  Try to find a case that breaks your idea  Try challenging examples and unusual cases If you find your idea incorrect, try to fix it or just invent a new idea 13
  • 14. Invent and Try Ideas – Example Consider the "Binary Representation" problem Idea #1: divide by 2 and check the remainder  How many times to do this?  Where to check? Idea #2: Bitwiseshift and check the left/rightmost bit  Left shift or right shift?  How many times to repeat this?  Is this fast enough? 14
  • 15. Check-up Your IdeasDont go Ahead before Checking Your Ideas
  • 16. Check-up Your Ideas Check-up your ideas with examples  It is better to find a problem before the idea is implemented  When the code is written, changing radically your ideas costs a lot of time and effort Carefully select examples for check-up  Examples should be simple enough to be checked by hand in a minute  Examples should be complex enough to cover the most general case, not just an isolated case 16
  • 17. Invent New Idea If Needed What to do when you find your idea is not working in all cases?  Try to fix your idea  Sometime a small change could fix the problem  Invent new idea and carefully check it Iterate  It is usual that your first idea is not the best  Invent ideas, check them, try various cases, find problems, fix them, invent better idea, etc. 17
  • 18. Efficiency and Performance Is Your Algorithm Fast Enough?
  • 19. Think About the Efficiency Think about efficiency before writing the first line of code  Estimate the expected running time (e.g. using asymptotic complexity)  Check the requirements  Will your algorithm be fast enough to conform with them You dont want to implement your algorithm and find that it is slow when testing  You will lose your time 19
  • 20. Efficiency is not Always Required Best solution is sometimes just not needed  Read carefully your problem statement  Sometimes ugly solution could work for your requirements and it will cost you less time  Example: if you need to sort n numbers, any algorithm will work when n ∈ [0..500] Implement complex algorithms only when the problem really needs them! 20
  • 21. ImplementationCoding and Testing Step-by-Step
  • 22. Start Coding: Check List Never start coding before you find correct idea that will meet the requirements  What you will write before you invent a correct idea to solve the problem? Checklist to follow before start of coding:  Ensure you understand well the requirements  Ensure you have invented a good idea  Ensure your idea is correct  Ensure you know what data structures to use  Ensure the performance will be sufficient 22
  • 23. Coding Check List – Example Checklist before start of coding:  Ensure you understand well the requirements  Yes, counts values of bits  Ensure you have invented a correct idea  Yes, the idea seems correct and is tested  Ensure the performance will be sufficient  Linear running time  good performance 23
  • 24. Implement your Algorithm Step-by-Step "Step-by-step" approach is always better than "build all, then test"  Implement a piece of your program and test it  Then implement another piece of the program and test it  Finally put together all pieces and test it Small increments (steps) reveal errors early  "Big-boom" integration takes more time 24
  • 25. Step #1 – Check The Value Of The First Bit Now we have the value of the first bit int number=10; int firstBit = number & 1; What happens to the number?  Do we need the first bit anymore?  Remove it by right shift int number=10; int firstBit = number & 1; number >>= 1; 25
  • 26. Step #1 – Test Testing if the correct bit is extracted and checked  Get feedback as early as possible: int number = 10; int firstBit = number & 1; number >>= 1; Console.WriteLine(firstBit); Console.WriteLine(number); The result is as expected: 0 // the first bit 5 // the number without the first bit 26
  • 27. Step #2 – Get All The Bits Of a Number How many bits we want to check?  All for the number  But how many are they  Example: the number 10  10(10) = 8 + 2 = 1010(2) – 4 bits How the find out when to stop the checking?  When right shifting the zeros in the front get more and more  At some point the number will become zero 27
  • 28. Step #2 – Get All The Bits Of a Number Until the number becomes equal to 0 1. Check the value of the bit 2. Right shift the number while (number != 0) { int firstBit = number & 1; number >>= 1; Console.Write("{0} ", firstBit); } 28
  • 29. Step #2 – Test Testing with 10 0 1 0 1 Testing with 1111 1 1 1 0 1 0 1 0 0 0 1 1111 = 1024 + 64 + 16 + 4 + 2 + 1 = 210 + 26 + 24 + 22 + 21 + 20 Seems correct 29
  • 30. Step #3 – Check For The Occurrences Of Bit Value So far:  We can get the values of all the bits of a number  Lets count the number of ones and zeros while (number != 0) { int firstBit = number & 1; number >>= 1; if (firstBit == 1) { oneCount++; } else { zeroCount++; } } 30
  • 31. Step #3 – Test Test with number 111 (1101111(2)) ones:6 zeros:1 The result is correct Test with number 1234 (10011010010(2)) ones:5 zeros:6 The result is correct 31
  • 32. Step #4 – Count The Bits Of The Whole Set Pass through all the numbers  Count their bits int zeroCount = 0, oneCount = 0, n = 5; for (int i = 0; i < n; i++) { int number = int.Parse(Console.ReadLine()); while (number != 0) { int firstBit = number & 1; number >>= 1; if (firstBit == 1) { oneCount++; } else { zeroCount++; } } Console.WriteLine("ones:{0};zeros:{1}", oneCount,zeroCount); } 32
  • 33. Step #4 – Count The Bits Of The Whole Set (2) The result is surprisingly incorrect: Input: Output: 1 ones:1; zeros:0 2 ones:2; zeros:1 3 ones:4; zeros:1 4 ones:5; zeros:3 5 ones:7; zeros:4 The result is surprisingly incorrect:  The count of ones and zeros appears as to stack for all the numbers of the set!  We defined the counters outside the iteration of the set loop  Put them inside 33
  • 34. Step #4 – Fixing the Bug int n = 5; for (int i = 0; i < n; i++) { int zeroCount = 0, oneCount = 0; int number = int.Parse(Console.ReadLine()); while (number != 0) { int firstBit = number & 1; number >>= 1; if (firstBit == 1) { oneCount++; } else { zeroCount++; } } Console.WriteLine("ones:{0}; zeros:{1}", oneCount,zeroCount); } Now it is OK 34
  • 35. TestingThoroughly Test Your Solution
  • 36. Thoroughly Test your Solution Wise software engineers say that:  Inventing a good idea and implementing it is half of the solution  Testing is the second half of the solution Always test thoroughly your solution  Invest in testing  One 100% solved problem is better than 2 or 3 partially solved  Testing existing problem takes less time than solving another problem from scratch 36
  • 37. How to Test? Testing could not certify absence of defects  It just reduces the defects rate  Well tested solutions are more likely to be correct Start testing with a good representative of the general case  Not a small isolated case  Large and complex test, but  Small enough to be easily checkable 37
  • 38. How to Test? (2) Test the border cases  E.g. if n ∈ [0..500]  try n=0 , n=1, n=2, n=499, n=500 If a bug is found, repeat all tests after fixing it to avoid regressions Run a load test  How to be sure that your algorithm is fast enough to meet the requirements?  Use copy-pasting to generate large test data 38
  • 39. Read the Problem Statement Read carefully the problem statement  Does your solution print exactly what is expected?  Does your output follow the requested format?  Did you remove your debug printouts? Be sure to solve the requested problem, not the problem you think is requested!  Example: "Write a program to print the number of permutations on n elements" means to print a single number, not a set of permutations! 39
  • 40. Testing – Example Test with a set of 10 numbers  Serious error found  change the algorithm Change the algorithm  The counters never reset to zero  Test whether the new algorithm works Test with 1 number Test with 2 numbers Test with 0 numbers Load test with 52 000 numbers 40
  • 41. Test With 10000 Numbers – Exampleint n = 10000, startNumber=111;for (int i = startNumber; i < startNumber + n; i++){ int zeroCount = 0; int oneCount = 0; //int number = int.Parse(Console.ReadLine()); int number = i; int originalNumber = number; Replace the reading from the while (number != 0) console with a easier type of check { int firstBit = number & 1; number >>= 1; if (firstBit == 1){ oneCount++; } else { zeroCount++; } }} 41
  • 42. Test With 10000 Numbers – Example (2) The result is perfect: 111(10) = 1101111(2) -> ones:6;zeros:1 … 10110(10) = 10011101111110(2) -> ones:10;zeros:4 42
  • 43. Testing Tips You are given the task of the binary representation The program must read from the console  Integer numbers N and B  N integer numbers While writing and testing the program  Dont read from the console  First hardcode the numbers  Later make it  When you are sure it works 43
  • 44. Hard-Coded Input – Example// Hardcoded input data – for testing purposesint n = 5;int num1 = 11;int num2 = 127;int num3 = 0;int num4 = 255;int num5 = 24;// Read the input from the console//int n = int.Parse(Console.ReadLine());//for (int i=0; i<n; i++)//{// int num = int.Parse(Console.ReadLine());// // Process the number …// // …//}// Now count the bits for these n numbers … 44
  • 45. SummaryProblems solving needs methodology:  Understanding and analyzing problems  Using a sheet of paper and a pen for sketching  Thinking up, inventing and trying ideas  Decomposing problems into subproblems  Selecting appropriate data structures  Thinking about the efficiency and performance  Implementing step-by-step  Testing the nominal case, border cases and efficiency 45
  • 46. Methodology of Problem Solving курсове и уроци по програмиране, уеб дизайн – безплатно BG Coder - онлайн състезателна система - online judge курсове и уроци по програмиране – Телерик академия форум програмиране, форум уеб дизайн уроци по програмиране и уеб дизайн за ученици ASP.NET курс - уеб програмиране, бази данни, C#, .NET, ASP.NET http://academy.telerik.com програмиране за деца – безплатни курсове и уроци ASP.NET MVC курс – HTML, SQL, C#, .NET, ASP.NET MVC безплатен SEO курс - оптимизация за търсачки алго академия – състезателно програмиране, състезаниякурсове и уроци по програмиране, книги – безплатно от Наков курс мобилни приложения с iPhone, Android, WP7, PhoneGap уроци по уеб дизайн, HTML, CSS, JavaScript, Photoshop Дончо Минков - сайт за програмиране free C# book, безплатна книга C#, книга Java, книга C# Николай Костов - блог за програмиране безплатен курс "Качествен програмен код" безплатен курс "Разработка на софтуер в cloud среда" C# курс, програмиране, безплатно
  • 47. Free Trainings @ Telerik Academy Fundamentals of C# Programming Course  csharpfundamentals.telerik.com Telerik Software Academy  academy.telerik.com Telerik Academy @ Facebook  facebook.com/TelerikAcademy Telerik Software Academy Forums  forums.academy.telerik.com