Процедура Val

 

Procedure Val(S; var V; var Code: Integer);

Преобразовывает символьное представление числа S в целое или вещественное число V. Code – код ошибки, возникающей при переводе строки в число. Если все хорошо, то Code=0.

 

Пример использования:

“Безопасный” ввод данных.

При вводе информации с клавиатуры или из файла при помощи процедур read/readln возможно возникновение ошибки времени выполнения программы (runtime error) в результате которой выполнение программы прерывается. Ошибка возникает в том случае, когда обнаруживается несоответствие между типом переменной, указанной в read/readln, и той строкой, которую этот read/readln получил для обработки.

Например, если x – переменная целого типа, в программе она читается таким образом: read(x), а пользователь вводит строку “два”, то программа завершит свою работу, выведя сообщение “Invalid numeric format” - “неподходящий формат числа”.

Это происходит потому, что контроль ошибок выполняет сам Turbo Pascal. В простых задачах это удобно, но в более или менее серьезных задачах такое решение недопустимо. В реальных задачах все ошибки пользователя должны обрабатываться самой программой. Средства, обеспечивающие контроль правильности ввода, называются “защитой от дурака”. Существует несколько способов реализации этой защиты. Один из них состоит в следующем: весь ввод пользователя ВСЕГДА читается в виде строк (или кодов отдельных клавиш). Затем введенные строки анализируются. Если введена правильная строка, то программа идет дальше, если нет, то выдается сообщение об ошибке, и данные требуют ввести повторно.

 

{Процедура "безопасного" ввода целого числа X

Msg - выводимая строка-подсказка

[ minVal .. maxVal ] - допустимый интервал значения X }

procedure ReadInt(msg: string; var x: integer;

minVal, maxVal: integer);

var

s: string; {Вводимая строка}

errCode: integer; {Код ошибки}

isError: boolean; {Флаг ошибки}

begin

repeat

write(msg); {Вывод приглашения}

readln(s); {Чтение строки, ВВЕДЕННОЙ ПОЛЬЗОВАТЕЛЕМ}

val(s,x,errCode); {Попытка получить целое число из строки}

 

{Ошибка есть, если код ошибки не 0, или если код ошибки 0,

но введенное число лежит вне допустимого интервала}

isError := (ErrCode<>0) or

(ErrCode=0) and ( (x<=minVal) or (x>=maxVal) );

{Если есть ошибка, то вывести сообщение об ошибке}

if isError then writeln('Error! Please repeat input!');

until not isError; {Если нет ошибки, то выходим из цикла,

а если ошибка есть, то снова вводим число}

end;

 

 

{Функция перевода целого числа X в строку

возвращается строка}

function IntToStr(x: integer): string;

var

s: string;

begin

Str(x, s);

IntToStr := s;

end;

 

{Демонстрация “безопасного” ввода

на примере ввода одномерного массива}

var

a: array[1..10] of integer; {Массив}

n: integer; {Количество элементов в массиве}

i: integer; {Счетчик}

begin

{Безопасный ввод N}

ReadInt('Введите n=', n, 1, 10);

{Безопасный ввод элементов массива}

for i:=1 to n do

ReadInt('Введите a[' + IntToStr(i) + ']=',a[i],10,99);

 

{Вывод элементов для контроля}

for i:=1 to n do

write(a[i],' ');

writeln;

end.