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

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

Войти
Регистрация
Восстановить пароль
 
tarakano
34 / 26 / 5
Регистрация: 24.12.2010
Сообщений: 164
#1

наследование, фунция main - C++

23.05.2012, 00:01. Просмотров 505. Ответов 10
Метки нет (Все метки)

вот условие задачи:
общие требования:
конструкторы и методы обязательно должны проверять параметры на допустимость, в противном случае выводить сообщение об ошибке
задание:
создать абстрактный класс Triangle(треугольник) для представления треугольника с виртуальными функциями вычисления площади и периметра. Поля должны включать 2 стороны и угол между ними. Определить классы наследники: прямоугольный треугольник, равнобедренный треугольник, равностороний треугольник со своими ф-циями перевода и вывода на экран.
вот что у меня вышло, но не знаю что прописать в ф-ию, 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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <iostream>
#include <cmath>
 
//-----------------------------------------------------------------------------
 
class Triangle
{
public:
    int a,b,t;
    virtual double area() const = 0;
    virtual double perimeter() const = 0;
};
 
//-----------------------------------------------------------------------------
 
class Priamoygolni: public Triangle
{
public:
    Priamoygolni( double a = 2, double b=3, double t =1.57 ):
    _radius(radius)
    {
    }
 
    void set_a(double a)
    {
        _a = a;
    }
 
    void set_b(double b)
    {
        _b = b;
    }
    void set_t(double t)
    {
        _t = t;
    }
  
    virtual double area() const
    {
        return _a*_b/2;
    }
 
    virtual double perimeter() const
    {
        return _a+_b+sqrt(_a*_a+_b*_b);
    }
 
 
//-----------------------------------------------------------------------------
 
class Ravnobedreni: public Triangle
{
public:
    Ravnobedreni(double a = 1, double b = 1, double t = 0.4):
    _a(a),
    _b(b),
    _t(t)
    {
         
    virtual void print() const
    {
        std::cout << "a = " << _a << "\tb = " << _b << "\tt = " << _t << std::endl;
    }
 
    virtual double area() const
    {
        double _c=2*_b*sin(t/2)
        double p = (_a + _b + _c) / 2.0;
 
        return sqrt(p * (p - _a) * (p - _b) * (p - _c));
    }
 
    virtual double perimeter() const
    {
        return _a + _b + _c;
    }
 
private:
    double _a;
    double _b;
    double _t;
    double _c;
};
 
//-----------------------------------------------------------------------------
 
class Ravnostoroni: public Triangle
{
public:
    Ravnostoroni(double a = 2, b=2, t=1.047):
    _a(a)
    _b(b)
    _t(t)
    {
    }
 
    void set_a(double a)
    {
        _a = a;
    }
     void set_b(double b)
    {
        _b = b;
    }
    void set_t(double t)
    {
        _t = t;
    }
 
    virtual void print() const
    {
        std::cout << "a = " << _a << std::endl;
        std::cout << "b = " << _b << std::endl;
        std::cout << "t = " << _t << std::endl;
    }
 
    virtual double area() const
    {
        return 0.43*_a * _a;
    }
 
    virtual double perimeter() const
    {
        return 3 * _a;
    }
 
private:
    double _a;
    double _b;
    double _t;
};
 
//-----------------------------------------------------------------------------
 
int main()
{
  
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2012, 00:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос наследование, фунция main (C++):

do while фунция - C++
Здравствуйте, вот есть код приведенный ниже,прости те за культуру написания, но суть задания в том чтобы выполнить do while с вычислением...

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

Фунция putchar() - C++
Всем привет! Почему, когда вывожу часть строкового массива посимвольно - функция putchar выводит каждый элемент по два раза? #include...

фунция random - C++
в паскале есть random(l+r) случайное число из диапозона l+r;как в с++?

Какой новые синтаксис: int main() VS. void main() - C++
Долго не занимался программированием , но тут жена решила поучится , да и сам повторить ,так вот столкнулся с такой темой на 4pda может...

Какая разница между int main и void main? - C++
какая разница между (int main) i (void main)?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 00:06 #2
можете написать функцию вывода на экран всех атрибутов треугольника. функция принимает ссылку на базовый класс. а в мэине создаете три экземпляра конктетных классов и передаете их в эту функцию. вот и получится, что такая функция печати ничего не знает про конкретные треугольники, а работает только с сылкой на базовый абстрактный класс.

т.е. как-то так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Print(Triangle& triangle)
{
   std::cout << "area = " << triangle.area() << std::endl;
   std::cout << "perimetr = " << triangle.perimetr() << std::endl;
}
 
int main()
{
    Triangle1 tr1;
    Triangle2 tr2;
    Triangle3 tr3;
 
    Print(tr1);
    Print(tr2);
    Print(tr3);
 
    return 0;
}

Кстати в строке девять: int a,b,t; - это ошибка размещать данные в базовом абстрактном классе, да еще и публичные. ошибка проектирования класса, а не синтаксическая.
tarakano
34 / 26 / 5
Регистрация: 24.12.2010
Сообщений: 164
23.05.2012, 00:15  [ТС] #3
DU, спасибо, может мне ещё в базовый класс добавить поиск периметра, он ведь по одной и тойже формуле ищется??
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 00:17 #4
что такое поиск периметра? может его расчет? так он уже есть в базовом классе в виде чисто виртуальной функции и в каждом наследнике считается по своему. поэтому ничего в базовый наверно добавлять не надо.
tarakano
34 / 26 / 5
Регистрация: 24.12.2010
Сообщений: 164
23.05.2012, 00:18  [ТС] #5
a - сторона 1
b - сторона 2
t - угол между 2мя сторонами

ещё надо как-то дописать проверку на правильность ввода, т.е. если мы выбираем прямоугольный и ставит стороны 4, 5 и угол (не 1.57) то выдавал сообщение что не правильно выбран треугольник
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 00:27 #6
ну в базовый класс добавте еще одну чисто виртуальную функцию virtual bool validate() const = 0; в наследниках напишите соответствующую проверку. тогда функцию принт можно будет дополнить. звать сперва эту validate и если она вернет false, выводить сообщение какое-нибудь, если же треугольник корректный, то выводить периметр и площать как сейчас.
tarakano
34 / 26 / 5
Регистрация: 24.12.2010
Сообщений: 164
23.05.2012, 00:34  [ТС] #7
Цитата Сообщение от DU Посмотреть сообщение
ну в базовый класс добавте еще одну чисто виртуальную функцию virtual bool validate() const = 0; в наследниках напишите соответствующую проверку. тогда функцию принт можно будет дополнить. звать сперва эту validate и если она вернет false, выводить сообщение какое-нибудь, если же треугольник корректный, то выводить периметр и площать как сейчас.
получается вот так? чего не хватает?
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <iostream>
#include <cmath>
 
//-----------------------------------------------------------------------------
 
class Triangle
{
public:
    int a,b,t;
    virtual double area() const = 0;
    virtual double perimeter() const = 0;
     virtual bool validate() const = 0;
};
 
//-----------------------------------------------------------------------------
 
class Priamoygolni: public Triangle
{
public:
    Priamoygolni( double a = 2, double b=3, double t =1.57 ):
    _radius(radius)
    {
    }
 
    void set_a(double a)
    {
        _a = a;
    }
 
    void set_b(double b)
    {
        _b = b;
    }
    void set_t(double t)
    {
        _t = t;
    }
    
  virtual bool validate() 
  { if t=1.57 then 
  validate=1
  else validate=0
  }
 
    virtual double area() const
    {
        return _a*_b/2;
    }
 
    virtual double perimeter() const
    {
        return _a+_b+sqrt(_a*_a+_b*_b);
    }
 
 
//-----------------------------------------------------------------------------
 
class Ravnobedreni: public Triangle
{
public:
    Ravnobedreni(double a = 1, double b = 1, double t = 0.4):
    _a(a),
    _b(b),
    _t(t)
    {
         
    virtual void print() const
    {
        std::cout << "a = " << _a << "\tb = " << _b << "\tt = " << _t << std::endl;
    }
    
  virtual bool validate() 
  { if _a=_b then 
  validate=1
  else validate=0
  }
    virtual double area() const
    {
        double _c=2*_b*sin(t/2)
        double p = (_a + _b + _c) / 2.0;
 
        return sqrt(p * (p - _a) * (p - _b) * (p - _c));
    }
 
    virtual double perimeter() const
    {
        return _a + _b + _c;
    }
 
private:
    double _a;
    double _b;
    double _t;
    double _c;
};
 
//-----------------------------------------------------------------------------
 
class Ravnostoroni: public Triangle
{
public:
    Ravnostoroni(double a = 2, b=2, t=1.047):
    _a(a)
    _b(b)
    _t(t)
    {
    }
 
    void set_a(double a)
    {
        _a = a;
    }
     void set_b(double b)
    {
        _b = b;
    }
    void set_t(double t)
    {
        _t = t;
    }
 
    
  virtual bool validate() 
  { if a=b=c then 
  validate=1
  else validate=0
  }
    virtual void print() const
    {
        std::cout << "a = " << _a << std::endl;
        std::cout << "b = " << _b << std::endl;
        std::cout << "t = " << _t << std::endl;
    }
 
    virtual double area() const
    {
        return 0.43*_a * _a;
    }
 
    virtual double perimeter() const
    {
        return 3 * _a;
    }
 
private:
    double _a;
    double _b;
    double _t;
};
 
//-----------------------------------------------------------------------------
 
void Print(Triangle& triangle)
{
   std::cout << "area = " << triangle.area() << std::endl;
   std::cout << "perimetr = " << triangle.perimetr() << std::endl;
}
 
int main()
{
    Triangle1 tr1;
    Triangle2 tr2;
    Triangle3 tr3;
 
    Print(tr1);
    Print(tr2);
    Print(tr3);
 
    return 0;
}
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 00:42 #8
что-то как-то криво.
во первых функии validate в наследниках должны быть константными и возвращать результат проверки:

C++
1
2
3
4
5
 virtual bool validate()  const
 {
    return a == b && b == c;
 }
 // другие тоже исправить.
в функцию Print все таки лучше передавать константный треугольник:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Print(const Triangle& triangle)
{
   triangle.print();
   if (triangle.validate())
   {
     std::cout << "area = " << triangle.area() << std::endl;
     std::cout << "perimetr = " << triangle.perimetr() << std::endl;
   }
   else
  {
     std::cout << "Triangle is not valid." << std::endl;
  }
}
tarakano
34 / 26 / 5
Регистрация: 24.12.2010
Сообщений: 164
23.05.2012, 00:52  [ТС] #9
а в ф-ции main мне надо прописать типа:
1 - вводим прямоугольный треугольник
2- вводим равнобедренный треугольник
3- вводим прямоугольный треугольник
4- выход

?
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 00:59 #10
ну наверно. вам виднее. не я же задание придумал.
tarakano
34 / 26 / 5
Регистрация: 24.12.2010
Сообщений: 164
23.05.2012, 02:37  [ТС] #11
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include <iostream>
#include <cmath>
 
//-----------------------------------------------------------------------------
 
class Triangle
{
public:
    int a,b,t;
    virtual double area() const = 0;
    virtual double perimeter() const = 0;
     virtual bool validate() const = 0;
};
 
//-----------------------------------------------------------------------------
 
class Priamoygolni: public Triangle
{
public:
    Priamoygolni( double a = 2, double b=3, double t =1.57 ):
    _radius(radius)
    {
    }
 
    void set_a(double a)
    {
        _a = a;
    }
 
    void set_b(double b)
    {
        _b = b;
    }
    void set_t(double t)
    {
        _t = t;
    }
    
   virtual bool validate()  const
 {
    return t=1.57;
 }
    virtual double area() const
    {
        return _a*_b/2;
    }
 
    virtual double perimeter() const
    {
        return _a+_b+sqrt(_a*_a+_b*_b);
    }
 
 
//-----------------------------------------------------------------------------
 
class Ravnobedreni: public Triangle
{
public:
    Ravnobedreni(double a = 1, double b = 1, double t = 0.4):
    _a(a),
    _b(b),
    _t(t)
    {
         
    virtual void print() const
    {
        std::cout << "a = " << _a << "\tb = " << _b << "\tt = " << _t << std::endl;
    }
    
   virtual bool validate()  const
 {
    return a == b ;
 }
  }
    virtual double area() const
    {
        double _c=2*_b*sin(t/2)
        double p = (_a + _b + _c) / 2.0;
 
        return sqrt(p * (p - _a) * (p - _b) * (p - _c));
    }
 
    virtual double perimeter() const
    {
        return _a + _b + _c;
    }
 
private:
    double _a;
    double _b;
    double _t;
    double _c;
};
 
//-----------------------------------------------------------------------------
 
class Ravnostoroni: public Triangle
{
public:
    Ravnostoroni(double a = 2, b=2, t=1.047):
    _a(a)
    _b(b)
    _t(t)
    {
    }
 
    void set_a(double a)
    {
        _a = a;
    }
     void set_b(double b)
    {
        _b = b;
    }
    void set_t(double t)
    {
        _t = t;
    }
 
    
   virtual bool validate()  const
 {
    return a == b && b == c;
 }
  }
    virtual void print() const
    {
        std::cout << "a = " << _a << std::endl;
        std::cout << "b = " << _b << std::endl;
        std::cout << "t = " << _t << std::endl;
    }
 
    virtual double area() const
    {
        return 0.43*_a * _a;
    }
 
    virtual double perimeter() const
    {
        return 3 * _a;
    }
 
private:
    double _a;
    double _b;
    double _t;
};
 
//-----------------------------------------------------------------------------
 
void Print(const Triangle& triangle)
{
   triangle.print();
   if (triangle.validate())
   {
     std::cout << "area = " << triangle.area() << std::endl;
     std::cout << "perimetr = " << triangle.perimetr() << std::endl;
   }
   else
  {
     std::cout << "Triangle is not valid." << std::endl;
  }
}
 
int menu()
 
{
 
        int choice;
 
        cout<<"nn ***Menu*** n";
 
        cout<<"(1)Priamoygolni treygolnik\n";
 
        cout<<"(2)Ravnobedreni treygolnik\n";
 
        cout<<"(3)Ravnostoroni treygolnik\n";
 
        cout<<"(4)Vihod\n";
 
        cin>>choice;
 
        cout<<"-------------------";
 
        return choice;
 
}
int main()
{
 
    
    Triangle1 tr1;
    Triangle2 tr2;
    Triangle3 tr3;
 
    Print(tr1);
    Print(tr2);
    Print(tr3);
 
    return 0;
}
Добавлено через 1 час 26 минут
кто-нибудь знает как доделать программу?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2012, 02:37
Привет! Вот еще темы с ответами:

Квадратичная фунция для хэш-таблицы - C++
Добрый день! Подскажите, что тут c1, c2, h'(key)? Задание прикрепил картинкой.. А ниже функция, которая дана в задании.. int...

Фунция переписывания строчки в обратном порядке - C++
Я написал код на ввод символьной строки. Как мне вывести введенную строчку в обратном порядке? #include &lt;iostream&gt; #include...

Фунция, проверяющая, является ли число степенью числа 5 - C++
Описать функцию IsPower5(K) логического типа, возвращающую True, если целый параметр K (&gt; 0) является степенью числа 5, и False в противном...

Почему в одних случаях пишут void main(), а в других случаях int main() {return 1;} - C++
Препод мне доказывает, что void в main`е писать неправильно, а объяснить не может почему. Кто расскажет?)


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.05.2012, 02:37
Ответ Создать тему
Опции темы

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