Построение функций в консоли. Часть 2 (График)

В прошлый раз я остановился на построении таблицы значения функций. Пришла пора перейти к построению самого графика, ради чего все это, собственно, и начиналось.
Итак, основная идея состоит в следующем. Повернем координатную ось на 90 градусов по часовой стрелке. Это нужно для того, чтобы упростить построения, не храня данные о каждой точке в каком-нибудь листе.
Дальше ограничиваем координатную ось игрек 82 символами для лучшей читабельности графика. Понятно, что при этом мы теряем точность и график будет больше схематическим (слишком сжатым), особенно для «крутых» функций, но все же.
После этого мы высчитываем положение оси x относительно оси игрек, то есть ищем, в каком месте у нас будет точка (x, 0). Ну а потом построчно будем ставить в соответствие x значение функции y1 в этой точке.
Поехали
Для начала нам понадобится следующая формула:
Самому графику мы отведем 80 позиций, два оставшихся места будут чисто декоративными. Этой формулой мы находим, какой диапазон значений соответствует одной позиции в нашем графике. Тогда мы сможем правильно отметить на нем текущую точку.
Основные идеи обозначены, поэтому перейдем к самому коду
dial_length = 12 label = "График функции y1 = x**3 - 2*x**2 + 4*x - 8" print(">".format(len(label) + dial_length, label), '\n') print(">\n >>\n".format(aux = [dial_length + 82, 'y' , 82*'-']));
В том числе и благодаря комментариям к первой части, я узнал о такой штуке, как format. Мне она показалась действительно удобнее моих танцев с бубном, поэтому огромный кусок кода с вычисления отступов превратился в пару строк
print(">".format(len(label) + dial_length, label), '\n')
Единичка отвечает за номер элемента, переданного в качестве аргумента функции format, то есть это «ссылка» (не в буквальном смысле) на переменную label, которую мы собственно выводим на экран. Нумерация идет точно так же, как и в листах — с нуля.
Пара символов :> используется для того, чтобы выровнять выводимый на экран текст по правой стороне. Ну а после символа > нужен для того, чтобы определить то количество позиций строки, которое вам нужно.
То есть в данном случае мы резервируем для строки label len(label) + dial_length позиций, причем сам label занимает только len(label), и выравниваем внутри совокупности этих позиций текст по правой стороне.
print(">".format(len(label) + dial_length, label), '\n') print(dial_length*' ' + label, '\n')
эти строки эквивалентны
Да, для строк, наверное, проще использовать второй вариант, но применить первый для общего развития не помешает)
print(">\n >>\n".format(aux = [dial_length + 82, 'y' , 82*'-']));
В format можно запихивать даже массивы типа r_value (в C++), то есть созданные непосредственно при передаче аргумента.
Зафиксируем переменные, которые у нас постоянны, то есть они не зависят от текущего значения функции.
В питоне нет условного const для обозначения констант, поэтому принято называть такие переменные заглавными буквами и просто их не изменять.
MAX_Y1_VALUE_DIFFERENCE = (max_y1_value - min_y1_value) + \ (max_y1_value == min_y1_value) RATIO = MAX_Y1_VALUE_DIFFERENCE / 80 AXIS_X_POS = abs(int((- min_y1_value) / RATIO)) if (AXIS_X_POS > 80): AXIS_X_POS = 81
Так как RATIO по понятным причинам не может быть равно 0, MAX_Y1_VALUE_DIFFERENCE должно быть положительным числом. Именно для этого в правой части присваивания есть второе слагаемое.
Позицию оси икс мы высчитываем по формуле
Откуда берется эта формула? Мы просто высчитываем отношение отрезков (на оси игрек) от начала оси (min(y1)) до текущего значения функции (y1(x)) и отрезка от начала оси до ее конца (max(y1)). Ну и умножаем это отношение на 80, чтобы найти такое расстояние от начала оси до текущего значения в пробелах (поэтому можно использовать только целые числа), которое отразит отношение-формулу на графике.
Так как нас интересует позиция при y1(x) = 0, то подставляем в формулу необходимые значения и вуаля.
Теперь можно переходить непосредственно к печати значений
while (is_sequence_decreasing and from_x >= to_x) or \ (not is_sequence_decreasing and from_x
Цикл нам уже знаком. Придется второй раз посчитать каждое значение функции, чтобы не хранить их в листе или чём-то еще.
Позицию игрека вычисляем по выше приведенной формуле.
Верхнюю разность из формулы нам придется еще пофиксить, предусмотрев случай, когда в формуле будет получаться неопределенность вида ноль на ноль. Если такая неопределенность возникнет, то она будет означать, что текущее значение y1(x) = max(y1), а значит текущее значение игрека совпадет с концом оси y.
print(".6g>".format(dial_length, from_x), end='') if (negative_value_exists): if y1_cur_value = 0 + RATIO / 2: req_aux = pos_of_y - AXIS_X_POS if (req_aux != 0): print(AXIS_X_POS * ' ' + '|' + (req_aux - 1) * ' ' + '*') else: print((AXIS_X_POS) * ' ' + '|*') else: print(AXIS_X_POS * ' ' + '*') else: print('|' + pos_of_y* ' ' + '*') AXIS_X_POS = 0 from_x += pace_x print((dial_length + AXIS_X_POS) * ' ' + '|\n', (dial_length + AXIS_X_POS - 3) * ' ' + 'x V')
Эта часть кода непосредственно отвечает за печать самого графика
print(".6g>".format(dial_length, from_x), end='')
Здесь-таки format очень сильно пригодился и упростил код. ^ позволяет нам выровнять число по центру выделенной области (в данном случае, 12 позиций). g отвечает за числа — если у них нет дробной части, то печататься она и не будет (число как int), иначе — 6 знаков после запятой
Так как наш график ограничен пространством в 80 символов вдоль оси y, на нашем графике значение функции в точке будет совпадать с осью x не только в случае y1(x) = 0, но и в окрестности [0 — RATIO/2, 0 + RATIO/2].
Всего у нас есть три случая расположения звездочки (то есть точки) и вертикальной палки (то есть оси x): '*|' (y1(x) = 0 + RATIO/2), эти три случая и будем рассматривать.
- y1(x) В этом случае точка находится до оси x, поэтому мы ищем расстояние от точки до оси в пробелах. Из-за округления чисел может получится так, что значения переменных AXIS_X_POS и pos_of_y могут совпасть. Но такого быть не может, так как в этом случае мы бы попали в третий случай. У нас же точка не совпадает с осью х, поэтому необходимо дополнительное условие, которое будет уменьшать на 1 переменную pos_of_y в случае равенства.
- y(x) >= 0 + RATIO/2
Случай идентичен первому случаю, только точка будет расположена с другой стороны от оси х и все вышеописанные действия под это корректируются - остальное
Самый простой случай — просто печатаем звездочку на месте оси
Ну и завершаем программу дорисовкой оси x.
Итак, код, который в итоге получился:
dial_length = 12 label = "График функции y1 = x**3 - 2*x**2 + 4*x - 8" print(".6f>".format(dial_length, x_copy)) print(">".format(len(label) + dial_length, label), '\n') print(">\n >>\n".format(aux = [dial_length + 81, 'y' , 82*'-']), end=''); MAX_Y1_VALUE_DIFFERENCE = (max_y1_value - min_y1_value) + \ (max_y1_value == min_y1_value) RATIO = MAX_Y1_VALUE_DIFFERENCE / 80 AXIS_X_POS = abs(int((- min_y1_value) / RATIO)) if (AXIS_X_POS > 80): AXIS_X_POS = 81 while (is_sequence_decreasing and from_x >= to_x) or \ (not is_sequence_decreasing and from_x <= to_x): y1_cur_value = y1(from_x) cur_y1_value_and_min_difference = (y1_cur_value - min_y1_value) + \ (y1_cur_value == min_y1_value) * \ ((max_y1_value == min_y1_value)) pos_of_y = int(cur_y1_value_and_min_difference * 80 / \ MAX_Y1_VALUE_DIFFERENCE) print(".6g>".format(dial_length, from_x), end='') if (negative_value_exists): if y1_cur_value = 0 + RATIO / 2: req_aux = pos_of_y - AXIS_X_POS if (req_aux != 0): print(AXIS_X_POS * ' ' + '|' + (req_aux - 1) * ' ' + '*') else: print((AXIS_X_POS) * ' ' + '|*') else: print(AXIS_X_POS * ' ' + '*') else: print('|' + pos_of_y* ' ' + '*') AXIS_X_POS = 0 from_x += pace_x print((dial_length + AXIS_X_POS) * ' ' + '|\n', (dial_length + AXIS_X_POS - 3) * ' ' + 'x V')
Запустим программу на нескольких тестах
Консольное приложение, которое рисует сердечко на C#
Данный код не является оптимизированным или идеализированным, он очень простой и будет понятен новичкам(кем я и являюсь), потому надеюсь на понимание). Ну и еще это приложение было создано скорей смеха ради.
Вот, что в результате получилось у меня:




Суть работы
У нас есть массив(экран) так же такой массив называют экранный буффер, который выводит на экран пиксели(символы) в определенном порядке. По-сути мы делаем программу которая рисует графики функций(сердечко это тоже просто график функции), минусом такого приложения же будет то, что графики будут крайне не точны, потому что содержат в себе только целые числа, но для вывода фигур по-типу круга, сердца вполне подходит, чем больше масштаб - тем точнее будет.
Создание
В самой консоле лучше выбрать шрифт "Raster Fonts 8x8" дабы ширина символа = высоте, чтоб в дальнейшем не делить высоту на два.
Console.Title = "HABR @Frog_cry_too"; //TITTLE КОНСОЛИ Console.ForegroundColor = ConsoleColor.Red; //ЦВЕТ ТЕКСТА В КОНСОЛЕ //ИНИЦИАЛИЗИРУЕМ МАССИВ int height = 100, width = 100; char[,] buffer = new char[height, width]; //ЗАДАЕМ РАЗМЕРЫ КОНСОЛИ(РАЗМЕРЫ ТУТ ОПРЕДЕЛЯЮТСЯ ПО-СИМВОЛЬНО, ТОЕСТЬ 'СИМВОЛ' = 1) Console.SetWindowSize(width, height); Console.SetBufferSize(width, height); //ЗАПОЛНЯЕМ МАССИВ for(int i = 0; i < height; i++) < for(int j = 0; j < width; j++) < //ВЫВОДИМ ТОЧКУ В ЦЕНТР БУФФЕРА int x = j - width / 2; int y = -1 * (i - height / 2); //ПО-СКОЛЬКУ РЯДЫ МАССИВА БУДУТ ИНИЦИАЛИЗИРОВАТЬСЯ СВЕРХУ ВНИЗ (ОТ 0 ДО 100), НАМ НАДО ДОМНОЖИТЬ НА -1 //ЗАДАЕМ УСЛОВИЕ ОТБОРА(ПИШЕМ ФУНКЦИИ ПО КОТОРОЙ БУДЕТ РИСОВАТЬСЯ ГРАФИК) //ПО-СКОЛЬКУ ФУНКЦИЯ БОЛЬШАЯ, Я ДЕЛЮ ЕЕ НА ДВЕ ЧАСТИ int firstPart = x * x; int secondPart = (int)((y - Math.Sqrt(Math.Abs(x))) * (y - Math.Abs(x))); int heartSize = 500; //РАЗМЕР СЕРДЦА if (firstPart + secondPart else < buffer[i, j] = ' '; //ЗАПОЛНЯЕМ НЕ НУЖНУЮ НАМ ЧАСТЬ БУФФЕРА СИМВОЛОМ КОТОРЫМ ХОТИМ >> > //ВЫВОДИМ МАССИВ for(int i = 0; i < height; i++) < for(int j = 0; j < width; j++) < Console.Write(buffer[i, j]); >Console.WriteLine(); > //ЧТОБ НЕ ВЫВОДИЛСЯ ТЕКСТ ЗАВЕРШЕНИЯ ПРОГРАММЫ Console.ReadLine();
/*РЕЗУЛЬТАТ ПРАВДА ТУТ ОН ВЫТЯНУТЫЙ, ИБО ШРИФТ ДРУГОЙ), ЧТОБ ОН СТАЛ МЕНЬШЕ ПО ВЫСОТЕ, ДОСТАТОЧНО X ПОДЕЛИТЬ НА НУЖНЫЙ КООФИЦИЕНТ, НУ ЭТО ПОНЯТНО ИЗ ОСНОВНЫХ ПОНЯТИЯХ ПО ФУНКЦИЯМ*/ ♥♥♥♥ ♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥ ♥♥♥ ♥
В моем коде я сделал методы вызова разных графиков - для легкого использования (ну и убрал их в отдельный класс). Возможно сделаю вторую часть где покажу код с отдельными методами и возможными вариациями закраски (ну и покажу их принцип).
unixforum.org
Зашел разговор о плагине для зарисовки блок схем под вим здесь drawIt . И я вспомнила как недавно помогала индусу отрисовывать на консоль что то подобное. Кстати, скрипт тогда я тоже назвала drawit. Хочу поделится и может кто заинтересуется. Индус понимал по английски лучше меня но вместе у нас получилась примерно как здесь Камеди-На американском радио. Ему я это в конечном счете тоже показала но так до конца и не поняла всю глубину логики которую влаживал в вопрос оппонент и вот то что я легенькое накидала.
#!/bin/bash frame() < echo "+-$-+" echo "| $2 |" | column -to' |--> | ' -s$'\r' echo "+-$-+" > IFS=$'\r'; frame "$" "$*"
Запускаем как-то так:
Можно переадресовать в файл. Вообщем. Можно прикинутся индусом и напридумывать сложных фирулей если кто скучает.
Да. Если нужны пробелы в словах блока необходимо заключать их в кавычки или экранировать сам пробел
Последний раз редактировалось olecya 02.09.2020 09:55, всего редактировалось 3 раза.
Спасибо сказали:
SerW Сообщения: 402 ОС: macOS& Fedora Workstation Latest Контактная информация:
Re: Рисуем блок схемы в консоли
Сообщение SerW » 22.12.2020 23:19
Сергей Ш. » DragonSerW.RU
Спасибо сказали:
gabix Сообщения: 352 ОС: openSUSE Leap 15.4
Re: Рисуем блок схемы в консоли
Сообщение gabix » 23.12.2020 09:58
Как для меня — вообще круть запредельная 🙂
Спасибо сказали:
devilr Сообщения: 3651 ОС: Mandriva => Gentoo (~amd64) Контактная информация:
Re: Рисуем блок схемы в консоли
Сообщение devilr » 23.12.2020 10:10
Кстати, всегда интересовало, а почему в таких поделках рисуют всякими плюсами/минусами, а не символами псевдографики? Они ведь в той же таблице находятся.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
olecya Сообщения: 894 ОС: debian, fedora (i3-wm)
Re: Рисуем блок схемы в консоли
Сообщение olecya » 23.12.2020 10:52
22.12.2020 23:19
Очень информативно, не боитесь, что могут расценить такое как спам?
23.12.2020 10:10
почему в таких поделках рисуют всякими плюсами/минусами
Так плюс это идеальный элемент сопряжения.
23.12.2020 10:10
Они ведь в той же таблице находятся.
А что за таблица? Есть продвинутые диграфы :dig
Чуть не написала глифы.
Бывает пользую когда нужно в латинице ударение поставить
Спасибо сказали:
devilr Сообщения: 3651 ОС: Mandriva => Gentoo (~amd64) Контактная информация:
Re: Рисуем блок схемы в консоли
Сообщение devilr » 23.12.2020 11:03
23.12.2020 10:52
А что за таблица?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
olecya Сообщения: 894 ОС: debian, fedora (i3-wm)
Re: Рисуем блок схемы в консоли
Сообщение olecya » 23.12.2020 11:12
@devilr. Вижу в таблице первые три символа по которым уже есть соображения. Спасибо, отлучусь не на долго
Спасибо сказали:
devilr Сообщения: 3651 ОС: Mandriva => Gentoo (~amd64) Контактная информация:
Re: Рисуем блок схемы в консоли
Сообщение devilr » 23.12.2020 11:28
Просто, я уже много раз видел подобные "рисунки" в официальной документации всяких контор. И они все упорно не хотят применять псевдографику, хотя она совершенно прекрасно отображается хоть на древних терминалах, хоть на печати. Непонятно, почему.
P.S. "ненадолго" в этом контексте пишется слитно. Ваш граммар-наци.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
gabix Сообщения: 352 ОС: openSUSE Leap 15.4
Re: Рисуем блок схемы в консоли
Сообщение gabix » 23.12.2020 12:25
23.12.2020 11:28
Просто, я уже много раз видел подобные "рисунки" в официальной документации всяких контор.
…
Ваш граммар-наци.
Запятая в первом предложении лишняя. Да и нормальные кавычки типа «» нелишне поставить бы.
Дружеский привет от Komma Klan.
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20643 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: Рисуем блок схемы в консоли
Сообщение Bizdelnick » 23.12.2020 12:32
23.12.2020 10:10
Кстати, всегда интересовало, а почему в таких поделках рисуют всякими плюсами/минусами, а не символами псевдографики? Они ведь в той же таблице находятся.
В таблице ASCII их нет, всё остальное может быть недоступно в зависимости от локали.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |
Спасибо сказали:
gabix Сообщения: 352 ОС: openSUSE Leap 15.4
Re: Рисуем блок схемы в консоли
Сообщение gabix » 23.12.2020 12:36
Так локали теперь всё больше на UTF-8 основываются, а значит псевдографика должна быть доступна почти всем.
Спасибо сказали:
devilr Сообщения: 3651 ОС: Mandriva => Gentoo (~amd64) Контактная информация:
Re: Рисуем блок схемы в консоли
Сообщение devilr » 23.12.2020 12:37
23.12.2020 12:32
В таблице ASCII их нет
А про какую именно таблицу вы говорите? Вроде, во второй половине, они всегда были. в Extended ASCII
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20643 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: Рисуем блок схемы в консоли
Сообщение Bizdelnick » 23.12.2020 12:43
23.12.2020 12:37
А про какую именно таблицу вы говорите? Вроде, во второй половине, они всегда были. в Extended ASCII
В какой именно из Extended ASCII? Вторая половина в них всех разная.
export LC_ALL=ru_RU.KOI8-R
Удачи в выводе псевдографики. ☺
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |
Спасибо сказали:
devilr Сообщения: 3651 ОС: Mandriva => Gentoo (~amd64) Контактная информация:
Re: Рисуем блок схемы в консоли
Сообщение devilr » 23.12.2020 12:48
23.12.2020 12:43
Удачи в выводе псевдографики.
Если выбрать иврит, то наверняка не будет. Впрочем, может и так, что не у всех эти символы есть. я с этими таблицами больше на микроконтроллерах и китайских LCD - дисплеях встречался.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20643 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: Рисуем блок схемы в консоли
Сообщение Bizdelnick » 23.12.2020 13:09
Хотя я ошибся, в KOI8-R как раз есть псевдографика. Но даже в KOI8-U она частично выброшена. А в Latin-1, например, её нет.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |
Спасибо сказали:
Hephaestus Сообщения: 3729 Статус: Многоуважаемый джинн. ОС: Slackware64-14.1/14.2 Контактная информация:
Re: Рисуем блок схемы в консоли
Сообщение Hephaestus » 23.12.2020 14:09
23.12.2020 11:28
И они все упорно не хотят применять псевдографику, хотя она совершенно прекрасно отображается хоть на древних терминалах, хоть на печати.
Псевдографика в момент заменяется на "плюсы", "минусы", буквы "T" и "L", стоит только открыть исходник без без явного указания кодировки. Например, набросали рамочки в каком-нибудь встроенном редакторе NortonCommander - всё красиво.
А потом открыли, например, в vim. Всё - псевдографика вся разлетелась - заменилась на плюсы, минусы и пр.
Причем, заменяется автоматом, без всякого спроса.
За все редакторы не скажу, но с vim это было точно.
Чтобы этого не случилось, нужно либо псевдографику указывать кодами символов (что неудобно), либо файл не открывать в сторонних редакторах без указания кодировки.
Так эти люди, которые "не хотят использовать псевдографику" - они просто предпочитают plain text, что вполне оправдано.
Это я про исходники программ, которые рамочки выводят на экран.
А что касается документации - тем более: рисовать рамочки - это ж надо редактор, который такое умеет, плюс сам составитель документации должен это уметь. Это надо разбираться с режимом рисования, выбрать какой-то удобный способ быстрой вставки этих символов. короче, это целая история. А плюсы-минусы - вот они - на клавишах, никуда лезть не надо. И не случится с ними ничего - открывай файл, чем хочешь.
КАК ваще можно рисовать на этом "ужасном" языке?
Когда-то, давным-давно, когда дебри ДОСа простирались от края и до края, программисты были самыми несчастными людьми. Им приходилось программировать графику под ДОС. Эта операционная система, ветхая, как и сами компьютеры, не реализует ничего, кроме работы с файлами, да и то на довольно низком уровне. Толку от неё практически никакого не было, и с графикой приходилось работать напрямую, используя 10-ый вектор прерывания. О прерываниях в следующем разделе, а пока скажем лишь, что работу с регистрами скрыли от нас всевозможные графические библиотеки. В компании Borland тоже сделали одну. Теперь она часть языка СИ, того, что для ДОС. Так уж повелось, что Паскаль, скажем, всегда рассматривается комплексно, с графикой. В СИ - язык отдельно, графика отдельно. Есть книги по языку, есть книги по графике. Разделяй и властвуй!
Работа с графикой осложняется тем, что надо подключать специальный EGA/VGA-драйвер, разработнный Borland для инициализации и работы с графическим режимом видеоплаты. Для этого надо этим файлом располагать. И конечно же, в ОС Windows этот драйвер не поддерживается. Куда деваться? использовать старый добрый Borland C++ 3.0 (3.1). Там и драйвер есть в папке BGI и поддерживает она его. Но для работы вашей программы с графикой, придётся комплектовать её файлом EGAVGA.BGI. Его целесообразно размещать в той же папке, что и программа или в подпапке, чтобы случайно не стёрли. Также надо разрешить компилятору работать с графикой. Выставьте флажок в меню: options->linker->libraries->Graphic library. Убеждаю вас, что ни Visual C++, ни Borland C++ 5.0 к низкоуровневой графике вас и близко не подпустят. Освоив эту графику, вы без труда освоите графику под Windows, когда мы с нею столкнёмся. Принципиальных отличий нет, если не считать некоторых изменений в именах функций и того, что эти функции могут быть членами класса (Visual C++). Главное - понять концепцию.
Вопрос: КАК перейти в графический режим?
Самый распространённый способ - использовать функцию initgraph, которая задаёт и режим и резрешение и указывает путь к EGAVGA.BGI. Рассмотрим её синтаксис:
initgraph(*int far grdriver, *int far grmode, char *path);
Первый аргумент указывает тип видеоадаптера. Он принимает числовое значение:
Аргумент grdriver: