double foo (double d) { return 0.5 * d + 2.5; }
インデンテーションの間違いが依然多い。間違いの程度によるが 20% 程度減点している。
以下のプログラムは動作はする(はずだ)がインデンテーションが滅茶苦茶である。 「プログラミング」のインデンテーションの約束事に厳密に従ってブレースを追加し、意味を変えずにインデントしなおせ。 ブレース({〜})内の字下げは 4 文字分とせよ。 特に 5 番目のルール:
if や for などでは、選択されたり、 繰り返したりされる文が一つだけの場合も、ブレース({〜})に囲む。に注意すること。 もちろんプログラムの動作は変えないこと。
#include <stdio.h> int main(void) { int i; for (i = 0; i < 20; i++) if (i%5 == 0) printf("%d ", i+1); if (i%2 == 0) printf("%d ", i-1); else printf("%d ", i*2); return 0; }
正解例は以下のようになる。
#include <stdio.h> int main(void) { int i; for (i = 0; i < 20; i++) { if (i%5 == 0) { printf("%d ", i+1); } } if (i%2 == 0) { printf("%d ", i-1); } else { printf("%d ", i*2); } return 0; }
for は最初の if にしかかかっていないことに注意する。
次のような解答が多かったが、プログラムの意味が変わってしまっており、 もちろん間違いである。
/* 大変多かった間違い */
#include <stdio.h>
int main(void) {
int i;
for (i = 0; i < 20; i++) {
if (i%5 == 0) {
printf("%d ", i+1);
}
if (i%2 == 0) {
printf("%d ", i-1);
} else {
printf("%d ", i*2);
}
}
return 0;
}
下に示すように、段数を受け取って、* を繰返し表示して、 与えられた段数の三角形を描くプログラムを作成せよ。 1 行目は * が 1 つ、2 行目は 3 つ、3 行目は 5 つ、… というように、2つずつ * の数が増えていくようにせよ。
実行例 1:何段ですか:3 * *** *****実行例 2:
何段ですか:7 * *** ***** ******* ********* *********** *************実行例 3:
何段ですか:12 * *** ***** ******* ********* *********** ************* *************** ***************** ******************* ********************* ***********************実行例 4:
何段ですか:0
参考にするプログラム: List 4-18
正解例は以下のようになる。
#includeint main(void) { int i, j, len; printf("何段ですか:"); scanf("%d", &len); for (i = 1; i <= len; i++) { for (j = 1; j <= 2 * i - 1; j++) { putchar('*'); } putchar('\n'); } return 0; }
特に目立った間違いはなかった。
int 型の引数 m, n を受け取り、 以下のように出力する関数 void foo(int m, int n) を定義せよ。
m ≤ n のとき、m から n
までの数(m, n を含む)を順に空白で区切って出力する。
(m > n のときは何も出力しない。)
2 で割り切れる数には ! を後ろに付ける。
5 で割り切れる数には ? を後ろに付ける。
10 で割り切れる数には(!, ? に加えて) * を後ろに付ける。
(以上の要件の一部を満たすだけで、部分点がつく場合もある。)
なお、main関数は、以下のコードを使用して、確認せよ。
/* … 略 … */ int main(void) { int m, n; printf("整数1を入力してください: "); scanf("%d", &m); printf("整数2を入力してください: "); scanf("%d", &n); foo(m, n); putchar('\n'); return 0; }
出力例は、以下のようになる。
実行例 1:整数1を入力してください: 1 整数2を入力してください: 10 1 2! 3 4! 5? 6! 7 8! 9 10!?*実行例 2:
整数1を入力してください: 10 整数2を入力してください: 10 10!?*実行例 3:
整数1を入力してください: -10 整数2を入力してください: 0 -10!?* -9 -8! -7 -6! -5? -4! -3 -2! -1 0!?*実行例 4:
整数1を入力してください: 10 整数2を入力してください: 0
正解例は以下のようになる。
void foo(int m, int n) { int i; for (i = m; i <= n; i++) { printf("%d", i); if (i%2 == 0) { putchar('!'); } if (i%5 == 0) { putchar('?'); } if (i%10 == 0) { putchar('*'); } printf(" "); } }
以下のように間違ったインデンテーションをしている解答が多い。
void foo(int m, int n) { int i; for (i = m; i <= n; i++) { printf("%d", i); if (i%2 == 0) { putchar('!'); } if (i%5 == 0) /* 間違ったインデンテーション */ { putchar('?'); } if (i%10 == 0) /* 間違ったインデンテーション */ { putchar('*'); } printf(" "); } }
インデンテーションについての約束事には、 次のように書かれている。
閉じブレース(})は if や switch, do, while, for などのキーワードのはじめの文字と列をそろえて書く。 その行には閉じブレース以外には何も書かない。
ただし、else … や do 〜 while 文の while … は閉じブレース(})と同じ行に続けてよい。(というより、同じ行に続ける方がよい。)
以下のように無駄な if 文がついている解答が多い。
void foo(int m, int n) { int i; if (m <= n) { /* 無駄な if 文 */ for (i = m; i <= n; i++) { printf("%d", i); if (i%2 == 0) { putchar('!'); } if (i%5 == 0) { putchar('?'); } if (i%10 == 0) { putchar('*'); } printf(" "); } } }
int 型の配列 vc を受け取り vc の中の、偶数の現れる添字を、 空白で区切ってすべて出力する関数 void fuga(const int vc[]) を作成せよ。 ただし、この関数は引数として配列の要素数を受け取らず、limits.h に定義されている INT_MIN の要素が現れたら、その直前の要素を配列の最後の要素と見なす。 (つまり、INT_MIN は偶数と見なさない。)
なお、テストデータは以下のコードの断片を使用して、結果を確認せよ。
#include <stdio.h> #include <limits.h> void fuga(const int vc[]) { /* … ここを考える … */ } int vc1[] = {1, 2, 3, 4, 5, 6, INT_MIN}; int vc2[] = {2, 4, 6, 8, 10, 12, 14, 16, INT_MIN}; int vc3[] = {3, 7, 11, 15, 19, 23, 29, 31, INT_MIN}; int vc4[] = {INT_MIN}; int main(void) { printf("vc1 中の条件を満たす要素の添字は、"); fuga(vc1); printf("です。\n"); printf("vc2 中の条件を満たす要素の添字は、"); fuga(vc2); printf("です。\n"); printf("vc3 中の条件を満たす要素の添字は、"); fuga(vc3); printf("です。\n"); printf("vc4 中の条件を満たす要素の添字は、"); fuga(vc4); printf("です。\n"); return 0; }
この出力結果は、以下のようになる。 (空白の入り方などは、この通りでなくてもよい。)
vc1中の条件を満たす要素の添字は、 1 3 5 です。 vc2中の条件を満たす要素の添字は、 0 1 2 3 4 5 6 7 です。 vc3中の条件を満たす要素の添字は、 です。 vc4中の条件を満たす要素の添字は、 です。
正解例は以下のようになる。
void fuga(const int vc[]) { int i; for (i = 0; vc[i] != INT_MIN; i++) { if (vc[i] % 2 == 0) { printf("%d ", i); } } }