Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Маленькая помощь в скромной задачке :)


Страницы:   1 2

неугомонный ©   (2007-10-11 00:18:00) 

Мастера прошу помоч в написании кода. Задачка такая на форме 2 стринггрида. stringgrid2 содержит немного измененные данные из stringgrid1 поэтому colcount у них одинаковый.
оба грида rowcount = 1.

Покажу на примере чего мне надо добиться.
Допустим в stringgrid1.colcount := 5;
и содержит числа 32,31,1,32,31

числа 32 и 31 повторились поэтому в stringgrid2 должны записаться данные в таком виде:
32,31,1,$32,$31

а если было множество такое
32,31,1,32,5
то в результате в stringgrid2 получилось вот что:
32,31,1,#32,5  -- так потому что 5 - новое(его нет во множестве)

вот еще пару примерчиков:
5,31,19,31 -> 5,31,19,$31
31,19,31,27 -> 31,19,#31,27
37,37,27,28,29,27,21 -> 37,#37,27,28,29,#27,21
37,37,27,28,29,27,21,29 -> 37,#37,27,28,29,#27,21,$29


ЮЮ   (2007-10-12 03:21:00) [1]

col: integer;
 cellValue: string;
 idx: integer;
begin
 sl := TStrigList.Create;
 sl.Sorted := true; // в этом списке храним оригинальнве значения ячеек
 try
   for col := 0 to grid_simvol.colcount - 1 do begin
     cellValue := Trim(grid_simvol.Cell[col, 0]);  
     if cellValue = '' then continie;
     if cellValue[0] in ['$', '#'] then
       cellValue := Copy(cellValue, 2, Lenth(cellValue) - 1); //убираем артефакты
     idx := sl.IndexOf(cellValue);
     if idx = - 1 then begin
       // значение встретилось впервые
       grid_simvol.Cell[col, 0] := cellValue;
       sl.Add(cellValue);
     end
     else begin
       if col = grid_simvol.colcount - 1 then
         // последнне число ряда
         grid_simvol.Cell[col, 0] := '$' + cellValue
       else
         grid_simvol.Cell[col, 0] := '#' + cellValue
     end;      
   end;
 finally
   sl.Free;
 end;

P.S. Писал не в Delphi, возможны ляпы.
P.P.S. Перед запуском алгоритма было бы неплохо "сжать" строку - удалить пустые ячейки


неугомонный   (2007-10-11 21:04:00) [2]

все таки пришлось немного доработать:
var
 i,j,q:integer;
 s,s1:string;
 gg,povtor:boolean;
begin
gg:=false;
povtor := false;

S := grid_simvol.Rows[0].Strings[grid_simvol.ColCount-1];
 If s <> '' then
 begin
   for j:=0 to grid_simvol.ColCount-2 do
   begin
     if grid_simvol.Rows[0].Strings[j] = S then
       gg := true;
   end;
 end;

 If gg = false then
 begin
   for i:=0 to grid_simvol.colcount - 1 do
   begin
     S := grid_simvol.Rows[0].Strings[i];
     If S <> '' then
     begin
       s1 := Copy(grid_simvol.Rows[0].Strings[i],0,1);
       if s1 <> '#' then
       begin
         for j:=i+1 to grid_simvol.ColCount - 2 do
         begin
           if grid_simvol.Rows[0].Strings[j] = S then
             grid_simvol.Rows[0].Strings[j] := '#'+S;
          end;
       end;
     end;
   end;
 end else
 begin
   grid_simvol.Rows[0].Strings[grid_simvol.ColCount-1] :='$'+grid_simvol.Rows[0].Strings[grid_simvol.ColCount-1];
   For i:=grid_simvol.ColCount - 2 downto 0 do
   begin
     povtor := False;
     S := grid_simvol.Rows[0].Strings[i];
     For j:=0 to i-1 do
     begin
       If grid_simvol.Rows[0].Strings[j] = S then
         povtor := True;
     end;
     IF povtor = False then
     begin
       For j:=0 to i do
       begin
         S := grid_simvol.Rows[0].Strings[j];
         if S <> '' then
         begin
           s1 := Copy(grid_simvol.Rows[0].Strings[i],0,1);
           if s1 <> '#' then
           begin
             for q:=j+1 to i do
             begin
               if grid_simvol.Rows[0].Strings[q] = S then
               begin
                 if Copy(grid_simvol.Rows[0].Strings[q],0,1) <> '#' then
                 grid_simvol.Rows[0].Strings[q] := '#'+S;
               end;
             end;
           end;
         end;
       end;
       Break;
     end else
     begin
       grid_simvol.Rows[0].Strings[I] := '$'+S;
     end;
   end;
 end;


неугомонный   (2007-10-11 19:44:00) [3]

собственна прошу прощенья за то что потревожил и спасибо за ответы.
вот что получилось у меня,криво но работает:
var
 i,j,q:integer;
 s:string;
 gg,povtor:boolean;
begin
gg:=false;
povtor := false;

S := stringgrid1.Rows[0].Strings[Stringgrid1.ColCount-1];
 If s <> '' then
 begin
   for j:=0 to stringgrid1.ColCount-2 do
   begin
     if stringgrid1.Rows[0].Strings[j] = S then
       gg := true;
   end;
 end;

 If gg = false then
 begin
   for i:=0 to stringgrid1.colcount - 1 do
   begin
     S := Stringgrid1.Rows[0].Strings[i];
     for j:=i+1 to stringgrid1.ColCount - 2 do
     begin
       if stringgrid1.Rows[0].Strings[j] = S then
         stringgrid1.Rows[0].Strings[j] := '#'+S;
     end;
   end;
 end else
 begin
   StringGrid1.Rows[0].Strings[StringGrid1.ColCount-1] :='$'+StringGrid1.Rows[0].Strings[StringGrid1.ColCount-1];
   For i:=StringGrid1.ColCount - 2 downto 0 do
   begin
     povtor := False;
     S := StringGrid1.Rows[0].Strings[i];
     For j:=0 to i-1 do
     begin
       If StringGrid1.Rows[0].Strings[j] = S then
         povtor := True;
     end;
     IF povtor = False then
     begin
       For j:=0 to i do
       begin
         S := Stringgrid1.Rows[0].Strings[j];
         for q:=j+1 to i do
         begin
           if stringgrid1.Rows[0].Strings[q] = S then
             stringgrid1.Rows[0].Strings[q] := '#'+S;
         end;
       end;
       Break;
     end else
     begin
       StringGrid1.Rows[0].Strings[I] := '$'+S;
     end;

   end;
 end;


ASoft   (2007-10-11 17:37:00) [4]

ну вот, так и знал...
соррисоррисорри)))оффтоп


Ping   (2007-10-11 17:24:00) [5]

это у него "ужин" плавно перешел в "жену"))

Ужин... плавно... перешел... в жену...
Кхм... простите, это как?

:-)


ASoft   (2007-10-11 17:17:00) [6]


> evvcom ©   (11.10.07 16:17) [21]

это у него "ужин" плавно перешел в "жену"))
...я б за это время уже лопнул -))


evvcom   (2007-10-11 16:17:00) [7]


> поуженаю

Что ты сделаешь? Это от слова "жена"? :)


koha   (2007-10-11 13:08:00) [8]

- счас перекушу чего-нибудь, поуженаю и продолжу.....


evvcom   (2007-10-11 13:06:00) [9]


> не множество, а вектор получается

скорее направленная ломаная :)


Dennis I. Komarov   (2007-10-11 12:54:00) [10]

P.S.
Таких множеств быть не может:
Имхо
1. {A, A} = {A}
2. {A, B} = {B, A}

Вроде так.

У тебя не множество, а вектор получается.


evvcom   (2007-10-11 12:49:00) [11]


> сорри пример с касяком......

Да, ничего. Зато уже есть чего помусолить :)


koha   (2007-10-11 12:46:00) [12]

>
>
> [14] koha   (11.10.07 12:37)
> Мне просто делать нех...й было нечего решил мозги размять
> ушло 15 мин. вместе с включением компа.


- сорри пример с касяком......


ЮЮ   (2007-10-11 12:45:00) [13]

> if StGrid2.Cells[d,c] = StGrid1.Cells[e,c] then begin
>         if fp then StGrid2.Cells[d,c]:='#'+StGrid1.Cells[d,
> c]
>         else StGrid2.Cells[d,c]:='$'+StGrid1.Cells[d,c];
>
>         fp:=true;
>       end;


Насколько я понял, у поторяющихся значений в принципе возможно три "состояния" - первый раз встретился, повторился, повиориля и к тому же последний
1,1,1,1 -> 1,#1,#1,$1


koha   (2007-10-11 12:37:00) [14]

Мне просто делать нех...й было нечего решил мозги размять ушло 15 мин. вместе с включением компа.

procedure TForm1.BitBtn1Click(Sender: TObject);
Var c,d,e: integer;
   fp: boolean; //флаг повтора
begin
 //при условии что стринг грады одинаковы в кол элементов,
 for c:=1 to StGrid2.RowCount -1 do begin
   fp:=false;
   for d:=0 to StGrid2.ColCount -1 do begin
     if StGrid2.Cells[d,c] = '' then Continue; //пустые клетки пропускаем
     for e:=0 to StGrid2.ColCount -1 do begin
       if d = e then continue;
       if StGrid2.Cells[d,c] = StGrid1.Cells[e,c] then begin
         if fp then StGrid2.Cells[d,c]:='#'+StGrid1.Cells[d,c]
         else StGrid2.Cells[d,c]:='$'+StGrid1.Cells[d,c];
         fp:=true;
       end;
     end;
   end;
 end;
end;


evvcom   (2007-10-11 11:19:00) [15]


> А вдруг, она не очень скромная?

Может быть, но мой телепатор после капремонта вроде уловил, чего ему надо. Нескромного не обнаружено :)

> Anatoly Podgoretsky ©   (11.10.07 10:31) [6]
> > # и $, здесь автор, возможно, опечатался...
> Ничего не опечатался, первое в рублях, а второе в долларах.

А... это гонорар за решение частей задачи? :)
2неугомонный: так где ответ на [2]?
Жаль, что мы так и не услышали начальника транспортного цеха (с) :-)


Dennis I. Komarov   (2007-10-11 11:12:00) [16]

> Ну, а в чем затруднения?

Ну на лекции не ходим же.

> [11] Max_   (11.10.07 10:58)

Скорее зачет или лаба.


Max_   (2007-10-11 10:58:00) [17]

школьное задание?


Leonid Troyanovsky   (2007-10-11 10:51:00) [18]


> неугомонный   (11.10.07 10:35) [7]

> здесь вроде все понятно.

Хорошо, как мы поняли, где ставить нужные пометки
тебе понятно.

Ну, а в чем затруднения?

--
Regards, LVT.


Ping   (2007-10-11 10:50:00) [19]

Вот что я думаю по этому поводу: ты или гений, или идиот.
Если тем, что собираешься реализовать, будешь пользоваться только ты, то, скорее - первое.
Если же ты собираешься впаривать это другим - то, видимо, второе; хотя, не исключено, что ты гений в квадрате...

P.S. Когда и если ты получишь Нобелевскую премию - не забудь поделиться. :-)

P.P.S. Хотя, обработка чисел в строках, да еще и именование тобою индексного массива "множеством", склоняет меня ко второму выводу.

P.P.P.S. Сформулируй задачу корректно. Правильно поставленный вопрос - уже половина ответа. Для начала - не "как я хочу это сделать", а "что мне надо". "Как я делаю" - уже понятно, но непонятно зачем.


ЮЮ   (2007-10-11 10:43:00) [20]

Ну и где решение автора?
Или он Delphi совершенно не владеет?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо