1 cse1301 computer programming lecture 11: iteration (part 2)

48
1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

Post on 20-Dec-2015

226 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

1

CSE1301Computer Programming

Lecture 11:Iteration (Part 2)

Page 2: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

2

Topics

• Infinite loops • while and for• Macros

• Input from a file

• Examples

– CountConsonantsAndVowels

– Factorization

Page 3: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

3

Infinite Loops

while ( 1 ) { ...etc...etc...etc... }

for ( ; 1 ; ) { ...etc...etc...etc... }

for ( ; ; ) { ...etc...etc...etc... }

Page 4: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

4

Infinite Loops

while ( 1 ) { ...etc...etc...etc... }

for ( ; 1 ; ) { ...etc...etc...etc... }

for ( ; ; ) { ...etc...etc...etc... }

Use an:

if ( condition ) { break; }

statement to break the loop

Page 5: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

5

while (1) { printf("Enter bounds (low high): "); scanf("%d %d", &low, &high);

if ((low >= 0) && (high <= 127) && (low < high)) { break; } else { printf("Bad bounds. Try again.\n"); } }

Example: asciiCheck.c

Page 6: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

6

while (1) { printf("Enter bounds (low high): "); scanf("%d %d", &low, &high);

if ((low >= 0) && (high <= 127) && (low < high)) { break; } else { printf("Bad bounds. Try again.\n"); } }

Example: asciiCheck.c

Page 7: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

7

while and for

• A for loop can always be rewritten as an equivalent while loop, and vice-versa

• The continue statement in a for loop passes control to the “update” expression

Page 8: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

8

Example: asciiPrintPrint out a section of the ASCII table

for each character from the lower bound to higher bound{ print its ascii value and ascii character}

for ( ch = low; ch <= high; ch++ ) { printf("%d: %c\n", ch, ch); } asciiPrint1.c

ch = low; while ( ch <= high ) { printf("%d: %c\n", ch, ch); ch++; } asciiPrint2.c

Page 9: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

9

for ( ch = low; ch <= high; ch++ ) { printf("%d: %c\n", ch, ch); }

ch = low; while (1) { printf("%d: %c\n", ch, ch); if (ch < high) { ch++; continue; } else { break; } } asciiPrint3.c

asciiPrint1.c

Example: asciiPrint (cont)

Page 10: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

10

for ( ch = low; ch <= high; ch++ ) { printf("%d: %c\n", ch, ch); }

ch = low; for (;;) { printf("%d: %c\n", ch, ch); ch++; if (ch > high) { break; } }

asciiPrint4.c

Example: asciiPrint (cont)

asciiPrint1.c

Page 11: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

11

while (1) { printf("Enter bounds (low high): "); scanf("%d %d", &low, &high);

if ((low >= MIN) && (high <= MAX) && (low < high)) { break; } else { printf("Bad bounds. Try again.\n"); } }

for (ch=low; ch <= high; ch++) { printf("%d: %c\n", ch, ch); }

return 0;}

Example: ascii1.c

#include <stdio.h>

/* Print a section of the ASCII table */

#define MIN 0#define MAX 127

int main(){ int low, high; char ch;

Page 12: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

12

while (1) { printf("Enter bounds (low high): "); scanf("%d %d", &low, &high);

if ((low >= MIN) && (high <= MAX) && (low < high)) { break; } else { printf("Bad bounds. Try again.\n"); } }

for (ch=low; ch <= high; ch++) { printf("%d: %c\n", ch, ch); }

return 0;}

#include <stdio.h>

/* Print a section of the ASCII table */

#define MIN 0#define MAX 127

int main(){ int low, high; char ch;

Example: ascii1.c (cont)

Page 13: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

13

while (1) { printf("Enter bounds (low high): "); scanf("%d %d", &low, &high);

if ((low >= MIN) && (high <= MAX) && (low < high)) { break; } else { printf("Bad bounds. Try again.\n"); } }

for (ch=low; ch <= high; ch++) { printf("%d: %c\n", ch, ch); }

return 0;}

#include <stdio.h>

/* Print a section of the ASCII table */

#define MIN 0#define MAX 127

int main(){ int low, high; char ch;

Macro definition:

#define identifier tokens

All subsequent instances of identifier are replaced with its token

Example: ascii1.c (cont)

Page 14: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

14

Example 1: CountConsonantsAndVowels

• Count the number of consonants and the number of vowels in a file

• Non-alphabetic characters should not be counted

Page 15: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

15

open file for inputset consonantCount to 0set vowelCount to 0loop{ input ch if (end of file) { exit loop }

if (ch is a vowel) { increment vowelCount } else if (ch is a consonant) { increment consonantCount }}close fileoutput consonantCount, vowelCount

Algorithm

Page 16: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

16

open file for inputset consonantCount to 0set vowelCount to 0loop{ input ch if (end of file) { exit loop }

if (ch is a vowel) { increment vowelCount } else if (ch is a consonant) { increment consonantCount }}close fileoutput consonantCount, vowelCount

Algorithm (cont)

Page 17: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

17

open file for inputset consonantCount to 0set vowelCount to 0loop{ input ch if (end of file) { exit loop }

if (ch is a vowel) { increment vowelCount } else if (ch is a consonant) { increment consonantCount }}close fileoutput consonantCount, vowelCount

Algorithm (cont)

Page 18: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

18

open file for inputset consonantCount to 0set vowelCount to 0loop{ input ch if (end of file) { exit loop }

if (ch is a vowel) { increment vowelCount } else if (ch is a consonant) { increment consonantCount }}close fileoutput consonantCount, vowelCount

Algorithm (cont)

Page 19: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

19

open file for inputset consonantCount to 0set vowelCount to 0loop{ input ch if (end of file) { exit loop }

if (ch is a vowel) { increment vowelCount } else if (ch is a consonant) { increment consonantCount }}close fileoutput consonantCount, vowelCount

Algorithm (cont)

Page 20: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

20

open file for inputset consonantCount to 0set vowelCount to 0loop{ input ch if (end of file) { exit loop }

if (ch is a vowel) { increment vowelCount } else if (ch is a consonant) { increment consonantCount }}close fileoutput consonantCount, vowelCount

Algorithm (cont)

Page 21: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

21

open file for inputset consonantCount to 0set vowelCount to 0loop{ input ch if (end of file) { exit loop }

if (ch is a vowel) { increment vowelCount } else if (ch is a consonant) { increment consonantCount }}close fileoutput consonantCount, vowelCount

Read input from file?

Algorithm (cont)

Page 22: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

22

open file for inputset consonantCount to 0set vowelCount to 0loop{ input ch if (end of input) { exit loop }

if (ch is a vowel) { increment vowelCount } else if (ch is a consonant) { increment consonantCount }}close fileoutput consonantCount, vowelCount

First, implement with input from stdin stream. Once working,

modify to get input from file

Algorithm (cont)

Page 23: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

23

#include <stdio.h>

int main(){ int consonantCount, vowelCount ; char ch ;

consonantCount = 0 ; vowelCount = 0 ;

printf("\nInput has %d consonants and %d vowels.\n", consonantCount, vowelCount) ;

return 0;}

Program

Page 24: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

24

consonantCount = 0 ; vowelCount = 0 ; /* For each character in the file in turn, test if it is a consonant or a vowel, and adjust the total accordingly */

while ( scanf("%c", &ch) != EOF ) {

}

printf("\nInput has %d consonants and %d vowels.\n", consonantCount, vowelCount) ;

Program

Page 25: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

25

/* For each character in the file in turn, test if it is a consonant or vowel, and if so, adjust total accordingly */

while ( scanf("%c", &ch) != EOF ) { if (ch == 'a' || ch == 'A' || ch == 'e' || ch == 'E' || ch == 'i' || ch == 'I' || ch == 'o' || ch == 'O' || ch == 'u' || ch == 'U') { /* Vowel */ vowelCount++ ; } else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { /* Consonant, since vowels already dealt with */ consonantCount++ ; } }

Program

Page 26: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

26

#include <stdio.h>

/* Count the number of vowels, and the number of consonants in the input. */

int main(){ int consonantCount, vowelCount ; char ch ;

consonantCount = 0 ; vowelCount = 0 ;

/* For each character in the file in turn, test if it is a consonant or vowel, and if so, adjust total accordingly. */

while ( scanf("%c", &ch) != EOF ) { if (ch == 'a' || ch == 'A' || ch == 'e' || ch == 'E' || ch == 'i' || ch == 'I' || ch == 'o' || ch == 'O' || ch == 'u' || ch == 'U') { /* Vowel. */ vowelCount++ ; } else if ( (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ) { /* Consonant, since vowels already dealt with. */ consonantCount++ ; } }

printf("\nInput has %d consonants and %d vowels.\n", consonantCount, vowelCount) ;

return 0;}

vowel1.c

Modify to get input from file?

Page 27: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

27

#include <stdio.h>

int main(){ int consonantCount, vowelCount ; char ch ;

consonantCount = 0 ; vowelCount = 0 ;

printf("\nFile has %d consonants and %d vowels.\n", consonantCount, vowelCount) ;

return 0;}

while ( scanf("%c", &ch) != EOF ){

}

...etc...etc...etc...

Page 28: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

28

Input file stream (aka “file pointer”)

#include <stdio.h>

int main(){ FILE *inputFile ; int consonantCount, vowelCount ; char ch ;

consonantCount = 0 ; vowelCount = 0 ;

inputFile = fopen("yourFile.txt", "r") ;

printf("\nFile has %d consonants and %d vowels.\n", consonantCount, vowelCount) ;

fclose(inputFile) ; return 0;}

while ( fscanf(inputFile, "%c", &ch) != EOF ){

}

...etc...etc...etc...

Page 29: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

29

#include <stdio.h>

int main(){ FILE *inputFile ; int consonantCount, vowelCount ; char ch ;

consonantCount = 0 ; vowelCount = 0 ;

inputFile = fopen("yourFile.txt", "r") ;

printf("\nFile has %d consonants and %d vowels.\n", consonantCount, vowelCount) ;

fclose(inputFile) ; return 0;}

while ( fscanf(inputFile, "%c", &ch) != EOF ){

}

...etc...etc...etc...

Declare file pointer

Open file for input

Read input from file

Close file

Page 30: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

30

#include <stdio.h>/* Count the number of vowels, and the number of consonants in the file. */

int main(){ FILE *inputFile ; int consonantCount, vowelCount ; char ch ;

inputFile = fopen("yourFile.txt", "r") ;

consonantCount = 0 ; vowelCount = 0 ;

/* For each character in the file in turn, test if it is a consonant or vowel, and if so, adjust total accordingly. */

while ( fscanf(inputFile, "%c", &ch) != EOF ) { if (ch == 'a' || ch == 'A' || ch == 'e' || ch == 'E' || ch == 'i' || ch == 'I' || ch == 'o' || ch == 'O' || ch == 'u' || ch == 'U') { /* Vowel. */ vowelCount++ ; } else if ( (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ) { /* Consonant, since vowels already dealt with. */ consonantCount++ ; } }

printf("\nFile has %d consonants and %d vowels.\n", consonantCount, vowelCount) ;

fclose(inputFile) ;

return 0;}

vowel2.c

More on file input/output in

Lecture 14

Page 31: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

31

Example 2: Factorization

• Write a program which prints out the prime factorization of a number (treat 2 as the first prime)

• For example,

on input 6, desired output is: 2 3

" " 24, " " : 2 2 2 3

" " 14, " " : 2 7

" " 23, " " : 23 (23 is prime)

Page 32: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

32

input n

set factor to 2

Algorithm

Page 33: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

33

input n

set factor to 2

while(some factor yet to try){

}

Algorithm (cont)

Page 34: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

34

input n

set factor to 2

while(some factor yet to try){ if (n is divisible by factor) { output factor set n to n / factor }

}

Algorithm (cont)

Page 35: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

35

input n

set factor to 2

while(some factor yet to try){ if (n is divisible by factor) { output factor set n to n / factor } else { increment factor }}

Algorithm (cont)

Page 36: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

36

input n

set factor to 2

while(some factor yet to try){ if (n is divisible by factor) { output factor set n to n / factor } else { increment factor }}

while(some factor yet to try){ if (n is divisible by factor) { output factor set n to n / factor }

increment factor}

Algorithm (cont)

Why not?

Page 37: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

37

#include <stdio.h>

/* Print out the prime factors of a number */

int main(){ int n, factor ;

return 0;}

Program

Page 38: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

38

#include <stdio.h>

/* Print out the prime factors of a number */

int main(){ int n, factor ;

printf("\nEnter integer: ") ; scanf("%d", &n) ;

return 0;}

Program (cont)

Page 39: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

39

#include <stdio.h>

/* Print out the prime factors of a number */

int main(){ int n, factor ;

printf("\nEnter integer: ") ; scanf("%d", &n) ;

printf("\nThe prime factors of %d are: ", n) ;

/* Try each possible factor in turn */

printf("\n\n"); return 0;}

Program (cont)

Page 40: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

40

/* Try each possible factor in turn */

factor = 2; while ( factor <= n && n > 1 ) {

}

Page 41: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

41

/* Try each possible factor in turn */

factor = 2; while ( factor <= n && n > 1 ) { if (n % factor == 0) { /* n is a multiple of factor, ** so print factor and divide n by factor */

printf(" %d", factor) ; n = n / factor ; }

}

Page 42: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

42

/* Try each possible factor in turn */

factor = 2; while ( factor <= n && n > 1 ) { if (n % factor == 0) { /* n is a multiple of factor, ** so print factor and divide n by factor */

printf(" %d", factor) ; n = n / factor ; } else { /* n is not a multiple of factor; ** try next possible factor */

factor++ ; } }

Page 43: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

43

/* Try each possible factor in turn */

factor = 2; while ( factor <= n && n > 1 ) { if (n % factor == 0) { /* n is a multiple of factor, ** so print factor and divide n by factor */

printf(" %d", factor) ; n = n / factor ; } else { /* n is not a multiple of factor; ** try next possible factor */

factor++ ; } }

Page 44: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

44

#include <stdio.h>

/* Print out the prime factors of a number */

int main(){ int n, factor ;

printf("\nEnter integer: ") ; scanf("%d", &n) ;

printf("\nThe prime factors of %d are: ", n) ;

/* Try each possible factor in turn */

factor = 2 while ( factor <= n && n > 1 ) { if (n % factor == 0) { /* n is a multiple of factor, ** so print factor and divide n by factor. */

printf(" %d", factor) ; n = n / factor ; } else { /* n is not a multiple of factor; ** try next possible factor */

factor++ ; } } printf("\n\n"); return 0;}

factor1.c

Page 45: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

45

/* Try each possible factor in turn */

factor = 2; while ( factor <= n && n > 1 ) { if (n % factor == 0) { /* n is a multiple of factor, ** so print factor and divide n by factor */

printf(" %d", factor) ; n = n / factor ; } else { /* n is not a multiple of factor; ** try next possible factor */

factor++ ; } }

Change from while-loop to for-

loop?

Page 46: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

46

/* Try each possible factor in turn */

for ( factor = 2; factor <= n && n > 1 ; ) { if (n % factor == 0) { /* n is a multiple of factor, ** so print factor and divide n by factor */

printf(" %d", factor) ; n = n / factor ; } else { /* n is not a multiple of factor; ** try next possible factor */

factor++ ; } }

Page 47: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

47

#include <stdio.h>

/* Print out the prime factors of a number. */

int main(){ int n, factor ;

printf("\nEnter integer: ") ; scanf("%d", &n) ;

printf("\nThe prime factors of %d are: ", n) ;

/* Try each possible factor in turn. */

for ( factor = 2; factor <= n && n > 1 ; ) { if (n % factor == 0) { /* n is a multiple of factor, ** so print factor and divide n by factor. */

printf(" %d", factor) ; n = n / factor ; } else { /* n is not a multiple of factor; ** try next possible factor. */

factor++ ; } } printf("\n\n"); return 0;}

factor2.c

Page 48: 1 CSE1301 Computer Programming Lecture 11: Iteration (Part 2)

48

Reading

• Deitel &Deitel Chapter 4, – Exercises 4.16, 4.36