Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Набор квадратных матриц

Автор: Asmodeus 15.12.2006 18:30

Здравствуйте!
Я первокурсник с Мат-Меха (УрГУ). Помогите плиз с задачкой. Буду очень признателен))

Задача:
Дан набор квадратных матриц. Проверить является ли Абелевой группой.

Нужно написать процедуры:
1. Ввод матрицы.
2. Печать матрицы.
3. Сложение каких-то матриц из этого набора.
4. Умножение каких-то матриц из этого набора.
5. Проверка на равенство каких-то двух матриц из набора.
6. Замкунутость относительно сложения.
7. Замкнутость относительно умножения.
8. Является ли Абелевой группой по умножению.
9. Какая-нибудь матрица из набора является единичной или нет.
10. Произведение каких-нибудь двух, равно единичной матрице.

Вот такая большая задача!
Пожалуйста помогите хотя бы с частью процедур (ну 1,2 сам сделал).
Спасибо всем)))


Автор: volvo 15.12.2006 18:35

http://forum.pascal.net.ru/index.php?s=&showtopic=2694&view=findpost&p=38417
Здесь есть еще как минимум 3 пункта твоего задания...

Автор: Asmodeus 15.12.2006 20:47

Извинте, но я не вижу там чего-то похожего с моими заданиями...

Автор: volvo 15.12.2006 21:09

Я не знаю, как ты смотришь, но то сообщение, на которое ведет моя ссылка, содержит процедуры для сложения и перемножения квадратных матриц. Не это ли требовалось тебе по заданию? dry.gif

Автор: Asmodeus 15.12.2006 21:20


wink.gif
Все правильно. Главная прблема вот в чем:
Вот есть две процедуры одна для считывания одной матрицы, другая для вывода считанной матрицы на экран. Но мне нужно чтобы был набор квадратных матриц, т.е. нужно сделать так чтобы при запуске программы вводишь нужное число матриц, затем поэлементно задаешь каждую матрицу матрицу. запоминаешь каждую матрицу и выводишь на экран. Затем проделываются все нужные операции и выводятся результаты.

Автор: volvo 15.12.2006 21:37

А что, массивы матриц уже запретили делать?

type
matrix = array[1 .. size, 1 .. size] of integer;
mxVector = array[1 .. 10] of matrix; { <--- вместо 10 можешь подставить и другое число }


а потом - печать и перебор всех возможных сочетаний матриц из этого массива (можно, в принципе, сделать массив матриц и динамическим, только вот надо ли?)

Автор: Asmodeus 15.12.2006 22:06

Вот начало программы:

Код

Program Matrix;
  const m=2;
  type tm=1..m;
       y=array[tm,tm] of integer;
       mas=array[1..100] of y;



  Procedure ReadMatrix(var n:integer;                      {считывание матрицы}
                       var matrix:y);

    var i,j:integer;

    begin
      write ('Vvedite kol-vo strok & stolbcov matrix-->');
      readln (n);
        for i:=1 to n do
          begin
            for j:=1 to n do
              read (matrix[i,j]);
              writeln;
          end;
    end;


  Procedure WriteMatrix(var n:integer;                       {вывод матрицы на экран}
                        var matrix:y);

    var i,j:integer;

    begin
      writeln ('matrix');
      for i:=1 to n do
        begin
          for j:=1 to n do
            write (matrix[i,j],' ');
            writeln;
        end;
    end;

  
  var n:integer;                 {тестовая программа}
        matrix1:y;

  begin
    ReadMatrix(n,matrix1);
    readln;
    WriteMatrix(n,matrix1);
    readln;
  end.


напишите пожалуйста, как задать набор матриц.





Автор: volvo 15.12.2006 22:58

Ах, вот оно в чем дело... smile.gif Тогда придется работать вот так:

{$R-}

type
pt = ^int_array;
int_array = array[1 .. 1] of integer;

matrix = record
data: pt;
size: integer;
end;

vector = array[1 .. 10] of matrix;

function index(i, j, sz: integer): integer;
begin
index := pred(i) * sz + j;
end;

procedure input(var mx: matrix);
var i, j: integer;
begin
write('size = '); readln(mx.size);
getmem(mx.data, sqr(mx.size) * sizeof(integer));

for i := 1 to mx.size do
for j := 1 to mx.size do begin
write('mx[', i, ', ', j, '] = ');
readln(mx.data^[index(i, j, mx.size)]);
end;

end;

procedure print(const mx: matrix);
var i, j: integer;
begin
with mx do
for i := 1 to size do begin
for j := 1 to size do
write(data^[index(i, j, size)]:4);
writeln;
end;
end;

var
mx_set: vector;
i: integer;

begin
for i := 1 to 5 do
input(mx_set[i]);

for i := 1 to 5 do begin
writeln('matrix #', i);
print(mx_set[i]);
end;

{ ... Дальнейшая работа с матрицами ...
Не забудь освободить память перед завершением работы программы }
end.

Автор: Asmodeus 15.12.2006 23:12

Воо)) жесть!
Спасибо большое!!! Очень помог! Риспект тебе)

Автор: Asmodeus 16.12.2006 18:06

А есть способ написать эту же программу, но без использования записей. И всяких процедур типа getmem, sizeof ?

Автор: volvo 16.12.2006 18:21

Есть, но тогда программа получится гораздо менее читаемой, и будет "пожирать" большие объемы памяти. Смотри сам: у тебя матрицы могут быть разного размера, так? Значит, размер надо где-то хранить. Где? В массиве? Угу, я так и думал. А то, что этот массив НИГДЕ не будет использоваться без связи с массивом матриц, это тебе как? Не мешает? Программа должна быть структурированной, а не хранить размеры здесь, а сами матрицы - там...

Теперь по поводу памяти: моя программа не выделает ни одного байта лишней памяти, ибо ты ввел размерность 3*3 - выделяется место ровно на 9 элементов... Можно (но я ОЧЕНЬ не рекомендовал бы такой подход, никогда не учись СРАЗУ писать "костыли", а то, что я тебе сейчас предложу - именно "костыль") сделать так:

const
max_size = 20; { <--- Вот тебе первое ограничение - макс. порядок матрицы }
type
matrix = array[1 .. max_size, 1 .. max_size] of integer;

{ Здесь - второе ограничение: больше 81 матрицы (при заданном выше max_size)
ты в набор не положишь (размер сегмента данных не позволит) }
vector = array[1 .. 20] of matrix;

procedure input(var mx: matrix; var size: integer);
var i, j: integer;
begin
write('size = '); readln(size);
for i := 1 to size do
for j := 1 to size do begin
write('mx[', i, ', ', j, '] = ');
readln(mx[i, j]);
end;
end;

procedure print(const mx: matrix; size: integer);
var i, j: integer;
begin
for i := 1 to size do begin
for j := 1 to size do
write(mx[i, j]:4);
writeln;
end;
end;

var
mx_set: vector;
sizes: array[1 .. 20] of integer;
i: integer;

begin

for i := 1 to 5 do
input(mx_set[i], sizes[i]);

for i := 1 to 5 do begin
writeln('matrix #', i);
print(mx_set[i], sizes[i]);
end;

end.
А теперь посчитай, сколько памяти ты будешь занимать впустую?