わさっきhb

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

Cプログラムらしいプログラムとは

いきなりですが問題だよこのコードは.

C言語のプログラムでは,幅広いスペースや空行はコンパイル時に無視され,プログラムの実行に影響しません。この自由度を利用して,プログラムの構造がみえるようにします。いわゆる,Cプログラムらしいプログラムとは,このようなプログラムのことをいいます。
(例)

#include <stdio.h>
int main(void){
     int k, N;
     double k, m, N;

     N=10;
     for(k=1;k<N;k++){
        if(k % 2 == 0){
           printf("k=%d \n", k);
        }
     }
     return 0;
}

さてえっと,まず,このプログラムはコンパイル時にエラーが発生します.というのも変数kとNが重複して,main関数内に宣言されているからです.変数mが使用されていないことから,「double k, m, N;」の行を丸ごと削除すれば,この件は解決しそうです.
しかし「Cプログラムらしいプログラム」かというと,引っかかるところがあります.「N」という名前の変数です.処理を見ていくと,「N=10;」と代入してから,Nの値はまったく変化していません.変数ではなく定数です.Cでは,#defineのオブジェクト形式マクロを使うべきところです.そしてmain関数より上で宣言します.
あとは,見た目の問題です.インデント(字下げ)が最初のレベルは5文字の空白,あとは3文字というのは,ずいぶんと謎な書き方です."k=%d \n"と,改行の前にスペースがあるのも意味不明です.forやifと開きカッコとの間には空白を置くようにして,関数呼び出しと制御文とを書き分けたいところです.
空行は,まず,#includeとmainの間にほしいし,main関数内でも,関数終了のreturn文の直前に入れておきたいものです.
その他もろもろ,修正していくと,次のようになりました.

/* even.c : N未満の正の偶数を出力 */

#include <stdio.h>

#define N 10

int main(void)
{
  int k;

  for (k = 1; k < N; k++) {
    if (k % 2 == 0) {
      printf("k=%d\n", k);
    }
  }

  return 0;
}

といったところで元ネタです.

Cで計算!―基礎からはじめるプログラミング

Cで計算!―基礎からはじめるプログラミング

冒頭の引用は,この本のp.33です.インデントが最初5文字,あと3文字というのは,きっちりそうなっているのではなく,0.5文字程度のずれがあります.
shadowboxで囲まれていることから(また本文全体からも),TeXで書かれたのが想像できます.他のページのソースファイルには,おかしなインデントが見当たらなかったので,ここだけ別の方法で作成したものと思われます.
それでも,文字列リテラル中の「\n」の直前の空白文字は,意味不明です.引用しなかった同ページ下部には,インデントなしのソースコードがあるのですが,そこでも"k=%d \n"と空いています.
書店でこの本を見かけたとき,練習問題が多く入っており,自分の授業に取り入れようかなと思ったのですが,帰宅してじっくり読んでみると,「...変数のバイト数は,sizeof(変数名)演算子を使って...」(p.21脚注)だとか「変数aが...整数型から倍精度浮動小数点型に型変換」(p.22)だとか,「幅広いスペース」だとか,細かいところが気になってきました.順に「sizeof演算子」「変数aの値」「スペースやタブ」だったら,違和感がなかったのですが.