C言語入門 第2回実力試験 解答例
2014蟷エ10譛医h繧雁倶ココ縺ョ譁ケ繧貞ッセ雎。縺ォ縲ヾtudy C辟。譁呎署萓帙r髢句ァ九@縺セ縺励◆縲
C險隱槭r蜍牙シキ荳ュ縺ョ譁ケ縺ッ縲∝ュヲ鄙偵サ謨呵ご縺ォ譛驕ゥ縺ェC險隱槭う繝ウ繧ソ繝シ繝励Μ繧ソ縺ョStudy C繧剃スソ縺」縺ヲ縺ソ縺ヲ縺上□縺輔>(蛟倶ココ縺ョ譁ケ縺ッ辟。譁吶〒縺)縲
螟ァ蟄ヲ繝サ鬮伜ーゅサ鬮俶。縺ェ縺ゥ縺ョ謨呵ご讖滄未縺ァ縺ョ謗。逕ィ螳溽クセ繧ょ、壽焚縺ゅk繝ュ繝ウ繧ー繧サ繝ゥ繝シ蝠蜩ヾtudy C縺後∝倶ココ蜷代¢縺ォ辟。譁呎署萓帙r蟋九a縺セ縺励◆縲
繧、繝ウ繧ソ繝シ繝励Μ繧ソ縺ョ謇玖サス縺輔↓蜉縺医√ご繝シ繝繧3D繧ソ繝シ繝医Ν繧ー繝ゥ繝輔ぅ繝繧ッ縺ァ讌ス縺励¥蜍牙シキ縺励◆繧翫→縲,險隱槭ョ蟄ヲ鄙偵r蠑キ蜉帙↓繧オ繝昴シ繝医@縺セ縺吶
縺セ縺溘√%縺ョ繧医≧縺ェ繝懊ち繝ウ縺ョ逕ィ諢上&繧後※縺繧九壹シ繧ク縺ァ縺ッ縲∵軸霈峨@縺ヲ縺繧九励Ο繧ー繝ゥ繝繧担tudy C縺ォ逶エ謗・繝ュ繝シ繝峨@螳溯。後@縺溘j縺吶k縺薙→縺後〒縺阪∪縺吶
Study C辟。譁吝茜逕ィ縺ォ縺、縺縺ヲ縺ョ隧ウ邏ー縺ッ縲√%縺ョ繝壹シ繧ク繧貞盾辣ァ縺励※縺上□縺輔>縲
2-1. 配列(配列のサイズは5にします)の各要素に1から5を代入し、printf()で各要素の 内容を表示してみましょう。
[解答例]main() { int data[5]; data[0] = 1; data[1] = 2; data[2] = 3; data[3] = 4; data[4] = 5; printf("data[0] = %d\n", data[0]); printf("data[1] = %d\n", data[1]); printf("data[2] = %d\n", data[2]); printf("data[3] = %d\n", data[3]); printf("data[4] = %d\n", data[4]); }
main() { int n; int data[5]; for (n = 0; n < 5; n++) { data[n] = n + 1; } for (n = 0; n < 5; n++) { printf("data[%d] = %d\n", n, data[n]); } }
2-2. 2-1を配列の最後の要素から表示するように書き換えてみましょう。
[解答例]main() { int data[5]; data[0] = 1; data[1] = 2; data[2] = 3; data[3] = 4; data[4] = 5; printf("data[4] = %d\n", data[4]); printf("data[3] = %d\n", data[3]); printf("data[2] = %d\n", data[2]); printf("data[1] = %d\n", data[1]); printf("data[0] = %d\n", data[0]); }
ループを使った場合
main() { int n; int data[5]; for (n = 0; n < 5; n++) { data[n] = n + 1; } for (n = 0; n < 5; n++) { printf("data[%d] = %d\n", 4-n, data[4-n]); } }
for文のパラメータを変更して表示させることもできます。
main() { int n, data[5]; for (n = 0; n < 5; n++) { data[n] = n+1; } for (n = 4; n >= 0; n--) { printf("data[%d] = %d\n", n, data[n]); } }
2-3. 2-1を配列の各要素に10を加えてから表示するように書き換えてみましょう。
[解答例]main() { int n; int data[10]; for (n = 0; n < 10; n++) { data[n] = n + 1; } for (n = 0; n < 10; n++) { printf("%d\n", data[n]); } }
2-4. 次のプログラムに平均値を表示する機能を付け加えてみましょう。
[解答例]int print_bar(int); main() { int i, sum, mean, data[5]; sum = 0; mean = 0; for (i = 0; i < 5; i++) { printf("input data %d: ", i); scanf("%d", &data[i]); } for (i = 0; i < 5; i++) { print_bar(data[i]); } for (i = 0; i < 5; i++) { sum = sum+data[i]; } printf("SUM = %d, MEAN = %d\n", sum, sum/5); } print_bar(n) int n; { int i; for (i = 0; i < n; i++) { printf("*"); } printf("\n"); }
2-5. forループとputchar()を使いAからZを表示させてみましょう。
[解答例]main() { int i; for (i = 0; i < 26; i++) { putchar('A'+i); } }
26という数字は計算でも求めることができます。
main() { int i; for (i = 0; i < 'Z'-'A'+1; i++) { putchar( 'A'+i ); } }
2-6. 2-5と同じ方法でaからzを表示させてみましょう。
[解答例]main() { int i; for (i = 0; i < 26; i++) { putchar('a'+i); } }
2-7. 2-5を文字とそのアスキーコード(10進数で)が表示されるように書き換えてみましょう。
[解答例]main() { int i; for (i = 0; i < 26; i++) { printf("%d:%c\n", 'A'+i, 'A'+i); } }
2-8. 次のアスキーコード表を表示するプログラムをforループとprintf()で作ってみましょう。 printfで16進数を表示させるには%dの代わりに%xを使います。
10進 16進 文字10進 16進 文字10進 16進 文字 ------------------------------------------------ 32 0x20 64 0x40 @ 96 0x60 ` 33 0x21 ! 65 0x41 A 97 0x61 a 34 0x22 " 66 0x42 B 98 0x62 b 35 0x23 # 67 0x43 C 99 0x63 c 36 0x24 $ 68 0x44 D 100 0x64 d 37 0x25 % 69 0x45 E 101 0x65 e 38 0x26 & 70 0x46 F 102 0x66 f 39 0x27 ' 71 0x47 G 103 0x67 g 40 0x28 ( 72 0x48 H 104 0x68 h 41 0x29 ) 73 0x49 I 105 0x69 i 42 0x2a * 74 0x4a J 106 0x6a j 43 0x2b + 75 0x4b K 107 0x6b k 44 0x2c , 76 0x4c L 108 0x6c l 45 0x2d - 77 0x4d M 109 0x6d m 46 0x2e . 78 0x4e N 110 0x6e n 47 0x2f / 79 0x4f O 111 0x6f o 48 0x30 0 80 0x50 P 112 0x70 p 49 0x31 1 81 0x51 Q 113 0x71 q 50 0x32 2 82 0x52 R 114 0x72 r 51 0x33 3 83 0x53 S 115 0x73 s 52 0x34 4 84 0x54 T 116 0x74 t 53 0x35 5 85 0x55 U 117 0x75 u 54 0x36 6 86 0x56 V 118 0x76 v 55 0x37 7 87 0x57 W 119 0x77 w 56 0x38 8 88 0x58 X 120 0x78 x 57 0x39 9 89 0x59 Y 121 0x79 y 58 0x3a : 90 0x5a Z 122 0x7a z 59 0x3b ; 91 0x5b [ 123 0x7b { 60 0x3c < 92 0x5c \ 124 0x7c | 61 0x3d = 93 0x5d ] 125 0x7d } 62 0x3e > 94 0x5e ^ 126 0x7e ~ 63 0x3f ? 95 0x5f _ 127 0x7f
main() { int i; printf("10進 16進 文字10進 16進 文字10進 16進 文字\n"); printf("------------------------------------------------\n"); for (i = 0; i < 32; i++) { printf(" %d 0x%x %c", 32+i, 32+i, 32+i); printf(" %d 0x%x %c", 64+i, 64+i, 64+i); if(96+i < 100) putchar(' '); if(96+i == 127) printf(" %d 0x%x %c\n", 96+i, 96+i, ' '); else printf(" %d 0x%x %c\n", 96+i, 96+i, 96+i); } }
printfの機能で桁数を指定することもできます。
main() { int i; printf("10進 16進 文字10進 16進 文字10進 16進 文字\n"); printf("------------------------------------------------\n"); for (i = 0; i < 32; i++) { printf(" %d 0x%x %c", 32+i, 32+i, 32+i); printf(" %3d 0x%x %c", 64+i, 64+i, 64+i); if(96+i == 127) printf(" %3d 0x%x %c\n", 96+i, 96+i, ' '); else printf(" %3d 0x%x %c\n", 96+i, 96+i, 96+i); } }
2-9. scanf()で入力した文字列の長さを調べ5文字以下ならshort、それより長ければ longと表示するプログラムを作ってみましょう。
[解答例]main() { char str[80]; scanf("%s", str); if (strlen(str) <= 5){ printf("short\n"); } else{ printf("long\n"); } }
2-10. 次のプログラムの合格点60をマクロ定義に変えてみましょう。 また、得点はscanf()で入力できるようにします。
[解答例]#define BORDER_LINE 60 main() { int tokuten; printf("INPUT : "); scanf("%d", &tokuten); if (tokuten >= BORDER_LINE) { printf("goukaku"); } if (tokuten < BORDER_LINE) { printf("fugoukaku"); } }
2-11. マクロは文字列や文字定数を置き換えることもできます。文字列をマクロで 置き換えてprintf()で表示してみましょう。
[解答例]#define STRING "Test string" main() { printf( STRING ); }
2-12. 文字定数をマクロで置き換えてputchar()で表示してみましょう。
[解答例]#define CHARACTER1 'c' #define CHARACTER2 'h' #define CHARACTER3 'a' #define CHARACTER4 'r' main() { putchar(CHARACTER1); putchar(CHARACTER2); putchar(CHARACTER3); putchar(CHARACTER4); }
2-13. カッコで囲んだ式(1+2)をマクロで置き換え、マクロ名を2倍にした結果を表示してみましょう。
[解答例]#define TEST (1+2) main() { printf("%d\n", TEST*2); }
2-14. カッコで囲まれていない式1+2をマクロで置き換え、マクロ名を2倍にした結果を表示してみましょう(2-13と結果がことなる理由を考えて見ましょう)。
[解答例]#define TEST 1+2 main() { printf("%d\n", TEST*2); }
2-15. グローバル変数を宣言して関数main()で代入した値が、他の関数から参照できることを確認してみましょう。
[解答例]int g; func() { printf( "g = %d\n", g ); } main() { g = 10; func(); }
2-16. 2-15の呼び出された関数でもグローバル変数に代入し、関数main()で値が変化しているかを確認してみましょう。
[解答例]int g; func() { printf( "func() : g = %d\n", g ); g = 100; } main() { g = 10; func(); printf( "main() : g = %d\n", g ); }
2-17. 2-16でグローバル変数と同じ名前のローカル変数を宣言して、その影響を観察してみましょう。
[解答例]int g; func() { int g; printf( "func() : g = %d\n", g ); g = 100; } main() { g = 10; func(); printf( "main() : g = %d\n", g ); }
2-18. 次のプログラムを参考にして直方体の3辺から体積と表面積を計算する関数を作ってみましょう。
[解答例]int a, b; func(x, y, z) int x, y, z; { a = x * y * z; b = x * y * 2 + x * z * 2 + y * z * 2; } main() { func(10, 3, 4); printf("%d\n%d\n", a, b); }
2-19. 次のプログラムの変数sumをグローバル変数に書き換えてみましょう。 また、sumの最初の値に100を代入しておきます(結果は110になります)。
[解答例]int sum; add(n) int n; { sum += n; return (sum); } main() { sum = 100; add(1); add(2); add(3); printf("%d\n", add(4)); }
2-20. while文を使って文字列" Study "を20回表示してみましょう。
[解答例]main() { int i; i = 0; while (i < 20) { printf("Study "); i++; } }
2-21. while文を使って 1, 2, 3, ・・・, 20 と表示してみましょう。
[解答例]main() { int i; i = 0; while (i < 20) { printf("%d ", i+1); i++; } }
次のように書くこともできます。
main() { int i; i = 1; while (i <= 20) { printf("%d ", i); i++; } }
2-22. while文を使って 2, 4, 6, ・・・, 40 と表示してみましょう。
[解答例]main() { int i; i = 0; while (i < 20) { printf("%d ", (i+1)*2); i++; } }
main() { int i; i = 1; while (i <= 20) { printf("%d ", i*2); i++; } }
2-23. do...while文を使って2-20から2-22を書き換えてみましょう。
[解答例]main() { int i; i = 0; do{ printf("Study "); i++; }while (i < 20); }
main() { int i; i = 0; do{ printf("%d ", i+1); i++; }while (i < 20); }
main() { int i; i = 0; do{ printf("%d ", (i+1)*2); i++; }while (i < 20); }
2-24. for、if、break文を使って2-20から2-22を書き換えてみましょう。 for文は無限ループ(for(;;))で使用します。
[解答例]main() { int i; i = 0; for (;;) { printf("Study "); i++; if(i >= 20){ break; } } }
main() { int i; i = 0; for (;;) { printf("%d ", i+1); i++; if(i >= 20){ break; } } }
main() { int i; i = 0; for (;;) { printf("%d ", (i+1)*2); i++; if(i >= 20){ break; } } }
2-25. 次のプログラムをoneからtenまで表示できるように書き換えてみましょう。
[解答例]main() { int i; printf("INPUT:"); scanf("%d", &i); switch (i) { case 1: printf("one"); break; case 2: printf("two"); break; case 3: printf("three"); break; case 4: printf("four"); break; case 5: printf("five"); break; case 6: printf("six"); break; case 7: printf("seven"); break; case 8: printf("eight"); break; case 9: printf("nine"); break; case 10: printf("ten"); break; default: printf("difficult"); break; } }