三角形の戻り値についての質問

このQ&Aのポイント
  • 戻り値が「-1」の場合、三角形が存在しないことを意味します。
  • 戻り値が二等辺三角形の場合、引数で与えられた三辺のうち、少なくとも2つが等しいことを意味します。
  • 戻り値が正三角形の場合、引数で与えられた三辺がすべて等しいことを意味します。
回答を見る
  • ベストアンサー

初心者な質問その3

******************************************** 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)正三角形の場合の戻り値 についてお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.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が戻り値となります。

関連するQ&A

  • 初心者な質問その4

    ******************************************** #include <math.h> double heron(double a,double b,double c){ double s,s2; s = a+b+c s /= 2.0; s2 = s*(s-a)*(s-b)*(s-c); if(s2 <= 0.0) return(-1); return sqrt(s2); } ******************************************** 三角形の問題です。(*引数a,b,cは三角形の三辺の長さ(正値)を与える) (1)戻り値(return value)が「-1」である場合何を意味するか (2)戻り値が正の場合、その値は何を意味するか (3)a,b,cに各々5,4,3を与えた場合の戻り値 についてお願いします。

  • 二分法のプログラム

    関数x^3-7x^2-6x+2を二分法で解くプログラムを作ったのですが、エラーが出てコンパイルできません。訂正箇所を教えて下さい。 宜しくお願い致します。 #include<stdio.h> #include<math.h> #define EPSILON 0.1E-5 #define TURE 1 #define FALSE 0 int kansu(int x); void Nibunho(left,right,sol,flag); double left,right; int flag; int main(void) { printf("区間の左端と右端は?\n"); scanf("%lf %lf",&left,&right); flag=FALSE; Nibunho(left,right,&root,&flag); if(flag) printf("解 = %e (繰り返し回数 = %d)\n",root,k); else { printf("入力した範囲で解は求まりませんでした。\n"); printf("f(%e) = %e \n",root,k); } return 0; } int kansu(int x) { int f(double x) f(x)=x*x*x-7.0*x*x-6.0*x+2.0; return(f(x)); } void Nibunho(left,right,sol,flag) { double left,right,*sol; int *flag; double a,b,c,fa,fb,fc; k=0; a=left; b=right; do { k++; c=(a+b)/2.0; fc=f(c); fa=f(a); fb=f(b); if(fabs(fc)<1.0e-10) { a=c; b=c; *flag=TRUE; } else { if( (fa * fc < 0.0) || (fb * fc < 0.0) ) { *flag = TRUE; if( (fa*fc) < 0.0 ) b=c; else a=c; } else { if( fabs(fa) > fabs(fb) ) a=c; else b=c; } } } while((b-a)>EPSILON) *sol=(a+b)/2.0; }

  • javaについて質問です

    3つの整数の中央値を求めるメソッドについて質問です。 まずは以下の2つのコードをご覧ください --------------(1)------------------ static int med3(int a,int b,int c){ if(a>=b){ if(b>= c) return b; else if(a<=c) return a; else return c; }else if(a>c) return a; else if(b>c) return c; else return b; } -----------(1)----------- -----------(2)----------- static int med3(int a,int b,int c){ if((b>=a&&c<=a)||(b<=a&&c>=a)) return a; else if((a>b&&c<b)||(a<b&&c>b)) return b; else return c; } -----------(2)----------- 上記の2つのメソッドは参考書の問題に載っているものです。 因みに問題文は、 「中央値を求める手続きは(2)のようにも実現できる。しかしこれは(1)に比べると、実行効率が悪い。その理由を考察せよ」 です。 この問題の解説について質問があります。 解説には、こうあります。 「最初のif文の判定   if ((b >= a && c<= a) || (b <= a && c >= a) に着目します。ここでb >= aおよびb <= aの判定を裏返した判定(実質的に同一の判定)が、続くelse以降で   else if ((a > b && c < b) || (b <= a && c > b) と行われます。つまり、最初のifが成立しなかった場合、2番目のifでも(実質的に)同じ判定を行っているため、効率が悪くなるのです。」 そこで2つ質問があるのですが、まず一つ目から。 「ここでb >= aおよびb <= aの判定を裏返した判定(実質的に同一の判定)が、続くelse以降でelse if ((a > b && c < b) || (b <= a && c > b)と行われます。」の部分の日本語は、一体どういう意味なのでしょうか? b >= a,b <= aの判定を裏返したものはb < a,b > aとなると思うのですが、しかしそれだとその後に続くelse if文の条件、(a > b && c < b) || (b <= a && c > b)と合いません。 2つ目の質問です。 なぜ、ifが成立しなかった場合、何故2番目のifでも同じ判定を行っていると言えるのでしょうか?

    • ベストアンサー
    • Java
  • C言語プログラム能力検定の問題でわからないところがあります

    今度C言語プログラム能力検定を受けるのですが、過去問の回答ではわからず質問させてもらってます(以下ソース) ------------------------------------------ #include<stdio.h> int mod(int a, int b); int d, f = 10; main() { int a,b,c; enum cl {g,h} a=12; b=5; c=mod(a,b); a++; ++b; c=mod(a,b); printf("c=%d\n",c); ←(1) } int mod(int b, int a) { int c; c=b/a; c=b-c*a; return(c); } -------------------------------------------------- 問題は(1)はどのように出力されるでしょう?といったもので、 答え(出力結果)は「1」でした。回答の説明によると 「変数cはmain関数内で宣言され、mod関数の戻り値が格納される。 mod関数の戻り値は二つの引数の剰余であり、ここでは2回目のmod関数 の戻り値が表示される。2回目の仮引数は、aが6で、bが13で戻り値は1になる」 ということでしたが>mod関数の戻り値は二つの引数の剰余であり… というのがよくわかりません…剰余算というのは「%」のことですよね? であれば「c= a % b」といった記述がでてくれば13÷6=2…1で「1」となり、理解できるのですが、それらしき記述がないので(--;) どなたか教えていただけないでしょうか? よろしくおねがいします。

  • C++の質問です

    C++の質問です。 c++をコンパイルしたとき、 出力されるのが次のように3つ同時にされるようにしたいのですが、 1、 名前 ○○○○ 番号 ○○○○ x= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}の平均 2、 x= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}の分散 y= {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}の標準偏差 3、 x={1,2,3,4,5,6,7,8,9,10}と y={10,9,8,7,6,5,4,3,2,1}の相関係数 下記のソースをどのように変えればいいでしょうか。 ちなみに、C言語ではなくC++なので C++形式でお願いします。 どうかお願いします。 #include <iostream> #include <cmath> using namespace std; double Mean(int *a, int size); double StandardDeviation(int *a, int size); double CoefficientOfCorrelation(int *a, int *b, int sizeA, int sizeB); int main() { int x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int y[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; cout << " 標準偏差 : " << StandardDeviation(x, sizeof(x) / sizeof(int)) << endl << " 相関係数 : " << CoefficientOfCorrelation(x, y, sizeof(x) / sizeof(int), sizeof(y) / sizeof(int)) << endl; return 0; } double Mean(int *a, int size) { if (size <= 0) { return -1.0; } double d = 0.0; for (int i = 0; i < size; i++) { d += *(a + i); } return d / size; } double StandardDeviation(int *a, int size) { if (size <= 0) { return -1.0; } double mean = Mean(a, size); double d = 0.0; for (int i = 0; i < size; i++) { d += pow(*(a + i) - mean, 2); } return sqrt(d / size); } double CoefficientOfCorrelation(int *a, int *b, int sizeA, int sizeB) { if (sizeA > 0 && sizeB > 0 && sizeA != sizeB) { return -1.0; } double meanX = Mean(a, sizeA); double meanY = Mean(b, sizeB); double sdX = StandardDeviation(a, sizeA); double sdY = StandardDeviation(b, sizeB); double coeff = 0.0; for (int i = 0; i < sizeA; i++) { coeff += (*(a + i) - meanX) * (*(b + i) - meanY); } return (coeff / (sizeA * sdX * sdY)); }

  • 初心者です。

    お世話になっています また、みなさんのお力をお貸しください。 いま、わからないところは、 例:Aに "0000" や "001" や "-01"- や "--1" などの整数以外の入力(マイナスと小数点は、入力可能とする)が  おこなわれた時、にエラーとしてはじきたいのですが、はじけない  です。 /* * ソース名:kadai001.c * ソース機能の説明:入力された二つの文字の比較 */ #include <stdio.h> #include <ctype.h> #define MAX 12 /* 読み込み文字数 */ /* 関数 Maxof() * 機能 入力されたAとBの値の大小関係を表示 * ・AはBより大きい場合 * ・AはBより小さい場合 * ・AはBが同じの場合 * 引数 x Aの値 * y Bの値 * 戻り値 無し */ void Maxof(char *x, char *y) { if (strcmp(x , y) == 0){ /* AはBが同じの場合 */ printf("A(%s)はB(%s)と同じ\n", x, y); } else if (strcmp(x , y) > 0){ /* AはBより大きい場合 */ printf("A(%s)はB(%s)より大きい\n", x, y); } else { /* AはBより小さい場合 */ printf("A(%s)はB(%s)より小さい\n", x, y); } } /* 関数 NuryokuA() * 機能 Aの値の入力を行う * ・エラー1場合 * ・エラー2場合 * ・エラー3場合 * 引数 na Aの値 * 戻り値 0 */ char NuryokuA(char *na) { char temp_na[MAX]; /* Aの値 */ char remit_na; /* 格納する文字の制限 */ do {/* Aの値がエラー文字の場合はループ */ printf("Aの値を入力してください。:"); if (fgets(na, sizeof na, stdin) == NULL) return 1; }while (sscanf(na, " %[-.0123456789] %c", temp_na, &remit_na) != 1 || Error_syori( na ) == 1 || strlen(temp_na) != MAX); return 0; } /* 関数 NuryokuB() * 機能 Bの値の入力を行う * ・エラー1場合 * ・エラー2場合 * ・エラー3場合 * 引数 nb Bの値 * 戻り値 0 */ char NuryokuB(char *nb) { char temp_nb[MAX]; /* Bの値 */ char remit_nb; /* 格納する文字の制限 */ do {/* Bの値がエラー文字の場合はループ */ printf("Bの値を入力してください。:"); fgets(nb, sizeof nb, stdin); }while (sscanf(nb, " %[-.0123456789] %c", temp_nb, &remit_nb) != 1 || strlen(temp_nb) != MAX); return 0; } int main(void) { char A_data[MAX]; /* Aの値 */ char B_data[MAX]; /* Bの値 */ NuryokuA(A_data); NuryokuB(B_data); Maxof(A_data, B_data); return 0; }

  • booleanのエラーコードーの意味が分かりません

    三角形を作るコードを書きました、JAVAの超初心者です宜しくお願いします。 下記のエラーコードが出ています。 1.「型Mathのメソッドabs(int)は引数(boolean)に適用できません。」 ここでどうしてもbooleanで答えを表示させたい場合には、どこをどのように書き直せばよいのでしょうか。 このような書き方がエラーであれば全てのbooleanコードーがエラーになってしまうような気がするのですが。 2.これをEclipseで実行させた場合には、args[1]~args[2]のデーター入力はどのようにしてやるのでしょうか。 実行させたときにキーから入力してやるのですか。 3. コンスタラクタ「this.L1 = a ;」でわざわざ「L1=a;」を定義してやる意味が良く分かりません。 他のメッソド「boolean isTriangle()」、「double getArea()」は「L1・・」で定義されている関数なのにわざわざ「L1=a;」を定義してやる意味が理解できません。 このケースではたまたまコンストラクタは必要ないし、省略も可かもしれませんが。 メッソドの後ろの「()」は、必要の場合はメッソドの引数を入れると本には書いていますが、クラス内で、メンバー変数として(この場合は「int L1, L2, L3 ;」)定義してやれば、メッソドからは、アクセスできるのでそのような処理がなぜ必要かがわかりません。 以上宜しくお願い致します。 ________________________________ class Sample { int L1, L2, L3 ; Sample (int a, int b, int c) { this.L1 = a ; this.L2 = b ; this.L3 = c ; } boolean isTriangle() { if(( L1 + L2 ) > L3 && Math.abs(( L1 - L2 ) < L3 )) { boolean S_bool = true ;     } else{ boolean S_bool = false ; } return S_bool ; } double getArea() { double S = (double)((L1+L2+L3)/2.0) ; double area = Math.sqrt(S*(S-L1)*(S-L2)*(S-L3)); return area ; } } class Sample_Test { public static void main(String args[]) { int s1 = Integer.parseInt( args[ 0 ] ) ; int s2 = Integer.parseInt( args[ 1 ] ) ; int s3 = Integer.parseInt( args[ 2 ] ) ; Sanmple t1 = new Sample ( s1 , s2 , s3 ) ; boolean sankaku = t1.isTriangle() ; double menseki = t1.getArea() ; System.out.println( sankaku ) ; System.out.println( menseki ) ; } }

    • ベストアンサー
    • Java
  • javaのプログラミングについての質問です。

    javaのプログラミングについての質問です。 Appletを用いて、後置記法によるインタラクティブなミニお絵描き言語を設計 し、実現しなさい。たとえば、 100<return>150<return>200<return>250<return>line<return> とキーボード入力すると、 → Applet上に(100,150)から(200,250)への直線が描かれる。 自分で作ったソースコードの一部です。(全部ペーストし切れませんでした) interface Fun { //関数のインターフェース void eval(MyStack s); //演算を実行 boolean iam(String s); //自分の名前がsと等しいかどうかを判定するメソッド // →自分が呼ばれたかどうかを判定する。 } abstract class Draw implements Fun{ public void eval(MyStack s){ int a, b,c,d; //第一引数と第二引数 a = s.pop(); //それぞれpop b = s.pop(); c = s.pop(); d = s.pop(); s.push((int) draw(a,b,c,d)); //実行は抽象メソッドで行う } abstract int draw(int a, int b,int c,int d); } class DrawLine extends Draw{ public boolean iam(String str){return str.equals("line");} int draw(int a, int b,int c,int d){ Graphics.drawLine(a,b,c,d); // ※ここが問題です。 } } ※のところで  Graphics の非 static メソッド drawLine(int, int, int, int) を static 参照することはできません というエラーメッセージが出ます。 どう直したらいいでしょうか

    • ベストアンサー
    • Java
  • C# こういう場合ってどうなるの?

    public void A(bool b) {   if(b ? B() : C())//分かると思いますが、三項演算子   {     //略   } } public bool B() {   return true; } public bool C() {   return false } 上記のAにtrueを渡し実行した場合、 if文の中はどうなるのでしょうか? 引数がtrueならBを実行し、Bの戻り値trueが if文で処理され、if内に入る・・・でよろしいのでしょうか? それとも引数bの評価がそのままifで使われるのでしょうか? 例えばのコードなので、bだろうがBだろうが変わらない・・・みたいな 回答はご遠慮ください。

  • 三角形の判別

    正三角形、二等辺三角形、直角三角形、直角二等辺三角形、不等辺三角形、三角形ではないを判別するプログラムを以下のように書きました。 #include<stdio.h> int main(void) { int a,b,c; printf("三角形の3辺の長さを入力して下さい:"); scanf("%d %d %d",&a,&b,&c); if(a+b<c||a+c<b||b+c<a) { printf("これは三角形ではありません。"); } else{ if((a==b==c)) printf("これは正三角形です。"); else if(((c*c==a*a+b*b)||(a*a==b*b+c*c)||(b*b==a*a+c*c))&&(a==b||a==c||b==c)) printf("これは直角二等辺三角形です。"); else if((c*c==a*a+b*b)||(a*a==b*b+c*c)||(b*b==a*a+c*c)) printf("これは直角三角形です。"); else if((a==b||a==c||b==c)) printf("これは二等辺三角形です。"); else printf("これは不等辺三角形です。"); } return 0; } しかし、これではなぜか入力1,1,1だと正三角形とでるのですが、2,2,2以降は二等辺三角形と出てしまいます。原因が分からないので教えてくださいお願いします。あとこうしたらいいところとか間違いがあればお願いします。

専門家に質問してみよう