PDA

Просмотр полной версии : легкая программа с матрицами...но я не могу ее написать



infinitegirl
20.11.2006, 21:28
здравствуйте,уважаемые программисты!

будте так любезны,напишите глупой(в информатике) студентке программу с матрицами...

условие таково:

:arrow: задана матрица второго порядка.найти её определитель.



буду весьма благодарна :oops:

Хыиуду
21.11.2006, 00:07
Будьте так любезны, напомните глупому в линейной алгебре программисту, что такое матрица 2 порядка и ее определитель :)

Tre
08.01.2007, 00:11
Помогите решить такую задачу, простою, но непонимающему мне-это не решаемо в Delphi: дана прямоугольная матрица. Определить кол-во строк, не содержащих ни одного нулевого элемента. и еще надо найти максимальное из чисел, встречающихся в заданной матрице более одного раза. Матрица должна вводиться с StringGrid, и чтобы можно было вводить как с рук, так и с помощью генератора случайных чисел

somewhere
08.01.2007, 00:59
Так вот, когда уже есть StringGrid (SG) и батон, по которому выполняется заполнение произвольными числами, неплохо было бы:
1. Создать пару лейблов (TLabel) на видном месте, где будет выводиться результат по двум условиям задачи. Назовем их Lbl1 и Lbl2. 1-ый будет показывать кол-во строк, не содержащих ни одного нулевого элемента; 2-ой - максимальное из чисел, встречающихся в заданной матрице более одного раза.
2. Далее кидаем еще кнопку, по которой будет выполнятся основной алгоритм поиска
3. Создаем массив, в котором будет храниться копия введеной матрицы в SG - чтобы не обращаться постоянно к SG и его ячейкам. К тому же в ячейках могут быть вовсе и не числа :-) Тогда будем считать что там - 0

немного ждем и увидим код...

somewhere
08.01.2007, 01:23
unit Unit1;

interface

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

const
MtxSize = 5;

type
TMatrix = array[1..MtxSize, 1..MtxSize] of Integer;
TForm1 = class(TForm)
sg: TStringGrid;
BitBtn1: TBitBtn;
Button1: TButton;
Lbl1: TLabel;
Lbl2: TLabel;
procedure BitBtn1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
mtx : TMatrix;
ar : Array[1..MtxSize*MtxSize] of Integer;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
var x, y: Integer;
begin
for x:=0 to sg.RowCount-1 do
for y:=0 to sg.ColCount-1 do
sg.Cells[y,x] := Inttostr(random(50)-25);
end;

procedure TForm1.Button1Click(Sender: TObject);
var x, y, n : Integer;
nzrc,maxval : Integer;
Sorted : Boolean;
begin
for x:=0 to MtxSize-1 do
for y:=0 to MtxSize-1 do
begin
if not TryStrToInt(sg.Cells[y,x], n) then n := 0;
mtx[y+1,x+1] := n;
ar[x+y*MtxSize] := n;
end;
nzrc := 0;
for x:=1 to MtxSize do
begin
n := 0;
for y:=1 to MtxSize do if mtx[y,x] = 0 then inc(n);
if n = 0 then inc(nzrc);
end;
Lbl1.Caption := 'Non-zero row count : '+Inttostr(nzrc);
Sorted := false;
While not Sorted do
begin
Sorted := true;
For x := 1 to MtxSize*MtxSize-1 do
if ar[x]<ar[x+1] then
begin
n := ar[x];
ar[x] := ar[x+1];
ar[x+1] := n;
Sorted := false;
end;
end;
x := 1;
while (x<>MtxSize*MtxSize) and (ar[x]<>ar[x+1]) do inc(x);
if x = MtxSize*MtxSize
then Lbl2.Caption := 'There is no value that exists more than in one cell'
else Lbl2.Caption := 'Maximum value that exists more than in one cell is '+Inttostr(ar[x]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SG.RowCount := MtxSize;
SG.ColCount := MtxSize;
end;

end.

Tre
08.01.2007, 01:33
Слушай, спасибо тебе! Что бы я без тебя делал! Правда еще задачки есть, но да ладно щас мне в этой разобраться, а потом наверно и сам как-нибудь. Если что, я к сразу к тебе! Спасибо :-)

yuka
08.01.2007, 13:13
infinitegirl, решение твоей задачи я выложил на мой сайт acmsolver.narod.ru. Если интересно, она в разделе задачи и решения -> задачи от посетителей сайта -> задача №6 условие и решение.
Рекламируй сайт своим друзьям, тем кому что-то надо решить срочно и за бабки. Если бы не благотворительная промо акция сайта в честь сессии студентов :) - решение задачки подобно твоей стоило бы 10 руб.

Tre
08.01.2007, 15:39
unit Unit1;

interface

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

const
MtxSize = 5;

type
TMatrix = array[1..MtxSize, 1..MtxSize] of Integer;
TForm1 = class(TForm)
sg: TStringGrid;
BitBtn1: TBitBtn;
Button1: TButton;
Lbl1: TLabel;
Lbl2: TLabel;
procedure BitBtn1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
mtx : TMatrix;
ar : Array[1..MtxSize*MtxSize] of Integer;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
var x, y: Integer;
begin
for x:=0 to sg.RowCount-1 do
for y:=0 to sg.ColCount-1 do
sg.Cells[y,x] := Inttostr(random(50)-25);
end;

procedure TForm1.Button1Click(Sender: TObject);
var x, y, n : Integer;
nzrc,maxval : Integer;
Sorted : Boolean;
begin
for x:=0 to MtxSize-1 do
for y:=0 to MtxSize-1 do
begin
if not TryStrToInt(sg.Cells[y,x], n) then n := 0;
mtx[y+1,x+1] := n;
ar[x+y*MtxSize] := n;
end;
nzrc := 0;
for x:=1 to MtxSize do
begin
n := 0;
for y:=1 to MtxSize do if mtx[y,x] = 0 then inc(n);
if n = 0 then inc(nzrc);
end;
Lbl1.Caption := 'Non-zero row count : '+Inttostr(nzrc);
Sorted := false;
While not Sorted do
begin
Sorted := true;
For x := 1 to MtxSize*MtxSize-1 do
if ar[x]<ar[x+1] then
begin
n := ar[x];
ar[x] := ar[x+1];
ar[x+1] := n;
Sorted := false;
end;
end;
x := 1;
while (x<>MtxSize*MtxSize) and (ar[x]<>ar[x+1]) do inc(x);
if x = MtxSize*MtxSize
then Lbl2.Caption := 'There is no value that exists more than in one cell'
else Lbl2.Caption := 'Maximum value that exists more than in one cell is '+Inttostr(ar[x]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SG.RowCount := MtxSize;
SG.ColCount := MtxSize;
end;

end.






Здорова! Ты мне вчера решил задачку. В принципе все понятно, а можно чтоб без той матрицы, в которой копия? И пусть не будет проверка на то, что в ячейках будут не числа. Упростить надо задачу, так чтоб даже я ее понял. Пусть заранее известно, что там будут только числа. Короче, чтоб задавалась матрица в StringGrid'e, и к ней только обращаться надо все время, пусть без фишек разных будет. Вот. Ну и надо найти кол-во строк, не содержащих ни одного нулевого элемента и максимальное из чисел, встречающихся в заданной матрице более одного раза. Что надо изменить, чтоб было так?

somewhere
08.01.2007, 17:02
Ну и надо найти кол-во строк, не содержащих ни одного нулевого элемента и максимальное из чисел, встречающихся в заданной матрице более одного раза. Что надо изменить, чтоб было так?
Все это там уже находится. Тогда убираем описатель типа TMatrix, переменную Mtx и заменяем код в процедуре


procedure TForm1.Button1Click(Sender: TObject);
var x, y, n : Integer;
nzrc,maxval : Integer;
Sorted : Boolean;
begin
for x:=0 to MtxSize-1 do
for y:=0 to MtxSize-1 do
ar[x+y*MtxSize] := StrToInt(sg.Cells[y,x]);
nzrc := 0;
for x:=0 to MtxSize-1 do
begin
n := 0;
for y:=0 to MtxSize-1 do if StrToInt(sg.Cells[y,x]) = 0 then inc(n);
if n = 0 then inc(nzrc);
end;
Lbl1.Caption := 'Non-zero row count : '+Inttostr(nzrc);
Sorted := false;
While not Sorted do
begin
Sorted := true;
For x := 1 to MtxSize*MtxSize-1 do
if ar[x]<ar[x+1] then
begin
n := ar[x];
ar[x] := ar[x+1];
ar[x+1] := n;
Sorted := false;
end;
end;
x := 1;
while (x<>MtxSize*MtxSize) and (ar[x]<>ar[x+1]) do inc(x);
if x = MtxSize*MtxSize
then Lbl2.Caption := 'There is no value that exists more than in one cell'
else Lbl2.Caption := 'Maximum value that exists more than in one cell is '+Inttostr(ar[x]);
end;

Tre
08.01.2007, 21:42
Все это там уже находится. Тогда убираем описатель типа TMatrix, переменную Mtx и заменяем код в процедуре


Понятно. А как поступать с одномерными массивами? например здесь: В одномерном массиве, состоящем из n целочисленных элементов вычислить: а) номер минимального по модулю элемента массива; b) сумму модулей элементов массива, расположенных после первого отрицательного элемента массива. Преобразовать массив таким образом, чтобы сначала располагались все элементы, попадающие в интервал [a;b], а затем - все остальные. Все вроде просто, на Паскале я могу все это претворить в жизнь, но Delphi не мой конек. Помоги пожалуйста и с одномерным. Потом я надеюсь по этим образцам и сам соорентируюсь.

somewhere
09.01.2007, 10:03
Все вроде просто, на Паскале я могу все это претворить в жизнь
Ну так в чем проблема, пиши на Паскале. А там посмотрим как оформить...

Tre
09.01.2007, 18:28
Ну так в чем проблема, пиши на Паскале. А там посмотрим как оформить...
вот задачка.

program B182;
uses crt;
const n=10;
var i,min,k,s,a,b,j,m:integer;
br,ar:array [1..n] of integer;

begin
clrscr;
randomize;
for i:=1 to n do
begin
ar[i]:=random(100)-50;
write (ar[i],' ');
end;
k:=1;
min:=abs(ar[1]); {a}
for i:=1 to n do
if abs(ar[i])< min then begin
min:=abs(ar[i]);
k:=i;
end;
writeln;
writeln ('min элемент по модулю= ',min,' с индексом ',k);

s:=0; {b}
for i:=1 to n do
if ar[i]<0 then begin
k:=i;
i:=n;
end;
for i:=k+1 to n do
s:=s+abs(ar[i]);
writeln;
writeln ('сумма модулей элементов расположенных после первого отрицательного элемента* =',s);

writeln ('введите левую границу'); {преобразование матрицы}
readln (a);
writeln ('введите правую границу');
readln (b);
j:=1;
for i:=1 to n do
if (ar[i]>a) and (ar[i]<b) then begin
br[j]:=ar[i];
j:=j+1;
end;
m:=j;
for j:=1 to m-1 do
write (br[j],' ');
j:=m;
for i:=1 to n do
if (ar[i]<a) or (ar[i]>b) then begin
br[j]:=ar[i];
j:=j+1;
end;
for j:=m to n do
write (br[j],' ');
readln
end.

Теперь ее надо в delphi и еще чтоб с руки ввод массива тоже был. И кстати в той задаче про двумерную матрицу, надо тоже ввод с рук организовать.

somewhere
09.01.2007, 21:35
И кстати в той задаче про двумерную матрицу, надо тоже ввод с рук организовать.
Так я же писал, как. Разрешаешь для TStringGrid редактирование и все нормально с руки вводиться.

Теперь об этой задаче:
1. Для ввода одномерного массива тоже можно использовать TStringGrid, только строка у него будет всего одна.
2. Нужна кнопка для запуска этой программы.
3. Для вывода всей информации на экран можно использовать TMemo. У него есть свойство Lines. Lines - это грубо говоря массив из стрингов. У него методы есть: Clear, Add и т.д. Вот они и пригодятся. Т.е. заместо ClrScr; будет Memo.Lines.Clear; а заместо Writeln(s:String) memo.Lines.Add(s:String)
4. С учетом частого использования элементов одномерного массива в поиске, сравнениях и др. настоятельно рекомендую все-таки скопировать из StringGrid'a все элементы в этот массив, а потом с ним работать.

И попробуй пока сам, иначе какой смысл решать задачи мне. Меня это не научит, а вот чем больше времени ты сам будешь ей уделять - тем больше опыта и знаний ты получишь. Не забывай, что всегда есть Help который расскажет о каждом свойстве и методе любого объекта.

Tre
09.01.2007, 23:21
И попробуй пока сам, иначе какой смысл решать задачи мне. Меня это не научит, а вот чем больше времени ты сам будешь ей уделять - тем больше опыта и знаний ты получишь. Не забывай, что всегда есть Help который расскажет о каждом свойстве и методе любого объекта.
тк, я бы сидел, но у меня времени совсем нет, а скоро уже сдавать 15 задач. Половина из них двумерные, половина одномерные. Ты мне дал код для двумерной, вот если дашь и для одномерного, для вот этой задачи, тогда я уж наверно и сам попробую посидеть. А так толку совсем нет, я попросту ниче не успею понять, а здесь будет хоть от чего отталкиваться. напиши мне решение для одномерного просто, только, ладно, не надо с clrscr, пусть будет все просто как с двумерной. Без фишек. Заранее благодарю
P.S. а когда организуешь ввод с рук эти строчки надо удалять?

procedure TForm1.BitBtn1Click(Sender: TObject);
var x, y: Integer;
begin
for x:=0 to sg.RowCount-1 do
for y:=0 to sg.ColCount-1 do
sg.Cells[y,x] := Inttostr(random(50)-25);
end;
а вместо них что-нибудь надо писать?
Я в Options у StringGrid поставил True. Значения ввожу но выходит ошибка, типа не целый тип переменная принимает. Что-то типа того. короче мне тяжело разобраться. Помоги

Хыиуду
10.01.2007, 10:10
А в чем проблема, там же все еще проще!
Например, есть двумерный массив mas2=array[1..m,1..n] of integer
Если мы хотим что-то сделать с каждым элементом массива - делаем два цикла (по горизонтали и вертикали) и мучаем элементы:
for i:=1 to m do
for j:=1 to n do
mas2[i,j]:= что-то там
А если одномерный - просто считай, что у тебя n тождественно равен 1.
Правда, такой код будет неудобен, поэтому можно второе измерение вообще выкинуть
mas1:array[1..m] of integer;
И тогда достаточно одного цикла
for i:=1 to m do
mas1[i]:= что-то там
Что тут еще сложного?

somewhere
10.01.2007, 10:21
Для ввода данных "с руки" в Дельфи служат объекты.

foo
10.01.2007, 15:17
Для ввода данных "с руки" в Дельфи служат объекты.

Пробую на событие OnSelectCell, сделать ввод числа, в соответсвующий cell. Подскажешь куда смотреть?

foo
10.01.2007, 15:36
Сделал Options GoEditing true. Ввод пошел. Спасибо, за ранний совет ;-)

Tre
10.01.2007, 17:16
Для ввода данных "с руки" в Дельфи служат объекты. спасибо за задачу. Попробую разобраться

Tre
11.01.2007, 16:14
Помнишь ты мне сделал задачу с одномерным массивом? Так вот, Я все задачи с одномерными сделал, но оказывается Преобразованный массив необходимо выводить в другом StringGride. Как это сделать? И сильно ли этот вывод отличается для задач с двумерными матрицами?

Хыиуду
11.01.2007, 16:29
Преобразованный массив необходимо выводить в другом StringGride. Как это сделать?
Да точно так же, как и в первом! Кладешь на форму еще один СтрингГрид (почему его все преподы так нежно любят, я вот терпеть не могу) и пишешь:
for i:=1 to n do
for j:=1 to m do
StringGrid2.Cells[i,j]:= .... что тебе там надо вывести

somewhere
11.01.2007, 16:55
Отличается не сильно, даже меньше по объему

Tre
12.01.2007, 14:08
Я хотел еще спросить, у меня тут загвоздка. Мне нужен алгоритм решения вот такой задачи: 1) нужно найти максимум среди сумм элементов диагоналей, параллельных побочной диагонали у квадратной матрицы. Нужен просто код.
2)И как переставлять строки при условии повышения суммы элементов в этих строках. Вывод естественно в другом StringGride