Страница 1 из 3
легкая программа с матрицами...но я не могу ее написать
Добавлено: 20 ноя 2006, 21:28
infinitegirl
здравствуйте,уважаемые программисты!
будте так любезны,напишите глупой(в информатике) студентке программу с матрицами...
условие таково:
:arrow: задана матрица второго порядка.найти её определитель.
буду весьма благодарна

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

Re: легкая программа с матрицами...но я не могу ее написать
Добавлено: 08 янв 2007, 00:11
Tre
Помогите решить такую задачу, простою, но непонимающему мне-это не решаемо в Delphi: дана прямоугольная матрица. Определить кол-во строк, не содержащих ни одного нулевого элемента. и еще надо найти максимальное из чисел, встречающихся в заданной матрице более одного раза. Матрица должна вводиться с StringGrid, и чтобы можно было вводить как с рук, так и с помощью генератора случайных чисел
Re: легкая программа с матрицами...но я не могу ее написать
Добавлено: 08 янв 2007, 00:59
somewhere
Так вот, когда уже есть StringGrid (SG) и батон, по которому выполняется заполнение произвольными числами, неплохо было бы:
1. Создать пару лейблов (TLabel) на видном месте, где будет выводиться результат по двум условиям задачи. Назовем их Lbl1 и Lbl2. 1-ый будет показывать кол-во строк, не содержащих ни одного нулевого элемента; 2-ой - максимальное из чисел, встречающихся в заданной матрице более одного раза.
2. Далее кидаем еще кнопку, по которой будет выполнятся основной алгоритм поиска
3. Создаем массив, в котором будет храниться копия введеной матрицы в SG - чтобы не обращаться постоянно к SG и его ячейкам. К тому же в ячейках могут быть вовсе и не числа :-) Тогда будем считать что там - 0
немного ждем и увидим код...
Re: легкая программа с матрицами...но я не могу ее написать
Добавлено: 08 янв 2007, 01:23
somewhere
Код: Выделить всё
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.
Re: легкая программа с матрицами...но я не могу ее написать
Добавлено: 08 янв 2007, 01:33
Tre
Слушай, спасибо тебе! Что бы я без тебя делал! Правда еще задачки есть, но да ладно щас мне в этой разобраться, а потом наверно и сам как-нибудь. Если что, я к сразу к тебе! Спасибо :-)
Re: легкая программа с матрицами...но я не могу ее написать
Добавлено: 08 янв 2007, 13:13
yuka
infinitegirl, решение твоей задачи я выложил на мой сайт acmsolver.narod.ru. Если интересно, она в разделе задачи и решения -> задачи от посетителей сайта -> задача №6 условие и решение.
Рекламируй сайт своим друзьям, тем кому что-то надо решить срочно и за бабки. Если бы не благотворительная промо акция сайта в честь сессии студентов

- решение задачки подобно твоей стоило бы 10 руб.
Re: легкая программа с матрицами...но я не могу ее написать
Добавлено: 08 янв 2007, 15:39
Tre
somewhere писал(а):Код: Выделить всё
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, и к ней только обращаться надо все время, пусть без фишек разных будет. Вот. Ну и надо найти кол-во строк, не содержащих ни одного нулевого элемента и максимальное из чисел, встречающихся в заданной матрице более одного раза. Что надо изменить, чтоб было так?
Re: легкая программа с матрицами...но я не могу ее написать
Добавлено: 08 янв 2007, 17:02
somewhere
" писал(а):Ну и надо найти кол-во строк, не содержащих ни одного нулевого элемента и максимальное из чисел, встречающихся в заданной матрице более одного раза. Что надо изменить, чтоб было так?
Все это там уже находится. Тогда убираем описатель типа 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;
Re: легкая программа с матрицами...но я не могу ее написать
Добавлено: 08 янв 2007, 21:42
Tre
somewhere писал(а):Все это там уже находится. Тогда убираем описатель типа TMatrix, переменную Mtx и заменяем код в процедуре
Понятно. А как поступать с одномерными массивами? например здесь: В одномерном массиве, состоящем из n целочисленных элементов вычислить: а) номер минимального по модулю элемента массива; b) сумму модулей элементов массива, расположенных после первого отрицательного элемента массива. Преобразовать массив таким образом, чтобы сначала располагались все элементы, попадающие в интервал [a;b], а затем - все остальные. Все вроде просто, на Паскале я могу все это претворить в жизнь, но Delphi не мой конек. Помоги пожалуйста и с одномерным. Потом я надеюсь по этим образцам и сам соорентируюсь.