「関数の定義のやり方は?」
「関数の呼び出し方、プロトタイプ宣言について知りたい」
そんな方の疑問を解決するための記事になります。
私が大学や本で学んだことをわかりやすくまとめました!!
関数の定義
決まった手続きを繰り返し使う際には、
内容がまとまっているものを関数として定義することで、
プログラムを読みやすく、エラーが起こりにくく、修正がしやすいといった利点があります。
それでは、自分で関数を作るときの方法を見ていきます。
このイメージ図に当てはめて作ります。
1.返り値の型
自分で作る関数が何を返すものなのかを決めます。例えば、整数なら「int」、何も返さないならば「void」。
2.関数の名前
自分で関数の名前を決めます。例えば、最大の整数の値を出す関数なら「max」。
3.引数の型
関数に何の値を与えるのかを決めます。例えば、浮動小数なら「double」、整数なら「int」、何も入れないならば「void」。
4.引数の名前
作りたい関数の中身で引数をどのように処理するのかを書けるようにするために、
仮の引数の名前を決めます。例えば、「a」や「x」など。
引数が「void」の場合は何も書かないです。
5.作りたい関数の中身
関数の内容を書きます。
6.返り値
関数の中身で処理したものの最終的に返したい値を書きます。
例えば、「return a;」や「return x;」など。
関数の呼出し・プロトタイプ宣言
関数の定義の仕方がわかったので、実際にプログラムでの使い方、呼出しについて解説します。
まずは、以下のプログラムを実行します。
#include <stdio.h>
void run(char,int);
int main(void) {
int l;
printf("正の整数:"); scanf("%d",&l);
while(l<=0){
printf("正の整数:"); scanf("%d",&l);
}
run('*',l);
return 0;
}
void run(char c,int length){
int i,s,k;
for(i=1;i<=length;i++){
printf("%2d:",i);
s=i;
k=length-i+1;
while(s){
printf(" ");
s--;
}
while(k){
printf("%c",c);
k--;
}
printf("\n");
}
return ;
}
直角三角形を画面に印字するプログラムになります。
「run」という関数を作っています。
「main」関数の中で、「run(‘*’,l);」と書くことで関数の呼出しをしています。
「main」関数の前に 「void run(char,int);」と
自作の関数の最初の型などのみを記載することをプロトタイプ宣言と言います。
自作の関数は、「main」関数の前に書く必要があり、
自作の関数の中身まで一緒に先に書いても良いですが、その中身が長いと「main」関数が後の方になって探しにくくなるため、プロトタイプ宣言をすることにより見やすくなります。
問題(発展)
今回学んだことを活かして以下の問題を解いてみましょう。
「今日から10,000日後は何年何月何日かを求めるプログラム」を作りましょう。
閏(うるう)年は、4で割れる年であり、100で割れる年は違い、400で割れる年はうるう年です。
例えば、2021年10月5日を入力した場合は、
「2021年10月5日の10000日後は2049年2月20日です」
と出力されます。
#include <stdio.h>
int leapYear(int);
int main(void)
{
int n[2][12]={{1,2,3,4,5,6,7,8,9,10,11,12},{31,28,31,30,31,30,31,31,30,31,30,31}};
/*何月に何日あるのかを配列に入れる*/
int k=10000;
int y,m,d;
int year,month,day;
printf("今日の日付を入力してください\n"); /*今日の日付を入力*/
printf("年:"); scanf("%d",&year); y=year;
printf("月:"); scanf("%d",&month); m=month;
printf("日:"); scanf("%d",&day); d=day;
month=month-1;
k=(k-n[1][m-1]+day);
while(k>0){ /*10000日後を計算*/
if(month==1){
k=k-leapYear(year);
}
if(month>=11){
year=year+1;
month=0;
}else{
month=month+1;
}
k=k-n[1][month];
}
printf("%d年%d月%d日の10000日後は%d年%d月%d日です\n",y,m,d,year,month+1,n[1][month]+k);
return 0;
}
int leapYear(int year) /*うるう年を計算*/
{ int uruu;
if(year%4==0){
uruu=1;
}else{
uruu=0;
}
if(year%100==0){
uruu=0;
}
if(year%400==0){
uruu=1;
}
return uruu;
}
まとめ
今回は、関数の定義の仕方とその呼び出し方、プロトタイプ宣言について解説しました。
関数を自分で作ることによって、プログラム全体が見やすくなり、
修正もしやすくなるので自分で使えるようにしましょう。