********************************************
int sankaku(double a,double b,double c){
double s,s2;
int flag=0;
s = a+b+c
s /= 2.0;
s2 = s*(s-a)*(s-b)*(s-c);
if(s2 <= 0.0) return(-1);
if(a==b)flag++;
if(b==c)flag++;
if(c==a)flag++;
return (flag);
}
********************************************

三角形の問題です。(*引数a,b,cは三角形の三辺の長さ(正値)を与えるの)
(1)戻り値(return value)が「-1」である場合何を意味するか
(2)二等辺三角形の場合の戻り値
(3)正三角形の場合の戻り値
についてお願いします。

A 回答 (1件)

(1)


if(s2 <= 0.0) return(-1);
から、s2<=0.0となる場合です。

…なんて書くと石が飛んできそうな気がするので、s2の計算を見てみます。
s = a+b+c;
s /= 2.0;
s2 = s*(s-a)*(s-b)*(s-c);
となっていますね。a,b,cは正ですからs2計算時のsも正になります。
したがって、s2<=0.0が成り立つにはs-a<=0.0かs-b<=0.0かs-c<=0.0が成り立つ必要があります。
s = a+b+c;s /= 2.0;ですから、s2<=0.0が成り立つには(-a+b+c)/2<=0.0か(a-b+c)/2<=0.0か(a+b-c)/2<=0.0、すなわち、b+c<=aかa+c<=bかa+b<=cが成り立つ必要があります。
これは、3角形の3辺とはならない値が関数に与えられたことを表します。

(2)、(3)
if(a==b)flag++;
if(b==c)flag++;
if(c==a)flag++;
の部分は、各辺のうち長さが一致する辺の個数を数えています。
したがって、二等辺三角形の場合は1、正三角形の場合は3が戻り値となります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qif((double)a >= (double)b))

初歩的な質問ですいません。

SetTani(char* text, double x)
{
 BOOL test = FALSE;
 double tmp = x;
 double tmp1 = 1000.000;
 if(x < 0){//もしもマイナスだったらプラスにする
  tmp = fabs(tmp);
  test = TRUE;
 }
 if(tmp >= tmp1){//ここで問題が発生
   ・
   ・
   ・
 }

xに-1000が入ってきた時に問題が発生します。
絶対値を求めたあとのif文ではじかれてしまいます。
デバッグモードでみてみても
tmp 1000.000000
tmp1 1000.000000
となっているのになぜ
if(tmp >= tmp1)
がTRUEとならないのでしょうか?
ちなみにxに1000が入ってきたときは
tmp 1000.000000
tmp1 1000.000000
となっていて
if(tmp >= tmp1)がTRUEとなります。

よろしくお願いします。

初歩的な質問ですいません。

SetTani(char* text, double x)
{
 BOOL test = FALSE;
 double tmp = x;
 double tmp1 = 1000.000;
 if(x < 0){//もしもマイナスだったらプラスにする
  tmp = fabs(tmp);
  test = TRUE;
 }
 if(tmp >= tmp1){//ここで問題が発生
   ・
   ・
   ・
 }

xに-1000が入ってきた時に問題が発生します。
絶対値を求めたあとのif文ではじかれてしまいます。
デバッグモードでみてみても
tmp 1000.000000
tmp1 1000.000000
となっているのにな...続きを読む

Aベストアンサー

多分、実数の誤差に起因する問題でしょう。変数のウォッチ(VC を使ってる?)では
なく、問題の箇所の直前に、以下のような文を追加して、変数の内容を確認してみて下さい。

printf("tmp = %40.30f, tmp1 = %40.30f\n", tmp, tmp1);


多分、内容が違っているはず。

質問にある「 x に -1000 が入ってきたとき」というのは、直接 x に -1000 を代入
したのではなく、float の変数を使った演算の結果だったりしませんか?

Q double (*foo)(double);

 double (*foo)(double);
C のコードで上のように宣言されたとき,foo は何を表していますか?

プログラミング初心者です.
よろしくお願いします.

Aベストアンサー

関数ポインタですね。
状態変数等によって呼び出し関数を変える時に、関数ポインタのテーブルを引っ張ってきて呼び出したりすることがあります。

double (*foo[])(double) = {func1, func2, func3};

とかあった場合
int idx = 1;
double param = 1.1;
double ret;
ret = (*foo[idx])(param);

とすれば

ret = func2(param);

とするのと同じことです。

Qif(str=='a' || str=='b' || str=='c')これまとめられませんか?

題名どおりなんですが短縮してかけませんか?

Aベストアンサー

Perlなどではこういうのは正規表現で
if ( str =~ /(a|b|c)/ )

なんていうように書けます.
C言語でも正規表現を使うためのライブラリはある
(正規表現,C言語などのキーワードで検索して探してください)
ので,それを探して使うのもありかもしれません.

Qfor(s=p; *p; p++)の*p(ポインタ)の意味

for(s=p; *p; p++)の*p(ポインタ)の意味
C言語初心者です。
今ポインタを勉強しているのですが、
for文で上記のようなものが出てきて、意味が分からず困っています。
*pで*p != NULL と同じような意味になるみたいなのですが…。
どうしてそのような意味になるのでしょうか?

ちなみにsとpはポインタで、
sには配列(入力した文字列)の先頭アドレスが入っています。
pは文字列を指していて○○○○○NULL ←になるから上記のような条件で
回るんだろうなぁとはなんとなく考えているのですが。

Aベストアンサー

念のため:
ヌルポインタは「ビットパターンとして」0 じゃないかもしれませんが, ソースプログラムにおいて「ポインタが要求される場面」で「0」とあれば, それは「ヌルポインタ」です.
もうちょっと厳密に書くと「整定数 0」はヌルポインタに変換される.

Qif ( fp == NULL ){ を if ( fp == 0){ へ変更した場合

http://oshiete.goo.ne.jp/qa/8897349.html
 ですが
if ( fp == NULL ){ を
if ( fp == 0){
 fopen dekina と表示してくれるのでしょうか?
  試す環境がございませんので
 よろしくお願いいたします。

Aベストアンサー

>if ( fp == 0){
> fopen dekina と表示してくれるのでしょうか?

はい、表示してくれます。
NULLは、通常、(void*)0 の値が定義されていますので、実体は0と同じです。
しかし、NULLはポインターに対して定義されているのなので、
if ( fp == NULL) と書いたほうがよいでしょう。
一方、0は数値を表すので、
if (fp == 0)とは、書かないほうがよいでしょう。
int a;
が定義されていたとき、
if (a ==0) は、a(という数値を表す変数)の値が0か否かを判断するので、これでよいですが
if ( a== NULL) は、a(という数値を表す変数)の値がNULLか否かを判断するので、
違和感がありますから、使用しないほうが良いでしょう。


このカテゴリの人気Q&Aランキング

おすすめ情報