line.cpp

Đọc dữ liệu theo dòng

Bài toán

Input gồm nhiều dòng, mỗi dòng chứa các số nguyên. Công việc của bạn là : với mỗi dòng input, viết ra một số là tổng các số trên dòng đó.

Sample Input

1   2 3  4    6 5 

10 20

   30 40   50

Sample Output

21

30

0

120

Có nhiều bài tập cho các bộ dữ liệu trên từng dòng. Công việc mà bạn bắt buộc phải làm là kiểm tra xem đọc đến chỗ này đã hết dòng hay chưa. Vì vậy mình viết ra kiểu dữ liệu này nhằm khắc phục khó khăn đó.

line.cpp

#include <stdio.h>

class line_t {

private:

    char s[2309];

    int pos;

    void ignoreSpace(){ while (s[pos]<=32 && s[pos]>0) pos++; }

    void pass(char aa, char bb) { while (s[pos]>=aa && s[pos]<=bb) pos++; }

public:

    char* load(){ pos=0; return gets(s); }

    int readInt(int *p);

};

int line_t::readInt(int *p){

    int old=pos;

    ignoreSpace();

    pass('+','9');      // pass over characters 0..9, -, +

    return sscanf(s+old, "%d", p);

};

line_t ln;

int p, sum;

main(){

    while (ln.load()){

        sum = 0;

        for (;;){

            if (ln.readInt(&p) != 1) break;

            sum += p;

        }

        printf("%d\n", sum);

    }

}

Nhận xét

Cách làm này có thể áp dụng cho rất nhiều bài toán khác nhau. Code tương đối ngắn.

Giải thích

line_t sử dụng biến pos để đánh dấu vị trí kí tự đầu tiên chưa được đọc.

Lệnh readInt, thực hiện 2 việc, một là, dùng sscanf đọc số tiếp theo kể từ vị trí s[pos], hai là tăng pos đến vị trí mới, tức là vị trí mà chưa bị đọc.