《C++ Primer》5th 課後練習 第七章 類 1~10

練習7.1 使用2.6.1節定義的Sales_data類爲1.6節的交易處理程序編寫一個新版本。

#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct Sales_data {
	string bookNo;
	unsigned units_sold = 0;
	double revenue = 0.0;
};

int main(int argc, char **argv)
{
	Sales_data total;
	if (cin >> total.bookNo >> total.units_sold >> total.revenue) {
		Sales_data trans;
		while (cin >> trans.bookNo >> trans.units_sold >> trans.revenue) {
			if (total.bookNo == trans.bookNo) {
				total.units_sold += trans.units_sold;
				total.revenue += trans.revenue;
			}
			else {
				cout << total.bookNo << " " << total.units_sold << " " << total.revenue << endl;
				total.bookNo = trans.bookNo;
				total.units_sold = trans.units_sold;
				total.revenue = trans.revenue;
			}
		}
		cout << total.bookNo << " " << total.units_sold << " " << total.revenue << endl;
	}
	else {
		cerr << "No Data ?!" << endl;
	}
	return 0;
}

練習7.2 曾在2.6.2節的練習中編寫了一個Sales_data類,請向這個類添加combine函數和isbn成員。

struct Sales_data {
	string combine()const {return this->bookNo};
	Sales_data &combine(Sales_data &other);
	string bookNo;
	unsigned units_sold = 0;
	double revenue = 0.0;
};
Sales_data &Sales_data::combine(Sales_data &other) {
	this->units_sold += other.units_sold;
	this->revenue += other.revenue;
	return *this;
}

練習7.3 修改7.1.1節的交易處理程序,令其使用這些成員。

#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct Sales_data {
	string isbn()const {return this->bookNo};
	Sales_data &combine(Sales_data &other);
	string bookNo;
	unsigned units_sold = 0;
	double revenue = 0.0;
};
Sales_data &Sales_data::combine(Sales_data &other) {
	this->units_sold += other.units_sold;
	this->revenue += other.revenue;
	return *this;
}
int main(int argc, char **argv)
{
	Sales_data total;
	if (cin >> total.bookNo >> total.units_sold >> total.revenue) {
		Sales_data trans;
		while (cin >> trans.bookNo >> trans.units_sold >> trans.revenue) {
			if (total.bookNo == trans.bookNo) {
				total.combine(trans);
			}
			else {
				cout << total.isbn() << " " << total.units_sold << " " << total.revenue << endl;
				total.bookNo = trans.bookNo;
				total.units_sold = trans.units_sold;
				total.revenue = trans.revenue;
			}
		}
		cout << total.isbn() << " " << total.units_sold << " " << total.revenue << endl;
	}
	else {
		cerr << "No Data ?!" << endl;
	}
	return 0;
}

練習7.4 編寫一個名爲Person的類,使其表示人員的姓名和地址。使用string對象存放這些元素,接下來的練習將不斷充實這個類的其他特徵。

class Person {
	string name;
	string addr;
};

練習7.5 在你的Person類中提供一些操作使其能夠返回姓名和地址。這些函數是否應該是const的呢?解釋原因。

class Person {
	string name;
	string addr;
	string getName()const { return this->name; }
	string getAddr()const { return this->addr; }
};
//另一種寫法
class Person {
	string name;
	string addr;
	auto getName()const -> const string & { return this->name; }
	auto getAddr()const -> const string & { return this->addr; }
};

應該是const的。因爲常量的Person對象也需要使用這些函數操作。

練習7.6 對於函數add、read和print,定義你自己的版本。

//Sale_data.h
#pragma once
#include <iostream>
#include <string>
using namespace std;
struct Sales_data {
	string isbn()const { return this->bookNo };
	Sales_data &combine(const Sales_data &other);
	string bookNo;
	unsigned units_sold = 0;
	double revenue = 0.0;
};
istream &read(istream &is, Sales_data &item);
ostream &print(ostream &os, const Sales_data &item);
Sales_data add(const Sales_data &a, const Sales_data &b);
//Sale_data.cpp
#include"Sale_data.h"

Sales_data &Sales_data::combine(const Sales_data &other) {
	this->units_sold += other.units_sold;
	this->revenue += other.revenue;
	return *this;
}
istream &read(istream &is, Sales_data &item) {
	double price;
	is >> item.bookNo >> item.units_sold >> price;
	item.revenue = item.units_sold * price;
	return is;
}
ostream &print(ostream &os, const Sales_data &item) {
	os << item.bookNo << " " << item.units_sold << " " << item.revenue;
	return os;
}
Sales_data add(const Sales_data &a, const Sales_data &b) {
	Sales_data sum = a;
	sum.combine(b);
	return sum;
}

練習7.7 使用這些新函數重寫7.1.2節練習中的程序。

#include"Sale_data.h"

int main(int argc, char **argv)
{
	Sales_data total;
	if (read(cin, total)) {
		Sales_data trans;
		while (read(cin, trans)) {
			if (total.bookNo == trans.bookNo) {
				total.combine(trans);
			}
			else {
				print(cout, total) << endl;
				total = trans;
			}
		}
		print(cout, total) << endl;
	}
	else {
		cerr << "No Data ?!" << endl;
	}
	return 0;
}

練習7.8 爲什麼read函數將其Sales_data參數定義成普通的引用,而print函數將其參數定義成常量引用?

因爲read()函數改變了傳入的Sales_data對象的內容,而print()函數不會。

練習7.9 對於7.1.2節練習中代碼,添加讀取和打印Person對象的操作。

#include <iostream>
#include <string>
using namespace std;
class Person {
public:
	string name;
	string addr;
	auto getName()const -> const string & { return this->name; }
	auto getAddr()const -> const string & { return this->addr; }
};
auto read(istream &is, Person &one)->istream & {
	is >> one.name >> one.addr;
	return is;
}
auto print(ostream &os, const Person &one)->ostream & {
	os << one.name << " " << one.addr;
	return os;
}
int main(int argc, char **argv)
{
	
	return 0;
}

練習7.10 在下面這條if語句中,條件部分的作用是什麼?

read 函數的返回值是 istream 對象,if語句中條件部分的作用是從輸入流中讀取數據給兩個data對象。

發佈了290 篇原創文章 · 獲贊 23 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章