Pascal задача на двумерные массивы

Тема в разделе "Другие языки", создана пользователем excel, 7 ноя 2013.

Модераторы: Цукер
  1. excel

    excel Постоялец

    Регистр.:
    13 май 2013
    Сообщения:
    146
    Симпатии:
    17
    Помогите пожалуйста со следующей задачей по паскалю:

    Пользователем вводятся матрицы A, B и C. Нужно посчитать матрицу D=A*A-B*C

    По сути, программу я написал, но немного неправильно. Дело в том, что неправильно умножаю матрицу на матрицу. Матрица B*C умножается нормально, а вот A на A не хочет. Вроде как надо написать процедуру умножения матрицы на матрицу, но вот никак не пойму как это сделать. Надеюсь на вашу помощь, код ниже:

    PHP:
    program Project2;

    {
    $APPTYPE CONSOLE}

    uses
      SysUtils
    ;

    const 
    nmax=5;
    type tmas=array[1..nmax,1..nmax]of real;
    var 
    f,e,a,b,c,d:tmas;
        
    n,i,j,k:integer;
        
    q,r,s,pr:real;//opisanie globalnoi peremennobegin
    procedure vvod(m:integer;var a:tmas);
    begin
    for i:=1 to n do
      
    begin
       
    for j:=1 to n do
        
    begin
         write
    ('a[',i,'][',j,']=');
         
    readln(a[i,j]);
        
    end;
      
    end;
    end;  // vvod
    procedure vivod(m:integera:tmas);
    begin
      
    for i:=1 to n do
       
    begin
        
    for j:=1 to n do write(a[i,j]:8:2);
        
    writeln;
       
    end;
    end//vivod
    begin
      writeln
    ('razmer matrica');
      
    readln(n);
      
    writeln('Vvod matrica A');
      
    vvod(n,a);
      
    writeln('vvod matrica B');
      
    vvod(n,b);
      
    writeln('vvod matrica C');
      
    vvod(n,c);
      
    writeln('matrica A');
      
    vivod(n,a);
      
    writeln('matrica B');
      
    vivod(n,b);
      
    writeln('matrica C');
      
    vivod(n,c);
      
    begin
      
    for i:=1 to n do
      for 
    j:=1 to n do
         
    begin
         q
    :=a[i,j]*a[i,j];
         
    f[i,j]:=q;
         
    r:=b[i,j]*c[i,j];
         
    e[i,j]:=r;
         
    end;
      
    end;
      
    writeln('poluchennoe slozheni matric A*A = F');
      
    vivod(n,f);
      
    writeln('poluchennoe slozheni matric B*C = E');
      
    vivod(n,e);
      for 
    i:=1 to n do
      for 
    j:=1 to n do
       
    begin
        s
    :=0;
        for 
    k:=1 to n do
        
    s:=s+f[i,k]-e[k,j];
        
    d[i,j]:=s;
       
    end;
      
    writeln('proizvedenie matric D=F-E');
      
    vivod(n,d);
      
    readln;

    end.

     
  2. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    360
    Симпатии:
    243
    Код:
    q:=a[i,j]*a[i,j];
    там сумма произведений должна быть.. числа по строке умножаются на числа по столбцу.. и складывается всё это дело.
     
  3. excel

    excel Постоялец

    Регистр.:
    13 май 2013
    Сообщения:
    146
    Симпатии:
    17
    А как процедуркой сделать то это?
     
  4. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    360
    Симпатии:
    243
     
    Последнее редактирование: 7 ноя 2013
    excel нравится это.
  5. excel

    excel Постоялец

    Регистр.:
    13 май 2013
    Сообщения:
    146
    Симпатии:
    17
    ладно, разберусь, спасибо
     
  6. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    360
    Симпатии:
    243
    А чего разбираться-то? по второй ссылке первый результат... задача 1-в-1.. и ещё один клик до готового решения (код целиком)

    Ключевое отличие - считать сумму:
    Код:
      S:=0;
      for k:=1 to y do
      S:=S+a[i,k]*b[k,j];
     
  7. excel

    excel Постоялец

    Регистр.:
    13 май 2013
    Сообщения:
    146
    Симпатии:
    17
    ну я и говорю спасибо за помощь
     
  8. temptemp2015

    temptemp2015 Создатель

    Регистр.:
    5 мар 2014
    Сообщения:
    11
    Симпатии:
    1
    Процедуркой делать не надо. У тебя в цикле идёт перемножение используются регистры, а если через процедурку, то надо каждый раз кучу параметров передавать и юзать ОЗУ.