第1章 开始 (C++ Primer 第五版)

第一个简单的C++程序

笔者有一定的C++基础,学习这本经典C++教材,笔者直接使用Code:BLocks作为编译环境。

int main()
{
    return 0;
}

这里写图片描述
说明:大多数系统中,main的返回值被用来指示状态。返回值0表明成功,非0的返回值的含义由系统定义,通常用来指出错误类型。

初识流

iostream库包含两个基础类型istream和ostream,分别表示输入流和输出流。标准库定义了四个IO对象:cin(istream类型的对象)和cout,cerr,clog(ostream类型的对象)。

std::cout<<"hello"<<std::endl;

“<<”运算符接收两个对象,左侧必须是ostream对象,右侧对象是要打印的,把右侧的值写入ostream对象中,第一个“<<”运算符运算的结果成为了第二个“<<”运算符左侧的运算的对象。上面的代码等价于下面的代码:

(std::cout<<"hello")<<std::endl;

endl是 一个操纵符(manipulator),写入endl的效果是结束当前行,并将与设备关联的缓冲区(buffer)中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序锁产生的所有输出都真正写入输出流中,而不是仅仅停留在内存中等待写入流。

标准库定义的所有名字都在std命名空间中。

std::cout<</*"*/"/*"/*"*/;

上面代码是没问题的!

读取数量不定的输入数据

用户随便输入几个数,输出这几个属于的和

#include<iostream>

int main()
{
    int sum=0,v=0;
    while(std::cin>>v){
        sum+=v;
    }
    std::cout<<"sum = "<<sum<<std::endl;
    return 0;
}

当istream对象作为条件时,其效果是检测流的状态。如果流是有效的,即流未遇到错误,那么检测成功。当遇到文件结束符(end-of-file),或遇到一个无效输入时(例如读入的值不是一个整数),istream对象的状态会变为无效。处于无效状态的istream对象会使条件为假。

文件结束,在Windows中,Ctrl+Z,然后Enter;Unix中,Ctrl+D

这里写图片描述

统计输入中每个值连续出现的次数

#include<iostream>

int main()
{
    int currVal=0,val=0;//currVal是当前正在统计的数,val是将读入的新值
    //读取第一个数,确保有数据可以处理
    if(std::cin>>currVal){
        int cnt=1;
        while(std::cin>>val){
            if(currVal==val){
                cnt++;
            }
            else{
                std::cout<<currVal<<" occurs "<<cnt<<" times."<<std::endl;
                cnt=1;
                currVal=val;
            }
        }
        //输出最后一个值出现的个数
        std::cout<<currVal<<" occurs "<<cnt<<" times."<<std::endl;
    }
    return 0;
}

这里写图片描述

初识类

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

这里写图片描述

说明:包含标准库用<>,包含非标准库用“”

解决本书开头提出的书店问题

题目要求:输入一系列交易记录(每本书的isbn,销量,销售价格),输出每本书的isbn,销售量,销售额及平均售价。假设每个isbn书的销售记录都在一起。
这里写图片描述
这里写图片描述

#include <iostream>
#include <cstdio>
#include"Sales_item.h"

using namespace std;

int main()
{
    //重定向,注意包含<cstdio>
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    freopen("err.txt","w",stderr);

    Sales_item total;
    //读入第一条交易记录,并确保有数据可以处理
    if(cin>>total){
        Sales_item trans;
        while(cin>>trans){
            if(total.same_isbn(trans)){
                total+=trans;
            }
            else{
                cout<<total<<endl;
                total=trans;
            }
        }
        cout<<total<<endl;//打印最后一本书的结果
    }else{
        cerr<<"No data?!"<<endl;
        return -1;
    }
    return 0;
}

in.txt

0-201-70353-X 4 24.99
0-201-70353-X 2 26.99
0-201-70353-X 6 21.99
0-202-70353-X 4 64.99
0-202-70353-X 4 74.99
0-203-70353-X 6 84.99

运行后:

out.txt

0-201-70353-X 12 285.88 23.8233
0-202-70353-X 8 559.92 69.99
0-203-70353-X 6 509.94 84.99

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/80934614