Val (choice2, choice, code);
Рассмотрим процесс создания меню по шагам. Рассматривается фрагмент программы в развитии соответствующий.
Собственно текст меню (предложены 4 условных варианта и 5 - выход из программы с подтверждением):
writeln(' Заголовок меню');
writeln('1. Первый вариант действий');
writeln('2. Второй вариант действий ');
writeln('3. Третий вариант действий’);
writeln('4. Четвёртый вариант действий ');
writeln('5. Выход из программы');
writeln('Ваш выбор:');
readln (choice2);{ввод ответа пользователя
для анализа и выбора действий}
Далее необходимо определить и выполнить вариант вычислений в соответствии с выбором пользователя. Для этого применяется оператор множественного выбора CASE . . . OF и переменная CHOICE2:
Case choice2 of
Begin
{ Реализация первого варианта действий }
{ операторы }
. . .
End;
Begin
{ Реализация второго варианта действий }
{ операторы }
. . .
End;
Begin
{ Реализация третьего варианта действий }
{ операторы }
. . .
End;
Begin
{Реализация четвёртого варианта действий }
{ операторы }
. . .
End;
Begin
writeln ('Вы действительно хотите’,
’ закончить работу? (Y/N)');
Readln (exit_ans);
if exit_ans = 'Y'
then . . . { Реализация выхода }
End;
end; { case }
Пока данный вариант показывает, во-первых, меню в «линейном виде», а нормальное меню работает до отказа пользователя от работы, во-вторых, в нём нет блокировок от некорректных действий пользователя.
Для обеспечения работы меню «в цикле» можно сделать так.
Var
exit_ans : string;
choice2 : integer;
F : boolean;
{Тело главной вызывающей программы}
Begin
F := true; { Флаг управления циклом меню }
while (F = true) do
Begin
writeln(' Заголовок меню');
writeln('1. Первый вариант действий');
writeln('2. Второй вариант действий ');
writeln('3. Третий вариант действий’);
writeln('4. Четвёртый вариант действий ');
writeln('5. Выход из программы');
writeln('Ваш выбор:');
Readln (choice2);
Case choice2 of
Begin
{ Реализация первого варианта действий }
{ операторы }
. . .
End;
Begin
{ Реализация второго варианта действий }
{ операторы }
. . .
End;
Begin
{ Реализация третьего варианта действий }
{ операторы }
. . .
End;
Begin
{Реализация четвёртого варианта действий }
{ операторы }
. . .
End;
Begin
writeln ('Вы действительно хотите’,
’ закончить работу? (Y/N)');
Readln (exit_ans);
if exit_ans = 'Y'
then F:=false;{флаг управления циклом }
End;
end; { case }
end; { While }
writeln ('Спасибо! До свидания!');
Readln;
End.
Защиты по-прежнему нет, символ вместо цифры приведёт к аварийному завершению программы.
Никакой реакции нет на значение ответа вне интервала от 1 до 5 включительно. Эта защита реализуется фрагментом
Else writeln ('Incorrect menu point',choice2);
Поставленным в операторе CASE, перед завершающим его END
. . .
Begin
writeln ('Вы действительно хотите’,
’ закончить работу? (Y/N)');
Readln (exit_ans);
if exit_ans = 'Y'
then F:=false;
End;
Else writeln ('Incorrect menu point',choice);
end; { case }
. . .
Способ блокировки ввода пользователем «нецифры».
Для решения этой задачи пользователь может ввести символ, чтобы избежать контроля типа информации при вводе. Тип данных для переменной ответа – STRING. Но далее происходит принудительная попытка преобразовать символьную информацию (тип данных, в котором вводится значение пункта меню) в цифровую, для чего используется функция VAL(…).
Readln (choice2);
Val (choice2, choice, code);
Если функция
Для контроля ввода рекомендуется применение процедуры
Val (choice2, choice, code);
преобразующей введённую в символьной форме информацию (choice2) в число (choice). Параметр Code показывает результат преобразования: если значение параметра Code = 0, то преобразование прошло успешно, иначе необходимо информировать пользователя об ошибке и заставить повторить ввод. Вариант реализации этой защиты
Repeat
writeln(' Заголовок меню');
writeln('1. Первый вариант действий');
writeln('2. Второй вариант действий ');
writeln('3. Третий вариант действий’);
writeln('4. Четвёртый вариант действий ');
writeln('5. Выход из программы');
writeln('Ваш выбор:');
Readln (choice2);
val (choice2, choice, code);
if (code<>0)
then writeln ('Вы ввели не число! ’,
Choice2,
’ Повторите ввод! ');
until code=0 ;
Case choice of
Begin
. . .
Усложнённое задание Дополнительно сформировать счётчик повторений попыток ввода ( на 3-5 неудачных попыток). Когда заданный лимит попыток будет превзойдён, программа прекращает работу, уведомив пользователя о том, что он исчерпал свои возможности. Заблокировать, не допускать выполнения пунктов обработки информации, если не была введена исходная информация! Использовать «флажок», чтобы знать, введена информация или ещё нет |
PROGRAM Menu;{Окончательный вариант }
Var
exit_ans : string;
choice, code : integer;
F, Fl : boolean;
{Тело главной вызывающей программы}
Begin
F := true; { Флаг управления циклом меню }
while (F = true) do
Begin
Repeat
writeln(' Заголовок меню');
writeln('1. Первый вариант действий');
writeln('2. Второй вариант действий ');
writeln('3. Третий вариант действий’);
writeln('4. Четвёртый вариант действий ');
writeln('5. Выход из программы');
writeln('Ваш выбор:');
Readln (choice2);