3 Structured Program Development in C: Solutions
SOLUTIONS 3.11
Identify and correct the errors in each of the following [ Note: There may be more than one error in each piece of code]: a) if ( age >= 65 ); printf( "Age is greater than or equal to 65\n" ); else printf( "Age is less than 65\n" ); ANS: if ( age >= 65 ) /* ; removed */ printf( “Age is greater than or equal to 65\n” ); else printf( “Age is less than 65\n” ); b) int x = 1, total; while ( x <= 10 ) { total += x; ++x; } ANS: int x = 1, total = 0; while ( x <= 10 ) { total += x; ++x; } c) While ( x <= 100 ) total += x; ++x; ANS: while ( x <= 100 ) { total += x; ++x; } d) while ( y > 0 ) { printf( "%d\n" "%d\n", , y ); ++y; } © Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
20
Structured Program Development in C: Solutions
Chapter 3
ANS: while ( y > 0 ) { printf( “%d\n” “%d\n”, , y ); --y; } 3.12
3.13
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Fill in the blanks in each of the following: a) The solution solution to any problem problem involves involves performing performing a series series of actions actions in a specific specific . ANS: order. b) A synonym synonym for proce procedure dure is . ANS: algorithm c) A variable variable that accumula accumulates tes the sum of several several numbers numbers is a . ANS: total. d) The process of setting certain variables to specific values at the beginning of a program is called . ANS: initialization. e) A special special value value used to indicate indicate “end of data entry” is called called a , a , a or a value. ANS: sentinel value, dummy value, signal value, flag value. f) A is a graphical graphical representa representation tion of an algorithm. algorithm. ANS: flowchart. g) In a flowchart, flowchart, the order in which the steps should be performed performed is indicated indicated by symbols. symbols. ANS: arrow (flowline). h) The terminatio termination n symbol indicates indicates the and of every algorithm. algorithm. ANS: beginning, end. i) Rectangle symbols correspond to calculations that are normally performed by statements and input/output oper operat atio ions ns that that are are norm normal ally ly perf perfor orme med d by call callss to the the and and stan standa dard rd libr libraary func functi tion ons. s. ANS: assignment, printf, scanf. j) The item written written inside a decision decision symbol is called a . ANS: condition. What does the following program print? #include int main() { int x = 1, total = 0, y; while ( x <= 10 ) { y = x * x; printf( "%d\n" "%d\n", , y ); total += y; ++x; } printf("Total printf("Total is %d\n", %d\n", total); return 0; }
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Structured Program Development in C: Solutions 21
Chapter 3
1 4 9 16 25 36 49 64 81 100 Total is 385
3.14
Write a single pseudocode statement that indicates each of the following: a) Disp Displa lay y the the mess messag agee "Enter two numbers" . ANS: print “enter “enter two numbers” b) Assign Assign the the sum sum of varia variable bless x, y, and z to variable p. ANS: p = x + y + y + z c) The followin following g conditio condition n is to be tested tested in in an if…else selection statement: statement: The current value of variable m is greater than twice the current value of variable v. ANS: if m is greater than twice v do this ... else do this ... d) Obtain Obtain valu values es for for variabl variables es s, r, and t from the keyboard. ANS: input s , input r , input t
3.15
Formulate a pseudocode algorithm for each of the following: a) Obtain two numbers from the keyboard, compute the sum of the numbers and display the result. ANS: Input the first number number Input the second number number Add the two numbers numbers Output the sum b) Obtain two numbers numbers from the keyboard, keyboard, and determine and display which which (if either) either) is the larger of the the two numbers. ANS: Input the first number number from the the keyboard keyboard Input the second number number from from the keyboard keyboard If the first number is greater than the second second number number print it Else if the second number number is greater greater than than the first number print it Else print a message message stating stating that the the numbers numbers are equal equal c) Obtain a series of positive numbers from the keyboard, and and determine and display the sum of the numbers. Assume Assume that the user types the sentinel value -1 to indicate “end of data entry.” ANS: Input a value value from the keyboard keyboard While the input value is not equal to -1 add the number to the running total input the next number Print the sum
3.16
State which of the following are true and which are false. If a statement is false, explain why. a) Experience has shown that the most difficult part of solving a problem on a computer is producing producing a working C program. © Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
22
Structured Program Development in C: Solutions
Chapter 3
ANS: False. The algorithm is the hardest of solving a problem. b) A sentinel value must be a value that cannot be confused with a legitimate legitimate data value. value. ANS: True. c) Flowlines Flowlines indicat indicatee the action actionss to be performe performed. d. ANS: False. Flowlines indicate the order in which steps are performed. d) Conditions written inside decision decision symbols always contain contain arithmetic arithmetic operators operators (i.e., +, -, *, /, and %). ANS: False. They normally contain conditional operators. e) In top-down, stepwise stepwise refinement, refinement, each refinement is is a complete representation representation of the algorithm. algorithm. ANS: True. For Exercises 3.17 to 3.21, perform each of these steps:
1. Read the problem problem state statement. ment. 2. Formulate the algorithm using pseudocode and top-down, stepwise refinement. 3. Writ Writee a C prog progra ram. m. 4. Test, Test, debug, debug, and execut executee the C program program.. 3.17
Drivers are concerned with the mileage obtained by their automobiles. One driver has kept track of several tankfuls of gasoline by recording miles driven and gallons used for each tankful. Develop a program that will input the miles driven and gallons used for each tankful. The program should calculate and display the miles per gallon obtained for each tankful. After processing all input information, the program should calculate and print the combined miles per gallon obtained for all tankfuls. Here is a sample input/output dialog:.
Enter the gallons used (-1 to end): 12.8 Enter the miles driven: 287 The miles / gallon for this tank was 22.421875 Enter the gallons used (-1 to end): 10.3 Enter the miles driven: 200 The miles / gallon for this tank was 19.417475 Enter the gallons used (-1 to end): 5 Enter the miles driven: 120 The miles / gallon for this tank was 24.000000 Enter the gallons used (-1 to end): -1 The overall average miles/gallon miles/gallon was 21.601423
ANS: 2)
Top: Determine the average miles/gall Determine miles/gallon on for each tank tank of gas, and and the overall miles/ga miles/gallon llon for for an arbitrary number of tanks of gas First refinement: Initialize variables variables Input the gallons used used and the the miles driven, driven, and calculat calculatee and print print the miles/gallon miles/gallon for each tank tank of gas. gas. Keep track of the total miles and the total gallons. Calculate and print the overall average miles/gallon. Second refinement: Initialize totalGal totalGallons lons to zero. zero. Initialize totalMil totalMiles es to zero. Input the gallons used for the the first tank. tank. © Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Structured Program Development in C: Solutions 23
Chapter 3
While the sentinel value (-1) has not been entered for the gallons Add gallons gallons to the running total in totalGal totalGallons lons Input the miles driven driven for the current tank tank Add miles to the running running total total in totalMiles totalMiles Calculate and print the miles/gallon Input the gallons used used for the next tank tank Set totalAverage to totalMiles divided by totalGallons. print the the average miles/gall miles/gallon on
3) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
/* Exercise 3.17 Solution */ #include int main() { double gallons; double miles; double totalGallons totalGallons = 0.0 0.0; ; double totalMiles = 0.0 0.0; ; double totalAverage;
/* /* /* /* /*
gallons used for current tank*/ miles driven for current tank*/ total gallons used */ total miles driven */ average miles/gallon */
/* get gallons used for first tank */ printf( "Enter the gallons used ( -1 to end): " ); scanf( "%lf" "%lf", , &gallons ); /* loop until sentinel value read from user */ while ( gallons != -1.0 ) { totalGallons += gallons; /* add current tank gallons to total */ printf( "Enter the miles driven: " ); /* get miles driven */ scanf( "%lf" "%lf", , &miles ); totalMiles += miles; /* add current tank miles to total */ /* display miles per gallon for current tank */ printf( "The Miles / Gallon for this tank was %f\n\n", %f\n\n", miles / gallons ); /* get next tank's gallons */ printf( "Enter the gallons used ( -1 to end ): " ); scanf( "%lf" "%lf", , &gallons ); } /* end while */ /* calculate average miles per gallon over all tanks */ totalAverage = totalMiles / totalGallons; printf( "\nThe overall average Miles/Gallon was %f\n", %f\n", totalAverage ); return 0; /* indicate successful termination */ } /* end main */
3.18
Develop a C program that will determine if a department store customer has exceeded the credit limit on a charge account. For each customer, the following facts are available: 1. Acco Account unt numbe numberr 2. Balance Balance at at the beginning beginning of the month month 3. Total Total of all items items charged charged by this customer customer this this month 4. Total of all credits applied to this customer's customer's account this month 5. Allowe Allowed d credit credit limi limitt © Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
24
Structured Program Development in C: Solutions
Chapter 3
The program should input each of these facts, calculate the new balance ( = beginning balance + charges – credits ), and determine if the new balance exceeds the customer's credit limit. For those customers whose credit limit is exceeded, the program should display the customer's account number, credit limit, new balance and the message “Credit limit exceeded.” exceeded.” Here is a sample input/ output dialog:
Enter account number ( -1 to end): 100 Enter beginning balance: 5394.78 Enter total charges: 1000.00 Enter total credits: 500.00 Enter credit limit: 5500.00 Account: 100 Credit limit: 5500.00 Balance: 5894.78 Credit Limit Exceeded. Enter Enter Enter Enter Enter
account number ( -1 to end ): 200 beginning balance: 1000.00 total charges: 123.45 total credits: 321.00 credit limit: 1500.00
Enter Enter Enter Enter Enter
account number ( -1 to end ): 300 beginning balance: 500.00 total charges: 274.73 total credits: 100.00 credit limit: 800.00
Enter account number ( -1 to end ): -1
ANS: 2)
Top: Determine if Determine if each each of an an arbitrary arbitrary number of department department store custome customers rs has has exceeded exceeded the credit limit on a charge charge account. First refinement: Input the account number, beginning balance, total charges, charges, total total credits, and and credit credit limit for a customer customer,, calcu late the customer’s new balance and determine if the balance exceeds the credit limit. Then process the next customer. Second refinement: Input the first customer’s customer’s account account number. number. While the sentinel value (-1) has not been entered for the account number Input the customer’s beginning balance Input the customer’s total total charges charges Input the customer’s total total credits credits Input the customer’s credit credit limit limit Calculate the customer’s new balance If the balance balance exceeds exceeds the credit credit limit Print the account number Print the credit limit Print the balance Print “Credit Limit Exceeded” Input the next customer’s customer’s account account number. number.
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Structured Program Development in C: Solutions 25
Chapter 3
3) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
/* Exercise 3.18 Solution */ #include int main() { int accountNumber; double balance; double charges; double credits; double limit;
/* /* /* /* /*
current current current current current
account's account's account's account's account's
number */ starting balance */ total charges */ total credits */ credit limit */
/* get account number */ printf( "\nEnter account number ( -1 to end): " ); scanf( "%d" "%d", , &accountNumber ); /* loop until sentinel value read from user */ while ( accountNumber != -1 ) { printf( "Enter beginning balance: " ); scanf( "%lf" "%lf", , &balance ); printf( "Enter total charges: " ); scanf( "%lf" "%lf", , &charges ); printf( "Enter total credits: " ); scanf( "%lf" "%lf", , &credits ); printf( "Enter credit limit: " ); scanf( "%lf" "%lf", , &limit ); balance += charges - credits; /* calculate balance */ /* if balance is over limit, display account number with credit limit and balance to two digits of precision */ if ( balance > limit ) { printf( "%s%d\n%s%.2f\n%s%.2f\n%s\n", "Account: ", accountNumber, ", accountNumber, "Credit limit: ", ", limit, "Balance: ", balance, "Credit Limit Exceeded." ); ", } /* end if */ /* prompt for next account */ printf( "\nEnter account number ( -1 to end ): " ); scanf( "%d" "%d", , &accountNumber ); } /* end while */ return 0; /* indicate successful termination */ } /* end main */
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
26
Structured Program Development in C: Solutions
Chapter 3
3.19
One large chemical company pays its salespeople on a commission basis. The salespeople receive $200 per week plus 9% of their gross sales for that week. For example, a salesperson who sells $5000 worth of chemicals in a week receives $200 plus 9% of $5000, or a total of $650. Develop a program that will input each salesperson's gross sales for last week and will calculate and display that salesperson's earnings. Process one salesperson's figures at a time. Here is a sample input/output dialog: Enter sales in dollars ( -1 to end): 5000.00 Salary is: $650.00 Enter sales in dollars ( -1 to end ): 1234.56 Salary is: $311.11 Enter sales in dollars ( -1 to end ): 1088.89 Salary is: $298.00 Enter sales in dollars ( -1 to end ): -1
ANS: 2)
Top: For an arbitrary number of salespeople, determine each salesperson’s earnings for the last week. First refinement: Input the salesperson’s salesperson’s sales for the week, calculate and print the salesperson’s salesperson’s wages for the the week, week, then process the next salesperson. Second refinement: Input the first salesperson’s salesperson’s sales sales in dollars. dollars. While the sentinel value (-1) has not been entered for the sales Calculate the salesperson’s wages for the week Print the salesperson’s wages for the week Input the next salesperson’s salesperson’s sales sales in dollars dollars
3) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/* Exercise 3.19 Solution */ #include int main() { double sales; /* gross weekly sales */ double wage; /* commissioned earnings */ /* get first sales */ printf( "Enter sales in dollars ( -1 to end): " ); scanf( "%lf" "%lf", , &sales ); /* loop until sentinel value read from user */ while ( sales != -1.0 ) { wage = 200.0 + 0.09 * sales; /* calculate wage */ /* display salary */ printf( "Salary is: $%.2f\n\n", $%.2f\n\n", wage ); /* prompt for next sales */ printf( "Enter sales in dollars ( -1 to end ): " ); scanf( "%lf" "%lf", , &sales ); } /* end while */ return 0; /* indicate successful termination */ } /* end main */
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Structured Program Development in C: Solutions 27
Chapter 3
3.20
The simple interest on a loan is calculated by the formula interest = principal * rate * days / 365 365; ;
The preceding formula assumes that rate is the annual interest rate, and therefore includes the division by 365 (days). Develop a program that will input principal , rate and days for several loans, and will calculate and display the simple interest for each loan, using the preceding formula. Here is a sample input/output dialog:
Enter loan principal ( -1 to end): 1000.00 Enter interest rate: .1 Enter term of the loan in days: 365 The interest charge is $100.00 Enter loan principal ( -1 to end ): 1000.00 Enter interest rate: .08375 Enter term of the loan in days: 224 The interest charge is $51.40 Enter loan principal ( -1 to end ): 10000.00 Enter interest rate: .09 Enter term of the loan in days: 1460 The interest charge is $3600.00 Enter loan principal ( -1 to end ): -1
ANS: 2)
Top: For an arbitrary number of loans determine the simple interest for each loan. First refinement: Input the principal of the loan, loan, the interest interest rate, and the term of the loan, calculate calculate and and print the the simple interest for the loan, loan, and process process the next loan. loan. Second refinement: input the first loan principal in dollars. While the sentinel value (-1) has not been entered for the loan principal Input the interest rate rate Input the term of the loan in days days Calculate the simple interest for the loan Print the simple interest for the loan Input the loan principal principal for the the next loan loan
3) 1 2 3 4 5 6 7 8 9 10 11 12 13
/* Exercise 3.20 Solution */ #include int main() { double principal; double rate; double interest; int term;
/* /* /* /*
loan principal */ interest rate */ interest charge */ length of loan in days */
/* get loan principal */ printf( "Enter loan principal ( -1 to end): " ); scanf( "%lf", &principal );
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
28
Structured Program Development in C: Solutions
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
Chapter 3
/* loop until sentinel value is read from user */ while ( principal != -1.0 ) { printf( "Enter interest rate: " ); /* get rate */ scanf( "%lf" "%lf", , &rate ); printf( "Enter term of the loan in days: " ); /* get term */ scanf( "%d" "%d", , &term ); /* calculate interest charge */ interest = principal * rate * term / 365.0 365.0; ; printf( "The interest charge is $%.2f\n\n", interest ); /* get next loan principal */ printf( "Enter loan principal ( -1 to end ): " ); scanf( "%lf" "%lf", , &principal ); } /* end while */ return 0; /* indicate successful termination */ } /* end main */
3.21
Develop a program that will determine the gross pay f or each of several employees. The company pays “straight-time” for the first 40 hours worked by each employee and pays “time-and-a-half” for all hours worked in excess of 40 hours. You are given a list of the employees of the company, the number of hours each employee worked last week and the hourly rate of each employee. Your program should input this information for each employee, and should determine and display the employee's gross pay. Here is a sample input/output dialog:
Enter number of hours worked ( -1 to end Enter hourly rate of the worker ( $00.00 Salary is $390.00
): 39 ): 10.00
Enter number of hours worked ( -1 to end Enter hourly rate of the worker ( $00.00 Salary is $400.00
): 40 ): 10.00
Enter number of hours worked ( -1 to end Enter hourly rate of the worker ( $00.00 Salary is $415.00
): 41 ): 10.00
Enter number of hours worked (
): -1
ANS: 2)
-1 to end
Top: For an arbitrary number of employees, determine the gross pay for each employee. First refinement: Input the number of of hours worked worked for the the employee, employee, enter the employee’s employee’s hourly hourly wage, calculate and print the the employee’s gross pay, and process the next employee. Second refinement: Input the first employee’s employee’s number number of hours hours worked. worked. While the sentinel value (-1) has not been entered for the hours worked Input the employee employee’s ’s hourly wage wage Calculate the employee’s gross pay with overtime for hours over 40 Print the employee’s gross pay Input the number of hours worked worked for the next computer computer © Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Structured Program Development in C: Solutions 29
Chapter 3
3) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
/* Exercise 3.21 Solution */ #include int main( void ) { double hours; /* total hours worked */ double rate; /* hourly pay rate */ double salary; /* gross pay */ /* get first employee's hours worked */ printf( "Enter number of hours worked ( scanf( "%lf" "%lf", , &hours );
-1 to end
): "
);
/* loop until sentinel value read from user */ while ( hours != -1.0 ) { /* get hourly rate */ printf( "Enter hourly rate of the worker ( scanf( "%lf" "%lf", , &rate );
$00.00
): " );
/* if employee worked less than 40 hours */ if ( hours <= 40 ) { salary = hours * rate; } /* end if */ else { /* compute "time-and-a-half" pay */ salary = 40.0 * rate + ( hours - 40.0 ) * rate * 1.5 1.5; ; } /* end else */ /* display gross pay */ printf( "Salary is $%.2lf\n\n", $%.2lf\n\n", salary /* prompt for next employee's data */ printf( "Enter number of hours worked ( scanf( "%lf" "%lf", , &hours ); } /* end while */
);
-1 to end
): " );
return 0; /* indicate successful termination */ } /* end main */
3.22 Write a program that demonstrates the difference between predecrementing and postdecrementing using the decrement operator --. ANS:
1 2 3 4 5 6 7 8 9 10 11
/* Exercise 3.22 Solution */ #include int main() { int c; /* define c to use decrement operator */ c = 5; printf( "%d\n", "%d\n", c ); printf( "%d\n" "%d\n", , --c ); /* /* predecrement */ printf( "%d\n\n" "%d\n\n", , c );
12
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
30
Structured Program Development in C: Solutions
13 14 15 16 17 18 19 20
Chapter 3
c = 5; printf( "%d\n", "%d\n", c ); printf( "%d\n" "%d\n", , c-- ); /* postdecrement */ printf( "%d\n\n" "%d\n\n", , c ); return 0; /* indicate successful termination */ } /* end main */
5 4 4 5 5 4
3.23
Write a program that utilizes looping to print the numbers from 1 to 10 side-by-side on the same line with 3 spaces between each number. ANS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1
/* Exercise 3.23 Solution */ #include int main() { int i = 0; /* initialize i */ /* loop while i is less than 11 */ while ( ++i < 11 ) { printf( "%d ", i ); ", } /* end while */ return 0; /* indicate successful termination */ } /* end main */ 2
3
4
5
6
7
8
9
10
3.24
The process of finding the largest number (i.e., the maximum of a group of numbers) is used frequently in computer applications. For example, a program that determines the winner of a sales contest would input the number of units sold by each salesperson. The salesperson who sells the most units wins the contest. Write a pseudocode program and then a program that inputs a series of 10 numbers, and d etermines and prints the largest of the numbers. [ Hint : Your program should use three variables as follows]:
counter: number: largest:
A counter to count to 10 (i.e., to keep track of how many numbers have been input and to determine when all 10 nu mbers have been processed) The current number input to the program The largest number found so far
ANS: Input the first number number directly into the variable variable largest Increment counter to 2
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Structured Program Development in C: Solutions 31
Chapter 3
While counter is less than or equal to 10 input a new variable into the variable number If number is greater than largest replace largest with number Increment counter Print the value of the largest ( while condition false when counter is 11)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
/* Exercise 3.24 Solution */ #include int main() { int counter; /* counter for 10 repetitions */ int number; /* current number input */ int largest; /* largest number found so far */ /* get first number */ printf( "Enter the first number: " ); scanf( "%d" "%d", , &largest ); counter = 2; /* loop 9 more times */ while ( counter <= 10 ) { printf( "Enter next number: " ); /* get next number */ scanf( "%d" "%d", , &number ); /* if current number input is greater than largest number, update largest */ if ( number > largest ) { largest = number; } /* end if */ counter++; } /* end while */ printf( "Largest is %d\n", %d\n", largest ); /* display largest number */ return 0; /* indicate successful termination */ } /* end main */
Enter the first number: 7 Enter next number: 37 Enter next number: 78 Enter next number: 2 Enter next number: 437 Enter next number: 72 Enter next number: 1 Enter next number: 4 Enter next number: 36 Enter next number: 100 Largest is 437
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
32
Structured Program Development in C: Solutions
3.25
Chapter 3
Write a program that utilizes looping to print the following table of values:
N
10 * N
1 2 3 4 5 6 7 8 9 10
10 20 30 40 50 60 70 80 90 100
100 * N 100 200 300 400 500 600 700 800 900 1000
1000 * N 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000
The tab character, \t, may be used in the printf statement to separate the columns with tabs. ANS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
3.26
/* Exercise 3.25 Solution */ #include int main() { int n = 0; /* counter */ /* display table headers */ printf( "\tN\t\t10 * N\t\t100 * N\t\t1000 * N\n\n" ); /* loop 10 times */ while ( ++n <= 10 ) { /* calculate and display table values */ printf( "\t%-2d\t\t%-5d\t\t%-5d\t\t%-6d\n" , n, 10 * n, 100 * n, 1000 * n ); } /* end while */ return 0; /* indicate successful termination */ } /* end main */
Write a program that utilizes looping to produce the following table of values:
A
A+2
A+4
A+6
3 6 9 12 15
5 8 11 14 17
7 10 13 16 19
9 12 15 18 21
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Structured Program Development in C: Solutions 33
Chapter 3
ANS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/* Exercise 3.26 Solution */ #include int main() { int a = 3; /* counter */ /* display table headers */ printf( "A\tA+2\tA+4\tA+6\n\n" ); /* loop 5 times */ while ( a <= 15 ) { /* calculate and display table values */ printf( "%d\t%d\t%d\t%d\n" "%d\t%d\t%d\t%d\n", , a, a + 2, a + 4, a + 6 ); a += 3; } /* end while */ return 0; /* indicate successful termination */ } /* end main */
3.27
Using an approach similar to Exercise 3.24, find the two largest values of the 10 numbers. [ Note: You may input each number only once.] ANS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
/* Exercise 3.27 Solution */ #include int main() { int int int int
counter; number; largest; secondLargest = 0;
/* /* /* /*
counter for 10 current number largest number second largest
repetitions */ input */ found */ number found */
printf( "Enter the first number: " ); /* get first number */ scanf( "%d" "%d", , &largest ); counter = 2; /* loop 9 more times */ while ( counter <= 10 ) { printf( "Enter next number: " ); /* prompt for next number */ scanf( "%d" "%d", , &number ); /* if current number is greater than largest */ if ( number > largest ) { /* update second largest with previous largest */ secondLargest = largest; /* update largest with current number */ largest = number; } /* end if */ else {
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
34
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
Structured Program Development in C: Solutions
Chapter 3
/* if number is between secondLargest and largest */ if ( number > secondLargest ) { secondLargest secondLargest = number; } /* end if */ } /* end else */ ++counter; } /* end while */ /* display largest two numbers */ printf( "Largest is %d\n", %d\n", largest ); printf( "Second largest is %d\n", %d\n", secondLargest ); return 0; /* indicate successful termination */ } /* end main */
Enter the first number: 100 Enter next number: 102 Enter next number: 83 Enter next number: 3883 Enter next number: 328 Enter next number: 28 Enter next number: 839 Enter next number: 2398 Enter next number: 182 Enter next number: 0 Largest is 3883 Second largest is 2398
3.28 Modify the program in Figure 3.10 to validate its inputs. On any input, if the value entered entered is other than 1 or 2, keep looping until the user enters a correct value. ANS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/* Exercise 3.28 Solution */ #include int main() { int passes = 0; int failures = 0; int student = 1; int result;
/* /* /* /*
number of passes */ number of failures */ student counter */ one exam result */
/* process 10 students using counter-controlled loop */ while ( student <= 10 ) { /* prompt user for input and obtain value from user */ printf( "Enter result ( 1=pass, 2=fail ): " ); scanf( "%d" "%d", , &result ); /* loop until valid input */ while ( result != 1 && result != 2 ) { printf( "Invalid result\nEnter result ( 1=pass, 2=fail ): " ); scanf( "%d" "%d", , &result ); } /* end inner while */
23
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Structured Program Development in C: Solutions 35
Chapter 3
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
/* if result 1, increment passes */ if ( result == 1 ) { ++passes; } /* end if */ else { /* if result is not 1, increment failures */ ++failures; } /* end else */ ++student; } /* end while */ printf( "Passed %d\nFailed %d\n", %d\n", passes, failures ); /* if more than eight students passed, print "raise tuition" */ if ( passes >= 8 ) { printf( "Raise tuition\n" ); } /* end if */ return 0; /* indicate successful termination */ } /* end main */
Enter result ( Enter result ( Enter result ( Invalid result Enter result ( Invalid result Enter result ( Enter result ( Enter result ( Enter result ( Enter result ( Enter result ( Enter result ( Enter result ( Passed 6 Failed 4
3.29
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
1=pass, 2=fail ): 1 1=pass, 2=fail ): 2 1=pass, 2=fail ): 3 1=pass, 2=fail ): 4 1=pass, 1=pass, 1=pass, 1=pass, 1=pass, 1=pass, 1=pass, 1=pass,
2=fail 2=fail 2=fail 2=fail 2=fail 2=fail 2=fail 2=fail
): ): ): ): ): ): ): ):
2 2 2 1 1 1 1 1
What does the following program print? #include /* function main begins program execution */ int main() { int count = 1; /* initialize count */ while ( count <= 10 ) { /* loop 10 times */ /* output line of text */ printf( "%s\n" "%s\n", , count % 2 ? "****" : "++++++++" ); count++; /* increment count */ } /* end while */ return 0; /* indicate program ended successfully */ } /* end function main */
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
36
Structured Program Development in C: Solutions
ANS:
**** ++++++++ **** ++++++++ **** ++++++++ **** ++++++++ **** ++++++++
3.30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
What does the following program print? #include /* function main begins program execution */ int main() { int row = 10 10; ; /* initialize row */ int column; /* define column */ while ( row >= 1 ) { /* loop until row < 1 */ column = 1; /* set column to 1 as iteration begins */ while ( column <= 10 ) { /* loop 10 times */ printf( "%s" "%s", , row % 2 ? "<" "<": : ">" ); /* output */ column++; /* increment column */ } /* end inner while */ row--; /* decrement row */ printf( "\n" ); /* begin new output line */ } /* end outer while */ return 0; /* indicate program ended successfully */ } /* end function main */
ANS:
>>>>>>>>>> <<<<<<<<<< >>>>>>>>>> <<<<<<<<<< >>>>>>>>>> <<<<<<<<<< >>>>>>>>>> <<<<<<<<<< >>>>>>>>>> <<<<<<<<<<
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Chapter 3
Structured Program Development in C: Solutions 37
Chapter 3
3.31
(Dangling Else Problem) Determine the output for each of the following when x is 9 and y is 11 and when x is 11 and y is 9. Note that the compiler ignores the indentation in a C program. Also, the compiler always associates an else with the previous if unless told to do otherwise by the placement of braces {}. Because, on first glance, the programmer may not be sure which if an else matches, this is referred to as the “dangling else” pr oblem. We have eliminated the indentation from the followin g code to make the problem more challenging. [ Hint: Hint: Apply indentation conventions you have learned.] a) if ( x < 10 ) if ( y > 10 ) printf( "*****\n" ); else printf( "#####\n" ); printf( "$$$$$\n" ); ANS: x = 9, y = 11
***** $$$$$
x = 11 11, , y = 9
$$$$$
b) if ( x < 10 ) { if ( y > 10 ) printf( "*****\n" ); } else { printf( "#####\n" ); printf( "$$$$$\n" ); } ANS: x = 9, y = 11
*****
x = 11 11, , y = 9
##### $$$$$
3.32
produ ce the output shown. Use proper indentation techniques. (Another Dangling Else Problem) Modify the following code to produce You might not make any changes other than inserting braces. The compiler ignores the indentation in a program. We have eliminated the indentation from the following code to make the problem more challenging. [ Note: It is possible that no modification is necessary.] if ( y == 8 ) if ( x == 5 ) printf( "@@@@@\n" else printf( "#####\n" printf( "$$$$$\n" printf( "&&&&&\n"
); ); ); );
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
38
Structured Program Development in C: Solutions
Chapter 3
a) Assu ssuming x = 5 and y = 8, the following output is produced. @@@@@ $$$$$ &&&&&
ANS: if ( y == 8 ) { if ( x == 5 ) printf( “@@@@@\n” ); else printf( “#####\n” ); printf( “$$$$$\n” ); printf( “&&&&&\n” ); }
b) Ass Assumi uming x = 5 and y = 8, the following output is produced. @@@@@
ANS: if ( y == 8 ) if ( x == 5 ) printf( “@@@@@\n” else { printf( “#####\n” printf( “$$$$$\n” printf( “&&&&&\n” }
); ); ); );
c) Assu ssuming x = 5 and y = 8, the following output is produced. @@@@@ &&&&&
ANS: if ( y == 8 ) if ( x == 5 ) printf( “@@@@@\n” ); else { printf( “#####\n” ); printf( “$$$$$\n” ); } printf( “&&&&&\n” );
d) Ass Assumi uming x = 5 and y = 7, the following output is produced. [ Note: The last three printf statements are all part of a compound statement. ##### $$$$$ &&&&&
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Structured Program Development in C: Solutions 39
Chapter 3
ANS: if ( y == 8 ) { if ( x == 5 ) printf( “@@@@@\n” ); } else { printf( “#####\n” ); printf( “$$$$$\n” ); printf( “&&&&&\n” ); } 3.33
Write a program that reads in the side of a square and then prints that square out of asterisks. Your program should work for squares of all side sizes between 1 and 20. For example, if your program reads a size of 4, it should print **** **** **** ****
ANS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/* Exercise 3.33 Solution */ #include #include int main() { int side; /* side counter */ int temp; /* temporary integer */ int asterisk; /* asterisk counter */ printf( "Enter the square side: " ); /* get size of square */ scanf( "%d" "%d", , &side ); temp = side; /* loop through rows of square */ while ( side-- > 0 ) { asterisk = temp; /* loop through columns of square */ while ( asterisk-- > 0 ) { printf( "*" ); } /* end inner while */ putchar( '\n' ); } /* end outer while */ return 0; /* indicate successful termination */ } /* end main */
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
40
Structured Program Development in C: Solutions
3.34
Chapter 3
Modify the program you wrote in Exercise 3.33 so that it prints a hollow square. For example, if your prog ram reads a size of 5, it should print ***** * * * * * * *****
ANS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
/* Exercise 3.34 Solution */ #include #include int main() { int side; /* side counter */ int rowPosition; /* row counter */ int size; /* length of side */ printf( "Enter the square side: " ); /* prompt for side length */ scanf( "%d" "%d", , &side ); size = side; /* set size counter to length of side */ /* loop side number of times */ while ( side > 0 ) { rowPosition = size; /* set row counter to length of size */ /* loop rowPosition number of times */ while ( rowPosition > 0 ) { /* if side or row counter is 1 or size print an '*' */ if ( size == side ) { printf( "*" ); } /* end if */ else if ( side == 1 ) { printf( "*" ); } /* end else if */ else if ( rowPosition == 1 ) { printf( "*" ); } /* end else if */ else if ( rowPosition == size ) { printf( "*" ); } /* end else if */ else { /* otherwise, print a space */ printf( " " ); } /* end else */ --rowPosition; /* decrement row counter */ } /* end inner while */ printf( "\n" ); /* new line for next row */ --side; /* decrement side counter */ } /* end outer while */ return 0; /* indicate successful termination */ } /* end main */
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Structured Program Development in C: Solutions 41
Chapter 3
3.35
A palindrome is a number o r a text phrase that reads the same backwards as forwards. For example, each of the following five-digit integers are palindromes: 12321, 55555, 45554 and 11611. Write a program that reads in a five-digit integer and determines whether or not it is a palindrome. [ Hint : Use the division and r emainder operators to separate the number into its individual digits.] ANS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
/* Exercise 3.35 Solution */ #include #include int main() { int number; int temp1; int temp2; int firstDigit; int secondDigit; int fourthDigit; int fifthDigit;
/* /* /* /* /* /* /*
input number */ first temporary integer */ second temporary integer */ first digit of input */ second digit of input */ fourth digit of input */ fifth digit of input */
printf( "Enter a five-digit number: " ); /* get number */ scanf( "%d" "%d", , &number ); temp1 = number; /* determine first digit by integer division by 10000 */ firstDigit = temp1 / 10000 10000; ; temp2 = temp1 % 10000 10000; ; /* determine second digit by integer division by 1000 */ secondDigit secondDigit = temp2 / 1000 1000; ; temp1 = temp2 % 1000 1000; ; temp2 = temp1 % 100 100; ; /* determine fourth digit by integer division by 10 */ fourthDigit fourthDigit = temp2 / 10 10; ; temp1 = temp2 % 10 10; ; fifthDigit = temp1; /* if first and fifth digits are equal */ if ( firstDigit == fifthDigit ) { /* if second and fourth digits are equal */ if ( secondDigit == fourthDigit ) { /* number is a palindrome */ printf( "%d is a palindrome\n" palindrome\n", , number ); } /* end if */ else { /* number is not a palindrome */ printf( "%d is not a palindrome\n", palindrome\n", number ); } /* end else */ } /* end if */ else { /* number is not a palindrome */ printf( "%d is not a palindrome\n", palindrome\n", number ); } /* end else */ return 0; /* indicate successful termination */ } /* end main */ © Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
42
Structured Program Development in C: Solutions
Chapter 3
Enter a five-digit number: 18181 18181 is a palindrome
Enter a five-digit number: 16738 16738 is not a palindrome
3.36
Input an integer containing only 0s and 1s (i.e., a “binary” integer) and print its decimal equivalent. [ Hint : Use the remainder and division operators to pick off the “binary” number’s digits one at a time from right to left. Just as in the decimal number system in which the rightmost digit has a positional value of 1, and the next digit left has a positional value of 10 , then 100, then 1000, etc., in the binary number system the rightmost digit has a positional value of 1, the next digit left has a positional value of 2, then 4, then 8, etc. Thus the decimal number 234 can be interpreted as 4 * 1 + 3 * 10 + 2 * 100. The decimal equivalent of binary 1101 is 1 * 1 + 0 * 2 + 1 * 4 + 1 * 8 or 1 + 0 + 4 + 8 or 13.] ANS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
/* Exercise 3.36 Solution */ #include #include int main() { int binary; int number; int decimal = 0; int highBit = 16 16; ; int factor = 10000 10000; ;
/* /* /* /* /*
current value of binary number */ input binary number */ current value of decimal number */ value of highest bit */ factor of 10 to pick off digits */
/* prompt for binary input */ printf( "Enter a binary number ( 5 digits maximum ): " ); scanf( "%d" "%d", , &binary ); number = binary; /* save in number for final display */ /* loop 5 times using powers of 2 */ while ( highBit >= 1 ) { /* update decimal value with decimal value corresponding to current highest binary bit */ decimal += binary / factor * highBit; /* reduce high bit by factor of 2, i.e., move one bit to the right */ highBit /= 2; /* reduce binary number to eliminate current highest bit */ binary %= factor; /* reduce factor by power of 10, i.e., move one bit to the right */ factor /= 10 10; ; } /* end while */ /* display decimal value */ printf( "The decimal equivalent of %d is %d\n", %d\n", number, decimal ); return 0; /* indicate successful termination */ } /* end main */
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Structured Program Development in C: Solutions 43
Chapter 3
Enter a binary number ( 5 digits maximum ): 10111 The decimal equivalent of 10111 is 23
Enter a binary number ( 5 digits maximum ): 1101 The decimal equivalent of 1101 is 13
3.37 How can you determine how fast your own computer really operates? Write a program with a while loop that counts from 1 to 300,000,000 by 1s. Every time the count reaches a multiple of 100,000,000 print that number on the screen. Use your watch to time how long each million repetitions of the loop takes. ANS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/* Exercise 3.37 Solution */ #include #include int main() { long int count = 1; /* counter */ /* loop to 300,000,000 */ while( while ( count <= 300000000 ) { if ( count % 100000000 == 0 ) { printf( "Multiple is %d\n", %d\n", count / 100000000 ); } /* end if */ ++count; /* increment count */ } /* end while */ return 0; /* indicate successful termination */ } /* end main */
Multiple is 1 Multiple is 2 Multiple is 3
3.38
Write a program that prints 100 asterisks, one at a time. After every tenth asterisk, your program should print a newline character. (Hint: Count from 1 to 100. Use the remainder operator to recognize each time the counter reaches a multiple of 10.) ANS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14
/* Exercise 3.38 Solution */ #include int main() { int count = 0; /* counter */ /* loop to 100 */ while( while ( ++count <= 100 ) /* print a new line after every 10th asterisk */ count % 10 == 0 ? printf( "*\n" ) : printf( "*" );
return 0; /* indicate successful termination */ © Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
44
Structured Program Development in C: Solutions
15 16
} /* end main */
********** ********** ********** ********** ********** ********** ********** ********** ********** **********
3.39
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
Write a program that reads an integer and determines and prints how m any digits in the integer are 7s. ANS: /* Exercise 3.39 Solution */ #include int main() { int number; int numCopy; int factor = 10000 10000; ; int digit; int sevens = 0;
/* /* /* /* /*
user input */ copy of number */ set factor to pick off digits */ individual digit of number */ sevens counter */
printf( "Enter a 5-digit number: " ); /* get number from user */ scanf( "%d" "%d", , &number ); numCopy = number; /* loop through each of the 5 digits */ while ( factor >= 1 ) { digit = numCopy / factor; /* pick off next digit */ if ( digit == 7 ) { /* if digit equals 7, increment sevens */ ++sevens; } /* end if */ numCopy %= factor; factor /= 10 10; ; } /* end while */ /* output number of sevens */ printf( "The number %ld has %d seven(s) in it\n", it\n", number, sevens ); return 0; /* indicate successful termination */ } /* end main */
Enter a 5-digit number: 17737 The number 17737 has 3 seven(s) in it
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Chapter 3
Structured Program Development in C: Solutions 45
Chapter 3
Enter a 5-digit number: 11727 The number 11727 has 2 seven(s) in it
3.40
Write a program that displays the following checkerboard pattern * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Your program must use only three output statements, one of each of the following forms: printf( "* " ); printf( " " ); printf( "\n" );
ANS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
/* Exercise 3.40 Solution */ #include int main() { int side = 8; /* side counter */ int row; /* row counter */ int mod; /* remainder */ /* loop 8 times */ while ( side >= 1 ) { row = 8; /* reset row counter */ mod = side % 2; /* loop 8 times */ while ( row >= 1 ) { /* if odd row, begin with a space */ if ( mod != 0 ) { printf( " " ); mod = 0; } /* end if */ printf( "* " ); --row; } /* end while */ printf( "\n" ); /* go to next line */ --side; } /* end while */ return 0; /* indicate successful termination */ } /* end main */
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
46
Structured Program Development in C: Solutions
Chapter 3
3.41
Write a program that keeps printing the multiples of the integer 2, namely 2, 4, 8, 16, 32, 64, etc. Your loop should not terminate (i.e., you should create an infinite loop). What happens when you run this program? ANS: Program execution terminates when largest integer is exceeded (i.e., the loop continuation test fails when the maximum value for an integer is exceeded. On a 4-byte system, the largest integer integer value is 2147483647 and anything above that is represented by a negative number, which fails the loop continuation test). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/* Exercise 3.41 Solution */ #include int main() { int multiple = 1; /* counter */ /* infinite loop */ while ( multiple > 0 ) { /* calculate the next power of two */ multiple *= 2; printf( "%d\n" "%d\n", , multiple ); } /* end while */ return 0; /* indicate successful termination */ } /* end main */
2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 1073741824 -2147483648
3.42
Write a program that reads the radius of a circle (as a float value) and computes and prints the diameter, the circumference and the area. Use the value 3.14159 for π. © Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Structured Program Development in C: Solutions 47
Chapter 3
ANS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/* Exercise 3.42 Solution */ #include #include int main() { float radius; /* input radius */ float pi = 3.14159 3.14159; ; /* value for pi */ printf( "Enter the radius: "); "); /* get radius value */ scanf( "%f" "%f", , &radius ); /* compute and display diameter */ printf( "The diameter is %.2f\n", %.2f\n", radius * 2 ); /* compute and display circumference */ printf( "The circumference is %.2f\n", %.2f\n", 2 * pi * radius ); /* compute and display area */ printf( "The area is %.2f\n", %.2f\n", pi * radius * radius ); return 0; /* indicate successful termination */ } /* end main */
Enter the radius: 4.7 The diameter is 9.40 The circumference is 29.53 The area is 69.40
3.43 What is wrong with the following statement? Rewrite the statement to accomplish what the programmer was probably trying to do.
printf( "%d" "%d", , ++( x + y ) );
ANS: printf( “%d” “%d”, , 1 + x + y ); 3.44
Write a program that reads three n onzero float values and determines and prints if they could represent the sides of a tri-
angle. ANS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/* Exercise 3.44 Solution */ #include int main() { double a; /* first number */ double b; /* second number */ double c; /* third number */ /* input 3 numbers */ printf( "Enter three doubleing point numbers: " ); scanf( "%lf%lf%lf" "%lf%lf%lf", , &a, &b, &c); /* use Pythagorean Theorem */ if ( c * c == a * a + b * b ) { printf( "The three numbers could be sides of a triangle\n" ); } /* end if */ © Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
48
Structured Program Development in C: Solutions
18 19 20 21 22 23 24 25
Chapter 3
else { printf( "The three numbers probably"); probably"); printf( " are not the sides of a triangle\n" ); } /* end if */ return 0; /* indicate successful termination */ } /* end main */
Enter three doubleing point numbers: 5.7 3.6 2.2 The three numbers probably are not the sides of a triangle
Enter three doubleing point numbers: 3.0 4.0 5.0 The three numbers could be sides of a triangle
3.45
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
Write a program that reads three nonzero integers and determines and prints if they could be the sides of a right triangle. ANS: /* Exercise 3.45 Solution */ #include int main() { int a; /* first number */ int b; /* second number */ int c; /* third number */ /* input three numbers */ printf( "Enter three integers: "); "); scanf( "%d%d%d" "%d%d%d", , &a, &b, &c ); /* use Pythagorean Theorem */ if ( c * c == a * a + b * b ) { printf( "The three integers are the sides of"); of"); printf( " a right triangle\n" ); } /* end if */ else { printf( "The three integers are not the sides"); sides"); printf( " of a right triangle\n" ); } /* end else */ return 0; /* indicate successful termination */ } /* end main */
Enter three integers: 3 4 5 The three integers are the sides of a right triangle
Enter three integers: 9 4 1 The three integers are not the sides of a right triangle
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Structured Program Development in C: Solutions 49
Chapter 3
3.46
A company wants to transmit data over the telephone, but they are concerned that their phones may be tapped. All of their data is transmitted as four-digit integers. They have asked you to write a program that will encrypt their data so that it may be transmitted more securely. Your program should read a four-digit integer and encrypt it as follows: Replace each digit by the remainder after (the sum of that digit plus 7) is divided by 10. Then, swap the first digit with the third, and swap the second digit with the fourth. Then print the encrypted integer. Write a separate program that inputs an encrypted four-digit integer and decrypts it to form the original number. ANS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
/* Exercise 3.46 Part A solution */ #include int main() { int first; /* first digit replacement */ int second; /* second digit replacement */ int third; /* third digit replacement */ int fourth; /* fourth digit replacement */ int digit; /* input number */ int temp1; /* temporarily hold digit */ int temp2; /* temporarily hold digit */ int encryptedNumber; /* resulting encrypted number */ /* prompt for input */ printf( "Enter a four digit number to be encrypted: " ); scanf( "%d" "%d", , &digit ); temp1 = digit; /* retrieve each digit and replace with (sum of digit and 7) mod 10 */ first = ( temp1 / 1000 + 7 ) % 10 10; ; temp2 = temp1 % 1000 1000; ; second = ( temp2 / 100 + 7 ) % 10 10; ; temp1 = temp2 % 100 100; ; third = ( temp1 / 10 + 7 ) % 10 10; ; temp2 = temp1 % 10 10; ; fourth = ( temp2 + 7 ) % 10 10; ; /* swap temp1 = first = third =
first and third */ first; third * 1000 1000; ; /* multiply by 1000 for 1st digit component */ temp1 * 10 10; ; /* multiply by 10 for 3rd digit component */
/* swap second and fourth */ temp1 = second; second = fourth * 100 100; ; /* multiply by 100 for 2nd digit component */ fourth = temp1 * 1; /* add components to obtain encrypted number */ encryptedNumber = first + second + third + fourth; /* display encrypted number */ printf( "Encrypted number is %d\n", %d\n", encryptedNumber ); return 0; /* indicate successful termination */ } /* end main */
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
50
Structured Program Development in C: Solutions
Enter a four digit number to be encrypted: 5678 Encrypted number is 4523
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
/* Exercise 3.46 Part B Solution */ #include int main() { int first; /* first decrypted digit */ int second; /* second decrypted digit */ int third; /* third decrypted digit */ int fourth; /* fourth decrypted digit */ int decrypted; /* decrypted number */ int temp1; /* temporarily hold digit */ int temp2; /* temporarily hold digit */ int encryptedNumber; /* input number */ /* prompt for input */ printf( "Enter a four digit encrypted number: " ); scanf( "%d" "%d", , &encryptedNumber ); temp1 = encryptedNumber; /* retrieve each digit and decrypt by (sum of digit and 3) mod 10 */ first = ( temp1 / 1000 ); temp2 = temp1 % 1000 1000; ; second = ( temp2 / 100 ); temp1 = temp2 % 100 100; ; third = ( temp1 / 10 ); temp2 = temp1 % 10 10; ; fourth = temp2; temp1 = ( first + 3 ) % 10; 10; first = ( third + 3 ) % 10 10; ; third = temp1; temp1 = ( second + 3 ) % 10 10; ; second = ( fourth + 3 ) % 10 10; ; fourth = temp1; /* add components to obtain decrypted number */ decrypted = ( first * 1000 ) + ( second * 100 ) + ( third * 10 ) + fourth; /* display decrypted number */ printf( "Decrypted number is %d\n", %d\n", decrypted ); return 0; /* indicate successful termination */ } /* end main */
Enter a four digit encrypted number: 4523 Decrypted number is 5678
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Chapter 3
Structured Program Development in C: Solutions 51
Chapter 3
1.1
The factorial of a nonnegative integer n is written n! (pronounced “n factorial”) and is defined as follows: values of n greater than or equal to 1) n! = n · (n - 1) · ( n - 2) · … · 1 (for values
and n! = 1 (for n = 0). For example, 5! = 5 · 4 · 3 · 2 · 1, which is 120. a) Write a program that reads a nonnegative integer integer and computes computes and prints its factorial. ANS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
/* Exercise 3.47 Part A Solution */ #include int main() { int n; /* current multiplication factor */ int number = -1 -1; ; /* input number */ unsigned factorial = 1; /* resulting factorial */ /* loop until valid input */ do { printf( "Enter a positive integer: " ); scanf( "%d" "%d", , &number ); } while ( number < 0 ); /* end do...while */ n = number; /* compute factorial */ while( while ( n >= 0 ) { if ( n == 0 ) { factorial *= 1; } /* end if */ else { factorial *= n; } /* end else */ --n; } /* end while */ /* display factorial */ printf( "%d! is %u\n", %u\n", number, factorial ); return 0; /* indicate successful termination */ } /* end main */
Enter a positive integer: 5 5! is 120
Enter a positive integer: 9 9! is 362880
Enter a positive integer: -8 Enter a positive integer: 0 0! is 1
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
52
Structured Program Development in C: Solutions
Chapter 3
b) Write a program that estimates the value of the mathematical mathematical constant e by using the formula: e
=
1
1
1
1
+ ----- + ----- + ----- + … 1! 2! 3!
ANS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/* Exercise 3.47 Part B Solution */ #include int main() { int n = 0; int fact = 1; int accuracy = 10 10; ; double e = 0;
/* /* /* /*
loop counter for accuracy */ current n factorial */ degree of accuracy */ current estimated value of e */
/* loop until degree of accuracy */ while( while ( n <= accuracy ) { if ( n == 0 ) { fact *= 1; } /* end if */ else { fact *= n; } /* end else */ e += 1.0 / fact; ++n; } /* end while */ printf( "e is %f\n", %f\n", e ); /* display estimated value */ return 0; /* indicate successful termination */ } /* end main */
e is 2.718282
c) Write a program program that that compute computess the value value of e x by using the formula 2 x
e
=
1
x
x
3
x
+ ----- + ----- + ----- + … 1! 2! 3!
ANS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14
/* Exercise 3.47 Part C Solution */ #include int main() { int n = 0; int accuracy = 15 15; ; int x = 3; int times = 0; int count; double e = 1.0 1.0; ; double exp = 0.0 0.0; ; double fact = 1.0 1.0; ;
/* /* /* /* /* /* /* /*
counter */ degree of accuracy */ exponent */ counter */ copy of n */ e raised to the x power */ x raised to the n power */ n factorial */
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Structured Program Development in C: Solutions 53
Chapter 3
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
/* loop while less than degree of accuracy */ while( while ( n <= accuracy ) { count = n; /* update n! */ if ( n == 0 ) { fact *= 1.0 1.0; ; } /* end if */ else { fact *= n; } /* end else */ while ( times < count ) { /* calculate x raised to the n power */ if ( times == 0 ) { exp = 1.0 1.0; ; exp *= x; } /* end if */ else { exp *= x; } /* end else */ ++times; } /* end while */ e += exp / fact; /* update e raised to the x power */ ++n; } /* end while */ /* display result */ printf( "e raised to the %d power is %f\n" %f\n", , x, e ); return 0; /* indicate successful termination */ } /* end main */
e raised to the 3 power is 20.085534
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
54
Structured Program Development in C: Solutions
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.
Chapter 3