Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
TheCross84
1 / 1 / 0
Регистрация: 15.03.2012
Сообщений: 6
#1

Виртуальные функции(помогите исправить) - C++

23.03.2012, 00:07. Просмотров 435. Ответов 1
Метки нет (Все метки)

Задание:
Создать абстрактный базовый класс Figure с виртуальной функцией - площадь.
Создать производные классы Square, Circle, Triangle, Trapeze в которых данная
функция переопределена. В функции main определить массив указателей на
абстрактный класс, которым присваиваются адреса различных объектов.

Наработки:
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
82
83
#include<iostream>
#include<math.h>
using namespace std;
class Figure
{
    public:
    double A;
    double B;
    double C;
    double x;
    double r;
    double a;
    double b;
    double h;
    void set()
    {
        cout<<"Vvedite storoni treugolnika"<<endl; cin>>A>>B>>C;
        cout<<"Vvedite storonu kvadrata"<<endl;cin>>x;
        cout<<"Vvedite radius kruga"<<endl; cin>>r;
        cout<<"Vvedite storonu(a), storonu(b), vysotu(h) Trapecii"<<endl; cin>>a>>b>>h;
    }
    void get()
    {
        
    }
    virtual double SFigure()=0;
 
};
class Square: public Figure
{
    
    double SFigure()
    {
        return x*x;
    }
};
class Circle: public Figure
{
public:
    double SFigure()
    {
        return 2*3.14*(r*r);
    }
};
class Triangle: public Figure
{   
public:
    double SFigure()
    {
        double p,q;
        p=(A+B+C)/2;
        q=p*(p-A)*(p-B)*(p-C);
        return  pow(q,1/2);
    }
};
class Trapeze: public Figure
{
public:
    double SFigure()
    {
        return (a+b)*h/2;
    }
};
void main()
{
    Figure *F;
    Square S;
    Circle C;
    Triangle T;
    Trapeze R;
    S.set();
    C.set();
    T.set();
    R.set();
    F=&S;
    cout<<F->SFigure();
    F=&C;
    cout<<F->SFigure();
    F=&T;
    cout<<F->SFigure();
    F=&R;
    F->SFigure();
}
Добавлено через 34 минуты
Почти получилось сделать самому
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include<iostream>
#include<math.h>
#include<windows.h>
using namespace std;
class Figure
{
    public:
    double x;
    double y;
    double z;
    void set(double Tx, double Ty, double Tz)
    {
        x=Tx;
        y=Ty;
        z=Tz;
    }
    void get()
    {
        
    }
    virtual double SFigure()=0;
 
};
class Square: public Figure
{
    double SFigure()
    {
        return x*x;
    }
};
class Circle: public Figure
{
public:
    double SFigure()
    {
        return 2*3.14*(x*x);
    }
};
class Triangle: public Figure
{   
public:
    double SFigure()
    {
        double p,q;
        p=(x+y+z)/2;
        q=p*(p-x)*(p-y)*(p-z);
        return  pow(q,1/2);
    }
};
class Trapeze: public Figure
{
public:
    double SFigure()
    {
        return (x+y)*z/2;
    }
};
void main()
{
    start:
    SetConsoleCP(1251); 
    SetConsoleOutputCP(1251);
    double TMP1;
    double TMP2;
    double TMP3;
    Figure *F;
    Square S;
    Circle C;
    Triangle T;
    Trapeze R;
    cout<<"Вводим сторону квадрата:          ";
    cin>>TMP1;
    S.set(TMP1,NULL,NULL);
    cout<<"Вводим радиус круга:              ";
    cin>>TMP1;
    C.set(TMP1,NULL,NULL);
    cout<<"Вводим стороны треугольника:      ";
    cin>>TMP1>>TMP2>>TMP3;
    T.set(TMP1,TMP2,TMP3);
    cout<<"Вводим стороны и высоту трапеции: ";
    cin>>TMP1>>TMP2>>TMP3;
    R.set(TMP1,TMP2,TMP3);
    F=&S;
    cout<<"Квадрат:     "<<F->SFigure()<<endl;
    F=&C;
    cout<<"Круг:        "<<F->SFigure()<<endl;
    F=&T;
    cout<<"Треугольник: "<<F->SFigure()<<endl;
    F=&R;
    cout<<"Трапеция:    "<<F->SFigure()<<endl;
    char flag;
    cout<<"Повторить?(y/n)"<<endl;
    cin>>flag;
    if(flag='y') goto start;
}
Но есть 1 НО, по моему тут не правильно работает расчет площади треугольника, если не так что поправьте пожалуйста
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2012, 00:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Виртуальные функции(помогите исправить) (C++):

виртуальные и чисто виртуальные функции - C++
Чем они отличаются?? если можно, с примерами. И как из виртуальной функции сделать чисто виртуальную? #include &lt;iostream&gt; using...

Виртуальные функции - C++
Разработать программу с использованием наследования классов, реализующую классы: Земноводное(ареал обитания)-&gt;Крокодил(род, длина, вес) ...

Виртуальные функции - C++
Здравствуйте, помогите пожалуйста с вопросом: Заданный порожденный класс, содержащий две функции по таким именно именами, как и в...

Виртуальные функции - C++
Помогите пожалуйста написать задачу, никак не могу разобраться. Создайте класс Matr, определите в нем виртуальную функцию-член...

виртуальные функции - C++
Помогите плиз с вертуальными функциями. Некак немогу понят вот эту задачу: переопределяемая виртуальная функция находит: ...

Виртуальные функции - C++
Объясните пожалуйста зачем нужны чисто виртуальные функции?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
NightCoder89
12 / 12 / 1
Регистрация: 22.03.2012
Сообщений: 42
23.03.2012, 01:13 #2
Накидал на скорую руку :
Код
#include <iostream>
#include <cmath>
using namespace std; 

class Figure
{
public:
	Figure(){}
	virtual ~Figure(){}

/*	virtual void SetMenu() = 0; */// Менюшка, которую переопред. в каждом классе как диалог ввода данных. 
	                              // Тогда удаляем костр. с параметрами и оставляем только костр. по умолчанию 

    virtual double SFigure() = 0;
};
class Square: public Figure
{
public: 
	Square() {}
	Square(double A, double B):sideA(A), sideB(B) {}
	virtual ~Square(){}

    double SFigure() { return sideA * sideB; }

private:
	double sideA, sideB;
};
class Circle: public Figure
{
public:
	Circle(){}
	Circle(double Radius): dRadius(Radius){}
	virtual ~Circle(){}

    double SFigure(){ return 2 * 3.14 * (dRadius * dRadius); }

private:
	double dRadius;
};
class Triangle: public Figure
{       
public:
	Triangle(){}
	Triangle(double A, double B, double C, double Radius): sideA(A), sideB(B), sideC(C), dRadius(Radius){}
	virtual ~Triangle(){}

    double SFigure(){ return (sideA * sideB * sideC)/ (4 * dRadius); }

private:
	double sideA, sideB, sideC, dRadius;
};
class Trapeze: public Figure
{
public:
	Trapeze(){}
	Trapeze(double A, double B, double C, double D): sideA(A), sideB(B), sideC(C), sideD(D){}
	virtual ~Trapeze(){}

    double SFigure()
    {
        return ((sideA + sideB)/2) * sqrt((pow(sideC, 2) - pow(((pow((sideB - sideA), 2) + pow(sideC, 2) - pow(sideD, 2))/(2 * (sideB - sideA))), 2)));
    }

private:
	double sideA, sideB, sideC, sideD;
};
Меню ввода сторон можно реализовать в main , а потом закидывать данные в конструктор. Хотя кошерней будет переопределить в каждом классе свое меню ввода и конструкторы сделать по умолчанию. Виртуальные деструкторы нужны, когда мы будем работать по принципу Figure *р = new Triangle(); Также нужно реализовать проверку корректности ввода данных, тоесть чтоб вместо double не вводили, к примеру char.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2012, 01:13
Привет! Вот еще темы с ответами:

Виртуальные функции в С++ - C++
Здравствуйт. Помогите осмыслить доконца вирт. ф-ции. После прочтения источников я собрал определенную картину: Вирт функции...

Виртуальные функции - C++
Пожалуйста, подскажите как быть: class Circles; class Rectangs; class Snake { public: Circles *drr; void start1(); ...

Виртуальные функции. - C++
Приветствую всех. Дана такая программа (на самом деле она больше и сложнее, но структура и проблема те же): #include &lt;iostream&gt; ...

виртуальные функции - C++
Добрый день. Начал изучать виртуальные функции и столкнулся с проблемой. Не могу перегрузить функцию. Объясните что не так и как нужно: ...


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

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

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