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

 

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

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

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

Таким образом, в языке Pascal для процедуры MyOwnlnpMatr целесообразно определить параметр, имеющий тип Index и передающий размер матрицы алгоритму из глобального контекста. В С/С++ приходится иметь дело с целочисленным типом. С иллстративными целями предполагается, что процедура предназначена для ввода различных матриц. ля обеспечения этой возможности необходимо модифицировать глобальный контекст: внести в него описания типов, откорректировать описание массива Matr и добавить описание ее одного массива, значения элементов которого мо но вводить с помощью MyOwnlnpMatr. В результате описание глобального контекста принимает вид: #include <stdio.h> #include <stdlib.h> const NN = 100; typedef float Matrix[NN][NN]; Matrix Matr, Matr1; int N;
ля паскалевского варианта программы ну ны следуие описания:
const NN = 100; type Index = 1..NN;
Matrix = array [ Index, Index ] of Real; var N : lnteger;
Matr, Matr1 : Matrix;
С учетом проведенного обсуждения С-вариант процедуры MyOwnInpMatr описывается следующим образом:
Программа 8.5.1
void MyOwnInpMatr( Matrix M, int SizeM ) {
int i, j;
printf("Enter matrix data:\n"); for(i = 0; i < N; i++) {
printf("Row %3i:",i); for(j = 0; j < N; j++)
430
8.
scanf("%f",& M[i][j]); printf("\n"); }
}
роцедура MyOwnInpMatr мо ет бть использована, к примеру, для такого задания матриц, описаннх в глобальном контексте:
N = 10;
MyOwnInpMatr (Matr, N); MyOwnInpMatr (Matrl, 5);
ри условии корректности ввода в результате выполнения этих операторов переменная N получит значение размера матрицы Matr по измерениям, в массиве Matr будет заполнен левый верхний угол размера 10 на 10, а в массиве Matrl — угол размера 5 на 5 (для Matrl переменная, фиксирующая размер матрицы, не предусмотрена). Это логический взгляд на структуру данных.
а уровне модели вычислений языка С/С++ все вглядит несколько иначе. Никаких "верхних углов" матрицы не существует. Вместо матрицы рассматривается вектор указателей (например, Matr[i] для каждого i), ссылающихся на векторы вещественных значений. Именно этого требует стандарт языка, и не случайно, что выра ение
M[i][j]
является эквивалентным следуему фрагменту, явно отрааему оперирование с указателями:
*(*(M+i)+j)
ледует отметить, что в язке Pascal логический взгляд на обсу даему структуру данных вполне правомерно представлять себе и как реализационный, мо но да е не задумваться над представлением матриц в памяти (разумеется, квалифицированнй программист это всегда знает, а потому использует, и именно этим обстоятельством обычно аргументируют адепты языка С отход от традиций абстрактного рассмотрения представлений структур даннх).
В языке Pascal заголовок процедуры MyOwnInpMatr может быть представлен следуим образом:
procedure MyOwnInpMatr (var M : Matrix; SizeM : Index);
8.5. ПАРАМЕТРИЗАЦИЯ
431
Здесь явно обозначены различные механизмы, использованные для первого и второго параметров. Это становится возможным из-за того, что описание массива в языке Pascal не привязывается к реализации доступа к его элементам, имя переменной типа массив действительно обозначает совокупность 'переменных с индексами', и не требуется прибегать к понятию памяти для уточнения семантики даннх понятий. В результате в языке Pascal Matr и Matr1 обозначают значения массивов, тогда как в С/С++/С# — адреса памяти для размещения значений. Именно поэтому внешне схожие изображения двух указанных формальных параметров в С/С++/С# на логическом уровне рассмотрения приводят к двум разным механизмам параметризации. В действительности здесь нет противоречий, поскольку первый аргумент функции передается по значению (именно так, как и второй аргумент), но передаваемое значение есть ссылка в данном случае на массив и все оказывается в точности так, как в Pascal.
ное дело, что Pascal предлагает возмо ность передачи параметра-массива как значения. Сделать это очень просто: удалить var из заголовка. Hо к чему это приведет? Как уже отмечалось, параметр-значение приводит к образованию локальной переменной, инициированной фактическим параметром. рименительно к массивам оказывается, что копируется весь массив, что чае всего само по себе нерационально. о, кроме того, лбе модификации параметра не приведут к изменени фактического массива. , если это применить к обсуждаемым алгоритмам, становится понятным, что переменные Matr и Matr1 своих (незаданных!) значений не изменят!
Все, сказанное выше по поводу процедуры MyOwnInpMatr, с точностью до различий в алгоритмах применимо и к функции MyInpMatr. Поэтому новый текст подпрограммы не требует подробного обсу дения:
Программа 8.5.2
int MyInpMatr ( Matrix M )
{
int SizeM = 0;
char c; // Переменная используется для
// определения окончания // ввода первой строки матрицы
printf("Enter matrix data:\n");
432
8.
printf("Row 0:"); do
scanf("%f%c",&Matr[0][SizeM++],&c); while (c!='\n'); for(i=1; i < SizeM; i++) {
printf("Row %2i:",i); for(j=0; j < N; j++) scanf("°/of",& Matr
do
scanf("%c",&c); while(c!='\n');
}
return SizeM;
}
ля полноты картин ни е представлен заголовок функции MyInpMatr на языке Pascal:
Предыдущая << 1 .. 146 147 148 149 150 151 < 152 > 153 154 155 156 157 158 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100