1 Востаннє редагувалося GROUND07 (03.04.2019 21:28:35)

Тема: Не записуються введені дані

Завдання полягає в тому, що у нас є клас трикутник і нам потрібно знайти його площу, периметр і значення кутів. Проте сторони повинні бути в масиві і це має бути з використанням динамічної пам'ятті. З конструктором без параметрів все гаразд, він справно працює, проте коли користувач вводить значення - програма вилітає. У чому помилка?

#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
using namespace std;
#define MAX 3
class Triangle {
private:
    double *abc;                  //cторони
public:
    Triangle();            //  конструтор без параметрів
    Triangle(double abc[]); // конструтор з параметром
    ~Triangle();
    double Area();
    double Per();
    bool Check();
    double printAngle();
};
Triangle::Triangle() {    // конструктор без параметрів 
    abc = new double[MAX];
    abc[0] = 4.0;
    abc[1] = 3.0;
    abc[2] = 5.0;
}
Triangle::Triangle(double abc[]) { // конструктор з параметром
    this->abc[0] = abc[0];
    this->abc[1] = abc[1];
    this->abc[2] = abc[2];
    if (Check()) {
        printf("\nCorrect input in constructor");
    }
    else {
        printf("\nIncorrect input in constructor");
    }
}
Triangle::~Triangle() {
    delete[] abc;
    abc = nullptr;
}
bool Triangle::Check() {
    if (abc[0] < (abc[1] + abc[2]) && abc[1] < (abc[0] + abc[2]) && abc[2] < (abc[1] + abc[0])) {
        return true;
    }
    else {
        return false;
    }
}
double Triangle::Area() {//площа
    double ar, p;
    p = (abc[1] + abc[2] + abc[0]) / 2;  //півпериметр
    ar = sqrt(p * (p - abc[0]) * (p - abc[1]) * (p - abc[2]));
    return ar;
}
double Triangle::Per() {          //периметр
    return (abc[0] + abc[2] + abc[1]);
}
double Triangle::printAngle() {  // квадрати сторін будуть a2, b2, c2
    double a2 = pow(abc[0], 2);
    double b2 = pow(abc[1], 2);
    double c2 = pow(abc[2], 2);
    // довжини сторін a, b, c
    double a = sqrt(a2);
    double b = sqrt(b2);
    double c = sqrt(c2);
    // теорема косинусів
    double alpha = acos((b2 + c2 - a2) / (2 * b * c));
    double betta = acos((a2 + c2 - b2) / (2 * a * c));
    double gamma = acos((a2 + b2 - c2) / (2 * a * b));
    // перевід з радіан в градуси
    alpha = alpha * 180 / M_PI;
    betta = betta * 180 / M_PI;
    gamma = gamma * 180 / M_PI;

    //виведення
    cout << "\nalpha : " << alpha << endl;
    cout << "betta : " << betta << endl;
    cout << "gamma : " << gamma << endl;
    return 0;
}
int main() {
    double val[MAX];
    cout << "Input values" << endl;
    cin >> val[0], val[1], val[2];

    Triangle trian1(val);
    cout << " with param" << endl;
    cout << "Area " << trian1.Area() << endl;
    cout << "Perimetr  " << trian1.Per() << endl;

    Triangle trian2;
    cout << " without param" << endl;
    cout << "Area " << trian2.Area() << endl;
    cout << "Perimetr  " << trian2.Per() << endl;

    trian2.printAngle();
    system("PAUSE");
    return 0;
}

2

Re: Не записуються введені дані

1. Оператор , (кома) працює зовсім не так.

 cin >> val[0] >> val[1] >> val[2];

2. В конструкторі з параметром ви не виділяєте пам'ять під масив, від цього програма і падає.

Подякували: GROUND071

3

Re: Не записуються введені дані

#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
using namespace std;
#define MAX 3
class Triangle {
private:
    double *abc;                  //cторони
public:
    Triangle();            //  конструтор без параметрів
    Triangle(double abc[]); // конструтор з параметром
    ~Triangle();
    double Area();
    double Per();
    bool Check();
    double printAngle();
};
Triangle::Triangle() {    // конструктор без параметрів 
    abc = new double[MAX];
    abc[0] = 4.0;
    abc[1] = 3.0;
    abc[2] = 5.0;
}
Triangle::Triangle(double abc[]) { // конструктор з параметром
    this->abc = new double[MAX];
    this->abc[0] = abc[0];
    this->abc[1] = abc[1];
    this->abc[2] = abc[2];
    if (Check()) {
        printf("\nCorrect input in constructor");
    }
    else {
        printf("\nIncorrect input in constructor");
    }
}
Triangle::~Triangle() {
    delete[] abc;
    abc = nullptr;
}
bool Triangle::Check() {
    if (abc[0] < (abc[1] + abc[2]) && abc[1] < (abc[0] + abc[2]) && abc[2] < (abc[1] + abc[0])) {
        return true;
    }
    else {
        return false;
    }
}
double Triangle::Area() {//площа
    double ar, p;
    p = (abc[1] + abc[2] + abc[0]) / 2;  //півпериметр
    ar = sqrt(p * (p - abc[0]) * (p - abc[1]) * (p - abc[2]));
    return ar;
}
double Triangle::Per() {          //периметр
    return (abc[0] + abc[2] + abc[1]);
}
double Triangle::printAngle() {  // квадрати сторін будуть a2, b2, c2
    double a2 = pow(abc[0], 2);
    double b2 = pow(abc[1], 2);
    double c2 = pow(abc[2], 2);
    // довжини сторін a, b, c
    double a = sqrt(a2);
    double b = sqrt(b2);
    double c = sqrt(c2);
    // теорема косинусів
    double alpha = acos((b2 + c2 - a2) / (2 * b * c));
    double betta = acos((a2 + c2 - b2) / (2 * a * c));
    double gamma = acos((a2 + b2 - c2) / (2 * a * b));
    // перевід з радіан в градуси
    alpha = alpha * 180 / M_PI;
    betta = betta * 180 / M_PI;
    gamma = gamma * 180 / M_PI;

    //виведення
    cout << "\nalpha : " << alpha << endl;
    cout << "betta : " << betta << endl;
    cout << "gamma : " << gamma << endl;
    return 0;
}
int main() {
    double val[MAX];
    cout << "Input values" << endl;
    cin >> val[0];
    cin >> val[1];
    cin >> val[2];

    Triangle trian1(val);
    cout << " with param" << endl;
    cout << "Area " << trian1.Area() << endl;
    cout << "Perimetr  " << trian1.Per() << endl;

    Triangle trian2;
    cout << " without param" << endl;
    cout << "Area " << trian2.Area() << endl;
    cout << "Perimetr  " << trian2.Per() << endl;

    trian2.printAngle();
    system("PAUSE");
    return 0;
}
Подякували: GROUND071

4

Re: Не записуються введені дані

Дякую велике!

topprogrammer написав:
#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
using namespace std;
#define MAX 3
class Triangle {
private:
    double *abc;                  //cторони
public:
    Triangle();            //  конструтор без параметрів
    Triangle(double abc[]); // конструтор з параметром
    ~Triangle();
    double Area();
    double Per();
    bool Check();
    double printAngle();
};
Triangle::Triangle() {    // конструктор без параметрів 
    abc = new double[MAX];
    abc[0] = 4.0;
    abc[1] = 3.0;
    abc[2] = 5.0;
}
Triangle::Triangle(double abc[]) { // конструктор з параметром
    this->abc = new double[MAX];
    this->abc[0] = abc[0];
    this->abc[1] = abc[1];
    this->abc[2] = abc[2];
    if (Check()) {
        printf("\nCorrect input in constructor");
    }
    else {
        printf("\nIncorrect input in constructor");
    }
}
Triangle::~Triangle() {
    delete[] abc;
    abc = nullptr;
}
bool Triangle::Check() {
    if (abc[0] < (abc[1] + abc[2]) && abc[1] < (abc[0] + abc[2]) && abc[2] < (abc[1] + abc[0])) {
        return true;
    }
    else {
        return false;
    }
}
double Triangle::Area() {//площа
    double ar, p;
    p = (abc[1] + abc[2] + abc[0]) / 2;  //півпериметр
    ar = sqrt(p * (p - abc[0]) * (p - abc[1]) * (p - abc[2]));
    return ar;
}
double Triangle::Per() {          //периметр
    return (abc[0] + abc[2] + abc[1]);
}
double Triangle::printAngle() {  // квадрати сторін будуть a2, b2, c2
    double a2 = pow(abc[0], 2);
    double b2 = pow(abc[1], 2);
    double c2 = pow(abc[2], 2);
    // довжини сторін a, b, c
    double a = sqrt(a2);
    double b = sqrt(b2);
    double c = sqrt(c2);
    // теорема косинусів
    double alpha = acos((b2 + c2 - a2) / (2 * b * c));
    double betta = acos((a2 + c2 - b2) / (2 * a * c));
    double gamma = acos((a2 + b2 - c2) / (2 * a * b));
    // перевід з радіан в градуси
    alpha = alpha * 180 / M_PI;
    betta = betta * 180 / M_PI;
    gamma = gamma * 180 / M_PI;

    //виведення
    cout << "\nalpha : " << alpha << endl;
    cout << "betta : " << betta << endl;
    cout << "gamma : " << gamma << endl;
    return 0;
}
int main() {
    double val[MAX];
    cout << "Input values" << endl;
    cin >> val[0];
    cin >> val[1];
    cin >> val[2];

    Triangle trian1(val);
    cout << " with param" << endl;
    cout << "Area " << trian1.Area() << endl;
    cout << "Perimetr  " << trian1.Per() << endl;

    Triangle trian2;
    cout << " without param" << endl;
    cout << "Area " << trian2.Area() << endl;
    cout << "Perimetr  " << trian2.Per() << endl;

    trian2.printAngle();
    system("PAUSE");
    return 0;
}

5

Re: Не записуються введені дані

Прихований текст

"дякувати" - дієслово (питання "що роблю?"), відповідно, прийменник "велике" (питання "яке?") із ним не має сенсу. Треба прислівник (питання "як?") - наприклад щиро, гречно, красно дякую

6

Re: Не записуються введені дані

По Triangle::Check(): якщо потрібне булеве значення, то безглуздо писати

if(умова) 
    return true; 
else 
    return false;

бо це те саме, що

return умова;

І дрібна порада: нерівність трикутника нескладними перетвореннями можна скоротити до

bool Triangle::Check() {
    return abs(abc[1] - abc[2]) < abc[0] && abc[0] < (abc[1] + abc[2]);
}
Подякували: leofun011