第八回-01 見ためを気にしよう〜タブによる字下げ


前回課題の答案から

ここまで復習をかねて、前回の第七回課題から話を始めよう。

この課題は、実数 x の冪乗 xn を計算する関数を作成するのであった。
ただし、n は正、0、負の整数をとりうるので、if 文により条件分岐をする必要があった。

実際に以下の「模範解答例」および「間違いではないが、望ましくない例」 を見てみよう。
プログラミングを習得したいと考えている人にとって、プログラムを読んで理解することも重要な技術の一つである。
これまでの内容を思い返しながら内容を理解してみよう。

模範解答例 間違いではないが、望ましくない例


さて、ここで着目して欲しいのは上の 「間違いではないが、望ましくない例」 である。
何が望ましくないかというと、 タブによる字下げが行われていないのでプログラムの構造が見えにくい ということである。

この課題は、「プログラムのこの部分をメールに貼り付けて送る」 という形式で提出してもらったが、
ほとんどの答案がこのように字下げがいい加減なものであった。

プログラムが期待通り動作するという意味では正解なので減点はしていないが、
プログラム技術の向上を目指すのであれば、このような「悪い癖」は直しておかなければ技術の向上は見込めない

そのようなわけで、まずは「タブによる字下げ」の練習を行ってみよう。

前回の演習の解答のうち、べき関数のみの部分を表示すると以下のようになる。 ただし、正しく動作するものの、わざと字下げを行っていない。
これを、前回のべき関数部分に貼り付けよう。
そして、上の表の「模範解答例」を参考に、タブによる字下げを行ってみて欲しい。

ただし、Visual Studio 2019 では、貼りつけた瞬間に正しい字下げに時動的に整形されてしまうので、演習が行えません…。
とは言え、Visual Studio の力に頼らなくとも、自分で正しい字下げを行えるのは重要なことだと個人的には思います。

double beki(double x, int n)
{

double val;
val = 1;
if(n>=0){
for(int i=0 ; i<n ; i++){
val = val*x;
}
}else{
for(int i=1 ; i<=-n ; i++){
val = val/x;
}
}
return val;

}


字下げにおける注意点は

中括弧の付け方のスタイル

次に、中括弧の付け方であるが、人によって幾つかスタイルがある。

中括弧の付け方1 中括弧の付け方2


私が良く用いるのは左側のスタイルであるが、 右側のスタイルも多く見られる。
右側の方が、中括弧が縦に揃うので見やすいという人も多いと思う。 どちらが出て来ても対応できるようにしておこう。


中括弧をつけるときとつけないとき

では次に、(誰かのコピーが回っただけだろうが) 多くの学生が送って来た答案である以下のプログラムを、
タブによる字下げで整理してみよう。
多くの皆さんが実際に提出したプログラムであるから、出来るはず (?)



まず、先程の progI_07_ans.zip をそのまま再び用いる。
そして、先程タブで整理した beki 関数の中身を削除するか、コメントアウトで無効化しよう。

複数行のコメントアウトは以下のように「/*」と「*/」で囲うのが便利である。

/*

この間はコメントアウト扱い

*/


次に、beki 関数の中身として以下をコピーし、タブによる字下げを実行して欲しい。

double val;
val =1;
if(n>=0){
for(int i=1 ; i<=n ; i++){
val=val*x;
}}else{
for(int i=1; i<=-n; i++)
val=val/x;
}
return val;


できただろうか?

もしかすると「中括弧の数が合わないのではないか?」と感じた人がいるかもしれない。
しかし、このプログラムはコンパイルは通るし実行結果も正しいので、中括弧の数が合わないということはないはずである。

正しく字下げを行うと以下のようになる。

	double val;
	val =1;

	if(n>=0){
		for(int i=1 ; i<=n ; i++){
			val=val*x;
		}
	}else{
		for(int i=1; i<=-n; i++)
			val=val/x;
	}

	return val;


2 つの for 文において、中括弧の使い方が異なっているのが分かるだろうか?
実は、あまり触れて来なかったが、if 文でも for 文でも、中身が1命令であれば、 中括弧は省略できる
つまり、以下の左と右は同じ効果がある、ということである。

for(int i=0 ; i<n ; i++){
	(命令1つだけ);
}
for(int i=0 ; i<n ; i++)
	(命令1つだけ);


ただ、上の字下げの例で明らかになったように、
「命令1文で中括弧あり」と「命令1文で中括弧なし」の記法が 混在していると見ために紛らわしい。

個人的には常に左側の「命令1文で中括弧あり」を使う方が誤解の余地がないので好みである。
少なくも混在させるのは避けた方が無難であろう。



←第七回課題第八回-02 メインメモリとは何か→

非情報系学生のための C/C++ 入門に戻る