裏表(Phinloda のもう裏だか表だか分からないページ)

コンピュータ・プログラミング系の話がメインのそれなりにごちゃごちゃしたネタばかり出てくるサイトです。多分。
<< 重要ファイルのバックアップをしたのだが | Top | Yahoo!知恵袋に出ていたC言語の質問への凄い回答 (2) >>
Yahoo!知恵袋に出ていたC言語の質問への凄い回答 (1)

最近のプログラマーの質が落ちているという噂は大昔から耳にしているが、案外そうでもないのでは、と思っている。根拠も何もありません。もちろんヒドいのはいるとしても、そういうのは昔からいたし、程度の話。

Yahoo!知恵袋に出ていたC言語の質問の回答なのだが、ここまで凄いのかというのがあったので面白いから紹介したい。 その前に、カテゴリマスターの回答者さんが次のように書いている。

ここでコードを書いて貰って、許可を得ずにそれをそのまま使用すると著作権保護法に抵触します

現実的には、知恵袋で回答したごときのコードに著作権が発生するかどうか微妙だと思うが、少なくとも日本国には著作権保護法などという法律は存在しないので、もちろん抵触しない。

日本にあるのは著作権法という法律で、その第三十二条に、

公表された著作物は、引用して利用することができる。この場合において、その引用は、公正な慣行に合致するものであり、かつ、報道、批評、研究その他の引用の目的上正当な範囲内で行なわれるものでなければならない。

と定められているので、勝手に引用させていただく。 もちろん知恵袋に投稿された内容は「公表された」ものであり、今からそれを批評しようというのだから条件はクリアしているだろう。

なお、出所は「C言語の問題です。 問1から100までの整数の中に3の倍数がいくつあるかを求めるプロ... - Yahoo!知恵袋」である。(http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1293736492)

余談だが、今書いている内容は、以前紹介した Windows7 が勝手に再起動したトラブルで消滅した書きかけのドキュメントの一部で、思い出しながら書いているのだが、出所が分からなくなって難儀した。検索して探すにも限界がある。結局見つけたのだが。

問題は、C言語で、1から100までの整数の中に3の倍数がいくつあるかを求めるプログラムを作れというものだ。 ただし、条件として、

3の倍数の判定にはI%3を利用

と書いてある。もしこれが I という名前の変数を使えという所まで条件だと考えたら、回答者は全滅だが、まあそこまで文字通りに解釈する必要もないだろう。

まずベストアンサーがいきなり間違っているのが知恵袋っぽくてよいと思った。 そこから評させていただく。 回答は hidenari_1 さん。 ループの中で3で割り切れるかどうかの判定部分がこうなっている。

if(i % c == 0)b = b + 1;

c って何?

条件の「I%3を利用」というのが読めなかったのだろうか? ちなみに c という変数は定義されていないから結果がどうこう以前に、このコードはコンパイルすら通らない。

これでは先に進めないからとりあえず、c を 3に変更してコンパイルして実行してみたら、次のような結果が表示された。

三の倍数は、2674309個です。

結構たくさんありますね

じゃなくて、カウンタが初期化されてないだろ。中学生の初心者プログラマーみたいな間違いをするなよと突っ込みたくなるが、実際はプロとか、具体的に言うのは避けるが世界一のシェアを持っている某パソコン用OSの開発者でもやるバグだから、仕方ないのかもしれない。

落ちついて、ベストアンサーを最初から見ていこう。

int a, b, i;

まずここがダメ。 間違いではない。C言語としては正しいしプログラムとしてもok。でもダメだ。a とか b というような変数名は使ってはいけない。意味が分からないからだ。

ちなみに、i という変数は使ってもいい。i は、暗黙の了解事項として、ループ変数として使うという慣習があるからである。ここは、例えば次のように書くべきである。

int count = 0;
int i;

b という変数を count という名前にしてみた。これで何かを数えているということが分かる。 変数 a ですか? 使っていないので削除しましたが、なにか?

もう一回戻って、ループのところ。

for(i = 1; i < 101; i ++)
{
if(i % c == 0)b = b + 1;
}

インデントできないのは勝手に空白を削除してしまう知恵袋の仕様があるので仕方ない。 とりあえず、インデントだけ勝手に付けるとこうなる。

for(i = 1; i < 101; i ++)
{
    if(i % c == 0)b = b + 1;
}

空白論争は不毛なことが多いが、一応個人的な好みのスタイルで書いておく。

for (i = 1; i < 101; i++) {
    if (i % c == 0)
        b = b + 1;
}

ここで注目したいのはあと2つ。 まず、i < 101 ではなく、i <= 100 とすべきである。 なぜなら、問題には「100までの整数」と書いてあるからだ。 「100までの整数」に合う条件はストレートに考えたら i <= 100 である。 「i < 101」は、「101未満の整数」である。両者は結果は同じだが、意味は違う。

そして、b = b + 1 ではなく、b++ と書くべきである。 なぜなら、++ には「1増やす」という強い意思があって、それはコードを見る人にも必ず伝わるからだ。「b = b + 1」だと、b に 1を加えるという意味になる。もしかして1ではなく2ではないか、と疑う人がいるかもしれない。 そういう曖昧さが残る。

これがなぜベストアンサーに選ばれたのか謎。 しかも回答者はお礼のコメントを書いているのだ。 一体何がどう理解できたのか知りたいものだ。

(つづく)

JUGEMテーマ:コンピュータ
| C言語 | 19:06 | comments(0) | trackbacks(0)
スポンサーサイト
| - | 19:06 | - | -
コメント
コメントする









この記事のトラックバックURL
http://phinloda.jugem.cc/trackback/3173
トラックバック
Powered by "JUGEM"
▲このページの先頭へ
CALENDAR
S M T W T F S
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
<< July 2017 >>
NEW ENTRIES
CATEGORIES
ARCHIVES
NEW COMMENTS
NEW TRACKBACKS
LINKS
PROFILE