
ОЭС лр1 текстовый режим - метода
.docОЭС, лабораторная работа №1
Исследование текстового режима видеосистемы
Цель работы:
Ознакомление с возможностями вывода в текстовом режиме и функциями С++, их реализующими. Написание программы для вывода в окно текста со всевозможными комбинациями цветов текста и фона.
Размеры окна, интервалы в секундах между выводами и межстрочные интервалы, а также способ вывода информации о цвете, указаны в таблице из методички для каждого варианта отдельно.
Основная информация:
Для написания программы понадобятся функции С++, указанные в методе. Для их использования нужно подключить библиотеки dos.h и conio.h.
Textbackground(color), textcolor(color), gotoXY(x, y) и clrscr() работают точно так же, как и в Pascal. В качестве параметра color выступает число 0-7 для фона и число 0-15 для текста, т. е. 8 и 16 разных цветов соответственно.
Функция cprintf(...) предназначена для вывода в текстовом режиме и аналогична write из Pascal. В данной работе вывод на экран будет производиться при помощи этой функции, а не стандартным для С++ образом, т. е. не через оператор << вывода в поток:
Вместо cout << “Text”; в данной работе будет использоваться cprintf(“Text”);
Это обусловлено тем, что при выводе с помощью << игнорируются устанавливаемые атрибуты текста, т. е. цвет текста и фона.
Для реализации задержки в работе программы предлагается использовать следующие функции из библиотеки dos.h:
sleep(seconds);
delay(milliseconds);
Но может быть так, что в библиотеке не будет найдена одна из этих функций. Например, у меня при подключенном dos.h программа не распознавала функцию delay. В таком случае можно использовать функцию Sleep(msec) из библиотеки windows.h. Для этого ее нужно подключить в дополнение к остальным. Также стоит обратить внимание на то, что функция Sleep(msec) из windows.h пишется с большой буквы, а sleep(sec) из dos.h — с маленькой. Но первая реализует паузу в миллисекундах, а вторая — в секундах.
Структура программы:
Итак, необходимые функции известны, теперь можно перейти к самой программе. Исходя из задания, сначала необходимо создать окно с указанными координатами из таблицы вариантов. Т. е. просто использовать функцию window(x1, y1, x2, y2).
Далее нужно организовать двойной цикл по всем цветам фона и текста, которых, соответственно, 8 и 16.
В цикле необходимо будет вывести информацию о соотв. цветах, используя заданный вариантом формат; перейти на следующую строку и приостановить программу на заданный промежуток времени.
В цикле каждый раз будет изменяться цвет текста и фона, исходя из переменных цикла, которые и отвечают за цвета. Т. е. выглядеть это будет так:
for (int color1 = 0; color1 < 8; color1++)
for (int color2 = 0; color2 < 16; color2++)
{
textbackground(color1);
textcolor(color2);
...
}
Для вывода информации о цветах в большинстве вариантов понадобится две вещи: вывод номера цвета и вывод названия цвета. Начнем с того, что проще, т.е. с вывода номера.
Чтобы вывести номер цвета, например color1, недостаточно написать
cprintf(color1); // не будет работать
Нужно писать следующим образом:
cprintf(«%d», color1);
В данном случае первый параметр «%d» - флаг, указывающий на то, что будет выводиться целое число.
Перейдем к выводу названия цвета. Для этого придется написать отдельную функцию перевода номера цвета в строку. Выглядит она следующим образом:
string getColorName(int color) // функция перевода номера цвета в строку
{
switch (color) // по значению переданного цвета выбираем соотв. строку
{
case 0: return "black";
case 1: return "dark blue";
case 2: return "dark green";
case 3: return "aqua";
case 4: return "dark red";
case 5: return "purple";
case 6: return "dark yellow";
case 7: return "light gray";
case 8: return "gray";
case 9: return "blue";
case 10: return "green";
case 11: return "light blue";
case 12: return "red";
case 13: return "pink";
case 14: return "yellow";
case 15: return "white";
default: return "unknown color"; // случай неправильного параметра (вне [0; 15])
}
}
Данная функция возвращает тип string, для использования которого нужно подключить библиотеку «string.h». Тип String является классом, а функция printf, которой мы пользуемся, умеет выводить только простые цепочки символов — строки в стиле С, так что для вывода строки типа String нужно преобразовать ее в строку старого стиля. Делается это следующим образом:
string a = “Hello”; // строка, являющаяся объектом
cprintf(a); // неверно, cprintf неприменимо к string
cprintf(a.c_str()); // верно, при помощи метода c_str() строка a преобразовывается в строку старого стиля
Итак, вывод цвета в текстовом представлении при использовании вышеперечисленного будет выглядеть так:
string color1Name = getColorName(color1); // получение названия по номеру
cprintf(color1Name.c_str()); // вывод названия
Остался один нерасмотренный момент — вывод строк в окне с определенным шагом (T секунд и S строк). В вариантах используется дробное число секунд, так что придется использовать функции, принимающие миллисекунды, т. е.:
delay(300); // 0.3 секунды задержки, вариант, предлагаемый в методе
Sleep(300); // 0.3 секунды, использовать в случае, если первый вариант не сработает. Дополнительно нужно будет подключить windows.h.
Шаг в S строк — это просто соотв. количество переводов строки после каждого шага цикла. Строка переводится следующим образом:
cprintf(“\n\r”);
где «\n» означает переход на следующую строку, а «\r» - перевод каретки в начало строки.