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

Структурировать программу, разбив её на отдельные процедуры - C++

Восстановить пароль Регистрация
 
Настасья_12
0 / 0 / 0
Регистрация: 25.11.2015
Сообщений: 4
18.01.2016, 17:13     Структурировать программу, разбив её на отдельные процедуры #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
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 "stdafx.h"
#include <fstream>
#include <string.h>
#include <iostream>
#include "conio.h"
#include <Windows.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
 
using namespace std;
 
void Create(int R, int G, int B)
{
    int x = -1, y = -1, x0, y0;
 
    HDC hDC = GetDC(GetConsoleWindow()); 
    HPEN Pen = CreatePen(PS_SOLID, 1, RGB(R, G, B));//ручка;  r, g, b - красная, зеленая и синяя составляющие цвета
    SelectObject(hDC, Pen); //Выбиpает логический объект для DC. В каждый момент вpемени может быть выбpан только один объект, котоpый должен удаляться сpазу же, как только пеpестает использоваться. DC: Идентификатоp контекста устpойства. hObject: Каpта бит, кисть, шpифт, пеpо или область.
 
    MoveToEx(hDC, 98, 0, NULL); //Функция MoveToEx обновляет текущую позицию в заданной точке и, возможно, возвращает предыдущую позицию
    LineTo(hDC, 98, 400); //Рисует линию, используя выбpанное пеpо, с текущей позиции до указанной конечной точки
    // HDC - дескриптор контекста устройства
 
    cout << "x0:";  cin >> x0; //ввод x0
    cout << "y0:";  cin >> y0; //ввод y0
 
    MoveToEx(hDC, x0 + 100, y0, NULL); // с заданными значениями x0 и y0
 
    int i;
    for (i = 1; (x != x0) || (y != y0); i++)
    {
        cout << 'x' << i << ": ";  cin >> x;
        cout << 'y' << i << ": ";  cin >> y;
        cout << endl;
        LineTo(hDC, x + 100, y);
    }
}
 
void Rectangle(int R, int G, int B) //треугольник
{
    HDC hDC = GetDC(GetConsoleWindow());
    HPEN Pen = CreatePen(PS_SOLID, 3, RGB(R, G, B));
    SelectObject(hDC, Pen);
    int qq, ww, ee, aa;
    cout << "qq:";  cin >> qq;// границы треугольника
    cout << "ww:";  cin >> ww;
    cout << "ee:";  cin >> ee;
    cout << "aa:";  cin >> aa;
    MoveToEx(hDC, ee, aa, NULL);
 
    LineTo(hDC, qq, qq);
    LineTo(hDC, ww, qq);
    LineTo(hDC, ee, aa);
}
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
 
    int c;
    HDC hDC = GetDC(GetConsoleWindow());
 
    int R, G, B;
    cout << "Border color:" << endl; //Цвет границы
    cout << "R:";  cin >> R;
    cout << "G:";  cin >> G;
    cout << "B:";  cin >> B;
    Rectangle(R, G, B);
    int RGB = ((B * 256 * 256 + G * 256 + R));
 
    cout << endl << "Fill color:" << endl; // Цвет заливки
    cout << "R:";  cin >> R;
    cout << "G:";  cin >> G;
    cout << "B:";  cin >> B;
 
 
    int STEKX[3000]; //координаты затравочных точек
    int STEKY[3000];
    int STEKP[3000]; //координата х правого конца строки затравочной точки
 
    int x0, y0, x, y;
    int b1, b2, bb1, bb2;
    cout << endl;
    cout << "X0:";  cin >> x0;
    cout << "Y0:";  cin >> y0;
 
    STEKX[0] = x0 + 100; int beg = 0; int end = 1;
    STEKY[0] = y0;
    STEKP[0] = x0;
    int lw = 0, pw = 0, pixv, pixn;
 
    while (beg != end)
    {
 
        x = STEKX[beg];
        y = STEKY[beg];
        pw = STEKP[beg];
 
        while (RGB != GetPixel(hDC, x, y))  x--; //идем влево, пока не встретим границу
 
        if (RGB == GetPixel(hDC, x, y)) x++; //если это граница, то делаем шаг вправо
        lw = x; //запомнили левую границу, клетка, которую нужно закрасить
 
        b1 = b2 = bb1 = bb2 = 1;
        while (x <= pw) //пока х меньше правой границы из пред шага
        {
            pixv = GetPixel(hDC, x, y - 1); //пиксель на строчку выше
            pixn = GetPixel(hDC, x, y + 1); //на строчку ниже
            if (pixv == RGB) b1 = 1; //если в пикселе на строчку выше мы нашли границу
            if (pixn == RGB) b2 = 1;
 
            if (bb1 == 1 && bb2 == 1 && (RGB != GetPixel(hDC, x, y)))
            {
                SetPixel(hDC, x, y, RGB(R, G, B));
                if (b1 && (0 == pixv)) //закрасить пиксель на верхней строчке, если б1=1
                {
                    //если встретили точку, которою нужно закрасить выйдя из границы, добавляем в список затравочных
                    STEKX[end] = x;  STEKY[end] = y - 1; end++; b1 = 0;
                }
                if (b2 && (0 == pixn)) //закрасить пиксель на верхней строчке, если б=1
                {
                    STEKX[end] = x;  STEKY[end] = y + 1; end++; b2 = 0;
                }
            }
 
            x++;
        }
 
        if (x == pw + 1) x--;
 
        if (RGB == GetPixel(hDC, x, y)) //если на границе, то шаг влево до первой точки, которую нужно закрасить
        {
            while (RGB == GetPixel(hDC, x, y)) x--;
            pw = x; //обозначаем ее ка правую точку в след шаге
        }
 
        while (RGB != GetPixel(hDC, x, y)) //идем от крайней правой точки предыдущего шага до правого края
        {
            pixv = GetPixel(hDC, x, y - 1);
            pixn = GetPixel(hDC, x, y + 1);
            if (pixv == RGB) b1 = 1;
            if (pixn == RGB) b2 = 1;
 
            SetPixel(hDC, x, y, RGB(R, G, B)); x++; //Рисует элемент изображения в указанной точке
            if (b1 && (0 == pixv))
            {
                STEKX[end] = x;  STEKY[end] = y - 1; end++; b1 = 0;
            }
            if (b2 && (0 == pixn))
            {
                STEKX[end] = x;  STEKY[end] = y + 1; end++; b2 = 0;
            }
        }
        pw = x - 1; //запоминаем правую крайнюю точку
 
        if ((b1 + b2) == 0) { STEKP[end - 1] = pw; STEKP[end - 2] = pw; } //нашли 2 затравочных точки
        if ((b2 + b1) == 1)  STEKP[end - 1] = pw; //нашли только либо сверху, либо снизу
 
 
        beg++; //  прошли одну строку и начало стека сместилось
    }
 
    cin >> c;
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2016, 17:13     Структурировать программу, разбив её на отдельные процедуры
Посмотрите здесь:

C++ как сохранить вещественное число разбив его на два целых
[C++] Установить можно ли, разбив строку на подстроки длиной N... C++
Как правильно структурировать проэкт с++ ? C++
Напишите программу, которая вводит число из пяти цифр, разделяет число на отдельные цифры и печатает их отдельно друг от друга C++
Переписать содержимое F1 в файл F2, разбив на строки C++
C++ Определение классов, их реализацию, демонстрационную программу поместить в отдельные файлы.
Написать программу, которая вводит число из пяти цифр, разделяет число на отдельные цифры C++
C++ Переписать слова из одного файла в другой, разбив их строками

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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