Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.74/107: Рейтинг темы: голосов - 107, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 20.04.2010
Сообщений: 23

C++ нарисовать елочку с символов

24.06.2010, 22:20. Показов 20516. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача E. Елочка
«Нарисуйте» с помощью символов лес. При этом не пользуйтесь командами перемещения курсора по экрану. Ваша программа должна последовательно выводить символы строк (или строки целиком).
Лес — это одна или несколько елочек. Каждая елочка характеризуется количеством треугольников в ней и размером самого маленького треугольника. Елочка состоит из треугольников, у которых вершины находятся строго друг под другом, и каждый следующий треугольник содержит на одну строку больше предыдущего.
Все елочки должны по вертикали начинаться с первой строки. Каждая елочка должна быть расположена как можно левее, при этом елочки не должны соприкасаться (т.е. возле символов елочки справа, слева, снизу, сверху, а также по диагонали не должно быть символов, изображающих другую елочку), и не должен нарушаться порядок следования елочек.
Елочки должны изображаться символами «#» (решеточка), а пустые места между ними — символами «.» (точка). Во всех строках должно быть выведено одинаковое количество символов, при этом обязательно должна быть строка, в которой последним символом является решеточка, в последней строке обязательно должны быть решеточки (т.е. должен быть выведен прямоугольник из точек и решеточек, в нем не должно быть лишних столбцов и строк).
Входные данные. Вводится число елочек N, а дальше N пар натуральных чисел, описывающих елочки: первое число каждой пары задает количество треугольников в елочке, второе — размер самого маленького треугольника. Елочки описываются в порядке слева направо (если смотреть на вершины елочек).
Гарантируется, что входные данные будут таковы, что количество символов, которое нужно будет вывести в одной строке, не превысит 79.
Выходные данные. Выведите требуемый «рисунок». Для лучшего понимания смотрите примеры.
Пример ввода Пример вывода
2
3 2
3 3
...#......#....
..###....###...
...#....#####..
..###.....#....
.#####...###...
...#....#####..
..###..#######.
. #####....#....
#######..###...
... .....#####..
...... .#######.
..... .#########
3
1 1
2 1
3 2

#.#...#...
..#..###..
.###..#...
.....###..
....#####.
......#...
.....###..
....#####.
...#######

чтото типа того
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.06.2010, 22:20
Ответы с готовыми решениями:

Написать программу, которая будет выводить елочку из символов
Нужно написать программу которая будет выводить елочку из символов ^ ^ ^^^ ^^^^^ по заданной пользователем высотой. ...

Нарисовать елочку
помогите пожалуйста, нарисовать елочку. заранее спасибо.

Нарисовать ёлочку
15. Необходимо срочно к Новому году нарисовать ёлочку. С клавиатуры вводится количество ярусов, и высота каждого яруса ёлочки. Например, на...

29
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
02.01.2021, 13:49
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Прямоугольник каждой отрендеренной ёлки запоминаем
Тут нужно чуть хитрее, чем прямоугольник, возможны варианты более близкого расположения
0
1 / 1 / 0
Регистрация: 21.05.2020
Сообщений: 11
02.01.2021, 15:21
Цитата Сообщение от Folian Посмотреть сообщение
А твоя простыня с ll и неработающая, значит, - верх совершенства?
Ну конечно нет, но там по крайней мере соблюден кодстайл, хоть и код перегружен. Не было времени отдельно в функции запихнуть)
Тем не менее дефайны заглавными грубое нарушение кодстайла переменных, а в шорты глупо все подряд пихать.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
02.01.2021, 18:01
Я тут где-то уже постил, но вот чуть подправленный вариант
Кликните здесь для просмотра всего текста

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
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <iomanip>
#include <windows.h>
 
using std::cout;
void greenTree(int width, HANDLE &handle)
{
    std::srand(unsigned(std::time(0)));
 
    int half = width/2 ;
    for(int i=0; i<half; i++)
    {
 
        cout.fill(' ');
        cout<<std::setw(half-i);
        size_t color_result(0);
        for(int j=1; j<2*i; ++j)
            {
               char particle=(std::rand()%2?'x':'*');
               if('*'==particle) color_result=2;
               if('x'==particle)
               {
                   particle=(std::rand()%2?'o':'.');
                   color_result='.'==particle?4:6;
               }
               if(i==1&&j==1) color_result=7, particle='^';//звезда)
               SetConsoleTextAttribute(handle, color_result);
               cout<<particle;
            }
        cout<<std::endl;
    }
}
 
int main()
{
    HANDLE output;
    COORD cursor;
    output = GetStdHandle(STD_OUTPUT_HANDLE);
    cursor.X = 0;
    cursor.Y = 0;
 
    std::srand(unsigned(std::time(0)));
 
    int width=35, repeats=20, pause=1000;
 
 
    for(int i=0; i<repeats; ++i)
    {
        Sleep(pause);
        greenTree(width, output);
        if(i!=repeats-1){
            SetConsoleCursorPosition(output,cursor);
 
        }
    }
     SetConsoleTextAttribute(output, 3);
        cout<<"\n\tHappy New Year!\n";
        std::cin.get();
        return 0;
}
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
02.01.2021, 20:25
IGPIGP,
Алексей1153,
Вот я о чём, например ёлки {3, 2} и {1, 3} можно сдвинуть ближе прямоугольника.
IGPIGP, извини, я твой код не запускал.

Я пытался для каждого ненулевого в shift_count определить как на картинке, но я опять напраздновался

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
202
203
#include <iostream>
#include <vector>
 
typedef std::vector<int> vi;
typedef std::vector<vi> vvi;
 
void vvi_clear(vvi& arr)
{
    if(!(arr.empty()))
    {
        for(auto& i : arr)
        {
            i.clear();
            i.shrink_to_fit();
        }
 
        arr.clear();
        arr.shrink_to_fit();
    }
}
 
class Spruce
{
        vvi arr;
        int width;
        int height;
 
    public:
        Spruce() {}
        ~Spruce() {}
 
        Spruce(int amount, int size)
        {
            build(amount, size);
        }
 
        void build(int amount, int size)
        {
            vvi_clear(arr);
 
            width = 2 * amount + 2 * size - 3;
            height = (( 2 * size + amount - 1 ) * amount ) / 2;
 
            for(int i = 0; i < height; ++i)
            {
                arr.push_back(vi(width));
                std::fill(arr[i].begin(), arr[i].end(), 0);
            }
 
            int w = width / 2;
            int c = w;
            int n = height;
            while(n--)
            {
                arr[n][width/2] = 1;
                for(int i = width/2 - 1, j = i + 2, l = c; l > 0; --l)
                {
                    arr[n][i--] = 1;
                    arr[n][j++] = 1;
                }
 
                if(--c < 0)
                {
                    --w;
                    c = w;
                }
            }
        }
 
        vvi& get_spruce()
        {
            return arr;
        }
 
        int get_height()
        {
            return height;
        }
 
        int get_width()
        {
            return width;
        }
 
        void show() //это для тестов было
        {
            for(auto i : arr)
            {
                for(auto j : i)
                {
                    std::cout << j;
                }
                std::cout << "\n";
            }
        }
};
 
int shift_count(Spruce A, Spruce B)
{
    auto check_range = [](int i, int j, vvi& arr)
    {
        if(i < 0 || i >= arr.size()) return false;
        if(j < 0 || j >= arr[i].size()) return false;
 
        return true;
    };
 
    int mask_h = B.get_height() + 1;
    int mask_w = B.get_width() / 2 + 2;
 
    vvi mask;
 
    for(int i = 0; i < mask_h; ++i)
    {
        mask.push_back(vi(mask_w));
        std::fill(mask[i].begin(), mask[i].end(), 0);
        
        /*вот отсюда ересь начинается, которая не работает */
        for(int j = 1; j < mask[i].size(); ++j)
        {
            if(check_range(i, j - 1, B.get_spruce()))
            {
                mask[i][j] = B.get_spruce()[i][j - 1];
                for(int m = j - 1, n = i - 1; n < i + 2; ++n)
                {
                
                    if(check_range(n, m, mask))
                    {
                        if(mask[n][m] != 1)
                        {
                            mask[n][m] = 2; 
                        }
                    }
                }
            }
        }
    }
 
 
    
    
 
    auto check = [&](int shift)
    {
        //тут коллизия mask и A.get_vvi()
        return false;
        return true;
    };
 
    int res = -1;
    while(check(++res));
 
    return --res;
}
 
void create_forest(std::vector<Spruce>& trees, vvi& forest)
{
    /*это я не доделал*/
    vvi_clear(forest);
 
    int width = 0;
    int height = 0;
 
    std::vector<int> shifts(trees.size());
    shifts[0] = 0;
 
    for(int i = 1; i < trees.size(); ++i)
    {
        shifts[i] = shift_count(trees[i-1], trees[i]) + shifts[i-1];
        width += shifts[i];
    }
 
    for(auto i : trees)
    {
        if(height < i.get_height()) height = i.get_height();
        width += i.get_width();
    }
 
    for(int i = 0; i < height; ++i)
    {
        forest.push_back(vi(width));
        std::fill(forest[i].begin(), forest[i].end(), 0);
    }
 
 
 
}
 
int main()
{
    vvi forest;
 
    Spruce A(3, 2);
    Spruce B(3, 2);
    Spruce C(1, 3);
    Spruce D(1, 3);
 
    std::cout << "\n" << shift_count(C, B) << "\n\n";
 
 
 
    return 0;
}
Изображения
 
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
02.01.2021, 21:17
Цитата Сообщение от Folian Посмотреть сообщение
Я пытался для каждого ненулевого в shift_count определить как на картинке, но я опять напраздновался
В этом же и весь смысл. Главное правильно закусывать)
Я не люблю условий величиной с простыню, если это не часть технических требований к чему-то промышленному. Я просто ёлку нарисовал. Если умеешь нарисовать палку и ёлку, то ёлки-палки получаются путём комбинации в требуемом порядке.
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
02.01.2021, 21:29
Цитата Сообщение от IGPIGP Посмотреть сообщение
В этом же и весь смысл. Главное правильно закусывать)
НУ!
За понимание!

Завтра уж сам тогда доделаю/переделаю)
Миниатюры
C++ нарисовать елочку с  символов  
0
 Аватар для analogov net
2532 / 1130 / 495
Регистрация: 17.11.2018
Сообщений: 2,840
02.01.2021, 21:49
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я тут где-то уже постил
Тута:
Изобразите на экране пирамиду из символов 'X
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
02.01.2021, 22:29
analogov net, спасибо). Эту ёлку я на форуме не смог отыскать. Думал - срубили уже. Я её в своём коде старом нашёл. И добавил апишки с управлением цветом. И звездочку зазве... приделал)

Добавлено через 32 минуты
И что прикольно, - можно постоянно, что-то придумать ещё)
Кликните здесь для просмотра всего текста

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
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <iomanip>
#include <windows.h>
 
using std::cout;
void greenTree(int width, HANDLE &handle)
{
    std::srand(unsigned(std::time(0)));
 
    int half = width/2 ;
    for(int i=0; i<half; i++)
    {
 
        cout.fill(' ');
        cout<<std::setw(half-i);
        size_t color_result(0);
        for(int j=1; j<2*i; ++j)
            {
               char particle=(std::rand()%2?'x':'*');
               if('*'==particle) color_result=10;
               if('x'==particle)
               {
                   particle=(std::rand()%2?'o':'.');
                   color_result='.'==particle?12:15;
               }
               if(i==1&&j==1) color_result=7, particle='^',color_result=14;//звезда)
               if(i==2&&j==1 ) color_result=7, particle='<',color_result=14;//звезда)
               if(i==2&&j==3 ) color_result=7, particle='>',color_result=14;//звезда)
               if(i==2&&j==2 ) color_result=7, particle='O',color_result=12;//звезда)
               if(i==3&&j==2 ) color_result=7, particle='/',color_result=14;//звезда)
               if(i==3&&j==3 ) color_result=7, particle='^',color_result=14;//звезда)
               if(i==3&&j==4 ) color_result=7, particle='\\',color_result=14;//звезда)
               SetConsoleTextAttribute(handle, color_result);
               cout<<particle;
            }
        cout<<std::endl;
    }
}
 
int main()
{
    HANDLE output;
    COORD cursor;
    output = GetStdHandle(STD_OUTPUT_HANDLE);
    cursor.X = 0;
    cursor.Y = 0;
 
    std::srand(unsigned(std::time(0)));
 
    int width=35, repeats=20, pause=1000;
 
 
    for(int i=0; i<repeats; ++i)
    {
        Sleep(pause);
        greenTree(width, output);
        if(i!=repeats-1){
            SetConsoleCursorPosition(output,cursor);
 
        }
    }
     SetConsoleTextAttribute(output, 3);
        cout<<"\n\tHappy New Year!\n";
        std::cin.get();
        return 0;
}
2
 Аватар для analogov net
2532 / 1130 / 495
Регистрация: 17.11.2018
Сообщений: 2,840
02.01.2021, 22:46
Цитата Сообщение от IGPIGP Посмотреть сообщение
И что прикольно, - можно постоянно, что-то придумать ещё)
IGPIGP, нет предела совершенству...
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
02.01.2021, 22:54
Цитата Сообщение от analogov net Посмотреть сообщение
IGPIGP, нет предела совершенству...
Но написал плохо)
двойные присвоения стали донимать.
C++
1
if(i==1&&j==1) color_result=7, particle='^',color_result=14;//звезда)
Хотя водка свежая была...
Вот так лучше:

Кликните здесь для просмотра всего текста

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
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <iomanip>
#include <windows.h>
 
using std::cout;
void greenTree(int width, HANDLE &handle)
{
    std::srand(unsigned(std::time(0)));
 
    int half = width/2 ;
    for(int i=0; i<half; i++)
    {
 
        cout.fill(' ');
        cout<<std::setw(half-i);
        size_t color_result(0);
        for(int j=1; j<2*i; ++j)
            {
               char particle=(std::rand()%2?'x':'*');
               if('*'==particle) color_result=10;
               if('x'==particle)
               {
                   particle=(std::rand()%2?'o':'.');
                   color_result='.'==particle?12:15;
               }
               if((i>0 && i<4) && (j>0 && j<5))color_result= 14;
               if(i==1&&j==1)  particle='^' ;//звезда)
               if(i==2&&j==1 )  particle='<' ;//звезда)
               if(i==2&&j==3 )  particle='>' ;//звезда)
               if(i==2&&j==2 )  particle='O', color_result=12;//звезда)
               if(i==3&&j==2 )  particle='/' ;//звезда)
               if(i==3&&j==3 )  particle='^' ;//звезда)
               if(i==3&&j==4 )  particle='\\' ;//звезда)
               SetConsoleTextAttribute(handle, color_result);
               cout<<particle;
            }
        cout<<std::endl;
    }
}
 
int main()
{
    HANDLE output;
    COORD cursor;
    output = GetStdHandle(STD_OUTPUT_HANDLE);
    cursor.X = 0;
    cursor.Y = 0;
 
    std::srand(unsigned(std::time(0)));
 
    int width=35, repeats=20, pause=1000;
 
 
    for(int i=0; i<repeats; ++i)
    {
        Sleep(pause);
        greenTree(width, output);
        if(i!=repeats-1){
            SetConsoleCursorPosition(output,cursor);
 
        }
    }
     SetConsoleTextAttribute(output, 3);
        cout<<"\n\tHappy New Year!\n";
        std::cin.get();
        return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.01.2021, 22:54

Нарисовать елочку
Завтра зачет, нужно сделать программу с помощью вложенный циклов вывести елочку х хх х хх ххх х хх ххх хххх

Нарисовать елочку из треугольников
Напишите в паскале Abc прогу для елочки=)из треугольников и что бы был ствол у елочки(чем быстрее тем лутше)

Графика. Нарисовать елочку
Надо нарисовать елочку в любом паскале с помощью программы для треугольника и лижбо это все работало!!! Добавлено через 7 минут Ну...

Как нарисовать елочку
Народ как написать задачу чтоб она выводила на экран елочку????????????? не могу понять....

Нарисовать ёлочку через функции
Как через функции через канвас нарисовать ёлочку ?


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru