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.
гостевая; E-mail |