Page List

Search on the blog

2011年4月11日月曜日

バグを出さないプログラムテクニック(1)

よくあるバグの代表例は、
  • 無限ループ
  • out of bounds 系エラー
あたりだろう。
これらのバグは、ちょっとした事を実践することで回避することができる。

それは、whileループの禁止である。
whileループを使うと、
  • やたらと処理が複雑になったり、
  • 条件式が偽にならず無限ループになったり、
と悪いことばかり。
大抵のwhileループは、forループで書けるので、whileは禁止してしまってもいいかと思う。
(あと余談だが、ショートコーダーはwhileループは使わないらしい。)

例えば、この問題。

for文で書くと、綺麗に書けます。
whileで書くと、多分カオスになるでしょう。そしてバグが出るはず・・。

for文で書いたプログラムはこちら。
vector<pair<int, int> >vec, ret;
int main() {
int n, s, t;

scanf("%d", &n);
while (n--) {
scanf("%d %d", &s, &t);
vec.PB(MP(s,t));
}

sort(ALL(vec));
int pos = 0;
for (;pos < (int)vec.size(); pos++) {
int s = vec[pos].first;
int t = vec[pos].second;

for (; pos+1 < (int)vec.size() && vec[pos+1].first <= t; pos++)
t = max(t, vec[pos+1].second);

ret.PB(MP(s, t));
}

REP(i, ret.size())
printf("%d %d\n", ret[i].first, ret[i].second);

return 0;
}


0 件のコメント:

コメントを投稿