いきなりですが問題です.九九表生成プログラムをアレンジして,次の出力になるソースプログラムを解答してください.言語は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のコード・テンプレートをそのまま使用しているためです.自分で書くなら,「{」は独立した行にします.