![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Маленькая помощь в скромной задачке :)
неугомонный © (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 совершенно не владеет?