1 条题解

  • 1
    @ 2020-04-16 21:39:33

    本题考察不定数目数据的读入,以及错误处理
    注意语句cin.eof()
    该语句判断的是你上一次读入的值是否为eof,而不是即将读入的值
    所以要读入数据之后再进行eof判定,而不是判断了eof再读入
    同理fail也是指上一次读入是否类型不匹配,而且一旦fail被置位,cin将无法进行后续读入,那次失败的读入内容将返回到输入流,直到进行clear后继续读入
    所以在fail判定之后需要忽略该行剩余的读入内容,使用cin.ignore()

    #include<iostream>
    #include<iomanip>
    using namespace std;
    
    class Point
    {
        friend istream& operator>>(istream& c, Point& px);
        friend ostream& operator<<(ostream& c, Point px);
        friend Point operator+(Point a, Point b);
    private:
        int x, y;
    public:
        Point(int _x = 0, int _y = 0) :x(_x), y(_y) {};
    };
    
    istream& operator>>(istream& c, Point& px)
    {
        c >> px.x >> px.y;
        //判断范围,若超出范围则置位fail
        if (!c.fail()) if (px.x < -1000 || px.x>1000 || px.y < -1000 || px.y>1000) c.setstate(ios::failbit);
        return c;
    }
    
    ostream& operator<<(ostream& c, Point px)
    {
        c << '(' << px.x << ',' << px.y << ')';
        return c;
    }
    
    Point operator+(Point a, Point b)
    {
        return Point(a.x + b.x, a.y + b.y);
    }
    
    int main()
    {
        Point pa, pb;
        while (!(cin >> pa >> pb).eof())
        {
            if (cin.fail()) {
                cout << "Invaild input." <<  endl;
                cin.clear();
                //忽略这一行后面的数据
                cin.ignore(100,'\n');
            }
            else
            {
                cout << pa + pb << endl;
            }
        }
    }
    
  • 1

信息

ID
1013
难度
2
分类
(无)
标签
递交数
167
已通过
30
通过率
18%
上传者