Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Паскаль] Массивы


Автор: Anyutka 25.12.2009, 20:41
Даны две матрицы А(nxn) и B(nxn), а также два вектора х = (x1, x2,..., xn) и y = (y1, y2, ..., yn). Написать программу нахождения скалярного произведения (Ах)*(Ву).

Автор: neic 26.12.2009, 01:47
Если б кто-нибудь мне объяснил, что такое линейно зависимые, то может быть я бы и сделал.

Автор: darkart 2.1.2010, 21:17
Код

program ScalarMult;

const
  N = 2;{константа - размерность}

type
  TVector = array[ 1..N ] of integer;{тип - вектор}
  TMatrix = array[ 1..N, 1..N ] of integer;{тип - матрица}

procedure InputVector( var vector : TVector );
{процедура ввода вектора}
var
  i : integer;{счетчик}
begin
  for i := 1 to N - 1 do{для каждого элемента вектора, кроме последнего}
    read( vector[ i ] );{читаем очередной элемент}
  readln( vector[ N ] );{читаем последний элемент с переходом на следующую строку}
end;

procedure PrintVector( var vector : TVector );
{процудура печати вектора}
var
  i : integer;{счетчик}
begin
  for i := 1 to N - 1 do{для каждого ээлемента вектора, кроме последнего}
    write( vector[ i ], ' ' );{печатаем очередной элемент и разделитель - пробел}
  writeln( vector[ N ] );{печатаем последний элемент с переходом на новую строку}
end;

procedure InputMatrix( var matrix : TMatrix );
{процедура ввода матрицы}
var
  i, j : integer;{счетчики}
begin
  for i := 1 to N do{для каждой строки матрицы}
  begin
    for j := 1 to N - 1 do{для каждого элемента строки, кроме последнего}
      read( Matrix[ i ][ j ] );{читаем очередной элемент матрицы}
    readln( Matrix[ i ][ N ] );{читаем последний элемент строки с переходом на новую строку}
  end;
end;

procedure PrintMatrix( var matrix : TMatrix );
{процедура печати матрицы}
var
  i, j : integer;{счетчики}
begin
  for i := 1 to N do{для каждой строки матрицы}
  begin
    for j := 1 to N - 1 do{для каждого элемента строки, кроме последнего}
      write( matrix[ i ][ j ], ' ' );{печатаем очередной элемент и разделитель - пробел }
    writeln( matrix[ i ][ N ] );{печатаем последний элемент строки с переходом на новую строку}
  end;
end;

procedure MultiplyMatrixByVector( var resultVector : TVector; matrix : TMatrix; vector : TVector );
{процедура заполняет вектор resultVector результатом произведения матрицы matrix на вектор vector}
var
  i, j : integer;{счетчики}
begin
  for i := 1 to N do{для каждой строки матрицы}
  begin
    resultVector[ i ] := 0;{инициализация очередного компонента вектора}
    for j := 1 to N do{для каждого элемента строки}
      {суммируем с произведением элемента матрицы и компонента вектора}
      resultVector[ i ] := resultVector[ i ] + matrix[ i ][ j ] * vector[ j ];
  end;
end;

function GetScalarProduct( var vectorA, vectorB : TVector ) : integer;
{функция вычисляет скалярное произведение векторов vectorA и vectorB}
var
  i : integer;{счетчик}
begin
  GetScalarProduct := 0;{инициализация результата}
  for i := 1 to N do
    GetScalarProduct := GetScalarProduct +  vectorA[ i ] * vectorB[ i ];{суммируем результат с произведением соответствующих компонентов векторов}
end;

var
  x, y, res : TVector;{x, y - вводимые вектора, res - вспомогательный вектор}
  A, B : TMatrix;{A, B - вводимые матрицы}
begin
  {ввод матриц}
  writeln( 'Рожалуйста введите матрицу A( ', N, ' x ', N, ' ):' );
  InputMatrix( A );
  writeln( 'Рожалуйста введите матрицу B( ', N, ' x ', N, ' ):' );
  InputMatrix( B );

  {ввод векторов}
  writeln( 'Пожалуйста введите вектор x из ', N, ' компонентов : ' );
  InputVector( x );
  writeln( 'Пожалуйста введите вектор y из ', N, ' компонентов : ' );
  InputVector( y );

  {печать исходных данных}
  writeln;
  writeln( 'Исходные данные' );

  writeln( 'Матрица A:' );
  PrintMatrix( A );
  writeln( 'Матрица B:' );
  PrintMatrix( B );
  writeln( 'Вектор x:' );
  PrintVector( x );
  writeln( 'Вектор y:' );
  PrintVector( y );

  {печать промежуточных вычислений - векторов}
  writeln;
  writeln( 'Промежуточные вычисления' );

  MultiplyMatrixByVector( res, A, x );
  x := res;
  writeln( 'Вектор (Ax):' );
  PrintVector( res );
  MultiplyMatrixByVector( res, B, y );
  y := res;
  writeln( 'Вектор (By):' );
  PrintVector( res );

  {печать результата - скалярного произведения}
  writeln;
  writeln( 'Результат' );
  writeln( '(Ax)*(By)=', GetScalarProduct( x, y ) );
  readln;{ожидаем ввода}
end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)