首页 > 代码库 > c++ primer plus(第6版)中文版 第十章编程练习答案

c++ primer plus(第6版)中文版 第十章编程练习答案

第十章编程练习答案

10.1为复习题5类提供定义,并演示

//10.1为复习题5类提供定义,并演示
#include <iostream>
using namespace std;

class BankAccount
{
	string		m_name;
	string		m_num;
	unsigned	m_balance;	
public:
	BankAccount (string name, string num, unsigned balance)
{
	m_name = name;
	m_num = num;
	m_balance = balance;
}
	void show () const
{
	cout << m_name << endl;
	cout << m_num << endl;
	cout << m_balance << endl;
}
void incDeposit (unsigned amount)
{
	m_balance += amount;
}

void decDeposit (unsigned amount)
{
	if (m_balance <= amount)
		m_balance = 0;
	else
		m_balance -= amount;
}
};

int main () 
{     
	BankAccount bank("Tom", "1", 1024);
	bank.show();
	bank.incDeposit(128);
	bank.show();
	bank.decDeposit(2048);
	bank.show();
} 

10.2根据以下类定义和例子,完成类方法定义

//10.2根据以下类定义和例子,完成类方法定义
#include <iostream>
#include <cstring>
using namespace std;

class Person {
	static const unsigned LIMIT = 25;
	string lname;
	char fname[LIMIT]; 
public:
	Person() {lname = ""; fname[0] = ‘\0‘; } // #1
	Person(const string & ln, const char * fn = "Heyyou");
	// the following methods display lname and fname
	void Show() const; // firstname lastname format
	void FormalShow() const; // lastname, firstname format
};
Person::Person(const string & ln, const char * fn)
{
	lname = ln;
	strcpy(fname, fn);
}
void Person::Show() const
{
	cout << fname << ‘ ‘ << lname << endl;
}
void Person::FormalShow() const
{
	cout << lname << ", " << fname << endl;
}

int main () 
{     
	Person one;
	Person two("Smythecraft");
	Person three("Dimwiddy", "Sam");
	three.Show();
	three.FormalShow();
} 

10.3编写golf类,包含姓名和成绩两个数据,并实现调用

//10.3编写golf类,包含姓名和成绩两个数据,并实现调用
#include <iostream>
#include <string>
using namespace std;
const int Len = 40;

class golf
{
	string fullname;
	int handicap;
public:
	golf ():fullname("no"),handicap(0) {}
	golf (const char * name, int hc)
	{
		fullname = name;
		handicap = hc;
	}
	void showgolf()
	{
		cout << fullname << ‘\t‘ << handicap << endl;
	}
};

int main () 
{
	golf golfer;
	golf	golfers("tom",100);
	golfer.showgolf();
	golfers.showgolf();
} 

10.4根据编程练习9.4,用Sales类完成

//10.4根据编程练习9.4,用Sales类完成
#include <iostream>
using namespace std;

class Sales
{
	static const int QUARTERS = 4;
	double sales[QUARTERS];
	double size;
	double average;
	double max;
	double min;
public:	
	Sales (double arr[], int n)
	{
		unsigned	times = n < QUARTERS ? (unsigned)n : QUARTERS;
		for (unsigned i = 0; i < times; ++i) 
			sales[i] = arr[i];
		for (unsigned i = times; i < QUARTERS; ++i)
			sales[i] = 0;
		size = times;
		average = calcAverage();
		max = calcMax();
		min = calcMin();
	}
	void setSales()
	{
		cout << "输入" << QUARTERS << "个销售记录:";
		size = QUARTERS;
		for (unsigned i = 0; i < QUARTERS; ++i) {
			cin >> sales[i];
			if (!cin) {
				size = i;
				break;
			}
		}
		for (unsigned i = (unsigned)size; i < QUARTERS; ++i)
			sales[i] = 0;
		cin.clear();
		average = calcAverage();
		max = calcMax();
		min = calcMin();
	}
	double calcAverage () const
	{
		double	sum = 0;
		for (unsigned i = 0; i < size; ++i)
			sum += sales[i];
		return (sum / size);
	}
    double calcMax () const
	{
		unsigned	idxMax = 0;
		for (unsigned i = 0; i < size; ++i)
			if (sales[i] > sales[idxMax])
				idxMax = i;
		return (sales[idxMax]);
	}
	double calcMin () const
	{
		unsigned	idxMin = 0;
		for (unsigned i = 0; i < size; ++i)
			if (sales[i] < sales[idxMin])
				idxMin = i;
		return (sales[idxMin]);
	}

	void showSales () const
	{
		cout << "sales: ";
		for (const auto& e : sales)
			cout << e << ‘ ‘;
		cout << endl;
		cout << "average: " << average << endl;
		cout << "max: " << max << endl;
		cout << "min: " << min << endl;
	}
};

int main () 
{     
	double	salesLst[] = {12.2, 11.16, 10.61, 16.24, 11.53};
	Sales salesBook(salesLst, sizeof(salesLst)/sizeof(salesLst[0]));
	salesBook.showSales();
} 

10.5编写一个程序,从栈中添加和删除customer结构(包括全名和数量两个成员),每删除一个结构,把数量计入总数。

//10.5编写一个程序,从栈中添加和删除customer结构(包括全名和数量两个成员),每删除一个结构,把数量计入总数。
#include <iostream>
using namespace std;

struct customer{  
    char fullname[35];  
    double payment;  
};  
typedef customer Item;  
class Stack{   
    Item items[10];  
    int top;  
public:  
	Stack() :top(0){  }  
	bool isEmpty() const	{  return top==0;	}  
	bool isFull() const  	{  return top==10; }  
	bool push(const Item &item)  
	{  
		if(isFull())  
		{  
			cout<<"Error !Stack is full!"<<endl;  
			return false;  
		}  
		else  
			items[top++]=item;  
		return true;  
	}  
	bool pop(Item &item)  
	{  
		if(top<=0)  
		{  
			cout<<"Error !Stack is empty"<<endl;  
			return false;  
		}  
		else  
		{  
			item=items[--top];  
			return true;  
		}  
	} 
}; 
int main ()  
	{  
		static int total=0;  
		Stack sc;  
		customer c[5]={  {"I",10},  {"II",20},  {"III",40},  {"IV",50},  {"V",60}  };
		customer s[10];//用于存储pop出来的customer  
		for(int i=0;i<5;i++)  
		{  
			sc.push(c[i]);  
			cout<<"now push "<<c[i].fullname<<"  payment is "<<c[i].payment<<endl;  
		}  
		for(int i=0;i<5;i++)  
		{  
			sc.pop(s[i]);  
			total+=s[i].payment;  
			cout<<"total="<<total<<endl;  
		} 
} 

10.6根据以下类编写测试

//10.6根据以下类编写测试
#include <iostream>
#include <cstring>
using namespace std;

class Move
{
	double	m_x;
	double	m_y;
public:
	Move (double a, double b)
	{
		m_x = a;
		m_y = b;
	}
	void showMove () const
	{
		cout << ‘(‘ << m_x << ", " << m_y << ‘)‘;
	}	
	Move add (const Move& m) const
	{
		return (Move(m.m_x + m_x, m.m_y + m_y));
	}
	void reset (double a, double b)
	{
		m_x = a;
		m_y = b;
	}
};

int main () 
{     
	Move one(12, 4);
	one.showMove();
	cout << endl;
	Move two(1, 1);
	one.add(two).showMove();
	cout << endl;
	one.reset(3,4);
	one.showMove();
	cout << endl;
} 

10.7编写类Plorg和函数实现plorg这些特征:
数据:名称不超过19字符;有满意指数整数CI
操作:新的plorg有名称,CI值50;CI可修改;plorg可报告名称和CI;默认名称为“Plorga”

//10.7编写类Plorg和函数实现plorg这些特征:
//数据:名称不超过19字符;有满意指数整数CI
//操作:新的plorg有名称,CI值50;CI可修改;plorg可报告名称和CI;默认名称为“Plorga”
#include <iostream>
#include <cstring>
using namespace std;

class Plorg
{
	char	_name[20];
	unsigned	CI;
public:
	Plorg () : CI(50) 
	{
		strcpy(_name,"Plorga");
	}
	Plorg (const char* name)
	{
		CI = 50;
		strcpy(_name, name);
		_name[19] = ‘\0‘;
	}	
	void setCI (unsigned ci)
	{
		CI = ci;
	}
	void showPlorg () const
	{
		cout << _name << ‘	‘ << CI << endl;
	}
};

int main () 
{     
	Plorg	plorg;
	plorg.showPlorg();
	plorg.setCI(12);
	plorg.showPlorg();
} 

10.8设计简单列表类:可储存多种类型;可创建空列表;可在列表中添加数据项;可确定列表的空满;可访问每一个项并操作

#include <iostream>
#include <cstring>
using namespace std;

class TList
{
	public:
		typedef	int	Item;

	public:
		TList (const Item arr[] = NULL, unsigned n = 0);
		bool isFull (void) const;
		bool isEmpty (void) const;
		bool append (const Item& item);
		void visit (void (*pf) (Item& item));

	private:
		static const unsigned	mk_capacity = 4;

	private:
		Item		m_content[mk_capacity];
		unsigned	m_size;
		
};
		
TList::TList (const Item arr[], unsigned n) {
	if (NULL == arr) {
		m_size = 0;
		return;
	}

	m_size = mk_capacity < n ? mk_capacity : n;
	for (unsigned i = 0; i < m_size; ++i) {
		m_content[i] = arr[i];
	}
}
		
bool
TList::isFull (void) const
{
	return (mk_capacity == m_size);
}
		
bool
TList::isEmpty (void) const
{
	return (0 == m_size);
}

bool 
TList::append (const Item& item)
{
	if (isFull()) {
		return (false);
	}

	m_content[m_size++] = item;
	return (true);
}
		
void
TList::visit (void (*pf) (Item& item))
{
	for (unsigned i = 0; i < m_size; ++i) {
		pf(m_content[i]);
	}
}

static void
show (TList::Item& item)
{
	cout << item << ‘ ‘;
}

int
main (void) 
{     
	TList	one;
	one.visit(show);
	cout << endl;
	cout << "是否空:" << boolalpha << one.isEmpty();
	cout << endl << "=========" << endl;

	TList::Item	arr[] = {1, 2, 3};
	TList	two(arr, sizeof(arr)/sizeof(arr[0]));
	two.visit(show);
	cout << endl;
	cout << "是否满:" << two.isFull();
	cout << endl;
	cout << "是否空:" << two.isEmpty();
	cout << endl;
	cout << "追加一项:" << two.append(16);
	cout << endl;
	two.visit(show);
	cout << endl;
}