C++ Primer笔记(2.6.2)—— 使用Sales_data类
Sales_data.h头文件
#pragma once
/********************************************************************************************************/
/* 头文件通常包含那些只能被定义的实体,如类、const、constexpr变量等。头文件也经常用到其他头文件的功能。 */
/* 例如,我们的Sales_data类包含一个string成员,所以Sales_data.h必须包含string.h的头文件。同时,使用 */
/* Sales_data类的程序为了能操作bookNo成员需要再一次包含string.h头文件。 */
/********************************************************************************************************/
/* */
/* 确保头文件多次包含仍能安全工作的常用技术是 预处理器,它由C++语言从C语言继承而来。预处理器是在编译之前*/
/* 执行的一段程序,可以部分地改变我们所写的程序。之前已经用到了一项预处理功能#include, 当预处理器看到 */
/* #include标记时就会用指定的头文件的内容代替#include。 */
/* */
/* C++程序还会用到的一项预处理功能是 头文件保护符(header guard),头文件保护符依赖于预处理变量。预处理 */
/* 变量有两种状态: 已定义和未定义。 */
/* #define指令把一个名字设定为预处理变量,另外两个指令则分别检查某个指定的预处理变量是否已经定义: */
/* #ifdef当且仅当变量已定义时为真,#ifndef当且仅当变量未定义时为真。 */
/* 一旦检查结果为真,则执行后续操作直至遇到#endif指令为止。 */
/* */
//使用这些功能就能有效地防止重复包含的发生
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include<iostream>
#include<string.h>
struct Sales_data {
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
#endif
//第一次包含Sales_data.h时,#ifndef的检查结果为真,预处理器将顺序执行后面的操作直到遇到#endif为止
main.cpp文件
#include<iostream>
#include<string>
#include "Sales_data.h"
/****************************************************************/
/* 因为我们定义的Sales_data类没有提供任何操作,所以我们必须自己 */
/* 编码实现输入、输出和计算功能。 */
/* */
/* 我们写一段程序实现求两次交易相加结果的功能。程序的输入是两条 */
/* 交易记录: */
/* 0-201-78345-X 3 20.00 */
/* 0-201-78345-X 2 25.00 */
/* 每笔交易记录着图书的ISBN编号、售出数量、售出单价 */
int main()
{
//添加两个Sales_data对象
Sales_data data1, data2;
double price = 0; //书的单价、用于计算销售收入
//读入第一笔交易
std::cout << "data1的ISBN编号为:";
std::cin >> data1.bookNo ;
std::cout << "data1的销售数量为:";
std::cin >> data1.units_sold;
std::cout << "data1的单价为:";
std::cin >> price;
//计算第一笔交易销售收入
data1.revenue = data1.units_sold * price;
std::cout << "data1的销售收入为:" << data1.revenue << std::endl;
std::cout << std::endl;
//读入第二笔交易
std::cout << "data2的ISBN编号为:";
std::cin >> data2.bookNo;
std::cout << "data2的销售数量为:";
std::cin >> data2.units_sold;
std::cout << "data1的单价为:";
std::cin >> price;
//计算第一笔交易销售收入
data2.revenue = data2.units_sold * price;
std::cout << "data2的销售收入为:" << data2.revenue << std::endl;
std::cout << std::endl;
/* 剩下的工作就是检查两笔交易涉及的ISBN编号是否相同了。 */
/* 如果相同输出它们的和,否则输出一条报错消息。 */
if (data1.bookNo == data2.bookNo)
{
unsigned totalCnt = data1.units_sold + data2.units_sold;
double totalRevenue = data1.revenue + data2.revenue;
//输出:ISBN、总销售量、总销售额、平均价格
std::cout << "ISBN:" << data1.bookNo << std::endl;
std::cout << "总销售量:" << totalCnt << std::endl;
std::cout << "总销售额:" << totalRevenue << std::endl;
if(totalCnt != 0)
std::cout << "平均价格:" << totalRevenue/ totalCnt << std::endl;
else
std::cout << "(no sales)" << std::endl;
return 0;
}
else //两笔交易的ISBN不一样
{
std::cerr << "ISBN要求一样" << std::endl;
return -1;
}
return 0;
}