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.