CLab/2008-F05
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
* 第5回 前半総合 [#w0573375]
- ''基本課題''は,必ず授業時間中に終わらせること。
- ''★印の付いている問題''は,担当教員に見せて確認の印(ま...
- ''応用課題''は,終わらなかったら次週(1週間後の午前11:0...
- ''他人のコピーと判断されたものは正当な提出と認めない。'...
- プログラムのファイル名は,「問題番号.c」とすること。
-- 例: a1.c, ax3.c
- [[プログラムの提出のしかた>../提出]]をよく読むこと。
-- 提出URL http://vilab.org/upload/clab-upload.html
** 基本課題 [#jd8ac1d1]
*** 制御構造の応用 [#x8ffebdf]
''e1)'' 以下の式で定義される数列をa(1)からa(10)まで表示す...
>a(1) = 1~
a(2) = 1~
a(n) = a(n-1) + a(n-2) (n≧3のとき)
*** 配列の応用 [#o5abb907]
''e2)''★ まず,ともに要素数5個の整数配列aとbを定義し,キ...
''e3)''★ 下記のような勝ち点表(の数値部分)を表す2次元配...
||対ブラジル|対オーストラリア|対クロアチア| 対日本 |合...
|''ブラジル''|CENTER:0|CENTER:3|CENTER:3|CENTER:3||
|''オーストラリア''|CENTER:0|CENTER:0|CENTER:1|CENTER:3||
|''クロアチア''|CENTER:0|CENTER:1|CENTER:0|CENTER:1||
|''日本''|CENTER:0|CENTER:0|CENTER:1|CENTER:0||
> 【ポイント】 上の表と2次元配列point[][]の要素との対応は...
||対ブラジル|対オーストラリア|対クロアチア| 対日本 |合...
|''ブラジル''|CENTER:[0][0]|CENTER:[0][1]|CENTER:[0][2]|C...
|''オーストラリア''|CENTER:[1][0]|CENTER:[1][1]|CENTER:[1...
|''クロアチア''|CENTER:[2][0]|CENTER:[2][1]|CENTER:[2][2]...
|''日本''|CENTER:[3][0]|CENTER:[3][1]|CENTER:[3][2]|CENTE...
*** 関数の応用 [#yb9ba63f]
''e4)''★ double型の引数を取り,その絶対値を返す関数zettai...
- 関数呼び出しの関係は,main → f → zettai となる。
''e5)'' 自然数nに関して,以下の定義(nの階乗)で表される...
>n≧1のとき fact(n) = n・fact(n-1) &br;
n=0のとき fact(0) = 1
>【ポイント】 関数の中では自分自身の関数を呼ぶことも可能...
int fact(int n)
{
if (n >= 1) {
/* ここで fact(n-1) を使って計算する */
} else if (n == 0) {
/* ここは n=0 のときの計算をする */
} else {
/* あり得ない(止まらなくなる)のでエラー */
}
}
** 応用課題 [#jfaf3d4b]
''ex1)'' キーボードから0以上100未満の整数を複数読み込み,...
-個数を数えるカウンタを配列にする。たとえば1ケタの整数の...
''ex2)'' 2次元配列を用いて2×2の行列double A[2][2]とdouble...
''ex3)'' 半径を引数として円の面積を返す関数circleを作成し...
- 参考 〔円柱の体積〕=〔底面の円の面積〕×〔高さ〕
*** バブルソート [#h602cf3d]
配列の中身を順番に(小さい順や大きい順に)並べ替えること...
''準備)'' キーボードから10個の整数を要素とする配列aを読み...
|← ←i iの変化は9から1まで
0 1 2 3 4 5 6 7 8 9
a [__|__|__|__|__|__|__|__|__|__]
a[i-1]とa[i]を比較
''ex4)'' 以下に示すような動作をするプログラムを作成しなさ...
+ キーボードから10個の整数を読み込み,配列aに格納する。
+ a[9]からa[0]まで順々に隣同士の要素を比較し,前の要素が...
+ a[0]には最小値が格納されたので,次はa[9]からa[1]までに...
+ a[0]とa[1]は整列されたことになるので,a[9]からa[2]まで...
+ 以下同様に,すべてが整列し終わるまで交換処理を続ける。
+ 最後に結果(a[0]〜a[9])を表示する。
上のプログラムの動作の意味をよく考えて,どうして整列がで...
*** 2分探索法 [#vb17defc]
''準備)'' 以下に示すソースコードは,小さい順(昇順)に並...
int binary_search(int a[], int n, int m, int x)
{
int c;
if (【???】)
return -1; /* 探索範囲がない→探索失敗 */
c = (n + m) / 2; /* 真ん中の位置の計算 */
if (x < a[c]) {
/* xが真ん中の要素より小さい場合 */
return binary_search(a, n, c - 1, x);
} else if (【???】) {
/* xが真ん中の要素より大きい場合 */
return 【???】;
} else {
/* x == a[c] なので発見→発見位置を返す */
return c;
}
}
int main(void)
{
int a[] = { 1, 2, 4, 6, 8,
9, 12, 14, 17, 20,
25, 26, 28, 30, 32,
34, 35, 36, 39, 40 };
int x, index;
scanf("%d", &x);
index = binary_search(a, 0, 19, x);
if (index != -1)
printf("a[%d]=%d\n", index, a[index]);
else
printf("Not found.\n");
return 0;
}
''ex5)'' 上記の関数binary_searchを改造して,''大きい順(...
** 発展課題 [#ace618d0]
- 発展課題には''提出期限を設けない''ので,前回までの発展...
*** マインスイーパ [#je398c46]
''ez1)'' Windowsにも標準でついてくるゲーム「マインスイー...
''準備''
+ 2次元配列で9×9の盤面を用意する。たとえば,各マスの値に...
int board[9][9];
-- -1: まだ開けていなくて,何もない。
-- -2: まだ開けていなくて,地雷が隠されている。
-- 0〜8: 既に開いていて,周囲に地雷が0〜8個あることが分か...
+ まず,すべてのマス目をまだ開けていない状態にする。
for (x = 0; x < 9; x++) {
for (y = 0; y < 9; y++) {
board[x][y] = -1;
}
}
+ そして,ランダムな位置に地雷を10個埋設する。下記の例で...
for (i = 0; i < 10; i++) {
x = rand() % 9;
y = rand() % 9;
board[x][y] = -2;
}
''ゲーム''
+ 盤面を表示する。下記は数字で表示する例。
printf(" ");
for (x = 0; x < 9; x++) {
printf("%d ", x);
}
for (y = 0; y < 9; y++) {
printf("%d: ", y);
for (x = 0; x < 9; x++) {
if (board[x][y] < 0)
printf("- ");
else
printf("%d ", board[x][y]);
}
printf("\n");
}
+ キーボードから座標 (x, y) を読み込む。
+ 座標位置が地雷だったらゲームオーバー。
if (board[x][y] == -2) { ...
+ 座標位置が地雷でなく,まだ開いていなかったら,周りの8つ...
else if (board[x][y] == -1) { ...
+ 地雷以外のすべてのマス目が開いたら攻略成功。
盤面の大きさを変えたり,地雷の目印に旗を立てて,旗と地雷...
終了行:
* 第5回 前半総合 [#w0573375]
- ''基本課題''は,必ず授業時間中に終わらせること。
- ''★印の付いている問題''は,担当教員に見せて確認の印(ま...
- ''応用課題''は,終わらなかったら次週(1週間後の午前11:0...
- ''他人のコピーと判断されたものは正当な提出と認めない。'...
- プログラムのファイル名は,「問題番号.c」とすること。
-- 例: a1.c, ax3.c
- [[プログラムの提出のしかた>../提出]]をよく読むこと。
-- 提出URL http://vilab.org/upload/clab-upload.html
** 基本課題 [#jd8ac1d1]
*** 制御構造の応用 [#x8ffebdf]
''e1)'' 以下の式で定義される数列をa(1)からa(10)まで表示す...
>a(1) = 1~
a(2) = 1~
a(n) = a(n-1) + a(n-2) (n≧3のとき)
*** 配列の応用 [#o5abb907]
''e2)''★ まず,ともに要素数5個の整数配列aとbを定義し,キ...
''e3)''★ 下記のような勝ち点表(の数値部分)を表す2次元配...
||対ブラジル|対オーストラリア|対クロアチア| 対日本 |合...
|''ブラジル''|CENTER:0|CENTER:3|CENTER:3|CENTER:3||
|''オーストラリア''|CENTER:0|CENTER:0|CENTER:1|CENTER:3||
|''クロアチア''|CENTER:0|CENTER:1|CENTER:0|CENTER:1||
|''日本''|CENTER:0|CENTER:0|CENTER:1|CENTER:0||
> 【ポイント】 上の表と2次元配列point[][]の要素との対応は...
||対ブラジル|対オーストラリア|対クロアチア| 対日本 |合...
|''ブラジル''|CENTER:[0][0]|CENTER:[0][1]|CENTER:[0][2]|C...
|''オーストラリア''|CENTER:[1][0]|CENTER:[1][1]|CENTER:[1...
|''クロアチア''|CENTER:[2][0]|CENTER:[2][1]|CENTER:[2][2]...
|''日本''|CENTER:[3][0]|CENTER:[3][1]|CENTER:[3][2]|CENTE...
*** 関数の応用 [#yb9ba63f]
''e4)''★ double型の引数を取り,その絶対値を返す関数zettai...
- 関数呼び出しの関係は,main → f → zettai となる。
''e5)'' 自然数nに関して,以下の定義(nの階乗)で表される...
>n≧1のとき fact(n) = n・fact(n-1) &br;
n=0のとき fact(0) = 1
>【ポイント】 関数の中では自分自身の関数を呼ぶことも可能...
int fact(int n)
{
if (n >= 1) {
/* ここで fact(n-1) を使って計算する */
} else if (n == 0) {
/* ここは n=0 のときの計算をする */
} else {
/* あり得ない(止まらなくなる)のでエラー */
}
}
** 応用課題 [#jfaf3d4b]
''ex1)'' キーボードから0以上100未満の整数を複数読み込み,...
-個数を数えるカウンタを配列にする。たとえば1ケタの整数の...
''ex2)'' 2次元配列を用いて2×2の行列double A[2][2]とdouble...
''ex3)'' 半径を引数として円の面積を返す関数circleを作成し...
- 参考 〔円柱の体積〕=〔底面の円の面積〕×〔高さ〕
*** バブルソート [#h602cf3d]
配列の中身を順番に(小さい順や大きい順に)並べ替えること...
''準備)'' キーボードから10個の整数を要素とする配列aを読み...
|← ←i iの変化は9から1まで
0 1 2 3 4 5 6 7 8 9
a [__|__|__|__|__|__|__|__|__|__]
a[i-1]とa[i]を比較
''ex4)'' 以下に示すような動作をするプログラムを作成しなさ...
+ キーボードから10個の整数を読み込み,配列aに格納する。
+ a[9]からa[0]まで順々に隣同士の要素を比較し,前の要素が...
+ a[0]には最小値が格納されたので,次はa[9]からa[1]までに...
+ a[0]とa[1]は整列されたことになるので,a[9]からa[2]まで...
+ 以下同様に,すべてが整列し終わるまで交換処理を続ける。
+ 最後に結果(a[0]〜a[9])を表示する。
上のプログラムの動作の意味をよく考えて,どうして整列がで...
*** 2分探索法 [#vb17defc]
''準備)'' 以下に示すソースコードは,小さい順(昇順)に並...
int binary_search(int a[], int n, int m, int x)
{
int c;
if (【???】)
return -1; /* 探索範囲がない→探索失敗 */
c = (n + m) / 2; /* 真ん中の位置の計算 */
if (x < a[c]) {
/* xが真ん中の要素より小さい場合 */
return binary_search(a, n, c - 1, x);
} else if (【???】) {
/* xが真ん中の要素より大きい場合 */
return 【???】;
} else {
/* x == a[c] なので発見→発見位置を返す */
return c;
}
}
int main(void)
{
int a[] = { 1, 2, 4, 6, 8,
9, 12, 14, 17, 20,
25, 26, 28, 30, 32,
34, 35, 36, 39, 40 };
int x, index;
scanf("%d", &x);
index = binary_search(a, 0, 19, x);
if (index != -1)
printf("a[%d]=%d\n", index, a[index]);
else
printf("Not found.\n");
return 0;
}
''ex5)'' 上記の関数binary_searchを改造して,''大きい順(...
** 発展課題 [#ace618d0]
- 発展課題には''提出期限を設けない''ので,前回までの発展...
*** マインスイーパ [#je398c46]
''ez1)'' Windowsにも標準でついてくるゲーム「マインスイー...
''準備''
+ 2次元配列で9×9の盤面を用意する。たとえば,各マスの値に...
int board[9][9];
-- -1: まだ開けていなくて,何もない。
-- -2: まだ開けていなくて,地雷が隠されている。
-- 0〜8: 既に開いていて,周囲に地雷が0〜8個あることが分か...
+ まず,すべてのマス目をまだ開けていない状態にする。
for (x = 0; x < 9; x++) {
for (y = 0; y < 9; y++) {
board[x][y] = -1;
}
}
+ そして,ランダムな位置に地雷を10個埋設する。下記の例で...
for (i = 0; i < 10; i++) {
x = rand() % 9;
y = rand() % 9;
board[x][y] = -2;
}
''ゲーム''
+ 盤面を表示する。下記は数字で表示する例。
printf(" ");
for (x = 0; x < 9; x++) {
printf("%d ", x);
}
for (y = 0; y < 9; y++) {
printf("%d: ", y);
for (x = 0; x < 9; x++) {
if (board[x][y] < 0)
printf("- ");
else
printf("%d ", board[x][y]);
}
printf("\n");
}
+ キーボードから座標 (x, y) を読み込む。
+ 座標位置が地雷だったらゲームオーバー。
if (board[x][y] == -2) { ...
+ 座標位置が地雷でなく,まだ開いていなかったら,周りの8つ...
else if (board[x][y] == -1) { ...
+ 地雷以外のすべてのマス目が開いたら攻略成功。
盤面の大きさを変えたり,地雷の目印に旗を立てて,旗と地雷...
ページ名: