1 / 1 / 0
Регистрация: 13.04.2019
Сообщений: 64
1

Наследование

05.09.2019, 10:11. Показов 1046. Ответов 5

Не правильно подставляются значения векторов v1 v2 v3 v4 в переопределенный метод вычисления периметра double rectangle:: perimetr() . В чем причина не могу понять

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
#include <windows.h>
#include <cmath>
using namespace std;
class FOURAngle//класс четырехугольник
{
protected:
    int x1,x2,x3,x4;//координаты по х
    int y1,y2,y3,y4;//координаты по у
public:
    void vvod();//ввод
    void vivod();//вывод
    virtual double volume()=0;//виртальная площадь
    virtual double perimetr()=0;//виртуальный периметр
 
    //длины векторов
    double v1 = sqrt(pow(x2-x1,2) + pow(y2-y1,2));
    double v2 = sqrt(pow(x3-x2,2) + pow(y3-y2,2));
    double vd = sqrt(pow(x3-x1,2) + pow(y3-y1,2));
    double v3 = sqrt(pow(x3-x4,2) + pow(y3-y4,2));
    double v4 = sqrt(pow(x1-x4,2) + pow(y1-y4,2));
};
 
class rectangle: public FOURAngle//класс прямоугольник
{
public:
    double volume();//площадь
    double perimetr();//периметр
};
 
double rectangle::volume()//реализация площади
{
    double p1=sqrt(pow(x2-x1,2)+pow(y2-y1,2));//
    double p2=sqrt(pow(x3-x2,2)+pow(y3-y2,2));//
    return p1*p2;//
}
 
double rectangle:: perimetr()//реализация периметра
{
    return v1+v2+v3+v4;
}
 
void FOURAngle::vvod()//реализация ввода
{
    cout<<"Vvedite x1: ";
    cin>>x1;
    cout<<"Vvedite y1: ";
    cin>>y1;
 
    cout<<"Vvedite x2: ";
    cin>>x2;
    cout<<"Vvedite y2: ";
    cin>>y2;
 
    cout<<"Vvedite x3: ";
    cin>>x3;
    cout<<"Vvedite y3: ";
    cin>>y3;
 
    cout<<"Vvedite x4: ";
    cin>>x4;
    cout<<"Vvedite y4: ";
    cin>>y4;
}
 
void FOURAngle::vivod()//реализация вывода
{
    cout<<x1<<" "<<y1<<endl<<x2<<" "<<y2<<endl<<x3<<" "<<y3<<endl<<x4<<" "<<y4<<endl;
}
int main()//мейн
{
    rectangle r;//прямоугольник
    r.vvod();//ввод
    r.vivod();//вывод
    double v=r.volume();//площадь
    double p=r.perimetr();//периметр
    cout<<"volume: "<<v<<endl;//вывод площади
    cout<<"perimetr: "<<p<<endl;//вывод периметра
    system("pause");
    return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.09.2019, 10:11
Ответы с готовыми решениями:

Наследование в С++.
Создать класс CFile, инкапсулирующий в себе такие функции работы с файлами, как Open, Close, Seek,...

Множественное наследование
Добрый день, коллективный разум, прошу твоей помощи. Вопрос в следующем: как имея следующую...

Наследование оператора '='
Ситуация такая: пишу класс 3-мерного вектора, предварительно создав шаблон n-мерного вектора (ибо...

Наследование конструктора от переменного шаблона
В С++ 11 появилась возможность унаследовать конструктора базового класса при помощи конструкции...

5
6737 / 4537 / 1838
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
05.09.2019, 17:02 2
Лучший ответ Сообщение было отмечено vladiks1805 как решение

Решение

Цитата Сообщение от vladiks1805 Посмотреть сообщение
Не правильно подставляются значения векторов v1 v2 v3 v4 в переопределенный метод вычисления периметра double rectangle:: perimetr() . В чем причина не могу понять
Потому что их надо пересчитывать, когда ты меняешь x1....x4, y1...y4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void FOURAngle::vvod()//реализация ввода
{
cout<<"Vvedite x1: ";
cin>>x1;
cout<<"Vvedite y1: ";
cin>>y1;
 
cout<<"Vvedite x2: ";
cin>>x2;
cout<<"Vvedite y2: ";
cin>>y2;
 
cout<<"Vvedite x3: ";
cin>>x3;
cout<<"Vvedite y3: ";
cin>>y3;
 
cout<<"Vvedite x4: ";
cin>>x4;
cout<<"Vvedite y4: ";
cin>>y4;
 
v1 = sqrt(pow(x2-x1,2) + pow(y2-y1,2));
v2 = sqrt(pow(x3-x2,2) + pow(y3-y2,2));
vd = sqrt(pow(x3-x1,2) + pow(y3-y1,2));
v3 = sqrt(pow(x3-x4,2) + pow(y3-y4,2));
v4 = sqrt(pow(x1-x4,2) + pow(y1-y4,2));
}
0
Модератор
Эксперт С++
10906 / 9014 / 5419
Регистрация: 18.12.2011
Сообщений: 24,097
05.09.2019, 20:45 3
Не советую использовать pow для возведения в квадрат
1. выглядит некрасиво
2. аргументы переводятся в double и результат вычисляется через xy=ey*log(x)
Разве трудно написать
C++
1
double v1 = double(x2-x1)*(x2-x1) +  double(y2-y1)*(y2-y1);
а еще лучше
C++
1
2
3
double tx=x2-x1;
double ty=y2-y1;
double v1 = tx*tx+ty*ty;
1
1 / 1 / 0
Регистрация: 13.04.2019
Сообщений: 64
06.09.2019, 15:48  [ТС] 4
Объявил переменные v1...v4 в методе ввода, все равно при подставке в метод вычисления периметра выводится неправильный результат. Не может быть это от sqrt?
0
6737 / 4537 / 1838
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
06.09.2019, 16:03 5
Цитата Сообщение от vladiks1805 Посмотреть сообщение
Объявил переменные v1...v4 в
Зачем ты их там объявил? Должны использоваться те, что объявлены в классе. Сделай this->v1 .... this->v4
0
1 / 1 / 0
Регистрация: 13.04.2019
Сообщений: 64
06.09.2019, 16:08  [ТС] 6
Все разобрался спасибо)))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.09.2019, 16:08

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Множественное наследование - так ли это плохо?
Вопрос не в том, что это такое и пр. С момента изучения Си++ во всех книжках все авторы (кроме...

Наследование. Написать набор классов, представляющий выражения.
Доброго времени суток! Помогите разобраться с данной задачей, пожалуйста. Изучаем в университете...

Наследование шаблоном шаблона (наследование конструктора)
Всем привет! Думаю, что эта тема хоть и касается общих вопросов программирования, но будет уместна...

Наследование от TShape
Пишу класс наследник от TShape. Не получается переопределить конструктор... Выдает ошибку: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.