练习1.21
#include <iostream>
using namespace std;
struct Sales_data {
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
int main() {
Sales_data data1, data2;
//读入data1和data2的代码
double price = 0.0; //书的单价
//读入第一本交易:ISBN,销售数量,单价
cin >> data1.bookNo >> data1.units_sold >> price;
//计算销售收入
data1.revenue = data1.units_sold * price;
//读入第二本交易:ISBN,销售数量,单价
cin >> data2.bookNo >> data2.units_sold >> price;
//计算销售收入
data2.revenue = data2.units_sold * price;
//检查两笔交易涉及的ISBN号是否相同
if (data1.bookNo == data2.bookNo) {
unsigned totalCnt = data1.units_sold + data2.units_sold;
double totalRevenue = data1.revenue + data2.revenue;
//输出 ISBN,总销售量,总销售额,平均价格
cout << data1.bookNo << " " << totalCnt << " " << totalRevenue << " ";
if (totalCnt != 0) {
cout << totalRevenue / totalCnt << endl;
}
else {
cout << "No sales" << endl;
}
}
else { //两笔交易的ISBN 不一样
cerr << "Data must refer to the same ISBN" << endl;
return -1;
}
return 0;
}
输出结果为:
-
当2笔交易涉及的ISBN相同时, 且销售数量不为0时:
第一笔交易收入为 53=15
第二笔交易收入为 69=54
总销售数量为 5+6=11
总销售额为15+54=69
平均销售价格为69/11=6.27 -
当2笔交易涉及的ISBN相同时, 且销售数量为0时:
说明没有卖出一本书,指明 No sales -
当2笔交易涉及的ISBN不同时:
告知:两笔交易必须有相同的ISBN编码
练习1.22
#include <iostream>
using namespace std;
struct Sales_data {
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
int main() {
Sales_data data1;
double price = 0.0;
cin >> data1.bookNo >> data1.units_sold >> price;
data1.revenue = data1.units_sold * price;
Sales_data data2;
while (cin >> data2.bookNo >> data2.units_sold >> price) {
data2.revenue = data2.units_sold * price;
if (data1.bookNo == data2.bookNo) {
unsigned totalCnt = data1.units_sold + data2.units_sold;
double totalRevenue = data1.revenue + data2.revenue;
cout << "Result " << data1.bookNo << " " << totalCnt << " " << totalRevenue << " ";
data1.revenue = totalRevenue; //把总收入和总销售数量重新赋值给data1,用于累加
data1.units_sold = totalCnt;
if (totalCnt != 0) {
cout << totalRevenue / totalCnt << endl;
}
else {
cout << "No sales" << endl;
}
}
else {
cerr << "Data must refer to the same ISBN" << endl;
return -1;
}
}
}
输出结果如下所示,为了区分输入Sales_data类对象和输出总销售额和总销售量,在输出前面添加了Results。
每输入一条新的交易,产生一条新的结果,结果是前面所有有相同ISBN的书的交易的和的信息。
#include <iostream>
using namespace std;
struct Sales_data {
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
int main() {
Sales_data data1;//保存下一条交易记录的变量
double price = 0.0;
//读入第一条交易记录,并确保有数据可以处理
if (cin >> data1.bookNo >> data1.units_sold >> price)
{
data1.revenue = data1.units_sold * price;
int a = 1; //保存次数的变量
Sales_data data2;
while (cin >> data2.bookNo >> data2.units_sold >> price) {
//如果我们在处理相同的书
data1.revenue = data1.units_sold * price;
if (data1.bookNo == data2.bookNo)
a = a + 1; //更新总次数
else {
//打印前一笔交易的次数
cout << a << endl;
data1 = data2; //data1现在表示下一本书
a = 1; //开始计算下一笔交易的次数
}
}
cout << a << endl; //打印最后一笔交易的结果
}
else {
//没有输入
cerr << "No data?" << endl;
return -1;
}
return 0;
}
如果按照1.24的条件来看,每个ISBN的记录都聚在一起的话,此程序没有问题。否则计算错误
最后没有输入时,按ctrl+z+回车得到ISBN为C的交易次数。
#include <iostream>
using namespace std;
struct Sales_data {
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
int main() {
Sales_data total;//保存下一条交易记录的变量
double price = 0.0;
//读入第一条交易记录,并确保有数据可以处理
if (cin >> total.bookNo >> total.units_sold >> price)
{
total.revenue = total.units_sold * price;
Sales_data trans;
while (cin >> trans.bookNo >> trans.units_sold >> price) {
//如果我们在处理相同的书
trans.revenue = trans.units_sold * price;
if (total.bookNo == trans.bookNo) {
total.revenue = total.revenue + trans.revenue;
total.units_sold = total.units_sold + trans.units_sold;
}
else {
//打印前一笔交易的次数
cout << "Result is " << total.bookNo << " " << total.units_sold << " " << total.revenue << endl;
total = trans;
}
}
cout << "Result is " << total.bookNo << " " << total.units_sold << " " << total.revenue << endl; //打印最后一笔交易的结果
}
else {
//没有输入
cerr << "No data?" << endl;
return -1;
}
return 0;
}
注意,每个相同的ISBN的交易放在一起输入,否则会计算错误。