ºÝºÝߣ

ºÝºÝߣShare a Scribd company logo
Programming
Exercises
Terry Yin
Who am I?

2
Why Programming Exercises?

3
4
Quality vs. Quantity

5
Gami?cation

6
Question
Does software company need to
train programmers?

7
Leonhard Euler

Dojo

vs.

8
What is ProjectEuler.net?

9
ProjectEuler.net
"Project Euler exists to encourage, challenge, and develop the skills and enjoyment of anyone with
an interest in the fascinating world of mathematics."

? Project Euler is a series of challenging mathematical/computer

programming problems that requires more than just mathematical
insights to solve.

10
ProjectEuler.net

11
ProjectEuler.net

12
Expectations

Mathematics
lution implementing
So
rfor mance co d ing
Hig h pe
So lving problem
ind ivi dually

13
Example: Quick & Dirty
Once you solved a problem, you are entitled to join the forum for this problem.You can
share your solution with the other people who have also solved it. And the post usually
start with this sentence:!

Good coding habit?

14
Another Example

15
int i, j, k, n, sum;!
int factorial[10000];!

"

? It¡¯s too simple for

?
?

Java, Ruby or Python,
for which they can
handle big numbers by
default."
So let¡¯s look at C/C++."
Real code copied from
the forum.

int* getfactorial(int n)!
{!
factorial[0] = 1;!
k = 0;!
for(i = 2; i <= n; i++)!
{!
for(j = 0; j <= k; j++)!
factorial[j] *= i;!
for(j = 0; j <= k; j++)!
{!
if(factorial[j] >= 10)!
{!
factorial[j+1] += (factorial[j] - (factorial[j] % 10)) / 10;!
factorial[j] = factorial[j] % 10;!
if(j == k)!
k++;!
}!
}!
}!
return factorial;!
}!

"

int getsum(int* array, int k)!
{!
sum = 0;!
for(i = 0; i <= k; i++)!
sum += array[i];!
return sum;!
}!

"

int main()!
{!
int* factorial = getfactorial(n);!
sum = getsum(factorial, k);!
cout << "nThe sum of the digits of " << n << "! is " << sum << ".n";!
return 0;!
16
}!
17
Big number again. Ha ha, I did that
before! Let me reuse it...

18
#include<iostream>!

"

using namespace std;!

"

int i, j, k, n, sum;!
int factorial[10000];!

"

Why the big number is named ¡®factorial¡¯
in my previous implementation?

int* getfactorial(int n)!
{!
factorial[0] = 1;!
k = 0;!
for(i = 2; i <= n; i++)!
{!
for(j = 0; j <= k; j++)!
factorial[j] *= i;!
for(j = 0; j <= k; j++)!
{!
if(factorial[j] >= 10)!
{!
factorial[j+1] += (factorial[j] - (factorial[j] % 10)) / 10;!
factorial[j] = factorial[j] % 10;!
if(j == k)!
k++;!
}!
}!
}!
return factorial;!
}

Where¡¯s the code for big number?

19
#include <stdio.h>

"

#define NUMB 120
#define SIZE 1000000000

"
OK, too hard to reuse. It¡¯s not
that hard to invent the wheel again.

// 9 * 120 = 1080 total digits.
// 9 digit numbers

int main() {
int i = 0;
int j = 0;
int bigNum1[NUMB];
int bigNum2[NUMB];
int bigNum3[NUMB];
int counter = 0;

"

"
"

"
}

for (i = 0;
bigNum1 =
bigNum2 =
bigNum3 =
}

i < NUMB; i++) {
0;
0;
0;

bigNum1[0] = 1;
bigNum2[0] = 1;
counter = 2;
i = 0;
while (i == 0) {
counter++;
for (j = 0; j < NUMB; j++) {
bigNum3[j] = bigNum2[j] + bigNum1[j];
}
for (j = 0; j < NUMB-1; j++) {
while (bigNum3[j] >= SIZE) {
bigNum3[j] -= SIZE;
bigNum3[j+1]++;
}
}
if (bigNum3[111] >= 1)
break;
for (j = 0; j < NUMB; j++) {
bigNum1[j] = bigNum2[j];
bigNum2[j] = bigNum3[j];
}
}
printf("n");
printf("P025 answer = %u", counter);

20
s
ng exercise
i
oblem so lv
Pr
tant skills
ver y impor
? Train
inter view
s
ten use d a
Of

?

ques tions
n skills in
i
ly also tra
? Probab
able co de,
n
ng maintai
maki
a little.

?Don¡¯t do it before bed time...

21
What is Cyber Dojo?

22
23
24
25
RED - GREEN - REFACTOR

26
Functional Test

Integration Test

Unit Test
27
28
29
30
Refactoring Dojo

31
Code Retreat
A day-long practice-intensive event for programmers, !
popularized by Corey Haines.

?
?
?
?
?
?
?
32
Which One Do You Prefer?
33
Poker Hands

34
Poker Hands Kata

35
Poker Hands in ProjectEuler
? This is not a very hard problem to solve,
?

comparing to most of the problems listed in
ProjectEuler.net"
But it¡¯s hard to solve it without bugs if you don¡¯t
have unit tests."

? Problem 54 in projectEuler.net

36
Example: Complicated
Transaction

37
Why Did I Do It Right
With Only One Try?

38
TEST(poker_hand, comparing){
CHECK(pokerHand("4H 5C 6S 7S TD")< pokerHand("2C 3S 7S 8D KD"));
CHECK(!(pokerHand("4H 5C 6S 7S KD")< pokerHand("2C 3S 7S 8D TD")));
CHECK(pokerHand("4H 5C 6S 7S KD")> pokerHand("2C 3S 7S 8D TD"));
}
TEST(poker_hand, compare_cards){
CHECK(pokerHand("3H 5C 6S 7S 8D")< pokerHand("4H 5C 6S 7S 9D"));
CHECK(pokerHand("3H 5C 6S 7S 9D")< pokerHand("4H 5C 6S 7S TD"));
CHECK(pokerHand("3H 5C 6S 7S TD")< pokerHand("4H 5C 6S 7S JD"));
CHECK(pokerHand("3H 5C 6S 7S JD")< pokerHand("4H 5C 6S 7S QD"));
CHECK(pokerHand("3H 5C 6S 7S QD")< pokerHand("4H 5C 6S 7S KD"));
CHECK(pokerHand("3H 5C 6S 7S KD")< pokerHand("4H 5C 6S 7S AD"));
}
TEST(poker_hand, compare_high_cards_2nd){
CHECK(pokerHand("3H 5C 6S 7S 9D")< pokerHand("3H 5C 6S 8S 9D"));
}
TEST(poker_hand, compare_high_cards_3nd_4th_5th){
CHECK(pokerHand("3H 5C 6S 8S 9D")< pokerHand("3H 5C 7S 8S 9D"));
CHECK(pokerHand("3H 4C 7S 8S 9D")< pokerHand("3H 5C 7S 8S 9D"));
CHECK(pokerHand("2H 5C 7S 8S 9D")< pokerHand("3H 5C 7S 8S 9D"));
}
TEST(poker_hand, compare_high_card_and_one_pair){
CHECK(pokerHand("3H 5C 6S 8S 9D")< pokerHand("3H 5C 7S 8S 8D"));
}
TEST(poker_hand, compare_one_pairs){
CHECK(pokerHand("3H 5C 6S 9S 9D")> pokerHand("3H 5C 7S 8S 8D"));
CHECK(pokerHand("5C 6S 9S 9D KD")> pokerHand("5C 7S 8S 8D AD"));
CHECK(pokerHand("5C 6S 9S 9D KD")< pokerHand("5C 7S 9S 9D AD"));
}

"

...
39
Do deliberate exercises.
Alone and with the others.
Always use good practices.
Have fun.

40

More Related Content

Programming exercises

  • 4. 4
  • 7. Question Does software company need to train programmers? 7
  • 10. ProjectEuler.net "Project Euler exists to encourage, challenge, and develop the skills and enjoyment of anyone with an interest in the fascinating world of mathematics." ? Project Euler is a series of challenging mathematical/computer programming problems that requires more than just mathematical insights to solve. 10
  • 13. Expectations Mathematics lution implementing So rfor mance co d ing Hig h pe So lving problem ind ivi dually 13
  • 14. Example: Quick & Dirty Once you solved a problem, you are entitled to join the forum for this problem.You can share your solution with the other people who have also solved it. And the post usually start with this sentence:! Good coding habit? 14
  • 16. int i, j, k, n, sum;! int factorial[10000];! " ? It¡¯s too simple for ? ? Java, Ruby or Python, for which they can handle big numbers by default." So let¡¯s look at C/C++." Real code copied from the forum. int* getfactorial(int n)! {! factorial[0] = 1;! k = 0;! for(i = 2; i <= n; i++)! {! for(j = 0; j <= k; j++)! factorial[j] *= i;! for(j = 0; j <= k; j++)! {! if(factorial[j] >= 10)! {! factorial[j+1] += (factorial[j] - (factorial[j] % 10)) / 10;! factorial[j] = factorial[j] % 10;! if(j == k)! k++;! }! }! }! return factorial;! }! " int getsum(int* array, int k)! {! sum = 0;! for(i = 0; i <= k; i++)! sum += array[i];! return sum;! }! " int main()! {! int* factorial = getfactorial(n);! sum = getsum(factorial, k);! cout << "nThe sum of the digits of " << n << "! is " << sum << ".n";! return 0;! 16 }!
  • 17. 17
  • 18. Big number again. Ha ha, I did that before! Let me reuse it... 18
  • 19. #include<iostream>! " using namespace std;! " int i, j, k, n, sum;! int factorial[10000];! " Why the big number is named ¡®factorial¡¯ in my previous implementation? int* getfactorial(int n)! {! factorial[0] = 1;! k = 0;! for(i = 2; i <= n; i++)! {! for(j = 0; j <= k; j++)! factorial[j] *= i;! for(j = 0; j <= k; j++)! {! if(factorial[j] >= 10)! {! factorial[j+1] += (factorial[j] - (factorial[j] % 10)) / 10;! factorial[j] = factorial[j] % 10;! if(j == k)! k++;! }! }! }! return factorial;! } Where¡¯s the code for big number? 19
  • 20. #include <stdio.h> " #define NUMB 120 #define SIZE 1000000000 " OK, too hard to reuse. It¡¯s not that hard to invent the wheel again. // 9 * 120 = 1080 total digits. // 9 digit numbers int main() { int i = 0; int j = 0; int bigNum1[NUMB]; int bigNum2[NUMB]; int bigNum3[NUMB]; int counter = 0; " " " " } for (i = 0; bigNum1 = bigNum2 = bigNum3 = } i < NUMB; i++) { 0; 0; 0; bigNum1[0] = 1; bigNum2[0] = 1; counter = 2; i = 0; while (i == 0) { counter++; for (j = 0; j < NUMB; j++) { bigNum3[j] = bigNum2[j] + bigNum1[j]; } for (j = 0; j < NUMB-1; j++) { while (bigNum3[j] >= SIZE) { bigNum3[j] -= SIZE; bigNum3[j+1]++; } } if (bigNum3[111] >= 1) break; for (j = 0; j < NUMB; j++) { bigNum1[j] = bigNum2[j]; bigNum2[j] = bigNum3[j]; } } printf("n"); printf("P025 answer = %u", counter); 20
  • 21. s ng exercise i oblem so lv Pr tant skills ver y impor ? Train inter view s ten use d a Of ? ques tions n skills in i ly also tra ? Probab able co de, n ng maintai maki a little. ?Don¡¯t do it before bed time... 21
  • 22. What is Cyber Dojo? 22
  • 23. 23
  • 24. 24
  • 25. 25
  • 26. RED - GREEN - REFACTOR 26
  • 28. 28
  • 29. 29
  • 30. 30
  • 32. Code Retreat A day-long practice-intensive event for programmers, ! popularized by Corey Haines. ? ? ? ? ? ? ? 32
  • 33. Which One Do You Prefer? 33
  • 36. Poker Hands in ProjectEuler ? This is not a very hard problem to solve, ? comparing to most of the problems listed in ProjectEuler.net" But it¡¯s hard to solve it without bugs if you don¡¯t have unit tests." ? Problem 54 in projectEuler.net 36
  • 38. Why Did I Do It Right With Only One Try? 38
  • 39. TEST(poker_hand, comparing){ CHECK(pokerHand("4H 5C 6S 7S TD")< pokerHand("2C 3S 7S 8D KD")); CHECK(!(pokerHand("4H 5C 6S 7S KD")< pokerHand("2C 3S 7S 8D TD"))); CHECK(pokerHand("4H 5C 6S 7S KD")> pokerHand("2C 3S 7S 8D TD")); } TEST(poker_hand, compare_cards){ CHECK(pokerHand("3H 5C 6S 7S 8D")< pokerHand("4H 5C 6S 7S 9D")); CHECK(pokerHand("3H 5C 6S 7S 9D")< pokerHand("4H 5C 6S 7S TD")); CHECK(pokerHand("3H 5C 6S 7S TD")< pokerHand("4H 5C 6S 7S JD")); CHECK(pokerHand("3H 5C 6S 7S JD")< pokerHand("4H 5C 6S 7S QD")); CHECK(pokerHand("3H 5C 6S 7S QD")< pokerHand("4H 5C 6S 7S KD")); CHECK(pokerHand("3H 5C 6S 7S KD")< pokerHand("4H 5C 6S 7S AD")); } TEST(poker_hand, compare_high_cards_2nd){ CHECK(pokerHand("3H 5C 6S 7S 9D")< pokerHand("3H 5C 6S 8S 9D")); } TEST(poker_hand, compare_high_cards_3nd_4th_5th){ CHECK(pokerHand("3H 5C 6S 8S 9D")< pokerHand("3H 5C 7S 8S 9D")); CHECK(pokerHand("3H 4C 7S 8S 9D")< pokerHand("3H 5C 7S 8S 9D")); CHECK(pokerHand("2H 5C 7S 8S 9D")< pokerHand("3H 5C 7S 8S 9D")); } TEST(poker_hand, compare_high_card_and_one_pair){ CHECK(pokerHand("3H 5C 6S 8S 9D")< pokerHand("3H 5C 7S 8S 8D")); } TEST(poker_hand, compare_one_pairs){ CHECK(pokerHand("3H 5C 6S 9S 9D")> pokerHand("3H 5C 7S 8S 8D")); CHECK(pokerHand("5C 6S 9S 9D KD")> pokerHand("5C 7S 8S 8D AD")); CHECK(pokerHand("5C 6S 9S 9D KD")< pokerHand("5C 7S 9S 9D AD")); } " ... 39
  • 40. Do deliberate exercises. Alone and with the others. Always use good practices. Have fun. 40