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

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

Восстановить пароль Регистрация
 
tarakano
34 / 26 / 5
Регистрация: 24.12.2010
Сообщений: 164
23.05.2012, 00:01     наследование, фунция main #1
вот условие задачи:
общие требования:
конструкторы и методы обязательно должны проверять параметры на допустимость, в противном случае выводить сообщение об ошибке
задание:
создать абстрактный класс 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
Посмотрите здесь:

int main() VS void main() C++
C++ фунция bool()
фунция random C++
C++ От void main() к int main()
do while фунция C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 00:06     наследование, фунция main #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  [ТС]     наследование, фунция main #3
DU, спасибо, может мне ещё в базовый класс добавить поиск периметра, он ведь по одной и тойже формуле ищется??
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 00:17     наследование, фунция main #4
что такое поиск периметра? может его расчет? так он уже есть в базовом классе в виде чисто виртуальной функции и в каждом наследнике считается по своему. поэтому ничего в базовый наверно добавлять не надо.
tarakano
34 / 26 / 5
Регистрация: 24.12.2010
Сообщений: 164
23.05.2012, 00:18  [ТС]     наследование, фунция main #5
a - сторона 1
b - сторона 2
t - угол между 2мя сторонами

ещё надо как-то дописать проверку на правильность ввода, т.е. если мы выбираем прямоугольный и ставит стороны 4, 5 и угол (не 1.57) то выдавал сообщение что не правильно выбран треугольник
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 00:27     наследование, фунция main #6
ну в базовый класс добавте еще одну чисто виртуальную функцию virtual bool validate() const = 0; в наследниках напишите соответствующую проверку. тогда функцию принт можно будет дополнить. звать сперва эту validate и если она вернет false, выводить сообщение какое-нибудь, если же треугольник корректный, то выводить периметр и площать как сейчас.
tarakano
34 / 26 / 5
Регистрация: 24.12.2010
Сообщений: 164
23.05.2012, 00:34  [ТС]     наследование, фунция main #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
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 00:42     наследование, фунция main #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  [ТС]     наследование, фунция main #9
а в ф-ции main мне надо прописать типа:
1 - вводим прямоугольный треугольник
2- вводим равнобедренный треугольник
3- вводим прямоугольный треугольник
4- выход

?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 00:59     наследование, фунция main #10
ну наверно. вам виднее. не я же задание придумал.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2012, 02:37     наследование, фунция main
Еще ссылки по теме:

Фунция putchar() C++
Какой новые синтаксис: int main() VS. void main() C++
C++ Квадратичная фунция для хэш-таблицы

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

Или воспользуйтесь поиском по форуму:
tarakano
34 / 26 / 5
Регистрация: 24.12.2010
Сообщений: 164
23.05.2012, 02:37  [ТС]     наследование, фунция main #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 минут
кто-нибудь знает как доделать программу?
Yandex
Объявления
23.05.2012, 02:37     наследование, фунция main
Ответ Создать тему
Опции темы

Текущее время: 05:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru