C++primer plus部分解答

第二章:开始学习 C++

//ex2.1--display your name andaddress

#includeint main(void)

{

usingnamespace std; cout<<"My name is liao chunguang and I live in hunanchenzhou.\n”;

}

//ex2.2--convert the furlong units to yard uints-把浪单位换位码单位

#include doublefur2yd(double); int main()

{

usingnamespace std; cout<<"enter the distance measured by furlongunits:"; double fur; cin>>fur; cout<<"convert the furlongto yard"<

}

doublefur2yd(double t)

{

return220*t;

}

//ex2.3-每个函数都被调用两次

#include voidmice(); void see(); using namespace std; int main()

{

mice();mice(); see(); see(); return 0;

}

void mice()

{

cout<<"threeblind mice"<

}

void see()

{

cout<<"seehow they run"<

}

//ex2.4

#include int main()

{

using namespace std; cout<<"Enter yourage:"; int age; cin>>age; int month; month=age*12;cout<

}

//ex2.5---convert the Celsiusvalve to Fahrenheit value

#include doubleC2F(double); int main()

{

usingnamespace std; cout<<"please enter a Celsius value:"; double C;cin>>C; double F; F=C2F(C); cout<

}

doubleC2F(double t)

{

return1.8*t+32;

}

//ex2.6---convert the light years valve to astronomical units--把光年转换为天文单位

#include doubleconvert(double);//函数原型 intmain()

{

usingnamespace std; cout<<"Enter the number of light years:"; doublelight_years; cin>>light_years; double astro_units;astro_units=convert(light_years); cout<

}

double     convert(double t)

{

return63240*t;//1 光年=63240天文单位

}

//ex2.7--显示用户输入的小时数和分钟数

#includevoid show(); main()

{

usingnamespace std; show(); return 0;

}

void show()

{

usingnamespace std; int h,m; cout<<"enter the number of hours:";cin>>h; cout<<"enter the number of minutes:";cin>>m;

cout<<"Time:"<

}

第三章:处理数据

//ex3.1—将身高用英尺(feet)和英寸(inch)表示

#include const intinch_per_feet=12;// const 常量--1feet=12inches--1英尺=12 英寸 int main()

{

usingnamespace std; cout<<"please enter your height ininches:___\b\b\b";//         \b 表示为退格字符 int ht_inch;cin>>ht_inch; int ht_feet=ht_inch/inch_per_feet;//取商 intrm_inch=ht_inch%inch_per_feet;//取余 cout<<"your height is"<

<

}

//ex3.2--计算相应的 bodymass index(体重指数)

#include const intinch_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:"<>ht_feet;

cout<<"Second,enter yourheight of inch part(输入你身高的英寸部分):_\b";int ht_inch; cin>>ht_inch;

cout<<"Now,pleaseenter your weight in pound:___\b\b\b"; double wt_pound;cin>>wt_pound; int inch; inch=ht_feet*inch_per_feet+ht_inch; doubleht_meter; ht_meter=inch*meter_per_inch; double wt_kilogram;wt_kilogram=wt_pound/pound_per_kilogram; cout<

<<"体重:"<

BMI=wt_kilogram/(ht_meter*ht_meter);

cout<<"yourBody Mass Index(体重指数)is "<

}

//ex3.3 以度,分,秒输入,以度输出

#includeconst int minutes_per_degree=60; const int seconds_per_minute=60; int main()

{

usingnamespace std; cout<<"Enter a latitude in degrees,minutes,andseconds:\n"; cout<<"First,enter the degrees:"; int degree;cin>>degree; cout<<"Next,enter the minutes of arc:"; intminute; cin>>minute; cout<<"Fianlly,enter the seconds ofarc:"; 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<

="<

}

//ex3.4

#includeconst int hours_per_day=24; const int minutes_per_hour=60; const intseconds_per_minute=60; int main()

{

usingnamespace std; cout<<"Enter the number of seconds:"; longseconds; 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<

}

//ex3.5

#include int main()

{ using namespace std; cout<<"Enter theworld population:"; long long world_population;cin>>world_population; cout<<"Enter the population of theUS:"; long long US_population; cin>>US_population; double percentage;percentage=(double)US_population/world_population*100; cout<<"Thepopulation of the US is "<

}

//ex3.6 汽车耗油量-美国(mpg)or 欧洲风格(L/100Km)

#includeint main()

{

using namespace std;cout<<"Enter the miles of distance you have driven:"; doublem_distance; cin>>m_distance;

cout<<"Enter the gallonsof gasoline you have used:"; double m_gasoline; cin>>m_gasoline;

cout<<"Yourcar can run "<>k_distance;

cout<<"Enterthe petrol in liters:"; double k_gasoline; cin>>k_gasoline;

cout<<"InEuropean style:"<<"your can used"<<100*k_gasoline/k_distance<<" liters of petrol per 100kilometers\n";

return 0;

}

//ex3.7       automobile gasoline consumption-耗油量--欧洲风格(L/100Km)转换成美国风格(mpg)

#includeint main()

{

usingnamespace std; cout<<"Enter the automobile gasoline consumptionfigure in\n"

<<"Europeanstyle(liters per 100 kilometers):"; double Euro_style; cin>>Euro_style;cout<<"Converts to U.S. style(miles per gallon):"<

}

// Notethat 100 kilometers is 62.14 miles, and 1 gallon is 3.875 liters.

//Thus, 19mpg is about 12.4 L/100Km, and 27 mpg is about 8.7 L/100Km.

Enter the automobilegasoline consumption figure in European style(liters per 100 kilometers):12.4Converts to U.S. style(miles per gallon):

12.4 L/100Km =19.4187 mpg

Press any key tocontinue

// ex3.7     automobile gasoline consumption-耗油量--美国风格(mpg)转换成欧洲风格(L/100Km)

#includeint main()

{

usingnamespace std;

cout<<"Enterthe automobile gasoline consumption figure in\n"

<<"U.S.style(miles per gallon):"; double US_style; cin>>US_style; cout<<"Convertsto European style(miles per gallon):"<

}

// Enter theautomobile gasoline consumption figure in

U.S. style(miles pergallon):19

Converts to Europeanstyle(miles per gallon):

19mpg = 12.6733L/100Km Press any key to continue

第四章 复合类型

//ex4.1  display   the  information ofstudent

#include const intAsize=20; using namespace std; struct student//定义结构描述

{

charfirstname[Asize]; char lastname[Asize]; char grade; int age;

};

voiddisplay(student);//函数原型放在结构描述后 intmain()

{

cout<<"whatis your first name?"<

studentlcg;//创建结构变量(结构数据对象)

cin.getline(lcg.firstname,Asize);cout<<"what is your last name?"<>lcg.grade; cout<<"what isyour age?"<>lcg.age; display(lcg); return 0;

}

voiddisplay(student name)

{

cout<<"Name:"<

}

//ex4.2 use the string-classinstead of char-array

#include#include int main()

{

usingnamespace std;

stringname,dessert; cout<<"Enter your name: \n"; getline(cin,name);

cout<<"Enteryour favorite dessert: \n"; getline(cin,dessert);

cout<<"I have somedelicious "<

}

//有时候会遇到需要按下两次回车键才能正确的显示结果,这是 vc++6.0的一个 BUG,更改如下:else if (_Tr::eq((_E)_C,_D))

{_Chg =true;

_I.rdbuf()->sbumpc();//修改后的 break; }

ex4.3 输入其名和姓,并组合显示

#include#include const int Asize=20; int main()

{

usingnamespace std; char fname[Asize]; char lname[Asize]; char fullname[2*Asize+1];

cout<<"Enteryour first name:";//输入名字,存储在 fname[]数组中 cin.getline(fname,Asize);

cout<<"Enteryour 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'sthe information in a single string:"<

}

#define

_CRT_SECURE_NO_WARNINGS

#include #include const int Asize = 20; intmain()

{ usingnamespace std;char firstname[Asize];char lastname[50];

cout << "Enteryour first name: "; cin.getline(firstname,Asize); cout<< "Enter your last name: ";cin.getline(lastname,50); strcat(lastname,",");strncat(lastname,firstname,Asize); cout << "Here'sthe information in a single string: "

<< lastname<return 0;

}

//ex4.4 使用 string对象 存储、显示组合结果

#include#include int main()

{

using namespace std; stringfname,lname,attach,fullname; cout<<"Enter your first name:";getline(cin,fname);//note:将一行输入读取到 string类对象中使用的是 getline(cin,str)

//它没有使用句点表示法,所以不是类方法

cout<<"Enteryour last name:"; getline(cin,lname); attach=", ";fullname=lname+attach+fname;

cout<<"Here'sthe information in a single string:"<

}

//ex4.5 declare a struct and initialize it 声明结果并创建一个变量

#include const intAsize=20; struct CandyBar

{

char brand[Asize]; double weight;int calory;

};

int main()

{

usingnamespace std;

CandyBarsnack={"Mocha Munch",2.3,350}; cout<<"Here's theinformation of snack:\n";cout<<"brand:"<

}

//ex4.6 结构数组的声明及初始化

#include const intAsize=20; struct CandyBar

{

char brand[Asize]; double weight;int calory;

};

int main()

{

usingnamespace std;

CandyBarsnack[3]={

{"MochaMunch",2.3,350},

{"XuFuJi",1.1,300},

{"Alps",0.4,100}

};

for(inti=0;i<3;i++)//利用 for循环来显示 snack 变量的内容

{

cout<

<

<

}

return 0;

}

//ex4.7 pizza 披萨饼

#include#include const int Size=20; struct pizza//声明结构 {

charcompany[Size]; double diameter; double weight;

};

int main()

{

usingnamespace std;

pizzapie;//创建一个名为 pie的结构变量

         cout<<"What'sthe    name of pizza company:";

cin.getline(pie.company,Size);cout<<"What's the diameter of pizza:"; cin>>pie.diameter;cout<<"What's        the weightof pizza:"; cin>>pie.weight; cout<<"company:"<

}

//ex4.8 pizza pie 披萨饼 使用 new创建动态结构

#include#include const int Size=20; struct pizza//声明结构

{

charcompany[Size]; double diameter; double weight;

};

int main()

{

usingnamespace 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 weightof pizza:"; cin>>pie->weight;cout<<"diameter:"<diameter<<"inches"<company<weight<<"ounches"<

}

//ex.4.9 使用 new 动态分配数组—方法 1

#include#include using namespace std; struct CandyBar

{

stringbrand; 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(inti=0;i<3;i++)

{

cout<< " brand: " << snack[i].brand << endl; cout<< " weight: " << snack[i].weight << endl; cout<< " calorie: " << snack[i].calory <

}

delete []snack; return 0;

}

//ex.4.10 数组—方法 1

#include int main()

{

usingnamespace std; const int Size = 3; int success[Size];

cout<<"Enteryour success of the three times 40 meters running:\n"; cin >>success[0]>>success[1]>>success[2];cout<<"success1:"<

}

//ex.4.10 array—方法 2

#include #include int main()

{

usingnamespace std; arrayad={0}; cout<<"Enter yoursuccess of the three times 40 meters running:\n"; cin >> ad[0]>>ad[1]>>ad[2];cout<<"success1:"<

}

第五章 循环和关系表达式

//ex.5.1

#include

int main()

{ using namespace std;cout<<"Please enter two integers: "; int num1,num2;cin>>num1>>num2; int sum=0; for(inttemp=num1;temp<=num2;++temp)//or temp++ sum+=temp; cout<<"The sumfrom "<

}

//ex.5.2

#include #include

int main()

{ using namespace std;

arrayad={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<

return 0;

}

#include #include using namespace std;

int main()

{ array<longdouble,101> multiply; multiply[0] = multiply[1] = 1LL; for (inti= 2; i <= 100; i++)

multiply[i] = multiply[i-1]*i;

cout <return 0;

}

//ex.5.3

#include 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 "<

} return 0;

}

//ex.5.4

#include int main()

{

using namespace std; double sum1,sum2; sum1=sum2=0.0; intyear=0; while(sum2<=sum1)

{

++year;sum1+=10; sum2=(100+sum2)*0.05+sum2;

}

cout<<"经过"<

return 0;

}

#include using namespace std; int main()

{ doubleDaphne= 100.0; double Cleo= 100.0; int year= 0; while (Cleo<= Daphne)

{

Daphne += 10; Cleo *=1.05; year++;

} cout << year << endl; return0;

}

//ex.5.5

#include const int MONTHS = 12;

const                                                                             char*

months[MONTHS]={"January","February","March","April","May","June","July","August","September","October","November","December"}; intmain()

{ using namespace std; intsales[MONTHS],sum=0; for(int i=0;i

{ cout<<"请输入在"<>sales[i]; sum+=sales[i];

}

cout<<"这一年中的C++ For Fools的总销售量为:"<

}

//ex.5.6

#include const int MONTHS = 12;

const    char* months[MONTHS]={"January","February","March","April","May","June","July","August","September","October","November","December"};

const char* years[3]={"第一年","第二年","第三年"}; int main()

{ using namespace std; intyear_sale[3],sum=0,sales[3][MONTHS]; for(int i=0;i<3;i++)

{ int temp=0;cout<

{ cout<<"请输入"<>sales[i][j]; temp+=sales[i][j];

} year_sale[i]=temp; sum+=year_sale[i];

} for(int i=0;i<3;i++)cout<

}

#include using namespace std; const int Years = 3,Months = 12; const char* months[Months] =

{ "January","February","March","April","May","June",

"July","August","September","October","November","December"}; intmain()

{ intsale[Years][Months]= {0}; for (inti= 0; i < Years; i++)

{

int sum = 0; for(intj= 0; j < Months; j++)

{ cout << "Enterthe salesment of " << months[j] << ":";cin >> sale[i][j]; sum += sale[i][j];

} cout << "Salesmentfor this year: " << sum << endl <return 0;

}

//ex.5.7

#include #include using namespace std; struct car{ string name; int year; }; int main()

{ cout<<"How many cars do you wish to catalog? "; int num;

(cin>>num).get(); car* ps=new car[num]; for(int i=0;i

{ cout<<"Car#"<

(cin>>ps[i].year).get();

}

cout<<"Here is your collection:\n";for(int i=0;i

}

#include #include using namespace std; structcar

{ string maker; intyear;}; int main(){

int number; cout<< "How many cars do you wish to catalog? ";

cin >> number;

car* a = newcar[number];for (inti= 0; i < number; i++)

{

cout << "Car#" <": " << endl; cout << "Pleaseenter the maker: "; cin.get(); getline(cin,a[i].maker);cout << "Please enter the year made: "; cin >> a[i].year;

} cout <<"Here is your collection: " << endl; for(inti= 0; i < number; i++) cout << a[i].year << "" <delete [] a; return0;

}

#include using namespace std; struct car

{ char maker[20]; intyear;}; int main()

{ intnumber;cout << "How many cars do you wish to catalog? ";

cin >> number;

car* a = newcar[number];for (inti= 0; i < number; i++)

{

cout << "Car#" <": " << endl; cout << "Pleaseenter the maker: "; cin.get(); cin.getline(a[i].maker,20); cout << "Please enter the year made: "; cin >> a[i].year;

} cout << "Hereis your collection: " << endl;

for (int i = 0; i

cout << a[i].year << "" <delete [] a; return0;

}

//ex.5.8

#include #include

int main()

{ using namespace std;

char word[20]; int sum=0; cout<<"Enterwords (to stop,type the word done):\n"; cin>>word;while(strcmp(word,"done"))

{ sum++; cin>>word; } cout<<"Youentered a total of "<

}

//ex.5.9

#include #include

int main()

{ using namespace std; string word; intsum=0; cout<<"Enter words (to stop, type the word done):\n";cin>>word; while(word!="done")

{ sum++; cin>>word; } cout<<"Youentered a total of "<

}

和 ex.5.8 的区别是:word != "done",因为当 word = done一样时,返回值为1,不一样时才是返回0.

//ex.5.10

#include int main()

{ using namespace std;cout<<"Enter number of rows:";

int num; cin>>num; for(int i=0;i

{ for(int j=num-i;j>1;j--)

cout<<".";

for(int k=0;k<=i;++k)cout<<"*";

cout<

} return 0; }

第六章 分支语句和逻辑运算符

//ex.6.1

#include #include

int main()

{ using namespace std;

char ch; cin.get(ch);

while(ch!='@')

{ if(isdigit(ch)) cin.get(ch);

else { if(islower(ch)) ch=toupper(ch); else

ch=tolower(ch); cout<

} } return 0;

}

#include #include using namespace std;

int main()

{ charch;cout << "Please enter: \n"; while (cin.get(ch)&& ch != '@')

{ if(islower(ch))

{ ch = toupper(ch); cout<< ch; } else if(isupper(ch))

{ ch = tolower(ch); cout<< ch; } else

cout << ch; } return0;

}

//ex.6.2--数组

#include #includeint main() {

using namespace std;

double sum=0,average=0; double num[10]; int i=0,total=0;

double temp;

while(cin>>temp&&i<10&&!isdigit(temp))

{ num[i]=temp; sum+=num[i];

++i; }

if(i!=0) average=sum/i;

for(int j=0;javerage)

++total;

cout<<"这些数字的平均值为"<

return 0;

}

#include using namespace std; const int Num = 10; intmain()

{ doubledonation[Num];

int i = 0; intcount=0; double sum= 0.0; cout << "Please enter: \n"; while(i < Num&& cin >> donation[i])

{ sum += donation[i++];

} if(i == 0)

cout << "Nodata--bye \n";

else

{ double average =sum/i; for (intj= 0; j < i; j++)

{ if(donation[j]> average)

++count;

} cout << "Theaverage = "

<< average << endl

<< "Thenumbers bigger than the average: "

<< count << endl;

} return 0;

}

//ex.6.2--array

#include

#include #include intmain()

{ using namespace std;

double sum=0,average=0;

arrayad={0};

int i=0,total=0;

double temp;

while(cin>>temp&&i<10&&!isdigit(temp))

{ ad[i]=temp; sum+=ad[i];

++i; }

if(i!=0) average=sum/i;

for(int j=0;javerage)

++total;

cout<<"这些数字的平均值为"<

return 0;

}

//ex.6.3

#include

int main()

{ using namespace std;

cout<<"Please enter one of the followingchoices:\n"

                <<"c)carnivore          p)pianist\n"

                <<"t)tree               g)game\nf\n";   //书上的这个f个人认为是打印错误

cout<<"Please enter a c, p,t, or g: ";

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 mapleis a carnivore.\n"; break;

case 'p': cout<<"A maple isa pianist.\n"; break;

case 't': cout<<"A maple isa tree.\n"; break;

case 'g':

cout<<"Amaple is a game.\n";

} return 0;

}


#include using namespace std; void show(); intmain()

{ show(); charchoice;while (cin>> choice)

{ switch(choice)

{

case 'c':cout << break;

case 'p':cout << break;

case 't':cout << break;

case 'g':cout << break;

default : cout<<

}

} return0;}

void show()

{ cout<< "Please enter

"c)carnivore

"t)tree

}

//ex.6.4

#include const int strsize=20;

struct bop{

"It's acarnivore.\n";

"It's apianist.\n";

"Amaple is a tree.\n";

"It's agame.\n";"Please enter a c, p, t, or g:"; oneof the following choices: \n"

p)pianist\n"

g)game\n";


char fullname[strsize]; char title[strsize]; charbopname[strsize]; int preference;

}; int main()

{ using namespace std;

cout<<"Benevolent Order of ProgrammersReport\n"

                <<"a. display by name        b. display by title\n"

                <<"c. display by bopname     d. diplay by preference\n"

<<"q. quit\n"; char ch;bop member[5]={

{"WimpMacho","English Teacher","DEMON",0},

{"RakiRhodes","Junior Programmer","BOOM",1},

{"Celia Laiter","SuperStar","MIPS",2},

{"HoppyHipman","Analyst Trainee","WATEE",1},

{"PatHand","Police","LOOPY",2}

}; cout<<"Enter your choice:";while(cin>>ch&&ch!='q')

{ switch(ch)

{ case 'a':

for(int i=0;i<5;i++)cout<

case 'b':

for(int i=0;i<5;i++)cout<

case 'c':

for(int i=0;i<5;i++)cout<

case 'd': for(int i=0;i<5;i++)

{ if(member[i].preference==0)cout<

} break;

} cout<<"Next choice: ";

} cout<<"Bye!\n"; return 0;

}

#include using namespace std; const int strsize = 30; structbop{ char fullname[strsize];char title[strsize];char bopname[strsize];int preference;

}; voidshow();int main()

{ bopA[5]= {

{ "WimpMacho","Teacher", "HAHA", 0},

{ "RakiRhodes","Junior Programmer", "LIAR", 1},

{ "Celia", "engineer", "MIPS", 2},

{ "HoppyHipman","Analyst Trainee", "WAHU", 1},

{ "PatHand","Student", "LOOPY", 2}

}; cout << "BenevolentOrder of Programmers Report\n"; show(); cout << "Enteryour choice: ";char choice;cin >> choice; while (choice!= 'q')

{ switch(choice)

{ case 'a':cout << A[0].fullname << endl << A[1].fullname << endl

<

<break;

case 'b' : cout<< A[0].title << endl << A[1].title << endl

<< A[2].title << endl<< A[3].title << endl

<break;

case'c' :cout << A[0].bopname << endl << A[1].bopname << endl

<

<break;

case'd' :cout << A[0].fullname << endl << A[1].title << endl

<< A[2].bopname << endl<< A[3].title << endl

<< A[4].bopname<< endl; break;

default : cout<< "That's not the proper choice.\n";

} cout << "Nextchoice: ";cin >> choice;

} cout << "Bye!\n"; return0;

} void show()

{

cout << "a. display by name

b. display by title\n"

<< "c. display by bopname

<< "q. quit\n";

d. display by preference\n"

}

//ex.6.5

#include int main()

{ using namespace std;

double income,revenue;

cout<<"请输入你的收入:";

while(cin>>income&&income>=0)

{ if(income<=5000) revenue=0.0; elseif(income<=15000) revenue=0.1*(income-5000); else if(income<=35000)revenue=0.1*(15000-5000)+0.15*(income-15000); elserevenue=0.1*(15000-5000)+0.15*(35000-15000)+0.2*(income-35000);

cout<<"你的所得税为"<

cout<<"请输入你的收入:";

} return 0;

}

#include using namespace std; int main()

{ double income,tax;cout << "Please enter your income: ";

while (cin >>income && income >= 0)

{ if(income <=5000)

tax = 0;

else if(income <=15000) tax = 0.1*(income - 5000);

else if(income <=35000) tax = 10000*0.1 + 0.15*(income - 15000);

else

tax =10000*0.1 + 0.15*20000 + 0.2*(income - 35000);

cout << "Yourtax is: " <"Please enter yourincome: ";

} cout << "Bye!\n"; return0;

}

//ex.6.6

#include #include using namespace std; struct patron{ string name; double money;

};

int main()

{

int num,temp=0;

cout<<"请输入捐款的人数:";

cin>>num; cin.get();

patron *ps=new patron[num];

for(int i=0;i

{

cout<<"请输入第"<

getline(cin,ps[i].name);

cout<<"请输入第"<

cin>>ps[i].money; cin.get(); }

cout<<"Grand Patrons:\n"; for(inti=0;i10000)

{cout<

++temp; }

if(temp==0)cout<<"none\n";

cout<<"Patrons:\n"; for(inti=0;i

{cout<

++temp; }

if(temp==0)cout<<"none\n";

delete [] ps; return 0;

}

#include

#include using namespace std; struct charity

{ stringname;double money;

}; intmain()

{ intnumber;int count= 0; cout << "Please enter the number of donator: "; cin >>number; charity *pt = new charity[number]; for(inti= 0; i < number; i++)

{ cout << "Pleaseenter your name: "; cin.get(); getline(cin, pt[i].name);cout << "Please enter the money you are going to donate: "; cin >>pt[i].money;

if(pt[i].money> 10000) count++;

} if(count == 0)cout << "None(money > 10000)";

else

{ cout << "GrandPatron\n";for(inti= 0; i < number; i++)

{ if(pt[i].money> 10000) cout << pt[i].name << "" <

} cout << endl; if(10 - count ==0) cout << "None(money < 10000)";

else

{ cout << "Patron\n"; for(inti= 0; i < number; i++)

{ if(pt[i].money< 10000) cout << pt[i].name << "" <return 0;

}

//ex.6.7

#include #include

int main()

{ using namespace std;

int vowel=0,consonant=0,other=0; charword[15];

cout<<"Enter words (q to quit):\n";while(cin>>word)

{ if(isalpha(word[0]))

{ if(word[0]=='q'&&strlen(word)==1)break; else if(word[0]=='a'||word[0]=='i'||word[0]=='u'||word[0]=='e'||word[0]=='o')

++vowel; else ++consonant;

} else ++other;

}

cout<

}

#include #include using namespace std; intmain()

{ charword[20];int vow= 0, consonant = 0, other =0; cout << "Enterwords (q to quit):\n"; while(cin >>word)

{ if (isalpha(word[0]))

{ if(word[0] == 'a'||word[0] == 'e' ||word[0] == 'i'||word[0]

== 'o'||word[0] == 'u' ||word[0] == 'A' ||word[0] == 'E' ||word[0] == 'I' ||word[0] ==

'O' || word[0] == 'U')

vow++;

else if(word[0] == 'q'&&strlen(word) == 1) break;

else consonant++;

} else other++;

} cout << vow<< " words beginning with vowels\n"

<< consonant<< " words beginning with consonants\n"

<< other << "others\n";return 0;

}

//ex.6.8

#include

#include #include

int main()

{ using namespace std;

char ch; int sum=0;

ifstream inFile; inFile.open("abc.txt");if(!inFile.is_open())

{ cout<<"Could not open thefile \n"; cout<<"Program terminating.\n"; exit(EXIT_FAILURE);

}

inFile>>ch; while(inFile.good()) { ++sum;inFile>>ch;

}

if(inFile.eof()) cout<<"End of filereached.\n"; else if(inFile.fail()) cout<<"Input terminated bydata mismatch.\n"; else cout<<"Input terminated for unkonwnreason.\n";

cout<<"总共有"<

}

#include

#include #include using namespace std; constint Size= 20; int main()

{ charfilename[Size];ifstream infile; cout << "Entername of data file: "; cin.getline(filename, Size);infile.open(filename); if (!infile.is_open())

{ cout<< "Could not open the file " <"Program terminating.\n"; exit(EXIT_FAILURE);

} char a; intcount= 0; infile >> a; while (infile.good()){

++count; infile >>a;

} if (infile.eof())cout << "End of file reached.\n";

elseif (infile.fail())cout << "Input terminated by data mismatch.\n";

elsecout<< "Input terminated for unknown reason.\n";

if (count == 0)cout << "No data processed.\n";

elsecout<< "The text contains " << count << "character(s)" <

infile.close(); return0;

}

//ex.6.9

#include

#include #include

struct member

{ char name[20]; double donation;

};

int main()

{ using namespace std; intnum,count1=0,count2=0; ifstream fin; char file[20];

cout<<"Enter name of data file: ";cin.getline(file,20); fin.open(file); if(!fin.is_open())

{ cout<<"Could not open thefile-"<

cout<<"Program terminating.\n";

exit(EXIT_FAILURE);

} fin>>num; fin.get(); member *pd=newmember[num]; for(int i=0;i

{ fin.getline(pd[i].name,20);fin>>pd[i].donation; fin.get(); } cout<<"GrandPatrons:\n"; for(int i=0;i=10000)

{ cout<

{cout<

delete [] pd; return 0;

}

#include

#include

#include #include using namespace std; structcharity

{ stringname;double money;

};

int main()

{ stringfilename;ifstream infile; cout << "Entername of data file: "; getline(cin, filename);infile.open(filename); if (!infile.is_open())

{ cout<< "Could not open the file " <"Program terminating.\n"; exit(EXIT_FAILURE);

}

int number,count =0; infile >> number; charity *pt = newcharity[number]; for (inti= 0; i < number; i++)

{ infile.get();getline(infile, pt[i].name); infile >> pt[i].money;

if(pt[i].money> 10000) count++;

} if(count == 0)cout << "None(money > 10000)";

else

{ cout << "GrandPatron:\n";for(inti= 0; i < number; i++)

{ if(pt[i].money> 10000) cout << pt[i].name << "" <

} if(10 - count ==0) cout << "None(money < 10000)";

else

{ cout << "Patron:\n"; for(inti= 0; i < number; i++)

{ if(pt[i].money< 10000) cout << pt[i].name << "" <

} delete [] pt; return0;

}

7章函数——C++的编程模块

//ex7.1

#include double t_av(doublex,double y);int main(){ using namespace std; double x, y; doubleresult;cout << "Please enter two numbers (0 to stop): "; while((cin>> x >> y) && x != 0 && y != 0)

{ result = t_av(x, y);cout << "调和平均数= " << result << endl; cout<< "Please enter two numbers (0 to stop): ";

} return 0; } doublet_av(doublex,double y)

{

return 2.0 * x * y /(x + y);

}

#include using namespace std; void average(double, double); intmain()

{ double A, B; cout<< "Please enter two numbers: "; while (cin >>A >> B)

{

if (A == 0 || B== 0) break;

else

average(A, B);

cout << "Pleaseenter two numbers: ";

} cout << "Bye!\n"; return0;} void average(doublex,double y)

{ cout<< "The average is: "

<< 2.0 * x * y / (x + y)

<< endl;

}

//ex7.2

#include const int MAX = 10; using namespacestd;int fill_ar(doublear[],int limit);void show_ar(constdouble ar[],int n);double average(constdouble ar[],int n);int main(){ double scores[MAX];int size= fill_ar(scores, MAX); show_ar(scores, size); if (size > 0)cout << "The average of scores is: " << average(scores,size) << endl; return 0; } intfill_ar(doublear[],int limit)

{ double temp; inti;for (i= 0; i < limit; i++)

{

cout << "Enterscore #" <": "; cin >> temp; if (!cin) {cin.clear(); while (cin.get()!= '\n')continue;cout << "Bad input; enter a number: "; break;

}

if (temp < 0)

break; ar[i] =temp; } return i;} void show_ar(constdouble ar[],int n)

{

for (int i = 0; i

cout << "score#" <": " << ar[i] << endl;

} double average(constdouble ar[],int n)

{ double sum = 0.0; for(inti= 0; i < n; i++) sum += ar[i]; return sum / n; }

#include using namespace std; double score[10]; intinput(double[],int);void average(double[],int);void show(constdouble[],int);int main()

{ int size =input(score, 10); if (size> 0)

{ show(score, size);average(score, size);

} cout << "Done.\n"; return0;} int input(doublescore[],int limit)

{ doublea;int i;for (i= 0; i < limit;i++)

{ cout << "Yourscore: ";cin >> a; if (!cin)

{ cin.clear(); while(cin.get()!= '\n')continue;

cout << "Badinput; input process terminated.\n"; break;

}

elseif (a< 0) break;

score[i] = a;

} return i; } voidshow(constdouble ar[],int n)

{ doubletotal= 0.0; cout << "Score: "; for (inti= 0; i < n;i++)

{

cout << ar[i] << "";

} cout << endl;

} void average(doublear[],int n)

{ doubleav,total= 0.0; int i;for (i= 0; i < n;i++)

{ total += ar[i];

}

av = total / i;

cout << "Theaverage score: " << av << endl;

}

//ex7.3 #include struct box { charmaker[40];float height;float width;float length;float volume;}; void set_box(box*); void show_box(box);int main(){ using namespace std; box carton = { "BingoBoxer",2, 3, 5}; set_box(&carton); show_box(carton); return 0; }

void set_box(box * pb)

{ pb->volume =pb->height * pb->length * pb->width;

}

void show_box(box b)

{ using namespacestd;cout << "Box maker: " << b.maker << "\nheight:" <

<< "\nlwidth:" <

<< "\nlength:" <

<< "\nvolume:" <

#include using namespace std; struct box

{ charmaker[40];float height;float width;

float length; floatvolume;

}; voidshow(box); box* calculate(box*);int main()

{ box a = { "M", 3.4, 4.5,5.6, 0.0}; show(a); box*pt; cout << endl; pt = calculate(&a); show(a); return0;} void show(boxx)

{ cout<< "The height of the box: " << x.height <

<< "Thewidth of the box: " << x.width<< endl

<< "Thelength of the box: " << x.length<< endl

<< "Thevolume of the box: " << x.volume<< endl;

} box* calculate(box* ps) {

(*ps).volume = (*ps).height * (*ps).length * (*ps).width; returnps;

}

//ex7.4 #include long double probability(unsignednumbers,unsigned picks); int main() { usingnamespace std;double total,choices, mtotal; long double probability1, probability2;

cout<< "Enter total number of game card choices and\n""number of picks allowed for the field:\n"; while ((cin >>total >> choices) && choices < total)

{ cout << "Entertotal number of game card choices and\n" "number of picks allowed forthe mega:\n";if (!(cin>> mtotal)) break;

probability1 =probability(total, choices); probability2 = probability(mtotal, 1); cout<< "The chances of getting all " << choices << "picks is one in "

<".\n"; cout<< "The chances of getting the megaspot is one in "

<< probability2<< ".\n"; cout << "Youhave one chance in "; cout << probability1 *probability2; cout << " of winning.\n";

cout << "Nextset of numbers (q to quit): ";

} cout << "bye\n"; return0;} long double probability(unsigned numbers, unsignedpicks)

{ long double result = 1.0; longdouble n;unsigned p; for (n = numbers,p = picks; p > 0; n--, p--) result = result * n / p; returnresult;}

#include using namespace std; long double probability1(unsigned, unsigned); longdouble probability2(unsigned); intmain()

{ doublea,b, c; cout << "Enter the number of choices on the game card and\n"

<< "thenumber of picks allowed(in 1 field number):\n"; cin >> a >>b; cout << "Enter the number of choices on the game card \n"

<< "(in2 field number):\n"; cin >> c; while(cin)

{

if (b <= a)

{ longdouble chance;chance = probability1(a, b) * probability2(c); cout << "Youhave one chance in "

<" of wining.\n\n"; cout << "Enterthe number of choices on the game card and\n"

<< "thenumber of picks allowed(in 1 field number):\n"; cin >> a >>b; if (!cin)break;

cout << "Enterthe number of choices on the game card \n"

<< "(in2 field number):\n"; cin >> c;

} else break;

} cout << "Bye!\n"; return0;

} long double probability1(unsignednumbers,unsigned picks)

{ longdouble result= 1.0; long double n; unsigned p; for(n= numbers,p = picks;p > 0; n--, p--) result = result * n / p; return result;

} long double probability2(unsignednumbers)

{ longdouble result;result = 1.0 / numbers;return result;

}

//ex7.5

#include long long int recure(int); intmain(){ using namespace std; int number; cout<< "Enter a integer (q to stop): "; while(cin>> number)

{ long long int result =recure(number); cout << number << "! =" <"Next:"; } cout<< "Done!" << endl; return 0; }

long long int recure(intn)

{ long long int result; if (n > 0)result = n * recure(n-1); else result = 1; returnresult;}

#include using namespace std; unsigned long sub(int); intmain()

{ cout<< "Enter one integer: (q to quit)"; intnum;while(cin>> num)

{ unsigned long result =sub(num); cout << "The result of "<"! is: "

<< result << endl

<< "Nextnumber: ";

} return 0; } unsignedlong sub(intn)

{ unsignedlong result= n;if (result> 0)

result = result * sub(n - 1); else

result = 1;

return result;

}

//ex7.6

#include const int Size = 10; int Fill_array(doublear[],int n);void Show_array(constdouble ar[],int n);void Reverse_array(doublear[],int n);int main(){ using namespace std; double values[Size]; intlen= Fill_array(values, Size); cout << "Arrayvalues:\n";Show_array(values, len); cout << "Arrayreversed:\n";Reverse_array(values, len); Show_array(values, len); cout << "Allbut end values reversed:\n";

Reverse_array(values+1,len-2); Show_array(values, len); return 0; } intFill_array(doublear[],int n)

{ using namespacestd;double temp;int i;for (i=0;i

{

cout << "Entervalue #" <": "; cin >> temp; if (!cin) break; ar[i] =temp; } cout << endl; return i; } voidShow_array(constdouble ar[],int n)

{ using namespacestd;for (inti=0;i"Property #" << i+1<< ": "

<< ar[i] << endl;

cout << endl; } voidReverse_array(doublear[],int n)

{ double temp;

for (int i=0,j=n-1;i

{ temp = ar[i]; ar[i] =ar[j]; ar[j] = temp;

}

}

#include using namespace std; const int Asize = 10; intFill_array(double[],int);void Show_array(double[],int);double *Reverse_array(double [],int,int);int main()

{ double numbers[Asize];cout << "Please enter some numbers(less than ten): \n"; inti= Fill_array(numbers, Asize);

cout << "You'veentered " <" numbers:\n"; Show_array(numbers, i); cout <

double * pt =Reverse_array(numbers, 0, i); Show_array(pt, i); cout << endl;

double * ps =Reverse_array(numbers, 1, i); Show_array(ps, i); cout << endl; return0;} int Fill_array(doublear[],int size)

{ inti;for (i= 0; i < Asize; i++)

{ if (cin >> ar[i])

; else break;

} return i; } voidShow_array(doublear[],int size)

{

for (int i = 0; i < size; i++)

cout << ar[i] << "";

} double *Reverse_array(double ar[],int a,int size)

{ cout << "Hereare(is) the number(s) after reverse:\n"; double temp;

for (int i = a; i < size/2; i++)

{ temp = ar[i]; ar[i] = ar[size-i - 1]; ar[size-i - 1] = temp;

} return ar;

}

//ex7.7

#include const int Max = 5; double * fill_array(double*begin, double *end); void show_array(constdouble *begin, const double * end); void revalue(doubler,double *begin, double *end); int main(){ using namespace std; double properties[Max];double *pbegin = properties; double * pend =fill_array(pbegin, pbegin + Max); show_array(pbegin, pend); if (pend-pbegin> 0)

{ cout << "Enterrevaluation factor: "; double factor; while(!(cin>> factor))

{ cin.clear(); while(cin.get()!= '\n')continue;cout << "Bad input; Please enter a number: "; }revalue(factor, pbegin, pend); show_array(pbegin, pend);

} cout << "Done.\n"; return0;} double *fill_array(double *begin, double *end)

{ using namespacestd;double temp;int i= 1; while (begin< end)

{

cout << "Entervalue #" <": "; cin >> temp; if (!cin) {cin.clear(); while (cin.get()!= '\n')continue;cout << "Bad input; input process terminated.\n"; break;

}

else if (temp < 0)

break;

*begin = temp; begin++;i++; } return begin;} void show_array(constdouble *begin, const double * end)

{ using namespacestd;int i= 1; while (begin< end)

{

cout << "Property#" <": $"; cout << *begin << endl;begin++; i++; }

}

void revalue(doubler,double *begin, double *end)

{

while (begin

{

*begin *= r; begin++; }

}

#include using namespace std; const int Max = 5; voidshow_array(constdouble [],double *);void revalue(double, double[],double *);double *fill_array(double [],int);int main()

{ doubleproperties[Max];double *p = fill_array(properties, Max); show_array(properties, p); if (p !=&properties[0])

{ cout << "Enterrevaluation factor: "; double factor; while(!(cin>> factor))

{ cin.clear(); while(cin.get()!= '\n')continue;

cout << "Badinput; Please enter a number: ";

} revalue(factor,properties, p); show_array(properties, p);

} cout << "Done.\n"; return0;} double *fill_array(double ar[],int n)

{ doubletemp;int i;for (i= 0; i < n;i++)

{

cout << "Entervalue #" <<(i + 1) << ": ";

cin >> temp; if (!cin)

{ cin.clear(); while(cin.get()!= '\n')continue;

cout << "Badinput; input process terminated.\n"; break;

}

elseif (temp< 0) break;

ar[i] = temp;

}

double * pt = &ar[i - 1]; returnpt;

} void show_array(constdouble ar[],double *ps)

{ constdouble *p = &ar[0];for (inti= 0; p != ps +1; p++,i++)

{

cout << "Property#" <<(i + 1) << ": $"; cout << ar[i] <

} } voidrevalue(doubler,double ar[],double *ps)

{ double*p = &ar[0];for (inti= 0; p != ps +1; p++, i++) ar[i]*= r;

}

//ex7.8a

#include const int Seasons = 4; const char * Snames[] = { "Spring", "Summer", "Fall", "Winter"}; voidfill(doublear[],int n);void show(doublear[],int n);int main(){ using namespace std; double expenses[Seasons];fill(expenses, Seasons);

show(expenses, Seasons); return0;} void fill(doublear[],int n)

{ using namespacestd;for (inti=0;i

{ cout << "Enter" <" expenses: "; cin >> ar[i];

} } voidshow(doublear[],int n)

{ using namespacestd;cout << "\nEXPENSES\n"; double total = 0.0; for(inti=0;i

{ cout << Snames[i]<< ": $" << ar[i] <

} cout << "TotalExpenses: $" <

#include using namespace std; const char * Seasons[4] ={ "Spring", "Summer", "Fall", "Winter"}; voidfill(double*);void show(double[]);int main()

{ double expenses[4];fill(expenses); show(expenses); return 0; } voidfill(doublear[])

{ doublecosts;

for (int i = 0; i <4; i++)

{ cout << "Enter" <" expenses: "; cin >> ar[i];

} } voidshow(doublear[])

{ double total = 0.0;cout << "\nEXPENSES\n";

for (int i = 0; i <4; i++)

{ cout << Seasons[i]<< ": $" << ar[i] <ar[i];

} cout << "TotalExpenses: $" <

}

//ex7.8b(传递结构值)

#include const int Seasons = 4; struct data { doublearr[Seasons];

}; constchar *Snames[] = { "Spring", "Summer", "Fall", "Winter"}; datafill(); void show(data);int main(){ using namespace std; data expenses = fill();show(expenses); return 0;} data fill() { using namespace std; data expenses;

for (int i=0;i

{ cout << "Enter" <" expenses: "; cin >> expenses.arr[i];

}

return expenses;

} void show(dataexpenses)

{

using namespacestd;cout << "\nEXPENSES\n"; double total = 0.0; for(inti=0;i

{ cout << Snames[i]<< ": $" << expenses.arr[i] <

} cout << "TotalExpenses: $" <

}

//ex7.8b(传递结构指针)

#include const int Seasons = 4; struct data { doublearr[Seasons];

}; constchar *Snames[] = { "Spring", "Summer", "Fall", "Winter"}; voidfill(data* pd); void show(data* pd); int main(){ using namespace std; data expenses; fill(&expenses);show(&expenses); return 0; }

void fill(data * pd)

{ using namespacestd;for (inti=0;i

{ cout << "Enter" <" expenses: "; cin >> pd->arr[i];

} }

void show(data * pd)

{ using namespacestd;cout << "\nEXPENSES\n"; double total = 0.0; for(inti=0;i

{

cout << Snames[i]<< ": $" << pd->arr[i] <arr[i];

} cout << "TotalExpenses: $" <

#include using namespace std; const char * Seasons[4] ={ "Spring", "Summer", "Fall", "Winter"}; structexpenditure

{ doubleexpenses[4];

};expenditure fill(expenditure); voidshow(expenditure); intmain()

{ expenditure a = { {0.0}}; expenditure v = fill(a);show(v); return 0;} expenditure fill(expenditure b)

{

for (int i = 0; i <4; i++)

{ cout << "Enter" <" expenses: "; cin >> b.expenses[i];

}return b;} void show(expenditureb)

{ double total = 0.0;cout << "\nEXPENSES\n";

for (int i = 0; i <4; i++)

{ cout << Seasons[i]<< ": $" << b.expenses[i]<< endl; total += b.expenses[i];

} cout << "TotalExpenses: $" <

}

//ex7.9

#define _CRT_SECURE_NO_WARNINGS#include usingnamespace std;const int SLEN = 30; struct student { charfullname[SLEN];char hobby[SLEN];int ooplevel;}; int getinfo(studentpa[], int n);void display1(studentst); void display2(conststudent* ps); void display3(conststudentpa[], int n);int main(){ cout << "Enter class size: "; int class_size;cin >> class_size; while (cin.get() != '\n') continue; student *ptr_stu = new student[class_size];int entered= getinfo(ptr_stu, class_size); for (int i = 0; i

{ display1(ptr_stu[i]);display2(&ptr_stu[i]);

} display3(ptr_stu,entered); delete []ptr_stu; cout << "Done\n"; return0;

}

// getinfo() has twoarguments: a pointer to the first element of

// an array of studentstructures and an int representing the

// number of elements of thearray. The function solicits and

// stores data aboutstudents. It terminates input upon filling

// the array or upon encountering a blank line for the student //name. The function returns the actual number of array elements // filled.

int getinfo(student pa[], intn)

{ int num_array_elem= n; char tmp[SLEN];

for (int i = 0; i < n;++i)

{ cout << "Entername: ";cin.getline(tmp, SLEN); bool blank_line = true;

for (unsigned j = 0; j

{ if (!isspace(tmp[j]))

{ blank_line = false; break; } }

if (blank_line)

{ num_array_elem = i; break; } strcpy(pa[i].fullname,tmp); cout << "Enter hobby: "; cin.getline(pa[i].hobby,SLEN); cout << "Enter ooplevel:";cin >> pa[i].ooplevel; cin.get(); } cout << endl; returnnum_array_elem;

}

// display1() takes astudent structure as an argument

// and displays its contents void display1(studentst)

{ cout <'\t' <'\t' <

}

// display2() takes the address of student structure as an //argument and displays the structure’¡¥s contents void display2(conststudent* ps)

{ cout <fullname << '\t' <hobby << '\t' <ooplevel

<< endl;

}

// display3() takes theaddress of the first element of an array

// of student structures and the number of array elements as //arguments and displays the contents of the structures void display3(conststudentpa[], int n)

{

for (inti= 0; i < n; ++i) cout << pa[i].fullname << '\t'<'\t' <

#include using namespace std; const int SLEN = 30; structstudent { char fullname[SLEN];char hobby[SLEN];int ooplevel;

}; intgetinfo(studentpa[],int n);void display1(studentst);void display2(conststudent * ps); void display3(conststudent pa[], int n); intmain()

{ cout<< "Enter class size: "; int class_size;cin >> class_size; while (cin.get() != '\n') continue;

student * ptr_stu = newstudent[class_size]; int entered =getinfo(ptr_stu, class_size); for (int i = 0; i

{ display1(ptr_stu[i]);display2(&ptr_stu[i]);

} display3(ptr_stu,entered); delete []ptr_stu; cout << "Done\n"; return0;} int getinfo(student*p,int num)

{

int i; for(i= 0; i < num;i++)

{ cout << "Enterthe fullname: ";cin.getline((p +i)->fullname, SLEN); cout << "Enter the hobby:";cin.getline((p +i)->hobby, SLEN); cout << "Enter the ooplevel:";cin >> (p +i)->ooplevel; if (!cin)break;

else cin.get();

} return i;

} void display1(studentst)

{ cout<< st.fullname<< " "

<< st.hobby<< " "

<< st.ooplevel<< endl;

} void display2(conststudent * ps)

{ cout<< ps->fullname<< " "

<< ps->hobby<< " "

<< ps->ooplevel<< endl;

} void display3(conststudent pa[], intnum)

{

for (int i = 0; i < num; i++)

{ cout << pa[i].fullname<< " "

<< pa[i].hobby<< " "

<< pa[i].ooplevel<< endl;

}

}

//ex7.10 #include double calculate(doublex,double y,double (*pf)(double, double)); doubleadd(doublex,double y);double sub(doublex,double y);double mean(doublex,double y);

int main() { usingnamespace std;double a,b; double (*pf[3])(double, double) = {add, sub,mean}; char *op[3] = { "add", "sub", "mean"}; cout<< "Enter pairs of numbers (q to quit): "; while(cin>> a >> b)

{ for (inti=0;i<3; i++)

{

cout << op[i] << ":" <" and " << b << "= "

<< calculate(a, b, pf[i]) <

}

} } doublecalculate(doublex,double y,double (*pf)(double, double))

{ return (*pf)(x, y);

} double add(doublex,double y)

{

return x + y;

} double sub(doublex,double y)

{

return x - y;

} double mean(doublex,double y)

{

return (x + y) / 2.0;

}

8函数探幽

//ex8.1

#include void show(constchar *ps, int n= 0); int main()

{

using namespacestd;char *pstr = "Hello\n"; show(pstr); int num; cout<< "Enter a number: "; cin >> num;show(pstr, num); cout << "Done\n"; return0;} void show(constchar *ps, int n)

{ using namespacestd;int lim= n; if (n== 0) lim = 1; for (inti=0;i

}

//ex8.2

#include #include usingnamespace std;struct CandyBar{ string name; double weight;int hot;

}; voidset(CandyBar& cb, char *ps, double w,int h);void show(constCandyBar& cb); int main(){ using namespace std; CandyBar candy; char*p = "Millennium Munch"; double x = 2.85; inty= 350; set(candy, p, x, y); show(candy); return 0;

} void set(CandyBar& cb, char *ps, double w,int h)

{

cb.name = ps; cb.weight =w; cb.hot = h;

} void show(constCandyBar& cb)

{ cout << "Name:" <"Weight: " <

<< "Hot:" <

}

#include #include using namespace std; structCandyBar { string brand; doubleweight;int calories;

}; void function(CandyBar&,char *str = "Millennium Munch", double a = 2.85, intb= 350); void show(constCandyBar &); int main()

{

CandyBar x; cout<< "Please enter the brand: \n"; getline(cin, x.brand);cout << "Please enter the weight: \n"; cin >> x.weight;cout << "Please enter the colories: \n"; cin >>x.calories; show(x); function(x); show(x); return 0;

} void show(constCandyBar &a)

{ cout<< endl << a.brand << endl

<< a.weight<< endl

<< a.calories<< endl;

} void function(CandyBar&r, char*str,double a,int b)

{

r.brand = str;

r.weight = a;

r.calories = b;

}

//ex8.3

#include

#include #include usingnamespace std;void str_to_upper(string& str); int main(){ string str1; cout << "Enter a string (q toquit): ";while (getline(cin,str1) && str1!="q" &&str1!="Q")

{ str_to_upper(str1); cout<< str1 << endl; cout << "Nextstring (q to quit): ";

} cout << "Bye."; return0;} void str_to_upper(string& str)

{ int limit =str.size(); for (inti=0;i

{ if (isalpha(str[i]))str[i] = toupper(str[i]);

}

}

#include

#include #include using namespace std; voidupper(string&);int main()

{ string str; cout<< "Enter a string (q to quit): ";

getline(cin, str);

while (str != "q"&&str != "Q")

{ upper(str); cout<< str << endl; cout << "Nextstring (q to quit): "; getline(cin, str);

} cout << "Bye.\n"; return0;} void upper(string&a)

{

for (int i = 0; i < a.size(); i++)

{ if (islower(a[i])) a[i] = toupper(a[i]);

}

}

// ex8.4

#define _CRT_SECURE_NO_WARNINGS

#include

#include //for strlen(), strcpy() using namespace std; structstringy{ char *str; // points to a string int ct; //length of string (not counting '\0')

}; voidshow(constchar *str,int cnt= 1); void show(conststringy& bny, int cnt= 1); void set(stringy& bny, const char * str); int main(void) { stringybeany; char testing[]= "Reality isn't what it used to be."; set(beany,testing); // first argument is a reference,

// allocates space to hold copy of testing, // sets str member ofbeany to point to the

// new block,copies testing to new block, // and sets ct member of beany show(beany); //prints member string once show(beany, 2); // printsmember string twice testing[0]= 'D';testing[1] = 'u';

show(testing); //prints testing string once show(testing, 3); //prints testing string thrice show("Done!"); return0;} void show(constchar *str,int cnt)

{ while(cnt-- > 0)

{ cout << str<< endl;

} } voidshow(conststringy& bny, int cnt)


{ while(cnt-- > 0){ cout << bny.str << endl;

} } voidset(stringy& bny, const

{ bny.ct = strlen(str);bny.str = new char[bny.ct+1];strcpy(bny.str, str); }

#include using namespace std; #include struct stringy { char * str; intct;}; void set(stringy&,char []);void show(conststringy &, int void show(constchar [],int nint main()

{ stringybeany;char *str) n= 1); = 1);


char testing[] = "Realityisn't what it used to be."; set(beany, testing); show(beany);show(beany, 2); testing[0] = 'D';

testing[1] = 'u';show(testing); show(testing, 3); show("Done!"); return0;} void set(stringy&a,char b[])

{

a.str = b; } voidshow(conststringy &x, intn)

{

for (int i = n; i > 0;i--)

cout << x.str <

} void show(constchar a[],int n)

{

for (int i = n; i > 0;i--)

cout << a << endl;

}

//ex8.5

#include const int Limit = 5; template <typenameT>T max5(T ar[]); int main(){ using namespace std; int ari[Limit] ={1, 2, 3, 5, 4}; double ard[Limit]= {1.1, 2.2, 3.3, 5.5, 4.4}; int maxi = max5(ari); doublemaxd= max5(ard); cout << "maxi = " << maxi<< endl; cout << "maxd = " << maxd<< endl; return 0;}

template <typenameT>

T max5(T ar[]) {

T max = ar[0]; for(inti=1;i

{ if (max return max; }

#include using namespace std; const int Num = 5; template<classAnyType> AnyType max5(AnyType[]);int main()

{

int a[Num] = {1,2, 3, 4, 5}; double b[Num]= {1.1, 2.2, 3.3, 4.4, 5.5}; int maxi = max5(a); doublemaxd= max5(b); cout << "max in a[5]: " << maxi<< endl

<< "max inb[5]: " <return 0;}

template <classAnyType>

AnyType max5(AnyType ar[]) {

AnyType max = ar[0]; for(inti= 0; i < 5; i++)

{ if (max < ar[i])

max = ar[i];

} return max;

}

//ex8.6 #include template <typenameT>T maxn(T ar[], int n);template <> const char* maxn(constchar*ar[], int n);int main(){ using namespace std; int ari[6] = {1,2, 3, 4, 6, 5}; double ard[4]= {1.1, 2.2, 4.4, 3.3}; const char * ars[5] = {

"a",

"bb",

"ccc",

"ddddd",

"eeee"

}; cout << "Themax integer of array is: " << maxn(ari, 6) << endl;cout << "The max double of array is: " <"Themax string of array is: " << maxn(ars, 5)<

}

template <typenameT>T maxn(T ar[], int n)

{

T maxar = ar[0]; for(inti=1;i

{ if (maxar

} return maxar;

} template <> constchar*maxn(const char* ar[],int n)

{ const char * maxs =ar[0]; for (inti=1;i

{ if (strlen(maxs)< strlen(ar[i])) maxs = ar[i];

} return maxs; }

#include using namespace std; template <typenameT>T maxn(T[],int);template <>const char* maxn<const char *>(constchar *[], int);int main()

{

int a[6] = {1, 2,3, 4, 5, 6}; double b[4]= {1.1, 2.2, 3.3, 4.4}; int maxi = maxn(a, 6); doublemaxd= maxn(b, 4); const char * c[5] = {

"a",

"bb",

"ccc",

"ddddd",

"eeee"

};

cout << "maxi:" <

<< "maxd:" <

<< "Themax string of array is:


" <


return 0; }

template <typenameT>T maxn(Tar[],int n){

T max = ar[0]; for(inti= 0; i < n;i++)

{ if (max < ar[i]) max = ar[i];

} return max;

} template <> constchar*maxn<const char *>(const char * ar[],intn)

{ const char * maxs = ar[0]; for(inti=1;i<n;i++)

{ if (strlen(maxs)< strlen(ar[i]))maxs = ar[i];} return maxs;}

//ex8.7 #include template <typenameT>T SumArrray(Tarr[],int n);template <typenameT>T SumArrray(T*arr[], int n);struct debts

{ char name[50]; doubleamount;

}; intmain(){ using namespace std;

int things[6] ={13, 31, struct debts mr_E[3]= { { "Ima Wolfe", 2400.0},

{ "UraFoxe",1300.0},

{ "IbyStout",1800.0} }; double *pd[3]; for (inti=0;i<3; i++)


103, 301, 310, 130};


pd[i] = &mr_E[i].amount;

cout << "Sum:Mr.E's counts of things: "

<"Sum:Mr.E's debts: "

<< SumArrray(pd, 3)<< endl; return 0;} template <typenameT>

T SumArrray(Tarr[],int n)

{ usingnamespace std;T sum= 0;

cout << "templateA\n";for (inti= 0; i < n;i++) sum += arr[i];

returnsum;} template <typenameT>

T SumArrray(T*arr[],int n)

{ usingnamespace std;T sum= 0;

cout << "templateB\n";for (inti= 0; i < n;i++) sum += *arr[i];

return sum;

}

第 9章 内存模型和名称空间

// ex9.1

//golf.h

const int Len = 40; structgolf

{ charfullname[Len];int handicap;

}; voidsetgolf(golf&g, const char * name, int hc); intsetgolf(golf&g); void handicap(golf&g, int hc);void showgolf(constgolf &g);

//golf.cpp

#include #include "golf.h" using namespace std; intsetgolf(golf&g)

{ cout<< "Enter the golfer's name: \n"; cin.get(g.fullname,Len); if (g.fullname[0]== '\0')return 0;

cout << "Enterthe handicap for " << g.fullname<< endl; while (!(cin>> g.handicap))

{ cin.clear(); while(cin.get()!= '\n')continue;

cout << "Pleaseenter an integer.\n";

} cin.get(); return1;} void setgolf(golf&g,const char * name, inthc)

{ strncpy_s(g.fullname, name, Len); g.handicap = hc; } voidhandicap(golf&g,int hc)

{

g.handicap = hc; } voidshowgolf(constgolf &g)

{ cout << "Golfer:" <<g.fullname<< "\n"; cout << "Handicap:" <<g.handicap<< "\n\n";

}

//main.cpp

#include #include "golf.h" const int Men = 5; intmain()

{ golfgolfer[Men];int i;for (i= 0; i < Men; i++)

{ if(setgolf(golfer[i])== 0) break;

}

for (intj= 0; j < i; j++) showgolf(golfer[j]);

golf ann;setgolf(ann, "Ann Birdfree", 24); showgolf(ann);handicap(ann, 4); showgolf(ann); return 0;

}

//ex9.2

#include #include using namespace std; voidstrcount(conststring);int main()

{ stringinput;cout << "Enter a line:\n"; getline(cin, input); while(input!= "")

{strcount(input); cout << "Enter next line(empty line to quit):\n";

getline(cin, input);

}

cout << "Bye\n"; return0;} void strcount(conststring str)

{ staticint total= 0; int count;count = str.size();total += count; cout << count << "characters\n";cout << total << " characterstotal\n";

}

//ex9.3

#include

#include #include using namespace std; structchaff

{ char dross[20]; intslag;}; int main()

{ chaff*p = new chaff[2];strcpy_s(p[0].dross, "Piffa like"); p[0].slag = 5; strcpy_s(p[1].dross, "Fuckme so hard");p[1].slag = 6; for (inti= 0; i < 2; i++)

cout <" " << p[i].slag << endl;

return 0;

}

//ex9.4//sales.h namespace SALES { const int QUARTERS = 4; structSales{ double sales[QUARTERS];double average;double max;double min;

};

// copies the lesser of 4 orn items from the array ar

// to the sales member of sand computes and stores the

// average, maximum, and minimum values of the entered items; //remaining elements of sales, if any, set to 0 void setSales(Sales& s, const double ar[], int n); //gathers sales for 4 quarters interactively, stores them

// in the sales member of sand computes and stores the

// average, maximum, and minimum values void setSales(Sales& s);

// display all information in structure s void showSales(constSales& s);

}

//Sales.cpp

#include #include "Sales.h" namespaceSALES

{ using std::cout; usingstd::cin;using std::endl;static double calaverage(double arr[], unsignedarrSize)

{ double sum = 0; for(inti=0;ireturn sum/arrSize;

} static double calmax(doublearr[],unsigned arrSize)

{ double max = arr[0]; for(inti=1;i

{ if (max return max; } staticdouble calmin(doublearr[],unsigned arrSize)

{ double min = arr[0]; for(inti=1;i

{ if (min >arr[i]) min = arr[i]; } return min; } voidsetSales(Sales& s, const double ar[], int n)

{ unsigned times = n unsigned)n: QUARTERS; for (inti=0;ifor (int i=times;i

s.average = calaverage(s.sales, times);

s.max = calmax(s.sales, times);

s.min = calmin(s.sales,times); } void setSales(Sales& s)

{ cout << "Enter4 sales:\n";for (inti=0;i

{

cout << "sales" <": "; cin >> s.sales[i];

}

s.average = calaverage(s.sales,QUARTERS);

s.max = calmax(s.sales, QUARTERS);

s.min = calmin(s.sales,QUARTERS); } void showSales(constSales& s)

{ cout << "sales:";for (inti=0;i"";cout << endl; cout << "average: " <"max:" <"min: " << s.min<< endl;

}

}

//main

#include #include "Sales.h" usingnamespace std;int main()

{

using namespaceSALES;Sales salesBook; double salesList[]= {12.2, 11.16, 10.61, 16.24, 11.53}; setSales(salesBook, salesList, sizeof(salesList)/sizeof(salesList[0]));showSales(salesBook); Sales salesPen; setSales(salesPen); showSales(salesPen);

}

#include #include "Sale.h" using namespace std; intmain()

{ usingnamespace SALES;Sales A,B; double h[4]= {1.1, 2.2, 3.3, 4.4}; setSales(A); showSales(A); setSales(B); showSales(B); return0;

}

10章对象和类

//ex10.1

//bankaccount.h

#ifndef BANKACCOUNT_H_

#define BANKACCOUNT_H_#include classBankAccount

{ private:

std::string name;std::string acctnum; double balance; public:

BankAccount(const std::string& client,

const std::string& num, double bal=0.0);void show()const;void deposit(doublecash);void withdraw(doublecash);

};

#endif

//bankaccount.cpp

#include

#include "bankaccount.h"

BankAccount::BankAccount(conststd::string& client, const std::string& num, double bal)

{ name = client; acctnum =num; balance = bal; } void BankAccount::show()const

{ using std::cout; usingstd::endl;cout << "Client: " << name << endl; cout<< "Account Number: " << acctnum <"Balance: " << balance << endl;

} void BankAccount::deposit(doublecash)

{ if (cash >= 0)balance += cash; else std::cout<< "Illegal transaction attempted";

} void BankAccount::withdraw(doublecash)

{

if (cash< 0) std::cout << "Illegal transactionattempted";else if (cash<= balance) balance -=cash; else std::cout << "Requestdenied due to insufficient funds.\n";

}

//main.cpp

#include #include "bankaccount.h" intmain()

{

BankAccount ba("Kermit", "croak322", 123.00); ba.show();ba.deposit(20); ba.show(); ba.withdraw(300); ba.show(); ba.withdraw(23);ba.show(); return 0;}

//ex10.2

#ifndef PERSON_H_

#define PERSON_H_ #include class Person { private:

static constint LIMIT=25;std::string lname; char fname[LIMIT];public:

Person() {lname=""; fname[0]='\0';} //#1

Person(conststd::string&ln, const char * fn="Heyyou"); //#2// the following methods display lname and fname void Show() const; //firstname lastname format void FormalShow() const; //lastname, firstname format

};

#endif

//person.cpp

#include #include

#include "person.h"

Person::Person(const std::string&ln, const char * fn)

{ lname = ln;strcpy(fname, fn);

} void Person::Show()const

{ using std::cout; usingstd::endl;cout << "The people's name is " << fname << ""<

}

void Person::FormalShow() const

{ using std::cout; usingstd::endl;cout << "The people's name is " << lname << ","<

}

//main.cpp

#include #include "person.h" intmain(){ using std::cout;using std::endl;

Person one;

Person two("Smythecraft"); Personthree("Dimwiddy", "Sam"); one.Show();one.FormalShow(); cout << endl; two.Show(); two.FormalShow(); cout<< endl; three.Show(); three.FormalShow(); cout << endl; return0;}

//ex10.3

//golf.h

#ifndef GOLF_H_ #defineGOLF_H_class Golf{ private:

static constint Len= 40; char fullname[Len];int handicap;public:Golf();

Golf(constchar *name, int hc);const Golf& setgolf(const Golf& g); void showgolf()const;

};

#endif

//golf.cpp

#include

#include

#include "golf.h"

Golf::Golf() {strcpy(fullname, "No Name"); handicap = 0;

}

Golf::Golf(const char * name, inthc)

{ strcpy(fullname, name);handicap = hc; } const Golf& Golf::setgolf(const Golf& g)

{ strcpy(fullname,g.fullname); handicap = g.handicap; return *this; } voidGolf::showgolf()const

{ std::cout << "Golfer:" <"\n"; std::cout << "Handicap:" <"\n\n";

}

//main

#include #include "golf.h" intmain()

{

Golf golger1("AnnBirdfree",5); golger1.showgolf(); Golf golger2; golger2.setgolf(golger1);golger2.showgolf(); return 0;}

//ex10.4

//sale.h

#ifndef SALE_H_ #defineSALE_H_namespace SALES { const int QUARTERS = 4; classSales{ private:

double sales[QUARTERS];double average;double max;double min;public:

// default constructor

Sales();

// copies the lesser of 4 orn items from the array ar

// to the sales member of sand computes and stores the

// average, maximum, andminimum values of the entered items;

// remaining elements ofsales, if any, set to 0

Sales(const double ar[], intn);

// gathers sales for 4quarters interactively, stores them

// in the sales member of sand computes and stores the

// average, maximum, and minimum values void setSales();

// display all information in structure s void showSales() const;

};

}

#endif

//sale.cpp

#include #include "sale.h" namespaceSALES

{ using std::cout; usingstd::cin;using std::endl;static double calaverage(double arr[], unsignedarrSize)

{ double sum = 0; for(inti=0;ireturn sum/arrSize;

} static double calmax(doublearr[],unsigned arrSize)

{ double max = arr[0]; for(inti=1;i

{

if (max return max; } staticdouble calmin(doublearr[],unsigned arrSize)

{ double min = arr[0]; for(inti=1;i

{ if (min >arr[i]) min = arr[i]; } return min; }

Sales::Sales()

{

min = 0; max = 0; average= 0; for (inti= 0; i < QUARTERS; i++) sales[i] =0;

}

Sales::Sales(const double ar[], intn)

{ unsigned times = n unsigned)n: QUARTERS; for (inti=0;ifor (int i=times;i

} void Sales::setSales()

{ cout << "Enter4 sales:\n";for (inti=0;i

{

cout << "sales" <": "; cin >> sales[i];

} *

this = Sales(sales, QUARTERS);

}

void Sales::showSales() const

{ cout << "sales:";for (inti=0;i"";cout << endl; cout << "average: " <"max: " << max<< endl; cout << "min: " << min<< endl;

}

}

//main.cpp

#include #include "sale.h" usingnamespace std;int main()

{ using namespaceSALES;

double salesList[] ={12.2, 11.16, 10.61, 16.24, 11.53}; Sales salesBook(salesList, sizeof(salesList)/sizeof(salesList[0]));salesBook.showSales(); Sales salesPen; salesPen.setSales();salesPen.showSales(); return 0; }

//ex10.5

//stack.h

#ifndef STACK_H_ #defineSTACK_H_struct customer{ char fullname[35];double payment;}; typedef customerItem; class Stack{ private:

enum {MAX = 10};Item items[MAX]; int top;public:Stack();

bool isempty() const; boolisfull()const;

// push() returns false if stack already is full, true otherwise boolpush(constItem& item); // add item to stack

// pop() returns false if stack already is empty, true otherwise boolpop(Item& item); // pop top into item

};

#endif

//stack.cpp

#include

#include "stack.h"

Stack::Stack()

{

top = 0;

} bool Stack::isempty()const

{

return top == 0;

} bool Stack::isfull()const

{

return top == MAX;

} bool Stack::push(constItem& item)

{ if (top < MAX)

{ items[top++] = item; returntrue;} else return false;

} bool Stack::pop(Item& item)

{

if (top > 0)

{ item = items[--top]; returntrue;} else return false; }

//main.cpp

#include

#include #include "stack.h" voidget_customer(customer& cu); int main(){

using namespacestd;Stack st; customer temp; double payment = 0; charch;cout << "Please enter A to add a customer,\n" << "Pto process a customer, and Q to quit.\n"; while (cin >>ch && (ch = toupper(ch)) != 'Q')

{ while (cin.get() != '\n') continue;

if (ch != 'A'&&ch != 'P')

{

cout << "Pleaserespond A, P or Q: ";

continue; } switch(ch){ case 'A':if (st.isfull())cout << "stack already full\n"; else {get_customer(temp); st.push(temp); } break; case 'P':if (st.isempty())cout << "stack is empty\n"; else {st.pop(temp); payment += temp.payment; cout << temp.fullname << "processed. ";cout << "Payments now total $"

<< payment << "\n";

} break; }

cout << "Pleaseenter A to add a customer,\n"

<< "P toprocess a customer, and Q to quit.\n";

} cout << "Done!\n"; return0;} void get_customer(customer& cu)

{ using namespacestd;cout << "Enter customer name: "; cin.getline(cu.fullname,35); cout << "Enter customer payment: "; cin >> cu.payment;while (cin.get()!= '\n')continue;}

//ex10.6

//move.h

#ifndef MOVE_H_ #defineMOVE_H_class Move{ private:double x;double y;public:

Move(doublea= 0, double b= 0); void showMove()const;

Move add(const Move & m) const;

//this function adds x of m to x of invoking object to get new x//add y of m to y of invoking object to get new y, creates a new //move objectinitialized to new x,y values and returns it void reset(doublea= 0,double b= 0);

};

#endif

//move.cpp

#include

#include "move.h"

Move::Move(double a, doubleb)

{

x = a; y = b;

} void Move::showMove()const {

std::cout << "x= " <", y = " << y << "\n";

}

Move Move::add(const Move & m) const

{

Move temp; temp.x = x +m.x; temp.y = y + m.y; return temp; } voidMove::reset(doublea,double b)

{

x = a; y = b;

}

//main

#include #include "move.h" intmain(){ using std::cout;using std::endl;Move move1(4,5);

Move move2(2,1); Movemove3; cout << "The number in move1is:\n";move1.showMove(); cout << "The number in move2is:\n";move2.showMove(); move3 = move2.add(move1); cout << "Thenumber in move3 is :\n"; move3.showMove(); cout << "move1+move2,now move2's number is :\n"; move2.showMove(); cout << "Aftermove1 + move2,now move1's number is :\n"; move1.showMove();move1.reset(); cout << "After resetmove1,now move1's number is:\n"; move1.showMove(); return0;}

//ex10.7

//plorg.cpp

#ifndef PLORG_H_ #definePLORG_H_class Plorg{ private:char name[20];int CI;public:

Plorg();

Plorg(char*na, int n= 50); void resetCI(intn);void showplorg()const;

};

#endif

//plorg.cpp

#include

#include

#include "plorg.h"

Plorg::Plorg() {

strcpy(name, "Plorga");

CI = 0;

}

Plorg::Plorg(char * na, intn)

{

strcpy(name, na);

CI = n;

} void Plorg::resetCI(intn)

{

CI = n;

} void Plorg::showplorg()const

{std::cout << "The plorg's name is " << name << "\n"

<<"The CIis "<

}

//main.cpp

#include #include "plorg.h" intmain(){

using namespacestd;Plorg plorg1; plorg1.showplorg(); Plorg plorg2("heyyroup", 31);plorg2.showplorg(); plorg1.resetCI(41); plorg1.showplorg(); return0;}

//ex10.8

//list.h

#ifndef LIST_H_ #defineLIST_H_const int TSIZE = 50; struct film { chartitle[TSIZE];int rating;}; typedef struct film Item; const int LISTMAX = 10; classList{ private:Item items[LISTMAX]; int count; public: List(); boolisempty();bool isfull();int itemcount();bool additem(Itemitem); void visit(void(*pf)(Item&));

};

#endif

//list.cpp

#include "list.h"

List::List()

{ count = 0;

} bool List::isempty(){ return count== 0; } bool List::isfull(){ return count== LISTMAX;

} int List::itemcount()

{ return count; } boolList::additem(Itemitem)

{ if (count ==LISTMAX) return false; else items[count++]= item; return true; } void List::visit(void(*pf)(Item&))

{ for (inti=0;i

(*pf)(items[i]);

}

//main.cpp

#include

#include #include "list.h" voidshowfilm(Item& item); int main(){

using namespace std;

List movies; Item temp; if (movies.isfull())

{ cout << "Nomore room in list! Bye!\n"; exit(1); } cout << "Enterfirst movie title:\n"; while (cin.getline(temp.title,TSIZE) && temp.title[0] != '\0')

{ cout << "Enteryour rating <1-10>: "; cin >> temp.rating; while(cin.get()!= '\n')continue;if (movies.additem(temp)== false)

{

cout<< "List already is full!\n"; break; }

if (movies.isfull())

{cout << "You have filled the list.\n"; break; } cout<< "Enter next movie title (empty line to stop):\n";

} if (movies.isempty())cout << "No data entered."; else { cout<< "Here is the movie list:\n"; movies.visit(showfilm);

} cout << "Bye!\n"; return0;} void showfilm(Item& item)

{ std::cout << "Movie:" <" Rating: "

<< item.rating << std::endl;

}

//11

1、

//vector.h

#ifndefVECTOR_H_

#defineVECTOR_H_

#include

#include

#include

#include #include using namespace std;

namespaceVECTOR

{

classVector

{ public:

enum Mode {RECT, POL };

private:double x; double y; double mag; doubleang; Mode mode;

voidset_mag();voidset_ang(); voidset_x(); voidset_y();

public:

Vector();

Vector(doublen1, double n2, Mode form = RECT); void reset(double n1, double n2, Mode form =RECT);

~Vector();doublexval()const{ return x; } doubleyval()const{ return y; }doublemagval()const { return mag; } doubleangval()const { return ang; }voidpolar_mode(); voidrect_mode();

Vectoroperator+(const Vector &b)const;

Vectoroperator-(const Vector &b)const;

Vectoroperator-()const; Vector operator*(double n)const;

friendVector operator*(double n, const Vector &a); friendostream&operator<<(ostream&os, const Vector &v);

};}

#endif

//vector.cpp

#include"vector.h"

namespaceVECTOR

{

constdouble Rad_to_deg = 45.0 / atan(1.0);

voidVector::set_mag()

{

mag =sqrt(x * x + y * y);

}

voidVector::set_ang()

{

if (x ==0.0 && y == 0.0)

ang = 0.0;else

ang =atan2(y, x);

}

voidVector::set_x()

{

x  =mag * cos(ang);

}

voidVector::set_y()

{

y  =mag * sin(ang);

}

Vector::Vector()

{

x = y = mag= ang = 0.0; mode = RECT;

}

Vector::Vector(doublen1, double n2, Mode form)

{

mode =form; if (form == RECT)

{

x = n1; y =n2;

set_mag();set_ang();

}

else if(form == POL)

{

mag = n1;ang = n2 / Rad_to_deg;

set_x();set_y();

}

else

{

cout<<"Incorrect 3rd argument to Vector() -- "; cout<< "vectorset to 0\n"; x = y = mag = ang = 0.0; mode = RECT;

}

}

voidVector::reset(double n1, double n2, Mode form)

{

mode = form;if (form == RECT)

{

x = n1; y =n2;

set_mag();set_ang();

}

else if(form == POL)

{

mag = n1;ang = n2 / Rad_to_deg;

set_x();set_y();

}

else

{

cout<<"Incorrect 3rd argument to Vector() -- "; cout<< "vectorset to 0\n"; x = y = mag = ang = 0.0; mode = RECT;

}

}

Vector::~Vector()

{

}

voidVector::polar_mode()

{

mode = POL;

}

voidVector::rect_mode()

{

mode =RECT;

}

VectorVector::operator+(const Vector &b)const

{

returnVector(x + b.x, y + b.y);

}

VectorVector::operator-(const Vector &b)const

{

returnVector(x - b.x, y - b.y);

}

VectorVector::operator-()const

{

returnVector(-x, -y);

}

VectorVector::operator*(double n)const

{

returnVector(n*x, n*y);

}

Vectoroperator*(double n, const Vector &a)

{

return a*n;

}

ostream&operator<<(ostream&os,const Vector &v)

{

if(v.mode == Vector::RECT) os<< "(x,y) = (" <

else if(v.mode == Vector::POL)

{

os<<"(m,a) = (" <

<

}

else

os<<"Vector object mode is invalid";

returnos;

}

}

//randwalk.cpp#include "vector.h" int main()

{

usingVECTOR::Vector; srand(time(0)); double direction; Vector step;

Vectorresult(0.0, 0.0); unsigned long steps = 0; double target; doubledstep;ofstreamfout; fout.open("savesteps.txt"); cout<< "Entertarget distance (q to quit): "; while (cin>> target)

{

cout<<"Enter step length: "; if (!(cin>>dstep)) break;

fout<<"Target Distance: " << target << " Step Size: "<

{

fout<

}

cout<<"After " << steps << " steps, the subject "

"hasthe following location:\n"; cout<< result <

fout<<"After " << steps << " steps, the subject "

"hasthe following location:\n"; fout<< result <

result.polar_mode();cout<< " or\n" << result <

}

cout<<"Bye!\n";

cin.clear();while (cin.get() != '\n') continue;

cin.get();return 0;

}

2、

//vector.h

#ifndefVECTOR_H_

#defineVECTOR_H_

#include

#include

#include #include using namespace std;

namespaceVECTOR

{

classVector

{ public:

enum Mode { RECT, POL }; private:double x; double y; Mode mode;

doubleset_mag()const;doubleset_ang()const; voidset_x(double mag, double ang); voidset_y(double mag,double ang);

public:

Vector();

Vector(doublen1, double n2, Mode form = RECT); void reset(double n1, double n2, Mode form =RECT);

~Vector();doublexval()const{ return x; } doubleyval()const{ return y; }doublemagval()const { return set_mag(); } doubleangval()const { returnset_ang(); } voidpolar_mode(); voidrect_mode();

Vectoroperator+(const Vector &b)const;

Vectoroperator-(const Vector &b)const;

Vectoroperator-()const; Vector operator*(double n)const;

friendVector operator*(double n, const Vector &a); friendostream&operator<<(ostream&os, const Vector &v);

};}

#endif

//vector.cpp

#include"vector.h"

namespaceVECTOR

{

constdouble Rad_to_deg = 45.0 / atan(1.0);

doubleVector::set_mag()const

{

returnsqrt(x* x + y * y);

}

doubleVector::set_ang()const

{

if(x == 0.0 && y == 0.0) return 0.0;

elsereturn atan2(y, x);

}

voidVector::set_x(double mag, double ang)

{

x  =mag * cos(ang);

}

voidVector::set_y(double mag, double ang)

{

y  =mag * sin(ang);

}

Vector::Vector()

{

x = y =0.0; mode = RECT;

}

Vector::Vector(doublen1, double n2, Mode form)

{

mode =form; if (form == RECT)

{

x = n1; y =n2;

}

else if(form == POL)

{

set_x(n1,n2 / Rad_to_deg); set_y(n1, n2 / Rad_to_deg);

}

else

{

cout<<"Incorrect 3rd argument to Vector() -- "; cout<< "vectorset to 0\n"; x = y = 0.0; mode = RECT;

}

}

voidVector::reset(double n1, double n2, Mode form)

{

mode =form; if (form == RECT)

{

x = n1; y =n2;

}

else if(form == POL)

{

set_x(n1,n2 / Rad_to_deg); set_y(n1, n2 / Rad_to_deg);

}

else

{

cout<<"Incorrect 3rd argument to Vector() -- "; cout<< "vectorset to 0\n"; x = y = 0.0; mode = RECT;

}

}

Vector::~Vector()

{

}

voidVector::polar_mode()

{

mode = POL;

}

voidVector::rect_mode()

{

mode =RECT;

}

VectorVector::operator+(const Vector &b)const

{

returnVector(x + b.x, y + b.y);

}

VectorVector::operator-(const Vector &b)const

{

returnVector(x - b.x, y - b.y);

}

VectorVector::operator-()const

{

returnVector(-x, -y);

}

VectorVector::operator*(double n)const

{

returnVector(n*x, n*y);

}

Vectoroperator*(double n, const Vector &a)

{

return a*n;

}

ostream&operator<<(ostream&os,const Vector &v)

{

if(v.mode == Vector::RECT) os<< "(x,y) = (" <

else if(v.mode == Vector::POL)

{

os<<"(m,a) = (" <

<

}

elseos<< "Vector object mode is invalid";

returnos;

}

}

//randwalk.cpp#include "vector.h"

int main()

{

usingVECTOR::Vector; srand(time(0)); double direction; Vector step;

Vectorresult(0.0, 0.0); unsigned long steps = 0; double target; doubledstep;cout<< "Enter target distance (q to quit): "; while(cin>> target)

{

cout<<"Enter step length: "; if (!(cin>>dstep)) break;

while(result.magval() < target)

{

direction =rand() % 360; step.reset(dstep, direction, Vector::POL); result = result +step; steps++;

}

cout<<"After " << steps << " steps, the subject "

"hasthe following location:\n"; cout<< result <

}

cout<<"Bye!\n";

cin.clear();while (cin.get() != '\n') continue;

cin.get();return 0;

}

3、

//vector.h

#ifndefVECTOR_H_

#defineVECTOR_H_

#include

#include

#include #include using namespace std;

namespaceVECTOR

{

classVector

{ public:

enum Mode {RECT, POL };

private:double x; double y; double mag; doubleang; Mode mode;

voidset_mag();voidset_ang(); voidset_x(); voidset_y();

public:

Vector();

Vector(doublen1, double n2, Mode form = RECT); void reset(double n1, double n2, Mode form =RECT);

~Vector();doublexval()const{ return x; } doubleyval()const{ return y; }doublemagval()const { return mag; } doubleangval()const { return ang; }voidpolar_mode(); voidrect_mode();

Vectoroperator+(const Vector &b)const;

Vectoroperator-(const Vector &b)const;

Vectoroperator-()const; Vector operator*(double n)const;

friendVector operator*(double n, const Vector &a); friendostream&operator<<(ostream&os, const Vector &v);

};}

#endif

//vector.cpp

#include"vector.h"

namespaceVECTOR

{

constdouble Rad_to_deg = 45.0 / atan(1.0);

voidVector::set_mag()

{

mag =sqrt(x * x + y * y);

}

voidVector::set_ang()

{

if (x ==0.0 && y == 0.0)

ang = 0.0;else

ang =atan2(y, x);

}

voidVector::set_x()

{

x  =mag * cos(ang);

}

voidVector::set_y()

{

y  =mag * sin(ang);

}

Vector::Vector()

{

x = y = mag= ang = 0.0; mode = RECT;

}

Vector::Vector(doublen1, double n2, Mode form)

{

mode =form; if (form == RECT)

{

x = n1; y =n2;

set_mag();set_ang();

}

else if(form == POL)

{

mag = n1;ang = n2 / Rad_to_deg;

set_x();set_y();

}

else

{

cout<<"Incorrect 3rd argument to Vector() -- "; cout<< "vectorset to 0\n"; x = y = mag = ang = 0.0; mode = RECT;

}

}

voidVector::reset(double n1, double n2, Mode form)

{

mode =form; if (form == RECT)

{

x = n1; y =n2;

set_mag();set_ang();

}

else if(form == POL)

{

mag = n1;ang = n2 / Rad_to_deg;

set_x();set_y();

}

else

{

cout<<"Incorrect 3rd argument to Vector() -- "; cout<< "vectorset to 0\n"; x = y = mag = ang = 0.0; mode = RECT;

}

}

Vector::~Vector()

{

}

voidVector::polar_mode()

{

mode = POL;

}

voidVector::rect_mode()

{

mode =RECT;

}

VectorVector::operator+(const Vector &b)const

{

returnVector(x + b.x, y + b.y);

}

VectorVector::operator-(const Vector &b)const

{

returnVector(x - b.x, y - b.y);

}

VectorVector::operator-()const

{

returnVector(-x, -y);

}

VectorVector::operator*(double n)const

{

returnVector(n*x, n*y);

}

Vectoroperator*(double n, const Vector &a)

{

return a*n;

}

ostream&operator<<(ostream&os,const Vector &v)

{

if(v.mode == Vector::RECT) os<< "(x,y) = (" <

else if(v.mode == Vector::POL)

{

os<<"(m,a) = (" <

<

}

else

os<<"Vector object mode is invalid";

returnos;

}

}

//randwalk.cpp#include "vector.h"

int main()

{

usingVECTOR::Vector; srand(time(0)); double direction; Vector step;

Vectorresult(0.0, 0.0); unsigned long steps = 0; double target; doubledstep;doublenumbers,N; double Min, Max, Sum, Average; cout<< "Enter targetdistance: "; cin>> target; cout<< "Enter step length:"; cin>>dstep; cout<< "Enter test numbers: ";cin>> numbers;

N =numbers;

Min = Max =Sum = Average = 0.0; while (numbers)

{

while(result.magval() < target)

{

direction =rand() % 360; step.reset(dstep, direction, Vector::POL); result = result +step; steps++;

}

cout<<"After " << steps << " steps once a walk\n"; if(Min == 0 || Max == 0)

Min = Max =steps; if (Min > steps)

Min =steps; if (Max < steps)

Max =steps; Sum += steps; numbers--; steps = 0; result.reset(0.0, 0.0);

}

Average =Sum / N; cout<< "Max steps is " << Max <

cin.clear();while (cin.get() != '\n') continue;

cin.get();return 0;

}

4、

//mytime.h

#ifndefMYTIME_H_

#defineMYTIME_H_

#include

#include #include using namespace std;

class Time

{ private:int hours; int minutes;

public:

Time();

Time(int h,int m = 0); voidAddMin(int m); voidAddHr(int h); void Reset(int h = 0, int m =0);

Timeoperator*(double n)const; friend Time operator-(const Time &t1, const Time&t2); friend Time operator+(const Time &t1, const Time &t2); friendTime operator*(double m, const Time &t)

{

return t *m;

}

friendostream&operator<<(ostream&os, const Time &t);

};

#endif

//mytime.cpp

#include"mytime.h"

Time::Time()

{

hours =minutes = 0;

}

Time::Time(inth, int m)

{

hours = h;minutes = m;

}

voidTime::AddMin(int m)

{

minutes +=m; hours += minutes / 60; minutes %= 60;

}

voidTime::AddHr(int h)

{

hours += h;

}

voidTime::Reset(int h, int m)

{

hours = h;minutes = m;

}

Timeoperator+(const Time &t1, const Time &t2)

{

Time sum;

sum.minutes= t1.minutes + t2.minutes; sum.hours = t1.hours + t2.hours + sum.minutes / 60;sum.minutes %= 60; return sum;

}

Timeoperator-(const Time &t1, const Time &t2)

{

Time diff;int tot1, tot2; tot1 = t1.minutes + 60 * t1.hours; tot2 = t2.minutes + 60 *t2.hours; diff.minutes = (tot1 - tot2) % 60; diff.hours = (tot1 - tot2) / 60;return diff;

}

TimeTime::operator*(double mult)const

{

Timeresult; longtotalminutes = hours * mult * 60 + minutes * mult; result.hours =totalminutes / 60; result.minutes = totalminutes % 60; return result;

}

ostream&operator<<(ostream&os,const Time &t)

{

os<

}

//usetime.cpp#include "mytime.h"

int main()

{

Timeaida(3, 35);

Timetosca(2, 48); Time temp;

cout<<"Aida and Tosca:\n"; cout<

cout<<"Aida * 1.17: " << temp <

cin.get();return 0;

}

5、

//stonewt.h

#ifndefSTONEWT_H_

#defineSTONEWT_H_

#include

#include #include using namespace std;

classStonewt

{ public:

enum Mode {STN, INPD, FPD }; private: staticintconstLbs_per_stn = 14; int stone;doublepds_left; double pounds; intpounds_int;

Mode mode;voidset_stn(); voidset_pds(); voidset_pds_int();

public:

Stonewt(doublelbs, Mode form);

Stonewt(intstn,double lbs, Mode form);

Stonewt();~Stonewt(); voidstn_mode(); voidpds_mode(); voidint_pds_mode();operatorint()const; operator double()const; Stonewtoperator+(constStonewt&st)const;

Stonewtoperator-(constStonewt&st)const; Stonewt operator*(double n)const;

friendStonewtoperator*(double n, constStonewt&st);friendostream&operator<<(ostream&os, constStonewt&st);

};

#endif

//stonewt.cpp#include "stonewt.h"

voidStonewt::set_stn()

{

stone =int(pounds) / Lbs_per_stn; pds_left = int(pounds) % Lbs_per_stn + pounds -int(pounds);

}

voidStonewt::set_pds()

{

pounds =stone*Lbs_per_stn + pds_left;

}

voidStonewt::set_pds_int()

{

pounds_int= int(pounds);

}

Stonewt::Stonewt(doublelbs, Mode form)

{

mode =form; if (form == STN)

{

stone =int(lbs) / Lbs_per_stn; pds_left = int(lbs) % Lbs_per_stn + lbs - int(lbs);set_pds(); set_pds_int();

}

else if(form == INPD)

{

pounds_int= int(lbs); pounds = lbs;

set_stn();

}

else if(form == FPD)

{

pounds =lbs; set_pds_int(); set_stn();

}

else

{

cout<<"Incorrect 3rd argument to Stonewt() -- "; cout<< "Stonewtset to 0\n"; stone = pounds = pds_left = 0; mode = STN;

}

}

Stonewt::Stonewt(intstn,double lbs, Mode form)

{

mode =form;

if (form ==STN)

{

stone =stn; pds_left = lbs; set_pds(); set_pds_int();

}

else if(form == INPD)

{

pounds_int= int(stn*Lbs_per_stn + lbs); pounds = stn*Lbs_per_stn + lbs; set_stn();

}

else if(form == FPD)

{

pounds =stn*Lbs_per_stn + lbs; set_pds_int(); set_stn();

}

else

{

cout<<"Incorrect 3rd argument to Stonewt() -- "; cout<< "Stonewtset to 0\n"; stone = pounds = pds_left = 0; mode = STN;

}

}

Stonewt::Stonewt()

{

stone =pounds = pds_left = 0; mode = STN;

}

Stonewt::~Stonewt()

{

}

voidStonewt::stn_mode()

{

mode = STN;

}

voidStonewt::pds_mode()

{

mode = FPD;

}

voidStonewt::int_pds_mode()

{

mode =INPD;

}

Stonewt::operatorint()const

{

returnint(pounds+ 0.5);

}

Stonewt::operatordouble()const

{

returnpounds;

}

StonewtStonewt::operator+(constStonewt&st)const

{

returnStonewt(pounds+ st.pounds, st.mode);

} StonewtStonewt::operator-(constStonewt&st)const

{

returnStonewt(pounds- st.pounds, st.mode);

}

StonewtStonewt::operator*(doublen)const

{

returnStonewt(pounds*n,mode);

}

Stonewtoperator*(double n, constStonewt&st)

{

returnStonewt(n*st.pounds,st.mode);

}

ostream&operator<<(ostream&os,constStonewt&st)

{

if(st.mode == Stonewt::STN) os<

elseif (st.mode == Stonewt::INPD) os<

elseif (st.mode == Stonewt::FPD) os<

elseos<< "Error in type\n";

returnos;

}

//stone.cpp#include "stonewt.h"

int main()

{

Stonewtincognito(275,Stonewt::FPD);

Stonewtwolfe(285.7,Stonewt::STN);

Stonewttaft(21,8,Stonewt::INPD); Stonewt temp; cout<< "The celebrity weighed"; cout<< incognito <

cout<<"Incognito + Wolfe = " << temp <

Stonewt::Stonewt(doublelbs)

{

stone =int(lbs) / Lbs_per_stn; pds_left = int(lbs) % Lbs_per_stn + lbs - int(lbs);pounds = lbs;

}

Stonewt::Stonewt(intstn,double lbs)

{

stone =stn; pds_left = lbs; pounds = stn * Lbs_per_stn + lbs;

}

Stonewt::Stonewt()

{

stone =pounds = pds_left = 0;

}

Stonewt::~Stonewt()

{

}

boolStonewt::operator<(constStonewt&st)const

{

if (pounds

returntrue;

elsereturn false;

}

boolStonewt::operator<=(constStonewt&st)const

{

if (pounds<= st.pounds)

returntrue;

elsereturn false;

}

boolStonewt::operator>(constStonewt&st)const

{

if(pounds >st.pounds) return true;

elsereturn false;

}

boolStonewt::operator>=(constStonewt&st)const

{

if(pounds >= st.pounds) return true;

elsereturn false;

}

boolStonewt::operator==(constStonewt&st)const

{

if(pounds == st.pounds) return true;

elsereturn false;

}

boolStonewt::operator!=(constStonewt&st)const

{

if(pounds != st.pounds) return true;

elsereturn false;

}

ostream&operator<<(ostream&os,constStonewt&st)

{

os<

}

//stone.cpp#include "stonewt.h"

int main()

{

Stonewtsw[6] = { 10.0, 11.0, 12.5 }; Stonewttemp(11.0); for (inti = 3; i< 6; i++)

{

double input; cout<<"Enter #" <> input;

sw[i] =input;

}

for(inti = 0; i< 6; i++) cout<< "#" <

int count =0; Stonewt Min = sw[0]; Stonewt Max = sw[0]; for (inti = 0; i< 6; i++)

{

if (Min>sw[i])

Min =sw[i]; if (Max

Max = sw[i]; if (temp >= sw[i])count++;

}

cout<<"The Min pounds: " << Min; cout<< "The Max pounds:" << Max; cout<< "The numbers not under 11 pounds: "<< count;

cin.get();cin.get(); return 0;

}

7、

//complexh.h

#ifndefCOMPLEX_H_

#defineCOMPLEX_H_

#include

#include

#include #include using namespace std;

classComplex

{ private:

doublereal; double imaginary;

public:

Complex();

Complex(doublen1);

Complex(doublen1, double n2);

~Complex();

Complexoperator+(const Complex &c)const;

Complexoperator-(const Complex &c)const;

Complexoperator*(const Complex &c)const;

Complexoperator*(double n)const; Complex operator~()const;

friendComplex operator*(double n, const Complex &c);friendostream&operator<<(ostream&os, const Complex &c);friendistream&operator>>(istream&is, Complex &c);

};

#endif

//complex.cpp

#include"complexh.h"

Complex::Complex()

{

real = 0.0;imaginary = 0.0;

}

Complex::Complex(doublen1)

{

real = n1;imaginary = 0.0;

}

Complex::Complex(doublen1, double n2)

{

real = n1;imaginary = n2;

}

Complex::~Complex()

{

}

ComplexComplex::operator+(const Complex &c)const

{

returnComplex(real + c.real, imaginary + c.imaginary);

}

ComplexComplex::operator-(const Complex &c)const

{

returnComplex(real - c.real, imaginary - c.imaginary);

}

ComplexComplex::operator*(const Complex &c)const

{

doublereal_s;doubleimaginary_s; real_s = real*c.real - imaginary*c.imaginary; imaginary_s =real*c.imaginary + imaginary*c.real; return Complex(real_s, imaginary_s);

}

ComplexComplex::operator*(double n)const

{

returnComplex(n*real, n*imaginary);

}

ComplexComplex::operator~()const

{

returnComplex(real, -imaginary);

}

Complexoperator*(double n, const Complex &c)

{

returnComplex(n*c.real, n*c.imaginary);

}

ostream&operator<<(ostream&os,const Complex &c)

{

os<<"(" <

}

istream&operator>>(istream&is,Complex &c)

{

cout<<"Real: "; if (is >>c.real)

{

cout<<"Imaginary: "; is>>c.imaginary;

}

return is;

}

//useComplex.cpp#include "complexh.h"

int main()

{

Complexa(3.0, 4.0); Complex c; charch; cout<< "Enter a complex number (q toquit): "; while (cin>>ch)

{

if(ch == 'q' || ch == 'Q') break;

else

{

cin>>c; cout<< "c is " << c << '\n'; cout<<"Complex conjugate is " << ~c << '\n'; cout<<"a is " << a << '\n'; cout<< "a + c is "<< a + c << '\n'; cout<< "a - c is " << a - c<< '\n'; cout<< "a * c is " << a * c << '\n';cout<< "2 * c is " << 2 * c << '\n';

}

cout<<"Enter a complex number (q to quit): ";

}

cout<<"Done!\n"; cin.get(); cin.get(); return 0;

}

第十二章编程练习答案 12.1 根据以下类声明,完成类,并编小程序使用它

//12.1根据以下类声明,完成类,并编小程序使用它

#include #include using namespace std;

class Cow{ char name[20]; char * hobby; double weight; public:

Cow();

Cow(const char* nm, const char * ho, double wt);

Cow(const Cow & C); ~Cow(); void ShowCow()const;

};

Cow::Cow(){}

Cow::Cow(constchar * nm, const char * ho, double wt)

{ strcpy(name,nm); hobby=new char[strlen(ho)+1]; strcpy(hobby,ho); weight=wt;

}

Cow::Cow(constCow & C)

{ strcpy(name,C.name); hobby=new char[strlen(C.hobby)+1]; strcpy(hobby,C.hobby);weight=C.weight;

}

Cow::~Cow(){delete [] hobby;} void Cow::ShowCow() const

{ cout <cout <cout <

}

int main()

{

Cow cow;

Cowccc("adads","dsdfsad",34);cow=ccc; cow.ShowCow(); ccc.ShowCow();

}

12.2 根据以下的主函数,编写类,使得:

a.重载+,使得两个字符串可以合并为一个

b.使用 Stringlow()成员函数,使得字母可以转换为小写

c.使用 Stringup()成员函数,使得字母可转换为大写

d.提供一个成员函数,使它返回一个 char 字符出现的个数

//12.2根据以下的主函数,编写类,使得:

//a.重载+,使得两个字符串可以合并为一个

//b.使用Stringlow()成员函数,使得字母可以转换为小写

//c.使用Stringup()成员函数,使得字母可转换为大写

//d.提供一个成员函数,使它返回一个char字符出现的个数

#include

#include #include using namespace std;

class String

{

char*          mp_text;

unsignedm_text_length; void assignMember (const char* text)

{ m_text_length = strlen(text); mp_text = new char [m_text_length + 1]; strcpy(mp_text, text);

}public:

staticconst unsigned    k_buffer_max_size = 256; const char* toCstr () const

{ return (mp_text);

}

String (constchar* text = "")

{ assignMember(text);

}

String (constString& str)

{ assignMember(str.toCstr());

}

~String ()

{ delete [] mp_text; } unsigned getLength ()const

{ return (m_text_length);

}

void stringup()

{ for (unsigned i = 0; i < m_text_length; ++i) mp_text[i]= (char)toupper(mp_text[i]);

} voidstringlow ()

{ for (unsigned i = 0; i < m_text_length; ++i) mp_text[i]= (char)tolower((int)mp_text[i]);

}unsigned has (char ch) const

{

      unsigned    cnt = 0;

for (unsigned i = 0; i< m_text_length; ++i) if (ch == mp_text[i])

++cnt; return (cnt);

}

String&operator= (const String& str)

{ if (&str == this) return (*this);delete [] mp_text; assignMember(str.toCstr()); return (*this);

}

String &operator+= (const String& str)

{ return (*this += str);

}char& operator[] (unsigned idx)

{ return (mp_text[idx]);

} const char & operator[] (unsigned idx) const

{ return (mp_text[idx]);

} friendostream & operator<< (ostream& os, const String& str)

{ os<< str.toCstr(); return (os); } friend istream & operator>>(istream& is, String& str) { char   txt[k_buffer_max_size];if (is >> txt) str = txt;

is.ignore(k_buffer_max_size, '\n'); return (is); } friend booloperator< (const String& lvalue, const String& rvalue)

{ return (strcmp(lvalue.toCstr(), rvalue.toCstr()) < 0);

}friend bool operator> (const String& lvalue, const String& rvalue)

{ return (rvalue < lvalue);

}friend bool operator== (const String& lvalue, const String& rvalue)

{ return (!(lvalue < rvalue) && !(lvalue > rvalue));

}friend bool operator<= (const String& lvalue, const String& rvalue)

{ return (!(lvalue > rvalue));

}friend bool operator>= (const String& lvalue, const String& rvalue)

{ return (!(lvalue < rvalue));

}friend String operator+ (const String& lvalue, const String& rvalue)

{ char* p_txt = new char[lvalue.getLength() + rvalue.getLength() + 1]; strcpy(p_txt, lvalue.toCstr()); strcat(p_txt,rvalue.toCstr()); String tmp(p_txt); delete [] p_txt; return (tmp);

} };

int main()

{

String s1(" and I am a C++ student.");

Strings2 = "Please enter your name:"; String s3; cout << s2;

// overloaded <cin >>s3; // overloaded >> operator s2 = "My name is " + s3; // overloaded =, +operators cout <".\n"; s2 = s2 + s1;

s2.stringup();

// converts string touppercase cout << "The string\n" <"\ncontains " << s2.has('A')

<<" 'A' characters init.\n"; s1 = "red";

// tstring(const char *),

// then tstring &operator=(const string&)

Stringrgb[3] = {String(s1), String("green"), String("blue")}; cout <<"enter the name of a primarycolor for mixing light: "; String ans; bool success = false;while (cin >>ans)

{ ans.stringlow();

// converts string tolowercase for (int i = 0; i < 3; i++)

{ if (ans == rgb[i]) // overloaded == operator

{ cout << "That's right!\n";success = true; break;

} } if(success) break; else cout << "Try again!\n";

} cout << "Bye" << endl;

}

12.3 重新编写程序清单 10.7,10.8,使用动态内存并重载<<代替 show()

//12.3重新编写程序清单10.7,10.8,使用动态内存并重载<<代替show()

#include #include using namespace std; class Stock{ char *company; int shares; double share_val; doubletotal_val; void set_tot(){total_val=shares*share_val;}; public:

Stock(){ company=new char[8]; strcpy(company,"no name");shares=0;share_val=0.0;total_val=0.0;

}

Stock(constchar *co,long n=0,doublepr=0)

{ int len=strlen(co); company=newchar[len+1];strcpy(company,co); if(n<0)

{ cout<<"Number of shares can't be negative;"

<" shares set to0"<0; } else shares=n; share_val=pr; set_tot();

}

~Stock()

{delete []company; } void buy(long num,double price)

{ if(num<0)

{ cout<<"Number of shares purchase can't benegative."

<<" Transaction is aborted."<

} else

{ shares+=num; share_val=price; set_tot();

} }void sell(long num,double price)

{ if(num<0)

{ cout<<"Number of shares sold can't be negative."

<<"Transaction is aborted."<

} elseif(num>shares)

{ cout<<"You can't sell more than you have!"

<<"Transaction is aborted."<

} else

{ shares-=num; share_val=price; set_tot();

} } voidupdate(double price)

{share_val=price; set_tot(); } const Stock &topval(const Stock &s)const

{if(s.total_val>total_val) return s; else return *this; } friend ostream&operator<<(ostream &os,const Stock &s)

{ ios_base::fmtflags orig=os.setf(ios_base::fixed,ios_base::floatfield);streamsize prec=os.precision(3);os<<"Company:"<

<<" Shares:"<" Share Price:$"<2); os<<" Total Worth:&"<

}

};

constint STKS = 4; intmain()

{

// create an array ofinitialized objects Stock stocks[STKS] = {

Stock("NanoSmart", 12, 20.0),

Stock("Boffo Objects", 200, 2.0),

Stock("Monolithic Obelisks", 130, 3.25),

Stock("Fleep Enterprises", 60, 6.5)

}; cout << "Stock holdings:\n"; intst; for (st = 0; st< STKS; st++) cout <

// set pointer to firstelement const Stock * top = &stocks[0]; for (st = 1; st < STKS; st++)

top =&top->topval(stocks[st]);

// now top points to themost valuable holding cout << "\nMost valuableholding:\n"; cout << *top; return 0;

}

12.4 按以下类声明,完成类,并编写一个演示程序

//12.4按以下类声明,完成类,并编写一个演示程序

#include usingnamespace std; typedefunsigned long Item;

classStack{ enum{MAX=10};Item * items; int size; int top; public:

Stack(intn=MAX)

{ items=new Item [MAX]; top=0; size=0;

}

Stack(constStack &st)

{ items=new Item[st.size]; top=0; size=0; for(int i=0;i

{ items[i]=st.items[i]; size++; top++;

}

}

~Stack(){ delete [] items; } bool isEmpty()

{return top==0; }bool isFull()

{return top==MAX; } bool push(const Item &it)

{ if(isFull()) cout<<"error! Stack is full!"<

{ items[top++]=it;size++; return true; } return false; } bool pop(Item &item)

{ if(isEmpty()) cout<<"error! Stack is empty!"<

{ item=items[top--]; size--; return true; }return false;

}

Stack &operator = (Stack &st)

{ delete [] items; items=new Item[st.size]; top=0; size=0; for(int i=0;i

{items[i]=st.items[i]; size++; top++; } return (*this); } friend ostream &operator<<(ostream &os,const Stack & st)

{ os<<"This Stack is:"<1;while(len!=-1)

{ cout<

}

};

int main ()

{

Stacks; Item it[20]={ 0}; for(int i=0;i<11;i++)

{ it[i]=i+1;

s.push(it[i]);} cout<

Stacks1(s); cout<<"s1="<cout<

}

12.5-12.6 银行 ATM 顾客系统

// queue.h -- interfacefor a queue

#ifndef QUEUE_H_ #define QUEUE_H_

// This queue will contain Customer items

class Customer

{ private:

 

long arrive;

// arrival time for customer

int processtime;

// processing time for customer

public:

Customer(): arrive(0), processtime(0){}void set(long when); long when() const { return arrive; } int ptime() const {return processtime; }

};

typedefCustomer Item;

classQueue { private:

// class scopedefinitions

// Node is a nestedstructure definition local to this class structNode { Item item; struct Node * next;}; enum {Q_SIZE = 10};

// private class members

Node * front;      // pointer to front ofQueue

Node * rear;

// pointer to rear of Queue

int items;

// current number of items in Queue

const int qsize;

// maximum number of items in Queue

// preemptive definitionsto prevent public copying Queue(const Queue & q) : qsize(0) { }

Queue& operator=(const Queue & q) { return *this;} public:

Queue(intqs = Q_SIZE); // create queue with a qs limit

~Queue();bool isempty() const; bool isfull() const; int queuecount() const; boolenqueue(const Item &item); // add item to end booldequeue(Item &item); // remove item from front

};

#endif

// queue.cpp -- Queue andCustomer methods

#include "queue.h"

#include          // (or stdlib.h) for rand()

// Queue methods

Queue::Queue(intqs) : qsize(qs)

{ front = rear = NULL;// or nullptr items= 0;

}

Queue::~Queue()

{

Node *temp; while (front != NULL) // while queue is not yet empty

{

      temp =front;       // save address of front item

front= front->next;// reset pointer to next item deletetemp;  // delete former front

} }

boolQueue::isempty() const

{return items == 0; }

boolQueue::isfull() const

{ return items == qsize;

}

intQueue::queuecount() const

{ return items;

}

// Add item to queue bool Queue::enqueue(const Item & item) { if (isfull()) returnfalse;

Node * add =new Node; // create node

// on failure, new throwsstd::bad_alloc exception add->item = item;   // set node pointers add->next= NULL;    // or nullptr;

items++;

if (front == NULL)  // if queue is empty, front = add;   // place item at front

else

rear->next= add; // else place at rear

rear = add;                // have rear point to newnode

return true;

}

// Place front item intoitem variable and remove from queue boolQueue::dequeue(Item & item)

{ if (front == NULL) return false; item = front->item; // set item to first itemin queue

items--;

Node *temp = front;// save location of first item front= front->next;// reset front to next item

delete temp;              // delete former firstitem

if(items == 0) rear= NULL; return true;

}

// customer method

// when is the time atwhich the customer arrives

// the arrival time isset to when and the processing // time set to a random value in the range 1 - 3

void Customer::set(long when)

{ processtime = std::rand() % 3 + 1; arrive = when;

}

// bank.cpp -- using theQueue interface

// compile with queue.cpp

#include

#include // for rand() and srand()

#include // for time()

#include "queue.h"

const int MIN_PER_HR = 60;

bool newcustomer(double x); // is there a new customer?

int main()

{ using std::cin; using std::cout; using std::endl; using std::ios_base;

// setting things up

 

std::srand(std::time(0));//

random initializing of rand()

cout << "Case Study: Bank of Heather Automatic Teller\n"; cout <<"Enter maximum size of queue:"; int qs; cin >> qs;

Queue line(qs);            // line queue holds up toqs people

cout<< "Enter the number of simulation hours: ";

int hours;                  // hours of simulation

cin>> hours;

// simulation will run 1cycle per minute long cyclelimit = MIN_PER_HR * hours; // # of cycles

cout << "Enter the average number of customers per hour: "; double perhour; // average # of arrival per hour

cin>> perhour; double min_per_cust;// average time betweenarrivals

min_per_cust = MIN_PER_HR / perhour;

Item temp;

 

// new customer data

long turnaways = 0;

//

turned away by full queue

long customers = 0;

//

joined the queue

long served = 0;

 

// served during the simulation

long sum_line = 0;

//

cumulative line length

int wait_time = 0;

//

time until autoteller is free

long line_wait = 0;

//

cumulative time in line

// running the simulation

for (int cycle= 0;cycle < cyclelimit; cycle++)

{

if (newcustomer(min_per_cust))

// have newcomer

{ if (line.isfull()) turnaways++; else

{ customers++;

 

temp.set(cycle);

// cycle = time of arrival

line.enqueue(temp); // add newcomer to line

} } if(wait_time <= 0 &&!line.isempty())

{line.dequeue (temp);  // attend next customer wait_time = temp.ptime(); // for wait_time minutes line_wait+= cycle - temp.when(); served++; } if (wait_time > 0) wait_time--; sum_line += line.queuecount();

}

// reporting results if (customers > 0)

{ cout <<"customers accepted: " << customers << endl; cout << " customers served: " <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"; cout <<"Done!\n"; // cin.get(); // cin.get(); return0;

}

// x = average time, in minutes, between customers // returnvalue is true if customer shows up this minute boolnewcustomer(double x)

{ return (std::rand()* x / RAND_MAX < 1);

}

第十三章习答案

13.1根据Cd基类,完成派生出一个Classic类,并测试

//13.1根据Cd基类,完成派生出一个Classic类,并测试

#include #include using namespace std;

// base class class Cd

{ char performers[50];char label[20];

int selections; // number ofselections double playtime; // playing time in minutes

public:

explicit Cd(const char *s1 = "", const char * s2 = "", int n =

0, double x = 0.0);virtual ~Cd() {}

virtual void Report() const; //reports all CD data

};

static void cpStr (char* p_des_txt,const char* p_src_txt, unsigned des_arr_size) { unsigned str_len = strlen(p_src_txt) < des_arr_size-1 ?

strlen(p_src_txt) :des_arr_size-1; strncpy(p_des_txt, p_src_txt, str_len); p_des_txt[str_len] ='\0';

}

Cd::Cd (const char * s1, const char *s2, int n, double x)

: selections(n), playtime(x)

{ cpStr(performers, s1,50); cpStr(label, s2, 20);

}

void Cd::Report() const

{ cout << performers <<", "<< label << ", " << selections<< ",

" << playtime <

}

class Classic : public Cd

{

                    static const unsigned     mk_size = 64;

                    char   m_songs[mk_size];

public:

Classic(constchar* songs_list = "", constchar* s1 = "", const char* s2 = "", int n = 0, double x = 0.0); virtual void Report() const;// reports all CD data

};

Classic::Classic (const char*songs_list, const char * s1, constchar * s2, int n, double x)

: Cd(s1, s2, n, x)

{ cpStr(m_songs,songs_list, mk_size);

}

void Classic::Report () const

{

Cd::Report();

cout << ", " <

}

void Bravo(const Cd & disk)

{ disk.Report(); cout<< endl;

}

int main()

{

Cd c1("Beatles","Capitol", 14, 35.5);

Classic c2 = Classic("PianoSonata in B flat, Fantasia in C",

"AlfredBrendel", "Philips", 2, 57.17); Cd *pcd = &c1;

cout << "Using objectdirectly:\n"; c1.Report(); // use Cd method c2.Report(); // use Classicmethod cout << "Using type cd * pointer to objects:\n";pcd->Report(); // use Cd method for cd object pcd = &c2;

pcd->Report(); // use Classicmethod for classic object cout << "Calling a function with a Cdreference argument:\n";

Bravo(c1); Bravo(c2);

cout << "Testingassignment: "; Classic copy; copy = c2;

copy.Report();

}

13.2对13.1,使用动态内存记录字符串

//13.2 13.1,使用动态内存记录字符串

#include #include using namespace std;

// base class class Cd

{

char* performers; char* label;

intselections; // number of selections double playtime; // playing time in minutespublic:

explicit Cd(constchar * s1 = "", const char * s2 = "", int n = 0, double x =0.0); Cd(const Cd & d); virtual ~Cd();

virtual void Report() const; // reports all CD data

Cd & operator=(const Cd & d);

};

staticchar* cpNewStr (const char* p_src_txt)

{

unsigned str_len = strlen(p_src_txt); char*p_des_txt = new char [str_len + 1];

strcpy(p_des_txt, p_src_txt); return(p_des_txt);

}

Cd::Cd(const char * s1, const char * s2, int n, double x)

: selections(n), playtime(x)

{

performers = cpNewStr(s1); label =cpNewStr(s2);

}

Cd::~Cd()

{

delete [] performers; delete [] label;

}

Cd::Cd(constCd & d)

: selections(d.selections), playtime(d.playtime)

{

performers = cpNewStr(d.performers); label =cpNewStr(d.label);

}

Cd& Cd::operator=(const Cd & d)

{

if (&d == this) {

return(*this);

}

delete [] performers; performers =cpNewStr(d.performers); delete [] label; label = cpNewStr(d.label); selections= d.selections; playtime = d.playtime; return (*this);

}

voidCd::Report() const

{

cout << performers << ", " << label<< ", " << selections << ", " << playtime<< flush;

}

// derive class Classic : public Cd

{

char*    songs; public:

explicit Classic(const char* songs_list = "", const char * s1 = "", constchar * s2 = "", int n = 0, double x = 0.0); Classic (constClassic& classic); virtual ~Classic ();

Classic& operator= (const Classic&classic); virtual void Report() const; // reports all CD data

};

Classic::Classic (const char* songs_list, constchar * s1, const char * s2, int n, double x) : Cd(s1, s2, n, x)

{

songs = cpNewStr(songs_list);

}

Classic::Classic(const Classic& classic)

: Cd(classic)

{

songs = cpNewStr(classic.songs);

}

Classic::~Classic()

{

delete [] songs;

}

Classic& Classic::operator= (const Classic& classic)

{

if (&classic == this) return (*this);Cd::operator=(classic); delete [] songs; songs = cpNewStr(classic.songs);return (*this);

}

voidClassic::Report () const

{

Cd::Report();

cout << ", " << songs << endl;

}

voidBravo(const Cd & disk)

{

disk.Report(); cout << endl;

}

intmain()

{

Cd c1("Beatles", "Capitol", 14, 35.5);

Classic c2 = Classic("Piano Sonata in Bflat, Fantasia in C", "Alfred Brendel", "Philips", 2,57.17); Cd *pcd = &c1;

cout << "Using objectdirectly:\n"; c1.Report(); // use Cd method c2.Report(); // use Classicmethod cout << "Using type cd * pointer to objects:\n";pcd->Report(); // use Cd method for cd object pcd = &c2;

pcd->Report(); // use Classic method forclassic object cout << "Calling a function with a Cd referenceargument:\n";

Bravo(c1);Bravo(c2);

cout << "Testing assignment: ";Classic copy; copy = c2;

copy.Report();

}

13.3让三个类从一个基类DMA继承而来,然后用程序清单13.10对比测试,基类使用虚类。

//13.3 让三个类从一个基类 DMA继承而来,然后用程序清单 13.10 对比测试,基类使用虚类。

#include #include using namespace std;

classDMA{

string label; int rating;

public:

DMA(const string l="null",int r=0)

{ label=l; rating=r;

}

virtual void test(){};

       virtualvoid tese2()     {cout<<"test2"; }

DMA(const DMA &rs)

{ label=rs.label; rating=rs.rating;

}

virtual ~DMA() {} stringlab() {return label;} int ra() {return rating;}

friend ostream&operator<<(ostream &os,const DMA&rs)

{

os<<"label:"<必须实现虚基类的所有虚函数=""lacksdma="" &ld)="" lacksdma:=""&)ld<<"="" color:"<通过强制类型转换调用基类友元函数 ="" cout<<"=""color:"<虚基类不能创建对象,但可以创建指向其的指针=""for(int="" i="0;i<3;i++)"cout<<"\nenter="" the=""label:";="" label;=""getline(cin,label,'\n');=""rating:";="" rat;="" cin="">>rat;cout<<"Enter the 1 for baseDMA"<

int=""temp;="" cin="">>temp;

cin.get();if(temp==1) pd[i]=new baseDMA(label,rat);

elseif(temp==2)

{

cout<<"Enterthe color:"; string color; getline(cin,color);

pd[i]=newlacksDMA(color,label,rat);

}

elseif(temp==3)

{

cout<<"Enterthe style:"; string style; getline(cin,style);

pd[i]=newhasDMA(style,label,rat);

}

else

{

cout<<"invalidinput! try again!"<

for(int=""i="0;i<3;i++)" pd[i]-="">show();

}

13.4根据Port类派生出一个VintagePort类,完成并测试

//13.4根据 Port 类派生出一个VintagePort 类,完成并测试

#include #include using namespace std;

classPort

{

char * brand;

char style[20]; // i.e., tawny, ruby, vintageint bottles;

public:

explicit Port(const char * br ="none", const char * st = "none", int b = 0); Port(constPort & p); // copy constructor virtual ~Port() { delete [] brand; } Port& operator=(const Port & p); virtual void Show() const;

Port & operator+=(int b); // adds b to bottles

Port & operator-=(int b); // subtracts bfrom bottles, if available int BottleCount() const { return bottles; }

friend ostream & operator<<(ostream & os, constPort & p);

};

staticchar* cpNewStr (const char* p_src_txt)

{

unsigned str_len = strlen(p_src_txt); char*p_des_txt = new char [str_len + 1];

strcpy(p_des_txt, p_src_txt);

return (p_des_txt);

}

staticvoid cpStr (char* p_des_txt, const char* p_src_txt, unsigned des_arr_size)

{

unsigned str_len =strlen(p_src_txt) < des_arr_size-1 ? strlen(p_src_txt) : des_arr_size-1;strncpy(p_des_txt, p_src_txt, str_len); p_des_txt[str_len] = '\0';

}

Port::Port(const char * br, const char * st, int b)

: brand(cpNewStr(br)), bottles(b)

{

cpStr(style, st, 20);

}

Port::Port(constPort & p)

: brand(cpNewStr(p.brand)), bottles(p.bottles)

{

cpStr(style, p.style, 20);

}

voidPort::Show() const

{

       cout          << "Brand: " <

<<"Style: " << style << endl

<<"Bottles: " << bottles << flush;

}

Port& Port::operator=(const Port & p)

{

if (&p == this) return (*this);

delete [] brand; brand = cpNewStr(p.brand);cpStr(style, p.style, 20); bottles = p.bottles; return (*this);

}

Port& Port::operator+=(int b)

{

bottles += b; return (*this); }

Port& Port::operator-=(int b)

{

bottles -= b; return (*this);

}

ostream& operator<< (ostream & os, const Port & p)

{

cout << p.brand << ", "<< p.style << ", " << p.bottles << flush;return (os);

}

classVintagePort : public Port // style necessarily = "vintage"

{

char * nickname; // i.e., "The Noble" or "OldVelvet", etc.

int year; // vintage year

public:

explicit VintagePort(const char * br ="", int b = 0, const char * nn = "", int y = 0);VintagePort(const VintagePort & vp); virtual ~VintagePort() { delete []nickname; } VintagePort & operator=(const VintagePort & vp); virtualvoid Show() const;

friend ostream & operator<<(ostream & os, constVintagePort & vp);

};

VintagePort::VintagePort(const char * br, int b, const char * nn, int y)

: Port(br, "vintage", b), nickname(cpNewStr(nn)),year(y) {}

VintagePort::VintagePort(const VintagePort & vp)

: Port(vp), nickname(cpNewStr(vp.nickname)), year(vp.year) {}

voidVintagePort::Show () const

{

Port::Show(); cout << endl;

cout << "Nickname: " <

}

VintagePort& VintagePort::operator= (const VintagePort & vp)

{

if (&vp == this)

return (*this); Port::operator=(vp); delete []nickname; nickname = cpNewStr(vp.nickname); year = vp.year; return (*this);

}

ostream& operator<< (ostream & os, const VintagePort & vp)

{

os << Port(vp);

cout << ", " <

}

intmain()

{

Port port1("gallo","tawny", 20); cout << port1 << endl << endl;

VintagePort vp("gallo", 24,"nice", 16); VintagePort vp2(vp); cout << vp2 << endl<< endl; VintagePort vp3; vp3 = vp; cout << vp3 << endl<< endl; Port*  p_port; p_port =&port1; p_port->Show(); cout << endl; p_port = &vp;p_port->Show(); cout << endl;

}

//14

1、

//winec.h

#ifndefWINEC_H_

#defineWINEC_H_

#include

#include

#include

usingnamespace std;

template class Pair

{ private:

T1 year;

T2 bottles;public:

Pair(constT1 &yr, const T2 &bt) :year(yr), bottles(bt){}

Pair(){}

voidSet(const T1 &yr, const T2 &bt); int Sum()const; void Show(int y)const;

};

template void Pair::Set(const T1 &yr, const T2&bt)

{

year = yr;bottles = bt;

}

template int Pair::Sum()const

{

returnbottles.sum();

}

template void Pair::Show(int y)const

{

for(inti = 0; i< y; i++) cout<< "\t" << year[i] <<"\t" << bottles[i] <

}

typedefvalarrayArrayInt;typedef PairPairArray;

class Wine

{ private:

PairArrayyb;stringfullname; intyrs;

public:

Wine(){}

Wine(constchar *l, int y, constintyr[], constint bot[]); Wine(const char *l, int y);voidGetBottles(); string&Label(); void Show()const; int sum()const;

};

#endif

//winec.cpp

#include"winec.h"

Wine::Wine(constchar *l, int y, constintyr[], constint bot[])

{

fullname =l; yrs = y; yb.Set(ArrayInt(yr, yrs), ArrayInt(bot, yrs));

}

Wine::Wine(constchar *l, int y)

{

fullname =l; yrs = y;

}

voidWine::GetBottles()

{

ArrayIntyr(yrs),bt(yrs); for (inti = 0; i

{

cout<<"Enter the year: "; cin>>yr[i]; cout<< "Enter thebottles: "; cin>>bt[i];

}

while(cin.get() != '\n') continue;

yb.Set(yr,bt);

}

string&Wine::Label()

{

returnfullname;

}

voidWine::Show()const

{

cout<<"Wine: " <

}

intWine::sum()const

{

returnyb.Sum();

}

//main.cpp#include "winec.h"

intmain(void)

{

cout<<"Enter name of wine: "; char lab[50]; cin.getline(lab, 50); cout<<"Enter number of years: ";

intyrs;cin>>yrs; Wine holding(lab, yrs); holding.GetBottles(); holding.Show();constint YRS = 3; int y[YRS] = { 1993, 1995, 1998 }; int b[YRS] = { 48, 60, 72}; Wine more("Gushing Grape Red", YRS, y, b); more.Show(); cout<<"Total bottles for " <

<< ": "<

}

2、

//winec.h

#ifndefWINEC_H_

#defineWINEC_H_

#include

#include #include using namespace std;

template class Pair

{ private:

T1 year;

T2 bottles;public:

Pair(constT1 &yr, const T2 &bt) :year(yr), bottles(bt){}

Pair(){}

voidSet(const T1 &yr, const T2 &bt); int Sum()const; void Show(int y)const;

};

template void Pair::Set(const T1 &yr, const T2&bt)

{

year = yr;bottles = bt;

}

template int Pair::Sum()const

{

returnbottles.sum();

}

template void Pair::Show(int y)const

{

for(inti = 0; i< y; i++) cout<< "\t" << year[i] <<"\t" << bottles[i] <

}

typedefvalarrayArrayInt; typedef PairPairArray; class Wine :private PairArray, private string { private:intyrs;

public:

Wine(){}

Wine(constchar *l, int y, constintyr[], constint bot[]); Wine(const char *l, int y);voidGetBottles(); string&Label(); void Show()const; int sum()const;

};

#endif

//winec.cpp

#include"winec.h"

Wine::Wine(constchar *l, int y, constintyr[], constint bot[]) :string(l), yrs(y),PairArray(ArrayInt(yr, y), ArrayInt(bot, y))

{

}

Wine::Wine(constchar *l, int y) : string(l), yrs(y)

{

}

voidWine::GetBottles()

{

ArrayIntyr(yrs),bt(yrs); for (inti = 0; i

{

cout<<"Enter the year: "; cin>>yr[i]; cout<< "Enter thebottles: "; cin>>bt[i];

}

while(cin.get() != '\n') continue;

PairArray::Set(yr,bt);

}

string&Wine::Label()

{

return(string &)(*this);

}

voidWine::Show()const

{

cout<<"Wine: " << (string &)(*this) <

}

intWine::sum()const

{

returnPairArray::Sum();

}

//main.cpp#include "winec.h"

intmain(void)

{

cout<<"Enter name of wine: "; char lab[50]; cin.getline(lab, 50); cout<<"Enter number of years: ";

intyrs;cin>>yrs; Wine holding(lab, yrs); holding.GetBottles(); holding.Show();constint YRS = 3; int y[YRS] = { 1993, 1995, 1998 }; int b[YRS] = { 48, 60, 72}; Wine more("Gushing Grape Red", YRS, y, b); more.Show(); cout<<"Total bottles for " <

<< ": "<

}

3、

//queuetp.h

#ifndefQUEUETP_H_

#defineQUEUETP_H_

#include

#include #include using namespace std;

template classQueueTp

{ private:

struct Node{ T item; struct Node *next; };

Node*front; Node *rear; int items; constintqsize;

QueueTp(constQueueTp&q):qsize(0){}

QueueTp&operator=(constQueueTp&q){return *this; } public:

QueueTp(intqs= 10); ~QueueTp(); boolisempty()const; boolisfull()const; intqueuecount()const;boolenqueue(const T &item); booldequeue(T &item);

};

template

QueueTp::QueueTp(intqs):qsize(qs)

{

front =rear = NULL; items = 0;

}

template QueueTp::~QueueTp()

{

Node *temp;while (front != NULL)

{

temp = front; front =front->next; delete temp;

}

}

template boolQueueTp::isempty()const

{

returnitems == 0;

}

template boolQueueTp::isfull()const

{

returnitems == qsize;

}

template intQueueTp::queuecount()const

{

returnitems;

}

template boolQueueTp::enqueue(const T &item)

{if (isfull())

returnfalse;

Node *add =new Node; add->item = item; add->next = NULL; items++; if (front == NULL)

front = add;

else

rear->next= add;

rear = add;return true;

}

template boolQueueTp::dequeue(T &item)

{

if(front == NULL) return false;

item =front->item; items--;

Node *temp= front;

front =front->next; delete temp; if (items == 0) rear = NULL;

returntrue;

}

classWorker

{ private:stringfullname; long id;

public:

Worker():fullname("no one"), id(0L){}

Worker(conststring &s, long n) :fullname(s), id(n){}

~Worker();void Set(); void Show()const;

};

#endif

//workermi.cpp

#include"queuetp.h" Worker::~Worker(){}

voidWorker::Show()const

{

cout<<"Name: " <

}

voidWorker::Set()

{

cout<<"Enter worker's name: "; getline(cin, fullname); cout<<"Enter worker's ID: "; cin>> id; while (cin.get() != '\n')continue;

}

//main.cpp

#include "queuetp.h" constint Size = 5;

int main()

{

QueueTplolas(Size); Worker *temp;

intct;

for (ct =0; ct< Size; ct++)

{

charch;cout<< "Enter the command:\n"

<<"A or a enter queue, "

<<"P or p delete queue, "

<<"Q or q quit.\n"; cin>>ch; while (strchr("apq", ch)== NULL)

{

cout<<"Please enter a p or q: "; cin>>ch;

}

if(ch == 'q') break;

switch(ch)

{ case'a':

temp= new Worker;

cin.get();temp->Set();

if(lolas.isfull())

cout<<"Queue already full\n";

elselolas.enqueue(temp);

break;

case'p':

if(lolas.isempty())

cout<<"Queue already empty\n"; else lolas.dequeue(temp);

break;

}

}

cout<<"\nHere the total count: "; cout<

}

4、

//person.h

#ifndefPERSON_H_

#definePERSON_H_

#include

#include

#include #include using namespace std; class Person

{ private:

stringfirstname;stringlastname;

protected:

virtualvoid Data()const; virtual void Get();

public:

Person():firstname("noone"),lastname("no one"){}

Person(conststring &f,const string &l):firstname(f),lastname(l){} Person(constPerson &p):Person(p){} virtual ~Person() = 0; virtual void Set() = 0;virtual void Show()const = 0;

};

classGunslinger:virtualpublic Person

{ private:intnumsk;

protected:void Data()const; void Get(); public:

Gunslinger():numsk(0),Person(){}

Gunslinger(intnk,const string &f, const string &l) :numsk(nk), Person(f, l){}Gunslinger(intnk, const Person &p):numsk(nk),Person(p){} void Show()const;void Set(); double Draw()const;

};

classPokerPlayer:virtualpublic Person

{

protected:void Data()const;

public:

PokerPlayer():Person(){}

PokerPlayer(conststring &f, const string &l) : Person(f, l){} PokerPlayer(const Person&p):Person(p){} int Draw()const; void Show()const; void Set(){Person::Set(); }

};

classBadDude:publicGunslinger,publicPokerPlayer

{

protected:void Data()const; void Get();

public:

BadDude(){}

BadDude(intnk, const string &f, const string &l)

:Person(f,l), Gunslinger(nk, f, l), PokerPlayer(f, l){}

BadDude(intnk,const Person &p)

:Person(p),Gunslinger(nk, p), PokerPlayer(p){}

BadDude(constGunslinger &g)

:Person(g),Gunslinger(g),PokerPlayer(g){}BadDude(intnk, constPokerPlayer&po)

:Person(po),Gunslinger(nk, po), PokerPlayer(po){} doubleGdraw()const; intCdraw()const; voidSet(); void Show()const;

};

#endif

//person.cpp

#include"person.h" Person::~Person(){}

voidPerson::Data()const

{

cout<<"First name is : " <

}

voidPerson::Get()

{

cout<< "Enter firstname: \n"; getline(cin, firstname); cout<< "Enter last name:\n"; getline(cin, lastname);

}

voidPerson::Show()const

{

Data();

}

voidPerson::Set()

{

Get();

}

voidGunslinger::Data()const

{

cout<<"Nick is :" <

}

voidGunslinger::Get()

{

cout<<"Enter Nick: \n"; cin>>numsk;

}

voidGunslinger::Set()

{

cout<<"Enter Guns name: \n";

Person::Get();

Get();

}

voidGunslinger::Show()const

{

cout<<"Gunslinger: \n";

Person::Data();

Data();

}

doubleGunslinger::Draw()const

{

returnrand() % 3 + 1;

}

intPokerPlayer::Draw()const

{

returnrand() % 52 + 1;

}

voidPokerPlayer::Data()const

{

cout<<"The cards :" << Draw() <

}

voidPokerPlayer::Show()const

{

cout<<"PokerPlayer :\n";

Person::Data();

Data();

}

doubleBadDude::Gdraw()const

{

returnGunslinger::Draw();

}

intBadDude::Cdraw()const

{

returnPokerPlayer::Draw();

}

voidBadDude::Data()const

{

Gunslinger::Data();PokerPlayer::Data(); cout<< "The next cards: " <

}

voidBadDude::Get()

{

Gunslinger::Get();

}

voidBadDude::Set()

{

cout<<"Enter BadDude name: \n";

Person::Get();

Get();

}

voidBadDude::Show()const

{

cout<<"BadDude: \n";

Person::Data();

Data();

}

//main.cpp#include "person.h"

constintSize=5; int main ()

{

Person*per[Size]; intct;

for (ct =0; ct< Size; ct++)

{

charchoice; cout<< "Enter the Person: \n"

                          <<"g: gunslinger       p: poker     "

<<"b: bad dude q: quit\n"; cin>> choice;

while(strchr("gpbq", choice) == NULL)

{

cout<<"Please enter a p,g,o,q: "; cin>> choice;

}

if(choice == 'q') break;

switch(choice)

{ case'g':per[ct] = new Gunslinger; break;

case'p':

per[ct] =new PokerPlayer; break;

case'b':

per[ct] =new BadDude; break;

}cin.get(); per[ct]->Set();

}

cout<<"\nHere is your staff:\n";

inti;

for (i = 0;i

{

cout<Show();

}

for(i = 0; i

cout<<"Bye\n"; system("pause"); return 0;

}

5、

//emp.h

#ifndefEMP_H_

#defineEMP_H_

#include #include using namespace std;

classabstr_emp

{ private:

stringfname;stringlname; string job;

public:

abstr_emp();abstr_emp(const string &fn, const string &ln, const string &j);

virtualvoid ShowAll()const; virtual void SetAll();friendostream&operator<<(ostream&os, constabstr_emp&e);virtual ~abstr_emp() = 0;

};

classemployee :public abstr_emp

{ public:

employee();employee(const string &fn, const string &ln, const string &j);

virtualvoid ShowAll()const; virtual void SetAll();

};

classmanager :virtual public abstr_emp

{ private:intinchargeof;

protected:

intInChargeOf()const{ return inchargeof; } int&InChargeOf(){ return inchargeof; }

public:

manager();manager(const string &fn, const string &ln, const string &j, intico= 0);

manager(constabstr_emp&e,intico = 0); manager(const manager &m); virtual void ShowAll()const;virtual void SetAll(); voidgetInCharge(){ cout<< "Enter inchargeof:"; cin>>inchargeof;

}

};

class fink:virtual public abstr_emp

{ private:stringreportsto;

protected:

conststring ReportsTo()const{ return reportsto; } string&ReportsTo(){ returnreportsto; }

public:

fink();

fink(conststring &fn, const string &ln, const string &j, const string&rpo);

fink(constabstr_emp&e,const string &rpo); fink(const fink &e); virtual void ShowAll()const;virtual void SetAll(); voidgetReportsTo(){ cout<< "Enter reportsto:"; cin>>reportsto;

}

};

classhighfink:public manager, public fink

{ public:

highfink(); highfink(const string&fn, const string &ln, const string &j, const string &rpo,intico = 0);

highfink(constabstr_emp&e,const string &rpo, intico = 0); highfink(const fink &f, intico = 0);highfink(const manager &m, const string &rpo);highfink(consthighfink&h); virtual void ShowAll()const; virtual voidSetAll();

};

#endif

//emp.cpp#include "emp.h"

abstr_emp::abstr_emp():fname("no one"), lname("no one"), job("no job")

{

}

abstr_emp::abstr_emp(conststring &fn, const string &ln, const string &j) : fname(fn),lname(ln), job(j)

{

}

voidabstr_emp::ShowAll()const

{

cout<< "Firstname:" <

}

voidabstr_emp::SetAll()

{

cout<<"Enter firstname: "; getline(cin, fname); cout<< "Enterlastname: "; getline(cin, lname); cout<< "Enter position:"; getline(cin, job);

}

ostream&operator<<(ostream&os,constabstr_emp&e)

{

os<

}

abstr_emp::~abstr_emp()

{

}

employee::employee():abstr_emp()

{

}

employee::employee(conststring &fn, const string &ln, const string &j) : abstr_emp(fn, ln,j)

{

}

voidemployee::ShowAll()const

{

abstr_emp::ShowAll();

}

voidemployee::SetAll()

{

abstr_emp::SetAll();

}

manager::manager():abstr_emp()

{

}

manager::manager(conststring &fn, const string &ln, const string &j, intico) :abstr_emp(fn, ln, j), inchargeof(ico)

{

}

manager::manager(constabstr_emp&e,intico) : abstr_emp(e), inchargeof(ico)

{

}

manager::manager(constmanager &m) : abstr_emp(m)

{

}

voidmanager::ShowAll()const

{

abstr_emp::ShowAll();cout<< "Inchargeof: " <

}

voidmanager::SetAll()

{

abstr_emp::SetAll();cout<< "Enter inchargeof: ";

(cin>>inchargeof).get();

}

fink::fink():abstr_emp()

{

}

fink::fink(conststring &fn, const string &ln, const string &j, const string&rpo) : abstr_emp(fn, ln, j), reportsto(rpo)

{

}

fink::fink(constabstr_emp&e,const string &rpo) : abstr_emp(e), reportsto(rpo)

{

}

fink::fink(constfink &e) : abstr_emp(e)

{

}

voidfink::ShowAll()const

{

abstr_emp::ShowAll();cout<< "Reportsto: " <

} voidfink::SetAll()

{

abstr_emp::SetAll();cout<< "Enter reportsto: "; cin>>reportsto;

}

highfink::highfink():abstr_emp(), manager(), fink()

{

}

highfink::highfink(conststring &fn, const string &ln, const string &j, const string&rpo, intico) : abstr_emp(fn, ln, j), manager(fn, ln, j, ico), fink(fn,

ln, j, rpo)

{

}

highfink::highfink(constabstr_emp&e,const string &rpo, intico) : abstr_emp(e), manager(e, ico), fink(e, rpo)

{

}

highfink::highfink(constfink &f, intico) : abstr_emp(f), manager(f, ico), fink(f)

{

}

highfink::highfink(constmanager &m, const string &rpo) : abstr_emp(m), manager(m), fink(m, rpo)

{

}

highfink::highfink(consthighfink&h): abstr_emp(h), manager(h), fink(h)

{

}

voidhighfink::ShowAll()const

{

abstr_emp::ShowAll();cout<< "InChargeOf: " << manager::InChargeOf()<

}voidhighfink::SetAll()

{

abstr_emp::SetAll();manager::getInCharge(); fink::getReportsTo();

}

//useemp.cpp#include "emp.h"

intmain(void)

{

employeeem("Trip","Harris", "Thumper"); cout<

finkfi("Matt", "Oggs", "Oiler", "JunoBarr"); cout<< fi <

cout<<"Using an abstr_emp * pointer:\n"; abstr_emp *tri[4] = { &em,&fi, &hf, &hf2 }; for (inti = 0; i< 4; i++)tri[i]->ShowAll();

system("pause");return 0;

}

//15

1、

//tv.h

#ifndefTV_H_

#defineTV_H_

#include using namespace std;

classTv

{

friendclass Remote;

public:

enum { Off,On }; enum { MinVal, MaxVal = 20 }; enum { Antenna, Cable }; enum { TV, DVD };enum { USUAL, EXCHANGE };

Tv(ints = Off, int mc = 125) :state(s), volume(5), maxchannel(mc), channel(2),mode(Cable), input(TV){}

~Tv(){}

voidonoff(){state = (state == On) ? Off : On; } boolison()const{ return state == On; }boolvolup(); boolvoldown(); voidchanup(); voidchandown();

voidset_mode(){mode = (mode == Antenna) ? Cable : Antenna; } voidset_input(){ input = (input== TV) ? DVD : TV; } void settings()const; voidset_rmode(Remote &r);private: int state; int volume; intmaxchannel; int channel; int mode; intinput;

};

classRemote

{

private:

friendclass Tv;

enum {USUAL, EXCHANGE }; int mode; intfmode;

public:

Remote(intm = Tv::TV, int f = USUAL) :mode(m), fmode(f){} boolvolup(Tv&t){ returnt.volup(); } boolvoldown(Tv&t){ return t.voldown(); } voidonoff(Tv&t){t.onoff(); } voidchanup(Tv&t){ t.chanup(); } voidchandown(Tv&t){t.chandown(); } voidset_chan(Tv&t, int c){ t.channel = c; }voidset_mode(Tv&t){ t.set_mode(); } voidset_input(Tv&t){ t.set_input();} voidmode_show()const{ cout<< "Remote pretent mode is "<

};

inline voidTv::set_rmode(Remote &r)

{if (ison())

{

r.fmode =Remote::EXCHANGE;

r.mode_show();

}

}

#endif

//tvfm.h

#ifndefTVFM_H_

#define TVFM_H_ #include using namespace std;

classTv;

classRemote

{ public:

enum State{Off, On }; enum { MinVal, MaxVal = 20 }; enum { Antenna, Cable }; enum { TV,DVD }; private:

int mode;public:

Remote(intm = TV) :mode(m){} boolvolup(Tv&t); boolvoldown(Tv&t);voidonoff(Tv&t); voidchanup(Tv&t); voidchandown(Tv&t);voidset_chan(Tv&t, int c); voidset_mode(Tv&t); voidset_input(Tv&t);

};

classTv

{ public:

friend voidRemote::set_chan(Tv&t, int c); enum State{ Off, On }; enum { MinVal, MaxVal= 20 }; enum { Antenna, Cable }; enum { TV, DVD };

Tv(ints = Off, int mc = 125) :state(s), volume(5), maxchannel(mc), channel(2),mode(Cable), input(TV){}

~Tv(){}

voidonoff(){state = (state == On) ? Off : On; } boolison()const{ return state == On; }boolvolup(); boolvoldown(); voidchanup(); voidchandown();

voidset_mode(){mode = (mode == Antenna) ? Cable : Antenna; } voidset_input(){ input = (input== TV) ? DVD : TV; } void settings()const;

private:int state; int volume; intmaxchannel; int channel; int mode; int input;

};

inlineboolRemote::volup(Tv&t){ return t.volup(); } inlineboolRemote::voldown(Tv&t){ return t.voldown(); } inline voidRemote::onoff(Tv&t){ t.onoff(); } inline void Remote::chanup(Tv&t){t.chanup(); } inline void Remote::chandown(Tv&t){ t.chandown(); } inlinevoid Remote::set_chan(Tv&t, int c){ t.channel = c; } inline voidRemote::set_mode(Tv&t){ t.set_mode(); } inline voidRemote::set_input(Tv&t){ t.set_input(); }

#endif

//tv.cpp

#include"tv.h" //#include "tvfm.h" boolTv::volup()

{

if (volume

{

volume++;return true;

}

elsereturn false;

}

boolTv::voldown()

{

if(volume>MinVal)

{

volume--;return true;

}

elsereturn false;

}

voidTv::chanup()

{

if(channel

else

channel =1;

}

voidTv::chandown()

{

if(channel>1) channel--;

elsechannel = maxchannel;

} voidTv::settings()const

{

cout<<"TV is " << (state == Off ? "Off" : "On")<

{

cout<< "Volume setting =" << volume <

}

}

//use_tv.cpp#include "tv.h" int main()

{

Tvs42; Remote grey; grey.mode_show(); cout<< "Initial settings for42\" TV:\n"; s42.settings(); s42.onoff(); s42.chanup(); cout<<"\nAdjusted settings for 42\" TV:\n"; s42.settings();

s42.set_rmode(grey);grey.set_chan(s42, 10); grey.volup(s42); grey.volup(s42); cout<<"\n42\" settings after using remote:\n"; s42.settings();

Tvs58(Tv::On);s58.set_mode(); grey.set_chan(s58, 28); cout<< "\n58\"settings:\n"; s58.settings(); s58.set_rmode(grey);system("pause"); return 0;

}

2、

//exc_mean.h

#ifndefEXC_MEAN_H_

#defineEXC_MEAN_H_

#include

#include

#include #include using namespace std;

classbad_hmean:public logic_error

{ private:string name;

public:

explicitbad_hmean(const string&n = "hmean", const string &s = "Error inhmean()\n"); stringmesg(); virtual ~bad_hmean()throw(){}

};

bad_hmean::bad_hmean(conststring &n, const string &s) :name(n), logic_error(s)

{

}

inlinestring bad_hmean::mesg()

{

return"hmean() arguments a=-b should be div a+b=0!\n";

}

classbad_gmean:public logic_error

{ private:string name;

public:

explicitbad_gmean(conststring &n = "gmean", const string &s = "Error ingmean()\n"); stringmesg(); virtual ~bad_gmean()throw(){}

};

bad_gmean::bad_gmean(conststring &n, const string &s) :name(n), logic_error(s)

{

}

inlinestring bad_gmean::mesg()

{

return"gmean() arguments should be >= 0\n";

}

#endif

//error.cpp

#include"exc_mean.h"

doublehmean(doublea, double b); doublegmean(double a, double b);

int main()

{

double x,y, z; cout<< "Enter two numbers:"; while (cin>> x>> y)

{try{

z = hmean(x,y); cout<< "Harmonic mean of " << x << " and" << y

<<"is " << z <

<<"is " <: ";

}

catch(bad_hmean&bg)

{

cout<

}

catch(bad_gmean&hg)

{

cout<

cout<<"Error message: \n" <

}

}

cout<<"Bye!\n"; system("pause"); return 0;

}

doublehmean(doublea, double b)

{

if(a == -b) throwbad_hmean();

return2.0*a*b / (a + b);

}

doublegmean(doublea, double b)

{

if(a < 0 || b < 0) throwbad_gmean();

returnsqrt(a*b);

}

3、

//exc_mean.h

#ifndefEXC_MEAN_H_

#defineEXC_MEAN_H_

#include

#include

#include #include using namespace std;

classbad_hmean:public logic_error

{ private:

stringname;

public:

double v1;double v2;

explicitbad_hmean(doublea = 0, double b = 0, const string &s = "Error in hmean()\n");

voidmesg();virtual ~bad_hmean()throw(){}

};

bad_hmean::bad_hmean(doublea, double b, const string &s)

:v1(a),v2(b), logic_error(s)

{

name ="hmean";

}

inline voidbad_hmean::mesg()

{

cout<

<<") arguments a=-b should be div a+b=0!\n";

}

classbad_gmean:public bad_hmean

{ private:string name;

public:

explicitbad_gmean(doublea = 0, double b = 0, const string &s = "Error in gmean()\n");

voidmesg();virtual ~bad_gmean()throw(){}

};

bad_gmean::bad_gmean(doublea, double b, const string &s)

:bad_hmean(a,b, s)

{

name ="gmean";

}

inline voidbad_gmean::mesg()

{

cout<

be >=0\n";

}

#endif

//error.cpp

#include"exc_mean.h"

doublehmean(doublea, double b); doublegmean(double a, double b);

int main()

{

double x,y, z; cout<< "Enter two numbers:"; while (cin>> x>> y)

{try{

z =hmean(x, y); cout<< "Harmonic mean of " << x <<" and " << y

<<"is " << z <

<<"is " <: ";

}

catch(bad_gmean&hg)

{

cout<

}

catch(bad_hmean&bg)

{

cout<

}

}

cout<<"Bye!\n"; system("pause"); return 0;

}

doublehmean(doublea, double b)

{

if(a == -b) throwbad_hmean();

return2.0*a*b / (a + b);

}

doublegmean(doublea, double b)

{

if (a <0 || b < 0)

throwbad_gmean();

returnsqrt(a*b);

}

4、

//sales.h

#ifndefSALES_H_

#defineSALES_H_

#include

#include

#include

#include #include using namespace std;

class Sales

{ public:

enum {MONTHS = 12 };

classbad_index:publiclogic_error

{ private:int bi;

public:

explicitbad_index(intix, const string &s = "Index error in Sales object\n");intbi_val()const { return bi; } virtual ~bad_index()throw(){}

};

explicitSales(intyy = 0); Sales(intyy, const double *gr, int n); virtual ~Sales(){} intYear()const { return year; } virtual double operator[](inti)const; virtualdouble &operator[](inti);

private:

doublegross[MONTHS]; int year;

};

classLabeledSales:public Sales

{ public:classnbad_index :public Sales::bad_index

{

private:std::stringlbl;

public:

nbad_index(conststring &lb, int ix, const string &s = "Index error in LabeledSalesobject\n");

conststring &label_val()const { return lbl; } virtual ~nbad_index()throw(){}

};

explicitLabeledSales(conststring &lb = "none", intyy = 0); LabeledSales(const string&lb, intyy, const double *gr, int n); virtual ~LabeledSales(){} conststring &Label()const { return label; } virtual doubleoperator[](inti)const; virtual double &operator[](inti);

private:

stringlabel;

};

#endif

//sales.cpp

#include"sales.h"

Sales::bad_index::bad_index(intix, const string &s) :logic_error(s), bi(ix)

{

}

Sales::Sales(intyy)

{

year = yy; for (inti = 0; i

}

Sales::Sales(intyy,const double *gr, int n)

{

year = yy;intlim = (n < MONTHS) ? n : MONTHS;

inti;

for(i = 0; i

for(; i< MONTHS; ++i) gross[i] = 0;

}

doubleSales::operator[](inti)const

{

if (i< 0|| i>= MONTHS)

throwbad_index(i);

returngross[i];

}

double&Sales::operator[](inti)

{

if (i< 0|| i>= MONTHS)

throwbad_index(i);

returngross[i];

}

LabeledSales::nbad_index::nbad_index(conststring &lb, int ix, const string &s) :Sales::bad_index(ix, s)

{

lbl = lb;

}

LabeledSales::LabeledSales(conststring &lb, intyy) : Sales(yy)

{

label = lb;

}

LabeledSales::LabeledSales(conststring &lb, intyy, const double *gr, int n) : Sales(yy, gr, n)

{

label = lb;

}

doubleLabeledSales::operator[](inti)const

{

if (i< 0|| i>= MONTHS)

thrownbad_index(Label(),i);

returnSales::operator[](i);

}

double&LabeledSales::operator[](inti)

{

if (i< 0|| i>= MONTHS)

thrownbad_index(Label(),i);

returnSales::operator[](i);

}

//use_sales.cpp#include "sales.h" int main()

{

doublevals1[12] =

{

1220, 1100,1122, 2212, 1232, 2334,

2884, 2393,3302, 2922, 3002, 3544

};

doublevals2[12] =

{

12, 11, 22,21, 32, 24,

28, 29, 33,29, 32, 35

};

Salessales1(2011, vals1, 12);

LabeledSalessales2("Blogstar",2012, vals2, 12);

Sales::bad_index *s;LabeledSales::nbad_index *l; cout<< "First try block:\n"; try

{inti;

cout<<"Year = " << sales1.Year() <

{

cout<

}

cout<<"Year = " << sales2.Year() <

}

catch(logic_error&bad)

{

cout<

if (l =dynamic_cast(&bad))

{

cout<<"Comany: " << l->label_val() <bi_val() <

}

elseif (s = dynamic_cast(&bad)) cout<<"bad index: " << s->bi_val() <

}

cout<<"\nNext try block:\n"; try

{

sales2[2] =37.5; sales1[20] = 23345; cout<< "End of try block 2.\n";

}

catch(logic_error&bad)

{

cout<(&bad))

{

cout<<"Comany: " << l->label_val() <bi_val() <

}

elseif (s = dynamic_cast(&bad)) cout<<"bad index: " << s->bi_val() <

}

cout<<"done\n"; system("pause"); return 0;

}

Chapter 16

PE 16-1

//pe16-1.cpp -- one of many possible solutions

#include #include bool isPal(const std::string & s);

intmain()

{std::string input; std::cout << "Enter a string (empty string toquit):\n";

std::getline(std::cin,input);while (std::cin && input.size() > 0)

{ if (isPal(input)) std::cout <<"That was a palindrome!\n";

elsestd::cout << "That was not a palindrome!\n";

std::cout<< "Enter a string (empty string to quit):\n";

std::getline(std::cin,input);

}

std::cout<< "Bye!\n";

return0;

}

boolisPal(const std::string & s)

{std::string rev(s.rbegin(), s.rend()); // construct reversed

string

//some older compilers don’t implement the above constructor

//another approach is this

          // std::string rev(s);    // revsame size as s

//copy(s.rbegin(), s.rend(), rev.begin());

return(rev == s);

}

PE 16-4

//pe16-4.cpp -- one possibility

#include

#include #define MAX 10

intreduce(long ar[], int n); void show(const long ar[], int n); int main()

{ long myarray[MAX] = {12, 12 ,5, 6,11, 5, 6, 77, 11,12}; show(myarray, MAX);

int newsize = reduce(myarray,MAX); show(myarray,newsize); return (0);

}

intreduce(long ar[], int n)

{

// orone could copy to a list and use list methods

// orcopy to a set; in either case, copy results

//back to array std::sort(ar, ar + n); long * past_end;

past_end= std::unique(ar, ar + n); return past_end - ar;

}

voidshow(const long ar[], int n)

{

for (int i = 0; i < n; i++) std::cout << ar[i] << ' ';

std::cout<< std::endl;

}

PE 16-8

//pe16-8.cpp

#include

#include

#include

#include

#include #include int main()

{ using namespace std; string temp;

setmats;

cout<< "Enter Mat's guest list (empty line to quit):\n"; while(getline(cin,temp) && temp.size() > 0) mats.insert(temp);

ostream_iteratorout (cout, "\n");

cout << "Mat's guest list:\n"; copy(mats.begin(),mats.end(), out);

setpats;

cout<< "Enter Pat's guest list (empty line to quit):\n"; while(getline(cin,temp) && temp.size() > 0) pats.insert(temp);

cout << "\nPat's guest list:\n"; copy(pats.begin(),pats.end(), out);

setboth;

set_union(mats.begin(),mats.end(), pats.begin(),

pats.end(),insert_iterator >(both, both.begin()));

cout << "\nMerged guest list:\n"; copy(both.begin(),both.end(), out);

return0;

}

Chapter 17

PE 17-1

//pe17-1.cpp #include

intmain(void)

{using namespace std; char ch; int count = 0;

while (cin.get(ch) && ch != '$') count++;

if (ch== '$')

cin.putback(ch);

else cout << "End of input was reached\n";

cout<< count << " characters read\n";

cin.get(ch);

cout<< "Then next input character is " << ch << endl;return 0;

}

PE 17-3

//pe17-3.cpp

#include

#include #include

intmain(int argc, char * argv[])

{using namespace std;

if(argc < 3)

{ cerr << "Usage: " << argv[0]

<<" source-file target-file\n"; exit(EXIT_FAILURE);

}

ifstreamfin(argv[1]); if (!fin)

{ cerr << "Can't open "<< argv[1] << " for input\n"; exit(EXIT_FAILURE);

}

ofstreamfout(argv[2]); if (!fout)

{ cerr << "Can't open "<< argv[2] << " for output\n"; exit(EXIT_FAILURE);

}

char ch; while (fin.get(ch)) fout << ch;

cout<< "Contents of " << argv[1] << " copied to"

<

}

PE 17-5

//pe17-5.cpp

#include

#include

#include

#include

#include

#include #include

intmain()

{using namespace std; ifstream mat("mat.dat"); if (!mat.is_open())

{ cerr << "Can't open mat.dat.\n";

exit(1);}

ifstreampat("pat.dat"); if (!pat.is_open())

{ cerr << "Can't open pat.dat.\n";

exit(1); }

ofstreammatnpat("matnpat.dat"); if (!matnpat.is_open())

{ cerr << "Can't open pat.dat.\n"; exit(1); } stringtemp;

setmats; while (getline(mat,temp)) mats.insert(temp);

ostream_iteratorout (cout, "\n");

cout << "Mat's guest list:\n"; copy(mats.begin(),mats.end(), out);

setpats; while (getline(pat,temp)) pats.insert(temp);

cout << "\nPat's guest list:\n"; copy(pats.begin(),pats.end(), out);

ostream_iteratorfout (matnpat, "\n"); set both;

set_union(mats.begin(),mats.end(), pats.begin(),

pats.end(),insert_iterator >(both, both.begin()));

cout << "\nMerged guest list:\n"; copy(both.begin(),both.end(), out); copy(both.begin(), both.end(), fout);

return0;

} if(!pat.is_open())

{ cerr << "Can't open pat.dat.\n";

exit(1); }

ofstreammatnpat("matnpat.dat"); if (!matnpat.is_open())

{ cerr << "Can't open pat.dat.\n";

exit(1);} string temp; set mats; while (getline(mat,temp))mats.insert(temp);

ostream_iteratorout (cout, "\n");

cout << "Mat's guest list:\n"; copy(mats.begin(),mats.end(), out);

setpats; while (getline(pat,temp)) pats.insert(temp);

cout << "\nPat's guest list:\n"; copy(pats.begin(),pats.end(), out);

ostream_iteratorfout (matnpat, "\n"); set both;

set_union(mats.begin(),mats.end(), pats.begin(),

pats.end(),insert_iterator >(both, both.begin()));

cout<< "\nMerged guest list:\n"; copy(both.begin(), both.end(),out); copy(both.begin(), both.end(), fout); return 0;

}

PE 17-7

//pe17-7.cpp

#include

#include

#include

#include

#include #include

voidShowStr(const std::string & s);

voidGetStrs(std::istream & is, std::vector & vs);

classStore

{

public:

std::ostream& os;

Store(std::ostream & o) : os(o) {} void operator()(const std::string &s);

};

intmain()

{ using namespace std; vector vostr; string temp;

//acquire strings cout << "Enter strings (empty line toquit):\n"; while (getline(cin,temp) && temp[0] != '\0')vostr.push_back(temp);

cout << "Here is your input.\n";for_each(vostr.begin(), vostr.end(), ShowStr);

//store in a file ofstream fout("strings.dat", ios_base::out |

ios_base::binary); for_each(vostr.begin(), vostr.end(), Store(fout));fout.close();

// recoverfile contents vector vistr;

ifstreamfin("strings.dat",ios_base::in|ios_base::binary);if (!fin.is_open())

{ cerr << "Could not open file for input.\n";

exit(EXIT_FAILURE);

}

GetStrs(fin,vistr);

cout<< "\nHere are the strings read from the file:\n";for_each(vistr.begin(), vistr.end(), ShowStr);

return0;

}

voidShowStr(const std::string & s)

{std::cout << s << std::endl;

}

voidStore::operator()(const std::string &s)

{std::size_t len = s.size();

os.write((char*)&len, sizeof(std::size_t)); os.write(s.data(), len);

}

voidGetStrs(std::istream & is, std::vector & vs)

{ std::string temp; size_t len;

while(is.read((char *) &len, sizeof(size_t)) && len > 0)

{ char ch; temp = "";

for(int j = 0; j < len; j++)

{ if(is.read(&ch, 1))

{ temp+= ch;

} elsebreak;

} if(is) vs.push_back(temp);

}

}


你可能感兴趣的:(C++primer plus部分解答)