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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2013, 22:02   #1
shupp
Новичок
Джуниор
 
Регистрация: 21.02.2013
Сообщений: 1
По умолчанию Матрица инциденции Delphi

Здравствуйте. Одна из задач - задать матрицу инцидентности путём введения количества вершин и количества рёбер.
В каждом столбце матрицы должны быть либо две единицы со знаком+, т. е. 1 и 1, либо -1 и -1, либо -1 1, остальные нули. Тоесть не больше двух единиц в столбце. Столбцов с одной единицей или полностью с нулями быть не должно.
Написал код, вроде логически правильно, но чёто не работает) Подскажите что не так:

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
s:=0;
Str:=StrToInt(edit1.Text);
Stlb:=StrToInt(edit2.Text);
StringGrid1.ColCount:=Str+1;
StringGrid1.RowCount:=Stlb+1;
for i:=1 to Str do
for j:=1  to Stlb do
StringGrid1.Cells[i,j]:=IntToStr(random(3)-1);
begin
for i:=1 to Str do
for j:=1 to Stlb do
begin
if Abs(StrToInt(StringGrid1.Cells[i,j]))=1 then
begin
s:=s+1;
end;
if s=2 then
begin
for m:=i+1 to Str do
begin
StringGrid1.Cells[m,j]:='0';
end;
end;
end;
end;
end;
end.

Последний раз редактировалось Stilet; 21.02.2013 в 22:45.
shupp вне форума Ответить с цитированием
Старый 26.02.2013, 09:46   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
В каждом столбце матрицы должны быть либо две единицы со знаком+, т. е. 1 и 1, либо -1 и -1, либо -1 1, остальные нули. Тоесть не больше двух единиц в столбце. Столбцов с одной единицей или полностью с нулями быть не должно.
ну, примерно так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i, j, m, s, rowC, colC: integer;
begin
  Randomize;
  rowC := StrToInt(edit1.Text);
  colC := StrToInt(edit2.Text);

  if rowC<2 then Exit;

  StringGrid1.FixedCols := 1;
  StringGrid1.FixedRows := 1;

  StringGrid1.ColCount := colC + 1;
  StringGrid1.RowCount := rowC + 1;

  for i := 1 to rowC do
    for j := 1 to colC do 
      StringGrid1.Cells[j , i] := IntToStr(random(3) - 1);

  for j := 1 to colC do
  begin
    s := 0;
    for i := 1 to rowC do begin
      if s>=2 then StringGrid1.Cells[j, i] := '0';
      if Abs(StrToInt(StringGrid1.Cells[j, i])) = 1 then inc(s);
    end;
    while s<2 do begin
      m := 1+Random(rowC);
      while (StringGrid1.Cells[j, m]<>'0') and (m<=rowC) do inc(m);
      if m<=rowC then begin
        if Random(2)=1
          then StringGrid1.Cells[j, m] := '-1'
          else StringGrid1.Cells[j, m] := '1';
        inc(s);
      end;
    end;
  end;
end;
но в этом случае вероятность того, что единицы окажутся в первых строчкам матрицы намного выше, чем то, что они окажутся в последних строчках...

эту проблему можно решить по разному.
например, сразу, при заполнении матрицы заполнять её так, чтобы в каждом столбце было ровно по две единицы (по модулю, конечно).

Поэтому, вот так будет более равномерное распределение:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i, j, m, s, rowC, colC: integer;
begin
  Randomize;
  rowC := StrToInt(edit1.Text);
  colC := StrToInt(edit2.Text);

  if rowC < 2 then Exit;

  StringGrid1.FixedCols := 1;
  StringGrid1.FixedRows := 1;

  StringGrid1.ColCount := colC + 1;
  StringGrid1.RowCount := rowC + 1;

  for i := 1 to rowC do
    for j := 1 to colC do 
         StringGrid1.Cells[j, i] := '0';

  for j := 1 to colC do begin
    s := 0;
    while s < 2 do begin
      m := 1 + Random(rowC);
      while (StringGrid1.Cells[j, m] <> '0') and (m <= rowC) do inc(m);
      if m <= rowC then begin
        if Random(2) = 1
          then StringGrid1.Cells[j, m] := '-1'
          else StringGrid1.Cells[j, m] := '1';
        inc(s);
      end;
    end;
  end;
end;



p.s. да-да, я вижу, что уже пять дней прошло и что автор темы, скорее всего, сам решил свою проблему... Но вдруг кому-то пригодится

Последний раз редактировалось Serge_Bliznykov; 26.02.2013 в 09:56.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
матрица [Delphi 7] V0L40K_21 Помощь студентам 5 30.01.2012 01:47
Матрица Delphi 7 Mihail09 Помощь студентам 4 16.12.2009 17:30
Матрица в Delphi sPan4eZ Помощь студентам 3 02.11.2009 23:41
Матрица в delphi Hegel Помощь студентам 11 10.01.2009 16:59