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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2012, 23:01   #21
Начинающий програм
Форумчанин
 
Аватар для Начинающий програм
 
Регистрация: 22.11.2011
Сообщений: 201
По умолчанию

А если у меня массив не динамический, это плохо? Или можно таким как у меня обойтись?
Начинающий програм вне форума Ответить с цитированием
Старый 16.11.2012, 23:11   #22
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не понял...
Что имеется ввиду? Можешь пояснить подробнее?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.11.2012, 23:34   #23
Начинающий програм
Форумчанин
 
Аватар для Начинающий програм
 
Регистрация: 22.11.2011
Сообщений: 201
По умолчанию

Уже ответ на мой предыдущий вопрос не нужен. Программа частично работает, только 3(а точнее 1, 2, 7.) пункта из 7. Помогите пожалуйста найти причину, вот в это процедуре точно ошибка, как тут исправить.
Код:
procedure TMatrix.Prz;
  var
    t,i,j:integer;
  begin
    for i:=1 to n do
        for j:=1 to mb do
            for t:=1 to m do
              fmatr[i,j]:=fmatr[i,j]+fmatr[i,t]*fmatr[t,j];  //как тут правильно заменить?

    um:=m;
    un:=n
  end;

Последний раз редактировалось Начинающий програм; 16.11.2012 в 23:37.
Начинающий програм вне форума Ответить с цитированием
Старый 17.11.2012, 00:17   #24
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я не силен в произведениях матриц.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.11.2012, 00:23   #25
Начинающий програм
Форумчанин
 
Аватар для Начинающий програм
 
Регистрация: 22.11.2011
Сообщений: 201
По умолчанию

Здесь следующая ошибка [Error] UOperMatr.pas(101): Not enough actual parameters

вот здесь TMatrix.Sym[i,j]
Код:
function TMatrix.Sym(a,b:tmatr; var um,un:integer):tmatr;
  var
    i,j:integer;
  begin
    for i:=1 to m do
      begin
        for j:=1 to n do
          TMatrix.Sym[i,j]:=a[i,j]+b[i,j]
      end;

    um:=m;
    un:=n
  end;
Начинающий програм вне форума Ответить с цитированием
Старый 17.11.2012, 00:37   #26
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
TMatrix.Sym
В Делфи результат так не обрабатывается. Пиши
Код:
Result[i,j]:=a[i,j]+b[i,j]
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.11.2012, 00:06   #27
Начинающий програм
Форумчанин
 
Аватар для Начинающий програм
 
Регистрация: 22.11.2011
Сообщений: 201
По умолчанию

Вот теперь в чем проблема, после сложения двух матриц, выводится нулевая матрица.

Код:

Часть кода из основной программы:
          
          begin
            Mx1:=Tmatrix.Create;
            Mx2:=TMatrixGUI.Create;
            Mx3:=Tmatrix.Create;
            writeln('Введите целочисленную матрицу размерности ',m,'x',n,#10);
            Mx1.Vvod();
            writeln('Введите вторую целочисленную матрицу размерности ',m,'x',n,#10);
            Mx2.Vvod();
            c:=Mx3.Sym(Mx1,Mx2);
            Mx3.PrMt();
            Mx1.free;
            Mx2.free;
            Mx3.free
          end;

Класс:
TMatrix=class
              private
                fa:tmatr;
                fum,fun,fh:integer;
              public
                procedure Vvod(); //ввод матрицы
                function Prz(b:tmatr):tmatr; //произведение матриц
                procedure Tran(); //транспонирование матрицы
                procedure PrMt(); //печать матрицы
                procedure Dstr(h : integer); //удаление строки в матрице
                procedure Dsto(h : integer); //удаление столбца в матрице
                function Sym(a:tmatrix;b:tmatrix):tmatr; //сумма матриц
                function Razn(a,b:tmatr):tmatr; //разность матриц
                property matr: tmatr read fa;
                property um: integer read fum write fum;
                property h: integer  read fh write fh;
                property un: integer  read fun write fun;
            end;

Процедуры которые используются в той части программы где возможно у меня и есть ошибка:
procedure TMatrix.Vvod;
  var
    i,j:integer;
  begin
    for i:=1 to m do
      begin
        for j:=1 to n do
          read(fa[i,j]);
        readln
      end;
      fun := n; fum := m;
  end;

function TMatrix.Sym;
  var
    i,j:integer;
    res : tmatr;
  begin
    for i:=1 to m do
      begin
        for j:=1 to n do
          res[i,j]:=a.matr[i,j]+b.matr[i,j];
      end;
    fum:=m;
    fun:=n;
    Result := res;
  end;

procedure TMatrix.PrMt;
  var
    i,j:integer;
  begin
    writeln('Новая матрица:',#10);
    for i:=1 to fum do
      begin
        for j:=1 to fun do
          if fa[i,j]<10 then
            write(' ',fa[i,j],' ')
          else
            write(fa[i,j],' ');
        writeln
      end
  end;
Начинающий програм вне форума Ответить с цитированием
Старый 18.11.2012, 00:47   #28
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не удивительно.
Ты складываешь матрицу - получается массив, который попадает в переменку "с"
Однако внутри функции печати происходит вывод матрицы fa. Разницу чувствуешь?
Это разные переменные, совершенно разные.
Уж если так то тебе нужно немного другое:
Код:
function Sym(a:tmatrix;b:tmatrix):tmatrix; //сумма матриц
Код:
function TMatrix.Sym;
  var
    i,j:integer;
  begin
// Создаем новый экземпляр объекта матрицы
    Result:=TMatrix.Create;

    for i:=1 to m do
      begin
        for j:=1 to n do
// И уже его наполняем новыми данными - умножением элементов
          Result.fa[i,j]:=a.matr[i,j]+b.matr[i,j];
      end;
    fum:=m;
    fun:=n;
  end;
Соответственно распечатка будет так:
Код:
var c:TMatrix;
...
c:=Mx3.Sym(Mx1,Mx2);
c.PrMt;
c.free;
...
Идею уловил? Создавать новый объект матрицы, вместо того чтоб возвращать в никуда вычисленные данные. Потом этот объект не забывать освобождать методом free.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.11.2012, 12:40   #29
Начинающий програм
Форумчанин
 
Аватар для Начинающий програм
 
Регистрация: 22.11.2011
Сообщений: 201
По умолчанию

Извините меня если я Вас не так понял. Вроде бы я сделал все как Вы описали. Но у меня вообще ничего не выводится после сложения двух матриц.

Код:
var
  c:TMatrix;
.....
          begin  
            Mx1:=Tmatrix.Create;
            Mx2:=TMatrixGUI.Create;
            Mx3:=Tmatrix.Create;
            c:=Tmatrix.Create;
            writeln('Введите целочисленную матрицу размерности ',m,'x',n,#10);
            Mx1.Vvod();
            writeln('Введите вторую целочисленную матрицу размерности ',m,'x',n,#10);
            Mx2.Vvod();
            c:=Mx3.Sym(Mx1,Mx2);
            c.PrMt();
            Mx1.free;
            Mx2.free;
            Mx3.free;
            c.free;
            Result.Free
          end;
Вот если убрать объект "с", тоже не работает как нужно, но хоть что-то выводит, в данном случае нулевую матрицу. Что я не так сделал?

Код:
begin  
            Mx1:=Tmatrix.Create;
            Mx2:=TMatrixGUI.Create;
            Mx3:=Tmatrix.Create;
            writeln('Введите целочисленную матрицу размерности ',m,'x',n,#10);
            Mx1.Vvod();
            writeln('Введите вторую целочисленную матрицу размерности ',m,'x',n,#10);
            Mx2.Vvod();
            Mx3.Sym(Mx1,Mx2);
            Mx3.PrMt();
            Mx1.free;
            Mx2.free;
            Mx3.free;
            Result.Free
          end;

Последний раз редактировалось Stilet; 18.11.2012 в 19:24.
Начинающий програм вне форума Ответить с цитированием
Старый 18.11.2012, 19:29   #30
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ты с отладчиком подружился?
Если нет - рекомендую начать дружбу.
Начни с клавиши F7.
Доведи программу последовательными нажатиями на нее до процедуры суммирования, и путем наведения мышки на переменные посмотри как изменяется результирующая матрица.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты ИльназВ C# (си шарп) 13 22.11.2012 19:00
Геометрические объекты в Delphi Сергей58rus Помощь студентам 1 07.04.2011 15:21
Клик мыши на объекты в Delphi MeGAAkrO Помощь студентам 3 10.04.2010 13:29
3d объекты в Delphi 7 - программирование и вставка Unweather Помощь студентам 1 26.11.2008 14:48