русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Begin ...............


Дата добавления: 2014-11-27; просмотров: 502; Нарушение авторских прав


c:=A[10,10];

d:=Rem(A)[10,10];

 

Переменные A и Rem(A) - это одно и то же поле памяти. Элементы матрицы A расположены в памяти согласно трафарета, определенного именем типа MatrixA, т.е.

 

a[1,1], a[1,2], ... , a[1,29], a[1,30],

a[2,1], a[2,2], ... , a[2,29], a[2,30],

..................................................

a[20,1], a[20,2], ... , a[20,29], a[20,30]

 

Следовательно, элемент имеет порядковый номер 9 × 30 + 10 = 280, его адрес равен A + (280-1)×6 = A + 1674.

 

Расположение в памяти элементов матрицы Rem(A) определено именем типа Rem:

 

Rem(A)[1,1], Rem(A)[1,2], ..., Rem(A)[1,99], Rem(A)[1,100],

Rem(A)[2,1], Rem(A)[2,2], ..., Rem(A)[2,99], Rem(A)[2,100],

..............................................................

Rem(A)[100,1],Rem(A)[100,2],...,Rem(A)[100,99],Rem(A)[100,100]

 

Элемент Rem(A)[10,10] имеет порядковый номер 9 × 100 + 10 = 910, его адрес равен

A + (910-1)*6 = A + 5454.

Следовательно, переменным c и d в примере 2 будут присвоены различные значения.

 

Совпадение значений a[i,j] и Rem(A)[i,j] будет иметь место лишь в том случае, когда пределы изменения индексов фактической и наложенной матриц одни и те же. Естественно, при этих условиях процедура не сможет правильно обрабатывать матрицы разного размера.

Чтобы обеспечить в процедуре обработку матриц разного размера, в теле процедуры на фактическую матрицу накладывается фиктивный одномерный массив. Тогда при переходе от фактического к фиктивному (наложенному) массиву по индексам i, j матрицы вычисляется порядковый номер k одномерного массива, а при обратном переходе - по значению k вычисляются индексы i, j.

 

Пусть фактическая матрица A имеет объявление типа

Matrix = array[1..Mmax,1..Nmax] of real.



Тогда порядковый номер элемента a[i,j]: k = (i - 1) × Nmax + j .

Наоборот, элемент с порядковым номером k имеет индексы

i = (k - 1) div Nmax + 1; j = k - (i - 1) × Nmax.

Пример 3. Разработать процедуру, определяющую значение и местоположение максимального элемента для матриц разного размера.

 

Program MaxElem;

Const MmaxA = 30; NmaxA = 30;

MmaxB = 20; NmaxB = 40;

Type MatrixA = array[1..MmaxA,1..NmaxA] of real;

MatrixB = array[1..MmaxB,1..NmaxB] of real;

RealAr = array[1..(2*MaxInt) div SizeOf(real)] of real;

Var i,j, { параметры цикла }

ma,na,mb,nb, { размеры матриц A и B}

imaxA,jmaxA, { индексы макс.элемента }

imaxB,jmaxB : byte; { для матриц A и B }

Amax,Bmax : real; { значение макс.элемента }

A : MatrixA; B : MatrixB;

FileA,FileB : text;

{ ----------------------------------------------- }

Procedure ReadMatrix(Var F:text; Var C; Nmax:byte; Var m,n:byte);

{ Чтение матрицы из файла }

Var i,j : byte;

k : word;

R : real;

Begin

Reset(F);

Read(F,m,n);

For i:=1 to m do

Forj:=1 to n do

Begin

Read(FileX,R);

k:=(i-1)*Nmax+j; RealAr(C)[k]:=R;

End;

Close(F);

End { ReadMatrix };

{ ----------------------------------------------- }

Procedure MaxMatrix(Var C; Nmax,m,n:byte; VarCmax:real;

Var imax,jmax:byte);

{ Определение значения и местоположения макс.эл-та матрицы }

Var i,j : byte;

k : word;

Begin

Cmax:=RealAr(C)[1]; imax:=1; jmax:=1;

For i:=1 to m do

For j:=1 to n do

Begin

k:=(i-1)*Nmax+j;

If RealAr(C)[k]>Cmax then

Begin

Cmax:=RealAr(C)[k]; imax:=i; jmax:=j;

End;

End;

End { MaxMatrix };

{ ----------------------------------------------- }

Begin

Assign(FileA,'MatrixA.dat');

ReadMatrix(FileA,A,NmaxA,ma,na):

MaxMatrix(A,NmaxA,ma,na,Amax,imaxA,jmaxA);

Writeln('Amax= ',Amax:8:2,' imaxA= ',imaxA,

' jmaxA= ',jmaxA);

Assign(FileB,'MatrixB.dat');

ReadMatrix(FileB,B,NmaxB,mb,nb);

MaxMatrix(B,NmaxB,mb,nb,Bmax,imaxB,jmaxB);

Writeln('Bmax= ',Bmax:8:2,' imaxB= ',imaxB,

' jmaxB= ',jmaxB);

End.

В примере 3 для обработки матриц с разными именами типов применялся аппарат приведения типов. В следующем примере с этой же целью используются абсолютные переменные.

Пример 4. Разработать процедуру, определяющую значение и местоположение максимального элемента среди элементов, расположенных ниже главной диагонали квадратной матрицы.

 

ProgramMaxMatrix;

Const NmaxA = 30; NmaxB = 40;

Type MatrixA = array[1..NmaxA,1..NmaxA] of real;

MatrixB = array[1..NmaxB,1..NmaxB] of real;

RealAr = array[1..(2*MaxInt) div SizeOf(real)] of real;

Vari,j, { параметры цикла }

na,nb, { размеры матриц A и B }

imaxA,jmaxA, { индексы макс.элемента }

imaxB,jmaxB : byte; { для матриц A и B }

Amax,Bmax : real; { значение макс.элемента }

A : MatrixA; B : MatrixB;

FileA,FileB : text;

{ ----------------------------------------------- }

Procedure ReadMatrix(Var F:text; Var C; Nmax:byte;

Var n:byte);

{ Чтение матрицы из файла }

Var i,j : byte;

k : word;

R : real;

D : RealAr absolute C;

Begin

Reset(F); Read(F,n);

For i:=1 ton do

For j:=1 to n do

Begin

Read(F,R);

k:=(i-1)*Nmax+j; d[k]:=R;

End;

Close(F);

End{ ReadMatrix };

{ ----------------------------------------------- }

Procedure MaxElem(VarC; Nmax, n:byte; Var max:real;

Var imax,jmax:byte);

{ Определение значения и местоположения максимального }

{ элемента матрицы ниже главной диагонали }

Var i,j : byte;

D : RealAr absolute C;

Begin

max:=d[Nmax+1]; imax:=2; jmax:=1; { первый элемент }

For i:=3 to n do{ второй строки }

For j:=1 toi-1 do

Begin

k:=(i-1)*Nmax+j;

If d[k]>max then

Begin

max:=d[k]; imax:=i; jmax:=j;

End;

End;

End{ MaxElem };

{ ----------------------------------------------- }

Begin

Assign(FileA,'MatrixA.dat');

ReadMatrix(FileA,A,NmaxA,na):

MaxMatrix(A,NmaxA,na,Amax,imaxA,jmaxA);

Writeln('Amax= ',Amax:8:2,' imaxA= ',imaxA,

' jmaxA= ',jmaxA);

Assign(FileB, 'MatrixB.dat');

ReadMatrix(FileB,B,NmaxB,nb):

MaxMatrix(B,NmaxB,nb,Bmax,imaxB,jmaxB);

Writeln('Bmax= ',Bmax:8:2,' imaxB= ',imaxB,

' jmaxB= ',jmaxB);

End.

 



<== предыдущая лекция | следующая лекция ==>
Begin ................ | О П Е Р А Т О Р В А Р И А Н Т А (О П Е Р А Т О Р В Ы Б О Р А)


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.01 сек.