d1)★ 整数を関数の引数として,1000の位のあとに「,」(カンマ)を入れて表示する関数を作成しなさい(例:「2056」→「2,056」)。さらにその関数の動作を確認するプログラムを作成しなさい。以下に関数のプロトタイプ宣言の例を示す。(ヒント:「56」を「056」と表示させるには,printfで「%03d」とすればよい)
void comma1000(int n);
【ポイント】 関数プロトタイプ宣言は,関数の型(使い方)をコンパイラに教えるためのもので,関数の定義(関数の中身を実際に書くこと)とは別である。関数を定義より前に使用する場合には,プロトタイプ宣言が必要である。
/* プロトタイプ宣言:行末にセミコロンが必要 */ void comma1000(int n); int main(void) { /* 関数の使用例 */ comma1000(2056); } /* 関数の中身の定義:{}の中に実行内容を書く */ void comma1000(int n) { /* 関数の実行内容 */ }
d2) 関数f(x)=x+1をC言語で表し,整数nをキーボードから読み込み,f(0)+f(1)+f(2)+...+f(n)の値を表示するプログラムを作成しなさい。※関数名は「f」とし,f(x)=x+1の定義は変更しないこと。
【ポイント】 関数の値を返すにはreturn文を用いる。例えば,円の半径を引数としてその面積を返す関数は以下のようになる。
double circle(double r) { return r * r * 3.14; }
d3)★ 2つの整数を引数として,値の小さい方を返す関数min2を作成しなさい。さらに,min2を呼び出して,10個の整数を読み込み,その最小値を求めるmainプログラムを作成しなさい。※なお,1度作ったmin2を変更してはいけない。min2の中で10個の整数を比較したり,min2の中で10回ループをまわしたり,画面表示をしてはいけない。min2は,2つの整数を引数として値の小さい方を返す関数のままである。
int min2(int n, int m);
以下の問題d4),d5)は,関数を自分で作るのではなく,C言語に既に用意されている関数(標準ライブラリ関数)を使う問題である。関数を自作する必要はない。
d4)★ 座標平面上の点 (x, y) から原点までの距離を計算するC言語のプログラムを作成し,コンパイル・実行させたい.キーボードからdouble型の数値xおよびyを読み込み,距離を計算して画面に表示するプログラムを作成しなさい.平方根を計算するライブラリ関数sqrtのマニュアルには,以下のように記述されている。
#include <math.h> double sqrt(double x);
【ポイント】 ライブラリ関数とは,C言語にあらかじめ用意されている関数である。ライブラリ関数を使うときには,その関数のプロトタイプ宣言などが書かれたヘッダファイル(インクルードファイル)を,ソースファイルの先頭で#includeしなければならない。
使う関数に対応するヘッダファイルはマニュアルに載っている。今までほとんど説明なく書いてきた #include <stdio.h> も,printf()やscanf()を使うためのヘッダファイルstdio.hをインクルードするものである。
/* printfを使うためにstdio.hをインクルード */ #include <stdio.h> int main(void) { /* stdio.hで宣言されているprintf()を使用 */ printf("Hello, world!); return 0; }
【参考】 C言語の処理系(OS)によっては,数学関係の標準ライブラリを使ったプログラムをコンパイルするために数学ライブラリをリンクする必要がある。たとえば,gcc(UNIX)ではコンパイル時のオプションで-lmと指定する。
gcc -lm ファイル名.c
d5) 自分の名前(ローマ字)をキーボードから読み込み,標準ライブラリ関数toupperを用いて1文字ずつ大文字に変換した後,画面に表示するプログラムを作成しなさい。
#include <ctype.h> int toupper(int c);
dx1) 西暦を引数とし,その年の1月1日の元号が平成(0)・昭和(1)・大正(2)・明治(3)・それ以外(-1)のいずれであるかを返す関数を作成しなさい。その関数の動作を確認するプログラムを作成しなさい。以下にプロトタイプ宣言の例を示す。
int gengo(int seireki);
dx2) キーボードから読み込みこんだ整数n (ただしn≧2)を1辺の長さとするアスタリスク(*)の四角形を描画するC言語の関数を作成し,その関数の動作を確認するプログラムを作成しなさい。たとえば,n=2,3,4のときは,それぞれ以下のような図形が出力される。
n=2 ** n=3 *** n=4 **** ** *** **** *** **** ****
dx3) 標準ライブラリ関数rand()は,0〜RAND_MAXの範囲の擬似乱数(でたらめな数)を返す関数である。この関数を用いて,0以上10未満の乱数を100個発生させ,画面に表示するプログラムを作成しなさい。
#include <stdlib.h> int rand(void);
dx4) 三角形の2辺の長さとそれらの挟む角を引数とし,面積を返す関数を作成しなさい。ただし,入力する角度の単位は“度”とする。 ※関数sinを利用するが,度からラジアンへの変換が必要である。
dx5) 前回の線形探索のプログラム cx2) を改造して,整数配列a,その要素数n,探したい整数xを引数に取り,最初に見つかった場所(添字)を返す関数linear_searchを作成しなさい。ただし,見つからなかった場合には,-1を返すようにしなさい。
int linear_search(int a[], int n, int x);
dz1) ○×ゲーム(Tic-Tac-Toe)を作る。以下がプログラムの行う処理の説明である。なるべく処理をまとめて関数を使うようにして書いてみなさい。
準備
入力
判定
反復
dz2) ○×ゲームをコンピュータとの対戦型にしなさい。上級レベルでは,コンピュータは必勝の手を打ってくるようにしなさい。