* 第6回 ファイルと構造体 [#u30520ba]
* 第6回 ポインタ [#e9e24e95]

- ''基本課題''は授業時間中に終わらせること。
- ★印の付いている問題は,当教員に見せて確認の印(またはサイン)を得ること。
- 授業時間中に終わらなかった''応用課題''は,年内の宿題とする。
- 授業時間中に終わらなかった''応用課題''は,次回(2週間後)までの宿題とする。

- [[C言語のコンパイルと実行のしかた>../C言語環境]]
-- プログラムのファイル名は,「問題番号.c」としてください。例:a1.c, ax3.c
- [[プログラムの提出のしかた>../提出]]
-- 提出URL http://vilab.org/upload/clab-upload.html
- [[C言語おすすめ情報>../C言語参考資料]]
-- おすすめのWebページや書籍の紹介。

** 基本課題 [#kc01922d]
** 基本課題 [#i341647d]

*** ファイル [#gf22e461]
*** ポインタ [#v1805475]

''f1)'' まず、kansou.txtというファイルにこの授業の感想を書いて準備しておく。そして、そのファイルの中身(=感想)を表示するプログラムを作って結果を確かめなさい。 ※感想を書いたファイルも提出してください。
> 【ポイント】 関数 fopen,fclose と getc(またはfgetc),putchar を用いる。
''★f1)'' int型の変数aとint型へのポインタpを定義し、pを用いてaに好きな値(キーボードから入力した整数)を代入するプログラムを作成しなさい。※直接aに値を代入せず、pを使ってaの値を変える。
 int a;
 int *p;

- http://www005.upp.so-net.ne.jp/h-masuda/cl/CStrPnt/c1040.html
- http://www005.upp.so-net.ne.jp/h-masuda/cl/CKiso/ck0405.html
> 【ポイント】 ポインタは必ず変数などのある有効なメモリ領域を指していなければならない。初期化していないポインタは非常に危険である。※下記は課題とは関係ない。
 char str[20];
 char *ptr;
 ptr = &str[3];

''★f2)'' ユーザが指定したファイル名のファイルを新しく作成し,そのファイルに1から1000までの整数を書き込むプログラムを作成しなさい.
> 【ポイント】 関数 fprintf を用いる。
''f2)'' まず,int型の変数a,bに適当な整数を代入しておく。次に,pをaへのポインタ,qをbへのポインタとする。そして,pとqを使って(a,bを使わずに)変数a,bの内容を入れ替えなさい。結果を確認するため,入れ替える前と後の変数a,bの値を表示しなさい。

*** 構造体 [#je47a3ca]
''★f3)'' 整数型の配列a[10]と,整数型へのポインタpを定義し,配列の要素a[3]に適当な値を代入し,pにa[3]のアドレスを代入する。このときのa[3],&a[3], *p, pを表示すること。その後,*pに別の値を代入するとどうなるかも同様に表示しなさい。

''★f3)'' 年,月,日からなる構造体を定義し,キーボードから値を読み込み,表示するプログラムを作成しなさい。
 struct date {
     int year;
     int month;
     int day;
 };
- http://www005.upp.so-net.ne.jp/h-masuda/cl/CKiso/ck0601.html
> 【ポイント】 ポインタの値(アドレス)を表示するには%pを用いる。
 printf("%p\n", ptr);

''★f4)'' x座標,y座標からなる構造体pointを定義し,その変数を3つ作成しなさい。キーボードから三角形の3つの頂点の座標を読み込み,三角形の重心の座標を求め表示しなさい。
 struct point {
     double x;
     double y;
 };
- 参考: http://www.geisya.or.jp/~mwm48961/koukou/bunten05.htm
- http://www005.upp.so-net.ne.jp/h-masuda/cl/CKiso/ck0601.html
''f4)'' キーボードから入力された文字列を char 型への配列 str に読み込み、char型へのポインタ ptr を用いて、str 内の1文字目から最後までの文字列、2文字目から最後までの文字列、3文字目から最後までの文字列、…を順に出力するプログラムを作成せよ。以下に出力例を示す。
 Tamagawa
 amagawa
 magawa
 agawa
 gawa
 awa
 wa
 a

''f5)'' まず、商品名(文字列),価格(整数),数量(整数)をメンバとする構造体を定義する。次に,構造体を要素とする長さ10の配列を作成し,中身を適当な値で初期化する。キーボードから整数を読み込み、その価格以下のデータを探してすべて表示するプログラムを作成しなさい。
 struct item {
     char name[20];
     int  price;
     int  quantity;
 };
 struct item item_list[10] = { /* 初期化 */ };
''★f5)'' 2つの整数x,yを引数に取り、商と余りを同時にもとめる関数divideを作成しなさい。なお、y=0なら0を返し,それ以外なら1を返すようにしなさい。
 int divide(int x, int y, int *sho, int *amari);
使用例
 int a, b, c;
 c = divide(5, 3, &a, &b);
 if (c != 0) printf("商 %d  余り %d\n", a, b);

** 応用課題 [#k791c2a7]
** 応用課題 [#v5d40004]

''fx1)'' キーボードから読み込んだ10人分の名前(文字列),年齢(整数),身長(実数)をheight.txtファイルに格納するプログラムを作成しなさい。また、その10人分のデータを読み出して表示するプログラムも作成しなさい。
''fx1)'' 長さ5のint型,char型の配列を作り,各要素に適当な値を代入しなさい。それぞれの配列について,ポインタを使って配列の要素のアドレスと中身を1つずつ表示しなさい。

''fx2)'' コマンドラインで与えられたファイル名のファイルの内容を画面に表示するC言語のプログラムを作成しなさい(UNIXのcat,Windowsのtype)。このプログラムを実行するためには,「コマンドプロンプト」からプログラムを実行しなければならない。
''fx2)'' 長さ10文字のchar型の配列fromとtoを定義し、キーボードからfromに文字列を読み込んだ後、ポインタ2つを用いてtoにこの文字列をコピーするプログラムを作成しなさい。

>【ポイント】 プログラム実行時のコマンドラインの引数は、メインの引数として取得することができる。
 int main(int argc, char *argv[]);
このargcに、コマンドライン引数の個数、argvにそれぞれの引数の文字列が得られる。
 int main(int argc, char *argv[])
 {
     int i;
     for (i = 0; i < argc; i++)
         printf("%s\n", argv[i]);
 }
> 【ポイント】 ポインタによる連続コピーでは、よく以下のような書き方が用いられる。
 *p++ = *q++;

''fx3)'' ユーザが指定したファイル名の英文テキストファイルを開き、そこに含まれている単語の平均長を求めるプログラムを作成せよ。ただし、単語の定義は、アルファベットが連続している文字列とする。
''fx3)'' 整数型へのポインタを2つ取り、それらの指す整数値を交換する関数swapを作成せよ。
 void swap(int *p, int *q);
使用例
 int a = 3, b = 5;
 swap(&a, &b);
 printf("a=%d b=%d\n", a, b);

''fx4)'' まず、商品名と価格をメンバとする構造体を定義する。そして、その構造体変数へのポインタを引数にとり、キーボードから読み込んだ商品名と価格を、その変数に代入する関数を作成せよ。
''fx4)'' 2つの文字列を比較し,同じなら1,異なる場合は0を返す関数を作成しなさい。※ただし,標準ライブラリ関数strcmpは用いないこと。
 int strequal(char *str1, char *str2);

''fx5)'' 氏名と教科の点数(N科目分)からなる構造体(seiseki)を定義して,値をキーボードから読み込む関数,構造体に格納された値を表示する関数を作成しなさい。
''fx5)'' キーボードから文字列patternとstringを読み込み、stringにpatternが含まれる場合には「成功」と表示して終了し、含まれない場合には「失敗」表示として成功するまでstringの読み込みを繰り返すプログラムを作成しなさい。※標準ライブラリ関数strstrを使ってよいので調べてみよ。

** 発展課題 [#v7fa1cf5]
** 発展課題 [#f2f615a6]

- 発展課題には''提出期限を設けない''ので,前回までの発展課題でやっていないものも含めて,どれでも自分の面白いと思うものをやってよい。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS