CLab/2008-F06
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
* 第6回 ポインタ [#cc472feb]
- ''基本課題''は,必ず授業時間中に終わらせること。
- ''★印の付いている問題''は,担当教員に見せて確認の印(ま...
- ''応用課題''は,終わらなかったら次週(1週間後の午前11:0...
- ''他人のコピーと判断されたものは正当な提出と認めない。'...
- プログラムのファイル名は,「問題番号.c」とすること。
-- 例: a1.c, ax3.c
- [[プログラムの提出のしかた>../提出]]をよく読むこと。
-- 提出URL http://vilab.org/upload/clab-upload.html
** 基本課題 [#te71ccdf]
*** ポインタ [#aa0a1e27]
''f1)'' char型の配列 str[9] = "TAMAGAWA" を定義し,その各...
> 【ポイント】 変数の''アドレス(メモリ内での格納番地)'...
int n;
printf("%p\n", &n);
''f2)''★ まず,int型の変数a,bに適当な整数を代入しておく...
> 【ポイント】 ポインタ(アドレス値)の頭に「*」演算子を...
int n, m;
int *p;
p = &n;
*p = 3; /* n = 3 と書くのと同じ意味になる */
m = *p; /* m = n と書くのと同じ意味になる */
''f3)''★ int型の配列array[10]とint型へのポインタptrを定義...
int array[10]; /* int型の配列 */
int *ptr; /* int型へのポインタ */
以下は''ダメな例''である。
scanf("%d", &array[i]); /* ← ダメ! */
array[i] = ...なんか...; /* ← ダメ! */
> 【ポイント】 ポインタは必ず変数などのある有効なメモリ...
''f4)'' まず,char型の配列strとポインタptrを定義し,strに...
> 【ポイント】 C言語ではほとんどの場合,配列の名前はその...
*(x + i) == x[i]
このとき,iは整数ならば正でも負でもよい。よって,ptr[-1] ...
''f5)''★ 2つの整数x,yを引数に取り,商と余りを同時にもと...
int divide(int x, int y, int *sho, int *amari);
使用例
int a, b, ok;
ok = divide(5, 3, &a, &b);
if (ok)
printf("商 %d 余り %d\n", a, b);
else
printf("0では割れません");
> 【ポイント】 C言語の関数呼び出しは値渡し(call by valu...
- 参考 http://wisdom.sakura.ne.jp/programming/c/c31.html
** 応用課題 [#va9899f1]
''fx1)'' キーボードから文字列strを読み込み,strの中を指す...
Tamagawa
amagawa
magawa
agawa
gawa
awa
wa
a
''fx2)'' 長さ10文字のchar型の配列fromとtoを定義する。キー...
> 【ポイント】 ポインタによる連続コピーでは,よく以下の...
*p++ = *q++;
''fx3)'' 整数型の変数へのポインタを2つ取り,それらの指す...
void swap(int *p, int *q);
使用例
int a = 3, b = 5;
printf("a=%d b=%d\n", a, b);
swap(&a, &b); /* aとbの交換 */
printf("a=%d b=%d\n", a, b);
''fx4)'' 2つの文字列を比較し,同じなら1,異なる場合は0を...
int strequal(char *str1, char *str2);
''fx5)'' キーボードから文字列patternとstringを読み込み,p...
** 発展課題 [#qff2277e]
- 発展課題には''提出期限を設けない''ので,前回までの発展...
*** ダンジョン探索 [#f1a8b80c]
''fz1)'' RPGシリーズということで,今度はダンジョン(地下...
主人公たちは村外れにたつ小さな古城にたどり着いた。言い伝...
ダンジョンの地図は2次元配列(グローバル変数)として用意し...
int map[7][7] = {
{ 9, 9, 9, 9, 9, 9, 9 },
{ 9, 1, 9, 0, 9, 5, 9 },
{ 9, 0, 9, 0, 2, 0, 9 },
{ 9, 0, 9, 0, 9, 9, 9 },
{ 9, 0, 0, 0, 2, 0, 9 },
{ 9, 0, 9, 0, 9, 7, 9 },
{ 9, 9, 9, 9, 9, 9, 9 } };
ここで,0〜9はそれぞれ次のものを表す(ここらへんは自由に...
-「0」通路
-「1」上り階段(外に脱出できる)
-「2」扉
-「5」十字架(吸血鬼を倒すためのアイテム)
-「7」吸血鬼(ボスキャラ)
-「9」壁(進めない)
また,主人公が地図上のそれぞれの記号を訪れた場合の関数を...
void passage() /* 通路 */
{
/* 何も起きない */
}
void stairway() /* 階段 */
{
/* 地上に脱出するかどうか質問する */
/* 吸血鬼を倒してから脱出すれば,ハッピーエンド */
}
void door() /* 扉 */
{
/* 何かメッセージを表示させるといいだろう */
}
void cross() /* 十字架 */
{
/* 宝箱があり,中に十字架が入っている */
/* 紙に書かれた謎々を解くと箱を開けられる */
}
void vampire() /* 吸血鬼 */
{
/* 吸血鬼に仲間にならないか誘われるが,断ると対決 */
/* 十字架を持っていれば勝つことができる */
}
プログラムは,ユーザに,主人公を東西南北(上下左右)どち...
printf("どちらの方向に進みますか?(1:東 2:西 3:南 4:北...
scanf("%d", &dir);
switch (dir) {
case 1:
if (map[y][x+1] != 9) x++;
break;
case 2:
if (map[y][x-1] != 9) x--;
break;
case 3:
if (map[y+1][x] != 9) y++;
break;
case 4:
if (map[y-1][x] != 9) y--;
break;
default
printf("その方向には進めません。\n");
/* エラー処理 */
}
switch (map[y][x]) {
case 0:
passage();
break;
case 1:
stairway();
break;
case 2:
door();
break;
case 5:
cross();
break;
case 7:
vampire();
break;
}
画面には,主人公の周囲の状況を表示するとよい。一例として...
- 文字表示の例
あなたは,いま上り階段にいます。
東は壁です。西は壁です。北は壁です。南は通路です。
どちらの方向に進みますか(東西南北)?
- マップ表示の例
■■■
■?■
■ ■ どちらの方向に進みますか(東西南北)?
吸血鬼に負けてしまった場合は,主人公も吸血鬼になってゲー...
終了行:
* 第6回 ポインタ [#cc472feb]
- ''基本課題''は,必ず授業時間中に終わらせること。
- ''★印の付いている問題''は,担当教員に見せて確認の印(ま...
- ''応用課題''は,終わらなかったら次週(1週間後の午前11:0...
- ''他人のコピーと判断されたものは正当な提出と認めない。'...
- プログラムのファイル名は,「問題番号.c」とすること。
-- 例: a1.c, ax3.c
- [[プログラムの提出のしかた>../提出]]をよく読むこと。
-- 提出URL http://vilab.org/upload/clab-upload.html
** 基本課題 [#te71ccdf]
*** ポインタ [#aa0a1e27]
''f1)'' char型の配列 str[9] = "TAMAGAWA" を定義し,その各...
> 【ポイント】 変数の''アドレス(メモリ内での格納番地)'...
int n;
printf("%p\n", &n);
''f2)''★ まず,int型の変数a,bに適当な整数を代入しておく...
> 【ポイント】 ポインタ(アドレス値)の頭に「*」演算子を...
int n, m;
int *p;
p = &n;
*p = 3; /* n = 3 と書くのと同じ意味になる */
m = *p; /* m = n と書くのと同じ意味になる */
''f3)''★ int型の配列array[10]とint型へのポインタptrを定義...
int array[10]; /* int型の配列 */
int *ptr; /* int型へのポインタ */
以下は''ダメな例''である。
scanf("%d", &array[i]); /* ← ダメ! */
array[i] = ...なんか...; /* ← ダメ! */
> 【ポイント】 ポインタは必ず変数などのある有効なメモリ...
''f4)'' まず,char型の配列strとポインタptrを定義し,strに...
> 【ポイント】 C言語ではほとんどの場合,配列の名前はその...
*(x + i) == x[i]
このとき,iは整数ならば正でも負でもよい。よって,ptr[-1] ...
''f5)''★ 2つの整数x,yを引数に取り,商と余りを同時にもと...
int divide(int x, int y, int *sho, int *amari);
使用例
int a, b, ok;
ok = divide(5, 3, &a, &b);
if (ok)
printf("商 %d 余り %d\n", a, b);
else
printf("0では割れません");
> 【ポイント】 C言語の関数呼び出しは値渡し(call by valu...
- 参考 http://wisdom.sakura.ne.jp/programming/c/c31.html
** 応用課題 [#va9899f1]
''fx1)'' キーボードから文字列strを読み込み,strの中を指す...
Tamagawa
amagawa
magawa
agawa
gawa
awa
wa
a
''fx2)'' 長さ10文字のchar型の配列fromとtoを定義する。キー...
> 【ポイント】 ポインタによる連続コピーでは,よく以下の...
*p++ = *q++;
''fx3)'' 整数型の変数へのポインタを2つ取り,それらの指す...
void swap(int *p, int *q);
使用例
int a = 3, b = 5;
printf("a=%d b=%d\n", a, b);
swap(&a, &b); /* aとbの交換 */
printf("a=%d b=%d\n", a, b);
''fx4)'' 2つの文字列を比較し,同じなら1,異なる場合は0を...
int strequal(char *str1, char *str2);
''fx5)'' キーボードから文字列patternとstringを読み込み,p...
** 発展課題 [#qff2277e]
- 発展課題には''提出期限を設けない''ので,前回までの発展...
*** ダンジョン探索 [#f1a8b80c]
''fz1)'' RPGシリーズということで,今度はダンジョン(地下...
主人公たちは村外れにたつ小さな古城にたどり着いた。言い伝...
ダンジョンの地図は2次元配列(グローバル変数)として用意し...
int map[7][7] = {
{ 9, 9, 9, 9, 9, 9, 9 },
{ 9, 1, 9, 0, 9, 5, 9 },
{ 9, 0, 9, 0, 2, 0, 9 },
{ 9, 0, 9, 0, 9, 9, 9 },
{ 9, 0, 0, 0, 2, 0, 9 },
{ 9, 0, 9, 0, 9, 7, 9 },
{ 9, 9, 9, 9, 9, 9, 9 } };
ここで,0〜9はそれぞれ次のものを表す(ここらへんは自由に...
-「0」通路
-「1」上り階段(外に脱出できる)
-「2」扉
-「5」十字架(吸血鬼を倒すためのアイテム)
-「7」吸血鬼(ボスキャラ)
-「9」壁(進めない)
また,主人公が地図上のそれぞれの記号を訪れた場合の関数を...
void passage() /* 通路 */
{
/* 何も起きない */
}
void stairway() /* 階段 */
{
/* 地上に脱出するかどうか質問する */
/* 吸血鬼を倒してから脱出すれば,ハッピーエンド */
}
void door() /* 扉 */
{
/* 何かメッセージを表示させるといいだろう */
}
void cross() /* 十字架 */
{
/* 宝箱があり,中に十字架が入っている */
/* 紙に書かれた謎々を解くと箱を開けられる */
}
void vampire() /* 吸血鬼 */
{
/* 吸血鬼に仲間にならないか誘われるが,断ると対決 */
/* 十字架を持っていれば勝つことができる */
}
プログラムは,ユーザに,主人公を東西南北(上下左右)どち...
printf("どちらの方向に進みますか?(1:東 2:西 3:南 4:北...
scanf("%d", &dir);
switch (dir) {
case 1:
if (map[y][x+1] != 9) x++;
break;
case 2:
if (map[y][x-1] != 9) x--;
break;
case 3:
if (map[y+1][x] != 9) y++;
break;
case 4:
if (map[y-1][x] != 9) y--;
break;
default
printf("その方向には進めません。\n");
/* エラー処理 */
}
switch (map[y][x]) {
case 0:
passage();
break;
case 1:
stairway();
break;
case 2:
door();
break;
case 5:
cross();
break;
case 7:
vampire();
break;
}
画面には,主人公の周囲の状況を表示するとよい。一例として...
- 文字表示の例
あなたは,いま上り階段にいます。
東は壁です。西は壁です。北は壁です。南は通路です。
どちらの方向に進みますか(東西南北)?
- マップ表示の例
■■■
■?■
■ ■ どちらの方向に進みますか(東西南北)?
吸血鬼に負けてしまった場合は,主人公も吸血鬼になってゲー...
ページ名: