* 第3回 関数 [#xef7c5f7] - ''基本課題''は授業時間中に終わらせること。 - ★印の付いている問題は,当教員に見せて確認の印(またはサイン)を得ること。 - 授業時間中に終わらなかった''応用課題''は,次回(2週間後)までの宿題とする。 - [[C言語のコンパイルと実行のしかた>../C言語環境]] -- プログラムのファイル名は,「問題番号.c」としてください。例:a1.c, ax3.c - [[プログラムの提出のしかた>../提出]] -- 提出URL http://vilab.org/upload/clab-upload.html - [[C言語おすすめ情報>../C言語参考資料]] -- おすすめのWebページや書籍の紹介。 ** 基本課題 [#za0a799c] *** 関数 [#nb3cde3e] ''★c1)'' 半径rを引数として,円周の長さを表示する関数を作成しなさい。その関数の動作を確認するプログラムを作成しなさい。以下にプロトタイプ宣言の例を示す。 void print_circle(double r); >【ポイント】 関数プロトタイプ宣言は,関数の型(使い方)をコンパイラに教えるためのもので,関数の定義(関数の中身を実際に書くこと)とは別である。関数を定義より前に使用する場合には,プロトタイプ宣言が必ず必要である。 /* プロトタイプ宣言:行末にセミコロンが必要 */ void print_circle(double r); int main(void) { /* 関数の使用例 */ print_circle(10.0); } /* 関数の中身の定義:{}の中に実行内容を書く */ void print_circle(double r) { /* 関数の実行内容 */ } ''c2)'' 関数f(x)=x+1をC言語で表し、整数nをキーボードから読み込み、f(0)+f(1)+f(2)+...+f(n)の値を表示するプログラムを作成しなさい。 ''★c3)'' 2つの整数を引数として,値の小さい方を返す関数min2を作成しなさい。これを利用して,10個の整数を読み込み,その最小値を求めるプログラムを作成しなさい。 int min2(int n, int m); *** ライブラリ関数 [#v9a91afe] - 参考 http://www9.plala.or.jp/sgwr-t/c/sec07.html ''★c4)'' 座標平面上の点 (x, y) から原点までの距離を計算するC言語のプログラムを作成し,コンパイル・実行させたい.キーボードからdouble型の数値xおよびyを読み込み,距離を計算して画面に表示するプログラムを作成しなさい.平方根を計算するライブラリ関数sqrtのマニュアルには、以下のように記述されている。 #include <math.h> double sqrt(double x); >【ポイント】 C言語の処理系によっては,数学関係の標準ライブラリを使ったプログラムをコンパイルするために数学ライブラリをリンクする必要がある。たとえば,gccではコンパイル時のオプションで-lmと指定する。 gcc -lm ファイル名.c ''c5)'' 自分の名前(ローマ字)をキーボードから読み込み、標準ライブラリ関数toupperを用いて1文字ずつ大文字に変換した後、画面に表示するプログラムを作成しなさい。 #include <ctype.h> int toupper(int c); ** 応用課題 [#sfd957a4] ''cx1)'' 西暦を引数とし,その年の1月1日の元号が平成(0)・昭和(1)・大正(2)・明治(3)・それ以外(-1)のいずれであるかを返す関数を作成しなさい。その関数の動作を確認するプログラムを作成しなさい。以下にプロトタイプ宣言の例を示す。 int gengo(int seireki); ''cx2)'' キーボードから読み込みこんだ整数n (ただしn≧2)を1辺の長さとするアスタリスク(*)の四角形を描画するC言語の関数を作成し,その関数の動作を確認するプログラムを作成しなさい。たとえば、n=2,3,4のときは、それぞれ以下のような図形が出力される。 n=2 ** n=3 *** n=4 **** ** * * * * *** * * **** ''cx3)'' 標準ライブラリ関数rand()は,0〜RAND_MAXの範囲の擬似乱数(でたらめな数)を返す関数である。この関数を用いて,0以上10未満の乱数を100個発生させ,画面に表示するプログラムを作成しなさい。 #include <stdlib.h> int rand(void); - なお,randは起動するたびに同じ数列を返してしまうので,実際の使用ではさらに工夫が必要である。たとえば,発展課題 ''az1)'' のように時間を使って初期値をかき混ぜる。 ''cx4)'' 三角形の2辺の長さとそれらの挟む角を引数とし、面積を返す関数を作成しなさい。ただし、入力する角度の単位は“度”とする。 ※関数sinを利用するが、度からラジアンへの変換が必要である。 - 参考 http://shigihara.hp.infoseek.co.jp/sin53.htm - 参考 http://www2.ocn.ne.jp/~atel.a/emath/sugakuc.html ''cx5)'' 前回の線形探索のプログラムを改造して,整数配列a,その要素数n,探したい整数xを引数に取り,見つかった場所(添字)を返す関数linear_searchを作成しなさい。ただし,見つからなかった場合には,-1を返すようにしなさい。 int linear_search(int a[], int n, int x); ** 発展課題 [#k59694ea]