Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/42: Рейтинг темы: голосов - 42, средняя оценка - 5.00
34 / 26 / 0
Регистрация: 24.12.2010
Сообщений: 165

Создание классов

26.05.2012, 12:56. Показов 8563. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создать абстрактный базовый класс Triangle(треугольеник) для представления треугольника виртуальными функциями вычисления площади и периметра. Поля должны включать две стороны и угол между ними. Определить классы-наследники: прямоугольный треугольник, равнобедренный треугольник, равносторонний треугольник со своими функциями перевода и вывода на экран
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.05.2012, 12:56
Ответы с готовыми решениями:

Создание классов!
Решите задание, пожалуйста!

Создание классов
Создать абстрактный базовый класс Vehicle (транспортное средство). Создать на его основе производные классы: Plane (самолёт), Car...

создание классов
Создать класс Зачет, имеющий поля: название предмета, зачет (лог. поле). Создать производный класс Экзамен, имеющий поле оценка

13
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
26.05.2012, 13:38
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//базовый класс
class Triangle
{ private:
    double a,b; //2 стороны
    double u;   //угол
  public:
    Triangle(){}
    virtual ~Triangle(){}
    virtual double S() = 0;//площадь // виртуальная функция.
    virtual double P() = 0;//периметр// виртуальная функция.
};
/*
double Triangle::S()
{
  return 0.5*a*b*sin(u);    
}
double Triangle::P()
{
  double с = sqrt(a*a+b*b-2*a*b*cos(u));
  return a+b+c; 
}
*/
1
Заблокирован
26.05.2012, 13:42
Рыжий лис:
1. Вы описали не абстрактный класс.
2. Вы не_описали виртуальный диструктор, что потенциально приведет к утечкам памяти.
2
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
26.05.2012, 14:03
Цитата Сообщение от Bers Посмотреть сообщение
Рыжий лис:
1. Вы описали не абстрактный класс.
2. Вы не_описали виртуальный диструктор, что потенциально приведет к утечкам памяти.
Уже переделал

Добавлено через 16 минут
добавил класс прямоугольный треугольник
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
#include <iostream>
#include <math.h>
using namespace std;
//базовый класс
class Triangle
{ protected:
    double a,b; //2 стороны
    double u;   //угол
  public:
    Triangle(){}
    virtual ~Triangle(){}
    virtual double S() = 0; //площадь
    virtual double P() = 0; //периметр
};
class pryam : public Triangle //прямоугольный треугольник
{
  public:
    pryam(){}
    virtual ~pryam(){}
    virtual double S(); //площадь
    virtual double P(); //периметр
};
double pryam::S()
{
  return 0.5*a*b*sin(u);//?
}
double pryam::P()
{
  double c = sqrt(a*a+b*b-2*a*b*cos(u));//?
  return a+b+c;//?
}
int main()
{
  pryam a;
 
}
2
34 / 26 / 0
Регистрация: 24.12.2010
Сообщений: 165
26.05.2012, 22:57  [ТС]
Рыжий Лис, по аналогии создал ещё 2 класса наследника, что дальше?

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
#include <iostream>
#include <math.h>
using namespace std;
//áàçîâûé êëàññ
class Triangle
{ protected:
    double a,b; //2 ñòîðîíû
    double u;   //óãîë
  public:
    Triangle(){}
    virtual ~Triangle(){}
    virtual double S() = 0; //ïëîùàäü
    virtual double P() = 0; //ïåðèìåòð
};
class pryam : public Triangle //ïðÿìîóãîëüíûé òðåóãîëüíèê
{
  public:
    pryam(){}
    virtual ~pryam(){}
    virtual double S(); //ïëîùàäü
    virtual double P(); //ïåðèìåòð
};
double pryam::S()
{
  return 0.5*a*b*sin(u);//?
}
double pryam::P()
{
  double c = sqrt(a*a+b*b-2*a*b*cos(u));//?
  return a+b+c;//?
};
///////////////
class ravbedr : public Triangle
{
public:
    ravbedr(){}
    virtual ~ravbedr(){};
    virtual double S();
    virtual double P();
};
double ravbedr::S()
{
    double c=2*a*b*sin(u/2); 
    double p=(a+b+c)/2;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}
double ravbedr::P()
{
    double c=2*a*b*sin(u/2); 
    return a+b+c;
}
///////////////////
class ravstor : public Triangle
{
public:
    ravstor(){}
    virtual ~ravstor(){}
    virtual double S();
    virtual double P();
};
double ravstor::S()
{
    return 0.43*a*b;
}
double ravstor::P()
{
    return 3*a;
}
int main()
{
  pryam a;
 
}
Добавлено через 4 часа 18 минут
как в данном задании описать int main ?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.05.2012, 02:59
С вычислением площади и периметра вы явно что-то намудрили. Зачем в производных классах виртуальные методы? Я бы еще понял, если был бы class ravstor : public ravbedr, что по сути является правильным.
В базовый класс добавь аргументированный конструктор:
C++
1
Triangle(double x, double y, double z): a(x), b(y), u(z){}
и в производные, вызывая в них конструктор базового:
C++
1
pryam(double x, double y, double z): Triangle(x, y, z){}
А меин выглядит вобщем то так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
    Triangle *pt = NULL;
    int a, b, u;
    do
    {
        std::cout<< "Enter length of the first side: "; std::cin>> a;
        std::cout<< "Enter length of the second side: "; std::cin>> b;
        std::cout<< "Enter the angle between the sides: "; std::cin>> u;
    } while (a < 0 || b < 0 || u < 0 || u > 180);
    if (a == b)
    {
        if (u == 60) pt = new ravstor(a, b, u);
        else pt = new ravbedr(a, b, u);
    }
    else if(u == 90) pt = new pryam(a, b, u);
    if (pt == NULL) std::cout<< "Random triangle, count yourself, it's boring...";
    else std::cout<< "P = "<< pt->P()<< "\nS = "<< pt->S();
    delete pt;
    return 0; 
}
1
34 / 26 / 0
Регистрация: 24.12.2010
Сообщений: 165
27.05.2012, 14:21  [ТС]
так?
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>
using namespace std;
//áàçîâûé êëàññ
class Triangle
{ protected:
    double a,b; //2 ñòîðîíû
    double u;   //óãîë
  public:
    Triangle(){}
    Triangle(double x, double y, double z): a(x), b(y), u(z){}
    virtual ~Triangle(){}
    virtual double S() = 0; //ïëîùàäü
    virtual double P() = 0; //ïåðèìåòð
};
class pryam : public Triangle //ïðÿìîóãîëüíûé òðåóãîëüíèê
{
    pryam(double x, double y, double z): Triangle(x, y, z){}
  public:
    pryam(){}
    virtual ~pryam(){}
    virtual double S(); //ïëîùàäü
    virtual double P(); //ïåðèìåòð
 
};
double pryam::S()
{
  return 0.5*a*b*sin(u);//?
}
double pryam::P()
{
  double c = sqrt(a*a+b*b-2*a*b*cos(u));//?
  return a+b+c;//?
};
///////////////
class ravbedr : public Triangle
{
    ravbedr(double x, double y, double z): Triangle(x, y, z){}
  public:
    ravbedr(){}
    virtual ~ravbedr(){};
    virtual double S();
    virtual double P();
};
double ravbedr::S()
{
    double c=2*a*b*sin(u/2); 
    double p=(a+b+c)/2;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}
double ravbedr::P()
{
    double c=2*a*b*sin(u/2); 
    return a+b+c;
}
///////////////////
class ravstor : public Triangle
{
    ravstor(double x, double y, double z): Triangle(x, y, z){}
  public:
    ravstor(){}
    virtual ~ravstor(){}
    virtual double S();
    virtual double P();
};
double ravstor::S()
{
    return 0.43*a*b;
}
double ravstor::P()
{
    return 3*a;
}
/////////////////////////////
int main()
{
    Triangle *pt = NULL;
    int a, b, u;
    do
    {
        std::cout<< "Enter length of the first side: "; std::cin>> a;
        std::cout<< "Enter length of the second side: "; std::cin>> b;
        std::cout<< "Enter the angle between the sides: "; std::cin>> u;
    } while (a < 0 || b < 0 || u < 0 || u > 180);
    if (a == b)
    {
        if (u == 60) pt = new ravstor(a, b, u);
        else pt = new ravbedr(a, b, u);
    }
    else if(u == 90) pt = new pryam(a, b, u);
    if (pt == NULL) std::cout<< "Random triangle, count yourself, it's boring...";
    else std::cout<< "P = "<< pt->P()<< "\nS = "<< pt->S();
    delete pt;
    return 0; 
}
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.05.2012, 14:31
Аргументированные конструкторы должны быть в public. Изначально в классе стоит модификатор доступа private.
Посмотри формулы вычисления, мне показалось там не все правильно высчитывает.
По хорошему, равносторонний треугольник должен наследовать равнобедренный. А зачем все методы произвольных классов делать виртуальными, я не знаю. Вроде нужно так делать только тогда, когда принадлежность объекта к классу определяется во время исполнения. Т.е. в базовом и в равнобедренном, если будешь от него наследовать равносторонний. Поправьте меня, если я не прав.
1
34 / 26 / 0
Регистрация: 24.12.2010
Сообщений: 165
27.05.2012, 14:46  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Аргументированные конструкторы должны быть в public. Изначально в классе стоит модификатор доступа private.
Посмотри формулы вычисления, мне показалось там не все правильно высчитывает.
По хорошему, равносторонний треугольник должен наследовать равнобедренный. А зачем все методы произвольных классов делать виртуальными, я не знаю. Вроде нужно так делать только тогда, когда принадлежность объекта к классу определяется во время исполнения. Т.е. в базовом и в равнобедренном, если будешь от него наследовать равносторонний. Поправьте меня, если я не прав.
да, ошибочка была в формулах, спасибо

вот так выходит:
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
#include <iostream>
#include <math.h>
using namespace std;
//áàçîâûé êëàññ
class Triangle
{ protected:
    double a,b; //2 ñòîðîíû
    double u;   //óãîë
  public:
    Triangle(){}
    Triangle(double x, double y, double z): a(x), b(y), u(z){}
    ~Triangle(){}
    double S() ; //ïëîùàäü
    double P() ; //ïåðèìåòð
};
class pryam : public Triangle //ïðÿìîóãîëüíûé òðåóãîëüíèê
{
public:
    pryam(double x, double y, double z): Triangle(x, y, z){}
    pryam(){}
    ~pryam(){}
    double S(); //ïëîùàäü
    double P(); //ïåðèìåòð
 
};
double pryam::S()
{
  return 0.5*a*b*sin(u);//?
}
double pryam::P()
{
  double c = sqrt(a*a+b*b-2*a*b*cos(u));//?
  return a+b+c;//?
};
///////////////
class ravbedr : public Triangle
{
 
  public:
    ravbedr(double x, double y, double z): Triangle(x, y, z){}
    ravbedr(){}
     ~ravbedr(){};
     double S();
     double P();
};
double ravbedr::S()
{
    double c=2*a*sin(u/2); 
    double p=(a+b+c)/2;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}
double ravbedr::P()
{
    double c=2*a*sin(u/2); 
    return a+b+c;
}
///////////////////
class ravstor : public Triangle
{
 public:
     ravstor(double x, double y, double z): Triangle(x, y, z){}
    ravstor(){}
     ~ravstor(){}
     double S();
     double P();
};
double ravstor::S()
{
    return 0.43*a*a;
}
double ravstor::P()
{
    return 3*a;
}
/////////////////////////////
int main()
{
    Triangle *pt = NULL;
    int a, b, u;
    do
    {
        std::cout<< "Enter length of the first side: "; std::cin>> a;
        std::cout<< "Enter length of the second side: "; std::cin>> b;
        std::cout<< "Enter the angle between the sides: "; std::cin>> u;
    } while (a < 0 || b < 0 || u < 0 || u > 180);
    if (a == b)
    {
        if (u == 60) pt = new ravstor(a, b, u);
        else pt = new ravbedr(a, b, u);
    }
    else if(u == 90) pt = new pryam(a, b, u);
    if (pt == NULL) std::cout<< "Random triangle, count yourself, it's boring...";
    else std::cout<< "P = "<< pt->P()<< "\nS = "<< pt->S();
    delete pt;
    return 0; 
}
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.05.2012, 14:52
Дейструкторы в производных классах можно убрать, раз они не виртуальные и работы с памятью не происходит, толку их изменять нет. Система итак создаст по-умолчанию.
А в целом, если не хотите наследовать равносторонний от равнобедренного, можно на этом остановиться. Я бы посоветовал убрать в main-e полные названия функций (std:, либо строчку using namespace std; но это уже мелочи.
1
34 / 26 / 0
Регистрация: 24.12.2010
Сообщений: 165
27.05.2012, 15:07  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Дейструкторы в производных классах можно убрать, раз они не виртуальные и работы с памятью не происходит, толку их изменять нет. Система итак создаст по-умолчанию.
А в целом, если не хотите наследовать равносторонний от равнобедренного, можно на этом остановиться. Я бы посоветовал убрать в main-e полные названия функций (std:, либо строчку using namespace std; но это уже мелочи.

сделал

вот только выдаёт такие ошибки (но не указывает в каких строках)

Triangle.obj : error LNK2001: unresolved external symbol "public: double __thiscall Triangle::P(void)" (?P@Triangle@@QAENXZ)
Triangle.obj : error LNK2001: unresolved external symbol "public: double __thiscall Triangle::S(void)" (?S@Triangle@@QAENXZ)
Debug/Наслед.exe : fatal error LNK1120: 2 unresolved externals
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.05.2012, 15:11
Цитата Сообщение от tarakano Посмотреть сообщение
сделал

вот только выдаёт такие ошибки (но не указывает в каких строках)
а код где?

Добавлено через 1 минуту
и зачем вы убрали чисто виртуальные функции в базовом классе Triangle? Верните их на место.

Добавлено через 1 минуту
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
#include <iostream>
#include <cmath>
//áàçîâûé êëàññ
class Triangle
{ protected:
    double a,b; //2 ñòîðîíû
    double u;   //óãîë
  public:
    Triangle(){}
    Triangle(double x, double y, double z): a(x), b(y), u(z){}
    virtual ~Triangle(){}
    virtual double S() = 0; //ïëîùàäü
    virtual double P() = 0; //ïåðèìåòð
};
class pryam : public Triangle //ïðÿìîóãîëüíûé òðåóãîëüíèê
{
public:
    pryam(double x, double y, double z): Triangle(x, y, z){}
    pryam(){}
    double S(); //ïëîùàäü
    double P(); //ïåðèìåòð
 
};
double pryam::S()
{
  return 0.5*a*b*sin(u);//?
}
double pryam::P()
{
  double c = sqrt(a*a+b*b-2*a*b*cos(u));//?
  return a+b+c;//?
};
///////////////
class ravbedr : public Triangle
{
 
  public:
    ravbedr(double x, double y, double z): Triangle(x, y, z){}
    ravbedr(){}
     double S();
     double P();
};
double ravbedr::S()
{
    double c=2*a*sin(u/2); 
    double p=(a+b+c)/2;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}
double ravbedr::P()
{
    double c=2*a*sin(u/2); 
    return a+b+c;
}
///////////////////
class ravstor : public Triangle
{
 public:
     ravstor(double x, double y, double z): Triangle(x, y, z){}
    ravstor(){}
     double S();
     double P();
};
double ravstor::S()
{
    return 0.43*a*a;
}
double ravstor::P()
{
    return 3*a;
}
/////////////////////////////
int main()
{
    Triangle *pt = NULL;
    int a, b, u;
    do
    {
        std::cout<< "Enter length of the first side: "; std::cin>> a;
        std::cout<< "Enter length of the second side: "; std::cin>> b;
        std::cout<< "Enter the angle between the sides: "; std::cin>> u;
    } while (a < 0 || b < 0 || u < 0 || u > 180);
    if (a == b)
    {
        if (u == 60) pt = new ravstor(a, b, u);
        else pt = new ravbedr(a, b, u);
    }
    else if(u == 90) pt = new pryam(a, b, u);
    if (pt == NULL) std::cout<< "Random triangle, count yourself, it's boring...";
    else std::cout<< "P = "<< pt->P()<< "\nS = "<< pt->S();
    delete pt;
    return 0; 
}
1
34 / 26 / 0
Регистрация: 24.12.2010
Сообщений: 165
27.05.2012, 15:28  [ТС]
MrGluck? все работает, спасибо!
вот ворпрос возник, а зачем нам virtual в базовом классе? - тк у нас несколько других наследует одновременно этот класс или не поэтому?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.05.2012, 16:17
C++
1
2
virtual double S() = 0; //площадь
virtual double P() = 0; //периметр
это чисто виртуальные функции. Мы указываем, что реализация этих функций будет происходить в каком-либо производном классе. Пока класс содержит хоть одну неопределенную функцию он абстрактен. Перед деструктором мы пишем virtual потому, что надо указать, что принадлежность объекта к классу должна определяться во время исполнения. Если будет непонятен этот момент - могу порыться и найти код, показывающий всю важность объявления деструктора виртуальным.
Вобще, почитайте про виртуальные функции, чисто виртуальные функции.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.05.2012, 16:17
Помогаю со студенческими работами здесь

Создание классов
Добрый день всем. Прошу подсказки по созданию и подчинению классов, готовлюсь к экзамену и не могу понять... Заранее благодарен всем,...

Создание классов
как создать класс вектор, содержащий ссылку на int, размерность вектора и переменную ошибки? переменная ошибки - это что?

Создание классов
Как орпеделить класс &quot;символ в заданной позиции экрана&quot; (использовать модуль conio.h). Предусмотреть компонентные данные, координаты...

создание классов
создать класс который осуществляет вывод на экран таблицы умножения с++

Создание иерархии классов
Помогите пожалуйста! Проблема со второй частью задания :&quot;Создать производный класс Student, имеющий поле года обучения. Определить методы...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru