わさっきhb

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

インデントしよう!(2021年度版)

 いきなりですが問題です.九九表生成プログラムをアレンジして,次の出力になるソースプログラムを解答してください.言語はCとします.

123456789
246802468
369258147
482604826
505050505
628406284
741852963
864208642
987654321

 解答の前に,出力は,九九の1の位のみを並べたものとなっています.Cでは,整数になる式の1の位の値は,式%10で求められます.
 といったところでソースコードです.

#include <stdio.h>
int main(void){
    int i, j;

    for (i = 1; i <= 9; i++) {
        for (j = 1; j <= 9; j++) {
            printf("%d", i * j % 10);
        }
        printf("\n");
    }

    return 0;
}

 本日は上記のコードをもとに,インデントが不適切なものをいくつか挙げていきます.
 インデント(字下げ)の仕方は,コーディングスタイルに依存する話ではありますが,今回,以下のルールで行うこととします.なお「決まった文字数」は,paiza.IOで編集*1する場合には半角空白4文字です.

  • 「{」で終わる行の次から,決まった文字数だけ字下げする.
  • 「}」から始まる行(「}」のみの行を含む)で,(一つ分の)字下げを終える.

 それではこのルールに反する,最初のおかしなプログラムです.

#include <stdio.h>
int main(void){
    int i, j;

    for(i=1;i<=9;i++){
    for(j=1;j<=9;j++){
    printf("%d",i*j%10);
    }
    printf("\n");
    }

    return 0;
}

 main関数の中だけ,一律に,インデントしていますが,読みやすいとは言えません.
 次のおかしなプログラムです.

#include <stdio.h>
int main(void){
    int i, j;

    for (i = 1; i <= 9; i++) {
        for (j = 1; j <= 9; j++)
            printf("%d", i * j % 10);
            printf("\n");
    }

    return 0;
}

 内側の「{」と「}」を取り除いています.処理(ここでは「printf("%d", i * j % 10);」)が1文なので,ここのカッコは省略できます.それに対し,iのfor文の「{」「}」を取り除くと処理が変わってきます.
 それはそれとして,「printf("\n");」の行のインデントレベルは,一つ左(半角空白8文字分)とすべきです.
 3番目は…

#include <stdio.h>
int main(void){
    int i, j;

    for (i = 1; i <= 9; i++) {
        for (j = 1; j <= 9; j++) {
            printf("%d", i * j % 10);}
            printf("\n");
        }

    return 0;
}

 「for (i = 1; i <= 9; i++) {」に対応する「}」が,ないように見えますが,それは「for (j = 1; j <= 9; j++) {」の3行あとの「}」です.jのfor文の「}」は,「printf("%d", i * j % 10);}」の行の最後の文字です.
 閉じ中カッコを書き足して,コンパイルするとエラーになるので,後ろの閉じ中カッコを取り除いて辻褄を合わせる,というのは,よいコーディングとは言えませんね.
 最後に…

#include <stdio.h>
int main(void){
    int i, j;

   for (i = 1; i <= 9; i++) {
        for (j = 1; j <= 9; j++) {
            printf("%d", i * j % 10);
        }
        printf("\n");
    }

    return 0;
}

 これは,「for (i = 1; i <= 9; i++) {」の行だけ,半角空白1文字分,字下げが少なくなって(左に寄って)います.編集していて,不用意に1文字だけ削除することは,大いに起こり得ます.コンパイルや実行に,影響を及ぼしませんが,読む人によってはこの1文字だけでも,イラッとさせることになりかねません.

*1:「int main(void){」は,https://takehikom.hateblo.jp/entry/2020/10/11/055756でも指摘していますが,paiza.IOのコード・テンプレートをそのまま使用しているためです.自分で書くなら,「{」は独立した行にします.