C++primer 第一章示例

1.4 控制流

1.4.4 if语句
统计在输入中每个值连续出现了多少次:

#include <iostream>
using namespace std;

int main()
{
	int currVal = 0, val = 0;

	if (cin >> currVal)
	{
		int cnt = 1;
		while (cin >> val)
		{
			if (val == currVal)
				++cnt;
			else{
				cout << currVal << " occurs "
					<< cnt << " times " << endl;
				currVal = val;
				cnt = 1;
			}
		}
		cout << currVal << " occurs "
			<< cnt << " times " << endl;
	}
	system("pause");
	return 0;
}

1.5 类简介

头文件Sales_item.h

#ifndef SALESITEM_H
// we're here only if SALESITEM_H has not yet been defined 
#define SALESITEM_H

// Definition of Sales_item class and related functions goes here
#include <iostream>
#include <string>

class Sales_item {
	// these declarations are explained section 7.2.1, p. 270 
	// and in chapter 14, pages 557, 558, 561
	friend std::istream& operator >> (std::istream&, Sales_item&);
	friend std::ostream& operator<<(std::ostream&, const Sales_item&);
	friend bool operator<(const Sales_item&, const Sales_item&);
	friend bool
		operator==(const Sales_item&, const Sales_item&);
public:
	// constructors are explained in section 7.1.4, pages 262 - 265
	// default constructor needed to initialize members of built-in type
	Sales_item() = default;
	Sales_item(const std::string &book) : bookNo(book) { }
	Sales_item(std::istream &is) { is >> *this; }
public:
	// operations on Sales_item objects
	// member binary operator: left-hand operand bound to implicit this pointer
	Sales_item& operator+=(const Sales_item&);

	// operations on Sales_item objects
	std::string isbn() const { return bookNo; }
	double avg_price() const;
	// private members as before
private:
	std::string bookNo;      // implicitly initialized to the empty string
	unsigned units_sold = 0; // explicitly initialized
	double revenue = 0.0;
};

// used in chapter 10
inline
bool compareIsbn(const Sales_item &lhs, const Sales_item &rhs)
{
	return lhs.isbn() == rhs.isbn();
}

// nonmember binary operator: must declare a parameter for each operand
Sales_item operator+(const Sales_item&, const Sales_item&);

inline bool
operator==(const Sales_item &lhs, const Sales_item &rhs)
{
	// must be made a friend of Sales_item
	return lhs.units_sold == rhs.units_sold &&
		lhs.revenue == rhs.revenue &&
		lhs.isbn() == rhs.isbn();
}

inline bool
operator!=(const Sales_item &lhs, const Sales_item &rhs)
{
	return !(lhs == rhs); // != defined in terms of operator==
}

// assumes that both objects refer to the same ISBN
Sales_item& Sales_item::operator+=(const Sales_item& rhs)
{
	units_sold += rhs.units_sold;
	revenue += rhs.revenue;
	return *this;
}

// assumes that both objects refer to the same ISBN
Sales_item
operator+(const Sales_item& lhs, const Sales_item& rhs)
{
	Sales_item ret(lhs);  // copy (|lhs|) into a local object that we'll return
	ret += rhs;           // add in the contents of (|rhs|) 
	return ret;           // return (|ret|) by value
}

std::istream&
operator >> (std::istream& in, Sales_item& s)
{
	double price;
	in >> s.bookNo >> s.units_sold >> price;
	// check that the inputs succeeded
	if (in)
		s.revenue = s.units_sold * price;
	else
		s = Sales_item();  // input failed: reset object to default state
	return in;
}

std::ostream&
operator<<(std::ostream& out, const Sales_item& s)
{
	out << s.isbn() << " " << s.units_sold << " "
		<< s.revenue << " " << s.avg_price();
	return out;
}

double Sales_item::avg_price() const
{
	if (units_sold)
		return revenue / units_sold;
	else
		return 0;
}
#endif

1.5.1 Sales_item类
读写Sales_item

#include <iostream>
#include "Sales_item.h"
using namespace std;

int main()
{
	Sales_item book;
	cin >> book;
	//输入ISBN号、售出册数即销售价格
	cout << book << endl;
	//写入ISBN号、售出册数、总销售额和平均价格

	system("pause");
	return 0;
}

Sales_item对象的加法

#include <iostream>
#include "Sales_item.h"
using namespace std;

int main()
{
	Sales_item item1, item2;
	cin >> item1 >> item2;			//读取一对交易记录
	cout << item1 + item2 << endl;	//打印它们的和

	system("pause");
	return 0;
}

1.52 初识成员函数
检查两个对象是否具有相同的ISBN

#include <iostream>
#include "Sales_item.h" 
using namespace std;

int main()
{
	Sales_item item1, item2;

	cin >> item1 >> item2;
	if (item1.isbn() == item2.isbn())
	{
		cout << item1 + item2 << endl;
		return 0;
	}
	else
	{
		cerr << "Data must refer to same ISBN" << endl;
		return -1;
	}
}

1.6 书店程序

#include <iostream>
#include "Sales_item.h" 
using namespace std;

int main()
{
	Sales_item total;	//保存下一条交易记录的变量
	//读入第一条交易记录,并确保有数据可以处理
	if (cin >> total)
	{
		Sales_item trans;	//保存和的变量
		//读入并处理剩余交易记录
		while (cin >> trans)
		{
			//如果仍在处理相同的书
			if (total.isbn() == trans.isbn())
				total += trans;	//更新总销售额;
			else {
				//打印前一本书的结果
				cout << total << endl;
				total = trans;	//total现在表示下一本书的销售额
			}
		}
		cout << total << endl;	//打印最后一本书的结果
	}
	else {
		//没有输入,警告用户
		cerr << "No data?!" << endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值