CPrimerPlus第6版中文版勘误表
C++Primer Plus(第6版)中文版编程练习答案--第五章

9.
#include<iostream> #include<cstring> #include<string> using namespace std; int main() { string word; int i=0; cout<<"enter words(to stop, type the word done):"<<endl; cin>>word; while(word!="done") { i++; cin>>word; } cout<<"you entered a total of "<<i<<" words."<<endl; return 0; }
8.
#include<iostream> #include<cstring> using namespace std; int main() { char word[20]; int i=0;
5
cout<<"enter words(to stop, type the word done):"<<endl; cin>>word; while(strcmp(word,"done")!=0) { i++; cin>>word; } cout<<"you entered a total of "<<i<<" words."<<endl; return 0; }
C++ primer plus(第6版)中文版编程练习答案第15章

1、//tv.h#ifndef TV_H_#define TV_H_#include <iostream>using namespace std;classTv{friend class Remote;public:enum { Off, On };enum { MinVal, MaxVal = 20 };enum { Antenna, Cable };enum { TV, DVD };enum { USUAL, EXCHANGE };Tv(int s = 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;int input;};class Remote{private:friend class Tv;enum { USUAL, EXCHANGE };int mode;intfmode;public:Remote(int m = Tv::TV, int f = USUAL) :mode(m), fmode(f){}boolvolup(Tv&t){ return t.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 " <<fmode<<endl; } };inline void Tv::set_rmode(Remote &r){if (ison()){r.fmode = Remote::EXCHANGE;r.mode_show();}}#endif//tvfm.h#ifndef TVFM_H_#define TVFM_H_#include <iostream>using namespace std;classTv;class Remote{public:enum State{ Off, On };enum { MinVal, MaxVal = 20 };enum { Antenna, Cable };enum { TV, DVD };private:int mode;public:Remote(int m = 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 void Remote::set_chan(Tv&t, int c);enum State{ Off, On };enum { MinVal, MaxVal = 20 };enum { Antenna, Cable };enum { TV, DVD };Tv(int s = 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;};inlinebool Remote::volup(Tv&t){ return t.volup(); }inlinebool Remote::voldown(Tv&t){ return t.voldown(); } inline void Remote::onoff(Tv&t){ t.onoff(); }inline void Remote::chanup(Tv&t){ t.chanup(); }inline void Remote::chandown(Tv&t){ t.chandown(); } inline void Remote::set_chan(Tv&t, int c){ t.channel = c; } inline void Remote::set_mode(Tv&t){ t.set_mode(); } inline void Remote::set_input(Tv&t){ t.set_input(); }#endif//tv.cpp#include "tv.h"//#include "tvfm.h"boolTv::volup(){if (volume <MaxVal){volume++;return true;}elsereturn false;}boolTv::voldown(){if (volume>MinVal){volume--;return true;}elsereturn false;}voidTv::chanup(){if (channel <maxchannel)channel++;elsechannel = 1;}voidTv::chandown(){if (channel>1)channel--;elsechannel = maxchannel;}voidTv::settings()const{cout<< "TV is " << (state == Off ? "Off" : "On") <<endl;if (state == On){cout<< "Volume setting = " << volume <<endl;cout<< "Channel setting = " << channel <<endl;cout<< "Mode = " << (mode == Antenna ? "antenna" : "cable") <<endl;cout<< "Input = " << (input == TV ? "TV" : "DVD") <<endl;}}//use_tv.cpp#include "tv.h"int main(){Tv s42;Remote grey;grey.mode_show();cout<< "Initial settings for 42\" 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#ifndef EXC_MEAN_H_#define EXC_MEAN_H_#include <iostream>#include <cmath>#include <stdexcept>#include <string>using namespace std;classbad_hmean :public logic_error{private:string name;public:explicitbad_hmean(const string &n = "hmean", const string &s = "Error in hmean()\n");stringmesg();virtual ~bad_hmean()throw(){}};bad_hmean::bad_hmean(const string &n, const string &s) :name(n), logic_error(s){}inline string 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(const string &n = "gmean", const string &s = "Error in gmean()\n");stringmesg();virtual ~bad_gmean()throw(){}};bad_gmean::bad_gmean(const string &n, const string &s) :name(n), logic_error(s){inline string bad_gmean::mesg(){return "gmean() arguments should be >= 0\n";}#endif//error.cpp#include "exc_mean.h"doublehmean(double a, 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 <<endl;cout<< "Geomettric mean of " << x << " and " << y<<" is " <<gmean(x, y) <<endl;cout<< "Enter next set of numbers <q to quit>: ";}catch (bad_hmean&bg){cout<<bg.what();cout<< "Error message: \n" <<bg.mesg() <<endl;cout<< "Try again.\n";continue;}catch (bad_gmean&hg){cout<<hg.what();cout<< "Error message: \n" <<hg.mesg() <<endl;cout<< "Sorry, you don't get to play and more.\n";break;}}cout<< "Bye!\n";system("pause");return 0;}doublehmean(double a, double b){if (a == -b)throwbad_hmean();return 2.0*a*b / (a + b);}doublegmean(double a, double b){if (a < 0 || b < 0)throwbad_gmean();returnsqrt(a*b);}3、//exc_mean.h#ifndef EXC_MEAN_H_#define EXC_MEAN_H_#include <iostream>#include <cmath>#include <stdexcept>#include <string>using namespace std;classbad_hmean :public logic_error{private:string name;public:double v1;double v2;explicitbad_hmean(double a = 0, double b = 0,const string &s = "Error in hmean()\n");voidmesg();virtual ~bad_hmean()throw(){}};bad_hmean::bad_hmean(double a, double b, const string &s) :v1(a), v2(b), logic_error(s){name = "hmean";}inline void bad_hmean::mesg(){cout<< name << "(" << v1 << ", " << v2<< ") arguments a=-b should be div a+b=0!\n";}classbad_gmean :public bad_hmean{private:string name;public:explicitbad_gmean(double a = 0, double b = 0,const string &s = "Error in gmean()\n");voidmesg();virtual ~bad_gmean()throw(){}};bad_gmean::bad_gmean(double a, double b, const string &s):bad_hmean(a, b, s){name = "gmean";}inline void bad_gmean::mesg(){cout<< name << "(" <<bad_hmean::v1 << ", " <<bad_hmean::v2 << ") arguments should be >= 0\n";}#endif//error.cpp#include "exc_mean.h"doublehmean(double a, 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 <<endl;cout<< "Geomettric mean of " << x << " and " << y<<" is " <<gmean(x, y) <<endl;cout<< "Enter next set of numbers <q to quit>: ";}catch (bad_gmean&hg){cout<<hg.what();cout<< "Error message: \n";hg.mesg();cout<<endl;cout<< "Sorry, you don't get to play and more.\n";break;}catch (bad_hmean&bg){cout<<bg.what();cout<< "Error message: \n";bg.mesg();cout<<endl;cout<< "Try again.\n";continue;}}cout<< "Bye!\n";system("pause");return 0;}doublehmean(double a, double b){if (a == -b)throwbad_hmean();return 2.0*a*b / (a + b);}doublegmean(double a, double b){if (a < 0 || b < 0)throwbad_gmean();returnsqrt(a*b);}4、//sales.h#ifndef SALES_H_#define SALES_H_#include <stdexcept>#include <string>#include <cstring>#include <iostream>#include <cstdlib>using namespace std;class Sales{public:enum { MONTHS = 12 };classbad_index:publiclogic_error{private:int bi;public:explicitbad_index(int ix, const string &s = "Index error in Sales object\n");intbi_val()const { return bi; }virtual ~bad_index()throw(){}};explicit Sales(intyy = 0);Sales(intyy, const double *gr, int n);virtual ~Sales(){}int Year()const { return year; }virtual double operator[](inti)const;virtual double &operator[](inti);private:double gross[MONTHS];int year;};classLabeledSales :public Sales{public:classnbad_index :public Sales::bad_index{private:std::stringlbl;public:nbad_index(const string &lb, int ix,const string &s = "Index error in LabeledSales object\n");const string &label_val()const { return lbl; }virtual ~nbad_index()throw(){}};explicitLabeledSales(const string &lb = "none", intyy = 0);LabeledSales(const string &lb, intyy, const double *gr, int n);virtual ~LabeledSales(){}const string &Label()const { return label; }virtual double operator[](inti)const;virtual double &operator[](inti);private:string label;};#endif//sales.cpp#include "sales.h"Sales::bad_index::bad_index(int ix,const string &s) :logic_error(s), bi(ix){}Sales::Sales(intyy){year = yy;for (inti = 0; i< MONTHS; ++i)gross[i] = 0;}Sales::Sales(intyy, const double *gr, int n){year = yy;intlim = (n < MONTHS) ? n : MONTHS;inti;for (i = 0; i<lim; ++i)gross[i] = gr[i];for (; i< MONTHS; ++i)gross[i] = 0;}double Sales::operator[](inti)const{if (i< 0 || i>= MONTHS)throwbad_index(i);return gross[i];}double&Sales::operator[](inti){if (i< 0 || i>= MONTHS)throwbad_index(i);return gross[i];}LabeledSales::nbad_index::nbad_index(const string &lb, int ix,const string &s) :Sales::bad_index(ix, s){lbl = lb;}LabeledSales::LabeledSales(const string &lb, intyy) : Sales(yy){label = lb;}LabeledSales::LabeledSales(const string &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);return Sales::operator[](i);}double&LabeledSales::operator[](inti){if (i< 0 || i>= MONTHS)thrownbad_index(Label(), i);return Sales::operator[](i);}//use_sales.cpp#include "sales.h"int main(){double vals1[12] ={1220, 1100, 1122, 2212, 1232, 2334,2884, 2393, 3302, 2922, 3002, 3544};double vals2[12] ={12, 11, 22, 21, 32, 24,28, 29, 33, 29, 32, 35};Sales sales1(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() <<endl;for (i = 0; i< 12; ++i){cout<< sales1[i] << ' ';if (i % 6 == 5)cout<<endl;}cout<< "Year = " << sales2.Year() <<endl;cout<< "Label = " << bel() <<endl;for (i = 0; i<= 12; ++i){cout<< sales2[i] << ' ';if (i % 6 == 5)cout<<endl;}cout<< "End of try block 1.\n";}catch (logic_error&bad){cout<<bad.what();if (l = dynamic_cast<LabeledSales::nbad_index *>(&bad)) {cout<< "Comany: " << l->label_val() <<endl;cout<< "bad index: " << l->bi_val() <<endl;}else if (s = dynamic_cast<Sales::bad_index *>(&bad))cout<< "bad index: " << s->bi_val() <<endl;}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.what();if (l = dynamic_cast<LabeledSales::nbad_index *>(&bad)){cout<< "Comany: " << l->label_val() <<endl;cout<< "bad index: " << l->bi_val() <<endl;}else if (s = dynamic_cast<Sales::bad_index *>(&bad))cout<< "bad index: " << s->bi_val() <<endl;}cout<< "done\n";system("pause");return 0;}。
CPrimerPlus第6版中文版勘误表

注意:下面的勘误中,红色字体为修改后的文字,提请各位读者注意。
第 6 页,” 1.6 语言标准”中的第 3 行,将 1987 年修改为 1978 年。
第 22 页,” 2. main ()函数”中的第 1 行, int main (void ) 后面的分号( ; )删除。
第 24 页,“5. 声明”的第 10 行,也就 是一个变量、函数或其他实体的名称。
第 27 页,图 2.3 中,下划线应该只包含括号中的内容;第 2 段的第 4 行,而不是存储 在 源代码 中的指令。
第 30页,“2.5.4 打印多个值”的第 4行,双引 号后面的第 1 个变量。
第 34页,“2.7.3 程序状态”第 2段的第 4 行,要尽量忠实 于代码来模拟。
第 35页,“2.10 本章小结”第 2段的第 1句,声明 语句为变量指定变量名, 并标识该变量中存 储的数据类型;本页倒数第 2 行,即 检查程序每执行一步后所有变量的值。
第37页,“2.12编程练习”中第1题,把你的名和姓打印在一行……把你的 名和姓分别打印在 两行……把你的 名和姓打印在一行……把示例的内容换成你的 名字。
第 40 页,第 1 行,用于把英 磅常衡盎司转换为… … 第44页,“3.4 C 语言基本数据类型”的第 1句,本节将 详细介绍C 语言的基本属性类型……第 46页,“5. 八进制和十六进制”的第 4句,十六进制数 3的二进制数 是 0011,十六进制数 5 的二进制数 是 0101;“6. 显示八进制和十六进制”的第 1 句,既可以使用 也可以 显示不同进制 的数;将“回忆一下……程序在执行完毕后不会立即关闭执行窗口”放到一个括号里。
第 47页,“2. 使用多种整数类型的原因”第 3句,过去的一台运行 Windows 3.x 的机器上。
第 53 页,图 3.5 下面的第 4 行“上面最后一个例子( printf ( “ ” a \\ is abackslash. ” \n ” ); )” 第 56页,正文的第 2行和第 4行应该分别为 printf ( “me32 = %““d”“\n ”, me32); printf ( “me32 = %d\n ” , me32);第 61 页,“无符号类型”的最后 1 句,相当于 unsigned int (即两者之间添加一个空格 )。
C++ Primer Plus(第6版)中文版》编程练习答案第6-10章

第6章分支语句和逻辑运算符//ex6.1#include<iostream>#include<cctype>int main(){using namespace std;char ch;cin.get(ch);while (ch != '@'){if (!isdigit(ch)){if (isupper(ch))ch = tolower(ch);else if (islower(ch))ch = toupper(ch);cout << ch;}cin.get(ch);}return 0;}//ex6.2#include<iostream>const int Max = 10;int main(){using namespace std;double num[Max];int i = 0;cout << "Number 1: ";while (i < Max && cin >> num[i]){if (++i < Max)cout << "Number " << i+1 << ": ";}double total = 0.0;for (int j = 0; j < i; j++)total += num[j];double Average = total/i;cout << "Average = " << Average << endl;int q = 0;for (int j = 0; j < i; j++)if (num[j] > Average)q++;cout << q << " numbers > average.\n";return 0;}//ex6.3#include<iostream>int main(){using namespace std;char ch;cout << "Please enter one of the choice:\n"<< "c) carnivore p) pianist\n"<< "t) tree g) game\n";cin >> ch;while (ch != 'c' && ch != 'p' && ch != 't' && ch != 'g'){cout << "Please enter a c, p, t, or g: ";cin >> ch;}switch (ch){case'c' : cout << "A cat is a carnivore.\n";break;case'p' : cout << "Radu Lupu is a pianist.\n";break;case't' : cout << "A maple is a tree.\n";break;case'g' : cout << "Golf is a game.\n";break;default : cout << "The program shouldn't get here!\n";}return 0;}//ex6.4#include<iostream>const int strsize = 20;struct bop{char fullname[strsize];char title[strsize];char bopname[strsize];int preference;};int main(){using namespace std;bop member[5] = {{"Wimp Macho", "English Teacher", "DEMON", 0},{"Raki Rhodes", "Junior Programmer", "BOOM", 1},{"Celia Laiter", "Super Star", "MIPS", 2},{"Hoppy Hipman", "Analyst Trainee", "WATEE", 1},{"Pat Hand", "Police", "LOOPY", 2}};char ch;cout << "Benevolent Order of Programmers Report\n"<< "a. display by name b. display by title\n"<< "c. display by bopname d. display by preference\n"<< "q. quit\n";cout << "Enter your choice: ";while (cin >> ch && ch != 'q'){switch (ch){case'a': for (int i = 0; i < 5; i++)cout << member[i].fullname << endl;break;case'b': for (int i = 0; i < 5; i++)cout << member[i].title << endl;break;case'c': for (int i = 0; i < 5; i++)cout << member[i].bopname << endl;break;case'd': for (int i = 0; i < 5; i++){if (member[i].preference == 0)cout << member[i].fullname << endl;else if (member[i].preference == 1)cout << member[i].title << endl;elsecout << member[i].bopname << endl;}break;}cout << "Next choice: ";}cout << "Bye!" << endl;return 0;}//ex6.5#include<iostream>const double LEV1 = 5000;const double LEV2 = 15000;const double LEV3 = 35000;const double RATE1 = 0.10;const double RATE2 = 0.15;const double RATE3 = 0.20;int main(){using namespace std;double income, tax;cout << "Enter your annual income in tvarps: ";cin >> income;if (income <= LEV1)tax = 0;else if (income <= LEV2)tax = (income - LEV1) * RATE1;else if (income <= LEV3)tax = RATE1 * (LEV2 - LEV1) + RATE2 * (income - LEV2);elsetax = RATE1 * (LEV2 - LEV1) + RATE2 * (LEV3 - LEV2)+ RATE3 * (income - LEV3);cout << "You owe Neutronia " << tax << " tvarps in taxes.\n";return 0;}//ex6.6#include<iostream>#include<string>using namespace std;struct Patrons{string name;double money;};int main(){cout << "输入捐赠者的数目: ";int num;cin >> num;Patrons* ps = new Patrons[num];cout << "输入每一个捐赠者的姓名和款项:\n";for (int i=0; i<num; i++){cout << "输入第" << i+1 << "位姓名: ";cin >> ps[i].name;cout << "输入第" << i+1 << "位款项: ";cin >> ps[i].money;}cout << "Grand Patron\n";for (int i=0; i<num; i++){if (ps[i].money > 10000)cout << ps[i].name << endl;}cout << "\nPatron\n";for (int i=0; i<num; i++){if (ps[i].money <= 10000)cout << ps[i].name << endl;}return 0;}//ex6.7#include<iostream>#include<string>#include<cctype>int main(){using namespace std;string word;int vowel = 0;int consonant = 0;int other = 0;char ch;cout << "Enter words (q to quit):\n";cin >> word;while (word != "q"){ch = tolower(word[0]);if (isalpha(ch)){if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')vowel ++;elseconsonant ++;}elseother ++;cin >> word;}cout << vowel << " words beginning with vowel\n"<< consonant << " words beginning with consonants\n"<< other << " others\n";return 0;}//ex6.8#include<iostream>#include<fstream>#include<cstdlib>const int SIZE = 60;int main(){using namespace std;char filename[SIZE];ifstream inFile;cout << "Enter name of data file: ";cin.getline(filename, SIZE);inFile.open(filename);if (!inFile.is_open()){cout << "Could not open the file " << filename << endl;cout << "Program terminating.\n";exit(EXIT_FAILURE);}int count = 0;char ch;inFile >> ch;while (inFile.good()){count ++;inFile >> ch; // get next value}cout << count << " characters in " << filename << endl;inFile.close(); // finished with the filereturn 0;}//ex6.9#include<iostream>#include<string>#include<fstream>#include<cstdlib>const int SIZE = 60;using namespace std;struct Patrons{string name;double money;};int main(){char filename[SIZE];ifstream inFile;cout << "Enter name of data file: ";cin.getline(filename, SIZE);inFile.open(filename);if (!inFile.is_open()){cout << "Could not open the file " << filename << endl;cout << "Program terminating.\n";exit(EXIT_FAILURE);}int num;inFile >> num;inFile.get();Patrons* ps = new Patrons[num];for (int i = 0; i<num; i++){getline(inFile, ps[i].name);inFile >> ps[i].money;inFile.get();}cout << "\nGrand Patrons:\n";int count1 = 0;for (int i = 0; i < num; i++){if (ps[i].money > 10000){cout << ps[i].name <<endl;count1++;}}if (count1 == 0)cout << "none";cout << "\nPatrons:\n";int count2 = 0;for (int i = 0; i < num; i++){if (ps[i].money <= 10000){cout << ps[i].name <<endl;count2++;}}if (count2 == 0)cout << "none";delete [] ps;inFile.close();return 0;}第7章函数——C++的编程模块//ex7.1#include<iostream>double t_av(double x, double y);int main(){using namespace std;double x, y;double result;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;}double t_av(double x, double y){return 2.0 * x * y / (x + y);}//ex7.2#include<iostream>const int MAX = 10;using namespace std;int fill_ar(double ar[], int limit);void show_ar(const double ar[], int n);double average(const double 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;}int fill_ar(double ar[], int limit){double temp;int i;for (i = 0; i < limit; i++){cout << "Enter score #" << i+1 << ": ";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(const double ar[], int n){for (int i = 0; i < n; i++)cout << "score #" << i+1 << ": " << ar[i] << endl; }double average(const double ar[], int n){double sum = 0.0;for (int i = 0; i < n; i++)sum += ar[i];return sum / n;}//ex7.3#include<iostream>struct box{char maker[40];float height;float width;float length;float volume;};void set_box(box *);void show_box(box);int main(){using namespace std;box carton = {"Bingo Boxer", 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 namespace std;cout << "Box maker: " << b.maker<< "\nheight: " << b.height<< "\nlwidth: " << b.width<< "\nlength: " << b.length<< "\nvolume: " << b.volume << endl;}//ex7.4#include<iostream>long double probability(unsigned numbers, unsigned picks);int main(){using namespace 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 << "Enter total number of game card choices and\n""number of picks allowed for the 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 "<< probability1 << ".\n";cout << "The chances of getting the megaspot is one in "<< probability2 << ".\n";cout << "You have one chance in ";cout << probability1 * probability2;cout << " of winning.\n";cout << "Next set of numbers (q to quit): ";}cout << "bye\n";return 0;}long double probability(unsigned numbers, unsigned picks){long double result = 1.0;long double n;unsigned p;for (n = numbers, p = picks; p > 0; n--, p--)result = result * n / p;return result;}//ex7.5#include<iostream>long long int recure(int);int main(){using namespace std;int number;cout << "Enter a integer (q to stop): ";while (cin >> number){long long int result = recure(number);cout << number << "! = " << result << endl;cout << "Next:";}cout << "Done!" << endl;return 0;}long long int recure(int n){long long int result;if (n > 0)result = n * recure(n-1);elseresult = 1;return result;}//ex7.6#include<iostream>const int Size = 10;int Fill_array(double ar[], int n);void Show_array(const double ar[], int n); void Reverse_array(double ar[], int n);int main(){using namespace std;double values[Size];int len = Fill_array(values, Size);cout << "Array values:\n";Show_array(values, len);cout << "Array reversed:\n";Reverse_array(values, len);Show_array(values, len);cout << "All but end values reversed:\n";Reverse_array(values+1, len-2);Show_array(values, len);return 0;}int Fill_array(double ar[], int n){using namespace std;double temp;int i;for (i=0; i<n; i++){cout << "Enter value #" << i+1 << ": ";cin >> temp;if (!cin)break;ar[i] = temp;}cout << endl;return i;}void Show_array(const double ar[], int n){using namespace std;for (int i=0; i<n; i++)cout << "Property #" << i+1 << ": "<< ar[i] << endl;cout << endl;}void Reverse_array(double ar[], int n){double temp;for (int i=0,j=n-1; i<j; i++,j--){temp = ar[i];ar[i] = ar[j];ar[j] = temp;}}//ex7.7#include<iostream>const int Max = 5;double * fill_array(double * begin, double * end);void show_array(const double * begin, const double * end); void revalue(double r, 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 << "Enter revaluation 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";return 0;}double * fill_array(double * begin, double * end){using namespace std;double temp;int i = 1;while (begin < end){cout << "Enter value #" << i << ": ";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(const double * begin, const double * end){using namespace std;int i = 1;while (begin < end){cout << "Property #" << i << ": $";cout << *begin << endl;begin++;i++;}}void revalue(double r, double * begin, double * end){while (begin < end){*begin *= r;begin++;}}//ex7.8a#include<iostream>const int Seasons = 4;const char * Snames[] = {"Spring", "Summer", "Fall", "Winter"}; void fill(double ar[], int n);void show(double ar[], int n);int main(){using namespace std;double expenses[Seasons];fill(expenses, Seasons);show(expenses, Seasons);return 0;}void fill(double ar[], int n){using namespace std;for (int i=0; i<n; i++){cout << "Enter " << Snames[i] << " expenses: ";cin >> ar[i];}}void show(double ar[], int n){using namespace std;cout << "\nEXPENSES\n";double total = 0.0;for (int i=0; i<n; i++){cout << Snames[i] << ": $" << ar[i] <<endl;total += ar[i];}cout << "Total Expenses: $" << total << endl;}//ex7.8b(传递结构值)#include<iostream>const int Seasons = 4;struct data{double arr[Seasons];};const char * Snames[] = {"Spring", "Summer", "Fall", "Winter"}; data fill();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<Seasons; i++)cout << "Enter " << Snames[i] << " expenses: ";cin >> expenses.arr[i];}return expenses;}void show(data expenses){using namespace std;cout << "\nEXPENSES\n";double total = 0.0;for (int i=0; i<Seasons; i++){cout << Snames[i] << ": $" << expenses.arr[i] <<endl;total += expenses.arr[i];}cout << "Total Expenses: $" << total << endl;}//ex7.8b(传递结构指针)#include<iostream>const int Seasons = 4;struct data{double arr[Seasons];};const char * Snames[] = {"Spring", "Summer", "Fall", "Winter"}; void fill(data * pd);void show(data * pd);int main(){using namespace std;data expenses;fill(&expenses);show(&expenses);return 0;}void fill(data * pd){using namespace std;for (int i=0; i<Seasons; i++)cout << "Enter " << Snames[i] << " expenses: ";cin >> pd->arr[i];}}void show(data * pd){using namespace std;cout << "\nEXPENSES\n";double total = 0.0;for (int i=0; i<Seasons; i++){cout << Snames[i] << ": $" << pd->arr[i] <<endl;total += pd->arr[i];}cout << "Total Expenses: $" << total << endl;}//ex7.9#include<iostream>using namespace std;const int SLEN = 30;struct student {char fullname[SLEN];char hobby[SLEN];int ooplevel;};int getinfo(student pa[], int n);void display1(student st);void display2(const student * ps);void display3(const student pa[], 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 < entered; i++)display1(ptr_stu[i]);display2(&ptr_stu[i]);}display3(ptr_stu, entered);delete [] ptr_stu;cout << "Done\n";return 0;}// getinfo() has two arguments: a pointer to the first element of // an array of student structures and an int representing the// number of elements of the array. The function solicits and// stores data about students. 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[], int n){int num_array_elem = n;char tmp[SLEN];for (int i = 0; i < n; ++i){cout << "Enter name: ";cin.getline(tmp, SLEN);bool blank_line = true;for (unsigned j = 0; j < strlen(tmp); ++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;return num_array_elem;}// display1() takes a student structure as an argument// and displays its contentsvoid display1(student st){cout << st.fullname << '\t'<< st.hobby << '\t'<< st.ooplevel << endl;}// display2() takes the address of student structure as an// argument and displays the structure’¡¥s contentsvoid display2(const student * ps){cout << ps->fullname << '\t'<< ps->hobby << '\t'<< ps->ooplevel << endl;}// display3() takes the address of the first element of an array// of student structures and the number of array elements as// arguments and displays the contents of the structuresvoid display3(const student pa[], int n){for (int i = 0; i < n; ++i)cout << pa[i].fullname << '\t' << pa[i].hobby << '\t' <<pa[i].ooplevel << endl;}//ex7.10#include<iostream>double calculate(double x, double y, double (*pf)(double, double)); double add(double x, double y);double sub(double x, double y);double mean(double x, double y);int main(){using namespace 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 (int i=0; i<3; i++){cout << op[i] << ": " << a << " and " << b << " = "<< calculate(a, b, pf[i]) << endl;}}}double calculate(double x, double y, double (*pf)(double, double)) {return (*pf)(x, y);}double add(double x, double y){return x + y;}double sub(double x, double y){return x - y;}double mean(double x, double y){return (x + y) / 2.0;}第8章函数探幽//ex8.1#include<iostream>void show(const char * ps, int n = 0);int main(){using namespace std;char * pstr = "Hello\n";show(pstr);int num;cout << "Enter a number: ";cin >> num;show(pstr, num);cout << "Done\n";return 0;}void show(const char * ps, int n){using namespace std;int lim = n;if (n == 0)lim = 1;for (int i=0; i<lim; i++)cout << ps;}//ex8.2#include<iostream>#include<string>using namespace std;struct CandyBar{string name;double weight;int hot;};void set(CandyBar & cb, char * ps, double w, int h); void show(const CandyBar & cb);int main(){using namespace std;CandyBar candy;char * p = "Millennium Munch";double x = 2.85;int y = 350;set(candy, p, x, y);show(candy);return 0;}void set(CandyBar & cb, char * ps, double w, int h){ = ps;cb.weight = w;cb.hot = h;}void show(const CandyBar & cb){cout << "Name: " << << endl<< "Weight: " << cb.weight << endl<< "Hot: " << cb.hot << endl;}//ex8.3#include<iostream>#include<string>#include<cctype>using namespace std;void str_to_upper(string & str);int main(){string str1;cout << "Enter a string (q to quit): ";while (getline(cin, str1) && str1!="q" && str1!="Q") {str_to_upper(str1);cout << str1 << endl;cout << "Next string (q to quit): ";}cout << "Bye.";return 0;}void str_to_upper(string & str){int limit = str.size();for (int i=0; i<limit; i++){if (isalpha(str[i]))str[i] = toupper(str[i]);}}// ex8.4#include<iostream>#include<cstring>// for strlen(), strcpy()using namespace std;struct stringy {char * str; // points to a stringint ct; // length of string (not counting '\0')};void show(const char *str, int cnt = 1);void show(const stringy & bny, int cnt = 1);void set(stringy & bny, const char * str);int main(void){stringy beany;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 of beany to point to the// new block, copies testing to new block,// and sets ct member of beany show(beany); // prints member string onceshow(beany, 2); // prints member string twicetesting[0] = 'D';testing[1] = 'u';show(testing); // prints testing string onceshow(testing, 3); // prints testing string thriceshow("Done!");return 0;}void show(const char *str, int cnt){while(cnt-- > 0)cout << str << endl;}}void show(const stringy & bny, int cnt){while(cnt-- > 0){cout << bny.str << endl;}}void set(stringy & bny, const char * str){bny.ct = strlen(str);bny.str = new char[bny.ct+1];strcpy(bny.str, str);}//ex8.5#include<iostream>const int Limit = 5;template <typename T>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);double maxd = max5(ard);cout << "maxi = " << maxi << endl;cout << "maxd = " << maxd << endl;return 0;}template <typename T>T max5(T ar[]){T max = ar[0];for (int i=1; i<Limit; i++)if (max < ar[i])max = ar[i];}return max;}//ex8.6#include<iostream>template <typename T>T maxn(T ar[], int n);template <> const char* maxn(const char* 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 << "The max integer of array is: " << maxn(ari, 6) << endl;cout << "The max double of array is: " << maxn(ard, 4) << endl;cout << "The max string of array is: " << maxn(ars, 5)<<endl; }template <typename T>T maxn(T ar[], int n){T maxar = ar[0];for (int i=1; i<n; i++){if (maxar < ar[i])maxar = ar[i];}return maxar;}template <> const char* maxn(const char* ar[],int n) {const char * maxs = ar[0];for (int i=1; i<n; i++){if (strlen(maxs) < strlen(ar[i]))maxs = ar[i];}return maxs;}//ex8.7#include<iostream>template <typename T>T SumArrray(T arr[], int n);template <typename T>T SumArrray(T * arr[], int n);struct debts{char name[50];double amount;};int main(){using namespace std;int things[6] = {13, 31, 103, 301, 310, 130};struct debts mr_E[3] ={{"Ima Wolfe", 2400.0},{"Ura Foxe", 1300.0},{"Iby Stout", 1800.0}};double * pd[3];for (int i=0; i<3; i++)pd[i] = &mr_E[i].amount;cout << "Sum: Mr.E's counts of things: "<< SumArrray(things, 6) << endl;cout << "Sum: Mr.E's debts: "<< SumArrray(pd, 3) << endl;return 0;。
C++ primer plus(第6版)中文版编程练习答案第10章

第10章1、//Customs.h#include <stdio.h>#include <tchar.h>#include <string>#include <iostream>using namespace std;class Customs{private:string name;string accnum;double balance;public:Customs(const string &client, const string &num, double bal = 0.0);~Customs();void show()const;bool deposit(double cash);bool withdraw(double cash);};//Customs.cpp#include "Customs.h"Customs::Customs(const string &client,const string &num, double bal) {accnum = num;name = client;balance = bal;}Customs::~Customs(){}bool Customs::deposit(double cash){if (cash <= 0){cout << "Deposit must greater than zero\n";return false;}else{cout << "Custom deposits $" << cash << " dolars.\n";balance += cash;return true;}}bool Customs::withdraw(double cash){if (cash <= 0 || (balance - cash) < 0){cout << "Withdraw money error, must less than balance and greater than zero\n";return false;}else{cout << "Custom withdraws $" << cash << " dolars\n";balance -= cash;return true;}}void Customs::show()const{cout << "Account custom's name is " << name << endl;cout << "Account number is " << accnum << endl;cout << "Custom's balance is " << balance << endl;}//main.cpp#include "Customs.h"int main(){double input, output;char ch;Customs custom=Customs("Jacky","Jc",3000.32);custom.show();cout << "Please enter A to deposit balance ,\n"<< "P to withdraw balance, or Q to quit.: ";while (cin >> ch && toupper(ch)!='Q'){while (cin.get() != '\n')continue;if (!isalpha(ch)){cout << '\a';continue;}switch (ch){case'A':case'a':cout << "Enter a account number to deposit: ";cin >> input;if (!custom.deposit(input))cout << "Add error\n";elsecout << "Add success\n";break;case'P':case'p':cout << "Enter a account number to withdraw: ";cin >> output;if (!custom.withdraw(output))cout << "Withdraw error\n";elsecout << "Withdraw success\n";break;}custom.show();cout << "Please enter A to deposit balance ,\n"<< "P to withdraw balance, or Q to quit: ";}cout << "Bye\n";cin.get();cin.get();return 0;}2、//person.h#ifndef PERSON_H_#define PERSON_H_#include <iostream>#include <stdio.h>#include <tchar.h>#include <string>using namespace std;class Person{private:static const int Person::LIMIT = 25;string lname;char fname[LIMIT];public:Person(){ lname = ""; fname[0] = '\0'; }Person(const string &ln, const char *fn = "Heyyou");void Show()const;void FormalShow()const;};#endif//person.cpp#include "person.h"Person::Person(const string &ln, const char *fn){lname = ln;strncpy_s(fname, fn, LIMIT);fname[LIMIT] = '\0';}void Person::Show()const{cout << fname << " " << lname;}void Person::FormalShow()const{cout << lname << ", " << fname; }//usePerson.cpp#include "person.h"int main(){Person one;Person two("Smythecraft");Person three("Dimwiddy", "Sam");one.Show();cout << endl;one.FormalShow();cout << endl;two.Show();cout << endl;two.FormalShow();cout << endl;three.Show();cout << endl;three.FormalShow();cout << endl;cin.get();return 0;}3、//golf.h#ifndef GOLF_H_#define GOLF_H_#include <iostream>#include <string>using namespace std;class golf{private:static const int Len = 40;char fullname[Len];int handicap;public:golf();golf(const char *name, int hc = 0);golf(golf &g);~golf();void handicapf(int hc);void show()const;};#endif//golf.cpp#include "golf.h"golf::golf(){}golf::golf(const char *name, int hc){strncpy_s(fullname, name, Len);fullname[Len] = '\0';handicap = hc;}golf::golf(golf &g){strncpy_s(this->fullname, g.fullname, Len);this->handicap = g.handicap;}golf::~golf(){}void golf::handicapf( int hc){handicap = hc;}void golf::show()const{cout << fullname << ", " << handicap << endl; }//main.cpp#include "golf.h"int main(){char name[40] = "\0";int no;cout << "Enter a name: ";cin.getline(name, 40);cout << "Enter a level: ";cin >> no;golf ann(name, no);ann.show();golf andy = golf(ann);andy.show();cin.get();cin.get();return 0;}4、//Sales.h#ifndef SALE_H_#define SALE_H_#include <iostream>#include <string>using namespace std;namespace SALES{class Sales{private:static const int QUARTERS = 4;double sales[QUARTERS];double average;double max;double min;public:Sales();Sales(const double *ar);Sales(Sales &s);~Sales();void showSales()const;};}#endif//Sales.cpp#include "Sales.h"using namespace SALES;Sales::Sales(){sales[QUARTERS] = '\0';average = 0.0;max = 0.0;min = 0.0;}Sales::Sales(const double *ar){double sum=0.0;for (int i = 0; i < QUARTERS; i++){sales[i] = ar[i];sum += sales[i];}average = sum / QUARTERS;max = sales[0];for (int i = 0; i < QUARTERS-1; i++){if (sales[i] < sales[i + 1])max = sales[i + 1];}min = sales[0];for (int i = 0; i < QUARTERS-1; i++){if (sales[i] > sales[i + 1])min = sales[i + 1];}}Sales::Sales(Sales &s){for (int i = 0; i < QUARTERS; i++)this->sales[i] = s.sales[i];this->average = s.average;this->max = s.max;this->min = s.min;}Sales::~Sales(){}void Sales::showSales()const{cout << "The sales number is \n";for (int i = 0; i < QUARTERS; i++){cout << sales[i] << " ";}cout << endl;cout << "The sales average is " << average << endl;cout << "The sales max is " << max << endl;cout << "The sales min is " << min << endl;}//main.cpp#include "Sales.h"using namespace SALES;int main(){double nums[4];cout << "Please enter four numbers: \n";for (int i = 0; i < 4; i++)cin >> nums[i];Sales sn(nums);sn.showSales();Sales sn1(sn);sn1.showSales();cin.get();cin.get();return 0;}5、//stack.h#ifndef STACK_H_#define STACK_H_#include <iostream>#include <string>#include <stdio.h>using namespace std;struct customer{char fullname[35];double payment;};typedef struct customer Item;class Stack{private:enum{ MAX = 10 };Item items[MAX];double sum;int top;public:Stack();~Stack();bool isempty()const;bool isfull()const;bool push(const Item &item);bool pop(Item &item);};#endif#include "stack.h"Stack::Stack(){top = 0;sum = 0.0;}Stack::~Stack(){}bool Stack::isempty()const{return top == 0;}bool Stack::isfull()const{return top == MAX;}bool Stack::push(const Item &item) {if (top < MAX){items[top++] = item;return true;}elsereturn false;}bool Stack::pop(Item &item){if (top > 0){item = items[--top];sum += item.payment;cout << sum << endl;return true;}return false;}//main.cpp#include "stack.h"int main(){Stack st;char ch;Item cs;cout << "Please enter A to add a purchase order,\n"<< "P to process a PO, or Q to quit.\n";while (cin >> ch && toupper(ch) != 'Q'){while (cin.get() != '\n')continue;if (!isalpha(ch)){cout << '\a';continue;}switch (ch){case 'A':case 'a':cout << "Enter a PO number to add: ";cin >> cs.fullname;cin >> cs.payment;if (st.isfull())cout << "stack already full\n";elsest.push(cs);break;case 'P':case 'p':if (st.isempty())cout << "stack already empty\n";else{st.pop(cs);cout << "PO #" << cs.fullname << "popped\n";}break;}cout << "Please enter A to add a purchase order,\n"<< "P to process a PO, or Q to quit.\n";}cout << "Bye\n";cin.get();cin.get();return 0;}6、//Move.h#ifndef MOVE_H_#define MOVE_H_#include <stdio.h>#include <iostream>#include <string>using namespace std;class Move{private:double x;double y;public:Move(double a = 0, double b = 0);void showmove()const;Move add(const Move &m)const;void reset(double a = 0, double b = 0);};#endif//Move.cpp#include "Move.h"Move::Move(double a, double b){x = a;y = b;}void Move::showmove()const{cout << "x = " << x << endl;cout << "y = " << y << endl;}Move Move::add(const Move &m)const {Move xy_add;xy_add.x = m.x + this->x;xy_add.y = m.y + this->y;return xy_add;}void Move::reset(double a, double b) {x = a;y = b;}//main.cpp#include "Move.h"int main(){Move xy0(1, 1);xy0.showmove();Move xy1;xy1 = Move(2, 2);xy1.showmove();xy1 = xy1.add(xy0);xy1.showmove();xy1.reset(2.5, 2.5);xy1.showmove();cin.get();return 0;}7、//plorg.h#ifndef PLORG_H_#define PLORG_H_#include <iostream>#include <string>#include <stdio.h>using namespace std;class plorg{private:static const int len = 19;char fullname[len];int CI;public:plorg(const char *name = "Plorga", int ci = 50);~plorg();void p_fix(int ci);void show()const;};#endif//plorg.cpp#include "plorg.h"plorg::plorg(const char *name, int ci){strncpy_s(fullname, name, len);CI = ci;}plorg::~plorg(){}void plorg::p_fix(int ci){CI = ci;}void plorg::show()const{cout << fullname << ", " << CI << endl; }//main.cpp#include "plorg.h"int main(){plorg pl;pl.show();pl.p_fix(32);pl.show();plorg pll("Plorgb", 27);pll.show();pll.p_fix(32);pll.show();cin.get();return 0;}8、//list.h#ifndef LIST_H_#define LIST_H_#include <iostream>#include <string>#include <stdio.h>using namespace std;typedef unsigned long Item;class List{private:enum { MAX = 10 };Item items[MAX];int head;int rear;public:List();bool isempty()const;bool isfull()const;bool add(const Item &item);bool cut(Item &item);void show()const;void visit(void(*pf)(Item &)); };#endif//list.cpp#include "list.h"List::List(){head = 0;rear = 0;}bool List::isempty()const{return rear == head;}bool List::isfull()const{return rear - head == MAX; }bool List::add(const Item &item) {if (rear < MAX){items[rear++] = item;return true;}elsereturn false;}bool List::cut(Item &item){if (rear < MAX){item = items[--rear];return true;}elsereturn false;}void List::show()const{for (int i = head; i < rear; i++)cout << items[i] << ", ";cout << endl;}void List::visit(void(*pf)(Item &)){for (int i = 0; i < rear; i++)(*pf)(items[i]);}//main.cpp#include "list.h"void show_s(Item & item);int main(){List st;char ch;unsigned long po;unsigned long *p = &po;cout << "Please enter A to add a purchase order,\n"<< "P to process a PO, or Q to quit.\n";while (cin >> ch && toupper(ch) != 'Q'){while (cin.get() != '\n')continue;if (!isalpha(ch)){cout << '\a';continue;}switch (ch){case 'A':case 'a':cout << "Enter a PO number to add: ";cin >> po;if (st.isfull())cout << "stack already full\n";elsest.add(po);break;case 'P':case 'p':if (st.isempty())cout << "stack already empty\n";else{st.cut(po);cout << "PO #" << po << "popped\n";}break;case 'V':case 'v':st.visit(show_s);}cout << "Please enter A to add a purchase order,\n"<< "P to process a PO, or Q to quit.\n";}st.show();cout << "Bye\n";cin.get();cin.get();return 0;}void show_s(Item &item){item += 100;cout << item << endl;}。
《 C++ Primer Plus (第 6 版)中文版》 勘误表

================================================================= *** 《C++ Primer Plus (第6 版)中文版》勘误表***作者:yangyang.gnu联系:yangyang.gnu@时间:2013-9-24================================================================= P268错误: free_throws * pt;修正: free_throws * pt = new free_throws;P291错误:在这两个模板函数中,recycle<blot *>(blot *) 被认为是更具体的修正:在这两个模板函数中,recycle<blot>(blot *) 被认为是更具体的P337错误: staticconst LIMIT = 25;修正: staticconst unsigned LIMIT = 25;P386错误:t4 = t1 + t2 + t3 先转换为t4 = t1.operator+(t2 + t3) 再转换为t4 =t1.operator+(t2.operator+(t3))修正:t4 = t1 + t2 + t3 先转换为t4 = t1.operator+(t2) + t3 再转换为t4 =t1.operator+(t2).operator+(t3)P387错误:.*:成员指针运算符修正:->:成员指针运算符P428错误:String boston("Boston");修正:StringBadboston("Boston");P431错误:然后程序使用重载运算符>>列出了这些对象修正:然后程序使用重载运算符<<列出了这些对象P439错误:最简单的办法是使用标准的trcmp()函数修正:最简单的办法是使用标准的strcmp()函数P440错误:means.operator[][0] = 'r';修正:means.operator[](0) = 'r';P439错误:因为内置的>运算符返回的是一个布尔值修正:因为内置的<运算符返回的是一个布尔值P478错误:Cow(const Cow c& );修正:Cow(const Cow & c);P478错误:提供一个Stringlow()成员函数修正:提供一个stringlow()成员函数错误:提供String()成员函数修正:提供stringup()成员函数P505错误: 这意味着,即使基类不需要显式析构函数提供服务,也不应该依赖于默认构造函数修正: 这意味着,即使基类不需要显式析构函数提供服务,也不应该依赖于默认构造析构P508错误:半长轴修正:长半轴P510错误:void Move(intnx, ny) = 0修正:virtual void Move(intnx, ny) = 0P525错误:Star::Star double() {...}Star::Star const char * () {...}修正:Star::operator double() {...}Star::operator const char * () {...}P529错误:派生类的有元函数修正:派生类的友元函数P532错误:Cd(char * s1, char * s2, int n, double x);修正:Cd(const char * s1, const char * s2, int n, double x);P532错误:派生出一个Classic 类,并添加一组char 成员修正:派生出一个Classic 类,并添加一个char 数组成员P532错误:copy.Report()修正:copy.Report();P535错误:所有元素度被初始化为指定值的数组修正:所有元素都被初始化为指定值的数组P544错误:例如,在类声明中提出可以使用average()函数。
C primer plus(第6版)中文版编程练习答案第15章

1、//tv.h#ifndef TV_H_#define TV_H_#include <iostream>using namespace std;class Tv{friend class Remote;public:enum { Off, On };enum { MinVal, MaxVal = 20 };enum { Antenna, Cable };enum { TV, DVD };enum { USUAL, EXCHANGE };Tv(int s = Off, int mc = 125) :state(s), volume(5),maxchannel(mc), channel(2), mode(Cable), input(TV){} ~Tv(){}void onoff(){ state = (state == On) ? Off : On; }bool ison()const{ return state == On; }bool volup();bool voldown();void chanup();void chandown();void set_mode(){ mode = (mode == Antenna) ? Cable : Antenna; } void set_input(){ input = (input == TV) ? DVD : TV; }void settings()const;void set_rmode(Remote &r);private:int state;int volume;int maxchannel;int channel;int mode;int input;};class Remote{private:friend class Tv;enum { USUAL, EXCHANGE };int mode;int fmode;public:Remote(int m = Tv::TV, int f = USUAL) :mode(m), fmode(f){}bool volup(Tv &t){ return t.volup(); }bool voldown(Tv &t){ return t.voldown(); }void onoff(Tv &t){ t.onoff(); }void chanup(Tv &t){ t.chanup(); }void chandown(Tv &t){ t.chandown(); }void set_chan(Tv &t, int c){ t.channel = c; }void set_mode(Tv &t){ t.set_mode(); }void set_input(Tv &t){ t.set_input(); }void mode_show()const{ cout << "Remote pretent mode is " << fmode << endl; } };inline void Tv::set_rmode(Remote &r){if (ison()){r.fmode = Remote::EXCHANGE;r.mode_show();}}#endif//tvfm.h#ifndef TVFM_H_#define TVFM_H_#include <iostream>using namespace std;class Tv;class Remote{public:enum State{ Off, On };enum { MinVal, MaxVal = 20 };enum { Antenna, Cable };enum { TV, DVD };private:int mode;public:Remote(int m = TV) :mode(m){}bool volup(Tv &t);bool voldown(Tv &t);void onoff(Tv &t);void chanup(Tv &t);void chandown(Tv &t);void set_chan(Tv &t, int c);void set_mode(Tv &t);void set_input(Tv &t);};class Tv{public:friend void Remote::set_chan(Tv &t, int c);enum State{ Off, On };enum { MinVal, MaxVal = 20 };enum { Antenna, Cable };enum { TV, DVD };Tv(int s = Off, int mc = 125) :state(s), volume(5),maxchannel(mc), channel(2), mode(Cable), input(TV){} ~Tv(){}void onoff(){ state = (state == On) ? Off : On; }bool ison()const{ return state == On; }bool volup();bool voldown();void chanup();void chandown();void set_mode(){ mode = (mode == Antenna) ? Cable : Antenna; } void set_input(){ input = (input == TV) ? DVD : TV; }void settings()const;private:int state;int volume;int maxchannel;int channel;int mode;int input;};inline bool Remote::volup(Tv &t){ return t.volup(); }inline bool Remote::voldown(Tv &t){ return t.voldown(); } inline void Remote::onoff(Tv &t){ t.onoff(); }inline void Remote::chanup(Tv &t){ t.chanup(); }inline void Remote::chandown(Tv &t){ t.chandown(); } inline void Remote::set_chan(Tv &t, int c){ t.channel = c; } inline void Remote::set_mode(Tv &t){ t.set_mode(); } inline void Remote::set_input(Tv &t){ t.set_input(); }#endif//tv.cpp#include "tv.h"//#include "tvfm.h"bool Tv::volup(){if (volume < MaxVal){volume++;return true;}elsereturn false;}bool Tv::voldown(){if (volume>MinVal){volume--;return true;}elsereturn false;}void Tv::chanup(){if (channel < maxchannel)channel++;elsechannel = 1;}void Tv::chandown(){if (channel>1)channel--;elsechannel = maxchannel;}void Tv::settings()const{cout << "TV is " << (state == Off ? "Off" : "On") << endl;if (state == On){cout << "Volume setting = " << volume << endl;cout << "Channel setting = " << channel << endl;cout << "Mode = " << (mode == Antenna ? "antenna" : "cable") << endl;cout << "Input = " << (input == TV ? "TV" : "DVD") << endl;}}//use_tv.cpp#include "tv.h"int main(){Tv s42;Remote grey;grey.mode_show();cout << "Initial settings for 42\" 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();Tv s58(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#ifndef EXC_MEAN_H_#define EXC_MEAN_H_#include <iostream>#include <cmath>#include <stdexcept>#include <string>using namespace std;class bad_hmean :public logic_error{private:string name;public:explicit bad_hmean(const string &n = "hmean", const string &s = "Error in hmean()\n");string mesg();virtual ~bad_hmean()throw(){}};bad_hmean::bad_hmean(const string &n, const string &s) :name(n), logic_error(s){}inline string bad_hmean::mesg(){return "hmean() arguments a=-b should be div a+b=0!\n";}class bad_gmean :public logic_error{private:string name;public:explicit bad_gmean(const string &n = "gmean", const string &s = "Error in gmean()\n");string mesg();virtual ~bad_gmean()throw(){}};bad_gmean::bad_gmean(const string &n, const string &s) :name(n), logic_error(s){inline string bad_gmean::mesg(){return "gmean() arguments should be >= 0\n";}#endif//error.cpp#include "exc_mean.h"double hmean(double a, double b);double gmean(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 << endl;cout << "Geomettric mean of " << x << " and " << y<< " is " << gmean(x, y) << endl;cout << "Enter next set of numbers <q to quit>: ";}catch (bad_hmean &bg){cout << bg.what();cout << "Error message: \n" << bg.mesg() << endl;cout << "Try again.\n";continue;}catch (bad_gmean &hg){cout << hg.what();cout << "Error message: \n" << hg.mesg() << endl;cout << "Sorry, you don't get to play and more.\n";break;}}cout << "Bye!\n";system("pause");return 0;}double hmean(double a, double b){if (a == -b)throw bad_hmean();return 2.0*a*b / (a + b);}double gmean(double a, double b){if (a < 0 || b < 0)throw bad_gmean();return sqrt(a*b);}3、//exc_mean.h#ifndef EXC_MEAN_H_#define EXC_MEAN_H_#include <iostream>#include <cmath>#include <stdexcept>#include <string>using namespace std;class bad_hmean :public logic_error{private:string name;public:double v1;double v2;explicit bad_hmean(double a = 0, double b = 0,const string &s = "Error in hmean()\n");void mesg();virtual ~bad_hmean()throw(){}};bad_hmean::bad_hmean(double a, double b, const string &s) :v1(a), v2(b), logic_error(s){name = "hmean";}inline void bad_hmean::mesg(){cout << name << "(" << v1 << ", " << v2<< ") arguments a=-b should be div a+b=0!\n";}class bad_gmean :public bad_hmean{private:string name;public:explicit bad_gmean(double a = 0, double b = 0,const string &s = "Error in gmean()\n");void mesg();virtual ~bad_gmean()throw(){}};bad_gmean::bad_gmean(double a, double b, const string &s):bad_hmean(a, b, s){name = "gmean";}inline void bad_gmean::mesg(){cout << name << "(" << bad_hmean::v1 << ", " << bad_hmean::v2 << ") arguments should be >= 0\n";}#endif//error.cpp#include "exc_mean.h"double hmean(double a, double b);double gmean(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 << endl;cout << "Geomettric mean of " << x << " and " << y<< " is " << gmean(x, y) << endl;cout << "Enter next set of numbers <q to quit>: ";}catch (bad_gmean &hg){cout << hg.what();cout << "Error message: \n";hg.mesg();cout << endl;cout << "Sorry, you don't get to play and more.\n";break;}catch (bad_hmean &bg){cout << bg.what();cout << "Error message: \n";bg.mesg();cout << endl;cout << "Try again.\n";continue;}}cout << "Bye!\n";system("pause");return 0;}double hmean(double a, double b){if (a == -b)throw bad_hmean();return 2.0*a*b / (a + b);}double gmean(double a, double b){if (a < 0 || b < 0)throw bad_gmean();return sqrt(a*b);}4、//sales.h#ifndef SALES_H_#define SALES_H_#include <stdexcept>#include <string>#include <cstring>#include <iostream>#include <cstdlib>using namespace std;class Sales{public:enum { MONTHS = 12 };class bad_index:public logic_error{private:int bi;public:explicit bad_index(int ix, const string &s = "Index error in Sales object\n");int bi_val()const { return bi; }virtual ~bad_index()throw(){}};explicit Sales(int yy = 0);Sales(int yy, const double *gr, int n);virtual ~Sales(){}int Year()const { return year; }virtual double operator[](int i)const;virtual double &operator[](int i);private:double gross[MONTHS];int year;};class LabeledSales :public Sales{public:class nbad_index :public Sales::bad_index{private:std::string lbl;public:nbad_index(const string &lb, int ix,const string &s = "Index error in LabeledSales object\n");const string &label_val()const { return lbl; }virtual ~nbad_index()throw(){}};explicit LabeledSales(const string &lb = "none", int yy = 0);LabeledSales(const string &lb, int yy, const double *gr, int n);virtual ~LabeledSales(){}const string &Label()const { return label; }virtual double operator[](int i)const;virtual double &operator[](int i);private:string label;};#endif//sales.cpp#include "sales.h"Sales::bad_index::bad_index(int ix,const string &s) :logic_error(s), bi(ix){}Sales::Sales(int yy){year = yy;for (int i = 0; i < MONTHS; ++i)gross[i] = 0;}Sales::Sales(int yy, const double *gr, int n){year = yy;int lim = (n < MONTHS) ? n : MONTHS;int i;for (i = 0; i < lim; ++i)gross[i] = gr[i];for (; i < MONTHS; ++i)gross[i] = 0;}double Sales::operator[](int i)const{if (i < 0 || i >= MONTHS)throw bad_index(i);return gross[i];}double &Sales::operator[](int i){if (i < 0 || i >= MONTHS)throw bad_index(i);return gross[i];}LabeledSales::nbad_index::nbad_index(const string &lb, int ix,const string &s) :Sales::bad_index(ix, s){lbl = lb;}LabeledSales::LabeledSales(const string &lb, int yy) : Sales(yy){label = lb;}LabeledSales::LabeledSales(const string &lb, int yy, const double *gr, int n) : Sales(yy, gr, n) {label = lb;}double LabeledSales::operator[](int i)const{if (i < 0 || i >= MONTHS)throw nbad_index(Label(), i);return Sales::operator[](i);}double &LabeledSales::operator[](int i){if (i < 0 || i >= MONTHS)throw nbad_index(Label(), i);return Sales::operator[](i);}//use_sales.cpp#include "sales.h"int main(){double vals1[12] ={1220, 1100, 1122, 2212, 1232, 2334,2884, 2393, 3302, 2922, 3002, 3544};double vals2[12] ={12, 11, 22, 21, 32, 24,28, 29, 33, 29, 32, 35};Sales sales1(2011, vals1, 12);LabeledSales sales2("Blogstar", 2012, vals2, 12);Sales::bad_index *s;LabeledSales::nbad_index *l;cout << "First try block:\n";try{int i;cout << "Year = " << sales1.Year() << endl;for (i = 0; i < 12; ++i){cout << sales1[i] << ' ';if (i % 6 == 5)cout << endl;}cout << "Year = " << sales2.Year() << endl;cout << "Label = " << bel() << endl;for (i = 0; i <= 12; ++i){cout << sales2[i] << ' ';if (i % 6 == 5)cout << endl;}cout << "End of try block 1.\n";}catch (logic_error &bad){cout << bad.what();if (l = dynamic_cast<LabeledSales::nbad_index *>(&bad)) {cout << "Comany: " << l->label_val() << endl;cout << "bad index: " << l->bi_val() << endl;}else if (s = dynamic_cast<Sales::bad_index *>(&bad))cout << "bad index: " << s->bi_val() << endl;}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.what();if (l = dynamic_cast<LabeledSales::nbad_index *>(&bad)){cout << "Comany: " << l->label_val() << endl;cout << "bad index: " << l->bi_val() << endl;}else if (s = dynamic_cast<Sales::bad_index *>(&bad))cout << "bad index: " << s->bi_val() << endl;}cout << "done\n";system("pause");return 0;}。
C++-primer-plus(第6版)中文版编程练习答案第13章

//cdplayer.h#ifndef CDPLAYER_H_#define CDPLAYER_H_#include <iostream>#include <string>using namespace std;class Cd{private:char performers[50];char label[20];int selections;double playtime;public:Cd(char *s1, char *s2, int n, double x);Cd(const Cd &d);Cd(){}virtual ~Cd();virtual void Report()const;Cd &operator=(const Cd &d);};class Classic :public Cd{private:char main_music[50];public:Classic(){}Classic(char *m, char *s1, char *s2, int n, double x);Classic(char *m, const Cd &c);~Classic();Classic &operator=(const Classic &c);virtual void Report()const;};#endif//cdplayer.cpp#include "cdplayer.h"Cd::Cd(char *s1, char *s2, int n, double x)strcpy_s(performers, strlen(s1) + 1, s1);strcpy_s(label, strlen(s2) + 1, s2);selections = n;playtime = x;}Cd::Cd(const Cd &d){strcpy_s(performers, 50, d.performers);strcpy_s(label, 20, bel);selections = d.selections;playtime = d.playtime;}Cd::~Cd(){}void Cd::Report()const{cout << "Performers: " << performers << endl;cout << "Label: " << label << endl;cout << "Selections: " << selections << endl;cout << "Playtime: " << playtime << endl;}Cd &Cd::operator=(const Cd &d){if (this == &d)return *this;strcpy_s(performers, 50, d.performers);strcpy_s(label, 20, bel);selections = d.selections;playtime = d.playtime;return *this;}Classic::Classic(char *m, char *s1, char *s2, int n, double x) :Cd(s1, s2, n, x) {strcpy_s(main_music, strlen(m) + 1, m);}Classic::Classic(char *m, const Cd &c) : Cd(c){strcpy_s(main_music, strlen(m) + 1, m);}Classic::~Classic(){}Classic &Classic::operator=(const Classic &c){if (this == &c)return *this;Cd::operator=(c);strcpy_s(main_music, 50, c.main_music);return *this;}void Classic::Report()const{Cd::Report();cout << "Main Music: " << main_music << endl;}//main.cpp#include "cdplayer.h"void Bravo(const Cd &disk);int main(){Cd c1("Beatles", "Capito", 14, 35.5);Classic c2 = Classic("Piano Sonata in B flat, Fantasia in C", "Alfred Brendel", "Philips", 2, 57.17);Cd *pcd = &c1;cout << "Using object directly:\n";c1.Report();c2.Report();cout << "Using type cd * pointer to objects:\n";pcd->Report();pcd = &c2;pcd->Report();cout << "Calling a function with a Cd reference argument:\n";Bravo(c1);Bravo(c2);cout << "Testing assignment: ";Classic copy;copy = c2;copy.Report();system("pause");return 0;}void Bravo(const Cd &disk){disk.Report();}2、//cdplayer.h#ifndef CDPLAYER_H_#define CDPLAYER_H_#include <iostream>#include <string>using namespace std;class Cd{private:char *performers;char *label;int selections;double playtime;public:Cd(char *s1, char *s2, int n, double x);Cd(const Cd &d);Cd(){}virtual ~Cd();virtual void Report()const;Cd &operator=(const Cd &d);};class Classic :public Cd{private:char *main_music;public:Classic(){}Classic(char *m, char *s1, char *s2, int n, double x);Classic(char *m, const Cd &c);~Classic();Classic &operator=(const Classic &c);virtual void Report()const;};#endif//cdplayer.cpp#include "cdplayer.h"Cd::Cd(char *s1, char *s2, int n, double x){performers = new char[strlen(s1) + 1];label = new char[strlen(s2) + 1];strcpy_s(performers, strlen(s1) + 1, s1);strcpy_s(label, strlen(s2) + 1, s2);selections = n;playtime = x;}Cd::Cd(const Cd &d){performers = new char[strlen(d.performers) + 1];label = new char[strlen(bel) + 1];strcpy_s(performers, strlen(d.performers) + 1, d.performers);strcpy_s(label, strlen(bel) + 1, bel);selections = d.selections;playtime = d.playtime;}Cd::~Cd(){delete[]performers;delete[]label;}void Cd::Report()const{cout << "Performers: " << performers << endl;cout << "Label: " << label << endl;cout << "Selections: " << selections << endl;cout << "Playtime: " << playtime << endl;}Cd &Cd::operator=(const Cd &d){if (this == &d)return *this;delete[]performers;delete[]label;performers = new char[strlen(d.performers) + 1];label = new char[strlen(bel) + 1];strcpy_s(performers, strlen(d.performers) + 1, d.performers);strcpy_s(label, strlen(bel) + 1, bel);selections = d.selections;playtime = d.playtime;return *this;}Classic::Classic(char *m, char *s1, char *s2, int n, double x) :Cd(s1, s2, n, x) {main_music = new char[strlen(m) + 1];strcpy_s(main_music, strlen(m) + 1, m);}Classic::Classic(char *m, const Cd &c) : Cd(c){main_music = new char[strlen(m) + 1];strcpy_s(main_music, strlen(m) + 1, m);}Classic::~Classic(){delete[]main_music;}Classic &Classic::operator=(const Classic &c){if (this == &c)return *this;Cd::operator=(c);delete[]main_music;main_music = new char[strlen(c.main_music) + 1];strcpy_s(main_music, strlen(c.main_music) + 1, c.main_music);return *this;}void Classic::Report()const{Cd::Report();cout << "Main Music: " << main_music << endl;}//main.cpp#include "cdplayer.h"void Bravo(const Cd &disk);int main(){Cd c1("Beatles", "Capito", 14, 35.5);Classic c2 = Classic("Piano Sonata in B flat, Fantasia in C", "Alfred Brendel", "Philips", 2, 57.17);Cd *pcd = &c1;cout << "Using object directly:\n";c1.Report();c2.Report();cout << "Using type cd * pointer to objects:\n";pcd->Report();pcd = &c2;pcd->Report();cout << "Calling a function with a Cd reference argument:\n";Bravo(c1);Bravo(c2);cout << "Testing assignment: ";Classic copy;copy = c2;copy.Report();system("pause");return 0;}void Bravo(const Cd &disk){disk.Report();}3、//dma.h#ifndef DMA_H_#define DMA_H_#include <iostream>#include <string>using namespace std;class ABC{private:char *fullname;int level;public:ABC(const char *f = "null", int l = 0);ABC(const ABC &ab);ABC &operator=(const ABC &ab);virtual ~ABC();virtual void View() = 0;};class baseDMA :public ABC{private:char *label;int rating;public:baseDMA(const char *l = "null", int r = 0, const char *f = "null", int lv = 0);baseDMA(const baseDMA &rs);~baseDMA();baseDMA &operator=(const baseDMA &rs);virtual void View();};class lacksDMA :public ABC{private:enum{ COL_LEN = 40 };char color[COL_LEN];public:lacksDMA(const char *c = "blank", const char *f = "null", int lv = 0);lacksDMA(const char *c, const baseDMA &rs);virtual void View();};class hasDMA :public ABC{private:char *style;public:hasDMA(const char *s = "none", const char *f = "null", int lv = 0);hasDMA(const char *s, const ABC &rs);hasDMA(const hasDMA &hs);~hasDMA();hasDMA &operator=(const hasDMA &hs);virtual void View();};#endif//dma.cpp#include "dma.h"ABC::ABC(const char *f, int lv){fullname = new char[strlen(f) + 1];strcpy_s(fullname, strlen(f) + 1, f);level = lv;}ABC::ABC(const ABC &ab){fullname = new char[strlen(ab.fullname) + 1];strcpy_s(fullname, strlen(ab.fullname) + 1, ab.fullname);level = ab.level;}ABC::~ABC(){delete[]fullname;}ABC &ABC::operator=(const ABC &ab){if (this == &ab)return *this;delete[]fullname;fullname = new char[strlen(ab.fullname) + 1];strcpy_s(fullname, strlen(ab.fullname) + 1, ab.fullname);level = ab.level;return *this;void ABC::View(){cout << "Fullname: " << fullname << endl;cout << "Level: " << level << endl;}baseDMA::baseDMA(const char *l, int r, const char *f, int lv) :ABC(f, lv) {label = new char[strlen(l) + 1];strcpy_s(label, strlen(l) + 1, l);rating = r;}baseDMA::baseDMA(const baseDMA &rs) :ABC(rs){label = new char[strlen(bel) + 1];strcpy_s(label, strlen(bel) + 1, bel);rating = rs.rating;}baseDMA::~baseDMA(){delete[]label;}baseDMA &baseDMA::operator=(const baseDMA &rs){if (this == &rs)return *this;ABC::operator=(rs);delete[]label;label = new char[strlen(bel) + 1];strcpy_s(label, strlen(bel) + 1, bel);rating = rs.rating;return *this;}void baseDMA::View(){ABC::View();cout << "Label: " << label << endl;cout << "Rating: " << rating << endl;}lacksDMA::lacksDMA(const char *c, const char *f, int lv) :ABC(f, lv){strncpy_s(color, c, 39);color[39] = '\0';}lacksDMA::lacksDMA(const char *c, const baseDMA &rs) : ABC(rs) {strncpy_s(color, c, COL_LEN - 1);color[COL_LEN - 1] = '\0';}void lacksDMA::View(){ABC::View();cout << "Color: " << color << endl;}hasDMA::hasDMA(const char *s, const char *f, int lv) :ABC(f, lv) {style = new char[strlen(s) + 1];strcpy_s(style, strlen(s) + 1, s);}hasDMA::hasDMA(const char *s, const ABC &ab) :ABC(ab){style = new char[strlen(s) + 1];strcpy_s(style, strlen(s) + 1, s);}hasDMA::hasDMA(const hasDMA &hs) : ABC(hs){style = new char[strlen(hs.style) + 1];strcpy_s(style, strlen(hs.style) + 1, hs.style);}hasDMA::~hasDMA(){delete[]style;}hasDMA &hasDMA::operator=(const hasDMA &hs){if (this == &hs)return *this;ABC::operator=(hs);delete[]style;style = new char[strlen(hs.style) + 1];strcpy_s(style, strlen(hs.style) + 1, hs.style);return *this;}void hasDMA::View(){ABC::View();cout << "Style: " << style << endl;}//usedma.cpp#include "dma.h"int main(){baseDMA shirt("Portabelly", 8, "Jack", 1);lacksDMA balloon("red", "Blimpo", 4);hasDMA map("Mercator", "buffalo Keys", 5);cout << "Displaying baseDMA object:\n";shirt.View();cout << "Displaying lacksDMA object:\n";balloon.View();cout << "Displaying hasDMA object:\n";map.View();lacksDMA balloon2(balloon);cout << "Result of lacksDMA copy:\n";balloon2.View();hasDMA map2;map2 = map;cout << "Result of hasDMA assignment:\n";map2.View();system("pause");return 0;}4、//port.h#ifndef PORT_H_#define PORT_H_#include <iostream>#include <cstring>using namespace std;class Port{private:char *brand;char style[20];int bottles;public:Port(const char *br = "none", const char *st = "none", int b = 0);Port(const Port &p);virtual ~Port(){ delete[]brand; }Port &operator=(const Port &p);Port &operator+=(int b);Port &operator-=(int b);int BottleCount()const{ return bottles; }virtual void Show()const;friend ostream &operator<<(ostream &os, const Port &p);};class VintagePort :public Port{private:char *nickname;int year;public:VintagePort();VintagePort(const char *br, const char *st, int b, const char *nn, int y);VintagePort(const VintagePort &vp);~VintagePort(){ delete[]nickname; }VintagePort &operator=(const VintagePort &vp);void Show()const;friend ostream &operator<<(ostream &os, const VintagePort &vp);};#endif//port.cpp#include "port.h"Port::Port(const char *br, const char *st, int b){brand = new char[strlen(br) + 1];strcpy_s(brand, strlen(br) + 1, br);strcpy_s(style, strlen(st) + 1, st);bottles = b;}Port::Port(const Port &p){brand = new char[strlen(p.brand) + 1];strcpy_s(brand, strlen(p.brand) + 1, p.brand);strcpy_s(style, strlen(p.style) + 1, p.style);bottles = p.bottles;}Port &Port::operator=(const Port &p){if (this == &p)return *this;delete[]brand;brand = new char[strlen(p.brand) + 1];strcpy_s(brand, strlen(p.brand) + 1, p.brand);strcpy_s(style, strlen(p.style) + 1, p.style);bottles = p.bottles;return *this;}Port &Port::operator+=(int b){bottles += b;return *this;}Port &Port::operator-=(int b){bottles -= b;return *this;}void Port::Show()const{cout << "Brand: " << brand << endl;cout << "Kind: " << style << endl;cout << "Bottles: " << bottles << endl;}ostream &operator<<(ostream &os, const Port &p){os << p.brand << ", " << p.style << ", " << p.bottles;return os;}VintagePort::VintagePort(){nickname = new char[1];nickname[0] = '\0';year = 0;}VintagePort::VintagePort(const char *br, const char *st, int b, const char *nn, int y) :Port(br, st, b){nickname = new char[strlen(nn) + 1];strcpy_s(nickname, strlen(nn) + 1, nn);year = y;}VintagePort::VintagePort(const VintagePort &vp) :Port(vp){nickname = new char[strlen(vp.nickname) + 1];strcpy_s(nickname, strlen(vp.nickname) + 1, vp.nickname);year = vp.year;}VintagePort &VintagePort::operator=(const VintagePort &vp){if (this == &vp)return *this;delete[]nickname;Port::operator=(vp);nickname = new char[strlen(vp.nickname) + 1];strcpy_s(nickname, strlen(vp.nickname) + 1, vp.nickname);year = vp.year;return *this;}void VintagePort::Show()const{Port::Show();cout << "Nickname: " << nickname << endl;cout << "Year: " << year << endl;}ostream &operator<<(ostream &os, const VintagePort &vp){os << (const Port &)vp;os << ", " << vp.nickname << ", " << vp.year;return os;}//main.cpp#include "port.h"int main(){Port wine1("Gallo", "tawny", 20);VintagePort wine2("Romane Conti", "vintage", 10, "The Noble", 1876);VintagePort wine3("Merlot", "ruby", 30, "Old Velvet", 1888);cout << "Displaying Port object:\n";wine1.Show();cout << wine1 << endl;cout << "Displaying VintagePort object:\n";wine2.Show();cout << wine2 << endl;cout << "Displaying VintagePort object:\n";wine3.Show();cout << wine3 << endl;cout << "Gallo add ten bottles:\n";wine1 += 10;cout << wine1 << endl;cout << "Romane Conti add ten bottles:\n";wine2 += 10;cout << wine2 << endl;cout << "Merlot minus ten bottles:\n";wine3 -= 10;cout << wine3 << endl;Port wine4(wine2);cout << "Result of Port copy:\n";cout << wine4 << endl;VintagePort wine5;wine5 = wine3;cout << "Result of VintagePort assignment:\n";cout << wine5 << endl;system("pause");return 0;}(注:可编辑下载,若有不当之处,请指正,谢谢!)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
注意:下面的勘误中,红色字体为修改后的文字,提请各位读者注意。
第 6 页,” 1.6 语言标准”中的第 3 行,将 1987 年修改为 1978 年。
第 22 页,” 2. main ()函数”中的第 1 行, int main (void ) 后面的分号( ; )删除。
第 24 页,“5. 声明”的第 10 行,也就 是一个变量、函数或其他实体的名称。
第 27 页,图 2.3 中,下划线应该只包含括号中的内容;第 2 段的第 4 行,而不是存储 在 源代码 中的指令。
第 30页,“2.5.4 打印多个值”的第 4行,双引 号后面的第 1 个变量。
第 34页,“2.7.3 程序状态”第 2段的第 4 行,要尽量忠实 于代码来模拟。
第 35页,“2.10 本章小结”第 2段的第 1句,声明 语句为变量指定变量名, 并标识该变量中存 储的数据类型;本页倒数第 2 行,即 检查程序每执行一步后所有变量的值。
第37页,“2.12编程练习”中第1题,把你的名和姓打印在一行……把你的 名和姓分别打印在 两行……把你的 名和姓打印在一行……把示例的内容换成你的 名字。
第 40 页,第 1 行,用于把英 磅常衡盎司转换为… … 第44页,“3.4 C 语言基本数据类型”的第 1句,本节将 详细介绍C 语言的基本属性类型……第 46页,“5. 八进制和十六进制”的第 4句,十六进制数 3的二进制数 是 0011,十六进制数 5 的二进制数 是 0101;“6. 显示八进制和十六进制”的第 1 句,既可以使用 也可以 显示不同进制 的数;将“回忆一下……程序在执行完毕后不会立即关闭执行窗口”放到一个括号里。
第 47页,“2. 使用多种整数类型的原因”第 3句,过去的一台运行 Windows 3.x 的机器上。
第 53 页,图 3.5 下面的第 4 行“上面最后一个例子( printf ( “ ” a \\ is abackslash. ” \n ” ); )” 第 56页,正文的第 2行和第 4行应该分别为 printf ( “me32 = %““d”“\n ”, me32); printf ( “me32 = %d\n ” , me32);第 61 页,“无符号类型”的最后 1 句,相当于 unsigned int (即两者之间添加一个空格 )。
第 62 页,程序清单 3.8 中的第 1 行,将 //* typesize.c -- 打印类型大小 */ 中的第一个斜杠删 除。
第 63页,“3.6 参数和陷阱”第 2行, printf ( “ Hello,pal. ” )(即 Hello, 和 pal. 之间没有空 格)。
第 64 页,程序清单 3.10 中的第 1 行,使用 转义序列。
第 75 页,倒数第 8行, 何时使用圆括号 取决于运算对象是类型还是特定量。
第82页,第11行, . 格式字符串包含了两个待打印项 number 和pies 对应的 ..... 第83页,表4.4中的“ L”修饰符的含义介绍中,应该是示例: ” %L ”、“%10.4Le”第 84 页,表 4.5 中的第 1 行,即,从字段的左侧开始打印该 项(即,应该只保留一个 项);在 “ 0”标记的含义中,添加一行: 示例:"%010d"和"%08.3f"。
第86页,第1段的第2行,……字段宽度是容纳 待打印数字所需的……; 倒数第4段中,根据%x 打印出1f,根据%打印出1F 第87页,“4.4.4转换说明的意义”第 2段,……读者认为原始值 被替换成转换后的值。
第89页,“参数传递”第2行,把变量n1、n2、n3和n4的值传递给程序(即,保留一个顿号)。
第 93页,第 5行的 2121.45 的字体应该与第 4行的 42 的字体保持一致;表 4.6 上面的最后一 行,对于double 类型要使用 1 修饰符。
第 94 页,表中的第 3 行,把对应的数值存储为 unsigned short int 类型;把“ j ”转换说明的 示例放到“ z ”转换说明中;在“ j ”转换说明的含义中添加:示例:” %jd”、” %ju”。
第95页,“3.scanf () 的返回值”上面一段的倒数第 3行,如果在格式字符串中把空格放到 %c的前面 。
第98页,倒数第2段,strlen () 函数(声明在string.h 头文件中)可用于 ... 。
第 100 页,” 4.8 编程练习”中的第 2 题,将该题中的“名和姓”统一替换为“名字” ;并执行 以下 操作;第 3题,将 a 、 b 项中的“输入”替换为” The input is ”,将“或”替换为“ or”, 将末尾1.2.3.4.5.6.7.8.9.10.11. 12.13. 14.15. 16. 17. 18. 19. 20. 21. 22. 23. 24.25.26. 27. 28. 29. 30.的分号换成点( . )。
31.第 105 页,第 8 行,由于 19.0 不小于 18.5 ,所以该条件为假。
32.第 107 页,程序清单 5.3 下面的第 1 行,首先把 68 赋给 jane 。
33.第 111 页,图 5.3 下面的第 1 行,如何让加法运算在除法运算之前执行。
34.第 117 页,程序清单 5.11 结束后的第 4 行,而 pre_b 是 b 递增之后的值。
35.第 118 页,倒数第 2 行,而不是( x * y) ++。
36.第 129 页,程序清单 5.15 的第 4 行, //1 小时的秒数。
37.第 134页,“ 5.11 编程练习”中的第 4题, 168.7 cm = 5 feet, 6.4 inches38.第143页,正文第 2段,假设你想跳过输入到达第1个既不是空白字符也不是数字的位置39.第 148页,倒数第 3行,高优先级组: < <= > >=(即在 <和<=之间有空格,在 >和>=之间有空格)40.第 153 页,第 7 行的“ 15”与下一行的“ 28”左对齐。
41.第 161 页,“小结: do while 语句”中的倒数第 4 行,在expression 为假或 0 之前(注意要用斜体)42.第 167 页,程序清单 6.20 的名字应该是 power.c 程序(即删除一个 w)43.第 170页,“ 6.15 复习题”第 1题,后 5行中使用的是前一行生成的 quack 的值。
44.第 175 页,第 10 题的第 3 句话,用户输入的上限整数等于或小于下限整数为止。
45.第 178 页,中间部分的文字中, if 语句指示几岁安及,如果刚读取的值( t emperature )小于 0。
46.第185页,正文第2段,特别要注意的是,如果kwh大于360;中间代码之后的第1句,也就是说,该程序由一个 if else 语句组成(即, if 和 else 之间要有一个空格)47.第 187页,正文倒数第 2 段,倒数第 3行, 2 和72、3和48、4和36。
48.第 196页,代码中第 2行,达到单词的末尾。
49.第 212页,复习题的第 4题,下列各表达式的值是多少。
50.第215页,第2题的第2句话,每行打印8个“字符-ASCII码”组合;第7题的a项中,10. 00 美元 /小时。
51.第222页,“ 8.4重定向和文件”的第2句话,输入设备(我们假设)是键盘;“ 8.4.1UNIX、Linux和DOS重定向”的上面一段,重定向的一个主要问题是它与操作系统有关;苹果OS X运行在UNIX上,故可用Terminal应用程序来使用 UNIX命令行模式。
52.第 224 页,“3. 组合重定向”中的第 2、 4、 6 行中,应该是分别是 ./ echo_eof < mywords >savewords、./ echo_eof > savewords < mywords 、./ echo_eof < mywords > mywords ….; 第 13 行应该是 ./ echo_eof<words ;第 16、 17、 18、 19 行的多买中,均在最前面添加 ./53.第 225页,“小结:如何重定向输入和输出”中的 4行代码中,均在前面添加 ./54.第227页,正文中间,该程序还是会把f视为n (即这里将“被”删除)。
55.第 245 页,倒数第 6 行中,程序中 starbar ()和 main()的定义形式相同。
56.第247页,“9.1.3 函数参数”中第 2段最后 1行,因此,可以调用 show_n_char(‘ ‘, 12)(即两个单引号之间是一个空格)57.第260页,第19行,因此,n乘以n-1的阶乘就得到n的阶乘。
58.第 268 页,程序清单 9.13 上面的一行,在 interchange ()中使用 u 和 v。
59.第 272 页,倒数第 7 行,让 interchange()访问这两个变量。
60.第273页,“变量:名称、地址和值”中第 3段第 2行,使用变量名即可获得变量的数值。
61.第276页,“9.11 编程练习” 第6题,把最小值放入第一个变量;第10题,编写一个 to_base_n()函数接受两个参数,且第2个参数在2~10范围内,然后以第 2个参数……。
62.第 285 页,第 11 行, float rain[5][12]; (即 float 和 rain 之间有一个空格);图 10.1 上面的一句话,则使用 rain[ 1][ 2];顺便将括号以及括号中的文字删除。
63.第289页,图10.3 上面一段的第 2行,这意味着加1后的地址是下一个元素的地址(即,将“把” 删除)64.第 290页,第 1 行, dates + 2 == &date s[2]65.第295页,第3行,至于C语言,ar[i]和*(ar+ i )这两个表达式都是等价的。
66.第305页,正文倒数第3段,第2行,指向一个内含 3个int类型元素的数组;pa指向一个内含 3 个 int 类型元素的数组。
67.第 307 页,程序清单 10.17 上面的一段,这样的变量稍后能以同样的方式用作 junk 。
68.第 316 页,第 6 题,在 a、 b、c 这 3 项的后面添加“ 的地址”69.第 322 页,上面第 2 行代码,I am a symbolic string constant. (即,将 an 换成 a,将old-fashioned 删除)70.第 326 页,“ 5. 字符串数组”上面的一句,如果打算修改字符串, 就不要用指针指向字符串字面量;“5. 字符串数组” 下面的一句, 创建一个字符数组通常很方便(即将“如果” 删除, 将“会” 换成通常)。