* 第5回 C言語の復習(ファイルと構造体) [#n8f21bc8]
* 第4回 ポインタと文字列 [#l1050060]

** 課題 [#f6cf3f8d]
** 目的 [#tba3829d]

今回の課題は、後回しにしてもいいです。
前回と同じ。C言語を復習し実際に使うため、短いプログラムを自分で考えて作成する。

** 課題 [#fb4c0aca]

できない問題は、後回しにして進んだほうがいいかもしれません。

- [[プログラムの提出のしかた>../提出]]
- [[C言語のコンパイルと実行のしかた>../C言語環境]]

*** 中級〜上級レベル [#i6545c7b]
*** 中級〜上級レベル [#efdf6f84]

''ファイル''
''ポインタ''

i1) まず、kansou.txtというファイルにこの授業の感想を書いて準備しておく。そして、そのファイルの中身(=感想)を表示するプログラムを作って結果を確かめなさい。
g1) int型の変数aとint型へのポインタpを定義し、pを用いてaに好きな値を代入するプログラムを作成しなさい。

i2) コマンドラインで与えられたファイル名のファイルの内容を画面に表示するC言語のプログラムを作成しなさい.(UNIXのcat,Windowsのtype)
g2) int型の変数a,bに適当な整数を代入する。pをaへのポインタ,qをbへのポインタとし,pとqをポインタを用いて変数a,bの内容を入れ替えなさい。結果を確認するため,入れ替える前と後の変数a,bの値を表示しなさい。

>【コマンドライン引数】 プログラム実行時のコマンドラインの引数は、メインの引数として取得することができる。
 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]);
 }
g3) 長さ5のint型,char型の配列を作り,各要素に適当な値を代入しなさい。それぞれの配列について,ポインタを使って配列の要素のアドレスと中身を表示せよ。

i3) コマンドラインで与えられたファイル名のファイルを新しく作成し,それに1から1000までの整数を書き込むC言語のプログラムを作成せよ.
> 【ポインタの表示】 ポインタの値(アドレス)を表示するには%pを用いる。
 printf("%p\n", ptr);

i4) キーボードから読み込んだ10人分の名前(文字列),年齢(整数),身長(実数)をheight.txtファイルに格納するプログラムを作成しなさい。また、その10人分のデータを読み出して表示するプログラムも作成しなさい。
g4) 10個の要素を持つ整数型配列に適当な初期値を入れ,その合計をポインタを使った計算で求めなさい。

i5) ユーザが指定したファイル名の英文テキストファイルを開き、そこに含まれている単語の平均長を求めるプログラムを作成せよ。ただし、単語の定義は、空白または改行にはさまれた文字列とする。
g5) 自分の名前(配列)と、アルファベット1文字をキーボードから読み込み,名前の中からそのアルファベットを検索して、そのアドレス(ポインタの値)を出力せよ

g6) 整数型の配列aと,整数型へのポインタpを定義し,配列の好きな要素a[i]に適当な値を代入し,pにa[i]のアドレスを代入する。a[i],&a[i], *p, pを表示すること。また,*pに別の値を代入するとどうなるか。

''構造体''
g7) 日曜日を0としてn日目の名前を返す関数を作りなさい。※曜日名は文字列定数で定義済みのものを利用すること。たとえば「return "Sunday"」とするとよい。
 char *dayname(int d);
使用例
 printf("Today is %s.\n", dayname(i));

j1) x座標,y座標からなる構造体pointを定義し,3つの点の座標を入力しなさい。その3点からなる三角形の重心の座標を求め表示しなさい。
g8) 欠番。

j2) 学年,クラス('A', 'B'など)と人数からなる構造体を定義し,キーボードから値を読み込み,表示する。
g9) 2つの整数x,yを引数に取り、商と余りを同時にもとめる関数を作成しなさい。なお、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);

j3) まず、氏名(文字列)と年齢(整数)をメンバとする構造体の配列を作成し、年齢が昇順になるように適当なデータで初期化しておく。そして、キーボードから整数を読み込み、その年齢を持つデータを探して表示するプログラムを作成せよ。
g10) 整数型へのポインタを2つ取り、それらの指す整数値を交換する関数swapを作成せよ。
 void swap(int *p, int *q);
使用例
 int a = 3, b = 5;
 swap(&a, &b);
 printf("a=%d b=%d\n", a, b);

j4) 氏名と教科の点数(N科目分)からなる構造体(seiseki)を定義して,値をキーボードから読み込む関数,構造体に格納された値を表示する関数を作成しなさい。
''文字列''

j5) まず、商品名と価格をメンバとする構造体を定義する。そして、その構造体変数へのポインタを引数にとり、キーボードから読み込んだ商品名と価格を、その変数に代入する関数を作成せよ。
h1) 長さ10文字のchar型の配列fromとtoを定義し、キーボードからfromに文字列を読み込んだ後、ポインタ2つを用いてtoにこの文字列をコピーするプログラムを作成しなさい。

> 【ポインタによる連続コピー】 ポインタによる連続コピーでは、よく以下のような書き方が用いられる。
 *p++ = *q++;

h2) 適当な配列に,キーボードから自分の名前をアルファベットで入力しなさい。配列の内容を表示した後,ポインタを使用して配列の中身を逆順に入れ替え,そのときの配列の内容を表示しなさい。

h3) キーボードから入力された文字列を char 型への配列 str に読み込み、char型へのポインタ ptr を用いて、str 内の1文字目から最後までの文字列、2文字目から最後までの文字列、3文字目から最後までの文字列、…を順に出力するプログラムを作成せよ。

出力例を示す。
 Tamagawa
 amagawa
 magawa
 agawa
 gawa
 awa
 wa
 a

h4) 2つの文字列を比較し,同じなら1,異なる場合は0を返す関数を作成しなさい。
 int strequal(char *str1, char *str2);

h5) まず、3つの文字列 "end", "quit", "stop" を要素とする配列 bye を定義しておく。そして、キーボードから文字列 str を順次読み込んで、それが、bye の要素のいずれかと一致するまでその入力を繰り返すようなプログラムを作成せよ.※標準ライブラリ関数strcmpを用いる。

h6) キーボードから文字列を読み込み,それが数値でない場合にはそのまま画面に表示し,数値ならばその逆数を表示するプログラムを作成せよ.※文字列を数値に変換する代表的な関数はatoiである。

h7) キーボードから文字列patternとstrを読み込み、strにpatternが含まれる場合には「成功」と表示して終了し、含まれない場合には「失敗」表示として成功するまでstrの読み込みを繰り返すプログラムを作成せよ。※標準ライブラリ関数strstrについて調べてみよ。


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