いきなりですが問題です.WindowsのNotepad++を使って,「hello, world」を出力するCのプログラムを写経しました.
このプログラムの行数を答えてください.
さっそくですが解答です.編集領域の左の行番号は,1から8までですし,下部のステータスバーには,「lines: 8」と書かれています.だから答えは「8行」です.
…本当にそれでいいのでしょうか?
といったところで,本日の問題の経緯です.2年後期のプログラミング科目です.数十行程度の2つのCのソースファイルがあり,それらは同じ機能なのですが,書き方が違います.一方はmain関数ひとつに全ての処理を詰め込んでいるのに対し,もう一方は機能ごとに関数を分割しています.
そこでそれぞれのファイルについて,ファイル全体の行数や,空行・コメントを除外した行数,定義されている関数・変数の数,そしてmain関数内の行数などを数えて,比較することを,課題に入れました(そのあと,機能ごとに関数を分割するほうがなぜ良いかを,文章にしてもらいました).答案を回収して読んでいったところ,こちらの用意していた正解と完全に一致したのは,ごくわずかでした.ですが本日,関心を向けるのはその「すべて一致」のほうではありません.ファイル全体の行数だけが,1ずつ多く,それ以外は一致という答案が,いくらか,あったのでした.
昨年度も同様の問題を実施していて,そのときの「すべて一致」の答案の数と,今回の「ファイル全体の行数以外は一致」の数が,同じでした.
そこで気になったのが,ソースファイルを見るためのソフトウェア(テキストエディタまたはソースコードエディタ)です.昨年度の授業では,学内計算機をLinuxで起動して使用し,テキストエディタは特に指定していませんでした.
今年度はBYOD PCの使用です.テキストエディタの使用は指定しなかったものの,1年前期の情報処理科目の第2回の授業でインストールさせている,Notepad++を推奨していました.
課題のファイルを当ブログ上で公開するわけにいきませんので,かわりに今回,C言語/基本的なプログラム - Wikibooksのソースコードを,コピーして貼り付けました.貼り付けたところ,次のようになりました.この場合,「lines: 7」です.
これでも問題なくコンパイルできますが,「}」でファイルの中身が終わるのは,個人的に好みでないので,最後に改行を入れると,冒頭の画像のようになったのでした.
さて「8行」という答えでよいのかというと,まずいんとちゃうかと言わざるを得ません.というのも,空のファイル*1をNotepad++で開いたとき,「lines: 1」と表示されるのです.
length(字数)が0で,行数が1というのは,おかしな話です.
そこで「行数とは何か?」となります.一つの答えは「改行の数」です.それを基準とすると,空のファイルは「0行」となり,上のhello.cのうち,「lines: 8」のほうは「7行」ですが,貼り付けた直後で「lines: 7」のほうは,「6行」となってしまいます.
以下のページで,ファイルの終わりに改行のない場合も考慮して,行数を適切に数えてくれない方法,数えてくれる方法がまとめられています.
行数とは何かの,別の答えは「改行の数.ただしファイルが改行で終わっていない場合には1を加える」…いや,ダメです.これは空のファイルも「改行で終わっていない場合」に該当し,1行になってしまいます.
少し修正して,「改行の数.ただし最後の改行のあとに非改行文字がある場合には1を加える」とすれば,上の「lines: 7」「lines: 8」のhello.cはともに「7行」であり,空のファイルは「0行」です.