double hoge (int n) { return 1.618 * n; }
以下のプログラムは動作はする(はずだ)がインデンテーションが滅茶苦茶である。 <%-- そして、誤解を招くおそれがある --%> 「プログラミング」のインデンテーションの約束事に厳密に従ってブレースを追加し、意味を変えずにインデントしなおせ。 ブレース({〜})内の字下げは 4 文字分とせよ。 特に 5 番目のルール:
if や for などでは、選択されたり、 繰り返したりされる文が一つだけの場合も、ブレース({〜})に囲む。に注意すること。 もちろんプログラムの動作は変えないこと。
#include <stdio.h> int main(void) { int i, j; for (i = 0; i < 10; i++) for (j = 0; j < i; j++) if (j % 3 == 0) printf("*"); else printf("&"); for (j = 0; j< i; j++) printf("#"); return 0; }
正解例は以下のようになる。
#include <stdio.h> int main(void) { int i, j; for (i = 0; i < 10; i++) { for (j = 0; j < i; j++) { if (j % 3 == 0) { printf("*"); } else { printf("&"); } } } for (j = 0; j< i; j++) { printf("#"); } return 0; }
下に示すように、段数を受け取って、数字、空白、* と # を繰返し表示して、与えられた段数の三角形を描くプログラムを作成せよ。 1 列目に行番号の下一桁の数字を表示し、2 列目の空白のあと、 上から 1 行目は * が 1 つ、2 行目は # が 2 つ、3 行目は * が 3 つ、… というように、奇数行目は *、偶数行目は # が行番号と同じ数だけ繰り返すようにせよ。
実行例 1:何段ですか:4 1 * 2 ## 3 *** 4 ####実行例 2:
何段ですか:7 1 * 2 ## 3 *** 4 #### 5 ***** 6 ###### 7 *******実行例 3:
何段ですか:12 1 * 2 ## 3 *** 4 #### 5 ***** 6 ###### 7 ******* 8 ######## 9 ********* 0 ########## 1 *********** 2 ############実行例 4:
何段ですか:0
参考にするプログラム: List 4-18
正解例は以下のようになる。
#include <stdio.h> int main(void) { int i, j, len; printf("何段ですか:"); scanf("%d", &len); for (i = 1; i <= len; i++) { char ch = i % 2 ? '*' : '#'; printf("%d " , i % 10); for (j = 1; j <= i; j++) { putchar(ch); } putchar('\n'); } return 0; }
秘密のルールを知っていなければ、整数を入力できない関数 foo を定義する。 つまり、2 つの整数の入力を読込み、2 つの数の和が 9999 のときは、 1 つめに入力された整数を返し、2 つの数の和が 9999 以外のときは、 2 つの整数の入力の読込みを繰り返す関数 int foo(void) を定義せよ。
なお、main関数は、以下のコードを使用して、確認せよ。
/* … 略 … */ int main(void) { int m = foo(); printf("あなたが入力した整数は %d です。\n", m); return 0; }
出力例は、以下のようになる。
実行例 1:整数1を入力してください: 1234 整数2を入力してください: 8765 あなたが入力した整数は 1234 です。実行例 2:
整数1を入力してください: 1111 整数2を入力してください: 7777 整数1を入力してください: 2222 整数2を入力してください: 7777 あなたが入力した整数は 2222 です。実行例 3:
整数1を入力してください: 0 整数2を入力してください: 9999 あなたが入力した整数は 0 です。実行例 4:
整数1を入力してください: 10000 整数2を入力してください: 0 整数1を入力してください: 10000 整数2を入力してください: -1 あなたが入力した整数は 10000 です。
正解例は以下のようになる。
#include <stdio.h> int foo(void) { int n1, n2; do { printf("整数1を入力してください: "); scanf("%d", &n1); printf("整数2を入力してください: "); scanf("%d", &n2); } while (n1 + n2 != 9999); return n1; } int main(void) { int m = foo(); printf("あなたが入力した整数は %d です。\n", m); return 0; }
int 型の配列 vc を受け取り vc の中の、vc の正の要素の最大値を返す関数 maxArr(const int vc[]) を作成せよ。 ただし、この関数は引数として配列の要素数を受け取らず、 0 または負の要素が現れたら、その直前の要素を配列の最後の要素と見なす。
なお、vc 中に正の要素がない場合は戻り値として 0 を返すようにせよ。
なお、テストデータは以下のコードの断片を使用して、結果を確認せよ。
#include <stdio.h> int maxArr(const int vc[]) { /* … ここを考える … */ } int vc1[] = {1, 6, 3, 4, 2, 5, -1}; int vc2[] = {8, 5, 6, 2, 3, 7, 3, 2, -1}; int vc3[] = {3, 7, 4, 12, 19, 2, 29, 31, -1}; int vc4[] = {-1}; int main(void) { printf("vc1 中の最大値は %d です。\n", maxArr(vc1)); printf("vc2 中の最大値は %d です。\n", maxArr(vc2)); printf("vc3 中の最大値は %d です。\n", maxArr(vc3)); printf("vc4 中の最大値は %d です。\n", maxArr(vc4)); return 0; }
この出力結果は、以下のようになる。
vc1 中 の最大値は 6 です。 vc2 中 の最大値は 8 です。 vc3 中 の最大値は 31 です。 vc4 中 の最大値は 0 です。
正解例は以下のようになる。
#include <stdio.h> int maxArr(const int vc[]) { int i; int max = 0; for (i = 0; vc[i] > 0; i++) { if (vc[i] > max) { max = vc[i]; } } return max; } int vc1[] = {1, 6, 3, 4, 2, 5, -1}; int vc2[] = {8, 5, 6, 2, 3, 7, 3, 2, -1}; int vc3[] = {3, 7, 4, 12, 19, 2, 29, 31, -1}; int vc4[] = {-1}; int main(void) { printf("vc1 中の最大値は %d です。\n", maxArr(vc1)); printf("vc2 中の最大値は %d です。\n", maxArr(vc2)); printf("vc3 中の最大値は %d です。\n", maxArr(vc3)); printf("vc4 中の最大値は %d です。\n", maxArr(vc4)); return 0; }