【C言語課題解説】円などの面積を求める自作関数のプログラム

はじめに

どうも! 高杉 皆為(@MinatameT)です。

この記事では、具体的な問題を例にして、C言語の自作関数を用いたプログラムについての解説をおこなっています。

今回は、「円」と「長方形」と「三角形」の面積を求める自作関数を作ります。

多くの人が苦手意識を持っている「ポインター」が登場しますので、私のブログの内容にしては難しいです……。そのため、ていねいに解説します。

※この記事は「わかりやすさ重視」であるため、プログラミング経験者たちから怒られそうな表現をしている部分もありますが、ご了承ください。

慣れたらスムーズに作成できるようになりますので、少しずつ確実に理解していきましょう。

問題文

円、長方形、三角形のそれぞれの面積を求めるプログラムを作成しましょう。面積の表示は、小数第2位までとします。

ただし、次の3つの関数を作成し、main関数ですべて利用しましょう。

  • 円の面積を求める関数
  • 長方形の面積を求める関数
  • 三角形の面積を求める関数

また、各パラメーターはキーボードから入力させるものとします。

解答例

ソースコード

#include<stdio.h>

double circle(double *cirr,double *cirs); //自作関数の登録
double rectangle(double *rech,double *recw,double *recs); //自作関数の登録
double triangle(double *trib,double *trih,double *tris); //自作関数の登録

int main(void) //メイン関数
{
  double cirr; //円の半径
  double cirs; //円の面積
  double rech; //長方形の縦辺
  double recw; //長方形の横辺
  double recs; //長方形の面積
  double trib; //三角形の底辺
  double trih; //三角形の高さ
  double tris; //三角形の面積
	
  circle(&cirr,&cirs); //値を受け取るときは、「&変数名」とする。
  rectangle(&rech,&recw,&recs); //値を受け取るときは、「&変数名」とする。
  triangle(&trib,&trih,&tris); //値を受け取るときは、「&変数名」とする。
	
  printf("円の面積は%0.2fです。\n",cirs); //%0.2fは小数第2位までの表示。
  printf("長方形の面積は%0.2fです。\n",recs); //%0.2fは小数第2位までの表示。
  printf("三角形の面積は%0.2fです。\n",tris); //%0.2fは小数第2位までの表示。

  return(0);
}

double circle(double *cirr,double *cirs) //円の面積を求める関数(自作関数)
{
  printf("円の半径>");
  scanf("%lf",cirr); //「&変数名」ではなく「変数名」だけ!

  (*cirs) = ((double)3.14)*(*cirr)*(*cirr); //計算するときは、「(*変数名)」とする。
	
  return(0);
}

double rectangle(double *rech,double *recw,double *recs) //長方形の面積を求める関数(自作関数)
{
  printf("長方形の縦辺>");
  scanf("%lf",rech); //「&変数名」ではなく「変数名」だけ!
  printf("長方形の横辺>");
  scanf("%lf",recw); //「&変数名」ではなく「変数名」だけ!

  (*recs) = (*rech)*(*recw); //計算するときは、「(*変数名)」とする。
	
  return(0);
}

double triangle(double *trib,double *trih,double *tris) //三角形の面積を求める関数(自作関数)
{
  printf("三角形の底辺>");
  scanf("%lf",trib); //「&変数名」ではなく「変数名」だけ!
  printf("三角形の高さ>");
  scanf("%lf",trih); //「&変数名」ではなく「変数名」だけ!

  (*tris) = ((*trib)*(*trih))/((double)2); //計算するときは、「(*変数名)」とする。

  return(0);
}

ソースコードだけ見せられても意味不明だと思いますので、要点を説明していきます。ちなみに、「//」はコメント文なので、気になる行はコメント文を確認してみてください。

まず、「自作関数」についてです。自作関数を利用するときは、事前に登録しておく必要があります。登録する場所は、#include~の直後です。

登録するときに、関数内で使用する変数に合わせた「関数の型(ここではdouble型)」を、はじめに記述しておくのを忘れないでください。

また、関数内で使用する変数を、かっこの中に「変数の型 *変数名」というように記述しておきます。変数が複数あるときは、カンマ(,)で区切ります。

これは、登録のときだけではなく、関数の中身を記述するときも一緒です。

関数の型 関数名(変数1の型 *変数名1,変数2の型 *変数名2);

具体的には、次のように登録します。

#include<stdio.h>

double circle(double *cirr,double *cirs); //自作関数の登録
double rectangle(double *rech,double *recw,double *recs); //自作関数の登録
double triangle(double *trib,double *trih,double *tris); //自作関数の登録

そして、各関数はmain関数の後に、それぞれ個別で記述していきます。上記のソースコードでは……

  • int型のmain関数(自作関数でおこなった計算の結果を受け取り、表示する関数)
  • double型のcircle関数(入力処理と円の面積を計算する関数)
  • double型のrectangle関数(入力処理と長方形の面積を計算する関数)
  • double型のtriangle関数(入力処理と三角形の面積を計算する関数)

この順番で記述しています。

main関数では、circle関数とrectangle関数とtriangle関数でおこなった計算の結果を受け取り、表示しています

ここで注意点ですが、自作関数を呼び出して値を受け取るときに、「&変数名」としてください。「変数名」だけであったり「*変数名」としてはいけません。

呼び出す関数名(&変数名1,&変数名2);

具体的には、次のように記述します(関数の呼び出し)。

  circle(&cirr,&cirs); //値を受け取るときは、「&変数名」とする。
  rectangle(&rech,&recw,&recs); //値を受け取るときは、「&変数名」とする。
  triangle(&trib,&trih,&tris); //値を受け取るときは、「&変数名」とする。

最後に、自作関数の書き方について説明します。ここでは、circle関数を例に挙げます。他の関数であっても、考え方は一緒です。

double circle(double *cirr,double *cirs) //円の面積を求める関数(自作関数)
{
  printf("円の半径>");
  scanf("%lf",cirr); //「&変数名」ではなく「変数名」だけ!

  (*cirs) = ((double)3.14)*(*cirr)*(*cirr); //計算するときは、「(*変数名)」とする。
	
  return(0);
}

まず、circle関数を登録した行をコピーして、main関数が終わった後の場所に貼り付けてください。そして、文末の「セミコロン(;)」を消してください

circle関数では、「*cirr」と「*cirs」の2つの変数を計算に使います。この「*」がついた変数を「ポインター変数」といいますが、あまり気にしないでください。

次に、main関数のときと同じように、カッコとreturn(0);をつけてください。

この段階で、circle関数は次のようになりました。

double circle(double *cirr,double *cirs) //円の面積を求める関数(自作関数)
{

  return(0);
}

circle関数の中身についてですが、printf関数は普段と同じように記述できますので、特に説明はしません。

注意すべき点として、scanf関数は、いつも「&変数名」としているところを、「変数名」とする必要があります。

※ここでは、とりあえず「*がついた変数名のとき、scanfでは&をつけない」と覚えておいてください。

そして、面積の計算をするときは……

  (*cirs) = ((double)3.14)*(*cirr)*(*cirr); //計算するときは、「(*変数名)」とする。

このように、(*変数名)と記述します。間違って次のように記述すると、エラーが発生しますので、注意してください。

  cirs = ((double)3.14)*cirr*cirr; //ダメな例です!

「*のついた変数(ポインター変数)」と「*のついていない変数(通常の変数)」では、このように文法が異なります。この点を、よく注意してください。

それでは、このプログラムの実行結果を確認していきます。

実行結果

円の半径>3.15
長方形の縦辺>7.7
長方形の横辺>2.4
三角形の底辺>8.8
三角形の高さ>5
円の面積は31.16です。
長方形の面積は18.48です。
三角形の面積は22.00です。

このように、円の半径、長方形の2辺、三角形の底辺と高さを入力した後に、計算結果がまとめて表示されています。

……長くなりましたが、自作関数を使うときの要点を説明しました。

わからない部分がある場合は、お問合せフォームからお問い合わせください。そのとき、「どこがわからないのか」を具体的に書いてくださると、的確なお返事ができると思います。

今回の記事は難しかったと思います。皆さん、お疲れさまでした。


 

みなためじゃんけん

 

このコーナーは、私と擬似的にじゃんけんできるコーナーです。

 

みなためじゃんけん、じゃんけんぽん!

 

私が出したのは……





 

パーでした! チョキの勝利です!



この記事をSNSでシェアする

プログラミングカテゴリーの最新記事(5件)

最新記事(10件)

管理人のTwitter

内部リンク集