わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

scanfは使いません

1年向けの講義で,Cの文法を教えていて,3回目の授業を終えたところです.
しかし,多くのCの入門書の序盤で出てくる「scanf」の使い方を,私はあえて説明していません.
講義ではかなりあとのほうで,入出力のライブラリ関数の一つとして紹介し,getsと並んで,原則として使ってはいけない関数に指定しています.
序盤で使用しない,最大の理由*1が,再現性です.プログラミングでは,「例題のプログラムは,だれのところでコンパイルしても,同じように動作する実行ファイルができ,入力が同じならば,出力も同じである」ことが期待されるのですが,scanfで,というよりも標準入力から読み取るとなると,この「入力が同じ」というのがときには障壁になります.
具体的には(ただしフィクションですが),「先生,例題のプログラムを打ち込んだのですが,うまく動きません」という質問があったとき,次の2つを検討します.

  • プログラムに間違いはないか?
  • 与える入力に間違いはないか?

ここで,後者が原因であれば,どんなにソースファイルを見ても,デバッグのしようがありません.
ということで,プログラミングの初心者には,「プログラムの中に,出発点となる値を埋め込む」方式をとり,解説しています.そして標準入力からは値をもらいません.こうすることで,うまく動かないときはソースファイルだけをじっくり見れば,原因が分かることになります.
ただし,値を変えるたびにコンパイルしないといけない,というデメリットもあります.しかしこれまたプログラミングの初心者には,「まずソースを作る→コンパイルして実行→ソースを一部書き換える→コンパイルして実行→ソースを一部書き換える→コンパイルして実行→…」によりプログラムの完成度を高める(プログラムの詳細を理解していく)のが最善であると考えています.

*1:通常よく言われている「使ってはいけない理由」が書かれているページにリンクしたいけど,いいのが見つからない….