Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2017, 22:08   #1
Teka377
Новичок
Джуниор
 
Регистрация: 18.12.2017
Сообщений: 3
По умолчанию найдите ошибку в действиях над матрицами в паскале

Нужно чтобы программа в паскале выполняла умножение двух матриц, их сложение и умножение первой на число, при этом процедура должна выбираться через case. Может ли кто помочь дописать её или подсказать, как доделать?

Код:
program matrix;
uses crt;
const Max=50;
var AA,BB,CC:array[1..Max,1..Max] of Double;
  z,p,ii,jj,kk,nn,mm,ll:integer;
    Summa: double;
begin
    writeln('Stroki 1 matrix');readln(NN);
    writeln('Stolbci 1 matrix');readln(KK);
    Writeln('Stolbci 2 matrix');Readln(MM);
    for ii:=1 to nn do
    for jj:=1 to kk do
     begin
     write('Vvedite A[',ii,',',jj,']');
      readln(AA[ii,jj]);
      end;
      writeln('Vvedite 2-u stroku (B):');
      for ii:=1 to nn do
      for jj:=1 to mm  do
          begin write('Vvedite B[',ii,',',jj,']');
          readln(BB[ii,jj]);
          end;
          begin
          writeln('Spisok procedur');
          writeln('1 - Umnoghenie matrix ');
          writeln('2 - Umnoghenie na chislo ');
          writeln('3 - Sloghenie matrix ');
          writeln('Viberite proceduru:');
          p:=0;
          writeln(p);
          readln(p);
                     if p=1 then
                     begin
                       writeln('Umnoghenie matrix ');
          begin
          for ii:=1 to nn do
          for jj:=1 to mm do
           begin
           Summa:=0;
           for ll:=1 to kk do

           Summa:=Summa + AA[ii,jj]*BB[ll,jj];
           CC[ii,jj]:=Summa;
           end;
           {Vivod proizvedeniyaM}writeln('rezultat---->');
           for ii:=1 to nn do
           begin
           for jj:=1to mm do
           write(CC[ii,jj]:8:1);
           writeln;
           end;

            end;
             if p=2 then
             begin
            writeln('Vvedite mnojitel: '); readln(z);
             end;
        begin
             for ii:=1 to nn do
             for jj:=1 to kk do
             AA[ii,jj]:= AA[ii,jj]*z;
        end;
           {Vivod proizvedeniyaZ}writeln('rezultat---->');
            for ii:=1 to nn do
            begin
            for jj:=1 to mm do
            write(AA[ii,jj]:8:1);
            writeln;
            end;
                     if p=3 then
                     begin
           writeln('Sloghenie Matrix');
           for ii:=1 to nn do
           for jj:=1 to mm do
           begin
           for jj:=1 to kk do
           CC[ii,jj]:=AA[ii,jj]+BB[ii,jj];
           {Vivod summi}writeln('rezultat---->');
           for ii:=1 to nn do
           begin
           for jj:=1 to mm do
           write(CC[ii,jj]:8:1);
           writeln;
           end;
           end;
           end;
           repeat until keypressed;
           end;
           end;
           end.
Вложения
Тип файла: docx Лабораторная работа 6.docx (13.4 Кб, 11 просмотров)

Последний раз редактировалось Аватар; 19.12.2017 в 11:52.
Teka377 вне форума Ответить с цитированием
Старый 19.12.2017, 10:58   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

может все-таки скажете, что именно у вас не получается? (лишний вывод (неправильный расчет) и когда(в каком режиме)? нет алгоритма расчета(какого)?
исправить пару строк(только если известно что искать) легко.

или же предложите сделать всю работу полностью и не бесплатно.
гораздо проще написать свою программу, чем разбираться непонятно в чем.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 19.12.2017, 11:47   #3
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Код:
Summa:=Summa + AA[ii,jj]*BB[ll,jj];
неверно. Умножение матриц: строка первой на столбцы второй с суммированием произведений соответствующих элементов в пределах цикла по столбцам. То есть должно получиться: AA[1, 1] * BB[1, 1] + AA[1, 2] * BB[2, 1] + AA[1, 3] * BB[3, 1] ...

У Вас же здесь получается: AA[1, 1] * BB[1, 1] + AA[1, 1] * BB[2, 1] + AA[1, 1] * BB[3, 1] ...

Код:
for jj:=1 to mm do
begin
for jj:=1 to kk do
Тут вообще один цикл лишний
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 19.12.2017, 13:30   #4
Teka377
Новичок
Джуниор
 
Регистрация: 18.12.2017
Сообщений: 3
По умолчанию

Дело в том, что умножение выполняло правильно, а вот все остальное увы
Teka377 вне форума Ответить с цитированием
Старый 19.12.2017, 13:33   #5
Teka377
Новичок
Джуниор
 
Регистрация: 18.12.2017
Сообщений: 3
По умолчанию

Я не мог написать выбор процедур через case, у меня либо писало только умножение, либо несколько сразу процедур, либо вообще не запускалась
Teka377 вне форума Ответить с цитированием
Старый 19.12.2017, 14:04   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Код:
             if p=2 then //умножение на скаляр
             begin // НАЧАЛО блока 
            writeln('Vvedite mnojitel: '); readln(z);
             end;// и КОНЕЦ этого блока
а где же сами действия?
да, я вижу они описаны дальше, а ДОЛЖНЫ быть где?

вас не учили писать(использовать) процедуры?!
Код:
program matrix;
uses crt;

const Max=50;
type matr =array[1..Max,1..Max] of Double;

procedure vvod(const mname: string; var X: matr);
procedure vyvod(const rname: string; X: matr);
procedure slogit(A,B: matr; var R: matr);
procedure umnogit(A,B: matr; var R: matr);
procedure umn_skalar(A:matr; s: integer; var R: matr);
...
var AA,BB,CC: matr;
Цитата:
Я не мог написать выбор процедур через case
Код:
readln(p)
case p of
1: begin
      vvod('первая матрица:',AA);
      vvod('вторая матрица',BB);
      slogit(AA,BB, CC);
      vyvod('сложение',CC);
   end;
2: begin
      vvod...
       ...
      vyvod...
    end;
3: ......

else writeln('неверно указан режим')
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Операции над матрицами. Alex4844 Помощь студентам 0 03.11.2015 17:38
действия над матрицами (Delphi) STALKER1993 Помощь студентам 1 26.06.2012 12:42
Калькулятор над матрицами Олеся_92 Паскаль, Turbo Pascal, PascalABC.NET 2 16.05.2010 20:54
Графический калькулятор над матрицами Олеся_92 Помощь студентам 2 04.05.2010 18:10
Действия над матрицами. (Delphi) ekzobyte Помощь студентам 1 20.05.2009 20:52