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.

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz