Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 Control Structures and Data Files Turgay Korkmaz Office: SB 4.01.13 Phone: (210) 458-7346 Fax: (210) 458-4437 web:

Similar presentations


Presentation on theme: "1 Control Structures and Data Files Turgay Korkmaz Office: SB 4.01.13 Phone: (210) 458-7346 Fax: (210) 458-4437 web:"— Presentation transcript:

1 1 Control Structures and Data Files Turgay Korkmaz Office: SB 4.01.13 Phone: (210) 458-7346 Fax: (210) 458-4437 e-mail: korkmaz@cs.utsa.edu web: www.cs.utsa.edu/~korkmaz CS 2073 Computer Programming w/Eng. Applications Ch 3

2 2 Lecture++; NameAddrContent Lecture7

3 3 3.1 Algorithm Development So far, we considered very simple programs (read, compute, print) Top-down Design Start from the big picture Use a process called divide-and-conquer Keep dividing the problem until steps are detailed enough to convert to a program Refinement with Pseudo-code (English like statements) and Flowchart (diagram, graph)

4 4 Pseudo-code Notation and Flowchart Symbols

5 5 Structured Programming Sequence Selection Repetition yesno yes no Use simple control structures to organize the solution to a problem

6 6 Sequence

7 7 Selection

8 8 Repetition

9 9 Extras Evaluation of alternative solution A problem can be solved in many different ways Which is the best (e.g, faster, less memory req) Error condition Do not trust user! Check the data. A=b/c; Be clear about specifications Generation of Test Data Test each of the error conditions Program validation and verification Program walkthrough

10 10 3.2 Conditional Expressions Selection and repetition structures use conditions, so we will first discuss them A condition is an expression (e.g., x= a > b) that can be evaluated to be TRUE (any value > 0) or FALSE (value of 0) Conditional Expression is composed of expressions combined with relational and/or logical operators

11 11 Relational Operators == equality(x == 3) !=non equality (y != 0) <less than (x < y) >greater than (y > 10) <=less than equal to (x <= 0) >=greater than equal to (x >= y) !!! a==b vs. a=b !!!

12 12 Examples A < B fabs(denum) < 0.0001 D = b > c; if (D) A=b+c; Mixing with arithmetic op X+Y >= K/3 4 2 -0.01 ? 6 4 2 1 10 A B denum D b c X Y K

13 13 Logical Operators ! not !(x==0) && and (x>=0) && (x<=10) ||or (x>0) || (x<0) ABA && BA || B!A!B False True FalseTrueFalseTrue False TrueFalse TrueFalseTrue False

14 14 Examples A =5 A+B * 2 =A/2 A<B || C<B && A-2 < 10 A < B < C ???? A<B<C is not the same as (A<B) && (B<C) 4 2 6 ABCABC

15 15 Precedence for Arithmetic, Relational, and Logical Operators

16 16 Exercise Assume that following variables are declared a = 5.5b = 1.5 k = -3 Are the following true or false a < 10.0 + k a + b >= 6.5 k != a-b !(a == 3*b) a 5 fabs(k)>3 || k<b-a

17 17 Exercise: Logical Circuit y1 = x1 && x2; y2 = x3 || x4; y3 = !x5; z1 = y1 || y2; z2 = y2 && y3 Without using y1, y2, y3 z1 = x1 && x2 || (x3 || x4); z2 = (x3 || x4) && !x5; AND x1 x2 x3 x4 x5 y1 z2 z1 y3 y2 Write a program that reads x1, x2, x3, x4, x5 and computes/prints z1, z2 OR NOT OR AND

18 Exercise 18 abCabC x

19 19 Lecture++; NameAddrContent Lecture8

20 20 3.3 Selection Statements if if else switch

21 21 if statement if(Boolean expression) statement;/* single statement */ if(Boolean expression) { /* more than one statement */ statement1; … statement n; }

22 22 if statement - examples if (x > 0) k++; if(x > 0) { y = sqrt(x); k++; } if(x > 0) /* a common mistake */ y = sqrt(x); k++; NameAddrContent x9 y5 k4

23 23 if else statement if(Boolean expression) statement; else statement; if(Boolean expression) { statement block } else { statement block }

24 24 if else statement What does the following program do? Assume that x, y, temp are declared. if (x > y) temp = x; else temp = y; NameAddrContent x9 y5 temp? if (x > y){ temp = x; } else { temp = y; }

25 25 Exercise Write an if-else statement to find both the maximum and minimum of two numbers. Assume that x, y, min, max are declared. if (x > y) { max = x; min = y; } else { max = y; min = x; } NameAddrContent x9 y5 max? min? 95959595 38953895 38833883 66836683 66666666

26 26 if else statement if (x > y) temp = x; else temp = y; Split the following statement into two separate if statements if (x > y) temp = x; if (x <= y) temp = y;

27 Flow chart for previous slide 27 x > y temp=xtemp=y T if (x > y) temp = x; else temp = y; if (x > y) temp = x; if (x <= y) temp = y; x > y temp=x temp=y T x <= y T

28 28 nested if-else if(x > y) if(y < z) k++; else m++; else j++; x > y y < z k++ m++ j++ T T F F if(x > y) { if(y < z) { k++; } else { m++; } } else { j++; }

29 29 Exercise x > y y < z k++ m++ j++ T T F F int x=9, y=7, z=2, k=0, m=0, j=0; if(x > y) if(y < z) k++; else m++; else j++; What are the values of j, k and m?

30 30 Exercise: Find the value of a int a = 750; if (a>0) if (a >= 1000) a = 0; else if (a <500) a =a*2; else a =a*10; else a =a+3; a > 0 a >= 1000 a = 0 a =a+3 a < 500 a =a*2a =a*10 T T T

31 31 Exercise: Find the value of a int a = 750; if (a>0) { if (a >= 1000) { a = 0; } else { if (a <500) { a =a*2; } else { a =a*10; } } else { a =a*3; } a > 0 a >= 1000 a = 0 a =a+3 a < 500 a=a*2a =a*10 T T T

32 32 Indentation int a = 750; if (a>0) if (a >= 1000) a = 0; else if (a <500) a=a*2; else a=a*10; else a =a+3; int a = 750; if (a>0) if (a >= 1000) a = 0; else if (a <500) a=a*2; else a=a*10; else a = a+3; Not good Good

33 33 Indentation (cont’d) What is the output of the following programs int a = 5, b = 3; if (a>10) { a = 50; b = 20; } printf(" a = %d, b = %d\n",a, b); if (a>10) a = 50; b = 20; printf(" a = %d, b = %d\n",a, b); if (a>10) a = 50; b = 20; printf(" a = %d, b = %d\n",a, b); if (a>10) { a = 50; b = 20; } printf(" a = %d, b = %d\n",a, b); Not good Good

34 34 Exercise: Region in a plane Write a program that reads a point (x, y) from user and prints its region Region 1 Region 4 Region 2 Region 3 For example Enter x y: 3 -1 This point is in Region 4 Enter x y: -1 -5 This point is in region 3 Enter x y: 0 5 ???????

35 35 Lecture++; NameAddrContent Lecture9

36 36 Switch Statement switch(expression) { case constant: statement(s); break; case constant: statement(s); break; default: /* default is optional */ statement(s); }

37 37 Switch Statement Expression must be of type integer or character The keyword case must be followed by a constant break statement is required unless you want all subsequent statements to be executed. switch (op_code) { case ‘N’: printf(“Normal\n”); break; case ‘M’: printf(“Maintenance Needed\n”); break; default: printf(“Error\n”); break; }

38 38 Exercise Convert the switch statement into if statement. switch (op_code) { case ‘N’: printf(“Normal\n”); break; case ‘M’: printf(“Maintenance Needed\n”); break; default: printf(“Error\n”); break; } if (op_code == ‘N’) printf(“Normal\n”); else if (op_code == ‘M’) printf(“Maintenance Needed\n”); else printf(“Error\n”);

39 39 Exercise Convert the following nested if/else statements to a switch statement if (rank==1 || rank==2) printf("Lower division \n"); else { if (rank==3 || rank==4) printf("Upper division \n"); else { if (rank==5) printf("Graduate student \n"); else printf("Invalid rank \n"); } switch(rank) { case 1: case 2: printf("Lower division \n"); break; case 3: case 4: printf("Upper division \n"); break; case 5: printf("Graduate student \n"); break; default: printf("Invalid rank \n"); }

40 40 More selection examples

41 41 Write if-else statement score > 70 age > 18 Good job Excellent job age > 18 Very bad You pass You fail T T T Good luck next time Don’t worry

42 42 if (score > 70) { printf(“You Pass\n”); if (age > 18) { printf(“Good job \n”); } else { printf(“Excellent job\n”); } } else { printf(“You Fail\n”); if (age > 18) { printf(“ Very bad \n”); } else { printf(“ Don’t worry \n”); } printf(“ Good luck next time \n”); }

43 43 get b, c from user a = b + c a 6 T F F Print “RIGTH-LEFT”, a, b, c a= 10 - c * c c = a+b Print “FINAL”, a, b, c Print “LEFT-LEFT”, a, b, c b= a * -c c != b a*b<=12 Print “RIGTH”, a, b, c b= 5 + c * 2 T Print “LEFT-RIGTH”, a, b, c c= 5 + c * 2 F T Print “RIGHT”, a, b, c means printf(“RIGHT a=%lf b=%lf c=%lf \n”,a, b, c);

44 44 a=b+c; if (a 6) { printf("RIGHT a=%lf b=%lf c=%lf \n", a, b, c); b=5+c*2; if (a*b<=12) { } else { printf("RIGHT-LEFT a=%lf b=%lf c=%lf \n",a, b, c); a=10-c*c; } } else { if (c != b) { printf("LEFT-RIGHT a=%lf b=%lf c=%lf \n",a, b, c); c=5+c*2; } printf("LEFT-LEFT a=%lf b=%lf c=%lf \n",a, b, c); b=a*-c; } c=a+b; printf("Final a=%lf b=%lf c=%lf \n",a, b, c);

45 45 Exercise: which task takes more time Suppose we have two tasks A and B A takes Ah hours, Am minutes, and As seconds B takes Bh hours, Bm minutes, and Bs seconds User enters Ah Am As Bh Bm Bs Write if-else statements to print out which task takes more time?

46 46 Max, Min, Median Write a program that reads 3 numbers a, b and c from user and computes minimum, median and maximum of the numbers. Example: a = 2, b = 5, c = 3 minimum = 2, maximum = 5, median = 3 a = 2, b = 2, c = 3 minimum = 2, maximum = 3, median = 2

47 47 Another if-else  flowchart if( A > 8) { A=b+c; if(A < 4) B=b*c; if(A > 8) B=b/c; } else { A=b-c; if(A < 5) B=b+c; else B=b%c; A=B; } A > 8 A < 4 A > 8 B=b*c B=b/c A=b-c A < 5 B=b+c B=b%c A=B A=b+c T T T T

48 48 Exercise: Assign Letter Grade Given a score and the following grading scale write a program to find the corresponding grade. 90-100A 80-89B 70-79C 60-69D 0-59F

49 49 Solution-1 if ((score >= 90) && (score <=100)) grade = 'A'; else if ((score >= 80) && (score <= 89)) grade = 'B'; else if ((score >= 70) && (score <= 79)) grade = 'C'; else if ((score >= 60) && (score <= 69)) grade = ‘D'; else if ((score >= 0) && (score <= 59)) grade = ‘F'; else printf("Invalide Score\n");

50 50 Solution-2 if ((score >= 0) && (score <= 100)) if (score >= 90) grade = 'A'; else if (score >= 80) grade = 'B'; else if (score >= 70) grade = 'C'; else if (score >= 60) grade = ‘D'; else grade = ‘F'; else printf("Invalide Score\n");

51 51 Triangle inequality Suppose we want to check if we can make a triangle using a, b, c a b c |a-b| <= c |a-c| <= b |b-c| <= a a+b >= c a+c >= b b+c >= a

52 52 Charge for money transfer Suppose you transfer $N and bank’s charge occurs as follows. Write a program that reads N and computes cost

53 53 Compute Queuing Delay Write C program that computes and prints out average delay in a queuing system, where the average delay is given as follows

54 54 #include int main(void) { /* Declare variables. If needed, you can declare more*/ double rho, mu, sigma, AvgDelay; printf("Enter rho(utilization), mu(service time) and " "sigma (standard deviation of service time) : "); scanf("%lf %lf %lf", &rho, &mu, &sigma); /* Compute and print the average delay using rho, mu, sigma */ if( rho > 0 && rho < 1) { AvgDelay = (rho / (1 - rho)) – rho*rho / (2 * (1-rho)) * (1-mu*mu*sigma*sigma); printf("AvgDelay = %lf \n", AvgDelay); } else if (rho >=1){ printf("AvgDelay is infinity \n"); } else printf("rho cannot be negative \n"); system("pause"); /* Exit program. */ return 0; }

55 55 Spell out a number in text using if-else and switch Write a program that reads a number between 1 and 999 from user and spells out it in English. For example: 453  Four hundred fifty three 37  Thirty seven 204  Two hundred four

56 56 Lecture++; NameAddrContent Lecture10

57 57 Lecture++; NameAddrContent Lecture11

58 MIDTERM 1 58

59 59 Lecture++; NameAddrContent Lecture12

60 60 Loop (Repetition) Structures

61 61 Problem: Conversion table degrees  radians Degrees to Radians 0 0.000000 10 0.174533 20 0.349066 30 0.523599 … 340 5.934120 350 6.108653 360 6.283186 radians = degrees * PI / 180;

62 62 #include #define PI 3.141593 int main(void) { int degrees=0; double radians; printf("Degrees to Radians \n"); degrees = 0; radians = degrees*PI/180; printf("%6i %9.6f \n", degrees, radians); degrees = 10; radians = degrees*PI/180; printf("%6i %9.6f \n", degrees, radians); degrees = 20; radians = degrees*PI/180; printf("%6i %9.6f \n", degrees, radians); … degrees = 360; radians = degrees*PI/180; printf("%6i %9.6f \n", degrees, radians); } Sequential Solution degrees = ??? radians = degrees*PI/180; printf("%6i %9.6f \n", degrees, radians); Not a good solution

63 63 Loop Solution degrees = ??? radians = degrees*PI/180; printf("%6i %9.6f \n", degrees, radians); #include #define PI 3.141593 int main(void) { int degrees=0; double radians; printf("Degrees to Radians \n"); while (degrees <= 360) { radians = degrees*PI/180; printf("%6i %9.6f \n", degrees, radians); degrees += 10; } } degrees+=10 means degrees= degrees+10

64 64 Loop (Repetition) Structures while statement do while statement for statement Two new statements used with loops break and continue

65 65 while statement while(expression) statement; while(expression) { statement; … }

66 66 Example #include #define PI 3.141593 int main(void) { int degrees=0; double radians; printf("Degrees to Radians \n"); while (degrees <= 360) { radians = degrees*PI/180; printf("%6i %9.6f \n", degrees, radians); degrees += 10; } return 0; }

67 67 do while do statement; while(expression); do { statement1; statement2;... } while(expression); S note - the expression is tested after the statement(s) are executed, so statements are executed at least once.

68 68 Example #include #define PI 3.141593 int main(void) { int degrees=0; double radians; printf("Degrees to Radians \n"); do { radians = degrees*PI/180; printf("%6i %9.6f \n",degrees,radians); degrees += 10; } while (degrees <= 360); return 0; }

69 69 for statement for(initialization ; test ; increment or decrement ) statement; for(initialization ; test ; increment or decrement ) { statement; … }

70 70 Example #include #define PI 3.141593 int main(void) { int degrees; double radians; printf("Degrees to Radians \n"); for (degrees=0; degrees<=360; degrees+=10) { radians = degrees*PI/180; printf("%6i %9.6f \n", degrees, radians); } return 0; }

71 71 for statement initialize test Increment or decrement true statement(s)

72 72 Examples int sum =0, i; for( i=1 ; i < 7;i=i+2 ){ sum = sum+i; } int fact=1, n; for( n=5 ; n>1 ; n--){ fact = fact * n; } ? 0 5 1 i sum n fact 1 1 3 4 5 9 7 n--; means n=n-1; n++; means n=n+1;

73 73 Exercise Determine the number of times that each of the following for loops are executed. for (k=3; k<=10; k++) { statements; } for (k=3; k<=10; ++k) { statements; } for (count=-2; count<=5; count++) { statements; }

74 74 Example What will be the output of the following program, also show how values of variables change in the memory. int sum1, sum2, k; sum1 = 0; sum2 = 0; for( k = 1; k < 5; k++) { if( k % 2 == 0) sum1 =sum1 + k; else sum2 = sum2 + k; } printf(“sum1 is %d\n”, sum1); printf(“sum2 is %d\n”, sum2); 0 2 6 0 1 4 1 2 3 4 5 sum1 sum2 k sum1 is 6 sum2 is 4

75 75 For vs. while loop Convert the following for loop to while loop for( i=5; i<10; i++) { pritntf(“ i = %d \n”, i); } i=5; while(i<10){ pritntf(“ i = %d \n”, i); i++; }

76 76 break statement break; terminates loop execution continues with the first statement following the loop sum = 0; for (k=1; k<=5; k++) { scanf(“%lf”,&x); if (x > 10.0) break; sum +=x; } printf(“Sum = %f \n”,sum); sum = 0; k=1; while (k<=5) { scanf(“%lf”,&x); if (x > 10.0) break; sum +=x; k++; } printf(“Sum = %f \n”,sum);

77 77 continue statement continue; forces next iteration of the loop, skipping any remaining statements in the loop sum = 0; for (k=1; k<=5; k++) { scanf(“%lf”,&x); if (x > 10.0) continue; sum +=x; } printf(“Sum = %f \n”,sum); sum = 0; k=1; while (k<=5) { scanf(“%lf”,&x); if (x > 10.0) continue; sum +=x; k++; } printf(“Sum = %f \n”,sum); sum = 0; k=1; while (k<=5) { scanf(“%lf”,&x); if (x > 10.0){ k++; continue; } sum +=x; k++; } printf(“Sum = %f \n”,sum);

78 78 Example: what will be the output int main() { int a, b, c; a=5; while(a > 2) { for (b = a ; b < 2 * a ; b++ ) { c = a + b; if (c < 8) continue; if (c > 11) break; printf( “a = %d b = %d c = %d \n”, a, b, c); } /* end of for-loop */ a--; } /* end of while loop */ } a = 5 b = 5 c = 10 a = 5 b = 6 c = 11 a = 4 b = 4 c = 8 a = 4 b = 5 c = 9 a = 4 b = 6 c = 10 a = 4 b = 7 c = 11 a = 3 b = 5 c = 8

79 79 Example: A man walks Suppose a man (say, A) stands at (0, 0) and waits for user to give him the direction and distance to go. User may enter N E W S for north, east, west, south, and any value for distance. When user enters 0 as direction, stop and print out the location where the man stopped N E S W

80 80 float x=0, y=0; char direction; float distance; while (1) { printf("Please input the direction as N,S,E,W (0 to exit): "); scanf("%c", &direction); fflush(stdin); if (direction=='0'){ /*stop input, get out of the loop */ break; } if (direction!='N' && direction!='S' && direction!='E' && direction!='W') { printf("Invalid direction, re-enter \n"); continue; } printf("Please input the mile in %c direction: ", direction); scanf ("%f", &distance); fflush(stdin); if (direction == 'N'){/*in north, compute the y*/ y = y + distance; } else if (direction == 'E'){/*in east, compute the x*/ x = x + distance; } else if (direction == 'W'){/*in west, compute the x*/ x= x - distance; } else if (direction == 'S'){/*in south, compute the y*/ y = y- distance; } printf("\nCurrent position of A: (%4.2f, %4.2f)\n", x, y); /* output A's location */

81 81 Lecture++; NameAddrContent Lecture13

82 82 More loop examples

83 83 Exercise What is the output of the following program? for (i=1; i<=5; i++) { for (j=1; j<=4; j++){ printf(“*”); } printf(“\n”); } Output ****

84 84 Exercise What is the output of the following program? for (i=1; i<=5; i++) { for (j=1; j<=i; j++){ printf(“*”); } printf(“\n”); } Output * ** *** **** *****

85 What/how do you need to change in th following program? for (i=1; i<=5; i++) { for (j=1; j<=i; j++){ printf(“*”); } printf(“\n”); } 85 Example: nested loops to generate the following output i=1 * i=2 + + i=3 * * * i=4 + + + + i=5 * * * * * int i, j; for(i=1; i <= 5; i++){ printf("i=%d ", i); for(j=1; j <= i; j++) { if (i % 2 == 0) printf("+ "); else printf("* "); } printf("\n"); }

86 86 Exercise: Modify the following program to produce the output. for (i=A; i<=B; i++) { for (j=C; j<=D; j++) { printf(“*”); } printf(“\n”); } Output ***** **** *** ** *

87 87 Exercise Write a program using loop statements to produce the following output. Output * ** *** **** *****

88 88 Example Write a program that prints in two columns n even numbers starting from 2, and a running sum of those values. For example suppose user enters 5 for n, then the program should generate the following table: Enter n (the number of even numbers): 5 Value Sum 2 2 4 6 6 12 8 20 10 30

89 89 #include int main(void) { /* Declare variables. */ int n; int sum, i; printf("Enter n "); scanf("%d",&n); printf("Value \t Sum\n"); sum = 0; for(i=1; i <=n; i++){ sum = sum + 2*i; printf("%d \t %d\n", 2*i, sum); } return 0; }

90 90 Compute x y when y is integer Suppose we don’t have pow(x,y) and y is integer, write a loop to compute x y printf(“Enter x, y :”); scanf(“%d %d”, &x, &y); res=1; for(i=1; i<=y; i++){ res = res * x; }

91 91 Exercise: sum Write a program to compute the following Enter n total=0; for(i=1; i<=n; i++) total = total + i ; print total Enter n total=0; for(i=1; i<=n; i++) total = total + 2 * i ; print total

92 92 Exercise: sum Write a program to compute the following Enter x and m total=0; for(i=0; i<=m; i++) total = total + pow(x, i); print total Enter x and m total=0; sofarx=1; for(i=0; i<=m; i++) { total = total +sofarx; sofarx = sofarx * x; } print total

93 93 Exercise: ln 2 Write a program to compute the following Enter n ln2=0; for(i=1; i<=n; i++) if ( i % 2 == 0) ln2 = ln2 - 1.0 / i; else ln2 = ln2 + 1.0 / i; print total

94 94 Exercise: e x Write C program that reads the value of x and n from the keyboard and then approximately computes the value of e x using the following formula: Then compare your approximate result to the one returned by exp(x) in C library, and print out whether your approximation is higher or lower.

95 95 int i, n; double x, ex; double powx, fact; printf("Enter the value of x and n : "); scanf("%lf %d",&x, &n); /* Write a loop to compute e^x using the above formula */ ex=1.0; fact=1.0; powx=1.0; for(i=1; i<=n; i++){ powx = powx * x; fact = fact * i; ex = ex + powx / fact; } printf("Approx value of e^x is %lf when n=%d\n",ex, n); /* Check if ex is higher/lower than exp(x) in math lib.*/ if(ex < exp(x)) printf("ex est is lower than exp(x)=%lf\n",exp(x)); else if (ex > exp(x)) printf("ex est is higher than exp(x)=%lf\n",exp(x)); else printf("ex est is the same as exp(x)\n");

96 96 Exercise: sin x Compute sin x using printf(“Enter x n :”); scanf(“%lf %d”, &x, &n); total=0; powx=x; factx=1; for(i=0; i <= n; i++){ k= 2*n+1; if (i%2==0) total= total - powx/factx; else total= total + powx/factx; powx= powx * x * x; factx = factx * k * (k-1); } printf( “sin(%lf) is %lf\n”,x, total);

97 97 For vs. while loop : Convert the following for loop to while loop for( i=5; i<10; i++) { printf(“AAA %d \n”, i); if (i % 2==0) continue; pritntf(“BBB %d \n”, i); } i=5; while(i<10) { printf(“AAA %d \n”, i); if (i % 2==0) { i++; continue; } pritntf(“BBB %d \n”, i); i++; }

98 98 Skip Study Section 3.5 from the textbook

99 99 Lecture++; NameAddrContent Lecture14

100 100 3.6 Data Files So far, we used scanf and printf to enter data by hand and print data on the screen What if we have 1000 data points to enter? Can we still enter them by hand? What if the output has several lines and we want to store the output results or use them with other programs?

101 101 Read Access to Data Files

102 102 Read Access to Data Files #include File pointer must be defined in C program FILE *sf ; File pointer must be associated with a specific file using the fopen function If the program and data file are in the same directory sf = fopen(“sensor1.dat”, “r”); Else give the full path sf = fopen(“C:\turgay\H\Teaching\15b-FALL07-cs2073\prog\sensor1.dat”, “r”);

103 103 Input file - use fscanf instead of scanf #include FILE *sf; double t, motion; sf = fopen(“sensor1.dat”, “r”); while( ???? ){ fscanf( sf, “%lf %lf”, &t, &motion); } Read from Data Files t motion sf 2 4.4 3 3.5 4 6.3

104 104 Create New Data Files Write Access to Data Files #include File pointer must be defined in C program FILE *bf ; File pointer must be associated with a specific file using the fopen function If the program and data file are in the same directory bf = fopen(“balloon.dat”, “w”); Else give the full path bf = fopen(“C:\turgay\H\Teaching\15b-FALL07-cs2073\prog\balloon.dat”, “w”);

105 105 Output file - use fprintf instead of printf #include FILE *bf; double time=6.5, height=5.3; bf = fopen(“balloon.dat”, “w”); fprintf( bf, “t: %f h: %f\n”, time, height); Write to Data Files time height bf 6.5 5.3 7.1 8.3 3.7 t: 6.500000 h: 5.300000 t: 7.100000 h: 8.300000 t: 8.300000 h: 3.700000

106 106 At the end, Use fclose fclose(sf); fclose(bf);

107 107 Example Read 6 values from a file named my_data.txt and write their average into another file named avg-of-6.txt 6 5 4 2 3 4 5 my_data.txt program 4 avg-of-6.txt

108 108 Example: average grade Suppose we keep the id and three HW grades of 36 students in a file named grades.txt Write a program to compute average grade for each student and write each students avg into another file named avg-hw.txt 1 5 10 15 2 10 20 30 … 36 4 6 20 grades.txt program 1 10 2 20 … 36 10 avg-hw.txt

109 109 Lecture++; NameAddrContent Lecture15

110 110 Reading Data Files When to stop Counter controlled loop First line in file contains count Use for loop Trailer signal or Sentinel signal Data ends when a special data value is seen -999 Use while loop End of file controlled loop When file is created EOF is inserted Use while loop feof(fileptr) > 0 when EOF reached fscanf cannot read as many values as you wanted

111 111 Check what fopen, fscanf, fprintf return FILE *fp; fp=fopen(“data.txt”, “r”); if (fp==NULL){ printf(“Program cannot open the file\n”); return -1; } N=fscanf(fp, “%d %d %d”, &v1, &v2, &v3); /* N is the number of values read successfully */ while(fscanf(fp, “%d %d %d”, &v1, &v2, &v3) == 3) { /* process v1 v2 v3 */ } if (fp=fopen(“data.txt”, “r”)) == NULL){

112 112 Counter controlled loop Usually first line in file contains the count #include int main() { FILE *scorefile; int score, count, i, sum=0; if((scorefile = fopen("scores2.txt","r")) == NULL) ){ printf(“Program cannot open the file\n”); exit(-1); } fscanf(scorefile,"%d", &count); for (i=1; i<=count; i++) { fscanf(scorefile,"%d", &score); sum = sum + score; } printf(“Average score %lf \n",(double)sum/count); fclose(scorefile); return(0); } 6 56 78 93 24 85 63 scores2.txt

113 113 Trailer signal or Sentinel signal #include int main() { FILE *scorefile; int score, count=0, i, sum=0; if((scorefile = fopen("scores3.txt","r")) == NULL) ){ printf(“Program cannot open the file\n”); exit(-1); } fscanf(scorefile,"%d", &score); while(score >= 0) { count++; sum = sum + score; fscanf(scorefile,"%d", &score); } printf(“Average score %lf \n",(double)sum/count); fclose(scorefile); return(0); } 56 78 93 24 85 63 -999 scores3.txt

114 114 End of file controlled loop #include int main() { FILE *scorefile; int score, count=0, i, sum=0; if((scorefile = fopen("scores4.txt","r")) == NULL) ){ printf(“Program cannot open the file\n”); exit(-1); } while (fscanf(scorefile,"%d",&score) == 1) { count++; sum = sum + score; } printf(“Average score %lf \n",(double)sum/count); fclose(scorefile); return(0); } 56 78 93 24 85 63 scores4.txt while (feof(scorefile) <= 0) { fscanf(scorefile,"%d",&score); count++; sum = sum + score; }

115 115 Exercise In previous three programs, we found average. Suppose, we want to also know how many data points are greater than average. Change one of the previous programs to determine the number of data points that are greater than average.

116 116 Exercise Given a file of integers. Write a program that finds the minimum number in another file. Algorithm to find minimum in a file: open file set minimum to a large value while (there are items to read) read next number x from file if (x < min) min = x display the minimum close file File 56 78 93 24 85 63 Solution available on the next page

117 117 #include int main() { FILE *scorefile; int score; int min; scorefile = fopen("scores.txt","r"); if (scorefile == NULL) printf("Error opening input file\n"); else { min = 110; while (feof(scorefile) <= 0) { fscanf(scorefile,"%d",&score); if (score < min) min = score; } printf("Min = %d\n",min); fclose(scorefile); system("pause"); return(0); }

118 118 Exercise Given a file of integers. Write a program that searches for whether a number appears in the file or not. // algorithm to check for y in a file open file set found to false while (there are items to read and found is false) read next number x from file if (x equals y) set found to true Display found message to user Display not found message to user close file File 56 78 93 24 85 63 Solution available on the next page

119 119 #include int main() { FILE *scorefile; int score, num, found; printf("Please Enter a number\n"); scanf("%d", &num); scorefile = fopen("scores.txt","r"); if (scorefile == NULL) printf("Error opening input file\n"); else{ found = 0; while ((feof(scorefile) <= 0) && (found == 0)) { fscanf(scorefile,"%d",&score); if (score == num) found = 1; } if (found == 0) printf("%d does not appear in the file\n",num); else printf("%d appears in the file\n",num); } fclose(scorefile); system("pause"); return(0); }

120 120 Exercise Change the previous program to count how many times the given number appears in the file? Instead of fount =1; put fount++;

121 121 Read/Write Example Suppose we have a data file that contains worker ID, the number of days that a worker worked, and the number of hours the worker worked each day. We would like to find out how much to pay for each worker. To compute this, find the total number of hours for each worker and multiply it by 7 dollar/hour. For instance, your program should process the following input.txt and generate the corresponding output.txt as follows: Id numofD hour1 hour2 hour3 Id total-hourpayment 1 2 3 8 2 3 5 7 6 3 1 2 4 2 5 1 5 3 1 3 2 input.txt 1 1177 2 18126 3214 4642 5642 output.txt progra m

122 122 #include int main(void) { FILE *infp, *outfp; int ID, numofD, hour, i, total_hour; if ((infp = fopen("input.txt", "r"))==NULL){ printf("Input file cannot be opened\n"); return -1; } if ((outfp = fopen("output.txt", "w"))==NULL){ printf("Output file cannot be opened\n"); return -1; } while(fscanf(infp, "%d %d",&ID, &numofD)==2) { total_hour=0; for(i=1; i <= numofD; i++){ fscanf(infp,”%d”,&hour); total_hour +=hour; } fprintf(outfp, "%3d %3d %4d\n", ID, total_hour, total_hour*7); } fclose(infp); fclose(outfp); return 0; }

123 123 Read/write Example Suppose we have a data file that contains student ID and his/her homework grades for hw1, hw2, hw3, and hw4. We would like to find out min, max and average grade for each student and write this information into another file. For instance, your program should process the following input.txt and generate the corresponding output.txt as follows: 1 20 30 28 18 2 35 50 27 36 3 17 20 34 44 4 20 50 14 12 5 33 15 30 20 input.txt 1 18 30 24.00 2 27 50 37.00 3 17 44 28.75 4 12 50 24.00 5 15 33 24.50 output.txt prog Id hw1hw2hw3 hw4 Id min max avg

124 124 #include int main(void) { FILE *infp, *outfp; int i,ID, hw, max, min; double sum; if ((infp = fopen("input.txt", "r"))==NULL){ printf("Input file cannot be opened\n"); return -1; } if ((outfp = fopen("output.txt", "w"))==NULL){ printf("Output file cannot be opened\n"); return -1; } while(fscanf(infp, "%d %d",&ID, &hw)==2) { sum=max=min=hw; for(i=1; i <= 3; i++){ fscanf(infp,”%d”,&hw); sum = sum + hw; if (hw > max) max = hw; if (hw < min) min = hw; } fprintf(outfp, "%3d \t %3d \t %4d \t %3.2lf\n", ID, min, max, sum/4); } fclose(infp); fclose(outfp); return 0; }

125 Eliminate out of order records Suppose we have a data file that has 5 columns in each row, namely student ID, hw1, hw2, hw3, hw4. We are told that most rows in this file are sorted in an increasing order based on the ID field. Write a program to determine the students whose IDs are not in order and print the IDs and homework grades of such students into another file. 125 2 4 3 3 2 3 3 1 1 1 5 3 5 8 3 1 4 4 1 5 7 3 5 3 3 8 1 2 4 7 4 5 4 6 3 10 2 3 2 9 12 4 8 3 4 1 4 4 1 5 4 5 4 6 3 program

126 126 More example Study 3.7 and 3.8 from the textbook


Download ppt "1 Control Structures and Data Files Turgay Korkmaz Office: SB 4.01.13 Phone: (210) 458-7346 Fax: (210) 458-4437 web:"

Similar presentations


Ads by Google