1.2 初识输入输出
iostream库
istream和ostream输入流和输出流
标准输入输出对象:
标准输入:cin
标准输出:cout
标准错误(输出错误和警告信息):cerr
输出程序运行时的一般性信息:clog
一个使用IO库的程序
#include<iostream>
int main()
{
std::cout << "Enter two numbers:" << std::endl;
int v1(0), v2(0);
std::cin >> v1 >> v2;
std::cout << "The sum of " << v1 << " and " << v2
<< " is " << v1 + v2 << std::endl;
return 0;
}
向流写入数据
输出运算符(<<)接受两个运算对象,左侧:ostream对象,右侧:要打印的值
std::cout << "Enter two numbers:" << std::endl;
//等价于(std::cout << "Enter two numbers:" )<< std::endl;
第一个输出运算符给用户打印一条信息 第二个运算符打印endl:操纵符的特殊值,效果是结束当前行
使用标准库中的名字
使用std::cout,std::endl,未直接使用cout,endl
前缀std::指出名字cout,endl是定义在名为std的命名空间(namespace)
标准库定义的所有名字都在命名空间std中
使用**作用域运算符(::)**来稚楚我们向使用定义在命名空间std中的名字cout
从流读取数据
int v1=0,v2=0;
初始化一个变量,在变量创建的同时为它赋予一个值
std::cin >> v1 >> v2;
//读入两个值,第一个存入v1,第二个存入v2;
/*等价于:
std::cin >> v1;
std::cin >> v2;
*/
输入运算符(>>):接受两个对象,左侧:iostream,接受一个对象作右侧运算对象。它从iostream读入数据,并存入给定对象。
完成程序
打印计算结果:
std::cout << "The sum of " << v1 << " and " << v2 << " is " << v1 + v2 <<std::endl;
1.3 注释简介
//注释
或者
/*
注释
*/
1.4控制流
1.4.1 while语句
while语句反复执行一段代码,直至给定条件为假为止。
#include<iostream>
int main()
{
int sum(0), val(1);
while (val <= 10) {
sum += val;//等价:sum=sum+val;
++val; //等价:val=val+1;
}
std::cout << "Sum of 1 to 10 insclusive is " << sum << std::endl;
return 0;
}
1.4.2 for语句
#include<iostream>
int main()
{
int sum(0);
for(int val = 1;val <= 10;++val) {
sum += val;
}
std::cout << "Sum of 1 to 10 insclusive is " << sum << std::endl;
return 0;
}
for循环总体流程:
- 创建变量val,初始化。
- 检测val是否小于等于10。成功:执行for循环;失败:退出循环。
- val增加1。
- 重复2。
1.4.3 读取数量不定的输入数据
#include<iostream>
int main()
{
int sum(0),value(0);
//读取数据直到遇到文件尾,计算所有读入的值的和
while (std::cin >> value) {
sum += value;
}
std::cout << "Sum is " << sum << std::endl;
return 0;
}
std::cin >> value
此表达式从标准输入读取下一个数,保存在value中。当遇到文件结束符或者无效输入时(读入不是整数),条件就会变成假
1.4.4 if 语句
统计在输入中每个值连续出现了多少次
//统计在输入中每个值连续出现了多少次
#include<iostream>
int main()
{
//currVal是我们正在统计的数,我们将读入的新值存入val
int currVal(0), val(0);
//读取第一个数,并确保确实有数据可以处理
if (std::cin >> currVal) {
int cnt = 1; //保存我们当前正在处理的当前值的个数
while (std::cin >> val) //读取剩余的数
{
if (val == currVal) //如果值相同
++cnt; //将cnt加1
else //否则,打印前一个值的个数
{
std::cout << currVal << " occurs " << cnt << " times " << std::endl;
currVal = val; //记住新值
cnt = 1; //重置计数器
}
}//while循环在这里结束
//记住打印文件中最后一个值的个数
std::cout << currVal << " occurs " << cnt << "times " << std::endl;
}//最外层的if语句在这里结束
return 0;
}
最后一个值个数打印不出来!!!!!
1.5 类简介
定义一个类(class)来定义自己的数据结构
通常使用.h作为头文件的后缀
1.5.1 Sales_item类
每个类都定义了一个新的类型,其类型名就是类名
eg sale_item定义了一个名为sale_item的类型
Sales_item item;
上述表达item是Sales_item类型的对象,简单说成“一个Sales_item对象”
除了定义Sales_item类型的变量,还可以:调用函数,输入输出>>/<<,赋值,加法等。
读写Sales_item
eg:从标准输入读入数据,存入一个Sales_item对象中,然后讲Sales_item的内容写回到标准输出
#include<iostream>
#include"Sales_item.h"
int main()
{
Sales_item book;
//读入ISBN号,售出的册数以及销售价格
std::cin >> book;
//写入ISBN,售出的册数,总销售额和平均价格
std::cout << book << std::endl;
return 0;
}
来自标准库的头文件使用< >,不来自使用“ ”
Sales_item对象的加法
eg:将两个Sales_item对象相加
#include<iostream>
#include"Sales_item.h"
int main()
{
Sales_item item1, item2 ;
std::cin >> item1 >> item2; //读取一对交易记录
std::cout << item1 + item2 << std::endl; //打印它们的和
return 0;
}
区别:
对于int,计算传统意义上的和,两个数值的算数加法结果;对于sales_item对象,用的是新的“和”概念,两个sales_item对象的成员对应相加的结果
使用文件重定向
$ addItems <intfile>outfile
假定$是操作系统提示符,上述命令会从一个名为infile的文件读取销售记录,并将输出结果写入到一个名为outfile的文件中,两个文件都位于当前目录中。
头文件Sales_item.h
#ifndef SALESITEM_H
#define SALESITEM_H
#include <iostream>
#include <string>
class Sales_item
{
public:
Sales_item(const std::string& book) :isbn(book), units_sold(0), revenue(0.0) {}
Sales_item(std::istream& is) { is >> *this; }
friend std::istream& operator>>(std::istream&, Sales_item&);
friend std::ostream& operator<<(std::ostream&, const Sales_item&);
public:
Sales_item& operator+=(const Sales_item&);
public:
double avg_price() const;
bool same_isbn(const Sales_item& rhs)const
{
return isbn == rhs.isbn;
}
Sales_item() :units_sold(0), revenue(0.0) {}
public:
std::string isbn;
unsigned units_sold;
double revenue;
};
using std::istream;
using std::ostream;
Sales_item operator+(const Sales_item&, const Sales_item&);
inline bool operator==(const Sales_item& lhs, const Sales_item& rhs)
{
return lhs.units_sold == rhs.units_sold && lhs.revenue == rhs.revenue && lhs.same_isbn(rhs);
}
inline bool operator!=(const Sales_item& lhs, const Sales_item& rhs)
{
return !(lhs == rhs);
}
inline Sales_item& Sales_item::operator +=(const Sales_item& rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
inline Sales_item operator+(const Sales_item& lhs, const Sales_item& rhs)
{
Sales_item ret(lhs);
ret += rhs;
return ret;
}
inline istream& operator>>(istream& in, Sales_item& s)
{
double price;
in >> s.isbn >> s.units_sold >> price;
if (in)
s.revenue = s.units_sold * price;
else
s = Sales_item();
return in;
}
inline ostream& operator<<(ostream& out, const Sales_item& s)
{
out << s.isbn << "\t" << s.units_sold << "\t" << s.revenue << "\t" << s.avg_price();
return out;
}
inline double Sales_item::avg_price() const
{
if (units_sold)
return revenue / units_sold;
else
return 0;
}
#endif
1.5.2 初始成员函数
将两个Sales_item对象相加的程序首先应该检查两个对象是否具有相同的ISBN。方法如下:
#include<iostream>
#include"Sales_item.h"
using namespace std;
int main()
{
Sales_item item1, item2;
std::cin >> item1 >> item2;
//首先检查item和item2是否表示相同的书
if (item1.isbn() == item2.isbn()) {
std::cout << item1 + item2 << std::endl;
return 0; //表示成功
}
else {
std:cerr << "Data must refer to same ISBN" << std::endl;
return -1; //表示失败
}
}
什么是成员函数
if语句的检测条件:
item1.isbn() == item2.isbn()
调用名为isbn的成员函数。成员函数是定义类的一部分的函数,有时也被称为方法。
通常以一个类对象的名义来调用成员函数。eg:
item1.isbn()
使用点运算符(.)来表达我们需要“名为item1的对象的isbn成员”。点运算符只能用于类类型的对象。.左侧运算对象必须是一个类类型的对象,右侧运算对象是该类型的一个成员名,运算结果为右侧运算对象指定的成员
调用运算符 :()调用函数,()里面放置实参列表(可能为空)
1.6 书店程序
#include<iostream>
#include"Sales_item.h"
int main()
{
Sales_item total; //保存下一条交易记录的变量
//读入第一条交易记录,并确保有数据可以处理
if (std::cin >> total){
Sales_item trans; //保存和的变量
//读入并处理剩余交易记录
while (std::cin >> trans){
//如果我们仍在处理剩余交易记录
if (total.isbn() == trans.isbn())
total += trans; //更新总销售额
else{
//打印前一本书的结果
std::cout << total << std::endl;
total = trans; //total现在表示下一本书的销售额
}
}
std::cout << total << std::endl;
}
else {
//没有输入!警告读者
std::cerr << "No data?!" << std::endl;
return -1;
}
return 0;
}
|