Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
2 / 2 / 1
Регистрация: 26.06.2015
Сообщений: 56
1

Оптимизация кода вывода текста в консоль

18.02.2016, 14:34. Показов 1264. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Чего-то я совсем запутался...

Так как есть - работает, но понимаю, что это ужасно.

Собственно речь идет о части, начинающейся со строки 23...

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
void Field::Print()
{
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    
    COORD c = { x, y };
    DWORD d;
 
    SetConsoleCursorPosition(hOut, c);
    SetConsoleTextAttribute(hOut, 0x99);
 
    if (text.empty()) //если нет текста
    {
        for (int i = 0; i <= height; ++i)
        {
            c.X = x;
            c.Y = y + i;
 
            FillConsoleOutputAttribute(hOut, 0x99, width, c, &d);
            FillConsoleOutputCharacter(hOut, ' ', width, c, &d);
            cout << ' ';
        }
    }
    else //если есть текст
    {
        SetConsoleTextAttribute(hOut, 0x9E);
        
        if (text.size() <= width) //если помещается в одну строку
        {
            for (int i = 0; i < width; ++i)
            {
                if (i < text.size())
                    cout << text[i];
                else
                    cout << ' ';
            }
 
            for (int i = 1; i <= height; ++i)
            {
                c.X = x;
                c.Y = y + i;
 
                FillConsoleOutputAttribute(hOut, 0x99, width, c, &d);
                FillConsoleOutputCharacter(hOut, ' ', width, c, &d);
            }
        } //если помещается в одну строку
 
        else if (text.size() - width <= width) //если помещается в две строки
        {
            for (int j = 0; j <= height; ++j)
            {
                c.Y = y + j;
                SetConsoleCursorPosition(hOut, c);
 
                if (j == 0)
                {
                    for (int i = 0; i < width; ++i)
                    {
                        cout << text[i];
                    }
                }
                else if (j == 1)
                {
                    for (int i = 0; i < width; ++i)
                    {
                        if (i < text.size() - width)
                            cout << text[i + width];
                        else
                            cout << ' ';
                    }
                }
                else
                {
                    FillConsoleOutputAttribute(hOut, 0x99, width, c, &d);
                    FillConsoleOutputCharacter(hOut, ' ', width, c, &d);
                }
            }
        }//если помещается в две строки
 
                else if (text.size() - (width * 2) <= width) //если помещается в три строки
        {
            for (int j = 0; j <= height; ++j)
            {
                c.Y = y + j;
                SetConsoleCursorPosition(hOut, c);
 
                if (j == 0 || j == 1)
                {
                    for (int i = 0; i < width; ++i)
                    {
                        cout << text[i];
                    }
                }
                else if (j == 2)
                {
                    for (int i = 0; i < width; ++i)
                    {
                        if (i < text.size() - (width * 2))
                            cout << text[i + width + width];
                        else
                            cout << ' ';
                    }
                }
                else
                {
                    FillConsoleOutputAttribute(hOut, 0x99, width, c, &d);
                    FillConsoleOutputCharacter(hOut, ' ', width, c, &d);
                }
            }
        }//если помещается в три строки
    }
    
    SetConsoleTextAttribute(hOut, 0x0);
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.02.2016, 14:34
Ответы с готовыми решениями:

Оптимизация кода для вывода категорий.
Здравствуйте. У меня есть таблица с категориями примерно с такой структурой. category...

При запуске кода нет вывода в консоль
Здравствуйте! Есть такая проблема. Она простая, однако, побороть не получается. Итак. У меня...

Подкорректировать код вывода текста на консоль
Привет! Пришел на форум за помощью. Я начал изучать язык программирования С. И столкнулся с...

Не закрывать консоль после вывода текста
Пишу хелло ворлд на си #include &lt;stdio.h&gt; int main (void) { printf (&quot;Hello, World!\n&quot;); ...

8
543 / 486 / 104
Регистрация: 05.05.2014
Сообщений: 1,110
18.02.2016, 14:43 2
petuz, Если бы ты еще сказал, что твой код делает...
Да еще расположил бы его так, чтоб это не было такой простыней... Ведь чтобы ответить на твой вопрос, его листать нужно...
0
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
18.02.2016, 14:56 3
А можешь просто сказать, что этот метод должен выводить и какими данными операировать.
Ибо я уже вижу, что можно сделать проверку в виде
C++
1
2
3
4
int strings_width = text.size() / width; //получаем количество строк
for (int i = 0; i < strings_width; ++i) {
 //тут идет код программы.
}
Надобность в проверках, на количество строк пропадает.
1
2 / 2 / 1
Регистрация: 26.06.2015
Сообщений: 56
18.02.2016, 15:00  [ТС] 4
Код выводит введенный и сохраненный текст в text (это STL class string) посимвольно.
Но нужно его "уложить" в опеределенном поле (класс Field - собственно выше - это его метод, у которого есть координаты, ширина (27 символов) и высота (5 строк).
Есть картинка.
А как располагать непростыней?
Изображения
 
0
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
18.02.2016, 15:07 5
C++
1
2
3
4
5
6
7
8
9
int strings_width = text.size() / width; //получаем количество строк
for (int y = 0, i; y < strings_width; ++y) {
    for (int x = 0; x < width; ++x) {
        cout << text[i]; //выводим символ
        i++;
    }
    cout << "\n"; //переход на новую строку
    
}
1
2 / 2 / 1
Регистрация: 26.06.2015
Сообщений: 56
18.02.2016, 17:15  [ТС] 6
Valeryn,

C++
1
cout << "\n"; //переход на новую строку
- не канает, мне нужно не просто вывести с новой строки, а с новой строки в рамках положения самого объекта Поле.

Ну и незаполненный остаток "ячеек" поля заполнить пробелами.
0
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
19.02.2016, 01:48 7
Лучший ответ Сообщение было отмечено petuz как решение

Решение

Цитата Сообщение от petuz Посмотреть сообщение
- не канает, мне нужно не просто вывести с новой строки, а с новой строки в рамках положения самого объекта Поле.
Ну и незаполненный остаток "ячеек" поля заполнить пробелами.
Мне кажется я вполне ясно построил алгоритм. Дальше допилите его, как угодно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int end_string = ext.size() % width; // получаем длину последней, не полной строки
int strings_width = text.size() / width; //получаем количество полных строк
if (end_string > 0) //если последняя строка не полная, то количество циклов строк +1
   strings_width++;
for (int y = 0, i; y < strings_width; ++y) { //тут обьявляется два счетчика, счетчик строк y и счетчик символов i
    for (int x = 0; x < width; ++x) {
      if (end_string > 0 && i > text.size()) //если это последняя строка и она не полная
         cout << ' '; //ставим пробел
       //сюда пишем свой код, который выводит символ в консоль типо cout << text[i];
        i++; //счетчик символов
    }
    //сюда пишем функцию, которая переходит на новую строку
    
}
1
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
19.02.2016, 04:11 8
Цитата Сообщение от petuz Посмотреть сообщение
мне нужно
И кашу сварим за вас и прожуём)))

Цитата Сообщение от Valeryn Посмотреть сообщение
Дальше допилите его, как угодно
Да, тут даже не понятно что он хочет) Толи сыра, толи мыла..
0
2 / 2 / 1
Регистрация: 26.06.2015
Сообщений: 56
21.02.2016, 13:25  [ТС] 9
Спасибо.
В итоге получилось так:
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
void Field::Print()
{
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    
    COORD c = { x, y };
    DWORD d;
 
    SetConsoleCursorPosition(hOut, c);
    SetConsoleTextAttribute(hOut, 0x99);
 
    for (int i = 0; i < height; ++i)
    {
        c.X = x;
        c.Y = y + i;
 
        FillConsoleOutputAttribute(hOut, 0x99, width, c, &d);
        FillConsoleOutputCharacter(hOut, ' ', width, c, &d);
        cout << ' ';
    }
 
    if (!text.empty()) //если есть текст
    {
        c.X = x;
        c.Y = y;
        SetConsoleCursorPosition(hOut, c);
        SetConsoleTextAttribute(hOut, 0x9E);
 
        for (int v = 0, i = 0; v < height; ++v)
        {
            for (int s = 0; s < width; ++s)
            {
                if (i < text.size())
                    cout << text[i];
                ++i;
            }
            cout << "\n";
            c.Y = y + v + 1;
            SetConsoleCursorPosition(hOut, c);
        }
    }
        
    SetConsoleTextAttribute(hOut, 0x0);
}
0
21.02.2016, 13:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.02.2016, 13:25
Помогаю со студенческими работами здесь

Оптимизация кода по замене текста
Подскажите пожалуйста, как можно оптимизировать нижеуказанный код? Sub www() Dim iSource As...

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

Буферизация вывода в консоль, и цветной вывод в консоль
Потребовалось реализовать цветной вывод массивов в консоль(некоторые значения выделить зеленым)....

Оптимизация методом Ньютона (нахождение точки минимума). Оптимизация кода
MATLAB только начал осваивать. Попытался реализовать нахождение точки минимума методом Ньютона...


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

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