1 / 55

CS1010: Programming Methodology comp.nus.sg/~cs1010/

CS1010: Programming Methodology http://www.comp.nus.edu.sg/~cs1010/. Week 5: Repetition Statements. Objectives: Understand the program control structure called loops Compare the different types of repetition structure. References: Chapter 4 Lessons 4.7 – 4.11. Week 5: Outline (1/2).

nishi
Télécharger la présentation

CS1010: Programming Methodology comp.nus.sg/~cs1010/

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CS1010: Programming Methodologyhttp://www.comp.nus.edu.sg/~cs1010/

  2. Week 5: Repetition Statements Objectives: • Understand the program control structure called loops • Compare the different types of repetition structure • References: • Chapter 4 Lessons 4.7 – 4.11 CS1010 (AY2012/3 Semester 1)

  3. Week 5: Outline (1/2) • Week 4 Exercise #3: NRIC Check Code • Loops! • The while Loop 3.1 Demo 3.2 Loop condition 3.3 Tracing • The do-while Loop • The for Loop 5.1 Odd Integers • Exercise #1: Sum of Multiples of 3 • Exercise #2: Asterisks CS1010 (AY2012/3 Semester 1)

  4. Week 5: Outline (2/2) • Common Errors • Some Notes of Caution • Exercise #3: Tracing Nested Loops • Using break in Loop • Using continue in Loop • Exercise #4: Prime Number (take-home) CS1010 (AY2012/3 Semester 1)

  5. 1. Week 4 Exercise #2: Taxi Fare (1/3) The taxi fare structure in Singapore must be one of the most complex in the world! See http://www.taxisingapore.com/taxi-fare/ Write a program Week4_TaxiFare.c that reads the following input data (all are of int type) from the user, and computes the taxi fare: dayType: 0 represents weekends and public holidays (PH for short); 1 represents weekdays and non-PH boardHour, boardMin: the hour and minute the passengers board the taxi (eg: 14 27 if the passengers board the taxi at 2:27 PM) distance: the distance of the journey, in metres Your program should have a function float computeFare(intdayType, intboardTime, int distance) The parameter boardTime is converted from the input data boardHour and boardMin. It is the number of minutes since 0:00hr. Eg: If boardHour and boardMin are 14 and 27 respectively, then boardTime is 867. CS1010 (AY2012/3 Semester 1) Week4 - 5

  6. 1. Week 4 Exercise #2: Taxi Fare (2/3) To implement the actual taxi fare could be a PE question . In this exercise, we use a (grossly) simplified fare structure: Basic Fare: Surcharge (applicable at the time of boarding): CS1010 (AY2012/3 Semester 1) Week4 - 6

  7. 1. Week 4 Exercise #2: Taxi Fare (3/3) You are given an incomplete program Week4_TaxiFarePartial.c. Complete the program. This exercise is mounted on CodeCrunch. Sample runs below for your checking First 1km: $3.40 Next 9.2km: 23  $0.22 = $5.06 Next 750m: 3$0.22 = $0.66 Basic fare = $9.12 No surcharge Total fare = $9.12 Day type: 0 Boarding hour and minute: 14 27 Distance: 10950 Total taxi fare is $9.12 First 1km: $3.40 Next 5123m: 13  $0.22 = $2.86 Basic fare = $6.26 Surcharge = 25%  $6.26 = $1.57 Total fare = $7.83 Day type: 1 Boarding hour and minute: 9 20 Distance: 6123 Total taxi fare is $7.83 Day type: 1 Boarding hour and minute: 5 59 Distance: 9000 Total taxi fare is $11.70 First 1km: $3.40 Next 8km: 20  $0.22 = $4.40 Basic fare = $7.80 Surcharge = 50%  $7.80 = $3.90 Total fare = $11.70 CS1010 (AY2012/3 Semester 1) Week4 - 7

  8. 1. Week 4 Exercise #2: Taxi Fare float computeFare(intdaytype, intbTime, intdist) { basicFare = calcBasicFare(dist) ; return includeSurcharge(basicFare, daytype, bTime) ; } float calcBasicFare(intdist){ // Pre-cond: 0 <= dist ; if (dist <= 1000) return 3.40; else if (dist <= 10200 && dist > 1000) return (3.40 + ceil((dist- 1000) /400.0) * INCREMENT); else if (dist > 10200) return (3.40 + 9200 / 400.0 * INCREMENT + (ceil((dist - 10200) / 350.0)) * INCREMENT); } CS1010 (AY2012/3 Semester 1) Week4 - 8

  9. 1. Week 4 Exercise #2: Taxi Fare float computeFare(intdaytype, intbTime, intdist) { basicFare = calcBasicFare(dist) ; return includeSurcharge(basicFare, daytype, bTime) ; } float includeSurcharge(float fare, intdType, intbTime){ // Pre-cond: dType = 0 or 1, 0 <= bTime <= 2359 ; if (bTime < 360 && (dType== 0 || dType== 1)) return fare * 1.50; else if (dType == 1 && (bTime < 600 && dtime >=360)) return fare * 1.25; else if (bTime >= 1080) return fare * 1.25; else return fare ; } CS1010 (AY2012/3 Semester 1) Week4 - 9

  10. 1. Week 4 Ex3: NRIC Check Code (1/3) Algorithm for NRIC check code NRIC consists of 7 digits. Eg: 8730215 Step 1: Multiply the digits with corresponding weights 2,7,6,5,4,3,2 and add them up. Eg: 82 + 77 + 36 + 05 + 24 + 13 + 52 = 16+49+18+0+8+3+10 = 104 Step 2: Divide step 1 result by 11 to obtain the remainder. Eg: 104 % 11 = 5 CS1010 (AY2012/3 Semester 1) Week5 - 10

  11. 1. Week 4 Ex3: NRIC Check Code (2/3) Algorithm for NRIC check code (cont…) Step 3: Subtract step 2 result from 11 Eg: 11 – 5 = 6 Step 4: Match step 3 result in this table for the check code Eg: The check code corresponding to 6 is ‘F’. Therefore, the check code for 8730215 is ‘F’. Sample run: Enter 7-digit NRIC number: 8730215 Check code is F CS1010 (AY2012/3 Semester 1) Week5 - 11

  12. 1. Week 4 Ex3: NRIC Check Code (3/3) Write a program Week4_NRIC.c to generate the check code given a 7-digit NRIC number. Your program should include a function char generateCode(int) that takes in a single integer (the NRIC number) and returns a character (which is the check code). You need to use the char type. (Explore this on your own.) A character constant is enclosed in single quotes (eg: 'A', 'Z'). The format specifier for char type is %c (to be used in a printf() statement). Do not use techniques that are not covered in class, such as array. Your program may be long now. You can write an improved version later. This is your take-home exercise. This exercise is mounted on CodeCrunch. CS1010 (AY2012/3 Semester 1) Week5 - 12

  13. 1. Week 4 Ex3: NRIC Check code Step 1: Multiply the digits with corresponding weights 2,7,6,5,4,3,2 and add them up. Eg: 82 + 77 + 36 + 05 + 24 + 13 + 52 = 16+49+18+0+8+3+10 = 104 // Extract the digits digit7 = num%10; num /= 10; digit6 = num%10; num /= 10; digit5 = num%10; num /= 10; digit4 = num%10; num /= 10; digit3 = num%10; num /= 10; digit2 = num%10; num /= 10; digit1 = num%10; step1 = digit1*2 + digit2*7 + digit3*6 + digit4*5 + digit5*4 + digit6*3 + digit7*2; Week5 - 13

  14. 1. Week 4 Ex3: NRIC Check code Step 2: Divide step 1 result by 11 to obtain the remainder. Eg: 104 % 11 = 5 step2 = step1 % 11; Step 3: Subtract step 2 result from 11 Eg: 11 – 5 = 6 step3 = 11 - step2; CS1010 (AY2012/3 Semester 1) Week5 - 14

  15. 1. Week 4 Ex3: NRIC Check Code Step 4: Match step 3 result in this table for the check code switch (step3) { case 1: code = 'A'; break; case 2: code = 'B'; break; case 3: code = 'C'; break; case 4: code = 'D'; break; case 5: code = 'E'; break; case 6: code = 'F'; break; case 7: code = 'G'; break; case 8: code = 'H'; break; case 9: code = 'I'; break; case 10: code = 'Z'; break; case 11: code = 'J'; } // end switch CS1010 (AY2012/3 Semester 1) Week5 - 15

  16. Recall: Control Structures Sequence Selection if-else, switch Repetition CS1010 (AY2012/3 Semester 1) Week5 - 16

  17. 2. LOOPS! (1/2) “A program without a loop and a structure variable isn’t worth writing.” Alan J.Perlis Yale University The first recipient of ACM Turing Award • A loop is a statement whose job is to repeatedly execute some other statement(s). CS1010 (AY2012/3 Semester 1) Week5 - 17

  18. 2. LOOPS! (2/2) Each round of the loop is called an iteration. Loop condition loop body false cond? true Some statement(s) CS1010 (AY2012/3 Semester 1) Week5 - 18

  19. 2. Loop: Demo (1/3) • Keep prompting the user to input a non-negative integer, and output that integer. • Halt the loop when the input is negative. Enter a number: 12 You entered: 12 Enter a number: 0 You entered: 0 Enter a number: 26 You entered: 26 Enter a number: 5 You entered: 5 Enter a number: -1 • Key observations: • You keep repeating a task while certain condition is met, or alternatively, you repeat until the condition is not met. • You do not know beforehand how many iterations there will be. CS1010 (AY2012/3 Semester 1) Week5 - 19

  20. 2. Loop: Demo (2/3) Loop condition int main(void) { int num; printf("Enter a number: "); scanf("%d", &num); if (num < 0) return 0; printf("You entered: %d\n", num); printf("Enter a number: "); scanf("%d", &num); if (num < 0) return 0; printf("You entered: %d\n", num); printf("Enter a number: "); scanf("%d", &num); .... } Enter a number: 12 You entered: 12 Enter a number: 0 You entered: 0 Enter a number: 26 You entered: 26 Enter a number: 5 You entered: 5 Enter a number: -1 Loop body CS1010 (AY2012/3 Semester 1) Week5 - 20

  21. 2. Loop: Demo (3/3) Week5_Read_print.c intmain(void) { int num; printf("Enter a number: "); scanf("%d", &num); while (num >= 0) { printf("You entered: %d\n", num); printf("Enter a number: "); scanf("%d", &num); } return 0; } false num >= 0? true printf … printf … scanf… CS1010 (AY2012/3 Semester 1) Week5 - 21

  22. 3. The whileLoop while ( condition ) { // loop body } false If condition is true, execute loop body; otherwise, terminate loop. cond? true Loop body CS1010 (AY2012/3 Semester 1)

  23. 3.1 The whileLoop: Demo (1/3) • Keep prompting the user to input a non-negative integer, and output that integer. • Halt the loop when the input is negative, and output the maximum integer input so far. Enter a number: 12 Enter a number:0 Enter a number: 26 Enter a number: 5 Enter a number: -1 The maximum number is 26 CS1010 (AY2012/3 Semester 1) Week5 - 23

  24. 3.1 The whileLoop: Demo (2/3) maxi = 0; num  input; while (num >= 0) { if (maxi < num) maxi = num; num  input; } print maxi; maxi = 0; num  input; if (num < 0) { print maxi; stop; } if (maxi < num) maxi = num ; num  input; if (num < 0) { print maxi; stop; } if (maxi < num) maxi = num; num  input; ... CS1010 (AY2012/3 Semester 1) Week5 - 24

  25. 3.1 The whileLoop: Demo (3/3) Week5_Find_max.c intmain(void) { int num, maxi = 0; printf("Enter a number: "); scanf("%d", &num); while (num >= 0) { if (maxi < num) { maxi = num; } printf("Enter a number: "); scanf("%d", &num); } prinf("The maximum number is %d\n", maxi); return 0; } CS1010 (AY2012/3 Semester 1) Week5 - 25

  26. 3.2 whileLoop Condition (1/2) When the loop condition is always false, the loop body is not executed. Output: ? a = 2; b = 7; while (a == b) { print a; a = a + 2; } CS1010 (AY2012/3 Semester 1) Week5 - 26

  27. 3.2 whileLoop Condition (2/2) Output: ? a = 2; b = 7; while (a != b) { print a; a = a + 2; } CS1010 (AY2012/3 Semester 1) Week5 - 27 

  28. 3.3 Tracing whileLoop (1/4) • Trace the following codes manually and write out their outputs (assume all variables are of type int) (a) a = 1; while (a*a < 100) { printf("%d ", a); a *= 2; } printf("\n"); (b) b = 0; c = 9; while (b < c) { printf("b=%d,c=%d\n", b, c); b++; c--; } printf("outside: b=%d,c=%d\n", b, c); CS1010 (AY2012/3 Semester 1) 

  29. 3.3 Tracing whileLoop (2/4) • Example: Given a positive integer n, print out its digits from least significant to most significant. • Sample run: Enter a positive integer: 28943 3 4 9 8 2 CS1010 (AY2012/3 Semester 1)

  30. 3.3 Tracing whileLoop (3/4) • Example: Given a positive integer n, print out its digits from least significant to most significant. Week5_Print_digits.c // Precond: n > 0 void print_digits(intn) { int digit; while (n > 0) { digit = n%10; printf("%d\n", digit); n /= 10; } } CS1010 (AY2012/3 Semester 1)

  31. 3.3 Tracing whileLoop (4/4) Week5_Print_digits.c // Precond: n > 0 void print_digits(intn) { int digit; while (n > 0) { digit = n%10; printf("%d\n", digit); n /= 10; } } What are the values of n and digit after exiting the loop? CS1010 (AY2012/3 Semester 1) 

  32. 4. The do-whileLoop (1/2) do { // loop body } while ( condition ); Execute loop body at least once. Loop body cond? true false CS1010 (AY2012/3 Semester 1)

  33. 4. The do-whileLoop (2/2) do { // loop body } while ( condition ); Week5_Count_digits.c // Precond: n > 0 intcount_digits(intn) { int counter = 0; do { counter++; n /= 10; } while (n > 0); return counter; } • Example: Count the number of digits in an integer. CS1010 (AY2012/3 Semester 1)

  34. 5. The for Loop (1/2) for ( initialization; condition; update ) { // loop body } Initialization: initialize the loop variable Condition: repeat loop while the condition on loop variableis true Update: change value ofloop variable CS1010 (AY2012/3 Semester 1)

  35. 5. The for Loop (2/2) • Example: Print numbers 1 to 10 int n; for (n=1; n<=10; n++) { printf("%3d", n); } • Steps: • n=1; • if (n<=10) {printf(…);n++;Go to step 2} • Exit the loop CS1010 (AY2012/3 Semester 1)

  36. Week5_OddIntegers_v1.c #include <stdio.h> void print_odd_integers(int); intmain(void) { int num; printf("Enter a positive integer: "); scanf("%d", &num); print_odd_integers(num); return0; } // Precond: n > 0 void print_odd_integers(intn) { inti; for (i=1; i<=n; i+=2) printf("%d ", i); printf("\n"); } 5.1 The for Loop: Odd Integers (1/2) CS1010 (AY2012/3 Semester 1)

  37. Week5_OddIntegers_v2.c Week5_OddIntegers_v3.c // Precond: n > 0 void print_odd_integers(intn) { inti; for (i=1; i<=n; i++) if (i%2 != 0) printf("%d ", i); printf("\n"); } // Precond: n > 0 void print_odd_integers(intn) { for ( ; n > 0; n--) if (n%2 != 0) printf("%d ", n); printf("\n"); } 5.1 The for Loop: Odd Integers (2/2) Values printed from largest to smallest. Empty statement CS1010 (AY2012/3 Semester 1)

  38. 6. Exercise #1: Sum of Multiples of 3 (1/2) • Modify the program Week5_OddIntegers_v1.c to read a positive integer n and then compute the sum of all integers which are multiples of 3 between 1 and n using a ‘for’ loop. Write a function called sum_multiples_of_3(int). • This problem can be solved with a formula, but we will use the ‘while’ loop just for exercise. • Call this program Week5_SumMultiples3.c • Sample run: Enter a positive integer: 50 Sum = 408 CS1010 (AY2012/3 Semester 1)

  39. 6. Exercise #1: Sum of Multiples of 3 (2/2) • How about using a while loop instead? • Pseudo-code using a while loop: precondition: n > 0 sum  0 i n while i > 0 if i is multiple of 3 then sum  sum + i i  i - 1 return sum CS1010 (AY2012/3 Semester 1)

  40. 7. Exercise #2: Asterisks (1/2) • Write a program Week5_Asterisks.c to read an integer n and print a certain number of asterisks on a single line. Write a function print_asterisks(int). • If n is non-positive, then no asterisk should be printed. • Sample runs: Think! What is the relationship between n and the number of *? Enter n: 3 ***** Done! Enter n: 6 *********** Done! Enter n: -2 Done! Enter n: 10 ******************* Done! CS1010 (AY2012/3 Semester 1)

  41. 7. Exercise #2: Asterisks (2/2) • Write a program Week5_Asterisks.c to read an integer n and print a certain number of asterisks on a single line. Write a function print_asterisks(int). Pseudo-code: read input n ; if n is non-positive print “done” and end program ; m compute the number of asterisks given n print_asterisks(m) end program; CS1010 (AY2012/3 Semester 1)

  42. 8. Common Errors (1/2) • What are the outputs for the following programs? (Do not code and run them. Trace the programs manually.) inti; for (i=0; i<10; i++); printf("%d\n", i); Week5_CommonErrors1.c inti = 0; while (i<10); { printf("%d\n", i); i++; } Week5_CommonErrors2.c CS1010 (AY2012/3 Semester 1) 

  43. 8. Common Errors (2/2) intz = 3; while (z = 1) { printf("z = %d\n", z); z = 99; } • Off-by-one error; make sure the loop repeats exactly the correct number of iterations. • Make sure the loop body contains a statement that will eventually cause the loop to terminate. • Using ‘=’ where it should be ‘==’ • Putting ‘;’ where it should not be (just like for the ‘if’ statement) Week5_CommonErrors3.c CS1010 (AY2012/3 Semester 1) 

  44. 9. Some Notes of Caution (1/2) • Involving real numbers • Trace the program manually without running it. double one_seventh = 1.0/7.0; double f = 0.0; while (f != 1.0) { printf("%f\n", f); f += one_seventh; } Week5_Caution1.c CS1010 (AY2012/3 Semester 1) 

  45. 9. Some Notes of Caution (2/2) • Involving ‘wrap-around’ • Trace the program manually without running it. inta = 2147483646; inti; for (i=1; i<=5; i++) { printf("%d\n", a); a++; } Week5_Caution2.c CS1010 (AY2012/3 Semester 1) 

  46. 10. Exercise #3: Tracing Nested Loops • You are given Week5_NestedLoop1.c, Week5_NestedLoop2.c and Week5_NestedLoop3.c • Hand trace the programs and write out the outputs without running the programs • Verify your answers by running the programs CS1010 (AY2012/3 Semester 1)

  47. 11. Using break in Loop (1/2) • You have seen ‘break’ in switch statement • ‘break’ can also be used in a loop • Test out Week5_BreakInLoop.c CS1010 (AY2012/3 Semester 1)

  48. 11. Using break in Loop (2/2) • Use ‘break’ sparingly, because it violates the one-entry-one-exit control flow. • A loop with ‘break’ can be rewritten into one without ‘break’. // without break intn, i = 1, sum = 0; intisValid = 1; while ((i <= 5) && isValid){ scanf("%d", &n); if (n < 0) isValid = 0; else { sum += n; i++; } } // with break intn, i = 1, sum = 0; while (i <= 5) { scanf("%d", &n); if (n < 0) break; sum += n; i++; } CS1010 (AY2012/3 Semester 1)

  49. 12. Using continue in Loop • Test out Week5_ContinueInLoop.c • ‘continue’ is used even less often than ‘break’ CS1010 (AY2012/3 Semester 1)

  50. 13. Exercise #4: Prime Number (1/2) • Primality test is a classic programming problem • Given a positive integer, determine whether it is a prime • A prime number has two distinct factors (divisors): 1 and itself. Examples: 2, 3, 5, 7, 11, ... (Note: 1 is not a prime!) • Write a program Week5_PrimeTest.c. You should include a function is_prime(int). (What does it return?) • Sample runs: Enter a positive integer: 131 131 is a prime. Enter a positive integer: 713 713 is not a prime. CS1010 (AY2012/3 Semester 1)

More Related