Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 344

/ вопрос решён /

Здравствуйте, уважаемые эксперты! А то в матрицах не бум бум


Заданы 3 матрицы. A(3,3); B(4,4); C(5,5).Вычислить след какой матрицы больше вычисление следа оформить в виде подпрограммы-процедуры.

ierihon1 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: ierihon1 (статус: 1-ый класс)
Вопрос отправлен: 30 мая 2011, 11:58
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Ну, вот как-то так:

program p5344;
 
{$APPTYPE CONSOLE} { В турбо-паскале убрать эту строку }
 
type
  TSize = 3..5;
  TElements = array[0..4, 0..4] of Integer;
  TMatrix = record
    Elements: TElements;
    Size: TSize;
  end;
 
procedure MakeMatrix(var X: TMatrix; const ASize: TSize);
var
  i, j: Integer;
begin
  X.Size:= ASize;
  for i:= 0 to ASize - 1 do
    for j:= 0 to ASize - 1 do
      X.Elements[i, j]:= Random(20) - 4;
end;
 
procedure PrintMatrix(const X: TMatrix; const Name: string);
var
  i, j: Integer;
begin
  WriteLn(#13#10'  Matrix "', Name, '" (', X.Size, 'x', X.Size, '):');
 
  for i:= 0 to X.Size - 1 do
    begin
      for j:= 0 to X.Size - 1 do
        Write(X.Elements[i, j]: 4);
      WriteLn;
    end;
end;
 
procedure GetTrace(const X: TMatrix; var Trace: Integer);
var
  i: Integer;
begin
  Trace:= 0;
  for i:= 0 to X.Size - 1 do
    Inc(Trace, X.Elements[i, i]);
 
  WriteLn(' ----------------------------> Trace: ', Trace);
end;
 
var
  A, B, C: TMatrix;
  Trace_A, Trace_B, Trace_C, Max: Integer;
  MaxName: Char;
 
{ В программе не учитывается то, что матриц
  с максимальным следом может быть больше одной. }  
 
begin
  Randomize;
 
  MakeMatrix(A, 3);
  PrintMatrix(A, 'A');
  GetTrace(A, Trace_A);
  Max:= Trace_A;
  MaxName:= 'A';
 
  MakeMatrix(B, 4);
  PrintMatrix(B, 'B');
  GetTrace(B, Trace_B);
  if Trace_B > Max
    then begin
           Max:= Trace_B;
           MaxName:= 'B';
         end;
 
  MakeMatrix(C, 5);
  PrintMatrix(C, 'C');
  GetTrace(C, Trace_C);
  if Trace_C > Max
    then begin
           Max:= Trace_C;
           MaxName:= 'C';
         end;
 
  WriteLn(#13#10'  Matrix "', MaxName, '" has maximum trace (', Max, ').');
  ReadLn;
end.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 30 мая 2011, 13:44
Оценка за ответ: 5

Комментарий к оценке: Огромное спасибо)

Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 30 мая 2011, 14:59; участников в обсуждении: 2.

30 мая 2011, 12:35: Вопрос перемещён из тематического раздела Pascal » Программирование на Pascal в раздел Лабораторный практикум » Pascal модератором Ерёмин А.А.

min@y™

min@y™ (статус: Доктор наук), 30 мая 2011, 13:13 [#1]:

Подскажи формулу вычисления следа квадратной матрицы. А то не охота курить википедию.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
ierihon1

ierihon1 (статус: 1-ый класс), 30 мая 2011, 13:25 [#2]:

там идёт сумма чисел по диагонали то есть A[1,1]+A[2,2]+..+A[n,n]
ierihon1

ierihon1 (статус: 1-ый класс), 30 мая 2011, 13:26 [#3]:

program ss;
uses crt;
var a          : array [1..3,1..3] of integer;
    b          : array [1..4,1..4] of integer;
    c          : array [1..5,1..5] of integer;
    n,A1,B1,C1 :                      integer;
procedure ArrayMake(n:integer);
var i,j : integer;
begin
for i := 1 to n do begin
  for j := 1 to n do begin
    a[i,j] := random(3);
    write(a[i,j]:3);
  end;
  writeln;
end;
end;
 
procedure sledA;
var i,j:integer;
begin
A1:=0;
for i := 1 to 3 do begin
  for j := 1 to 3 do begin
    if i=j then
      A1:=A1+a[i,j];
  end;
end;
end;
 
procedure sledB;
var i,j:integer;
begin
B1:=0;
for i := 1 to 4 do begin
  for j := 1 to 4 do begin
    if i=j then
      B1:=B1+b[i,j];
  end;
end;
end;
 
procedure sledC;
var i,j:integer;
begin
C1:=0;
for i := 1 to 5 do begin
  for j := 1 to 5 do begin
    if i=j then
      C1:=C1+c[i,j];
  end;
end;
end;
 
begin
clrscr;
randomize;
ArrayMake(3);
  writeln;
ArrayMake(4);
  writeln;
ArrayMake(5);
  writeln;
sledA;
sledB;
sledC;
writeln(A1:3);
writeln(b1:3);
writeln(c1:3);
readkey;
end.
ierihon1

ierihon1 (статус: 1-ый класс), 30 мая 2011, 13:27 [#4]:

так то вроде всё нормально но почему то вычисляет не правильно и ошибку найти не могу
min@y™

min@y™ (статус: Доктор наук), 30 мая 2011, 13:37 [#5]:

Цитата (ierihon1):

там идёт сумма чисел по диагонали то есть A[1,1]+A[2,2]+..+A[n,n]

Да я уж нагуглил. Ща сделаю.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

30 мая 2011, 14:08: Статус вопроса изменён на решённый (изменил автор вопроса — ierihon1)

ierihon1

ierihon1 (статус: 1-ый класс), 30 мая 2011, 14:09 [#6]:

min@y™: у меня ещё такая посьба: если не трудно не мог бы ты составить к этому блок схему? и к предыдущей тоже..?
min@y™

min@y™ (статус: Доктор наук), 30 мая 2011, 14:17 [#7]:

Цитата (ierihon1):

у меня ещё такая посьба: если не трудно не мог бы ты составить к этому блок схему? и к предыдущей тоже..?

А пиво будет?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
ierihon1

ierihon1 (статус: 1-ый класс), 30 мая 2011, 14:44 [#8]:

по почте только если)
ierihon1

ierihon1 (статус: 1-ый класс), 30 мая 2011, 14:45 [#9]:

ну если ты в кемерово живёшь то без проблем)
min@y™

min@y™ (статус: Доктор наук), 30 мая 2011, 14:59 [#10]:

Цитата (ierihon1):

ну если ты в кемерово живёшь то без проблем)

Я в Рязани живу. Вместо пива могу принять денег на телефон (я так часто делаю).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:31
Выполнено за 0.04 сек.