Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 20.07.2014
Сообщений: 23

Умножение матриц

06.10.2014, 08:20. Показов 1438. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят, помогите, не пойму, что не так.. занимаюсь по книге Вирта.
такой вот код..
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
program matrixmul (input, output);
const m = 4; p = 3; n = 2;
var i : 1..m; j : 1..n; k : 1..p;
s : integer;
a : array [1..m, 1..p] of integer;
b : array [1..p, 1..n] of integer;
c : array [1..m, 1..n] of integer;
begin {ЇаЁбў*Ёў**ЁҐ **з*«м*ле §**зҐ*Ё© a & b}
      for i:=1 to m do
          begin read (s); write(s); a[i,k] :=s
          end;
          writeln
      end.
      writeln;
      for k:=1 to p do
      begin for j := 1 to n do
            begin read(s); write(s); b[k,j] :=s
            end;
            writeln
      end;
      writeln;
      {г¬*®¦Ґ*ЁҐ a*b}
      for i:=1 to m do
      begin for j:=1 to n do
            begin s:=0,
                  for k:=1 to p do s := s + a[i,k] * b[k,j];
                  c[i,j]:=s; write(s)
            end;
            writeln
      end;
      writeln
end.
компилируется и запускается, но вот что дальше.. ?
если ввожу какие-то цифры, выдает ошибку проверки диапазона, а чо это такое не понимаю..

ещё в книге во второй строке n := 2; а ТП просит изменить на знак равенства, почему? и в 13 строке попросил ; изменить на точку. это нормально?
спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.10.2014, 08:20
Ответы с готовыми решениями:

Транспонирование, умножение матриц, сложение матриц Реализовать в одной программере
транспонирование, умножение матриц, сложение матриц; B^3-A^T Реализовать в одной программере. Помогите решить

Умножение матриц
Умножение двумерных матриц, размерность матриц 4х3 и 3х4. Хелпаните плз,всех благ.

Умножение матриц
даны пять массивов А(4,4), B(4,4), C (4,4), D(4,4), F(4,4). найти произведение массивов. определение произведения двух массивов оформить в...

5
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
06.10.2014, 10:18
Лучший ответ Сообщение было отмечено iCoval как решение

Решение

Ваша программа закончилась точкой в 13 строке. Остального текста для компилятора не существует.
Компилятор указал на необходимость точки, поскольку end в этой строке соответствует begin начала программы. Либо этот end завершает программу, о чем сообщает компилятор, либо где-то выше пропущен begin (в конце строки 9), о чем компилятору никак не догадаться.

В строке 2 использован оператор const, константы задаются через знак равно, а не через оператор присваивания, таков синтаксис.

Добавлено через 4 минуты
PS. На самом деле, между 9 и 10 строкой пропущено
begin for k:=1 to p do

Добавлено через 2 минуты
PPS. В 10-й строке пытаетесь выполнить присваивание a[1,0]:=s; получаете ошибку, второй индекс массива (0) вне объявленного для этого массива диапазона 1..p.

Добавлено через 1 час 43 минуты
В качестве примера равноценного кода:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
const
  m=4; p=3; n=2; W=6;
var
  i: 1..m; j: 1..n; k: 1..p;
  a: array [1..m, 1..p] of integer;
  b: array [1..p, 1..n] of integer;
  c: array [1..m, 1..n] of integer;
begin
  WriteLn('Введите матрицу A[',m,'x',p,']:');
  for i:=1 to m do for k:=1 to p do read(a[i,k]);
  WriteLn('Введите матрицу B[',p,'x',n,']:');
  for k:=1 to p do for j:=1 to n do Read(b[k,j]);
  WriteLn('A=');
  for i:=1 to m do begin
    for k:=1 to p do Write(a[i,k]:W);
    WriteLn;
  end;
  WriteLn('B=');
  for k:=1 to p do begin
    for j:=1 to n do Write(b[k,j]:W);
    WriteLn;
  end;
  WriteLn('A*B=');
  for i:=1 to m do
    for j:=1 to n do begin
      c[i,j]:=0;
      for k:=1 to p do begin
        c[i,j]:=c[i,j]+a[i,k]*b[k,j];
        Write(c[i,j]:W);
      end;
      WriteLn;
    end;
end.
1
0 / 0 / 0
Регистрация: 20.07.2014
Сообщений: 23
06.10.2014, 10:53  [ТС]
вообщем, неточности перевода, как обычно..
класс, мне бы так понимать, как вы. отличный ответ, буду разбираться..
поставил begin for k:... и перестал требовать сменить ; на . но я не понимаю, работает код или нет.. в консоли ввожу цифры, нажимаю Enter и ничего, появляются введенные цифры. как это?
спасибо за альтернативу!
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
06.10.2014, 12:03
Лучший ответ Сообщение было отмечено iCoval как решение

Решение

iCoval,
прежде всего нужно понять, что именно должно происходить.

Возьмем исходный пример, исправив в нём ошибки (и немного переформатировав):
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
program matrixmul(input, output);
const
  m = 4; p = 3; n = 2;
var
  i: 1..m; j: 1..n; k: 1..p;
  s: integer;
  a: array [1..m, 1..p] of integer;
  b: array [1..p, 1..n] of integer;
  c: array [1..m, 1..n] of integer;
begin
  { присваивание начальных значений a & b }
  for i:=1 to m do begin
    for k:=1 to p do begin
      Read(s); Write(' ',s); a[i,k]:=s;
    end;
    WriteLn;
  end;
  WriteLn;
  for k:=1 to p do begin
    for j := 1 to n do begin
      Read(s); Write(' ',s); b[k,j]:=s;
    end;
    WriteLn;
  end;
  WriteLn;
  { вычисление a*b }
  for i:=1 to m do begin
    for j:=1 to n do begin
      s:=0;
      for k:=1 to p do s:=s+a[i,k]*b[k,j];
      c[i,j]:=s; Write(' ',s);
    end;
    WriteLn;
  end;
  WriteLn;
end.
Далее нумерацию строк даю по примеру из этого сообщения.
12-18: ввод 12 (m*p) значений, составляющих матрицу A, с одновременным их выводом;
19-25: ввод 6 (p*n) значений, составляющих матрицу B, с одновременным их выводом;
27-35: вычисление матрицы C из 8 (m*n) значений с одновременным выводом ее.

Если ввод и вывод производится с консоли, на экране возможна мешанина. Однако, если использовать перенаправление ввода и/или вывода, либо подать на ввод сразу все значения в самом начале, код вывода во время ввода более-менее обретает смысл. Например, пусть матрицы A и B следующие:
Code
1
2
3
4
5
6
7
8
1 0 0
0 1 0
0 0 1
0 0 0
 
1 2
3 4
5 6
Тогда протокол работы программы мог бы быть таким:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1 0 0 0 1 0 0 0 1 0 0 0 1 2 3 4 5 6
 1 0 0
 0 1 0
 0 0 1
 0 0 0
 
 1 2
 3 4
 5 6
 
 1 2
 3 4
 5 6
 0 0
1
0 / 0 / 0
Регистрация: 20.07.2014
Сообщений: 23
06.10.2014, 21:33  [ТС]
bormant, спасибо, более менее понятно.. только непонятно, в каком месте я задаю компьютеру параметры своего ввода чисел, именно сколько я рядов буду вводить первой матрицы, сколько второй? и ещё, получается, что математику знать необязательно, всю математику выполняет компьютер, надо только знать синтаксис и язык и элементарную компьютерную логику или я не знаю, о чем говорю?
спасибо за четкие пояснения..

а,
Pascal
1
2
3
4
5
6
7
begin
  { присваивание начальных значений a & b }
  for i:=1 to m do begin
    for k:=1 to p do begin
      Read(s); Write(' ',s); a[i,k]:=s;
    end;
    WriteLn;
вот тут задаю? и если бы я хотел задать например вторую матрицу с двумя рядами, я должен был бы записать
Pascal
1
2
3
4
5
for i:=1 to m do begin
   for j:=1 to n do begin
     Read(s); Write(' ',s); a(i,j):=s;
   end;
    WriteLn;
так чтоли?
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
07.10.2014, 02:27
В конкретно этом примере количество строк первый матрицы (и количество строк матрицы результата, увы, чтобы это понять математику все же нужно знать в объеме матричного исчисления) задано константой m, количество столбцов матрицы множителя (и количество столбцов матрицы результата по уже названной выше причине) задано константой n. Количество столбцов первого множителя и строк второго множитя задано константой p.

Вы можете менять значения m, n, p, но изменить их роль в произведении матриц вам не позволит знание правил матричных операций, увы.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.10.2014, 02:27
Помогаю со студенческими работами здесь

Умножение матриц
Добрый вечер. Имеется вот такая лабораторная работа (прикрепил) Никак не могу разобраться с четвертой задачей, где требуется...

Умножение матриц
я эту тему не знаю так как лежал в больнице а завтра зачет помогите пжлст!!!!!! Тема: Умножение матриц Цель: Приобретение...

Умножение матриц.
Добрый день товарищи!!! Помогите написать такую програмку. Умножение матриц. Нужно: 1. Чтобы числа вводились пользователем с...

Умножение матриц
покажите пожалуста как показывать умножение двух матриц=) нам этого не давали, но всеравно надо, у студента с другого факультета был на...

Умножение матриц.
Собственно задача следующего порядка: uses crt; const nmax=5; var x,i,j,k:integer; matr2,matr,rez: array of real; begin ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru