Использование функции ReadKey и функций управления цветом
Пример 1.5. Построить программу, которая, используя модуль Triangle, находит для заданного треугольника площадь S, периметр Р, радиусы Rv и Ro вписанной и описанной окружностей, при этом должны быть реализованы четыре варианта исходных данных:
а) заданы три стороны А, В, С;
b) заданы координаты вершин а,Ь,с треугольника (шесть координат);
с) заданы две стороны А, В и угол между ними;
d) задана сторона А и прилежащие углы.
В экране пользователя выделим синее окно для исходных данных и зеленое - для результатов:
Пользователь задает данные выбранного им варианта, например координаты вершин, и получает в зеленом окне значения результатов. Данные, относящиеся к другим вариантам, пропускаются нажатием клавиши Enter. Необходимо, чтобы программа не прекращала работы из-за ошибок пользователя при наборе данных, таких как набор запятой вместо десятичной точки, случайное нажатие буквы и т.п. Вместо операторов Read, Readln следует воспользоваться функцией ReadKey. Программа может анализировать коды клавиш на их допустимость в данном контексте. Например, в записи числа –289.49.4 предпоследний символ должен быть признан недопустимым.
Если символ недопустим, то занесения его в окно не будет, а программа будет выдавать краткий звуковой сигнал, пробуждающий “дремлющего” пользователя. В формируемой строке символов st также будут запоминаться только допустимые символы, а когда набор значения параметра заканчивается, пользователь нажимает Enter и содержимое строки преобразуется в число с помощью процедуры Val. Число символов в записи параметра ограничим 12.
Программа, реализующая интерфейс пользователя:
Program Primer_3;
Uses CRT, {Вызов стандартного модуля CRT}
Triangle; {Вызов модуля пользователя}
Const V: Array[1..12] of String[17] =
( ‘Длина стороны А:’,’Длина стороны В:’,’Длина стороны С:’,
‘Угол между А и В:’,’Угол между А и С:’,’Координаты вершин’,
‘Xa=’,’Ya=’,’Xb=’,’Yb=’,’Xc=’,’Yc=’);
Var j:Word; ch:Char; prm:Array[1..12] of Real; S,P,Rv,Ro: Real;
Function Value: Real; {Блок перевода набора символов в число}
Var i,er:Word;z:Real;ch:Char;st:String[12];Perv: Boolean;
Begin Perv:= True; i:=0;
Repeat ch:= ReadKey; {Считывание кода нажатой клавиши}
If (ch>#47) And (ch < #58) Or {“Если цифра или...}
(ch = #46) And Perv Or {...точка - впервые или...}
(ch = #45) And (i =0) Then {... минус в 1-й позиции...}
Begin i:=i+1: st[i]:=ch; {... то заполняется строка st”}
If ch = #46 Then Perv: = False;
Write(ch) Вывод символа на экран
End
Else If ch <> #13 Then Write(#7); {3вукoвoй сигнал при ошибке}
Until (ch = #13) Or (i >12); {Ввод символов продолжается, пока}
{не нажата клавиша Enter или число символов i не превысит 12}
st[0]:=Char(i); {В начальный компонент строки пишем ее длину}
Val(st, z, er);
Value:= z {Получение из строки st числа z}
End; {Конец блока Value}
Procedure Vivod; {Блок вывода результатов}
Begin
Writeln (#13#10' Результаты:’#13#10);
Writeln (‘Площадь S =’,5:7:3,#13#10'Периметр P=’,P:7:3);
Writeln (‘Радиус Rv =’,Рv:7:3,#13#10'Радиус Ro =’,Ro:7:3);
Write (#13#10'Изучив результаты, ‘#13#10’нажмите Enter’)
End; {Конец блока Vivod}
BEGIN
TextBackGround (0);ClrScr; {Очистка всего экрана}
TextColor (14); Window (2,1,35,16);
TextBackGround (Blue); {Заполнение окна синим цветом}
CIrScr;
For j := 1 to 12 do {Цикл заполнения поля данных}
Begin
Write (#13#10' ‘+ V[j]); {Выводим название параметра}
if j<>6 Then prm[j]:=Value; {в 6-й строчке числа не будет}
End;
Write (#13#10' Укажите вариант:’#13#10' нажмите а,Ь,с или d’);
Repeat ch:= ReadKey;
Case ch of {Оператор выбора альтернатив от ‘а’до ‘d’}
‘a’: Tr_a (prm[1],prm[2],prm[3],S,P,Rv,Ro);
‘b’: Tr_b (prm[7],prm[8],prm[9],prm[10],prm[11],prm[12],S,P,Rv,Ro):
‘c’: Tr_c (prm[1],prm[2],prm[4],S,P,Rv,Ro);
‘d’: Tr_d (prm[1],prm[3],prm[4],S,P,Rv,Ro)
Else Write(#7) {Звуковой сигнал пользователю при ошиб. букве}
End
Until ch in[‘a’..’d’]; {Расчет произведен; оформляем результат}
Window (45,1,75,16);TextBackGround(2);
CIrScr; {Очистка экрана. Образование нового окна}
Window (48,2,75,16); {“Урезаем” строки окна слева на 3-й позиции}
Vivod; {Заполнение поля результатов}
Readln {Задержка вывода на экране}
END. {Подробно о применении подобных программ см. работу [6], с.178-179}
В этой программе не хватает анализа корректности совокупности заданных пользователем параметров (неполные, предусмотренные совокупности параметров). Это несложное добавление можно сделать самостоятельно.