Использование функции 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}

В этой программе не хватает анализа корректности совокупности заданных пользователем параметров (неполные, предусмотренные совокупности параметров). Это несложное добавление можно сделать самостоятельно.

Наши рекомендации