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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2011, 11:55   #1
aly-lucenko
Пользователь
 
Регистрация: 09.04.2010
Сообщений: 29
По умолчанию Преобразование треугольного массива в одномерный)

Суть задачи состоит в том, что б преобразовать треугольный массив в одномерный, естественно без нолей)
нашла формулу X = I * (I - 1) / 2 + J, работает она для i>j
Немогу реализовать код:
Код:
for i:=0 to 3  do begin
  for j:=0 to 3  do  begin
     if i>j then begin
        B[round(((i*(i-1))/2)+j)]:=strtoint(StringGrid1.Cells[i,j]);
        StringGrid2.Cells[i,j]:=inttostr(B[round((i*(i-1))/2)+j]); 
     end;
  end; 
end;
после запуска выдает ошибку)


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 10.04.2011 в 12:50.
aly-lucenko вне форума Ответить с цитированием
Старый 10.04.2011, 12:53   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) какую ошибку выдаёт?
вероятно "Not valid integer value" ?

2) скорее всего ошибка в заполненном StringGrid1
где-то в ячейке не целое число, поэтому
strtoint(StringGrid1.Cells[i,j]) и будет давать ошибку...


p.s. смысл задания я не понял, поэтому возможно, что проблема и в другом..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.04.2011, 13:04   #3
aly-lucenko
Пользователь
 
Регистрация: 09.04.2010
Сообщений: 29
По умолчанию

Ошибка "Invalid pointer operation":

есть массив вида

0 0 0 0
10 0 0 0
20 21 0 0
30 31 32 0

нужно записать в виде
10 20 21 30 31 32
aly-lucenko вне форума Ответить с цитированием
Старый 10.04.2011, 13:30   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
работает она для i>j
сразу могу сказать - Вы явно забываете, что в StringGrid[i,j] индексы указываются "наоборот" - первым указывается столбец, вторым индексом - строка.

Это раз.

второе. Дайте исходники проекта. (банально лень рисовать всё с нуля, да и у Вас ошибка может быть в другом месте). Исходники проекта (это файлы с расширениями .PAS, .DFM, .DPR) лучше запаковать в архив, архив прикрепить к сообщению...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.04.2011, 13:52   #5
aly-lucenko
Пользователь
 
Регистрация: 09.04.2010
Сообщений: 29
По умолчанию

Вот проект)
Вложения
Тип файла: rar 1.01.rar (189.5 Кб, 5 просмотров)
aly-lucenko вне форума Ответить с цитированием
Старый 10.04.2011, 16:10   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

главная ошибка.
StringGrid2 - одна строчка.
Так почему Вы туда пытаетесь залить по координатам [i,j]?!
StringGrid2.Cells[i,j]

и размерность массива B неправильно задавали - там не 4 - а 6 элементов должно быть.

И с массивом A (начальное присвоение) - косячок-с.. Массив A не иницилизирован.. так почему Вы его содержимое присваиваете в StringGrid ? Это же мусор получается!

вот, попробуйте такой код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i, j : integer;
begin
  for i:=0 to 3  do
   for j:=0 to 3  do  begin
      if i<=j then
        StringGrid1.Cells[j,i]:= '0'
      else
        StringGrid1.Cells[j,i]:= IntToStr((i+1)*10+j);
      end ;
   end;

procedure TForm1.Button2Click(Sender: TObject);
var i, j : integer;
begin
  SetLength(B, 6);
  for i:=0 to 3  do begin
    for j:=0 to 3  do  begin
       if i>j then begin
          B[round(((i*(i-1))/2)+j)]:= strtoint(StringGrid1.Cells[j, i]);
       end;
    end;
  end;
  // выведем массив B
  for I := 0 to 5  do
     StringGrid2.Cells[i, 0] := IntToStr(B[i]);
end;

Последний раз редактировалось Serge_Bliznykov; 10.04.2011 в 16:26.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.04.2011, 20:02   #7
aly-lucenko
Пользователь
 
Регистрация: 09.04.2010
Сообщений: 29
По умолчанию

Спасибо огромное) вы мне очень помогли)
как вас можна отблагодарить:
aly-lucenko вне форума Ответить с цитированием
Старый 10.04.2011, 20:16   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Либо деньжат подкинь, либо репутацию (жмак по весам) подними
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.04.2011, 20:37   #9
aly-lucenko
Пользователь
 
Регистрация: 09.04.2010
Сообщений: 29
По умолчанию

куда денег перекинуть?

подскажите, как теперь из этого массива(одномерного) получить двумерный???
обратного преобразования B(X) в A(I,J) выглядит так:

I = Int((1 + Sqr(1 + 8 * X)) / 2)
J = X - I * (I - 1) / 2
Код:
for i:=0 to 3  do begin
 for j:=0 to 3  do  begin
   A[(round((1 + Sqr(1 + 8 * X)) / 2)), (round(X - I * (I - 1) / 2))]:=strtoint(StringGrid2.Cells[0, i]);
end;  end;
for i:=0 to 3  do
    for j:=0 to 3  do  begin
   StringGrid1.Cells[j, i]:=IntToStr(A[i,j]);end;
пишу код, опять не получается
aly-lucenko вне форума Ответить с цитированием
Старый 10.04.2011, 22:31   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
procedure TForm1.Button3Click(Sender: TObject);
var x, i, j : integer;
begin
  {выделим память под массив A}
  SetLength(A,4);
  for I := 0 to 3 do
     SetLength(A[i], 4);

  //обнулим массив A
  for i:=0 to 3  do
    for j:=0 to 3  do
      A[i, j] := 0;

  // собственно код переноса одномерного массива в двухмерный
  for x:=Low(B) to High(B)  do begin
    i := trunc(((1 + Sqrt(1 + 8 * X)) / 2));
    j := trunc((X - i * (i - 1) / 2));
    // Memo1.Lines.Append('x = '+IntToStr(x)+' i= '+IntToStr(i) + ' j= '+IntToStr(j));
    A[i, j]  := strtoint(StringGrid2.Cells[x, 0]);
  end;

  for i:=0 to 3  do
    for j:=0 to 3  do  begin
      StringGrid1.Cells[j, i]:=IntToStr(A[i,j]);
    end;

end;

Цитата:
куда денег перекинуть?
У Вас их много? Тогда договоримся, куда перекидывать!!!
А если не много - тогда не будем ничего никуда перекидывать!
Пользуйтесь моей добротой!...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование двумерного массива в одномерный... S.Mihail Паскаль, Turbo Pascal, PascalABC.NET 5 09.12.2011 19:24
Преобразование массива kpachbiu PHP 13 09.10.2010 23:51
Преобразование массива в паскале street_spirit Помощь студентам 9 05.10.2010 19:08
Преобразование массива с++ davart Помощь студентам 3 01.10.2010 09:25
преобразование массива PARTOS Microsoft Office Excel 4 20.01.2010 17:21