以下の問に答えよ。
以下のプログラムは動作はする(はずだ)がインデンテーションが滅茶苦茶である。 (つまり、プログラマが恐らく意図している通りには動かない。) プログラミングのインデンテーションの約束事に厳密に従って(特に 5 番目のルール「選択されたり、繰り返したりされる文が一つだけの場合も、ブレース({〜})に囲む」に注意)、 プログラムの意味が変らないように(つまり、 プログラマのミスがあらわになるように)インデントしなおせ。 ブレース内の字下げは 4 文字分とせよ。
#include <stdio.h> int main(void) { int c, i; while ((c = getchar()) != EOF) for (i = 0; i < 3; i++) putchar(c); putchar('!'); putchar('\n'); return 0; }
下に示すように、段数 n を入力として受け取って、 奇数段目には 1 から n まで 1 つずつ増えていく数(を10で割った余り)を 偶数段目には n から 1 まで 1 つずつ減っていく数(を10で割った余り)を 表示して、与えられた段数の正方形を描くプログラムを作成せよ。
何段ですか:4 1234 4321 1234 4321
何段ですか:1 1
何段ですか:12 123456789012 210987654321 123456789012 210987654321 123456789012 210987654321 123456789012 210987654321 123456789012 210987654321 123456789012 210987654321
何段ですか:7 1234567 7654321 1234567 7654321 1234567 7654321 1234567
参考にするプログラム: List 4-12
月日を入力する関数 inputDate を定義する。 まず、「月(1 から 12 の整数)を入力して下さい: 」というメッセージを出力して、 1 から 12 の範囲の整数として「月」を読込み(範囲外の整数が入力されたときは、 もう一度メッセージを出力して読み込むところに戻る。 1 から 12 が入力されるまで何度でも繰り返す。) 次に、「日(1 から 31 の整数)を入力して下さい: 」というメッセージを出力して、 1 から 31 の範囲の整数として「日」を読込み(範囲外の整数が入力されたときは、 もう一度メッセージを出力して読み込むところに戻る。 1 から 31 が入力されるまで何度でも繰り返す。) 「月」×100 + 「日」を返す、引数のない関数 int inputDate(void) を定義せよ。 つまり、12 と 31 がこの順に入力されたときは 1231 を返し、 4 と 1 がこの順に入力されたときは 401 を返す。
なお、2月30日や 4月31日などが入力できてしまうが、 今回の問題ではそれで構わない。
main 関数は、以下のコードを使用して、確認せよ。
/* … 略 … */ int main(void) { int m = inputDate(); printf("あなたが入力した日付は %d 月 %d 日です。\n", m / 100, m % 100); return 0; }
出力例は、以下のようになる。
実行例 1:月(1 から 12 の整数)を入力して下さい: 2 日(1 から 31 の整数)を入力して下さい: 10 あなたが入力した日付は 2 月 10 日です。実行例 2:
月(1 から 12 の整数)を入力して下さい: 13 月(1 から 12 の整数)を入力して下さい: 10 日(1 から 31 の整数)を入力して下さい: 24 あなたが入力した日付は 10 月 24 日です。実行例 3:
月(1 から 12 の整数)を入力して下さい: 1 日(1 から 31 の整数)を入力して下さい: 0 日(1 から 31 の整数)を入力して下さい: 1 あなたが入力した日付は 1 月 1 日です。実行例 4:
月(1 から 12 の整数)を入力して下さい: 13 月(1 から 12 の整数)を入力して下さい: 12 日(1 から 31 の整数)を入力して下さい: 32 日(1 から 31 の整数)を入力して下さい: 31 あなたが入力した日付は 12 月 31 日です。
要素数 no の 2 つのint 型の配列 va, vb を受け取り、 va[0]に vb[0] を、 va[i]に vb[i] - vb[i - 1] (i が 1,…, (no - 1)のとき) を代入する関数 void calcDiff(int va[], const int vb[], int no) を定義せよ。
main 関数は、次のように元の配列と calcDiff を適用した結果を表示するようにせよ。
#include <stdio.h> #define N … /* calcDiff の定義 */ void printArr(int arr[], int no) { int j; printf("{"); for (j = 0; j < no; j++) { printf("%d, ", arr[j]); } printf("};\n"); } int main(void) { int i; int orig[N] = { … }; int dest[N]; printf("orig = "); printArr(orig, N); calcDiff(dest, orig, N); printf("dest = "); printArr(dest, N); return 0; }
実行例 1:
#define N 10 int orig[N] = { 3, 7, -4, 2, 8, 6, -9, 1, 5, 0 };
の場合、
orig = {3, 7, -4, 2, 8, 6, -9, 1, 5, 0, }; dest = {3, 4, -11, 6, 6, -2, -15, 10, 4, -5, };
実行例 2:
#define N 5 int orig[N] = { 1, 2, -3, -4, 5 };
の場合、
orig = {1, 2, -3, -4, 5, }; dest = {1, 1, -5, -1, 9, };
実行例 3:
#define N 3 int orig[N] = { 3, 2, 1 };
の場合、
orig = {3, 2, 1, }; dest = {3, -1, -1, };