Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Вывод элементов циклического списка


Автор: Metalex 30.10.2010, 18:51
Привет всем. 
у меня есть циклический двунаправленный список, количество элементов которого и сами элементы вводятся с клавиатуры. Загвоздка лишь в одном: вывести надо в консоли в виде круга. Как это реализовать (тем более, что количество элементов всегда разное)?
Пример:
                             7
                 7                     8
               8                            8
                  6                   6
                              3

Приблизительно так, в общем.
Спасибо всем учавствующим.

Автор: Master01 30.10.2010, 23:06

Если в консоль, то нечётное количество элементов, вроде, не вывести. В противном случае "дырка" получится )

Автор: Metalex 31.10.2010, 14:25
ну и пусть будет дырка)
Хоть как-то уже чтоб выводило

Автор: xvr 1.11.2010, 12:08
С математикой дружишь? Что такое 'полярная система координат' в курсе?
Вычисляешь координаты элементов твоего списка (элементы все на расстоянии 1 и равномерно заполняют все 360гр). Дальше переводишь в Декартовую систему координат, масштабируешь, что бы уместилось в экран, смещаешь начало отсчета, что бы не было отрицательных координат.
Потом сканируешь построчно результат и выводишь на экран, так же построчно.

В общем 2D математика

Автор: Metalex 1.11.2010, 18:26
xvr, идею понял, спасибо

Но...
Допустим, у меня n элементов в списке. Делим 360 на n. r берем любое удобное.
Находим x=r*cos(360/n), y=r*sin(360/n). И что дальше с этими координатами делать?  smile 

Автор: xvr 1.11.2010, 20:52
Цитата(Metalex @ 1.11.2010,  18:26)
xvr, идею понял, спасибо

Но...
Допустим, у меня n элементов в списке. Делим 360 на n. r берем любое удобное.
Находим x=r*cos(360/n), y=r*sin(360/n). И что дальше с этими координатами делать?  smile

Отмасштабировать (что бы соседние laible'ы не пересекались на экране) и переместить, что бы не было отрицательных координат

Автор: Dov 2.11.2010, 02:00
Цитата(Metalex @  1.11.2010,  17:26 Найти цитируемый пост)
И что дальше с этими координатами делать?

Перемещаться по ним и выводить данные. Вот набросал примерчик, а дальше напильник в руки и вперёд...  smile 
     На VC++ проверил, вроде работает:
Код
#include <windows.h>

#define PI        3.14159265
#define MAX_SIZE  12

void gotoxy(short x, short y)
{
    HANDLE    StdOut    = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD    coord    = {x, y};
    
    SetConsoleCursorPosition(StdOut, coord);
}

COORD getCoord(COORD mid, int n) 
{
    COORD   crd;    
    double    deg    = 180 + (n % MAX_SIZE) * 360 / MAX_SIZE;    
    double    ang    = deg / 180;

    crd.X = mid.X + (int)(cos(ang * PI) * mid.X * 0.8);
    crd.Y = mid.Y + (int)(sin(ang * PI) * mid.Y * 0.9);
    
    return crd;
}

int main()
{
    COORD mid = {MAX_SIZE * 2, MAX_SIZE};
    int   arr[MAX_SIZE];

    for(int i = 0; i < MAX_SIZE; i++)
        arr[i] = i + 1;

    for(int i = 0; i < MAX_SIZE; i++)
    {
        COORD crd = getCoord(mid, i);        
        gotoxy(crd.X, crd.Y);
        printf("%d", arr[i]);
    }
    gotoxy(0, mid.Y * 2 + 1);

    return 0;
}


Автор: mes 2.11.2010, 03:11
Цитата(Dov @  2.11.2010,  01:00 Найти цитируемый пост)
 gotoxy(crd.X, crd.Y);

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

Автор: Dov 2.11.2010, 12:01
Цитата(mes @  2.11.2010,  02:11 Найти цитируемый пост)
если готохы нельзя использовать, можно создать статический двухмерный массив, в котором нарисовать нужное, а после вывести его в консоль..

http://codepad.org/iD96Svug

Автор: Metalex 2.11.2010, 14:41
Спасибо всем огромное! Буду вечером разбиратся.

Добавлено через 3 минуты и 4 секунды
Но оно же вроде вычисляет от центра координаты да? А если у меня текст есть еще, а нужно, чтоб под ним выводило?

Автор: Dov 2.11.2010, 16:07
Цитата(Metalex @  2.11.2010,  13:41 Найти цитируемый пост)
 А если у меня текст есть еще, а нужно, чтоб под ним выводило?

Выводи, не бойся.

Автор: mes 2.11.2010, 16:19
Цитата(Metalex @  2.11.2010,  13:41 Найти цитируемый пост)
? А если у меня текст есть еще, а нужно, чтоб под ним выводило?


Цитата(Dov @  2.11.2010,  01:00 Найти цитируемый пост)
напильник в руки и вперёд... smile 


Добавлено через 1 минуту и 49 секунд
к тому же если Вы присмотритесь к последнему коду, увидите, что рисунок выводится целиком, как полотно.. т.е центр при выводе рисунка не причем..

Автор: Metalex 3.11.2010, 12:05
Спасибо огромное всем!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)