Page List

Search on the blog

2011年4月11日月曜日

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

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

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

例えば、この問題。

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

for文で書いたプログラムはこちら。
  1. vector<pair<intint> >vec, ret;  
  2. int main() {  
  3.     int n, s, t;  
  4.   
  5.     scanf("%d", &n);  
  6.     while (n--) {  
  7.         scanf("%d %d", &s, &t);  
  8.         vec.PB(MP(s,t));  
  9.     }  
  10.   
  11.     sort(ALL(vec));  
  12.     int pos = 0;  
  13.     for (;pos < (int)vec.size(); pos++) {  
  14.         int s = vec[pos].first;  
  15.         int t = vec[pos].second;  
  16.   
  17.         for (; pos+1 < (int)vec.size() && vec[pos+1].first <= t; pos++)  
  18.             t = max(t, vec[pos+1].second);  
  19.   
  20.         ret.PB(MP(s, t));  
  21.     }  
  22.   
  23.     REP(i, ret.size())  
  24.         printf("%d %d\n", ret[i].first, ret[i].second);  
  25.   
  26.     return 0;  
  27. }  


0 件のコメント:

コメントを投稿