0

2 つの三角形が相似で合同かどうか、指定された辺が直角三角形かどうかをテストする必要があります。ヘッダーファイルを含めました。このプログラムを実行しようとしましたが、間違った答えが返ってきます。

ヘッダ:

/*
 * triangles.h
 * Header file for triangle class.
*/
// make sure this file is not included multiple times:
#pragma once

#include <vector>
using std::vector;

class triangle {
    public:
        // member functions:
        // constructor:
        triangle(unsigned long a=3, unsigned long b=4, unsigned long c=5):
            s1(a),s2(b),s3(c) {}
        unsigned long perimeter();
        unsigned long area();
        void print();  // prints to standard output
        // member variables:
        // integers for the 3 sides:
        unsigned long s1;
        unsigned long s2;
        unsigned long s3;
};

vector<triangle> findRightTriangles(unsigned long l, unsigned long h);
bool congruent(triangle t1, triangle t2);
bool similar(triangle t1, triangle t2);

機能

#include <vector>
using std::vector;
#include <algorithm>
using std::sort;

// note the "triangle::" part.  We need to specify the function's
// FULL name to avoid confusion.  Else, the compiler will think we
// are just defining a new function called "perimeter"
unsigned long triangle::perimeter() {
    return s1+s2+s3;
}

unsigned long triangle::area() {
    // TODO: write this function.
    // Note: why is it okay to return an integer here?  Recall that
    // all of our triangles have integer sides, and are right triangles...
     // put the sides in an array:
    unsigned long sides[3] = {s1,s2,s3};
    // sort the array:
    sort(sides,sides+3);
    // at this point, sides[0] <= sides[1] <= sides[2]

    unsigned long b = sides[0];
    unsigned long h = sides[1];
    return (b*h)/2;
}

void triangle::print() {
    cout << "[" << s1 << "," << s2 << "," << s3 << "]";
}

bool congruent(triangle t1, triangle t2) {
        // TODO: write this function.
     int a, b, c;
     a = t1.s1;
     b = t1.s2;
     c = t1.s3;
     unsigned long tr1[3] = {a,b,c};
    // sort the array:
    sort(tr1,tr1+3);
    // at this point, tr1[0]<= tr1[1] <= tr1[2]
    int d,e,f;
    d = t2.s1;
    e = t2.s2;
    f = t2.s3;
     unsigned long tr2[3] = {d,e,f};
    // sort the array:
    sort(tr2,tr2+3);
    // at this point, tr2[0] <= tr2[1] <= tr2[2]

    if(tr1[0] == tr2[0] && tr1[1] == tr2[1] && tr1[2] == tr2[2]){
    true;
    }

    else false;
}

bool similar(triangle t1, triangle t2) {
    // TODO: write this function.
     int a, b, c;
     a = t1.s1;
     b = t1.s2;
     c = t1.s3;
     unsigned long tr1[3] = {a,b,c};
    // sort the array:
    sort(tr1,tr1+3);
    // at this point, tr1[0]<= tr1[1] <= tr1[2]
    int d,e,f;
    d = t2.s1;
    e = t2.s2;
    f = t2.s3;
     unsigned long tr2[3] = {d,e,f};
    // sort the array:
    sort(tr2,tr2+3);
    // at this point, tr2[0] <= tr2[1] <= tr2[2

    if(tr1[0]%tr2[0] == 0 && tr1[1]%tr2[1] == 0 && tr1[2]%tr2[2] == 0){
    true;
    }

    else false;
}

vector<triangle> findRightTriangles(unsigned long l, unsigned long h) {
    // TODO: find all the right triangles with integer sides,
    // subject to the perimeter bigger than l and less than h
    vector<triangle> retval; // storage for return value.
    triangle t1;
    t1.s1=l;
    t1.s3=h;

    for (unsigned long p = 0; p < t1.s3; p++) {
        t1.s2=p;
        if ( p >= t1.s1 && p <= t1.s3 && (((t1.s1*t1.s1)+(p*p)) == (t1.s3*t1.s3))){
            retval.push_back(t1);

            break;
        }
    }

    return retval;
}
4

1 に答える 1

1

主な問題は、あなたが書いていないことreturnです。たとえば、関数congruentと関数は次のsimilarように終了する必要があります。

return true;

}

else return false;

それとは別に、あなたのsimilar機能に問題があります。三角形は、辺の比率が同じであれば相似です。あるものが別の倍数であるかどうかを確認していますが、そうである必要はありません。たとえば、辺が (6,8,10) と (9,12,15) の三角形は似ていますが、一方は他方の倍数ではありません。tr1[i]/tr2[i]が3 面すべてで同じかどうかを確認する必要があります。整数除算を使用すると問題が発生するため、除算を回避する次の条件を使用できます。

if(tr1[0]*tr2[1] == tr2[0]*tr1[1] &&  tr1[2]*tr2[1] == tr2[2]*tr1[1])

tr1[0]/tr2[0]が と同じかどうかをチェックし、次に が と同じかtr1[1]/tr2[1]どうかをチェックしますtr1[2]/tr2[2]tr1[1]/tr2[1]

私はあなたの他の機能をチェックしていません。

于 2013-10-13T00:54:47.610 に答える