ページ 11

C++の宿題で・・・

Posted: 2012年4月16日(月) 10:42
by AIR
[1] 質問文
 [1.1] どこが間違っているのか知りたい
 [1.2] ヘロンの公式を使い、三角形の面積を求めよ

コード:

#include<stdio.h>
#include<math.h>

double areatri(double a,double b,double c)
{
	double S=(a+b+c)/2;
	return sqrt(S*(S-a)*(S-b)*(S-c));
}

int main()
{
	double a,b,c;
	printf("三角形の3辺の長さを入力してください:");
	scanf("%lf %lf %lf",&a,&b,&c);
	printf("面積は%lfです\n",areatri);
	return(0);
}
 [1.3] 結果の面積が0.000000になってしまう(エラーは出ません)
 [1.4] アドレス演算子を使ってみたりして試行錯誤してみたのですがいかんせん上手くいきません・・・
   エラーが出ないためどこかで簡単なミスをしていると思うのですがどうしてもわかりません。
   去年C言語を習いその復習なのですが、まだ関数の扱いを上手く理解できていません・・・
   どうかお力添えをよろしくお願いします

[2] 環境  
 [2.1] OS : Windows7
 [2.2] コンパイラ名 : VC++ 2008
[3] その他
 ・C言語は配列、関数、構造体は学んであります。C++は今年から学ぶのでまだあまりわかりません。
 ・もしこの質問方法に不備があれば、それも教えてもらえるとありがたいです。

Re: C++の宿題で・・・

Posted: 2012年4月16日(月) 10:53
by YuO
関数の呼び出しは,「関数名 ( 引数 )」という形をとります。
areatri関数を正しく呼び出す様にする必要があります。
# 関数名だけだと,その関数へのポインタとして扱われます。

Re: C++の宿題で・・・

Posted: 2012年4月16日(月) 12:42
by AIR

コード:

#include<stdio.h>
#include<math.h>

double areatri(double *a,double *b,double *c)
{
	double S=(*a+*b+*c)/2;
	return sqrt(S*(S-*a)*(S-*b)*(S-*c));
}

int main()
{
	double a,b,c;
	printf("三角形の3辺の長さを入力してください:");
	scanf("%lf %lf %lf",&a,&b,&c);
	printf("面積は%lfです\n",areatri(&a,&b,&c));
	return(0);
}
こういうことでしょうか?結果が出るようになりました!
今から計算が合っているか確かめてみます。ありがとうございました!

Re: C++の宿題で・・・

Posted: 2012年4月16日(月) 12:58
by beatle
解決になっていますが、areatriの引数をポインタにする必要はありません。ポインタにしないほうが一般的です。
なぜなら、areatri関数の中では引数の値を変更しないからです。

コード:

double areatri(double a,double b,double c)
{
    double S=(a+b+c)/2;
    return sqrt(S*(S-a)*(S-b)*(S-c));
}
areatri関数の引数を値渡しに変更しましたので、呼び出し側も改造します。

コード:

areatri(a,b,c)

Re: C++の宿題で・・・

Posted: 2012年4月16日(月) 13:02
by AIR
そうなんですか・・・間違いを正していただきありがとうございます!

Re: C++の宿題で・・・

Posted: 2012年4月16日(月) 14:19
by non
printfは%lfでなく%fです。

Re: C++の宿題で・・・

Posted: 2012年4月16日(月) 21:19
by AIR
了解です!たびたび指摘していただきありがとうございます!