このページは 2011年度プログラミングⅠのオンライン期末テスト(過去問)です。
試験時間は 90分(16:20〜17:50)とする。
教科書・プリント・参考書などは持ち込み可能である。
(量に特に制限はないが、隣の人の領域を侵犯しないようすること。
また、テスト中の物品の貸し借りは禁止する。)
使用できるソフトは、ブラウザ(Firefox推奨・Internet Explorer非推奨)、 エディタ(メモ帳・MkEditorなど)、 コマンドプロンプト (およびその中での cl, cd, dir などの C言語のコンパイルと実行に必要なコマンド)である。
不正行為の定義はペーパーでのテストに準じるものとする。つまり、
メール, チャット, Messenger, FTP, WinSCP などの通信系ソフトは使用禁止、
ブラウザも掲示板、Web メールなどの他人との通信が可能なページは閲覧禁止
(もちろん課題提出用ページは除く)、
stfile のネットワークフォルダも使用禁止とする。
(Google, Yahoo など検索系のページは利用しても構わない。)
李下に冠を正さず、瓜田に履を納れず、の意味で、Skype など常駐するようになっている通信系のソフトも、完全に終了しておくこと。
私語や携帯電話の使用などペーパーテストで禁止されていることは、オンラインテストでも禁止である。
以下の問に答えよ。
以下のプログラムは動作はする(はずだ)がインデンテーションが滅茶苦茶である。 プログラミングのインデンテーションの約束事に厳密に従って、ブレースを追加しインデントしなおせ。 ブレース({〜})内の字下げは4文字分とせよ。 特に 5番目のルール
ifやforなどでは、選択されたり、 繰り返したりされる文が一つだけの場合も、ブレース({〜})に囲む。に注意すること。 もちろんプログラムの動作は変えないこと。
#include <stdio.h> int main(void) { int i=1; while (i<20) if (i++%5==0) printf("%d ", i+1); printf("%d ", i-1); return 0; }
下に示すように、段数を受け取って、1234567890を繰返し表示して、 与えられた段数の三角形を描くプログラムを作成せよ。
何段ですか:3 1 23 456
何段ですか:7 1 23 456 7890 12345 678901 2345678
何段ですか:12 1 23 456 7890 12345 678901 2345678 90123456 789012345 6789012345 67890123456 789012345678
参考にするプログラム: List 4-18
int型の引数 nを受け取り、 以下のように出力する関数 void foo(int n)を定義せよ。
1から nまでの数を順に空白で区切って出力する。
2で割り切れる数には!を後ろに付ける。
3で割り切れる数にも!を後ろに付ける。
ただし、2でも3でも割り切れる数には何も後ろに付けない。
(以上の要件の一部を満たすだけで、部分点がつく場合もある。)
なお、main関数は、以下のコードを使用して、確認せよ。
/* … 略 … */ int main(void) { int n; do { printf("正の整数を入力してください: "); scanf("%d", &n); } while (n<=0); foo(n); putchar('\n'); return 0; }
出力例は、以下のようになる。
正の整数を入力してください: 10 1 2! 3! 4! 5 6 7 8! 9! 10!
正の整数を入力してください: 20 1 2! 3! 4! 5 6 7 8! 9! 10! 11 12 13 14! 15! 16! 17 18 19 20!
int型の配列 vcとその要素数 nを受け取り vcの中の、4で割ると 3余る整数の現れる添字を、 空白で区切ってすべて出力する関数 void fuga(const int vc[], int n)を作成せよ。 (なお、面倒なので,配列中の整数はすべて正と考えてよい。)
なお、テストデータは以下のコードの断片を使用して、結果を確認せよ。
#include <stdio.h> void fuga(const int vc[], int n) { /* … ここを考える … */ } int vc1[] = {1, 2, 3, 4, 5, 6}; int vc2[] = {2, 4, 6, 8, 10, 12}; int vc3[] = {10, 13, 16, 19, 22, 25}; int vc4[] = {3, 7, 11, 15, 19, 23}; int main(void) { printf("vc1中の条件を満たす要素の添字は、"); fuga(vc1, sizeof(vc1)/sizeof(vc1[0])); printf("です。\n"); printf("vc2中の条件を満たす要素の添字は、"); fuga(vc2, sizeof(vc2)/sizeof(vc2[0])); printf("です。\n"); printf("vc3中の条件を満たす要素の添字は、"); fuga(vc3, sizeof(vc3)/sizeof(vc3[0])); printf("です。\n"); printf("vc4中の条件を満たす要素の添字は、"); fuga(vc4, sizeof(vc4)/sizeof(vc4[0])); printf("です。\n"); return 0; }
この出力結果は、以下のようになる。 (空白の入り方などは、この通りでなくてもよい。)
vc1中の条件を満たす要素の添字は、 2です。 vc2中の条件を満たす要素の添字は、です。 vc3中の条件を満たす要素の添字は、 3です。 vc4中の条件を満たす要素の添字は、 0 1 2 3 4 5です。
参考にするプログラム: (あえて言えば) List 6-13