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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2009, 20:21   #1
Hegel
Пользователь
 
Регистрация: 08.01.2009
Сообщений: 32
Лампочка Матрица в delphi

Задание: Дана действительная,квардратичная матрица порядка n,
Найти наибольший элемент среди стоящих на главной и побочной диагоналях и поменять его местами с элементом стоящим на пересечени этих диагоналей.

--Я сделал вывод матрицы в стринг грид+заполнение его числами,не знаю как сделать дальше процедуру нахождения максимума и его замены,прошу помочь!


Код:
 unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Type TMatr=array [1..50] of array [1..50] of real;
      var matr:TMatr;
          n,m:integer;

implementation

{$R *.dfm}
//Ввод матрицы
Procedure Vvod(var Matr:TMatr; n,m:integer);
    var i,j:integer;
begin
    Randomize;
    for i:=0  to n-1 do
       for j:=0 to m-1 do
         Matr[i,j]:=Int(random*40)-20;
end;

//вывод матрицы на экран
Procedure Vivod(var Matr:TMatr;n,m:integer;StringGrid1:TstringGrid);
   var i,j:integer;
begin
   for i:= 0 to n-1 do
     for j:=0 to m-1 do
        StringGrid1.Cells[j,i]:=FloatToStr(Matr[i,j]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 StringGrid1.RowCount := strtoint(edit1.text);
 StringGrid1.ColCount  := strtoint(edit1.text);
    n:= strtoint(edit1.text);
    m:= strtoint(edit1.text);
      Vvod(Matr,n,m);
      Vivod(Matr,n,m,StringGrid1);
  end;
end.

Последний раз редактировалось Hegel; 08.01.2009 в 20:36.
Hegel вне форума Ответить с цитированием
Старый 08.01.2009, 20:46   #2
Тупой
Форумчанин
 
Аватар для Тупой
 
Регистрация: 26.12.2008
Сообщений: 146
По умолчанию

ну... вот один из вариантов поиска максимального значения в векторе a[0],...a[n-1]:

Код:
max:=a[0];
for i:=1  to n-1 do
if a[i]>max then 
max:=a[i];
ну, и пара замечаний к Вашему коду
Код:
Procedure Vvod(var Matr:TMatr; n,m:integer);
    var i,j:integer;
begin
    Randomize;
    for i:=0  to n-1 do
       for j:=0 to m-1 do
         Matr[i,j]:=Int(random*40)-20;
end;
нафиг передавать n и m, если по условию матрица квадратная, ну и так, косяк - элементы начинаются от 1 до n, а вы прогоняете с нуля. Лучше:
Код:
    for i:=1  to n do
       for j:=1 tor n do
"Hello, world!" - 17 errors 56 warnings

Последний раз редактировалось Тупой; 08.01.2009 в 20:51.
Тупой вне форума Ответить с цитированием
Старый 08.01.2009, 20:51   #3
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Поиск максимального элемента:
Код:
function findmax(var Matr: TMatr; var row, col: integer; n: integer): real;
var i: integer; max: real;
begin
max := Matr[1, 1]; row := 1; col := 1;
for i := 1 to n do
  begin
  if Matr[i, i] > max then begin max := Matr[i, i]; row := i; col := i end
  //на главной диагонали
  if Matr[i, n-i+1] > max then 
    begin max := Matr[i, n-i+1]; row := i; col := n-i+1 end
  //на побочной диагонали
  end;
findmax := max;
end;
Эта функция возвращает максимальный элемент, а в переменные row и col заносит номер строки и столбца, в которых он расположен. Соответственно замена
Код:
buf := matr[n div 2 + 1, n div 2 + 1];
//n - размерность
matr[n div 2 + 1, n div 2 + 1] := findmax(matr, row, col);
matr[row, col] := buf;
Тока надо чтобы размерность матрицы была нечётной, иначе общего элемента у главной и побочной диагоналей нет
P.S. У вас в описании матрицы и процедурах не совпадает индексация
Росли вроде умными, выросли дурнями... (c)А.Васильев

Последний раз редактировалось Greblin; 08.01.2009 в 20:53.
Greblin вне форума Ответить с цитированием
Старый 08.01.2009, 20:55   #4
Тупой
Форумчанин
 
Аватар для Тупой
 
Регистрация: 26.12.2008
Сообщений: 146
По умолчанию

кстати, вопрос, а в делфи в именах переменных важен регистр?
ну всмысле Matr и matr различные?
"Hello, world!" - 17 errors 56 warnings
Тупой вне форума Ответить с цитированием
Старый 08.01.2009, 20:56   #5
maladoy
delphi-ст!
Форумчанин
 
Аватар для maladoy
 
Регистрация: 02.01.2009
Сообщений: 825
По умолчанию

нет регистр не важен!!!
вступлю в команду разработчиков ПО на Delphi
maladoy вне форума Ответить с цитированием
Старый 08.01.2009, 21:41   #6
Hegel
Пользователь
 
Регистрация: 08.01.2009
Сообщений: 32
По умолчанию

Цитата:
Сообщение от Тупой Посмотреть сообщение
нафиг передавать n и m, если по условию матрица квадратная, ну и так, косяк - элементы начинаются от 1 до n, а вы прогоняете с нуля. Лучше:
Код:
    for i:=1  to n do
       for j:=1 tor n do
Cпасибо исправил

Greblin
Постите,я не разобрался в

Код:
buf := matr[n div 2 + 1, n div 2 + 1];
//n - размерность
matr[n div 2 + 1, n div 2 + 1] := findmax(matr, row, col);
matr[row, col] := buf;

Можно спросить как это будет выглядеть в процедуре например для клика..
Что такое Buf?

..Там нужно вычислить максимальный элемент на диагоналях и расположить его в центре матрицы на пересечении диагоналей..

Поясните пожалуйста
Hegel вне форума Ответить с цитированием
Старый 09.01.2009, 13:05   #7
Hegel
Пользователь
 
Регистрация: 08.01.2009
Сообщений: 32
По умолчанию

<<<===UP===>>>
Hegel вне форума Ответить с цитированием
Старый 09.01.2009, 13:30   #8
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Это элементарный обмен двух элементов местами. Сначала мы запоминаем центральный элемент матрицы (matr[n div 2 + 1, n div 2 + 1]) в переменной buf, можете назвать ее x,y,z да как угодно.
На место центрального элемента ставим найденный максимальный элемент (findmax(matr, row, col)), а потом на его место ставим центральный, который мы запомнили в переменной buf.
puporev вне форума Ответить с цитированием
Старый 09.01.2009, 22:56   #9
Hegel
Пользователь
 
Регистрация: 08.01.2009
Сообщений: 32
По умолчанию

Цитата:
Сообщение от puporev Посмотреть сообщение
Это элементарный обмен двух элементов местами. Сначала мы запоминаем центральный элемент матрицы (matr[n div 2 + 1, n div 2 + 1]) в переменной buf, можете назвать ее x,y,z да как угодно.
На место центрального элемента ставим найденный максимальный элемент (findmax(matr, row, col)), а потом на его место ставим центральный, который мы запомнили в переменной buf.


[Pascal Error] Unit1.pas(98): E2003 Undeclared identifier: 'row'

Находит ошибку в строке
Код:
matr[n div 2 + 1, n div 2 + 1] := findmax(matr,row,col);
копия текста ниже

Код:
var
  Form1: TForm1;
  Type TMatr=array [1..50] of array [1..50] of real;
      var matr:TMatr;
          n,m:integer;

implementation

{$R *.dfm}
//Ввод матрицы
Procedure Vvod(var Matr:TMatr; n,m:integer);
    var i,j:integer;
begin
    Randomize;
   for i:=1  to n do
       for j:=1 to n do
 Matr[i,j]:=Int(random*40)-20;
 end;

//вывод матрицы на экран
Procedure Vivod(var Matr:TMatr;n,m:integer;StringGrid1:TstringGrid);
   var i,j:integer;
begin
   for i:=1 to n-1 do
     for j:=1 to m-1 do
        StringGrid1.Cells[j,i]:=FloatToStr(Matr[i,j]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 StringGrid1.RowCount := strtoint(edit1.text);
 StringGrid1.ColCount  := strtoint(edit1.text);
    n:=   strtoint(edit1.text);
    m:= strtoint(edit1.text);
      Vvod(Matr,n,m);
      Vivod(Matr,n,m,StringGrid1);
  end;

  //Чтение матрицы
Procedure Read(var Matr:TMatr;n,m:integer;StringGrid1:TstringGrid);
   var i,j:integer;
begin
  for i:= 1 to n-1 do
     for j:=1 to m-1 do
         Matr[i,j]:=StrToFloat(StringGrid1.Cells[j,i]);
end;

function findmax(var Matr: TMatr; var row, col: integer; n: integer): real;
var i: integer; max: real;
begin
max := Matr[1,1]; row := 1; col := 1;
for i := 1 to n do
  begin
  if Matr[i, i] > max then begin max := Matr[i, i]; row := i; col := i
  end;
  //на главной диагонали
  if Matr[i, n-i+1] > max then
    begin max := Matr[i, n-i+1]; row := i; col := n-i+1
    end;
  //на побочной диагонали
  end;
findmax := max;
end;





procedure TForm1.Button2Click(Sender: TObject);
var
buf:real;
begin
buf := matr[n div 2 + 1, n div 2 + 1];
//n - размерность
matr[n div 2 + 1, n div 2 + 1] := findmax(matr,row,col);
matr[row, col] := buf;
end;

end.
Hegel вне форума Ответить с цитированием
Старый 09.01.2009, 23:44   #10
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Ну дык объявить надо и row и col
Код:
 var row, col: integer;
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
МАТРИЦА (СИ) Freia Помощь студентам 5 19.12.2008 22:39
Delphi, матрица, массив… Мага Помощь студентам 3 10.12.2008 23:35
Delphi, матрица n-го порядка ПаФка Помощь студентам 1 09.12.2008 14:55
Квадратная матрица в Delphi Tomoyo Помощь студентам 10 12.11.2008 18:35
Матрица. Delphi manhunt Помощь студентам 0 29.05.2008 00:32