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

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

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

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

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

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

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

13
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 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
 Аватар для Рыжий Лис
5972 / 3734 / 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
Ответ Создать тему
Новые блоги и статьи
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru