Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 153

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 147 148 149 150 151 152 < 153 > 154 155 156 157 158 159 .. 316 >> Следующая

function MyInpMatr (var M : Matrix) : Integer;
Понятно, что здесь параметр SizeM не имеет смысла — значение, которое он получает в результате вполнения процедур , есть результат работ функции. Этот результат является основным, поскольку необходимость его получения специфицирована в заголовке функции. Все другие результат , в частности, определение значений массива, называются побочным эффектом функции.16
Рассматриваемый пример, скорее всего, нетипичен, т. к. отходит от общепринятых и оправданных традиций. очему это так, видно из следуего примера. Какие значения имеют выражения
A[0][0] + MyInpMatr(A)
и
MyInpMatr(A) + A[0][0]
16 Быть может, последний термин и противоречит содержательному представлению о том, что цель функции — ввод матрицы, но в большинстве случаев дисциплинированного программирования результат, специфицированный в заголовке функции, можно и должно считать целью ее работы (основным результатом).
8.5. ПАРАМЕТРИЗАЦИЯ
433
если к моменту их выполнения A[0][0] равно единице, а первое вводимое при работе функции число есть ноль? В большинстве языков и систем программирования, в том числе в С/С++ и Pascal специфицируется совместность вычисления операндов вра ения (см. п. 1.2.2), а значит, порядок, в котором выполнятся MyInpMatr(A) и A[0][0] не определен.
исциплинированнй программист вместо неконтролируемого формальными правилами языка ограничения на использование функции MyInpMatr (запрета выра ений, вроде только что приведенных) определил б для этой цели процедурусо свойством функции MyInpMatr, котораяврабатываетфак-тический размер матрицы в качестве значения специального out-параметра. Здесь требуется именно out-параметр, а не inout, т. к. входное значение параметра для обсуждаемого алгоритма безразлично.
Однако, как уже отмечалось, языки С/С++ и Pascal в определении параметризации ориентиру тся не на потребности, а на механизмы передачи параметров. оэтому приходится вбирать тот механизм, который обеспечивает указанное свойство. Таким механизмом для язка Pascal является вид передачи параметра как переменной:
procedure MyBestInpMatr (var M : Matrix; var SizeM : Index);
Для С/С++ заголовок MyBestInpMatr представляется следующим образом (обратить внимание на описание второго параметра как ссылки):
void MyBestInpMatr (Matrix M,int *Index)
кончательну подпрограмму предлагается составить самостоятельно путем переделки функции MyInpMatr в процедуру. Предлагается встроить в эту процедуру проверку того, что при вводе строк матрицы пользователь задал лишние числа. В таких случаях полезно выводить соответствующее преду-предение.
о-видимому, это лучая из приведенных подпрограмм, реаих задачу ввода матриц с определением их размера. Ее использование для ввода матрицы Matr в языке Pascal имеет вид
MyBestInpMatr (Matr, N);
В С/С++ тот факт, что процедура определяет значение второго параметра, подчеркивается символом &, смысл которого — указать, что используется адрес, а не значение N:
MyBestInpMatr (Matr, &N);
434
ГЛАВА 8. ПОДПРОГРАММЫ
ороо ли то, что логически единообразне действия — присвоить значения переменной-массиву и простой переменной — изображаются по-разному? Скорее всего, это следствие чрезмерной "заботы" о прозрачности (т. е. абсолютной понятности) реализации для программиста.17
ри употреблении данной процедуры невозмо но задать матрицу, не определяя специальной переменной, в которой фиксируется ее размер, подобно тому, как это делалось оператором
MyOwnInpMatr (Matrl, 5);
Вообще говоря, это не недостаток, а достоинство подпрограммы: процедура MyBestInpMatr дисциплинирует работу с данными.
Если развивать заботу о надежности процедуры ввода матриц, то стоит предусмотреть ее один вид контроля: отслеивание того, что происходит при вводе. е отмечалась возмо ность сопрово дать ввод предупредительными сообщениями, но утверждать, что именно это всегда полезно, было бы опрометчиво. При некорректном вводе (попытка ввода недопустимого значения и др.) целесообразно перенести реакци на оибку в используу программу, оставив процедуре лиь передаче сообения об этом в контекст вызова процедуры (анализ того, что произоло, и что мо но предпринять при ошибке, — задача вызывающей программы). Стандартный прием реализации таких сообщений — формирование кода ответа в качестве результата работы процедуры. дно и только одно значение такого кода говорит, что все в порядке; все другие значения указывают на ошибку и ее причину. Пользователь, проверяя код ответа, мо ет запланировать различные действия при разных оибках.
Варианты формирования кода ответа сводятся к следующему:
• выработка возвращаемого значения (тогда процедура MyBestInpMatr снова превращается в функцию);
• присваивание значения специальной переменной из глобального контекста (тогда процедуру MyBestInpMatr вместе с этой переменной целесообразно рассматривать в качестве специального модуля ввода, раз-реаего доступ к этой переменной по чтени );
17 По количеству "медвежьих услуг" на каждую реальную услугу программирование, видимо, находится вне конкуренции во всех областях человеческой практики.
Предыдущая << 1 .. 147 148 149 150 151 152 < 153 > 154 155 156 157 158 159 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100