C++PrimerPlus第六版第十六章课后习题
- 格式:docx
- 大小:26.03 KB
- 文档页数:14
16章部分选做习题16.1编写一个模板返回形参的绝对值,至少用三种不同类型的值调用模板。
注意:在16.3节讨论编译器怎样处理模板实例化之前,你应该将每个模板定义和该模板的所有使用放在同一文件中。
// 16.1_template.cpp : 定义控制台应用程序的入口点。
//#include"stdafx.h"#include<iostream>template <typename T> inline T abs( T tVal){return tVal > 0 ? tVal : -1*tVal;}int _tmain(int argc, _TCHAR* argv[]){std::cout << "\n\tabs( false ) is:\t" << abs(false) << std::endl<< "\n\tabs( -3 ) is:\t\t" << abs( -3 ) << std::endl<< "\n\tabs( -8.6 ) is:\t\t" << abs( -8.6 ) << std::endl;system("pause");return 0;}16.2 编写一个函数模板,接受一个ostream引用和一个值,将该值写入流。
用至少四种不同类型调用函数。
通过写至cout、写至文件和写至stringstream来测试你的程序。
// 16.2_template.cpp : 定义控制台应用程序的入口点。
//#include"stdafx.h"#include<iostream>#include<ostream>#include<fstream>#include<sstream>#include<cassert>using namespace std;template <typename T> inlinevoid testOstream( ostream& os, T tVal ){os << tVal;}int _tmain(int argc, _TCHAR* argv[]){// coutcout << " Test of testOstream( cout, 6 ):\t";testOstream( cout, 6 );cout << "\n Test of testOstream( cout, true ):\t";testOstream( cout, true );cout << "\n Test of testOstream( cout, 8.6 ):\t";testOstream( cout, 8.6 );cout << "\n Test of testOstream( cout, \"Good!\" ):\t";testOstream( cout, "Good!" );cout << endl;// ofstreamofstream outfile;outfile.open("testOf_Ofstream.txt");assert( outfile );if ( !outfile ){return NULL;}cout << "\n\tTest of ofstream, Please check the file just create.\n";testOstream(outfile, "\n Test of testOstream( outfile, 6 ):\t");testOstream( outfile, 6 );testOstream(outfile, "\n Test of testOstream( outfile, true ):\t");testOstream( outfile, true );testOstream(outfile, "\n Test of testOstream( outfile, 8.6 ):\t");testOstream( outfile, 8.6 );testOstream(outfile, "\n Test of testOstream( outfile, \"Good!\" ):\t");testOstream( outfile, "Good!" );outfile.close();cout << endl;// stringstreamstringstream oss;cout << "\n Test of testOstream( oss, 6 )/( oss, true )/( oss, 8.6 )/( oss, \"Good!\"):" << endl;testOstream( oss, 6 );testOstream( oss, "\n" );testOstream( oss, true );testOstream( oss, "\n" );testOstream( oss, 8.6 );testOstream( oss, "\n" );testOstream( oss, "Good!");testOstream( oss, "\n" );cout << oss.str() << endl;system("pause");return 0;}16.3当调用两个string对象的compare时,传递用字符串字面值初始化的两个string对象。
Chapter 2 Programming Exercises欧阳学文PE 2‐1/* Programming Exercise 21 */#include<stdio.h> intmain(void){ printf("GustavMahler\n");printf("Gustav\nMahler\n");printf("Gustav ");printf("Mahler\n");return 0;}PE 2‐3/* Programming Exercise 23 */#include<stdio.h> intmain(void){ int ageyears; /* age inyears */ int agedays; /*age in days *//* large ages may require the longtype */ ageyears = 101; agedays = 365 * ageyears;printf("An age of %d years is %d days.\n", ageyears, agedays); return 0;}PE 2‐4/* Programming Exercise 24 */#include<stdio.h>voidjolly(void);voiddeny(void);intmain(void){ jolly();jolly();jolly();deny();return0; }void jolly(void){printf("For he's a jolly good fellow!\n"); }void deny(void){printf("Which nobody can deny!\n"); }PE 2‐6/* Programming Exercise 26 */#include<stdio.h> intmain(void){ inttoes;toes =10;printf("toes = %d\n", toes);printf("Twice toes = %d\n", 2 * toes);printf("toes squared = %d\n", toes * toes);return 0;}/* or create two more variables, set them to 2 * toes and toes * toes */PE 2‐8/* Programming Exercise 28 */#include<stdio.h>voidone_three(void); voidtwo(void); intmain(void){printf("startingnow:\n");one_three();printf("done!\n");return 0;}void one_three(void){printf("one\n");two();printf("three\n");}void two(void){printf("two\n");}Chapter 3 Programming Exercises PE 3‐2/* Programming Exercise 32 */#include<stdio.h> intmain(void){intascii;printf("Enter an ASCII code: "); scanf("%d", &ascii);printf("%d is the ASCII code for %c.\n", ascii, ascii); return 0;}PE 3‐4/* Programming Exercise 34 */#include<stdio.h> intmain(void){ float num;printf("Enter a floatingpoint value: "); scanf("%f", &num);printf("fixedpointnotation: %f\n", num);printf("exponentialnotation: %e\n", num); printf("p notation: %a\n", num); return 0;}PE 3‐6/* Programming Exercise 36 */#include<stdio.h> intmain(void){float mass_mol = 3.0e23; /* mass of watermolecule in grams */ float mass_qt = 950; /*mass of quart of water in grams */ float quarts;float molecules;printf("Enter the number of quarts of water: ");scanf("%f", &quarts);molecules = quarts * mass_qt / mass_mol;printf("%f quarts of water contain %e molecules.\n", quarts, molecules); return 0;}Chapter 4 Programming ExercisesPE 4‐1/* Programming Exercise 41 */#include<stdio.h> intmain(void){ charfname[40];charlname[40];printf("Enter your first name: "); scanf("%s", fname); printf("Enteryour last name: ");scanf("%s", lname);printf("%s, %s\n", lname, fname); return 0;}PE 4‐4/* Programming Exercise 44 */ #include<stdio.h> intmain(void){ floatheight;charname[40];printf("Enter your height in inches: "); scanf("%f",&height); printf("Enter yourname: "); scanf("%s", name);printf("%s, you are %.3f feet tall\n", name, height / 12.0);return0;}PE 4‐7/* Programming Exercise 47 */#include<stdio.h>#include<float.h> intmain(void){ float ot_f = 1.0/ 3.0; doubleot_d = 1.0 / 3.0;printf(" float values:");printf("%.4f %.12f %.16f\n", ot_f, ot_f, ot_f); printf("double values: ");printf("%.4f %.12f %.16f\n", ot_d,ot_d, ot_d);printf("FLT_DIG: %d\n", FLT_DIG); printf("DBL_DIG: %d\n",DBL_DIG); return 0;}Chapter 5 Programming Exercises PE 5‐1/* Programming Exercise 51 */#include<stdio.h> intmain(void){ const intminperhour = 60;int minutes, hours,mins;printf("Enter the number of minutes to convert: "); scanf("%d", &minutes); while (minutes > 0 ){ hours = minutes/ minperhour; mins =minutes % minperhour;printf("%d minutes = %d hours, %d minutes\n", minutes, hours, mins); printf("Enter next minutes value (0 to quit): "); scanf("%d", &minutes);}printf("Bye\n");return0;}PE 5‐3/* Programming Exercise 53 */#include<stdio.h> intmain(void){ const intdaysperweek = 7;int days, weeks,day_rem;printf("Enter the number ofdays: "); scanf("%d", &days);while (days > 0){ weeks = days /daysperweek; day_rem= days % daysperweek;printf("%d days are %d weeks and %ddays.\n", days, weeks, day_rem);printf("Enter the number of days (0 or less to end): "); scanf("%d", &days);}printf("Done!\n");return 0;}PE 5‐5/* Programming Exercise 55*/ #include <stdio.h>int main(void) /* finds sum of first n integers */{int count,sum;int n;printf("Enter the upperlimit: "); scanf("%d", &n);count = 0;sum = 0;while (count++ < n)sum = sum + count;printf("sum = %d\n",sum); return 0;}PE 5‐7/* ProgrammingExercise 57 */#include <stdio.h>voidshowCube(double x);int main(void) /* finds cube of entered number */ { double val;printf("Enter a floatingpointvalue: "); scanf("%lf", &val);showCube(val); return 0; }void showCube(double x){printf("The cube of %e is %e.\n", x, x*x*x );}Chapter 6 Programming ExercisesPE 6‐1/* pe61.c *//* this implementation assumes the character codes */ /* are sequential, as they are in ASCII. */#include <stdio.h>#define SIZE 26 intmain( void ) { charlcase[SIZE]; int i;for (i = 0; i < SIZE;i++) lcase[i] = 'a'+ i; for (i = 0; i <SIZE; i++)printf("%c", lcase[i]);printf("\n");return 0;}PE 6‐3/* pe63.c *//* this implementation assumes the character codes */ /* are sequential, as they are in ASCII. */#include<stdio.h> intmain( void ){ char let= 'F';char start;char end;for (end = let; end >= 'A'; end) {for (start = let; start >= end; start) printf("%c", start); printf("\n");}return0;}PE 6‐6/* pe66.c */#include<stdio.h> intmain( void ){ int lower,upper, index; intsquare, cube;printf("Enter startinginteger: "); scanf("%d",&lower); printf("Enterending integer: ");scanf("%d", &upper);printf("%5s %10s %15s\n", "num", "square", "cube"); for (index = lower;index <= upper; index++){ square =index * index;cube = index * square;printf("%5d %10d %15d\n", index, square, cube); }return0;}PE 6‐8/* pe68.c */#include<stdio.h> intmain( void ){ double n, m;doubleres;printf("Enter a pair of numbers: ");while (scanf("%lf %lf", &n, &m) == 2){res = (n m) / (n * m);printf("(%.3g %.3g)/(%.3g*%.3g) = %.5g\n", n, m, n, m, res); printf("Enter next pair (nonnumeric to quit): ");}return 0;}PE 6‐11/* pe611.c */#include<stdio.h>#defineSIZE 8 intmain( void ){ intvals[SIZE];int i;printf("Please enter %dintegers.\n", SIZE); for (i = 0; i <SIZE; i++) scanf("%d",&vals[i]);printf("Here, in reverse order, are the values you entered:\n"); for (i = SIZE 1; i >= 0; i) printf("%d ", vals[i]); printf("\n"); return 0;}PE 6‐13/* pe613.c *//* This version starts with the 0 power */#include<stdio.h>#defineSIZE 8 intmain( void ){inttwopows[SIZE];int i;int value = 1; /* 2 to the 0 */for (i = 0; i < SIZE; i++){ twopows[i]= value; value*= 2;}i =0;do{printf("%d ",twopows[i]);i++; } while (i <SIZE); printf("\n"); return 0;}PE 6‐14/* pe14.c *//* Programming Exercise 614 */ #include<stdio.h>#defineSIZE 8 intmain(void){ doublearr[SIZE];doublearr_cumul[SIZE];int i;printf("Enter %d numbers:\n", SIZE);for (i = 0; i < SIZE; i++){printf("value #%d: ", i+ 1); scanf("%lf",&arr[i]); /* or scanf("%lf", arr + i); */}arr_cumul[0] = arr[0]; /* set first element */ for (i = 1; i < SIZE; i++) arr_cumul[i] = arr_cumul[i1] + arr[i]; for (i = 0; i < SIZE;i++) printf("%8g ",arr[i]); printf("\n");for (i = 0; i < SIZE; i++)printf("%8g ", arr_cumul[i]);printf("\n");return 0;}PE 6‐16/* pe616.c */#include <stdio.h>#define RATE_SIMP 0.10#defineRATE_COMP0.05 #defineINIT_AMT 100.0int main( void ){double daphne =INIT_AMT;double deidre =INIT_AMT; intyears = 0;while (deidre <= daphne){ daphne +=RATE_SIMP * INIT_AMT; deidre += RATE_COMP * deidre;++years;}printf("Investment values after %d years:\n", years); printf("Daphne: $%.2f\n", daphne); printf("Deidre: $%.2f\n", deidre); return 0;}Chapter 7 Programming Exercises PE 7‐1/* ProgrammingExercise 71 */#include <stdio.h>int main(void){ charch; intsp_ct = 0;int nl_ct =0; intother = 0;while ((ch =getchar()) != '#'){if (ch == ' ')sp_ct++; elseif (ch == '\n')nl_ct++; elseother++;}printf("spaces: %d, newlines: %d, others: %d\n", sp_ct, nl_ct, other);return0;}PE 7‐3/* Programming Exercise 73 */#include<stdio.h> intmain(void){ int n;double sumeven= 0.0; intct_even = 0;double sumodd =0.0; int ct_odd= 0;while (scanf("%d", &n) == 1 && n != 0){if (n % 2 == 0){sumeven += n;++ct_even;}else // n % 2 is either 1 or 1{sumodd += n;++ct_odd;} }printf("Number of evens: %d",ct_even); if (ct_even > 0)printf(" average: %g", sumeven / ct_even); putchar('\n');printf("Number of odds: %d",ct_odd); if (ct_odd > 0)printf(" average: %g", sumodd / ct_odd); putchar('\n');printf("\ndone\n");return0;}PE 7‐5/* Programming Exercise 75 */#include<stdio.h> intmain(void){ charch; intct1 = 0;int ct2 =0;while ((ch=getchar())!= '#'){switch(ch){case '.' : putchar('!'); ++ct1;break; case '!' :putchar('!');putchar('!');++ct2;break; default :putchar(ch);} }printf("%d replacement(s) of . with !\n", ct1); printf("%d replacement(s) of ! with !!\n", ct2);return0;}PE 7‐7// Programming Exercise 77#include <stdio.h>#define BASEPAY 10 // $10 per hour#define BASEHRS 40 // hours at basepay #define OVERTIME 1.5 // 1.5 time#define AMT1 300 // 1st rate tier#define AMT2 150 // 2st rate tier#define RATE1 0.15 // rate for 1st tier#define RATE2 0.20 // rate for2nd tier #define RATE3 0.25 //rate for 3rd tier int main(void){doublehours;double gross;double net;double taxes;printf("Enter the number of hours workedthis week: "); scanf("%lf", &hours); if(hours <= BASEHRS) gross = hours *BASEPAY; elsegross = BASEHRS * BASEPAY + (hours BASEHRS)* BASEPAY * OVERTIME; if (gross <= AMT1)taxes = gross * RATE1; else if (gross <= AMT1 + AMT2)taxes = AMT1 * RATE1 + (gross AMT1)* RATE2; elsetaxes = AMT1 * RATE1 + AMT2 * RATE2 + (grossAMT1 AMT2) * RATE3; net = gross taxes;printf("gross: $%.2f; taxes: $%.2f; net: $%.2f\n", gross, taxes, net);return0;}PE 7‐9/* Programming Exercise 79 */#include<stdio.h>#include<stdbool.h> intmain(void){intlimit;int num;int div;bool numIsPrime; // use int if stdbool.h not available printf("Enter a positive integer: ");while (scanf("%d", &limit) == 1 &&limit > 0){if (limit > 1)printf("Here are the prime numbers upthrough %d\n", limit); elseprintf("No primes.\n");for (num = 2; num <= limit;num++){for (div = 2, numIsPrime = true; (div * div) <= num; div++) if (num % div == 0) numIsPrime = false; if (numIsPrime)printf("%d is prime.\n", num);}printf("Enter a positive integer (q to quit): ");}printf("Done!\n");return 0;}PE 7‐11/* pe711.c *//* Programming Exercise 711 */#include<stdio.h>#include<ctype.h> intmain(void){const doubleprice_artichokes = 2.05; const double price_beets = 1.15; const doubleprice_carrots = 1.09; const double DISCOUNT_RATE = 0.05; const double under5 = 6.50; const double under20 = 14.00; const double base20 = 14.00; const double extralb = 0.50;charch;doublelb_artichokes = 0;double lb_beets =0; doublelb_carrots = 0;double lb_temp;double lb_total;doublecost_artichokes;doublecost_beets;doublecost_carrots;double cost_total;doublefinal_total;double discount;double shipping;printf("Enter a to buy artichokes, b for beets, "); printf("c for carrots, q to quit: "); while ((ch = getchar()) != 'q' && ch != 'Q'){ if (ch == '\n') continue; while(getchar() != '\n')continue; ch =tolower(ch);switch (ch) {case 'a' : printf("Enter pounds of artichokes: "); scanf("%lf",&lb_temp); lb_artichokes +=lb_temp; break;case 'b' : printf("Enter pounds ofbeets: "); scanf("%lf",&lb_temp); lb_beets +=lb_temp; break;case 'c' : printf("Enter pounds of carrots: "); scanf("%lf",&lb_temp); lb_carrots +=lb_temp; break;default : printf("%c is not a valid choice.\n", ch);}printf("Enter a to buy artichokes, b for beets, "); printf("c for carrots, q to quit: ");}cost_artichokes = price_artichokes *lb_artichokes; cost_beets = price_beets *lb_beets; cost_carrots = price_carrots *lb_carrots; cost_total = cost_artichokes + cost_beets + cost_carrots; lb_total =lb_artichokes + lb_beets + lb_carrots; if (lb_total <= 0) shipping = 0.0; else if (lb_total < 5.0) shipping = under5; else if (lb_total < 20) shipping = under20; else shipping = base20 + extralb *lb_total; if (cost_total > 100.0)discount =DISCOUNT_RATE * cost_total;else discount = 0.0;final_total = cost_total + shipping discount; printf("Your order:\n");printf("%.2f lbs of artichokes at $%.2f per pound:$ %.2f\n", lb_artichokes, price_artichokes, cost_artichokes);printf("%.2f lbs of beets at $%.2f per pound: $%.2f\n", lb_beets, price_beets,cost_beets); printf("%.2f lbs of carrots at $%.2f per pound: $%.2f\n", lb_carrots, price_carrots, cost_carrots); printf("Total cost of vegetables: $%.2f\n", cost_total); if (cost_total > 100)printf("Volume discount: $%.2f\n", discount); printf("Shipping: $%.2f\n", shipping); printf("Total charges:$%.2f\n", final_total); return 0; } Chapter 8 Programming Exercises PE 8‐1/* Programming Exercise 81 */#include <stdio.h>int main(void) { int ch;int ct = 0; while((ch = getchar()) != EOF)ct++;printf("%d characters read\n", ct);return0;}PE 8‐3/* Programming Exercise 83 *//* Using ctype.h eliminates need to assume consecutive coding */#include<stdio.h>#include<ctype.h> intmain(void){ int ch;unsigned long uct= 0; unsignedlong lct = 0;unsigned long oct= 0;while ((ch =getchar()) != EOF)if (isupper(ch))uct++; else if(islower(ch))lct++; elseoct++;printf("%lu uppercase characters read\n", uct); printf("%lu lowercase characters read\n", lct); printf("%lu other characters read\n", oct);return0;}/* or you coulduse if (ch >= 'A'&& ch <= 'Z')uct++;else if (ch >= 'a' && ch<= 'z') lct++; elseoct++;*/PE 8‐5/* Programming Exercise 85 *//* binaryguess.c an improved numberguesser */ /* but relies upon truthful, correct responses */#include <stdio.h>#include <ctype.h>int main(void) { inthigh = 100; int low= 1; int guess =(high + low) / 2;char response;printf("Pick an integer from 1 to 100. I will try to guess "); printf("it.\nRespond with a y if my guess is right, with");printf("\na h if it is high, and with an l if it is low.\n");printf("Uh...is your number %d?\n", guess);while ((response = getchar()) != 'y') /* get response */{if (response == '\n')continue;if (response != 'h' && response != 'l'){printf("I don't understand that response. Please enterh for\n"); printf("high, l for low, or y for correct.\n"); continue;}if (response == 'h')high = guess 1;else if (response == 'l')low = guess + 1;guess = (high + low)/ 2;printf("Well, then, is it %d?\n", guess);}printf("I knew I could doit!\n"); return 0;}PE 8‐7/* Programming Exercise 87 */#include <stdio.h>#include <ctype.h>#include <stdio.h>#define BASEPAY1 8.75 // $8.75 per hour #define BASEPAY2 9.33 // $9.33 per hour #define BASEPAY3 10.00 // $10.00 per hour #define BASEPAY4 11.20 // $11.20 per hour #define BASEHRS 40 // hours at basepay #define OVERTIME 1.5 // 1.5 time#define AMT1 300 // 1st rate tier#define AMT2 150 // 2st rate tier#define RATE1 0.15 // rate for 1st tier #define RATE2 0.20 // ratefor 2nd tier #define RATE3 0.25// rate for 3rd tier int getfirst(void);void menu(void); int main(void){ doublehours;doublegross;double net;doubletaxes;double pay;charresponse;menu();while ((response = getfirst()) != 'q'){if (response == '\n') /* skip over newlines */ continue;response = tolower(response); /* accept A as a, etc.*/ switch (response){case 'a': pay = BASEPAY1;break; case 'b': pay =BASEPAY2; break; case 'c':pay = BASEPAY3; break; case'd': pay = BASEPAY4; break;default : printf("Please enter a, b, c, d, or q.\n"); menu();continue; // go to beginning of loop}printf("Enter the number of hours workedthis week: "); scanf("%lf", &hours); if(hours <= BASEHRS) gross = hours *pay; elsegross = BASEHRS * pay + (hours BASEHRS) *pay * OVERTIME; if (gross <= AMT1)taxes = gross * RATE1; else if (gross <= AMT1 +AMT2)taxes = AMT1 * RATE1 + (gross AMT1)* RATE2; elsetaxes = AMT1 * RATE1 + AMT2 * RATE2 + (gross AMT1 AMT2) * RATE3; net = gross taxes;printf("gross: $%.2f; taxes: $%.2f; net: $%.2f\n", gross, taxes, net); menu(); }printf("Done.\n");return0;}void menu(void){printf("********************************************************""*********\n");printf("Enter the letter corresponding to the desired pay rate"" or action:\n");printf("a) $%4.2f/hr b) $%4.2f/hr\n", BASEPAY1, BASEPAY2);printf("c) $%5.2f/hr d) $%5.2f/hr\n", BASEPAY3, BASEPAY4); printf("q)quit\n");printf("*********************************************** *********""*********\n");}int getfirst(void){intch;ch = getchar();while (isspace(ch))ch = getchar();while (getchar() !='\n') continue;return ch;}Chapter 9 Programming ExercisesPE 9‐1/* Programming Exercise 91 */#include <stdio.h>double min(double,double); int main(void){double x, y; printf("Entertwo numbers (q to quit): ");while (scanf("%lf %lf", &x, &y) ==2){ printf("The smaller numberis %f.\n", min(x,y)); printf("Next two values (q to quit): ");}printf("Bye!\n");return0;}double min(double a, double b){return a < b ? a : b;}/* alternative implementation doublemin(double a, double b){ if (a< b)return a;elsereturn b;}*/PE 9‐3/* Programming Exercise 93 */#include <stdio.h>void chLineRow(char ch, int c,int r); int main(void){ char ch; int col, row; printf("Enter a character (# to quit): "); while ( (ch = getchar()) != '#') { if (ch== '\n')continue;printf("Enter number of columns and number of rows: "); if (scanf("%d %d", &col, &row) != 2) break; chLineRow(ch, col, row);printf("\nEnter next character (# to quit): "); }printf("Bye!\n");return0;}// start rows and cols at 0void chLineRow(char ch,int c, int r){int col, row;for (row = 0; row < r ; row++){for (col = 0; col < c;col++) putchar(ch);putchar('\n');}return;}PE 9‐5/* Programming Exercise 95 */#include <stdio.h>void larger_of(double *p1,double *p2); int main(void){double x, y; printf("Entertwo numbers (q to quit): ");while (scanf("%lf %lf", &x, &y) ==2){larger_of(&x, &y);printf("The modified values are %f and %f.\n", x, y); printf("Next two values (q to quit): ");}printf("Bye!\n");return0;}void larger_of(double *p1, double *p2) { if(*p1 > *p2)*p2 = *p1;else*p1 = *p2;}// alternatively:/*void larger_of(double *p1, double *p2) {*p1= *p2 = *p1 > *p2 ? *p1 : *p2; }*/PE 9‐8/* Programming Exercise 98*/ #include <stdio.h>double power(double a, int b); /* ANSI prototype */ int main(void) { double x,xpow; int n; printf("Enter a number andthe integer power"); printf(" to which\nthe number will be raised. Enter q"); printf(" toquit.\n"); while (scanf("%lf%d", &x, &n)== 2){ xpow = power(x,n); /* function call */ printf("%.3g to the power %dis %.5g\n", x, n, xpow); printf("Enter nextpair of numbers or q to quit.\n");} printf("Hope you enjoyed this powertrip bye!\n"); return 0;} double power(double a, int b) /* function definition */{ doublepow = 1;int i; if(b == 0){ if (a== 0)printf("0 to the 0 undefined; using 1 as thevalue\n"); pow = 1.0; } else if (a == 0) pow = 0.0; else if (b > 0) for(i = 1; i <= b;i++) pow *= a; else /* b < 0 */ pow = 1.0 / power(a, b);return pow; /* return the value of pow */ }PE 9‐10/* Programming Exercise 910 */#include <stdio.h> voidto_base_n(int x, int base); intmain(void) { int number; int b;int count; printf("Enter aninteger (q to quit):\n"); while(scanf("%d", &number) == 1){ printf("Enter numberbase (210): "); while ((count= scanf("%d", &b))== 1&& (b < 2 || b > 10)){printf("base should be in the range 210: ");} if(count != 1)break;。
Chapter 2 Programming ExercisesPE 2--‐1/* Programming Exercise 2-1 */#include<stdio.h> intmain(void){ printf("GustavMahler\n");printf("Gustav\nMahler\n");printf("Gustav");printf("Mahler\n"); return 0;}PE 2--‐3/* Programming Exercise 2-3 */#include<stdio.h> intmain(void){ int ageyears; /*age in years */ intagedays; /* age indays *//* large ages may require the long type */ ageyears = 101; agedays= 365 * ageyears;printf("An age of %d years is %d days.\n", ageyears, agedays); return 0;}PE 2--‐4/* Programming Exercise 2-4 */#include<stdio.h>voidjolly(void);voiddeny(void);intmain(void){jolly();jolly();jolly();deny();return;}void jolly(void){printf("For he's a jolly good fellow!\n"); }void deny(void){printf("Which nobody can deny!\n");}PE 2--‐6/* Programming Exercise 2-6 */#include<stdio.h> intmain(void){inttoes;toes=1;printf("toes = %d\n", toes);printf("Twice toes = %d\n", 2 *toes); printf("toes squared= %d\n", toes * toes); return 0;}/* or create two more variables, set them to 2 * toes and toes * toes */PE 2--‐8/* Programming Exercise 2-8 */#include<stdio.h>voidone_three(void);voidtwo(void);intmain(void){printf("starting now:\n");one_three();printf("done!\n"); return0;}void one_three(void){printf("one\n");two();printf("three\n");}void two(void){printf("two\n");}Chapter 3 Programming Exercises PE 3--‐2/* Programming Exercise 3-2 */#include<stdio.h> intmain(void){intascii;printf("Enter an ASCII code:"); scanf("%d", &ascii);printf("%d is the ASCII code for %c.\n", ascii, ascii); return 0;}PE 3--‐4/* Programming Exercise 3-4 */#include<stdio.h> intmain(void){floatnum;printf("Enter a floating-point value: "); scanf("%f", &num);printf("fixed-pointnotation: %f\n", num);printf("exponentialnotation: %e\n", num);printf("p notation: %a\n",num); return 0;}PE 3--‐6/* Programming Exercise 3-6 */#include<stdio.h> intmain(void){float mass_mol = 3.0e-23; /* mass of watermolecule in grams */ float mass_qt = 950;/* mass of quart of water in grams */ floatquarts; float molecules;printf("Enter the number of quarts ofwater: "); scanf("%f", &quarts);molecules = quarts * mass_qt / mass_mol;printf("%f quarts of water contain %e molecules.\n", quarts, molecules); return 0;}Chapter 4 Programming ExercisesPE 4--‐1/* Programming Exercise 4-1 */#include<stdio.h> intmain(void){charfname[40];charlname[40];printf("Enter yourfirst name: ");scanf("%s", fname);printf("Enter yourlast name: ");scanf("%s", lname);printf("%s, %s\n",lname, fname);return 0;}PE 4--‐4/* Programming Exercise 4-4 */ #include<stdio.h> intmain(void){floatheight;charname[40];printf("Enter your heightin inches: "); scanf("%f",&height); printf("Enteryour name: ");scanf("%s", name);printf("%s, you are %.3f feet tall\n", name, height / 12.0);return;}PE 4--‐7/* Programming Exercise 4-7 */#include<stdio.h>#include<float.h> intmain(void){ floatot_f = 1.0 /3.0;double ot_d= 1.0 / 3.0;printf(" floatvalues: ");printf("%.4f %.12f %.16f\n", ot_f, ot_f,ot_f); printf("double values: ");printf("%.4f %.12f %.16f\n",ot_d, ot_d, ot_d);printf("FLT_DIG: %d\n",FLT_DIG);printf("DBL_DIG: %d\n",DBL_DIG); return 0;}Chapter 5 Programming ExercisesPE 5--‐1/* Programming Exercise 5-1 */#include<stdio.h> intmain(void){ const intminperhour =60; intminutes, hours,mins;printf("Enter the number ofminutes to convert: "); scanf("%d",&minutes); while (minutes > 0 ){ hours =minutes /minperhour;mins = minutes %minperhour;printf("%d minutes = %d hours, %d minutes\n", minutes, hours, mins); printf("Enter next minutes value (0 to quit): "); scanf("%d", &minutes);}printf("Bye\n");return;}PE 5--‐3/* Programming Exercise 5-3 */ #include<stdio.h> intmain(void){ const intdaysperweek= 7; intdays, weeks,day_rem;printf("Enter thenumber of days: ");scanf("%d", &days);while (days > 0){ weeks =days / daysperweek;day_rem = days % daysperweek;printf("%d days are %d weeksand %d days.\n", days, weeks,day_rem);printf("Enter the number of days (0 or less to end): "); scanf("%d", &days);}printf("Done!\n"); return0;}PE 5--‐5/* ProgrammingExercise 5-5 */#include <stdio.h>int main(void) /* finds sum of first n integers */ {intcount,sum;intn;printf("Enter theupper limit: ");scanf("%d", &n);count = 0;sum = 0;while (count++ < n)sum = sum + count;printf("sum= %d\n", sum);return 0;}PE 5--‐7/*ProgrammingExercise 5-7*/ #include<stdio.h> voidshowCube(double x);int main(void) /* finds cube of entered number */ {doubleval;printf("Enter a floating-point value: ");scanf("%lf", &val);showCube(val); return0; }void showCube(double x){printf("The cube of %e is %e.\n", x, x*x*x );}Chapter 6 Programming ExercisesPE 6--‐1/* pe6-1.c *//* this implementation assumes the character codes *//* are sequential, as they are in ASCII. */#include<stdio.h>#define SIZE26 intmain( void ){ charlcase[SIZE];int i; for(i = 0; i < SIZE;i++)lcase[i] = 'a' + i;for (i = 0; i <SIZE; i++)printf("%c",lcase[i]);printf("\n");return 0;}PE 6--‐3/* pe6-3.c *//* this implementation assumes the character codes *//* are sequential, as they are in ASCII. */#include<stdio.h> intmain(void ){charlet ='F';charstart;charend;for (end = let; end >= 'A'; end--) {for (start = let; start >= end; start--)printf("%c", start);printf("\n");}return;}PE 6--‐6/* pe6-6.c */#include<stdio.h> intmain(void ){ intlower, upper,index; intsquare, cube;printf("Enterstarting integer: ");scanf("%d", &lower);printf("Enter endinginteger: ");scanf("%d", &upper);printf("%5s %10s %15s\n","num", "square", "cube"); for(index = lower; index <= upper;index++){ square =index * index;cube = index *square;printf("%5d %10d %15d\n", index, square, cube);}return;}PE 6--‐8/* pe6-8.c */#include<stdio.h> intmain(void ){doublen,m;doubleres;printf("Enter a pair of numbers: ");while (scanf("%lf %lf", &n, &m) == 2) {res = (n - m) / (n * m);printf("(%.3g - %.3g)/(%.3g*%.3g) = %.5g\n", n, m, n, m, res); printf("Enter next pair (non-numeric to quit): ");}return 0;}PE 6--‐11/* pe6-11.c */#include<stdio.h>#defineSIZE 8intmain(void ){intvals[SIZE];int i;printf("Please enter %dintegers.\n", SIZE); for (i =0; i < SIZE; i++)scanf("%d", &vals[i]);printf("Here, in reverse order, are the valuesyou entered:\n"); for (i = SIZE - 1; i >= 0; i--) printf("%d ", vals[i]); printf("\n"); return 0;}PE 6--‐13/* pe6-13.c *//* This version starts with the 0 power */#include<stdio.h>#defineSIZE 8intmain(void ){inttwopows[SIZE];int i;int value = 1; /* 2 to the 0 */for (i = 0; i < SIZE; i++){ twopows[i] =value;value *= 2;}i=;do{printf("%d ",twopows[i]);i++; } while (i< SIZE);printf("\n"); return 0;}PE 6--‐14/* pe-14.c *//* Programming Exercise 6-14 */ #include<stdio.h>#defineSIZE 8intmain(void){ doublearr[SIZE];doublearr_cumul[SIZE];int i;printf("Enter %dnumbers:\n", SIZE);for (i = 0; i < SIZE; i++){printf("value#%d: ", i + 1);scanf("%lf", &arr[i]);/* or scanf("%lf", arr+ i); */}arr_cumul[0] = arr[0]; /* set first element */ for (i = 1; i < SIZE; i++)arr_cumul[i] = arr_cumul[i-1] + arr[i]; for (i = 0; i <SIZE; i++)printf("%8g ", arr[i]);printf("\n"); for (i= 0; i < SIZE; i++) printf("%8g ",arr_cumul[i]);printf("\n"); return 0;}PE 6--‐16/* pe6-16.c */#include <stdio.h>#define RATE_SIMP 0.10 #defineRATE_COMP 0.05#defineINIT_AMT 100.0 intmain( void){doubledaphne =INIT_AMT;double deidre= INIT_AMT;int years = 0;while (deidre <= daphne) { daphne += RATE_SIMP *INIT_AMT;deidre +=RATE_COMP *deidre;++years;}printf("Investment values after %d years:\n", years); printf("Daphne:$%.2f\n", daphne); printf("Deidre:$%.2f\n", deidre); return 0;}Chapter 7 Programming Exercises PE 7--‐1/*ProgrammingExercise 7-1*/ #include<stdio.h> intmain(void){charch;intsp_ct = 0;intnl_ct = 0;intother = 0;while((ch=getchar()) !='#'){if (ch== ' ')sp_ct++;else if (ch =='\n')nl_ct++;elseother++;}printf("spaces: %d, newlines: %d, others: %d\n", sp_ct, nl_ct, other);return;}PE 7--‐3/* Programming Exercise 7-3 */#include<stdio.h> intmain(void){ int n;doublesumeven =0.0; intct_even =0;doublesumodd =0.0; intct_odd = 0;while (scanf("%d", &n) == 1 && n != 0) {if (n % 2 == 0){sumeven += n;++ct_even;}else // n % 2 is either 1 or -1{sumodd += n;++ct_odd;}}printf("Number of evens: %d", ct_even); if (ct_even > 0)printf(" average: %g", sumeven / ct_even); putchar('\n');printf("Number ofodds: %d", ct_odd); if(ct_odd > 0)printf(" average: %g", sumodd / ct_odd);putchar('\n');printf("\ndone\n");return;}PE 7--‐5/* Programming Exercise 7-5 */ #include<stdio.h> intmain(v oid) {char ch; intct1=0; intct2=0; while ((ch=getchar()) !='#'){ switch(ch){case '.' :putchar('!');++ct1;break; case'!' : putchar('!');putchar('!');++ct2;break;default : putchar(ch);}}printf("%d replacement(s) of . with !\n", ct1); printf("%d replacement(s) of ! with !!\n", ct2);return;}PE 7--‐7// Programming Exercise 7-7#include <stdio.h>#define BASEPAY 10 // $10 per hour#define BASEHRS 40 // hours at basepay #define OVERTIME 1.5 // 1.5 time#define AMT1 300 // 1st rate tier#define AMT2 150 // 2st rate tier#define RATE1 0.15 // rate for 1st tier#define RATE2 0.20 // ratefor 2nd tier #define RATE30.25 // rate for 3rd tier intmain(void){doublehours;doublegross;doublenet;doubletaxes;printf("Enter the number of hoursworked this week: "); scanf("%lf",&hours); if (hours <= BASEHRS)gross = hours * BASEPAY; elsegross = BASEHRS * BASEPAY + (hours - BASEHRS) * BASEPAY * OVERTIME; if (gross<= AMT1) taxes = gross * RATE1; else if(gross <= AMT1 + AMT2)taxes = AMT1 * RATE1 + (gross -AMT1) * RATE2; elsetaxes = AMT1 * RATE1 + AMT2 * RATE2 + (gross - AMT1 - AMT2) * RATE3; net = gross - taxes;printf("gross: $%.2f; taxes: $%.2f; net: $%.2f\n", gross, taxes, net);return;}PE 7--‐9/* Programming Exercise 7-9 */#include<stdio.h>#include<stdbool.h> intmain(void){intlimit;intnum;intdiv;bool numIsPrime; // use int if stdbool.h notavailableprintf("Enter a positiveinteger: "); while(scanf("%d", &limit) == 1 &&limit > 0){if (limit > 1)printf("Here are the prime numbers upthrough %d\n", limit); elseprintf("Noprimes.\n"); for(num = 2; num <= limit;num++){for (div = 2, numIsPrime = true; (div * div)<= num; div++) if (num % div == 0) numIsPrime = false; if (numIsPrime)printf("%d is prime.\n", num);}printf("Enter a positive integer (q to quit): "); }printf("Done!\n");return 0;}PE 7--‐11/* pe7-11.c *//* Programming Exercise 7-11 */#include<stdio.h>#include<ctype.h> intmain(void){const doubleprice_artichokes =2.05; const doubleprice_beets = 1.15;const doubleprice_carrots = 1.09;const doubleDISCOUNT_RATE =0.05; const doubleunder5 = 6.50; constdouble under20 =14.00; const double base20 = 14.00; const double extralb = 0.50;charch;doublelb_artichokes = 0;doublelb_beets =0; doublelb_carrots =0; doublelb_temp;doublelb_total;doublecost_artichokes;doublecost_beets;doublecost_carrots;doublecost_total;doublefinal_total; doublediscount;doubleshipping;printf("Enter a to buy artichokes,b for beets, "); printf("c for carrots, q to quit: "); while ((ch = getchar()) != 'q' && ch != 'Q'){ if (ch =='\n')continue;while(getchar() !='\n')continue;ch =tolower(ch);switch (ch){case 'a' : printf("Enter pounds of artichokes: "); scanf("%lf", &lb_temp); lb_artichokes += lb_temp; break;case 'b' : printf("Enter poundsof beets: "); scanf("%lf", &lb_temp); lb_beets +=lb_temp; break;case 'c' : printf("Enter pounds of carrots: "); scanf("%lf", &lb_temp);lb_carrots += lb_temp;break;default : printf("%c is not a valid choice.\n", ch); }printf("Enter a to buy artichokes, b for beets, "); printf("c for carrots, q to quit: ");}cost_artichokes = price_artichokes *lb_artichokes; cost_beets = price_beets* lb_beets; cost_carrots = price_carrots* lb_carrots; cost_total =cost_artichokes + cost_beets +cost_carrots; lb_total = lb_artichokes +lb_beets + lb_carrots; if (lb_total <= 0) shipping = 0.0; else if (lb_total < 5.0) shipping = under5; else if (lb_total <20) shipping = under20; elseshipping = base20 +extralb * lb_total; if(cost_total > 100.0)discount =DISCOUNT_RATE *cost_total; elsediscount = 0.0;final_total = cost_total + shipping - discount; printf("Your order:\n");printf("%.2f lbs of artichokes at $%.2f per pound:$ %.2f\n", lb_artichokes,price_artichokes, cost_artichokes);printf("%.2f lbs of beets at $%.2f perpound: $%.2f\n", lb_beets,price_beets, cost_beets); printf("%.2f lbsof carrots at $%.2f per pound: $%.2f\n", lb_carrots, price_carrots, cost_carrots);printf("Total cost of vegetables: $%.2f\n", cost_total); if (cost_total > 100)printf("V olume discount:$%.2f\n", discount);printf("Shipping: $%.2f\n",shipping); printf("Total charges:$%.2f\n", final_total); return0; }Chapter 8 Programming Exercises PE 8--‐1/* Programming Exercise 8-1 */#include <stdio.h>int main(void){ int ch; int ct= 0; while((ch =getchar()) != EOF)ct++;printf("%d characters read\n", ct);return;}PE 8--‐3/* Programming Exercise 8-3 *//* Using ctype.h eliminates need to assume consecutive coding */#include<stdio.h>#include<ctype.h>intmain(void){ int ch;unsignedlong uct =0;unsignedlong lct =0;unsignedlong oct =0;while ((ch =getchar()) != EOF)if (isupper(ch))uct++; else if(islower(ch))lct++; elseoct++;printf("%lu uppercase characters read\n", uct); printf("%lu lowercase characters read\n", lct); printf("%lu other characters read\n", oct);return;}/* or youcould use if(ch >= 'A'&& ch <='Z') uct++;else if (ch >= 'a'&& ch <= 'z')lct++; elseoct++;*/PE 8--‐5/* Programming Exercise 8-5 *//* binaryguess.c -- an improved number-guesser */ /* but relies upon truthful, correct responses */#include<stdio.h>#include<ctype.h> intmain(void){ int high =100; int low =1; int guess =(high + low) /2; charresponse;printf("Pick an integer from 1 to 100. I will try to guess "); printf("it.\nRespond with a y if my guess is right, with"); printf("\na h if it is high, and withan l if it is low.\n"); printf("Uh...is yournumber %d?\n", guess);while ((response = getchar()) != 'y') /* get response */{if (response =='\n') continue;if (response != 'h' && response != 'l'){printf("I don't understand that response. Please enter h for\n"); printf("high, l for low, or y for correct.\n"); continue;}if (response== 'h')high = guess -1; else if(response == 'l')low = guess +1; guess =(high + low) /2;printf("Well, then, is it %d?\n", guess);}printf("I knew I could doit!\n"); return 0;}PE 8--‐7/* Programming Exercise 8-7 */#include <stdio.h>#include <ctype.h>#include <stdio.h>#define BASEPAY1 8.75 // $8.75 per hour #define BASEPAY2 9.33 // $9.33 per hour #define BASEPAY3 10.00 // $10.00 per hour #define BASEPAY4 11.20 // $11.20 per hour #define BASEHRS 40 // hours at basepay #define OVERTIME 1.5 // 1.5 time#define AMT1 300 // 1st rate tier#define AMT2 150 // 2st rate tier#define RATE1 0.15 // rate for 1st tier#define RATE2 0.20 //rate for 2nd tier #defineRATE3 0.25 // rate for3rd tier int getfirst(void); voidmenu(void); int main(void){doublehours;doublegross;doublenet;doubletaxes;doublepay;charresponse;menu();while ((response = getfirst()) != 'q'){if (response == '\n') /* skip over newlines */ continue;response = tolower(response); /* accept A as a, etc. */ switch (response){case 'a': pay =BASEPAY1; break; case'b': pay = BASEPAY2; break;case 'c': pay = BASEPAY3;break; case 'd': pay =BASEPAY4; break;default : printf("Please enter a, b, c, d, or q.\n"); menu();continue; // go to beginning of loop}printf("Enter the number of hoursworked this week: "); scanf("%lf",&hours); if (hours <= BASEHRS)gross = hours * pay; elsegross = BASEHRS * pay + (hours -BASEHRS) * pay * OVERTIME; if (gross <=AMT1) taxes = gross * RATE1; else if(gross <= AMT1 + AMT2)taxes = AMT1 * RATE1 + (gross -AMT1) * RATE2; elsetaxes = AMT1 * RATE1 + AMT2 * RATE2 + (gross - AMT1 - AMT2) * RATE3; net = gross - taxes;printf("gross: $%.2f; taxes: $%.2f; net:$%.2f\n", gross, taxes, net);menu(); }printf("Done.\n");return;}void menu(void){printf("********************************************************""*********\n");printf("Enter the letter corresponding to the desired pay rate"" or action:\n");printf("a) $%4.2f/hr b) $%4.2f/hr\n", BASEPAY1, BASEPAY2);printf("c) $%5.2f/hr d)$%5.2f/hr\n", BASEPAY3,BASEPAY4); printf("q) quit\n");printf("************************************ ********************""*********\n");}int getfirst(void){intch;ch =getchar();while(isspace(ch))ch =getchar();while(getchar() !='\n')continue;return ch;}Chapter 9 Programming Exercises PE 9--‐1/* Programming Exercise 9-1 */#include <stdio.h>doublemin(double,double); intmain(void){double x, y;printf("Enter two numbers(q to quit): "); while(scanf("%lf %lf", &x, &y)== 2){ printf("The smaller numberis %f.\n", min(x,y));printf("Next two values (q to quit): ");}printf("Bye!\n");return;}double min(double a, double b){return a < b ? a : b;}/* alternative implementationdouble min(doublea, double b){if(a<b)return a;elsereturnb;}*/PE 9--‐3/* Programming Exercise 9-3 */ #include <stdio.h>void chLineRow(char ch,int c, int r); int main(void) { char ch; int col, row; printf("Enter a character (#to quit): "); while ( (ch = getchar()) != '#'){ if(ch =='\n')continue;printf("Enter number of columns and number of rows: "); if (scanf("%d %d",&col, &row) != 2) break; chLineRow(ch, col, row);printf("\nEnter next character (# to quit): "); }printf("Bye!\n");return;}// start rows and colsat 0 voidchLineRow(char ch,int c, int r){int col, row;for (row = 0; row < r ; row++){for (col = 0; col <c; col++)putchar(ch);putchar('\n');}return;}PE 9--‐5/* Programming Exercise 9-5 */#include <stdio.h>void larger_of(double *p1,double *p2); intmain(void){double x, y;printf("Enter two numbers(q to quit): "); while(scanf("%lf %lf", &x, &y)== 2){larger_of(&x, &y);printf("The modified values are %f and %f.\n", x, y); printf("Next two values (q to quit): ");}printf("Bye!\n");return;}void larger_of(double *p1, double *p2) {if(*p1 >*p2)*p2=*p1;else*p1=*p2;}// alternatively:/*void larger_of(double *p1, double *p2) {*p1= *p2 = *p1 > *p2 ? *p1 : *p2;}*/PE 9--‐8/* ProgrammingExercise 9-8 */#include <stdio.h>double power(double a, int b); /* ANSI prototype */ int main(void) { double x,xpow; int n; printf("Enter a number and the integer power"); printf(" to which\nthe number will be raised.Enter q"); printf(" to quit.\n"); while (scanf("%lf%d", &x, &n) == 2){ xpow = power(x,n); /* function call */ printf("%.3g to the power %d is %.5g\n", x, n, xpow); printf("Enter next pair of numbers or q to quit.\n");} printf("Hope you enjoyed this power trip -- bye!\n"); return 0;} double power(double a, int b) /* function definition */{doublepow=1;inti;if(b==0){if(a==0)。
Chapter 2 Programming ExercisesPE 2-‐1/* Programming Exercise 2-1 */#include <stdio.h> intmain(void){ printf("Gustav Mahler\n");printf("Gustav\nMahler\n");printf("Gustav ");printf("Mahler\n"); return 0;}PE 2-‐3/* Programming Exercise 2-3 */#include <stdio.h> intmain(void){ int ageyears; /* age in years */int agedays; /* age in days *//* large ages may require the long type */ageyears = 101; agedays = 365 * ageyears;printf("An age of %d years is %d days.\n", ageyears, agedays); return 0;}PE 2-‐4/* Programming Exercise 2-4 */#include <stdio.h>void jolly(void); voiddeny(void); intmain(void){ jolly(); jolly();jolly();deny();return 0; }void jolly(void){printf("For he's a jolly good fellow!\n");}void deny(void){printf("Which nobody can deny!\n");}PE 2-‐6/* Programming Exercise 2-6 */#include <stdio.h> intmain(void){ inttoes;toes = 10;printf("toes = %d\n", toes);printf("Twice toes = %d\n", 2 * toes); printf("toessquared = %d\n", toes * toes); return 0;}/* or create two more variables, set them to 2 * toes and toes * toes */PE 2-‐8/* Programming Exercise 2-8 */#include <stdio.h>void one_three(void);void two(void); intmain(void){printf("starting now:\n");one_three(); printf("done!\n");return 0;}void one_three(void){printf("one\n");two();printf("three\n");}void two(void){printf("two\n");}Chapter 3 Programming ExercisesPE 3-‐2/* Programming Exercise 3-2 */#include <stdio.h> intmain(void){int ascii;printf("Enter an ASCII code: "); scanf("%d",&ascii);printf("%d is the ASCII code for %c.\n", ascii, ascii); return 0;}PE 3-‐4/* Programming Exercise 3-4 */#include <stdio.h> intmain(void){ floatnum;printf("Enter a floating-point value: "); scanf("%f",&num);printf("fixed-point notation: %f\n", num);printf("exponential notation: %e\n", num);printf("p notation: %a\n", num); return 0;}PE 3-‐6/* Programming Exercise 3-6 */#include <stdio.h> intmain(void){float mass_mol = 3.0e-23; /* mass of water molecule in grams */ floatmass_qt = 950; /* mass of quart of water in grams */ float quarts;float molecules;printf("Enter the number of quarts of water: "); scanf("%f",&quarts);molecules = quarts * mass_qt / mass_mol;printf("%f quarts of water contain %e molecules.\n", quarts, molecules); return 0;}Chapter 4 Programming ExercisesPE 4-‐1/* Programming Exercise 4-1 */#include <stdio.h> intmain(void){ charfname[40]; charlname[40];printf("Enter your first name: ");scanf("%s", fname); printf("Enter yourlast name: "); scanf("%s", lname);printf("%s, %s\n", lname, fname); return0;}PE 4-‐4/* Programming Exercise 4-4 */#include <stdio.h> intmain(void){ floatheight; charname[40];printf("Enter your height in inches: ");scanf("%f", &height); printf("Enter your name:"); scanf("%s", name);printf("%s, you are %.3f feet tall\n", name, height / 12.0);return 0;}PE 4-‐7/* Programming Exercise 4-7 */#include <stdio.h>#include <float.h> intmain(void){ float ot_f = 1.0 / 3.0;double ot_d = 1.0 / 3.0;printf(" float values: ");printf("%.4f %.12f %.16f\n", ot_f, ot_f, ot_f); printf("doublevalues: ");printf("%.4f %.12f %.16f\n", ot_d, ot_d, ot_d);printf("FLT_DIG: %d\n", FLT_DIG); printf("DBL_DIG: %d\n",DBL_DIG); return 0;}Chapter 5 Programming ExercisesPE 5-‐1/* Programming Exercise 5-1 */#include <stdio.h> intmain(void){ const int minperhour = 60;int minutes, hours, mins;printf("Enter the number of minutes to convert: ");scanf("%d", &minutes); while (minutes > 0 ){ hours = minutes /minperhour; mins = minutes %minperhour;printf("%d minutes = %d hours, %d minutes\n", minutes, hours, mins); printf("Enter next minutes value (0 to quit): "); scanf("%d", &minutes);}printf("Bye\n");return 0;}PE 5-‐3/* Programming Exercise 5-3 */#include <stdio.h> intmain(void){ const int daysperweek = 7;int days, weeks, day_rem;printf("Enter the number of days: ");scanf("%d", &days); while (days > 0){ weeks = days / daysperweek;day_rem = days % daysperweek;printf("%d days are %d weeks and %d days.\n",days, weeks, day_rem);printf("Enter the number of days (0 or less to end): "); scanf("%d", &days);}printf("Done!\n");return 0;}PE 5-‐5/* Programming Exercise 5-5 */ #include<stdio.h>int main(void) /* finds sum of first n integers */{int count, sum;int n;printf("Enter the upper limit: ");scanf("%d", &n); count = 0;sum = 0; while (count++< n) sum = sum + count; printf("sum= %d\n", sum); return 0;}PE 5-‐7/* Programming Exercise 5-7 */#include <stdio.h> voidshowCube(double x);int main(void) /* finds cube of entered number */{ doubleval;printf("Enter a floating-point value: ");scanf("%lf", &val); showCube(val);return 0; }void showCube(double x){printf("The cube of %e is %e.\n", x, x*x*x );}Chapter 6 Programming ExercisesPE 6-‐1/* pe6-1.c *//* this implementation assumes the character codes *//* are sequential, as they are in ASCII. */#include <stdio.h> #define SIZE26 int main( void ) { charlcase[SIZE]; int i; for(i = 0; i < SIZE; i++)lcase[i] = 'a' + i; for (i = 0; i< SIZE; i++) printf("%c",lcase[i]); printf("\n");return 0;}PE 6-‐3/* pe6-3.c *//* this implementation assumes the character codes *//* are sequential, as they are in ASCII. */#include <stdio.h> intmain( void ){ char let ='F'; char start;char end;for (end = let; end >= 'A'; end--){for (start = let; start >= end; start--) printf("%c", start); printf("\n");}return 0;}PE 6-‐6/* pe6-6.c */ #include<stdio.h> int main( void ){ int lower, upper, index;int square, cube;printf("Enter starting integer: ");scanf("%d", &lower); printf("Enter endinginteger: "); scanf("%d", &upper);printf("%5s %10s %15s\n", "num", "square", "cube"); for (index = lower; index <= upper; index++){ square = index *index; cube = index * square;printf("%5d %10d %15d\n", index, square, cube);}return 0;}PE 6-‐8/* pe6-8.c */ #include<stdio.h> int main( void ){ double n,m; double res;printf("Enter a pair of numbers: ");while (scanf("%lf %lf", &n, &m) == 2){res = (n - m) / (n * m);printf("(%.3g - %.3g)/(%.3g*%.3g) = %.5g\n", n, m, n, m, res);printf("Enter next pair (non-numeric to quit): ");}return 0;}PE 6-‐11/* pe6-11.c */#include<stdio.h> #defineSIZE 8 intmain( void ){ intvals[SIZE]; int i;printf("Please enter %d integers.\n", SIZE);for (i = 0; i < SIZE; i++) scanf("%d", &vals[i]);printf("Here, in reverse order, are the values you entered:\n"); for(i = SIZE - 1; i >= 0; i--) printf("%d ", vals[i]); printf("\n"); return 0;}PE 6-‐13/* pe6-13.c *//* This version starts with the 0 power */#include<stdio.h> #defineSIZE 8 intmain( void ){int twopows[SIZE];int i;int value = 1; /* 2 to the 0 */for (i = 0; i < SIZE; i++){ twopows[i] =value; value *= 2;}i = 0;do {printf("%d ", twopows[i]);i++; } while (i < SIZE);printf("\n");return 0;}PE 6-‐14/* pe-14.c *//* Programming Exercise 6-14 */#include<stdio.h> #defineSIZE 8 int main(void){ double arr[SIZE];double arr_cumul[SIZE]; inti;printf("Enter %d numbers:\n", SIZE);for (i = 0; i < SIZE; i++){printf("value #%d: ", i + 1);scanf("%lf", &arr[i]); /* or scanf("%lf",arr + i); */}arr_cumul[0] = arr[0]; /* set first element */ for (i = 1; i < SIZE; i++)arr_cumul[i] = arr_cumul[i-1] + arr[i];for (i = 0; i < SIZE; i++)printf("%8g ", arr[i]); printf("\n");for (i = 0; i < SIZE; i++)printf("%8g ", arr_cumul[i]);printf("\n");return 0;}PE 6-‐16/* pe6-16.c */#include <stdio.h>#define RATE_SIMP 0.10#define RATE_COMP 0.05#define INIT_AMT 100.0 intmain( void ){double daphne = INIT_AMT;double deidre = INIT_AMT; intyears = 0;while (deidre <= daphne){ daphne += RATE_SIMP *INIT_AMT; deidre += RATE_COMP * deidre;++years; }printf("Investment values after %d years:\n", years);printf("Daphne: $%.2f\n", daphne); printf("Deidre: $%.2f\n",deidre); return 0;}Chapter 7 Programming ExercisesPE 7-‐1/* Programming Exercise 7-1 */#include <stdio.h> int main(void){ char ch;int sp_ct = 0;int nl_ct = 0;int other = 0;while ((ch =getchar()) != '#'){if (ch == ' ')sp_ct++; else if (ch =='\n') nl_ct++;else other++;}printf("spaces: %d, newlines: %d, others: %d\n", sp_ct, nl_ct, other);return 0;}PE 7-‐3/* Programming Exercise 7-3 */#include <stdio.h> intmain(void){ int n; doublesumeven = 0.0; int ct_even= 0; double sumodd = 0.0;int ct_odd = 0;while (scanf("%d", &n) == 1 && n != 0){if (n % 2 == 0){sumeven += n;++ct_even;}else // n % 2 is either 1 or -1{sumodd += n;++ct_odd;}}printf("Number of evens: %d", ct_even); if(ct_even > 0)printf(" average: %g", sumeven / ct_even);putchar('\n');printf("Number of odds: %d", ct_odd); if(ct_odd > 0)printf(" average: %g", sumodd / ct_odd);putchar('\n'); printf("\ndone\n");return 0;}PE 7-‐5/* Programming Exercise 7-5 */#include <stdio.h> intmain(void){ char ch;int ct1 = 0;int ct2 = 0;while ((ch =getchar()) != '#'){switch(ch){case '.' : putchar('!');++ct1; break;case '!' : putchar('!');putchar('!'); ++ct2; break; default : putchar(ch);}}printf("%d replacement(s) of . with !\n", ct1); printf("%d replacement(s) of ! with !!\n", ct2);return 0;}PE 7-‐7// Programming Exercise 7-7#include <stdio.h>#define BASEPAY 10 // $10 per hour#define BASEHRS 40 // hours at basepay#define OVERTIME 1.5 // 1.5 time#define AMT1 300 // 1st rate tier#define AMT2 150 // 2st rate tier#define RATE1 0.15 // rate for 1st tier#define RATE2 0.20 // rate for 2nd tier #defineRATE3 0.25 // rate for 3rd tier int main(void){double hours;double gross; doublenet; double taxes;printf("Enter the number of hours worked this week: ");scanf("%lf", &hours); if (hours <= BASEHRS) gross = hours* BASEPAY; elsegross = BASEHRS * BASEPAY + (hours - BASEHRS) * BASEPAY * OVERTIME; if(gross <= AMT1) taxes = gross * RATE1; else if (gross <= AMT1 + AMT2) taxes = AMT1 * RATE1 + (gross - AMT1) * RATE2; elsetaxes = AMT1 * RATE1 + AMT2 * RATE2 + (gross - AMT1 - AMT2) * RATE3; net = gross - taxes;printf("gross: $%.2f; taxes: $%.2f; net: $%.2f\n", gross, taxes, net);return 0;}PE 7-‐9/* Programming Exercise 7-9 */#include <stdio.h>#include <stdbool.h> intmain(void){int limit;int num; intdiv;bool numIsPrime; // use int if stdbool.h not availableprintf("Enter a positive integer: "); while(scanf("%d", &limit) == 1 && limit > 0){if (limit > 1)printf("Here are the prime numbers up through %d\n", limit);elseprintf("No primes.\n");for (num = 2; num <= limit; num++){for (div = 2, numIsPrime = true; (div * div) <= num; div++)if (num % div == 0) numIsPrime = false; if (numIsPrime)printf("%d is prime.\n", num);}printf("Enter a positive integer (q to quit): ");}printf("Done!\n");return 0;}PE 7-‐11/* pe7-11.c *//* Programming Exercise 7-11 */#include <stdio.h>#include <ctype.h> intmain(void){const double price_artichokes = 2.05;const double price_beets = 1.15; constdouble price_carrots = 1.09; const doubleDISCOUNT_RATE = 0.05; const double under5 =6.50; const double under20 = 14.00; constdouble base20 = 14.00; const double extralb= 0.50;char ch;double lb_artichokes = 0;double lb_beets = 0; doublelb_carrots = 0; double lb_temp;double lb_total;doublecost_artichokes; doublecost_beets; doublecost_carrots; doublecost_total; doublefinal_total; double discount;double shipping;printf("Enter a to buy artichokes, b for beets, ");printf("c for carrots, q to quit: "); while ((ch =getchar()) != 'q' && ch != 'Q'){ if (ch == '\n')continue; while (getchar() !='\n') continue; ch =tolower(ch); switch (ch){case 'a' : printf("Enter pounds of artichokes: ");scanf("%lf", &lb_temp); lb_artichokes += lb_temp; break;case 'b' : printf("Enter pounds of beets: ");scanf("%lf", &lb_temp); lb_beets += lb_temp; break;case 'c' : printf("Enter pounds of carrots: "); scanf("%lf", &lb_temp); lb_carrots += lb_temp; break;default : printf("%c is not a valid choice.\n", ch);}printf("Enter a to buy artichokes, b for beets, "); printf("c forcarrots, q to quit: ");}cost_artichokes = price_artichokes * lb_artichokes; cost_beets= price_beets * lb_beets; cost_carrots = price_carrots * lb_carrots;cost_total = cost_artichokes + cost_beets + cost_carrots; lb_total =lb_artichokes + lb_beets + lb_carrots; if (lb_total <= 0)shipping = 0.0; else if (lb_total < 5.0) shipping = under5;else if (lb_total < 20) shipping = under20; elseshipping = base20 + extralb * lb_total; if(cost_total > 100.0)discount = DISCOUNT_RATE * cost_total;else discount = 0.0;final_total = cost_total + shipping - discount; printf("Yourorder:\n");printf("%.2f lbs of artichokes at $%.2f per pound:$ %.2f\n",lb_artichokes, price_artichokes, cost_artichokes); printf("%.2f lbs ofbeets at $%.2f per pound: $%.2f\n", lb_beets, price_beets,cost_beets); printf("%.2f lbs of carrots at $%.2f per pound: $%.2f\n", lb_carrots, price_carrots, cost_carrots); printf("Total cost ofvegetables: $%.2f\n", cost_total); if (cost_total > 100)printf("Volume discount: $%.2f\n", discount);printf("Shipping: $%.2f\n", shipping); printf("Totalcharges: $%.2f\n", final_total); return 0; }Chapter 8 Programming ExercisesPE 8-‐1/* Programming Exercise 8-1 */#include <stdio.h>int main(void) { int ch; intct = 0; while ((ch =getchar()) != EOF) ct++;printf("%d characters read\n", ct);return 0;}PE 8-‐3/* Programming Exercise 8-3 *//* Using ctype.h eliminates need to assume consecutive coding */#include <stdio.h> #include<ctype.h> int main(void){ int ch; unsigned longuct = 0; unsigned long lct= 0; unsigned long oct = 0;while ((ch = getchar()) != EOF)if (isupper(ch)) uct++;else if (islower(ch)) lct++;else oct++;printf("%lu uppercase characters read\n", uct); printf("%lulowercase characters read\n", lct); printf("%lu other charactersread\n", oct);return 0;}/* or you could use if(ch >= 'A' && ch <= 'Z')uct++;else if (ch >= 'a' && ch <= 'z')lct++; else oct++;*/PE 8-‐5/* Programming Exercise 8-5 *//* binaryguess.c -- an improved number-guesser *//* but relies upon truthful, correct responses */#include <stdio.h> #include<ctype.h> int main(void) { int high= 100; int low = 1; int guess =(high + low) / 2; char response;printf("Pick an integer from 1 to 100. I will try to guess ");printf("it.\nRespond with a y if my guess is right, with"); printf("\na h if it ishigh, and with an l if it is low.\n"); printf("Uh...is your number %d?\n", guess);while ((response = getchar()) != 'y') /* get response */{if (response == '\n')continue;if (response != 'h' && response != 'l'){printf("I don't understand that response. Please enter h for\n"); printf("high, l for low, or y for correct.\n"); continue;}if (response == 'h')high = guess - 1; else if(response == 'l') low =guess + 1; guess = (high + low)/ 2;printf("Well, then, is it %d?\n", guess);}printf("I knew I could do it!\n"); return 0;}PE 8-‐7/* Programming Exercise 8-7 */#include <stdio.h>#include <ctype.h>#include <stdio.h>#define BASEPAY1 8.75 // $8.75 per hour#define BASEPAY2 9.33 // $9.33 per hour#define BASEPAY3 10.00 // $10.00 per hour#define BASEPAY4 11.20 // $11.20 per hour#define BASEHRS 40 // hours at basepay#define OVERTIME 1.5 // 1.5 time#define AMT1 300 // 1st rate tier#define AMT2 150 // 2st rate tier#define RATE1 0.15 // rate for 1st tier#define RATE2 0.20 // rate for 2nd tier#define RATE3 0.25 // rate for 3rd tier intgetfirst(void); void menu(void); int main(void){ doublehours; doublegross; double net;double taxes;double pay; charresponse;menu();while ((response = getfirst()) != 'q'){if (response == '\n') /* skip over newlines */continue;response = tolower(response); /* accept A as a, etc. */ switch (response){case 'a': pay = BASEPAY1; break;case 'b': pay = BASEPAY2; break; case 'c':pay = BASEPAY3; break; case 'd': pay = BASEPAY4;break;default : printf("Please enter a, b, c, d, or q.\n"); menu();continue; // go to beginning of loop}printf("Enter the number of hours worked this week: ");scanf("%lf", &hours); if (hours <= BASEHRS) gross =hours * pay; elsegross = BASEHRS * pay + (hours - BASEHRS) * pay * OVERTIME;if (gross <= AMT1) taxes = gross * RATE1; else if (gross <= AMT1+ AMT2)taxes = AMT1 * RATE1 + (gross - AMT1) * RATE2; elsetaxes = AMT1 * RATE1 + AMT2 * RATE2 + (gross - AMT1 - AMT2) * RATE3; net = gross - taxes;printf("gross: $%.2f; taxes: $%.2f; net: $%.2f\n", gross, taxes, net); menu(); }printf("Done.\n");return 0;}void menu(void){printf("********************************************************""*********\n");printf("Enter the letter corresponding to the desired pay rate"" or action:\n");printf("a) $%4.2f/hr b) $%4.2f/hr\n", BASEPAY1,BASEPAY2);printf("c) $%5.2f/hr d) $%5.2f/hr\n", BASEPAY3, BASEPAY4); printf("q) quit\n");printf("********************************************************""*********\n");}int getfirst(void){ int ch;ch = getchar();while (isspace(ch)) ch =getchar(); while(getchar() != '\n')continue; return ch;}Chapter 9 Programming ExercisesPE 9-‐1/* Programming Exercise 9-1 */#include <stdio.h>double min(double, double); intmain(void){double x, y; printf("Enter two numbers(q to quit): "); while (scanf("%lf %lf", &x, &y) ==2){ printf("The smaller number is %f.\n", min(x,y));printf("Next two values (q to quit): ");}printf("Bye!\n");return 0;}double min(double a, double b){return a < b ? a : b;}/* alternative implementation doublemin(double a, double b){ if (a < b)return a; elsereturn b;}*/PE 9-‐3/* Programming Exercise 9-3 */#include <stdio.h>void chLineRow(char ch, int c, int r); intmain(void){ char ch; int col, row;printf("Enter a character (# to quit): "); while( (ch = getchar()) != '#'){ if (ch =='\n') continue;printf("Enter number of columns and number of rows: ");if (scanf("%d %d", &col, &row) != 2) break;chLineRow(ch, col, row);printf("\nEnter next character (# to quit): ");}printf("Bye!\n");return 0;}// start rows and cols at 0 voidchLineRow(char ch, int c, int r){int col, row;for (row = 0; row < r ; row++){for (col = 0; col < c; col++)putchar(ch); putchar('\n');}return;}PE 9-‐5/* Programming Exercise 9-5 */#include <stdio.h>void larger_of(double *p1, double *p2); intmain(void){double x, y; printf("Enter two numbers(q to quit): "); while (scanf("%lf %lf", &x, &y) ==2){larger_of(&x, &y);printf("The modified values are %f and %f.\n", x, y); printf("Next two values (q to quit): ");}printf("Bye!\n");return 0;}void larger_of(double *p1, double *p2){ if (*p1 >*p2) *p2 =*p1; else*p1 = *p2;}// alternatively:/*void larger_of(double *p1, double *p2){*p1= *p2 = *p1 > *p2 ? *p1 : *p2;}*/PE 9-‐8/* Programming Exercise 9-8 */ #include<stdio.h>double power(double a, int b); /* ANSI prototype */ intmain(void) { double x, xpow; int n; printf("Enter a number andthe integer power"); printf(" to which\nthe number will be raised.Enter q"); printf(" to quit.\n"); while (scanf("%lf%d", &x, &n)== 2){ xpow = power(x,n); /* function call */ printf("%.3g to the power %d is %.5g\n", x, n, xpow);printf("Enter next pair of numbers or q to quit.\n");} printf("Hope you enjoyed this power trip -- bye!\n");return 0;} double power(double a, int b) /* function definition */{ double pow =1; int i; if(b == 0){ if (a == 0)printf("0 to the 0 undefined; using 1 as the value\n"); pow = 1.0; } else if (a == 0) pow = 0.0; else if (b > 0)for(i = 1; i <= b; i++) pow *= a; else /* b < 0 */ pow = 1.0 / power(a, - b);return pow; /* return the value of pow */}PE 9-‐10/* Programming Exercise 9-10 */ #include<stdio.h> void to_base_n(int x, int base); intmain(void) { int number; int b; int count;printf("Enter an integer (q to quit):\n"); while(scanf("%d", &number) == 1){ printf("Enter number base (2-10): ");while ((count = scanf("%d", &b))== 1&& (b < 2 || b > 10)){printf("base should be in the range 2-10: ");} if(count != 1)break;printf("Base %d equivalent: ", b);to_base_n(number, b); putchar('\n');printf("Enter an integer (q to quit):\n");}printf("Done.\n");return 0;}void to_base_n(int x, int base) /* recursive function */{ int r; r = x % base; if(x >= base) to_base_n(x / base,base); putchar('0' + r); return;}Chapter 10 Programming ExercisesPE 10-‐1/* Programming Exercise 10-1 */#include <stdio.h>#define MONTHS 12 // number of months in a year#define YRS 5 // number of years of data int main(void){// initializing rainfall data for 2010 - 2014 constfloat rain[YRS][MONTHS] = {{4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},{8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3},{9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4},{7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2},{7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2}}; int year,month; float subtot,total;printf(" YEAR RAINFALL (inches)\n");for (year = 0, total = 0; year < YRS; year++){ /* for each year, sum rainfall for each month */for (month = 0, subtot = 0; month < MONTHS; month++) subtot +=*(*(rain + year) + month); printf("%5d %15.1f\n", 2010 + year, subtot);total += subtot; /* total for all years */}printf("\nThe yearly average is %.1f inches.\n\n", total/YRS);printf("MONTHLY AVERAGES:\n\n");printf(" Jan Feb Mar Apr May Jun Jul Aug Sep Oct "); printf(" Nov Dec\n");for (month = 0; month < MONTHS; month++){ /* for each month, sum rainfall over years */ for (year = 0, subtot =0; year < YRS; year++) subtot += *(*(rain + year) + month); printf("%4.1f ", subtot/YRS);}printf("\n");return 0;}PE 10-‐3/* Programming Exercise 10-3 */#include <stdio.h>#define LEN 10int max_arr(const int ar[], int n);void show_arr(const int ar[], int n);int main(void){int orig[LEN] = {1,2,3,4,12,6,7,8,9,10}; intmax;show_arr(orig, LEN); max =max_arr(orig, LEN); printf("%d = largestvalue\n", max);return 0;}int max_arr(const int ar[], int n){ int i; intmax = ar[0];/* don't use 0 as initial max value -- fails if all array values are neg */for (i = 1; i < n; i++)if (max < ar[i]) max= ar[i]; return max;}void show_arr(const int ar[], int n){ int i; for (i =0; i < n; i++) printf("%d", ar[i]); putchar('\n');}PE 10-‐5/* Programming Exercise 10-5 */#include <stdio.h>#define LEN 10double max_diff(const double ar[], int n); voidshow_arr(const double ar[], int n);。
Chapter 2// pe2-2.cpp#include <iostream>int main(void){using namespace std;cout << "Enter a distance in furlongs: "; double furlongs;cin >> furlongs;double feet;feet = 220 * furlongs;cout << furlongs << " furlongs = "<< feet << " feet\n";return 0;}// pe2-3.cpp#include <iostream>using namespace std;void mice();void run();int main(){mice();mice();run();run();return 0;}void mice(){cout << "Three blind mice\n";}void run(){cout << "See how they run\n";}// pe2-4.cpp#include <iostream>double C_to_F(double);int main(){using namespace std;cout << "Enter a temperature in Celsius: ";double C;cin >> C;double F;F = C_to_F(C);cout << C << " degrees Celsius = "<< F << " degrees Fahrenheit\n";return 0;}double C_to_F(double temp){return 1.8 * temp + 32.0;}Chapter 3// pe3-1.cpp#include <iostream>const int Inch_Per_Foot = 12;int main(void){using namespace std;// Note: some environments don't support the backspace character cout << "Please enter your height in inches: ___/b/b/b ";int ht_inch;cin >> ht_inch;int ht_feet = ht_inch / Inch_Per_Foot;int rm_inch = ht_inch % Inch_Per_Foot;cout << "Your height is " << ht_feet << " feet, ";cout << rm_inch << " inch(es).\n";return 0;}// pe3-3.cpp#include <iostream>const double MINS_PER_DEG = 60.0;const double SECS_PER_MIN = 60.0;int main(){using namespace std;int degrees;int minutes;int seconds;double latitude;cout << "Enter a latitude in degrees, minutes, and seconds:\n";cout << "First, enter the degrees: ";cin >> degrees;cout << "Next, enter the minutes of arc: ";cin >> minutes;cout << "Finally, enter the seconds of arc: ";cin >> seconds;latitude = degrees + (minutes + seconds / SECS_PER_MIN)/MINS_PER_DEG; cout << degrees << " degrees, " << minutes << " minutes, "<< seconds << " seconds = " << latitude << " degrees\n";return 0;}// pe3-5.cpp#include <iostream>int main(void){using namespace std;cout << "How many miles have you driven your car? ";float miles;cin >> miles;cout << "How many gallons of gasoline did the car use? ";float gallons;cin >> gallons;cout << "Your car got " << miles / gallons;cout << " miles per gallon.\n";return 0;}// pe3-6.cpp#include <iostream>const double KM100_TO_MILES = 62.14;const double LITERS_PER_GALLON = 3.875;int main ( void ){using namespace std;double euro_rating;double us_rating;cout << "Enter fuel consumption in liters per 100 km: ";cin >> euro_rating;// divide by LITER_PER_GALLON to get gallons per 100-km// divide by KM100_TO_MILES to get gallons per mile// invert result to get miles per gallonus_rating = (LITERS_PER_GALLON * KM100_TO_MILES) / euro_rating;cout << euro_rating << " liters per 100 km is ";cout << us_rating << " miles per gallon.\n";return 0;}Chapter 4// pe4-2.cpp -- storing strings in string objects#include <iostream>#include <string>int main(){using namespace std;string name;string dessert;cout << "Enter your name:\n";getline(cin, name); // reads through newlinecout << "Enter your favorite dessert:\n";getline(cin, dessert);cout << "I have some delicious " << dessert;cout << " for you, " << name << ".\n";return 0;}// pe4-3.cpp -- storing strings in char arrays#include <iostream>#include <cstring>const int SIZE = 20;int main(){using namespace std;char firstName[SIZE];char lastName[SIZE];char fullName[2*SIZE + 1];cout << "Enter your first name: ";cin >> firstName;cout << "Enter your last name: ";cin >> lastName;strncpy(fullName,lastName,SIZE);strcat(fullName, ", ");strncat(fullName, firstName, SIZE);fullName[SIZE - 1] = '\0';cout << "Here's the information in a single string: " << fullName << endl;return 0;}// pe4-5.cpp// a candybar structurestruct CandyBar {char brand[40];double weight;int calories;};#include <iostream>int main(){using namespace std; //introduces namespace stdCandyBar snack = { "Mocha Munch", 2.3, 350 };cout << "Brand name: " << snack.brand << endl;cout << "Weight: " << snack.weight << endl;cout << "Calories: " << snack.calories << endl;return 0;}// p#include <iostream>const int Slen = 70;struct pizza {char name[Slen];float diameter;float weight;};int main(void){using namespace std;pizza pie;cout << "What is the name of the pizza company? ";cin.getline(, Slen);cout << "What is the diameter of the pizza in inches? "; cin >> pie.diameter;cout << "How much does the pizza weigh in ounces? ";cin >> pie.weight;cout << "Company: " << << "\n";cout << "Diameter: " << pie.diameter << " inches\n";cout << "Weight: " << pie.weight << " ounces\n";return 0;}Chapter 5// pe5-2.cpp#include <iostream>int main(void){using namespace std;double sum = 0.0;double in;cout << "Enter a number (0 to terminate) : ";cin >> in;while (in != 0) {sum += in;cout << "Running total = " << sum << "\n";cout << "Enter next number (0 to terminate) : ";cin >> in;}cout << "Bye!\n";return 0;}// pe5-4.cpp// book sales#include <iostream>const int MONTHS = 12;const char * months[MONTHS] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};int main(){using namespace std; //introduces namespace stdint sales[MONTHS];int month;cout << "Enter the monthly sales for \"C++ for Fools\":\n";for (month = 0; month < MONTHS; month++){cout << "Sales for " << months[month] << ": ";cin >> sales[month];}double total = 0.0;for (month = 0; month < MONTHS; month++)total += sales[month];cout << "Total sales: " << total << endl;return 0;}// pe5-6.cpp#include <iostream>struct car { char name[20]; int year;};int main(void){using namespace std;int n;cout << "How many cars do you wish to catalog?: ";cin >> n;while(cin.get() != '\n') // get rid of rest of line;car * pc = new car [n];int i;for (i = 0; i < n; i++){cout << "Car #" << (i + 1) << ":\n";cout << "Please enter the make: ";cin.getline(pc[i].name,20);cout << "Please enter the year made: ";cin >> pc[i].year;while(cin.get() != '\n') // get rid of rest of line ;}cout << "Here is your collection:\n";for (i = 0; i < n; i++)cout << pc[i].year << " " << pc[i].name << "\n";delete [] pc;return 0;}// pe5-7.cpp -- count words using C-style string#include <iostream>#include <cstring> // prototype for strcmp()const int STR_LIM = 50;int main(){using namespace std;char word[STR_LIM];int count = 0;cout << "Enter words (to stop, type the word done):\n";while (cin >> word && strcmp("done", word))++count;cout << "You entered a total of " << count << " words.\n"; return 0;}// pe5-9.cpp//nested loops#include <iostream>int main(){using namespace std; //introduces namespace stdint rows;int row;int col;int periods;cout << "Enter number of rows: ";cin >> rows;for (row = 1; row <= rows; row++){periods = rows - row;for (col = 1; col <= periods; col++)cout << '.';// col already has correct value for next loopfor ( ; col <= rows; col++)cout << '*';cout << endl;}return 0;}Chapter 6// pe6-1.cpp#include <iostream>#include <cctype>int main( ){using namespace std; //introduces namespace stdchar ch;cin.get(ch);while(ch != '@'){if (!isdigit(ch)){if (isupper(ch))ch = tolower(ch);else if (islower(ch))ch = toupper(ch);cout << ch;}cin.get(ch);}return 0;}// pe6-3.cpp#include <iostream>int main(void){using namespace std;cout << "Please enter one of the following choices:\n";cout << "c) carnivore p) pianist\n"<< "t) tree g) game\n";char ch;cin >> ch;while (ch != 'c' && ch != 'p' && ch != 't' && ch != 'g'){cout << "Please enter a c, p, t, or g: ";cin >> ch;}switch (ch){case 'c' : cout << "A cat is a carnivore.\n";break;case 'p' : cout << "Radu Lupu is a pianist.\n";break;case 't' : cout << "A maple is a tree.\n";break;case 'g' : cout << "Golf is a game.\n";break;default : cout << "The program shouldn't get here!\n"; }return 0;}// pe6-5.cpp// Neutronia taxation#include <iostream>const double LEV1 = 5000;const double LEV2 = 15000;const double LEV3 = 35000;const double RATE1 = 0.10;const double RATE2 = 0.15;const double RATE3 = 0.20;int main( ){using namespace std;double income;double tax;cout << "Enter your annual income in tvarps: ";cin >> income;if (income <= LEV1)tax = 0;else if (income <= LEV2)tax = (income - LEV1) * RATE1;else if (income <= LEV3)tax = RATE1 * (LEV2 - LEV1) + RATE2 * (income - LEV2); elsetax = RATE1 * (LEV2 - LEV1) + RATE2 * (LEV3 - LEV2)+ RATE3 * (income - LEV3);。
[ Viewing Hints ] [ Book Home Page ] [ Free Newsletter ][ Seminars ] [ Seminars on CD ROM ] [ Consulting ]Annotated Solution GuideRevision 1.0for Thinking in C++, 2nd edition, Volume 1by Chuck Allison©2001 MindView, Inc. All Rights Reserved.[ Previous Chapter ] [ Table of Contents ] Chapter 16(Exercises 16-1 through 16-4 are left to the reader.)16-1Implement the inheritance hierarchy in the OShape diagram in this chapter.16-2Modify the result of Exercise 1 from Chapter 15 to use the Stack and iterator in TStack2.h instead of an array of Shape pointers. Add destructors to the class hierarchy so you can see that the Shape objects are destroyed when the Stack goes out of scope.16-3Modify TPStash.h so that the increment value used by inflate( ) can be changed throughout the lifetime of a particular container object.16-4Modify TPStash.h so that the increment value used by inflate( ) automatically resizes itself to reduce the number of times it needs to be called. For example, each time it is called it could double the increment value for use in the next call. Demonstrate this functionality by reporting whenever an inflate( ) is called, and write test code in main( ).16-5Templatize the fibonacci( ) function on the type of value that it produces (so it can produce long, float, etc. instead of just int).Solution://: S16:fibonacci.cpp#include <iostream>#include <cassert>#include <cstddef> // For size_tusing namespace std;template<typename T>T Fib(const T& n) {const size_t sz = 100;static T f[sz]; // Initialized to zerostatic size_t nFilled = 2;f[0] = f[1] = 1; // T must be convertible from intsize_t int_n = size_t(n);assert(n < sz);while (int_n >= nFilled) {cout << "growing to " << n << " (sizeof(T) == "<< sizeof(T) << ")\n";f[nFilled] = f[nFilled-1] + f[nFilled-2];nFilled++;}return f[int_n];}int main() {for (double x = 8.0; x >= 0.0; --x)cout << "Fib(" << x << ") == " << Fib(x) << endl; }/* Output:growing to 8 (sizeof(T) == 8)growing to 8 (sizeof(T) == 8)growing to 8 (sizeof(T) == 8)growing to 8 (sizeof(T) == 8)growing to 8 (sizeof(T) == 8)growing to 8 (sizeof(T) == 8)growing to 8 (sizeof(T) == 8)Fib(8) == 34Fib(7) == 21Fib(6) == 13Fib(5) == 8Fib(4) == 5Fib(3) == 3Fib(2) == 2Fib(1) == 1Fib(0) == 1*////:~For this problem to make sense the type T needs to be convertible to a size_t, since it’s used as an index. It must also be convertible from int, so we can assign 0 and 1 as the seed values. I inserted a trace statement in the loop that extends the array so you can see when it executes, and included the sizeof(T) so you can verify that a double is being used in this example. I printed it backwards so the array is grown only once (iterating 7 times, of course). To be able to templatize only on the return value (not the index argument), you need a special template feature discussed in V olume 2 (“explicit function template specialization”). To whet your appetite for fancy template features, here’s how it’s done://: S16:SpecializeReturn.cpp#include <iostream>#include <cassert>#include <cstddef> // For size_tusing namespace std;template<typename T>T Fib(size_t n) {const size_t sz = 100;static T f[sz]; // Initialized to zerostatic size_t nFilled = 2;f[0] = f[1] = 1; // T must be convertible from int assert(n < sz);while (n >= nFilled) {cout << "growing to " << n << " (sizeof(T) == "<< sizeof(T) << ")\n";f[nFilled] = f[nFilled-1] + f[nFilled-2];nFilled++;}return f[n];}int main() {for (size_t x = 9; x > 0; --x)cout << "Fib(" << x << ") == " << Fib<double>(x-1)<< endl;}/* Output:(same as before)*////:~The appearance of <double> in the call to Fib is needed because Fib’s argument is fixed (i.e., not a template argument), and there is therefore no other way to tell the compiler which version to instantiate. I had to change the loop limits too since a size_t can’t go negative and I wanted to include 0.(Exercises 16-6 through 16-10 are left to the reader.)16-6Using the Standard C++ Library vector as an underlying implementation, create a Set template class that accepts only one of each type of object that you put into it. Make a nested iterator class that supports the “end sentinel” concept in this chapter. Write test code for your Set in main( ), and then substitute the Standard C++ Library set template to verify that the behavior is correct.16-7Modify AutoCounter.h so that it can be used as a member object inside any class whose creation and destruction you want to trace. Add a string member to hold the name of the class. Test this tool inside a class of your own.16-8Create a version of OwnerStack.h that uses a Standard C++ Library vector as its underlying implementation. You may need to look up some of the member functions of vector in order to do this (or just look at the <vector> header file).16-9Modify ValueStack.h so that it dynamically expands as you push( ) more objects and it runs out of space. Change ValueStackTest.cpp to test the new functionality.16-10Repeat Exercise 9 but use a Standard C++ Library vector as the internal implementation of the ValueStack. Notice how much easier this is.16-11Modify ValueStackTest.cpp so that it uses an STL vector instead of a Stack in main( ). Notice the run-time behavior: Does the vector automatically create a bunch of default objects when it is created?Solution:The files SelfCounter.h, SelfCounter.cpp, ValueStack.h and require.h are copied here from the book (so that the code extractor will conveniently put them into the solutions directory)://: S16:SelfCounter.h// From Thinking in C++, 2nd Edition, V olume 1#ifndef SELFCOUNTER_H#define SELFCOUNTER_H#include "ValueStack.h"#include <iostream>class SelfCounter {static int counter;int id;public:SelfCounter() : id(counter++) {std::cout << "Created: " << id << std::endl; }SelfCounter(const SelfCounter& rv) : id(rv.id){std::cout << "Copied: " << id << std::endl;}SelfCounter operator=(const SelfCounter& rv) { std::cout << "Assigned " << rv.id << " to "<< id << std::endl;return *this;}~SelfCounter() {std::cout << "Destroyed: "<< id << std::endl; }friend std::ostream& operator<<(std::ostream& os, const SelfCounter& sc){return os << "SelfCounter: " << sc.id;}};#endif // SELFCOUNTER_H ///:~//: S16:SelfCounter.cpp {O}// From Thinking in C++, 2nd Edition, V olume 1#include "SelfCounter.h"int SelfCounter::counter = 0; ///:~//: S16:ValueStack.h// From Thinking in C++, 2nd Edition, V olume 1 // Holding objects by value in a Stack#ifndef V ALUESTACK_H#define V ALUESTACK_H#include "../require.h"template<class T, int ssize = 100>class Stack {// Default constructor performs object// initialization for each element in array:T stack[ssize];int top;public:Stack() : top(0) {}// Copy-constructor copies object into array: void push(const T& x) {require(top < ssize, "Too many push()es");stack[top++] = x;}T peek() const { return stack[top]; }// Object still exists when you pop it;// it just isn't available anymore:T pop() {require(top > 0, "Too many pop()s");return stack[--top];}};#endif // V ALUESTACK_H ///:~//: :require.h// From Thinking in C++, 2nd Edition, V olume 1// Test for error conditions in programs// Local "using namespace std" for old compilers #ifndef REQUIRE_H#define REQUIRE_H#include <cstdio>#include <cstdlib>#include <fstream>#include <string>inline void require(bool requirement,const std::string& msg = "Requirement failed"){if (!requirement) {fputs(msg.c_str(), stderr);fputs("\n", stderr);exit(1);}}inline void requireArgs(int argc, int args,const std::string& msg ="Must use %d arguments") {using namespace std;if (argc != args + 1) {fprintf(stderr, msg.c_str(), args);fputs("\n", stderr);exit(1);}}inline void requireMinArgs(int argc, int minArgs, const std::string& msg ="Must use at least %d arguments") {if(argc < minArgs + 1) {fprintf(stderr, msg.c_str(), minArgs);fputs("\n", stderr);exit(1);}}inline void assure(std::ifstream& in,const std::string& filename = "") {using namespace std;if(!in) {fprintf(stderr, "Could not open file %s\n",filename.c_str());exit(1);}}inline void assure(std::ofstream& out,const std::string& filename = "") {using namespace std;if(!out) {fprintf(stderr, "Could not open file %s\n",filename.c_str());exit(1);}}#endif // REQUIRE_H ///:~Here is the solution://: S16:VectorTest.cpp//{L} SelfCounter#include "SelfCounter.h"#include <iostream>#include <vector>using namespace std;int main() {vector<SelfCounter> sc;for (int i = 0; i < 10; i++)sc.push_back(SelfCounter());// OK to peek(), result is a temporary:for (int k = 0; k < 10; k++) {cout << sc.back() << endl;sc.pop_back();}}///:~The output from the old and new versions of this program is too large to include here, but the important lesson is that the vector does NOT create needless elements like ValueStack did. It makes a copy of everything you insert into it, but it only adds the elements you explicitly request. ValueStack always fills out to the size indicated by its second template argument (100 in the book).(Exercises 16-12 through 16-17 are left to the reader.)16-12Modify TStack2.h so that it uses a Standard C++ Library vector as its underlying implementation. Make sure that you don’t change the interface, so that TStack2Test.cpp works unchanged.16-13Repeat Exercise 12 using a Standard C++ Library stack instead of a vector (you may need to look up information about the stack, or hunt through the <stack>header file).16-14Modify TPStash2.h so that it uses a Standard C++ Library vector as its underlying implementation. Make sure that you don’t change the interface, so that TPStash2Test.cpp works unchanged.16-15In IterIntStack.cpp, modify IntStackIter to give it an “end sentinel” constructor, and add operator== and operator!=. In main( ), use an iterator to move through the elements of the container until you reach the end sentinel.16-16Using TStack2.h, TPStash2.h, and Shape.h, instantiate Stack and PStash containers for Shape*,fill them each with an assortment of upcast Shape pointers, then use iterators to move through each container and call draw( ) for each object.16-17Templatize the Int class in TPStash2Test.cpp so that it holds any type of object (feel free to change the name of the class to something more appropriate).16-18Templatize the IntArray class in IostreamOperatorOverloading.cpp from Chapter 12, templatizing both the type of object that is contained and the size of the internal array.Solution://: S16:TemplateArray.cpp#include <iostream>#include <sstream>#include <cassert>#include <cstring>#include <cstddef> // For size_tusing namespace std;template<typename T, size_t N>class Array {T i[N];public:Array() { memset(i, 0, N*sizeof(*i)); }T& operator[](int x) {assert(x >= 0 && x < N);return i[x];}// Inline member template definitions// (Tends to work with most compilers):friend ostream&operator<<(ostream& os, const Array<T, N>& ia) { for (int j = 0; j < N; j++) {os << ia.i[j];if (j != N - 1)os << ", ";}os << endl;return os;}friend istream&operator>>(istream& is, Array<T, N>& ia){ for(int j = 0; j < N; j++)is >> ia.i[j];return is;}// Declarations for out-of line definitions// (Which don't work with many compilers):#if 0friend ostream&operator<<(ostream& os, const Array<T, N>& ia);friend istream&operator>>(istream& is, Array<T, N>& ia);#endif};// Out of line definitions:#if 0template<typename T, size_t N>ostream&operator<<(ostream& os, const Array<T, N>& ia) { for (int j = 0; j < N; j++) {os << ia.i[j];if (j != N - 1)os << ", ";}os << endl;return os;}template<typename T, size_t N>istream& operator>>(istream& is, Array<T, N>& ia){ for(int j = 0; j < N; j++)is >> ia.i[j];return is;}#endifint main() {stringstream input("47 34 56 92 103");Array<int, 5> I;input >> I;I[4] = -1; // Use overloaded operator[]cout << I;}/* Output:47, 34, 56, 92, -1*////:~You need to use the template type parameter (T) wherever the type of the array element applies. Remember also that the name of the class is Array<T, N>, not Array. Array is a template name. So wherever a class name is required, use the former. Be aware that some compilers don’t handle friend functions of templates very well, so you may have to define the bodies for those functions (the stream operators above) in situ, as is shown above. I’ve also included the commentedout-of-line definitions so that you can see the proper form.16-19Turn ObjContainer in NestedSmartPointer.cpp from Chapter 12 into a template. Test it with two different classes.Solution://: S16:NestedSmartPointerTemplate.cpp#include <iostream>#include <vector>#include <cassert>using namespace std;class Obj {static int i, j;public:void f() { cout << i++ << endl; }void g() { cout << j++ << endl; }};// Static member definitions:int Obj::i = 47;int Obj::j = 11;// Container:template<typename T>class ObjContainer {vector<T*> a;public:void add(T* obj) { a.push_back(obj); }class SmartPointer;friend class SmartPointer;class SmartPointer {ObjContainer& oc;unsigned int index;public:SmartPointer(ObjContainer& objc) : oc(objc) {index = 0;}// Return value indicates end of list:bool operator++() { // Prefixif(index >= oc.a.size()) return false;if(oc.a[++index] == 0) return false;return true;}bool operator++(int) { // Postfixreturn operator++(); // Use prefix version}T* operator->() const {assert(oc.a[index] != 0);return oc.a[index];}};// Function to produce a smart pointer that// points to the beginning of the ObjContainer: SmartPointer begin() {return SmartPointer(*this);}};int main() {const int sz = 10;Obj o[sz];ObjContainer<Obj> oc;for(int i = 0; i < sz; i++)oc.add(&o[i]); // Fill it upObjContainer<Obj>::SmartPointer sp = oc.begin(); do {sp->f(); // Pointer dereference operator callsp->g();} while(++sp);}/* Output:4711481249135014511552165317541855195620*////:~Again, you just need to replace the name of the contained type to the template parameter, and add the desired type to the definition in main( ). Don’t forget to use template syntax in the declaration of sp in main( ) also.(Exercises 16-20 through 16-21 are left to the reader.)16-20Modify C15:OStack.h and C15:OStackTest.cpp by templatizing class Stack so that it automatically multiply inherits from the contained class and from Object. The generated Stack should accept and produce only pointers of the contained type.16-21Repeat Exercise 20 using vector instead of Stack.16-22Inherit a class StringVector from vector<void*> and redefine the push_back( ) and operator[]member functions to accept and produce only string*(and perform the proper casting). Now create a template that will automatically make a container class to do the same thing for pointers to any type. This technique is often used to reduce code bloat from too many template instantiations.Solution://: S16:SafeVector.cpp//{-msc} VC++ only fakes reinterpret_cast#include <iostream>#include <vector>#include <string>#include <cstddef> // For size_tusing namespace std;template<typename T>class SafeVector : private vector<void*> {public:void push_back(T* s) {vector<void*>::push_back(s);}T*& operator[](size_t n) {return reinterpret_cast<T*>(vector<void*>::operator[](n));}const T* operator[](size_t n) const {return reinterpret_cast<const T*>(vector<void*>::operator[](n));}using vector<void*>::size;};int main() {SafeVector<string> v;string s1("live"), s2("long"), s3("and"), s4("prosper");v.push_back(&s1);v.push_back(&s2);v.push_back(&s3);v.push_back(&s4);for (size_t i = 0; i < v.size(); ++i)cout << *v[i] << endl;// void* p = &s1;// v.push_back(p); // error}/* Outout:livelongandprosper*////:~The class StringVector was implemented in Chapter 14 exercise 9. The class template above is made by just changing string to the template parameter T. See the explanation in Chapter 14 for why private inheritance is used. This technique reduces code bloat because the template instantiations are small wrappers for just one instantiation of SafeArray<void*>.(Exercises 16-23 through 16-25 are left to the reader.)16-23In TPStash2.h, add and test an operator- to PStash::iterator, following the logic of operator+. 16-24In Drawing.cpp, add and test a function template to call erase( ) member functions.16-25(Advanced) Modify the Stack class in TStack2.h to allow full granularity of ownership: Add a flag to each link indicating whether that link owns the object it points to, and support this information in the push( ) function and destructor. Add member functions to read and change the ownership for each link.16-26(Advanced) Modify PointerToMemberOperator.cpp from Chapter 12 so that the FunctionObject and operator->* are templatized to work with any return type (for operator->*, you’ll have to use member templates, described in V olume 2). Add and test support for zero, one and two arguments in Dog member functions.Solution://: S16:PointerToMemberOperatorTemplate.cpp #include <iostream>using namespace std;class Dog {public:int run() const {cout << "run\n";return 0;}int eat(int i) const {cout << "eat\n";return i;}int sleep(int i, int j) const {cout << "ZZZ\n";return i+j;}typedef int (Dog::*PMF0)() const;typedef int (Dog::*PMF1)(int) const;typedef int (Dog::*PMF2)(int, int) const;// operator->* must return an object// that has an operator():template<typename PMF>class FunctionObject {Dog* ptr;PMF pmem;public:// Save the object pointer and member pointer FunctionObject(Dog* wp, PMF pmf): ptr(wp), pmem(pmf) {cout << "FunctionObject constructor\n"; }// Make the call using the object pointer// and member pointerint operator()() const {cout << "FunctionObject::operator()\n";return (ptr->*pmem)(); // Make the call}int operator()(int i) const {cout << "FunctionObject::operator(int)\n";return (ptr->*pmem)(i); // Make the call}int operator()(int i, int j) const {cout << "FunctionObject::operator(int, int)\n";return (ptr->*pmem)(i, j); // Make the call}};template<typename PMF>FunctionObject<PMF> operator->*(PMF pmf) {cout << "operator->*" << endl;return FunctionObject<PMF>(this, pmf);}};int main() {Dog w;Dog::PMF0 pmf0 = &Dog::run;cout << (w->*pmf0)() << endl;Dog::PMF1 pmf1 = &Dog::eat;cout << (w->*pmf1)(2) << endl;Dog::PMF2 pmf2 = &Dog::sleep;cout << (w->*pmf2)(3, 4) << endl;}/* Output:operator->*FunctionObject constructorFunctionObject::operator()runoperator->*FunctionObject constructorFunctionObject::operator(int)eat2operator->*FunctionObject constructorFunctionObject::operator(int, int)ZZZ7*////:~Templatize both FunctionObject and Dog::operator->*( ) on the type ofpointer-to-member-function it will receive. The compiler infers the type when it is invoked in main( ). The definition of Dog::Operator->*( ) is a member function template, i.e., a function template defined within a class (not all compilers support this feature). There is still a little bit oftedium here – you still have to provide the different typedef s for the different types of member function pointers. But at least you don’t have to write different FunctionObject classes. Viva templates![ Previous Chapter ] [ Table of Contents ]Last Update:06/27/2002。
第二章:开始学习C++//ex2。
1——display your name and address#include〈iostream〉int main(void){using namespace std;cout〈〈"My name is liao chunguang and I live in hunan chenzhou。
\n”;}//ex2。
2-—convert the furlong units to yard uints-把浪单位换位码单位#include〈iostream>double fur2yd(double);int main(){using namespace std;cout〈〈"enter the distance measured by furlong units:";double fur;cin〉>fur;cout〈<”convert the furlong to yard"〈<endl;double yd;yd=fur2yd(fur);cout<<fur<〈" furlong is "<<yd〈〈" yard"〈〈endl;return 0;}double fur2yd(double t){return 220*t;}//ex2。
3—每个函数都被调用两次#include〈iostream〉void mice();void see();using namespace std;int main(){mice();mice();see();see();return 0;}void mice(){}void see(){cout<〈"see how they run”〈<endl;}//ex2.4#include〈iostream〉int main(){using namespace std;cout〈<"Enter your age:”;int age;cin>>age;int month;month=age*12;cout<〈age<〈” years is "<〈month<〈" months"<<endl;return 0;}//ex2。
【C++PrimerPlus】编程练习答案——第16章 1// chapter16.h234 #ifndef LEARN_CPP_CHAPTER16_H5#define LEARN_CPP_CHAPTER16_H67 #include <iostream>8 #include <string>9 #include <cctype>10 #include <vector>11 #include <ctime>12 #include <cstdlib>13 #include <fstream>14 #include <algorithm>15 #include <queue>16 #include <list>17 #include <memory>1819void ch16_1();20void ch16_2();21void ch16_3();22int reduce(long * ar, int n);23void ch16_4();24 template<class T>25int reduce2(T * ar, int n);26void ch16_5();27bool newcustomer(double x);28void ch16_6();29 std::vector<int> lotto(int n, int select);30void ch16_7();31void ch16_8();32void ch16_9();3334struct Review {35 std::string title;36int rating;37 };38bool operator<(const Review & r1, const Review & r2);39bool worseThan(const Review & r1, const Review & r2);40bool FillReview(Review & rr);41void ShowReview(const std::shared_ptr <Review> & rr);42void ch16_10();4344#endif//LEARN_CPP_CHAPTER16_H1// chapter16.cpp234 #include "chapter16.h"56void ch16_1() {7using namespace std;8string str;9 cout << "input a string: ";10 getline(cin, str);11bool flag = true;12for (int i = 0; i < str.size() / 2; ++ i)13if (str[i] != str[str.size() - 1 - i]) {14 flag = false; break;15 }16 cout << (flag ? "yes!" : "no!") << endl;17 }1819void ch16_2() {20using namespace std;21string str;22 cout << "input a string: ";23 getline(cin, str);24bool flag = true;25for (int i = 0, j = str.size() - 1; i < j; ++ i, -- j) {26if (!isalpha(str[i]))27 ++i;28if (!isalpha(str[j]))29 --j;30if (i < j) {31 str[i] = tolower(str[i]);32 str[j] = tolower(str[j]);33if (str[i] != str[j]) {34 cout << str[i] << "" << str[j] << endl;35 flag = false;36break;37 }38 }39 }40 cout << (flag ? "yes!" : "no!") << endl;41 }4243void ch16_3() {44using namespace std;45const string FILENAME = "../C++PrimerPlus/testfiles/hangman.txt";46 ifstream InFile;47 InFile.open(FILENAME);48if (!InFile.is_open()) {49 cout << "file not found" << endl;50return;51 }52 vector<string> wordlist;53string t;54while (InFile >> t) {55 wordlist.push_back(t);56 t = "";57 }58 InFile.close();59 srand(time(0));60char play;61 cout << "Will you play a word game? <y/n> ";62 cin >> play;63 play = tolower(play);64while (play == 'y') {65string target = wordlist[rand() % wordlist.size()];66int length = target.length();67string attempt(length, '-');68string badchars;69int guesses = 6;70 cout << "Guess my secret word. It has " << length71 << " letters, and you guess\n"72 << "one letter at a time. You get " << guesses73 << " wrong guesses." << endl;74 cout << "Your word: " << attempt << endl;75while (guesses > 0 && attempt != target) {76char letter;77 cout << "Guess a letter: ";78 cin >> letter;79if (badchars.find(letter) != string::npos || attempt.find(letter) != string::npos) { 80 cout << "You already guessed that. Try again." << endl;81continue;82 }83int loc = target.find(letter);84if (loc == string::npos) {85 cout << "Oh, bad guess!" << endl;86 -- guesses;87 badchars += letter;88 }89else {90 cout << "Good guess!" << endl;91 attempt[loc] = letter;92 loc = target.find(letter, loc + 1);93while (loc != string::npos) {94 attempt[loc] = letter;95 loc = target.find(letter, loc + 1);96 }97 }98 cout << "Your word: " << attempt << endl;99if (attempt != target) {100if (badchars.length() > 0)101 cout << "Bad choices: " << badchars << endl;102 cout << guesses << " bad guesses left" << endl;103 }104 }105if (guesses > 0)106 cout << "That's right!" << endl;107else108 cout << "Sorry, the word is " << target << "." << endl;109 cout << "Will you play another? <y/n> ";110 cin >> play;111 play = tolower(play);112 }113 cout << "Bye! " << endl;114 }115116int reduce(long * ar, int n) {117 std::sort(ar, ar + n);118long * end = std::unique(ar, ar + n);119return int(end - ar);120 }121122void ch16_4() {123using namespace std;124long arr[5] = {3, 9, 0, 1, 1};125for (auto x : arr)126 cout << x << "\t";127 cout << endl;128int l = reduce(arr, 5);129for (int i = 0; i < l; ++ i)130 cout << arr[i] << "\t";131 cout << endl;132 }133134 template<class T>135int reduce2(T * ar, int n) {136 std::sort(ar, ar + n);137 T * end = std::unique(ar, ar + n);138return int(end - ar);139 }140141void ch16_5() {142using namespace std;143long arr[5] = {3, 9, 0, 1, 1};144for (auto x : arr)145 cout << x << "\t";146 cout << endl;147int l = reduce2(arr, 5);148for (int i = 0; i < l; ++ i)149 cout << arr[i] << "\t";150 cout << endl;151string arr2[5] = {"bb", "aa", "cc", "cc", "cc"};152for (auto x : arr2)153 cout << x << "\t";154 cout << endl;155int l2 = reduce2(arr2, 5);156for (int i = 0; i < l2; ++ i)157 cout << arr2[i] << "\t";158 cout << endl;159 }160161const int MIN_PER_HR = 60;162163bool newcustomer(double x) {164return (std::rand() * x / RAND_MAX < 1);165 }166167void ch16_6() {168// 懒得打字了,很简单。
第二章:开始学习C++//ex2.1--display your name and address#include<iostream>int main(void){using namespace std;cout<<"My name is liao chunguang and I live in hunan chenzhou.\n”;}//ex2.2--convert the furlong units to yard uints-把浪单位换位码单位#include<iostream>double fur2yd(double);int main(){using namespace std;cout<<"enter the distance measured by furlong units:";double fur;cin>>fur;cout<<"convert the furlong to yard"<<endl;double yd;yd=fur2yd(fur);cout<<fur<<" furlong is "<<yd<<" yard"<<endl;return 0;}double fur2yd(double t){return 220*t;}//ex2.3-每个函数都被调用两次#include<iostream>void mice();void see();using namespace std;int main(){mice();mice();see();see();return 0;}void mice(){cout<<"three blind mice"<<endl;}void see(){cout<<"see how they run"<<endl;}//ex2.4#include<iostream>int main(){using namespace std;cout<<"Enter your age:";int age;cin>>age;int month;month=age*12;cout<<age<<" years is "<<month<<" months"<<endl;return 0;}//ex2.5---convert the Celsius valve to Fahrenheit value#include<iostream>double C2F(double);int main(){using namespace std;cout<<"please enter a Celsius value:";double C;cin>>C;double F;F=C2F(C);cout<<C<<" degrees Celsius is "<<F<<" degrees Fahrenheit."<<endl; return 0;}double C2F(double t){return 1.8*t+32;}//ex2.6---convert the light years valve to astronomical units--把光年转换为天文单位#include<iostream>double convert(double);//函数原型int main(){using namespace std;cout<<"Enter the number of light years:";double light_years;cin>>light_years;double astro_units;astro_units=convert(light_years);cout<<light_years<<" light_years = "<<astro_units<<" astronomical units."<<endl; return 0;}double convert(double t){return 63240*t;//1 光年=63240 天文单位}//ex2.7--显示用户输入的小时数和分钟数#include<iostream>void show();main(){using namespace std;show();return 0;}void show(){using namespace std;int h,m;cout<<"enter the number of hours:";cin>>h;cout<<"enter the number of minutes:";cin>>m;cout<<"Time:"<<h<<":"<<m<<endl;}第三章:处理数据//ex3.1—将身高用英尺(feet)和英寸(inch)表示#include<iostream>const int inch_per_feet=12;// const常量--1feet=12inches--1英尺=12英寸int main(){using namespace std;cout<<"please enter your height in inches:___\b\b\b";// \b表示为退格字符int ht_inch;cin>>ht_inch;int ht_feet=ht_inch/inch_per_feet;//取商int rm_inch=ht_inch%inch_per_feet;//取余cout<<"your height is "<<ht_feet<<" feet,and "<<rm_inch<<" inches\n";return 0;}//ex3.2--计算相应的body mass index(体重指数)#include<iostream>const int inch_per_feet=12;const double meter_per_inch=0.0254;const double pound_per_kilogram=2.2;int main(){using namespace std;cout<<"Please enter your height:"<<endl;cout<<"First,enter your height of feet part(输入你身高的英尺部分):_\b";int ht_feet;cin>>ht_feet;cout<<"Second,enter your height of inch part(输入你身高的英寸部分):_\b";int ht_inch;cin>>ht_inch;cout<<"Now,please enter your weight in pound:___\b\b\b";double wt_pound;cin>>wt_pound;int inch;inch=ht_feet*inch_per_feet+ht_inch;double ht_meter;ht_meter=inch*meter_per_inch;double wt_kilogram;wt_kilogram=wt_pound/pound_per_kilogram;cout<<endl;cout<<"Your pensonal body information as follows:"<<endl;cout<<"身高:"<<inch<<"(英尺inch)\n"<<"身高:"<<ht_meter<<"(米meter)\n"<<"体重:"<<wt_kilogram<<"(千克kilogram)\n";double BMI;BMI=wt_kilogram/(ht_meter*ht_meter);cout<<"your Body Mass Index(体重指数) is "<<BMI<<endl;return 0;}//ex3.3 以度,分,秒输入,以度输出#include<iostream>const int minutes_per_degree=60;const int seconds_per_minute=60;int main(){using namespace std;cout<<"Enter a latitude in degrees,minutes,and seconds:\n";cout<<"First,enter the degrees:";int degree;cin>>degree;cout<<"Next,enter the minutes of arc:";int minute;cin>>minute;cout<<"Fianlly,enter the seconds of arc:";int second;cin>>second;double show_in_degree;show_in_degree=(double)degree+(double)minute/minutes_per_degree+(double)second/mi nutes_per_degree/seconds_per_minute;cout<<degree<<" degrees,"<<minute<<" minutes,"<<second<<"seconds ="<<show_in_degree<<" degrees\n";return 0;}//ex3.4#include<iostream>const int hours_per_day=24;const int minutes_per_hour=60;const int seconds_per_minute=60;int main(){using namespace std;cout<<"Enter the number of seconds:";long seconds;cin>>seconds;int Day,Hour,Minute,Second;Day=seconds/seconds_per_minute/minutes_per_hour/hours_per_day;Hour=seconds/seconds_per_minute/minutes_per_hour%hours_per_day;Minute=seconds/seconds_per_minute%minutes_per_hour;Second=seconds%seconds_per_minute;cout<<seconds<<"seconds = "<<Day<<" days,"<<Hour<<" hours,"<<Minute<<" minutes,"<<Second<<" seconds\n";return 0;}//ex3.5#include<iostream>int main(){using namespace std;cout<<"Enter the world population:";long long world_population;cin>>world_population;cout<<"Enter the population of the US:";long long US_population;cin>>US_population;double percentage;percentage=(double)US_population/world_population*100;cout<<"The population of the US is "<<percentage<<"% of the world population.\n";return 0;}//ex3.6 汽车耗油量-美国(mpg)or欧洲风格(L/100Km)#include<iostream>int main(){using namespace std;cout<<"Enter the miles of distance you have driven:";double m_distance;cin>>m_distance;cout<<"Enter the gallons of gasoline you have used:";double m_gasoline;cin>>m_gasoline;cout<<"Your car can run "<<m_distance/m_gasoline<<" miles per gallon\n";cout<<"Computing by European style:\n";cout<<"Enter the distance in kilometers:";double k_distance;cin>>k_distance;cout<<"Enter the petrol in liters:";double k_gasoline;cin>>k_gasoline;cout<<"In European style:"<<"your can used "<<100*k_gasoline/k_distance<<" liters of petrol per 100 kilometers\n";return 0;}//ex3.7 automobile gasoline consumption-耗油量--欧洲风格(L/100Km)转换成美国风格(mpg) #include<iostream>int main(){using namespace std;cout<<"Enter the automobile gasoline consumption figure in\n"<<"European style(liters per 100 kilometers):";double Euro_style;cin>>Euro_style;cout<<"Converts to U.S. style(miles per gallon):"<<endl;cout<<Euro_style<<" L/100Km = "<<62.14*3.875/Euro_style<<" mpg\n";return 0;}// Note that 100 kilometers is 62.14 miles, and 1 gallon is 3.875 liters.//Thus, 19 mpg is about 12.4 L/100Km, and 27 mpg is about 8.7 L/100Km.Enter the automobile gasoline consumption figure inEuropean style(liters per 100 kilometers):12.4Converts to U.S. style(miles per gallon):12.4 L/100Km = 19.4187 mpgPress any key to continue// ex3.7 automobile gasoline consumption-耗油量--美国风格(mpg)转换成欧洲风格(L/100Km) #include<iostream>int main(){using namespace std;cout<<"Enter the automobile gasoline consumption figure in\n"<<"U.S. style(miles per gallon):";double US_style;cin>>US_style;cout<<"Converts to European style(miles per gallon):"<<endl;cout<<US_style<<" mpg = "<< 62.14*3.875/US_style<<"L/100Km\n";return 0;}// Enter the automobile gasoline consumption figure inU.S. style(miles per gallon):19Converts to European style(miles per gallon):19 mpg = 12.6733L/100KmPress any key to continue第四章复合类型//ex4.1 display the information of student#include<iostream>const int Asize=20;using namespace std;struct student//定义结构描述{char firstname[Asize];char lastname[Asize];char grade;int age;};void display(student);//函数原型放在结构描述后int main(){cout<<"what is your first name?"<<endl;student lcg;//创建结构变量(结构数据对象)cin.getline(lcg.firstname,Asize);cout<<"what is your last name?"<<endl;cin.getline(stname,Asize);cout<<"what letter grade do you deserve?"<<endl;cin>>lcg.grade;cout<<"what is your age?"<<endl;cin>>lcg.age;display(lcg);return 0;}void display(student name){cout<<"Name: "<<name.firstname<<","<<stname<<endl;cout<<"Grade:"<<char(name.grade+1)<<endl;cout<<"Age:"<<name.age<<endl;}//ex4.2 use the string-class instead of char-array#include<iostream>#include<string>int main(){using namespace std;string name,dessert;cout<<"Enter your name: \n";getline(cin,name);cout<<"Enter your favorite dessert: \n";getline(cin,dessert);cout<<"I have some delicious "<<dessert;cout<<" for you, "<<name<<".\n";return 0;}//有时候会遇到需要按下两次回车键才能正确的显示结果,这是vc++6.0的一个BUG,更改如下:else if (_Tr::eq((_E)_C, _D)){_Chg = true;_I.rdbuf()->sbumpc();//修改后的break; }ex4.3 输入其名和姓,并组合显示#include<iostream>#include<cstring>const int Asize=20;int main(){using namespace std;char fname[Asize];char lname[Asize];char fullname[2*Asize+1];cout<<"Enter your first name:";//输入名字,存储在fname[]数组中cin.getline(fname,Asize);cout<<"Enter your last name:";//输入姓,存储在lname[]数组中cin.getline(lname,Asize);strncpy(fullname,lname,Asize);//把姓lname复制到fullname空数组中strcat(fullname,", ");//把“,”附加到上述fullname尾部strncat(fullname,fname,Asize);//把fname名字附加到上述fullname尾部fullname[2*Asize]='\0';//为防止字符型数组溢出,在数组结尾添加结束符cout<<"Here's the information in a single string:"<<fullname<<endl;//显示组合结果return 0;}//ex4.4 使用string对象存储、显示组合结果#include<iostream>#include<string>int main(){using namespace std;string fname,lname,attach,fullname;cout<<"Enter your first name:";getline(cin,fname);//note:将一行输入读取到string类对象中使用的是getline(cin,str)//它没有使用句点表示法,所以不是类方法cout<<"Enter your last name:";getline(cin,lname);attach=", ";fullname=lname+attach+fname;cout<<"Here's the information in a single string:"<<fullname<<endl;return 0;}//ex4.5 declare a struct and initialize it 声明结果并创建一个变量#include<iostream>const int Asize=20;struct CandyBar{char brand[Asize];double weight;int calory;};int main(){using namespace std;CandyBar snack={"Mocha Munch",2.3,350};cout<<"Here's the information of snack:\n";cout<<"brand:"<<snack.brand<<endl;cout<<"weight:"<<snack.weight<<endl;cout<<"calory:"<<snack.calory<<endl;return 0;}//ex4.6 结构数组的声明及初始化#include<iostream>const int Asize=20;struct CandyBar{char brand[Asize];double weight;int calory;};int main(){using namespace std;CandyBar snack[3]={{"Mocha Munch",2.3,350},{"XuFuJi",1.1,300},{"Alps",0.4,100}};for(int i=0;i<3;i++)//利用for循环来显示snack变量的内容{cout<<snack[i].brand<<endl<<snack[i].weight<<endl<<snack[i].calory<<endl<<endl;}return 0;}//ex4.7 pizza披萨饼#include<iostream>#include<string>const int Size=20;struct pizza//声明结构{char company[Size];double diameter;double weight;};int main(){using namespace std;pizza pie;//创建一个名为pie的结构变量cout<<"What's the name of pizza company:";cin.getline(pany,Size);cout<<"What's the diameter of pizza:";cin>>pie.diameter;cout<<"What's the weight of pizza:";cin>>pie.weight;cout<<"company:"<<pany<<endl;cout<<"diameter:"<<pie.diameter<<"inches"<<endl;cout<<"weight:"<<pie.weight<<"ounches"<<endl;return 0;}//ex4.8 pizza pie 披萨饼使用new创建动态结构#include<iostream>#include<string>const int Size=20;struct pizza//声明结构{char company[Size];double diameter;double weight;};int main(){using namespace std;pizza *pie=new pizza;//使用new创建动态结构cout<<"What's the diameter of pizza:";cin>>pie->diameter;cin.get();//读取下一个字符cout<<"What's the name of pizza company:";cin.get(pie->company,Size);cout<<"What's the weight of pizza:";cin>>pie->weight;cout<<"diameter:"<<pie->diameter<<" inches"<<endl;cout<<"company:"<<pie->company<<endl;cout<<"weight:"<<pie->weight<<" ounches"<<endl;delete pie;//delete释放内存return 0;}//ex.4.9 使用new动态分配数组—方法1#include<iostream>#include<string>using namespace std;struct CandyBar{string brand;double weight;int calory;};int main(){CandyBar *snack= new CandyBar[3];snack[0].brand="A";//单个初始化由new动态分配的内存snack[0].weight=1.1;snack[0].calory=200;snack[1].brand="B";snack[1].weight=2.2;snack[1].calory=400;snack[2].brand="C";snack[2].weight=4.4;snack[2].calory=500;for(int i=0;i<3;i++){cout << " brand: " << snack[i].brand << endl;cout << " weight: " << snack[i].weight << endl;cout << " calorie: " << snack[i].calory << endl<<endl;}delete [] snack;return 0;}//ex.4.10 数组—方法1#include <iostream>int main(){using namespace std;const int Size = 3;int success[Size];cout<<"Enter your success of the three times 40 meters running:\n";cin >> success[0]>>success[1]>>success[2];cout<<"success1:"<<success[0]<<endl;cout<<"success2:"<<success[1]<<endl;cout<<"success3:"<<success[2]<<endl;double average=(success[0]+success[1]+success[2])/3;cout<<"average:"<<average<<endl;return 0;}//ex.4.10 array—方法2#include <iostream>#include <array>int main(){using namespace std;array<double,4>ad={0};cout<<"Enter your success of the three times 40 meters running:\n";cin >> ad[0]>>ad[1]>>ad[2];cout<<"success1:"<<ad[0]<<endl;cout<<"success2:"<<ad[1]<<endl;cout<<"success3:"<<ad[2]<<endl;ad[3]=(ad[0]+ad[1]+ad[2])/3;cout<<"average:"<<ad[3]<<endl;return 0;}第五章循环和关系表达式//ex.5.1#include <iostream>int main(){using namespace std;cout<<"Please enter two integers: ";int num1,num2;cin>>num1>>num2;int sum=0;for(int temp=num1;temp<=num2;++temp)//or temp++sum+=temp;cout<<"The sum from "<<num1<<" to "<<num2<<" is "<<sum<<endl; return 0;}//ex.5.2#include <iostream>#include<array>int main(){using namespace std;array<long double,101>ad={0};ad[1]=ad[0]=1L;for(int i=2;i<101;i++)ad[i]=i*ad[i-1];for(int i=0;i<101;i++)cout<<i<<"! = "<<ad[i]<<endl;return 0;}//ex.5.3#include <iostream>int main(){using namespace std;cout<<"Please enter an integer: ";int sum=0,num;while((cin>>num)&&num!=0){sum+=num;cout<<"So far, the sum is "<<sum<<endl;cout<<"Please enter an integer: ";}return 0;}//ex.5.4#include <iostream>int main(){using namespace std;double sum1,sum2;sum1=sum2=0.0;int year=0;while(sum2<=sum1){++year;sum1+=10;sum2=(100+sum2)*0.05+sum2;}cout<<"经过"<<year<<"年后,Cleo的投资价值才能超过Daphne的投资价值。
1.#include<iostream>#include<string>usingnamespace std;bool revise(const string & s1, const string & s2);int main(){string words;cout<<"Enter words(quit to quit): ";while (cin>> words && words != "quit"){string rewords (words.rbegin(), words.rend());if (revise(words, rewords))cout<< words <<" can be revised.\n";elsecout<<words <<" cannot be revised.\n";cout<<"Enter words(quit to quit): ";}system("Pause");return 0;}bool revise(const string & s1, const string & s2){if (s1 == s2)returntrue;elsereturnfalse;}2.3.读取文件apiary beetle cereal dangerensign florid garage healthinsult jackal keeper loanermanage nonce onset plaid quiltremote stolid train uesfulvaild whence xenon yearn zippy#include<iostream>#include<string>#include<fstream>#include<cstdlib>#include<cctype>#include<ctime>#include<vector>usingnamespace std;vector<string> wordlist;void Fillword();int main(){srand(time(0));char play;cout<<"Will you play a word game?\n";cin>> play;play = tolower(play);Fillword();while (play == 'y'){string target = wordlist[rand() % wordlist.size()];int length = target.length();string attemp(length, '-');string badchars;int guesses = 6 ;cout<<"Guess my secret word. It has "<< length<<" letters, and you guess\n"<<"one letter at a time. You get "<< guesses <<" wrong guesses.\n";cout<<"Your word: "<<attemp<<endl;while (guesses > 0 &&attemp != target){char letter;cout<<"Guess a letter: ";cin>> letter;if (badchars.find(letter) != string::npos || attemp.find(letter) != string::npos){cout<<"You already guessed that. Try again.\n";continue;}int loc = target.find (letter);if (loc == string::npos){cout<<"Oh, bad guess!\n";--guesses;badchars += letter;}else{cout<<"Good guess!\n";attemp [loc] = letter;loc = target.find(letter, loc + 1);while (loc != string::npos){attemp [loc] = letter;loc = target.find(letter, loc + 1);}}cout<<"Your word: "<<attemp<<endl;if (attemp != target){if (badchars.length() > 0)cout<<"Bad choices: "<<badchars<<endl;cout<< guesses <<" bad guesses left.\n";}}if (guesses > 0)cout<<"That's right.\n";elsecout<<"Sorry, the word is "<< target <<" .\n";cout<<"Will you play another<y/n>";cin>> play;play = tolower(play);}system("Pause");return 0;}void Fillword(){string letter;ifstream fin;fin.open("tobuy.txt");if (fin.is_open() == false){cout<<"Can't open file.Bye\n";exit(EXIT_FAILURE);}while (fin){fin >> letter;wordlist.push_back(letter);}fin.close();}4.#include<iostream>#include<algorithm>#include<list>usingnamespace std;constint Number = 5;int reduce (long ar[], int n);void show(int n){ cout<< n <<" " ;}int main(){long one[Number] = {2, 3, 4, 2, 3};int number = reduce(one, Number);cout<<endl;show(number);cout<<endl;system("Pause");return 0;}int reduce (long ar[], int n){list<long> a;a.insert(a.begin(), ar, ar + n);a.sort();a.unique();a.size();for_each(a.begin(), a.end(), show);return a.size();}5.#include<iostream>#include<algorithm>#include<list>#include<string>usingnamespace std;constint Number = 5;template<class T>void show(T n){ cout<< n <<" " ;}template<class T>int reduce(T ar[], int n);int main(){long one[Number] = {2, 3, 4, 2, 3};int number1 = reduce(one, Number);cout<<endl;show(number1);cout<<endl;string two[Number] = { "hello", "good", "great", "hello" , "great"};int number2 = reduce(two, Number);cout<<endl;show(number2);cout<<endl;system("Pause");return 0;}template<class T>int reduce(T ar[], int n){list<T> a;a.insert(a.begin(), ar, ar + n);a.sort();a.unique();a.size();for_each(a.begin(), a.end(), show<T>);return a.size();}6.#include<iostream>#include<algorithm>#include<queue>#include<string>#include<ctime>usingnamespace std;constint MIN_PER_HR = 60;class Customer{private:long arrive;int processtime;public:Customer() { arrive = processtime = 0; }void set(long when){processtime = rand() % 3 + 1;arrive = when;}long when() const { return arrive;}int ptime() const { return processtime; }};typedef Customer Item;bool newcustomer(double x);int main(){srand(time(0));cout<<"Case Study: Bank of Heather Automatic Teller.\n";cout<<"Enter maximum size of queue:";int qs;cin>>qs;queue<Item> line;cout<<"Enter the number fo simulation hours:";int hours;cin>> hours;long cyclelimit = MIN_PER_HR * hours;cout<<"Enter the average number of customers per hour:";double perhour;cin>>perhour;double min_per_cust;min_per_cust = MIN_PER_HR / perhour;Item temp;long turnaways = 0;long customers = 0;long served = 0;long sum_line = 0;int wait_time = 0;long line_wait = 0;for(int cycle = 0; cycle <cyclelimit; cycle++){if (newcustomer(min_per_cust)){if (line.size() == qs)turnaways ++;else{customers++;temp.set(cycle);line.push(temp);}}if (wait_time<= 0 && !line.empty()){line.pop();wait_time = temp.ptime();line_wait += cycle - temp.when();served++;}if(wait_time> 0)wait_time--;sum_line == line.size();}if (customers > 0){cout<<"customers accepted: "<< customers <<endl;cout<<" customers served: "<< served <<endl;cout<<" turnaways: "<<turnaways<<endl;cout<<"average queue size: " ;cout.precision(2);cout.setf(ios_base::fixed, ios_base::floatfield);cout<< (double)sum_line / cyclelimit<<endl;cout<<" average wait time:"<< (double)line_wait/served <<" minutes.\n"; }elsecout<<"No customers!\n";system("Pause");return 0;bool newcustomer(double x){return (rand() * x / RAND_MAX < 1);}7.#include<iostream>#include<algorithm>#include<vector>#include<string>#include<ctime>usingnamespace std;vector<int> lotto(int n1, int n2);void show(int n) { cout<< n <<" ";}int main(){vector<int> winner;winner = lotto(51, 6);for_each(winner.begin(), winner.end(), show);system("Pause");return 0;}vector<int> lotto(int n1, int n2){vector<int> num1;vector<int> num2;for (int i = 0; i< n1; i++)num1.push_back(i);random_shuffle(num1.begin(), num1.end());for (int i = 0; i< n2; i++)num2.push_back(num1[rand()% n1 + 1]);return num2;}8.#include<iostream>#include<algorithm>#include<set>#include<string>#include<iterator>usingnamespace std;int main(){ostream_iterator<string, char> out(cout, " ");set<string> Mat;set<string> Pat;set<string>MPat;string temp1;cout<<"Please enter Mat's frineds(quit to quit):\n";while (getline(cin, temp1) && temp1 != "quit"){Mat.insert(temp1);cout<<"Please enter Mat's frineds(quit to quit):\n";}cout<<"Mat:\n";copy(Mat.begin(), Mat.end(), out);cout<<endl;cout<<"Please enter Pat's frineds(quit to quit):\n";while (getline(cin, temp1) && temp1 != "quit"){Pat.insert(temp1);cout<<"Please enter Pat's frineds(quit to quit):\n";}cout<<"Pat:\n";copy(Pat.begin(), Pat.end(), out);cout<<endl;cout<<"Combine:\n";set_union(Mat.begin(), Mat.end(),Pat.begin(), Pat.end(), insert_iterator<set<string>>(MPat, MPat.begin()));copy(MPat.begin(), MPat.end(), out);cout<<endl;system("Pause");return 0;}9.#include<iostream>#include<algorithm>#include<list>#include<ctime>#include<iterator>#include<vector>usingnamespace std;constint LIM = 10;void outin(int n) { cout<< n <<" "; }int main(){int num[LIM];vector<int> vi0(num, num + LIM);vector<int> vi(num, num + LIM);list<int> li(num, num + LIM);for (int i = 0; i< LIM; i++)num[i] = rand();for_each(vi0.begin(), vi0.end(),outin);cout<<endl;for_each(vi.begin(), vi.end(),outin);cout<<endl;for_each(li.begin(), li.end(),outin);cout<<endl;clock_t start1 = clock();sort(vi.begin(), vi.end());for_each(vi.begin(), vi.end(),outin);cout<<endl;clock_t end1 = clock();cout<< (double) (end1 - start1)/CLOCKS_PER_SEC;cout<<endl;clock_t start2 = clock();li.sort();for_each(li.begin(), li.end(),outin);cout<<endl;clock_t end2 = clock();cout<< (double) (end2 - start2)/CLOCKS_PER_SEC;cout<<endl;sort(vi0.begin(), vi0.end());copy(vi0.begin(), vi0.end(),li.begin());for_each(vi0.begin(), vi0.end(),outin);cout<<endl;clock_t start3 = clock();copy(li.begin(), li.end(),vi.begin());sort(vi.begin(), vi.end());copy(vi.begin(), vi.end(),li.begin());clock_t end3 = clock();cout<< (double) (end3 - start3)/CLOCKS_PER_SEC;cout<<endl;system("Pause");return 0;}10.#include<iostream>#include<algorithm>#include<list>#include<memory>#include<iterator>#include<vector>#include<string>usingnamespace std;constint LIM = 10;void outin(int n) { cout<< n <<" "; }struct Review{string title;int rating;double price;};booloperator< ( shared_ptr<Review>& r1, shared_ptr<Review>& r2);bool ratingworseThan( shared_ptr<Review>& r1, shared_ptr<Review>& r2); bool ratingbetterThan( shared_ptr<Review>& r1, shared_ptr<Review>& r2); bool priceworseThan( shared_ptr<Review>& r1, shared_ptr<Review>& r2); bool pricebetterThan( shared_ptr<Review>& r1, shared_ptr<Review>& r2); bool FillReview(Review & r);void Show(const shared_ptr<Review>& r);int main(){vector<shared_ptr<Review>> books;Review temp;while(FillReview(temp)){shared_ptr<Review>te(new Review);te->title = temp.title;te->rating = temp.rating;te->price = temp.price;books.push_back(te);}if (books.size() > 0){cout<<"Thank you. You entered the following "<<books.size() <<endl;cout<<"Book\tRating\tPrice\n";for_each(books.begin(), books.end(), Show);char ch;cout<<"Plaese enter o, z, rb, rw, pb, pw,q\n";while(tolower(ch)!= 'q'){switch(ch){case'o':cout<<"Original: \n";cout<<"Book\tRating\tPrice\n";for_each(books.begin(), books.end(), Show);break;case'z':cout<<"Sorting by letter.\n";cout<<"Book\tRating\tPrice\n";sort(books.begin(), books.end());for_each(books.begin(), books.end(), Show);break;case'rb':cout<<"Sorting by rating better.\n";cout<<"Book\tRating\tPrice\n";sort(books.begin(), books.end(),ratingbetterThan);for_each(books.begin(), books.end(), Show);break;case'rw':cout<<"Sorting by rating worse.\n";cout<<"Book\tRating\tPrice\n";sort(books.begin(), books.end(),ratingworseThan);for_each(books.begin(), books.end(), Show);break;case'pb':cout<<"Sorting by price better.\n";cout<<"Book\tRating\tPrice\n";sort(books.begin(), books.end(),pricebetterThan);for_each(books.begin(), books.end(), Show);break;case'pw':cout<<"Sorting by price worse.\n";cout<<"Book\tRating\tPrice\n";sort(books.begin(), books.end(),priceworseThan);for_each(books.begin(), books.end(), Show);break;default:break;}cout<<"Plaese enter o, z, rb, rw, pb, pw,q\n";}}system("Pause");return 0;}bool FillReview(Review & r){cout<<"Enter book title (quit to quit):";getline(cin , r.title);if(r.title == "quit")returnfalse;cout<<"Enter book rating:";cin>>r.rating;cout<<"Enter book price:";cin>>r.price;if (!cin)returnfalse;while(cin.get() != '\n')continue;returntrue;}void Show(const shared_ptr<Review>& r){cout<< r->title <<" \t "<< r->rating <<"\t "<< r->price <<" \n";}bool ratingworseThan( shared_ptr<Review>& r1, shared_ptr<Review>& r2) {return (r1->rating < r2->rating);}bool ratingbetterThan( shared_ptr<Review>& r1, shared_ptr<Review>& r2) {return (r1->rating > r2->rating);}bool priceworseThan( shared_ptr<Review>& r1, shared_ptr<Review>& r2) {return (r1->price < r2->price);}bool pricebetterThan( shared_ptr<Review>& r1, shared_ptr<Review>& r2) {return (r1->price > r2->price);}。