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

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

infinitegirl
Сообщения: 1
Зарегистрирован: 20 ноя 2006, 21:16
Откуда: МАТИ-РГТУ
Контактная информация:

20 ноя 2006, 21:28

здравствуйте,уважаемые программисты!

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

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

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



буду весьма благодарна :o ops:
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

21 ноя 2006, 00:07

Будьте так любезны, напомните глупому в линейной алгебре программисту, что такое матрица 2 порядка и ее определитель :)
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Tre
Сообщения: 27
Зарегистрирован: 07 янв 2007, 23:26

08 янв 2007, 00:11

Помогите решить такую задачу, простою, но непонимающему мне-это не решаемо в Delphi: дана прямоугольная матрица. Определить кол-во строк, не содержащих ни одного нулевого элемента. и еще надо найти максимальное из чисел, встречающихся в заданной матрице более одного раза. Матрица должна вводиться с StringGrid, и чтобы можно было вводить как с рук, так и с помощью генератора случайных чисел
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

08 янв 2007, 00:59

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

немного ждем и увидим код...
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

08 янв 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.
It's a long way to the top if you wanna rock'n'roll
Tre
Сообщения: 27
Зарегистрирован: 07 янв 2007, 23:26

08 янв 2007, 01:33

Слушай, спасибо тебе! Что бы я без тебя делал! Правда еще задачки есть, но да ладно щас мне в этой разобраться, а потом наверно и сам как-нибудь. Если что, я к сразу к тебе! Спасибо :-)
yuka
Сообщения: 13
Зарегистрирован: 07 янв 2007, 16:37

08 янв 2007, 13:13

infinitegirl, решение твоей задачи я выложил на мой сайт acmsolver.narod.ru. Если интересно, она в разделе задачи и решения -> задачи от посетителей сайта -> задача №6 условие и решение.
Рекламируй сайт своим друзьям, тем кому что-то надо решить срочно и за бабки. Если бы не благотворительная промо акция сайта в честь сессии студентов :) - решение задачки подобно твоей стоило бы 10 руб.
Tre
Сообщения: 27
Зарегистрирован: 07 янв 2007, 23:26

08 янв 2007, 15:39

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, и к ней только обращаться надо все время, пусть без фишек разных будет. Вот. Ну и надо найти кол-во строк, не содержащих ни одного нулевого элемента и максимальное из чисел, встречающихся в заданной матрице более одного раза. Что надо изменить, чтоб было так?
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

08 янв 2007, 17:02

&quot писал(а):Ну и надо найти кол-во строк, не содержащих ни одного нулевого элемента и максимальное из чисел, встречающихся в заданной матрице более одного раза. Что надо изменить, чтоб было так?
Все это там уже находится. Тогда убираем описатель типа 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;
It's a long way to the top if you wanna rock'n'roll
Tre
Сообщения: 27
Зарегистрирован: 07 янв 2007, 23:26

08 янв 2007, 21:42

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