Pers.narod.ru. Алгоритмы. Открытый массив на Паскале и проверка правильности ввода |
Одно из больших неудобств Паскаля - чрезмерная типизированность. Например, я не могу просто так указать массив формальным параметром подпрограммы, сначала следует описать его как новый тип данных:
const size=10; {максимальная из нужных в задаче размерностей}
var vector = array [1..size] of real;
а затем уже привести в заголовке функции или процедуры:
function vmax (var v:vector, n:integer):real;
При этом, если подпрограмму нужно вызывать для векторов различных размерностей, их всё равно следует описать как
var a,b:vector;
и все они займут по size*(размер типа) байт, расточительно расходуя оперативную память. К тому же, этот самый type нарушает правило переносимости подпрограмм, делая их действие зависимым от внешнего оператора.
Открытые массивы позволяют решить часть этих проблем, правда, они непосредственно применимы лишь к одномерным массивам-векторам (см. п. 18.4 в этой главе).
Пример ниже показывает ввод и вывод одномерного статического открытого массива со всеми нужными проверками корректности.
Функция getNumber позволяет орагнизовать ввод целого числа с проверкой допустимости ввода и, возможно, ограничением диапазона допустимых значений переменной. Если последнее ограничение не нужно, достаточно передать параметры min и max одинаковыми, скажем, равными нулю.
Функция getArray организует ввод допустимой размерности массива, а затем его элементов. К каждому элементу печатается приглашение, делается контроль допустимости ввода.
Наконец, putArray печатает массив с нужным сопроводительным текстом.
{вводим число и массив (пример для целого типа)}
function getNumber (s:string; min,max:integer):integer;
var a:integer;
begin
repeat
writeln;
write (s);
if min<max then write (' (от ',min,' до ',max,'): ')
else write (': ');
{$I-}readln (a);{$I+}
if IoResult<>0 then begin
write ('Не введено число!'); continue;
end;
if (min<max) and ((a<min) or (a>max)) then begin
write ('Введено недопустимое число'); continue;
end;
break;
until false;
getNumber:=a;
end;
function getArray (s:string; max:integer; var a:array of integer):integer;
var i,n:integer; tmp:String[4];
begin
writeln (s);
n:=getNumber('Введите размер массива',1,max);
for i:=Low(a) to Low(a)+n-1 do begin
str (i+1,tmp);
a[i]:=getNumber('Элемент '+tmp,0,0);
end;
getArray:=n;
end;
procedure putArray (s:string; n:integer; var a:array of integer);
var i:integer;
begin
writeln (s);
for i:=Low(a) to Low(a)+n-1 do begin
write (a[i]:6);
if i=High(a) then break;
end;
end;
var x:array [1..10] of integer;
begin
putArray ('Вывод массива',getArray ('Массив X',10,x),x);
reset (input); readln;
end.
|
|