Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Подсчитать сумму членов ряда с точностью до 0.000001 https://www.cyberforum.ru/ cpp-beginners/ thread1601610.html
Для ряда, члены которого вычисляются по формуле, соответствующей Вашему индивидуальному заданию, подсчитать сумму членов ряда с точностью до 0.000001 и сумму первых 10 членов ряда. Если Вы считаете...
C++ Получить день и номер месяца и определить дату следующего дня (считать год невисокосным)
Напишите программу, которая получает день и номер месяца и определяет дату следующего дня. Считайте, что год невисокосный (365 дней). Пример: Введите день и месяц: 25 12 Следующий день: 26...
C++ Найти максимальный элемент массива и сумму элементов массива по условию
Доброе утро!...Уже и не знаю в чём дело....Вот тебе и заочное отделение:) Написать программу, работающую с одномерным вещественным массивом. Исходные данные: - количество элементов N=20; - тип...
C++ Проверить правильное написание IP Пытаюсь проверить верное написание IP, нужно из строки взять четыре числа и проверить их на 0<=x<=255. допустим что-то типа примера, но только для символов . Есть ли такая команда? i =... https://www.cyberforum.ru/ cpp-beginners/ thread1601550.html
C++ Ошибка в сортировке пузырьком https://www.cyberforum.ru/ cpp-beginners/ thread1601548.html
написана программа сортировки пузырьным методом.но когда ввожу числа в массив работает неправильно. вот код с++ #include <iostream> #include <stdlib.h> #include <conio.h> using namespace std; ...
Реализовать шифр Шамира для обмена шифрограммами двух абонентов по сети C++
1)Реализовать шифр Шамира для обмена шифрограммами двух абонентов по сети. Пользуясь изложенным способом: 1.зашифровать данный текст; 2.расшифровать данный текст.
C++ Реализовать шифр Шамира для обмена шифрограммами двух абонентов по сети
Реализовать шифр Шамира для обмена шифрограммами двух абонентов по сети.
C++ Указать такие неотрицательные целые x, y, z, t, что n = x^2 + y^2 + z^2 + t^2 Дано натуральное число n. Указать такие неотрицательные целые x, y, z, t, что n=x2 + y2 + z2 + t2. https://www.cyberforum.ru/ cpp-beginners/ thread1601527.html
C++ Определить, сколько чисел находится в интервале от -2 до 2 https://www.cyberforum.ru/ cpp-beginners/ thread1601518.html
Определить, сколько чисел находиться в интервале от -2 до 2(C++)
C++ Разработать функцию для обработки массивов Разработать функцию, которая находит одинаковые элементы в двух одномерных статических массивах и возможность использовать ее в качестве функции в основном теле программы. Два массива могут быть... https://www.cyberforum.ru/ cpp-beginners/ thread1601514.html
4453 / 2072 / 263
Регистрация: 01.03.2013
Сообщений: 5,508
Записей в блоге: 22
05.12.2015, 09:46 0

Написать программу, которая рисует на экране кривую Гильберта (использовать рекурсию)

05.12.2015, 09:46. Просмотров 2030. Ответов 2
Метки (Все метки)

Лучший ответ Сообщение было отмечено Fadjr как решение

Решение

Алгоритм возможно не самый оптимальный, велосипедный. За утечкой GDI и особенностями виндовой консоли не следил. И цикл на цикле, да...
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
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
 
int z;
void mylineTo(HDC hDC, bool c, int x, int y) {
    HPEN pen = CreatePen(PS_SOLID, 1, c ? RGB(255, 255, 255) : RGB(0, 0, 0));
    SelectObject(hDC, pen);
    LineTo(hDC, x, y);
    DeleteObject(pen);
}
void sq4(HDC hDC, int x, int y) {
    int d[]={-1,0,1,0,-1};
    MoveToEx(hDC, x-z, y, NULL);
    for(int i=0; i<4; ++i) mylineTo(hDC, 1, x+z*d[i+1], y+z*d[i]);
}
void sqc(HDC hDC, int x, int y) {
    int dx[]={-1,1,1,-1}, dy[]={-1,-1,1,1}, k[2][3]={{2*z,z,0},{z,2*z,3*z}};
    MoveToEx(hDC, x-3*z, y, NULL);
    for(int i=0; i<4; ++i) for(int j=0; j<3; ++j)
        mylineTo(hDC, 1-j%2, x+dx[i]*k[i%2][j], y+dy[i]*k[1-i%2][j]);
}
void f(HDC hDC, int x, int y, int n) {
    int d=4*z*(1<<(n-1)), dx[]={-1,-1,1,1}, dy[]={-1,1,-1,1};
    for(int i=0; i<4; ++i)
        if (n) f(hDC, x+d*dx[i], y+d*dy[i], n-1); else sq4(hDC, x+2*z*dx[i], y+2*z*dy[i]);
    sqc(hDC, x, y);
}
int _tmain(int argc, _TCHAR* argv[]) {
    HWND hW = GetConsoleWindow();
    HDC hDC = GetDC(GetConsoleWindow());
    setlocale(LC_ALL, "Russian");
    unsigned int n,d;
    while (1) {
        system("cls");
        cout<<"Увеличьте высоту консоли, введите порядок фрактала (0-5)\n";
        cout<<"и длину стороны меньшего элемента в пикселях (1-10): ";
        cin>>n>>z; d=8*z*(1<<(n-1)); unsigned int size=2*d;
        if (size>512) {
            cout<<"Длина стороны будет "<<size<<" пикселей. Попробуйте другие данные.\n";
            system("pause");
        } else break;
    }
    f(hDC, d+5*z, d+5*z+30, n);
    ReleaseDC(hW, hDC);
    system("pause"); return 0;
}
Другой кот, лаконичнее и алгоритм нравится мне больше. С элементами векторной алгебры, не отрывая пера. И без циклов В первый код тоже можно поставить задержку в функцию отрисовки линии и сравнить стратегии рисования.
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 "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
 
double x, y, z;
void dl(HDC hDC, double i, double j) {x+=i*z; y+=j*z; LineTo(hDC, x, y); Sleep(10);}
 
void f(HDC hDC, double i, double j, unsigned int n) {
    if (n) {f(hDC, i,  (z/150+1)*j, n-1); dl(hDC, j, -i); dl(hDC, i, j);
            f(hDC, j, -i, n-1); dl(hDC, i, j);
            f(hDC, -j, i, n-1); dl(hDC, i, j); dl(hDC, -j, i);
            f(hDC, i,  j, n-1);}
    else dl(hDC, i, j);
}
int _tmain(int argc, _TCHAR* argv[]) {
    HWND hW = GetConsoleWindow();
    HDC hDC = GetDC(GetConsoleWindow());
    HPEN pen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
    SelectObject(hDC, pen);
 
    setlocale(LC_ALL, "Russian");
    unsigned int n=100;
    while (n>5) {
        system("cls");
        cout<<"Увеличьте высоту консоли, введите порядок фрактала (0-5): "; cin>>n;
    }
    z=1+1<<(6-n); x=3*z; y=30+z;
    MoveToEx(hDC, x, y, NULL);  
    f(hDC,  1,  1, n); dl(hDC, -1,  1);
    f(hDC, -1, -1, n); dl(hDC,  1, -1);
 
    DeleteObject(pen);
    ReleaseDC(hW, hDC);
    system("pause"); return 0;
}


Вернуться к обсуждению:
Написать программу, которая рисует на экране кривую Гильберта (использовать рекурсию)
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2015, 09:46
Готовые ответы и решения:

Написать программу, которая рисует на экране кривую Гильберта (использовать рекурсию)
Здравствуйте. код написан на С++ но мне нужно чтобы он был написан на C# Windows Form. Заранее...

Написать программу, которая рисует на экране трактор
Написать программу, которая рисует на экране трактор

Написать программу, которая рисует на экране решётку.
Написать программу, которая рисует на экране решётку.

Написать программу, которая рисует на экране паровоз
Написать программу, которая рисует на экране паровоз. Pascal ABC/Turbo Pascal

2
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.