Мои "пять копеек" из далёкого 2018 года. Val() - процедура, а не функция. Она не возвращает никаких значений. Её не получится использовать как x := Val(...)
Поэтому код следовало бы писать так:
Program prov;
var
s,s1:string;
b,x,e:integer;
begin
writeln('Введите строку:');
readln(s);
val(s, x, e);
if e = 0 then
b:=x
else
s1:=s;
end.
Несколько общих замечаний. Во-первых, использование read() не всегда даёт ожидаемый результат. Во-вторых, использование стольких переменных избыточно, ибо если не произошло ошибок в процедуре val(), то в переменной x уже будет искомое число и его можно будет использовать для расчётов, переменная b - не нужна. Равно как и s1. Если была ошибка, переменная e - содержит её код - отличается от нуля. В-третьих, новичкам часто не хватает знаний основ, того, чем именно отличаются процедуры и функции. Посмотрите уже хотя бы это.
следовательно, вызываете процедуру val, передав ей вашу строку, и смотрите на ссылочный параметр Code, возвращаемый процедурой. Если он равен нулю, то делаете что-то там. Если не равен, то делаете другое что-то там. Для полной надежности можете еще отловить переполнение
– DreamChild Oct 29 '13 at 19:16