25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
1

Как переделать рабочий код под ООП в Code::Blocks?

08.05.2017, 22:21. Показов 1449. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
#include <iostream>
#include <GL/freeglut.h>
#include <locale.h>
using namespace std;
 
// прототипы функций
void MyInit();
void Display();
void Reshape(int w, int h);
void DividePyramid(GLfloat *a, GLfloat *b, GLfloat *c, int level);
void DrawPyramid(GLfloat *a, GLfloat *b, GLfloat *c);
void DrawTriangle(GLfloat *a, GLfloat *b, GLfloat *c);
 
void Keyboard(unsigned char key, int x, int y);
 
// количество итераций
int level = 5;
// задаем пирамиду
GLfloat pyramid[5][3] =
{
    { -1.0, 0.0, 0.0 }, // A точка
    {  0.0, 1.5, 0.0 }, // B точка
    {  1.0, 0.0, 0.0 }, // C точка
};
 
int main(int argc, char **argv)
{
 
    // инициализируем графику
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    // создаем окно
    glutInitWindowSize(600, 600);
    glutCreateWindow("Треугольник Серпинского");
 
    MyInit();
    // регистрация обратных вызовов
    glutDisplayFunc(Display);
    glutReshapeFunc(Reshape);
 
    glutMainLoop();
 
    return 0;
}
 
void MyInit()
{
    // делаем черный фон
    glClearColor(0.0, 0.0, 0.0, 1.0);
    // разрешить тест глубины
    glEnable(GL_DEPTH_TEST);
    // Улучшение в вычислении перспективы
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
 
void Display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // Выбор матрицы вида модели
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    // сдвинулись вглубь экрана на 4
    glTranslatef(0.0, -1.0, -4.0);
    // делим пирамиду если level > 0 и отрисовываем
    DividePyramid(pyramid[0], pyramid[1], pyramid[2], level);
    //Делаем сигнал на перерисовку, ибо постоянно меняем угол поворота
    glutPostRedisplay();
    glutSwapBuffers();
}
void Reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    // загружаем матрицу проекции
    glMatrixMode(GL_PROJECTION);
    //  Сброс матрицы проекции
    glLoadIdentity();
    // Вычисление соотношения геометрических размеров для окна
    gluPerspective(45.0, (GLdouble)w / (GLdouble)h, 0.1, 200.0);
    // Выбор матрицы вида модели
    glMatrixMode(GL_MODELVIEW);
    // Сброс матрицы вида модели
    glLoadIdentity();
}
 
void DividePyramid(GLfloat *a, GLfloat *b, GLfloat *c,int level)
{
    // координаты для середин ребер
    GLfloat ab[3], bc[3], ac[3];
    if (level == 0)
    {
        DrawPyramid(a, b, c);
    }
    else
    {
        for (int j = 0; j < 3; j++)
        {
            ab[j] = (a[j] + b[j]) / 2.0; // середина A и B
            bc[j] = (b[j] + c[j]) / 2.0; // середина B и C
            ac[j] = (a[j] + c[j]) / 2.0; // середина A и C (центр квадрата-основания)
        }
 
        // рекурсивно вызываем для 5 меньших пирамидок
        DividePyramid(a, ab, ac,level - 1);
        DividePyramid(ab, b, bc,level - 1);
        DividePyramid(ac, bc, c,level - 1);
    }
}
void DrawPyramid(GLfloat *a, GLfloat *b, GLfloat *c)
{
        glBegin(GL_TRIANGLES);
        glColor3ub(252,15,192);
        DrawTriangle(a, b, c);
        glEnd();
}
void DrawTriangle(GLfloat *a, GLfloat *b, GLfloat *c)
{
    glVertex3fv(a);
    glVertex3fv(b);
    glVertex3fv(c);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2017, 22:21
Ответы с готовыми решениями:

C++ (ооп) как из трех файлов (2 cpp и h) сделать одну программу? code blocks
C++ (ооп) как из трех файлов (2 cpp и h) сделать одну программу? code blocks

код, который прекрасно выполняет Code::Blocks не выполняеться в Студии, как сделатьь так чтобы Студия воспринимала этот код??
Ребята, обьясните мне чего код, который прекрасно выполняет Code::Blocks не выполняеться в Студии,...

Раздельная компиляция в Code::Blocks - как правильно разместить код в файлах?
В проекте code blocks есть функция main, несколько функций, которые подключаются как статические...

Как убрать неполадки совместимости с Code::Blocks при установке этой IDE под Windows 7 ?
Как убрать неполадки совместимости с Code::Blocks.Запускаю установочник и вылезает ошибка...

15
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
13.05.2017, 07:57 2
scherbakovss201, как минимум - инкапсулировать тела в объекты и агрегировать их в сцену
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
13.05.2017, 09:07  [ТС] 3
Цитата Сообщение от vxg Посмотреть сообщение
как минимум - инкапсулировать тела в объекты и агрегировать их в сцену
можно пример.
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
13.05.2017, 09:51 4
Начнём с того, что объектно-ориентированное программирование характеризуется шестью парадигмами:
  1. Инкапсуляция
  2. Наследование
  3. Полиморфизм
  4. Абстракция
  5. Посылка сообщений
  6. Повторное использование

Причём у каждой парадигмы свой номер. Если я скажу "пятая парадигма ООП", то вы сразу пойдёте, что речь о парадигме "посылка сообщений"

Лучше всего посмотрите этот курс от сертифицированного в Microsoft тренера: Предисловие к курсу "Шаблоны проектирования"
Кликните здесь для просмотра всего текста


В вашем задании можно реализовать абстракцию. Сделаем абстрактный класс Shape, от которого будут наследоваться классы Pyramid и Triangle. В Shape будет чисто виртуальный метод Draw. Этот метод обязаны реализовать классы Pyramid и Triangle.

Данные необходимые для построения объектов можно инкапсулировать, скрыв детали реализации, предоставив для внешнего Мира методы геттеры и сеттеры: SetWidth(GLfloat w), GetWidth(), SetHeight(GLfloat h)
0
vxg
13.05.2017, 11:20
  #5

Не по теме:

8Observer8, лично я основываясь на своих источниках могу к этому набору парадигм добавить несколько и в то же время некоторые из перечисленных парадигм могу исключить - этот список не догма, если ваш источник привил вам мысль об обратном, то ваш источник глубоко заблуждается и ставит себя в центр мироздания - в свете сказанного ещё более странной и нелепой выглядит попытка именовать парадигмы по номерам якобы общепринятым и понятным всем остальным

0
8Observer8
13.05.2017, 11:32
  #6

Не по теме:

Цитата Сообщение от vxg Посмотреть сообщение
если ваш источник привил вам мысль об обратном, то ваш источник глубоко заблуждается и ставит себя в центр мироздания - в свете сказанного ещё более странной и нелепой выглядит попытка именовать парадигмы по номерам якобы общепринятым и понятным всем остальным
Источник - это книга "Банды четырёх": Приемы объектно-ориентированного проектирования. Паттерны проектирования

Цитата Сообщение от vxg Посмотреть сообщение
могу к этому набору парадигм добавить несколько и в то же время некоторые из перечисленных парадигм могу исключить - этот список не догма
Каждый может считать как угодно. Да, это не догма. Сколько людей столько и мнений. В 90-е шли войны парадигм. Книга "Банды четырёх" внесла кое-какую ясность, но всё равно многие люди придерживаются совершенно разных подходов и спорят между собой. Нужно просто высказывать своё мнение и придерживаться выбранного пути.

0
vxg
13.05.2017, 11:43
  #7

Не по теме:

8Observer8, какая из книг внесла ясность, в каком объёме и куда именно можно обсуждать на уроках богословия - личные предпочтения тут ни причём просто потому что эта область не охватывается каким-либо стандартом и в значительной степени сама и есть набор личных предпочтений - просто не нужно забивать людям в голову хардкод списка парадигм ООП с железным порядком даже с ссылкой на авторитетный источник

0
8Observer8
13.05.2017, 12:02
  #8

Не по теме:

Цитата Сообщение от vxg Посмотреть сообщение
какая из книг внесла ясность, в каком объёме и куда именно можно обсуждать на уроках богословия - личные предпочтения тут ни причём просто потому что эта область не охватывается каким-либо стандартом
По сути описанные ими 24 паттерна в 1994 году до сих пор считаются основными. Почти любая книга по паттернам ссылается на неё и использует теже термины. Конечно, так большое число спорных моментов, с многими лично я не согласен. Да, скорее всего, жёсткий порядок - это слишком. Но я согласен с авторами, что "посылка сообщений" и "повторное использование" являются парадигмами ООП. Да, во многие источниках считают, что есть 4 парадигм ООП, а в других, что 6. Я придерживаюсь второго варианта.

0
vxg
13.05.2017, 12:17
  #9

Не по теме:

8Observer8, ну, а я придерживаюсь подхода Гради Буча при котором этих компонентов 7, но никогда не буду сыпать их людям на голову в том виде в котором материал изложен в источнике - имхо будет корректнее использовать мягкую формулировку вида "обычно выделяют следующие основные парадигмы ООП: <далее идёт перечень в том порядке который источник или вы лично считаете более приоритетным, но без намеков на незыблемость>

0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
13.05.2017, 14:41 10

Не по теме:

Цитата Сообщение от vxg Посмотреть сообщение
имхо будет корректнее использовать мягкую формулировку вида "обычно выделяют следующие основные парадигмы ООП: <далее идёт перечень в том порядке который источник или вы лично считаете более приоритетным, но без намеков на незыблемость>
А, ну да, это верно.



Цитата Сообщение от scherbakovss201 Посмотреть сообщение
можно пример.
Посмотрите примеры в этом туториале: https://www.tutorialspoint.com... rfaces.htm

Чтобы реализовать в C++ ООП парадигму "Абстракция", можно, например, создать абстрактный класс Shape, в котором объявить чисто виртуальный метод. Принцип такой в C++, что если хотя бы один метод абстрактный, то и класс будет абстрактный. "абстрактный" - это значит, что мы не может создать экземпляр этого класса. Shape - это абстракция. Мы только может наследоваться от Shape.
C++
1
2
3
4
5
class Shape
{
public:
    virtual void Draw() = 0;
};
Чтобы реализовать парадигму ООП "Наследование" нужно создать два класса "Triangle" и "Pyramid" и наследовать их от базового абстрактного класса. В этом случае обычно говорят, что мы наследуем "интерфейс" или "контракт", потому что мы обязаны реализовать чисто виртуальный метод Draw(). Это как будто мы заключаем контракт и обязаны выполнить его условия.

scherbakovss201, вам всё понятно до этого момента? Есть вопросы? Можно продолжить?

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
#include <iostream>
using namespace std;
 
// прототипы функций
//void MyInit();
//void Display();
//void Reshape(int w, int h);
 
class Shape
{
public:
    virtual void Draw() = 0;
};
 
class Triangle : Shape
{
public:
    void Draw()
    {
        cout << "Draw implementation in Triangle" << endl;
    }
};
 
class Pyramid : Shape
{
public:
    void Draw()
    {
        cout << "Draw implementation in Pyramid" << endl;
    }
};
 
int main(int argc, char **argv)
{
    // Create spapes
    Triangle triangle;
    Pyramid pyramid;
 
    // Draw shapes
    triangle.Draw();
    pyramid.Draw();
 
    // Pause
    cin.get();
 
    return 0;
}
1
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
13.05.2017, 21:27  [ТС] 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
// ConsoleApplication1.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
 
#include <iostream>
#include <GL/Glut.h>
#include <locale.h>
using namespace std;
 
//Количество итераций
int level=5 ;
// задаем пирамиду
GLfloat pyramid[5][3] =
{
    { -1.0, 0.0, 0.0 }, // A точка
    { 0.0, 1.5, 0.0 }, // B точка
    { 1.0, 0.0, 0.0 }, // C точка
};
 
void Display();
void Reshape(int w, int h);
 
 
 
 
class Serpinsky // имя класса
{
public: // спецификатор доступа
    // количество итераций
 
 
void MyInit()
{
    // делаем черный фон
    glClearColor(0.0, 0.0, 0.0, 1.0);
    // разрешить тест глубины
    glEnable(GL_DEPTH_TEST);
    // Улучшение в вычислении перспективы
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
 
 
 
void DividePyramid(GLfloat *a, GLfloat *b, GLfloat *c, int level)
{
    // координаты для середин ребер
    GLfloat ab[3], bc[3], ac[3];
    if (level == 0)
    {
        DrawPyramid(a, b, c);
    }
    else
    {
        for (int j = 0; j < 3; j++)
        {
            ab[j] = (a[j] + b[j]) / 2.0; // середина A и B
            bc[j] = (b[j] + c[j]) / 2.0; // середина B и C
            ac[j] = (a[j] + c[j]) / 2.0; // середина A и C (центр квадрата-основания)
        }
 
        // рекурсивно вызываем для 5 меньших пирамидок
        DividePyramid(a, ab, ac, level - 1);
        DividePyramid(ab, b, bc, level - 1);
        DividePyramid(ac, bc, c, level - 1);
    }
}
void DrawPyramid(GLfloat *a, GLfloat *b, GLfloat *c)
{
    glBegin(GL_TRIANGLES);
    glColor3ub(252, 15, 192);
    DrawTriangle(a, b, c);
    glEnd();
}
void DrawTriangle(GLfloat *a, GLfloat *b, GLfloat *c)
{
    glVertex3fv(a);
    glVertex3fv(b);
    glVertex3fv(c);
}
 
 
 
 
  
void options()
{
 
    
 
    
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    // создаем окно
    glutInitWindowSize(600, 600);
    glutCreateWindow("Треугольник Серпинского");
 
    MyInit();
    // регистрация обратных вызовов
    glutDisplayFunc(Display);
    glutReshapeFunc(Reshape);
    glutMainLoop();
}
 
}; // конец
void Display()
{
    Serpinsky ob;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // Выбор матрицы вида модели
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    // сдвинулись вглубь экрана на 4
    glTranslatef(0.0, -1.0, -4.0);
    // делим пирамиду если level > 0 и отрисовываем
    ob.DividePyramid(pyramid[0], pyramid[1], pyramid[2], level);
    //Делаем сигнал на перерисовку, ибо постоянно меняем угол поворота
    glutPostRedisplay();
    glutSwapBuffers();
}
 
void Reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    // загружаем матрицу проекции
    glMatrixMode(GL_PROJECTION);
    //  Сброс матрицы проекции
    glLoadIdentity();
    // Вычисление соотношения геометрических размеров для окна
    gluPerspective(45.0, (GLdouble)w / (GLdouble)h, 0.1, 200.0);
    // Выбор матрицы вида модели
    glMatrixMode(GL_MODELVIEW);
    // Сброс матрицы вида модели
    glLoadIdentity();
}
 
 
 
int main(int argc, char **argv)
{
    Serpinsky  ob; // объявление объекта
    setlocale(LC_ALL, ".1251");
 
    cout << "Введите количество итераций от 1 до 10 " << endl;
    cin >> level;
    if (level>0 &&level<10)
    {
// инициализируем графику
        glutInit(&argc, argv);
        ob.options();
     
    system("pause");
    }
    else
    {
        //cout << "Error " << endl;
    }
    
    return 0;
}
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
14.05.2017, 07:57 12
scherbakovss201, и?
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
14.05.2017, 12:27  [ТС] 13
Цитата Сообщение от vxg Посмотреть сообщение
scherbakovss201, и?
есть ли в моем коде ООП?
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
14.05.2017, 14:06 14
scherbakovss201, два грамма. больше всего в коде коробит не ООП, а создание объекта каждый цикл рисования и бездумное создание объекта в main.
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
14.05.2017, 14:11  [ТС] 15
Цитата Сообщение от vxg Посмотреть сообщение
scherbakovss201, два грамма. больше всего в коде коробит не ООП, а создание объекта каждый цикл рисования и бездумное создание объекта в main.
__________________
Предложите ваш вариант.Видимо вы философ и теоретик достаточно хороший.А вот на практике ваших результатов не видно.Да и без функции main работать не будет.
Наша задача по заданному числу итераций нарисовать треугольник Серпского.Знаете способ его отобразить без отрисовки. Покажите его чайникам и кофеваркам.
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
14.05.2017, 14:28 16
scherbakovss201,
1 функция main должна быть - я это под сомнение не ставлю
2 создание объекта ob в функции main лишено смысла - этот объект не используется в функции main - используется его функция с ничего не говорящим названием options которая к самому объекту не обращается, а лишь инициализирует glut и запускает рисование
3 рисовать необходимо - я это под сомнение не ставлю
4 создание объекта ob в функции Display неразумно - каждый раз когда будет происходить обновление экрана будет создаваться объект - это совершенно лишние затраты
5 мой вариант - глобальный объект сцена, внутри него private список указателей на абстрактные объекты каждый из которых имеет функцию render, в main динамически создаем наследника абстрактного объекта (ваш фрактал), добавляем его в список сцены при помощи метода класса сцены add, вызываем функцию сцены run с телом вашей функции options, в Display вместо ob.DividePyramid вызываем функцию сцены render в которой проходим по списку объектов вызывая для каждого из них render (в теле render будет тело вашей функции DividePyramid)
6 не надо мне пальцы загибать а то я их вам загну
0
14.05.2017, 14:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2017, 14:28
Помогаю со студенческими работами здесь

программирование QT из под code::blocks
надо связать QT с IDE (codeblocks) но я не знаю как вообщем посмотрите на скриншоты и скажите вот...

GTK / C++ проект в Code::Blocks под Windows
Библиотека GTK позволяет довольно быстро и просто делать графические приложения под разные...

Код не компилируется в Code Blocks
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class Drob{ private: int chisl;...

Почему Code::Blocks не компилирует код?
#include&lt;stdio.h&gt; #include&lt;conio.h&gt; int *Union(int *A, int *B, int nA, int nB, int&amp; nC){ int...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru