Chapter5 Loops Nva

Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 48

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

CS1010 (AY2012/3 Semester 1) Week5 - 2


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

CS1010 (AY2012/3 Semester 1) Week5 - 3


Week 5: Outline (2/2)
8. Common Errors
9. Some Notes of Caution
10. Exercise #3: Tracing Nested Loops
11. Using break in Loop
12. Using continue in Loop
13. Exercise #4: Prime Number (take-home)

CS1010 (AY2012/3 Semester 1) Week5 - 4


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 - 5


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
1 2 3 4 5 6 7 8 9 10 11
A B C D E F G H I Z J
 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 - 6


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 - 7
Recall: Control Structures

Sequence

Selection if-else, switch

Repetition

CS1010 (AY2012/3 Semester 1) Week5 - 8


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 - 9


2. LOOPS! (2/2)
Each round of the
loop is called an
Loop
condition
iteration.

cond? false

true
loop body
Some
statement(s)

CS1010 (AY2012/3 Semester 1) Week5 - 10


2. Loop: Demo (1/3)
 Keep prompting the Enter a number: 12
user to input a non- You entered: 12
negative integer, and Enter a number: 0
output that integer. You entered: 0
 Halt the loop when Enter a number: 26
the input is negative. You entered: 26
Enter a number: 5
You entered: 5
 Key observations: Enter a number: -1
 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 - 11
2. Loop: Demo (2/3)
Loop Enter a number: 12
int main(void) {
condition You entered: 12
int num;
printf("Enter a number: "); Enter a number: 0
scanf("%d", &num); You entered: 0
if (num < 0) return 0;
printf("You entered: %d\n",
Enter a number: 26
num); You entered: 26
printf("Enter a number: "); Enter a number: 5
scanf("%d", &num);
if (num < 0) return 0;
You entered: 5
printf("You entered: %d\n", Enter a number: -1
num);
printf("Enter a number: ");
scanf("%d", &num); Loop body
....
}
CS1010 (AY2012/3 Semester 1) Week5 - 12
2. Loop: Demo (3/3)
Week5_Read_print.c
int main(void) {
int num;

false
num >= 0? printf("Enter a number: ");
scanf("%d", &num);
true while (num >= 0) {
printf("You entered: %d\
n", num);
printf …
printf("Enter a number:
printf …
");
scanf …
scanf("%d", &num);
}

return 0;
}
CS1010 (AY2012/3 Semester 1) Week5 - 13
3. The while Loop
false
while ( condition ) cond?

{ true
// loop body
Loop
} body

If condition is true,
execute loop body;
otherwise, terminate
loop.

CS1010 (AY2012/3 Semester 1) Week5 - 14


3.1 The while Loop: Demo
(1/3)
 Keep prompting the
user to input a non- Enter a number: 12
negative integer, and Enter a number: 0
output that integer.
Enter a number: 26
 Halt the loop when Enter a number: 5
the input is negative,
Enter a number: -1
and output the
maximum integer The maximum number is 26
input so far.

CS1010 (AY2012/3 Semester 1) Week5 - 15


3.1 The while Loop: Demo
(2/3)
maxi = 0;
maxi = 0;
num  input;
if (num < 0) {
num  input;
print maxi; while (num >= 0) {
stop; if (maxi < num)
} maxi = num;
if (maxi < num) num  input;
maxi = num ; }
num  input;
if (num < 0) { print maxi;
print maxi;
stop;
}
if (maxi < num)
maxi = num;
num  input;
...
CS1010 (AY2012/3 Semester 1) Week5 - 16
3.1 The while Loop: Demo
(3/3)
int main(void) { Week5_Find_max.c
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 - 17
3.2 while Loop Condition (1/2)

a = 2; Output: ?
b = 7;
while (a == b) {
print a;
a = a + 2;
}

 When the loop condition is always false, the loop body is


not executed.

CS1010 (AY2012/3 Semester 1) Week5 - 18


3.2 while Loop Condition (2/2)

a = 2; Output: ?
b = 7;
while (a != b) {
print a;
a = a + 2;
}

 CS1010 (AY2012/3 Semester 1) Week5 - 19


3.3 Tracing while Loop (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) Week5 - 20
3.3 Tracing while Loop (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) Week5 - 21


3.3 Tracing while Loop (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(int n) {
int digit;

while (n > 0) {
digit = n%10;
printf("%d\n",
digit);
n /= 10;
}
}
CS1010 (AY2012/3 Semester 1) Week5 - 22
3.3 Tracing while Loop (4/4)
Week5_Print_digits.c
// Precond: n > 0
void print_digits(int n) {
int digit;
What are the values
while (n > 0) { of n and digit after
digit = n%10; exiting the loop?
printf("%d\n",
digit);
n /= 10;
}
}
n initially 28943
n @ point 28943
digit @ point ***

 CS1010 (AY2012/3 Semester 1) Week5 - 23


Class Work

CS1010 (AY2012/3 Semester 1) Week5 - 24


4. The do-while Loop (1/2)
do
{ Execute loop body
// loop body at least once.
} while ( condition );

Loop
body

cond?
true
false

CS1010 (AY2012/3 Semester 1) Week5 - 25


4. The do-while Loop (2/2)
do
 Example: Count the number {
of digits in an integer. // loop body
} while ( condition );
Week5_Count_digits.c
// Precond: n > 0
int count_digits(int n) {
int counter = 0;

do {
counter++;
n /= 10;
} while (n > 0);

return counter;
}
CS1010 (AY2012/3 Semester 1) Week5 - 26
5. The for Loop (1/2)
for ( initialization; condition; update )
{
// loop body
}

Initialization:
initialize the Condition: repeat loop
loop variable while the condition on
loop variable is true Update: change
value of loop
variable
CS1010 (AY2012/3 Semester 1) Week5 - 27
5. The for Loop (2/2)
 Example: Print numbers 1 to 10
int n; Steps:
for (n=1; n<=10; n++) { 1.n=1;
printf("%3d", n);
2.if (n<=10) {
}
printf(…);
n++;
Go to step
2
}
3. Exit the loop

CS1010 (AY2012/3 Semester 1) Week5 - 28


5.1 The for Loop: Odd Integers
(1/2) Week5_OddIntegers_v1.c
#include <stdio.h>
void print_odd_integers(int);
int main(void) {
int num;
printf("Enter a positive integer:
");
scanf("%d", &num);
print_odd_integers(num);
return 0;
}
// Precond: n > 0
void print_odd_integers(int n) {
int i;
for (i=1; i<=n; i+=2)
printf("%d ", i);
printf("\n");
} Semester 1)
CS1010 (AY2012/3 Week5 - 29
5.1 The for Loop: Odd Integers
(2/2) Week5_OddIntegers_v2.c
// Precond: n > 0
void print_odd_integers(int n) {
int i;
for (i=1; i<=n; i++)
if (i%2 != 0)
printf("%d ", i);
printf("\n");
}
Week5_OddIntegers_v3.c
// Precond: n > 0
void print_odd_integers(int n) {
for ( ; n > 0; n--)
if (n%2 != 0)
Values
printf("%d ", printed
n); from
Empty largest to smallest.
statement printf("\n");
}

CS1010 (AY2012/3 Semester 1) Week5 - 30


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 ‘for’ loop just for exercise.
 Call this program Week5_SumMultiples3.c
 Sample run:
Enter a positive integer: 50
Sum = 408

CS1010 (AY2012/3 Semester 1) Week5 - 31


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) Week5 - 32


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
Enter n: 3 Enter n: 6 between n and
***** *********** the number of *?
Done! Done!

Enter n: 10 Enter n: -2
******************* Done!
Done!

CS1010 (AY2012/3 Semester 1) Week5 - 33


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) Week5 - 34


8. Common Errors (1/2)
 What are the outputs for the following programs? (Do
not code and run them. Trace the programs manually.)
int i;

for (i=0; i<10; i++);


printf("%d\n", i);

Week5_CommonErrors1.c
int i = 0;

while (i<10);
{
printf("%d\n", i);
i++;
} Week5_CommonErrors2.c
 CS1010 (AY2012/3 Semester 1) Week5 - 35
8. Common Errors (2/2)
int z = 3;
while (z = 1) {
printf("z = %d\n", z);
z = 99;
}
Week5_CommonErrors3.c

 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)
 CS1010 (AY2012/3 Semester 1) Week5 - 36
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) Week5 - 37


9. Some Notes of Caution (2/2)
 Involving ‘wrap-around’
 Trace the program manually without running it.

int a = 2147483646;
int i;

for (i=1; i<=5; i++) {


printf("%d\n", a);
a++;
}
Week5_Caution2.c

 CS1010 (AY2012/3 Semester 1) Week5 - 38


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) Week5 - 39


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) Week5 - 40


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
// with break int n, i = 1, sum = 0;
int n, i = 1, sum = 0; int isValid = 1;
while ((i <= 5) && isValid){
while (i <= 5) { scanf("%d", &n);
scanf("%d", &n); if (n < 0)
if (n < 0) isValid = 0;
break; else {
sum += n; sum += n;
i++; i++;
} }
}
CS1010 (AY2012/3 Semester 1) Week5 - 41
12. Using continue in Loop
 Test out Week5_ContinueInLoop.c
 ‘continue’ is used even less often than ‘break’

CS1010 (AY2012/3 Semester 1) Week5 - 42


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) Week5 - 43


13. Exercise #4: Prime
Number (2/2)
 This is your take-home exercise.
 This exercise is mounted on CodeCrunch.
 We will discuss this in the next lecture.

CS1010 (AY2012/3 Semester 1) Week5 - 44


Summary for Today (1/2)
 Repetition statements (loops)
 for, while, do-while
 Nested loops
 break and continue

CS1010 (AY2012/3 Semester 1) Week5 - 45


Summary for Today (2/2)
 You have learned the 3 control structures:
 Sequence, Selection, Repetition
 With these, you are able to solve just any
computing problem!
 However, writing good programs is more than
just learning the syntax:
 Logic should be clear
 Variables should be descriptive
 Algorithm should be efficient

CS1010 (AY2012/3 Semester 1) Week5 - 46


Announcements/Things-to-do
 Revise Chapter 4 (Lessons 4.7 – 4.11)
 Deadline for Lab #2
 Deadline: 15th September 2012, Saturday, 12noon
 Practical Exam 1 (PE1)
 22nd September 2012, Saturday
 See web page for details:
http://www.comp.nus.edu.sg/~cs1010/3_ca/pe.html
 To prepare for next week’s lecture:
 Read Chapter 5 Functions
 Bring along your Week5_PrimeTest.c program

CS1010 (AY2012/3 Semester 1) Week5 - 47


End of File

You might also like