Помощь - Поиск - Пользователи - Календарь
Полная версия: Заполнение таблицы stringgrid
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
ninja
Добрый день!

Столкнулся с такой проблемой: необходимо таблицу stringgrid заполнить значениями '1' и '0' по такому принцыпу
для 2х столбцов:
Код

00
01
10
11

для 3х столбцов
Код

000
001
010
011
100
101
110
111

Причем количество столбцов может быть любым например 10, и заполнение таблицы происходит по такому принцыпу. Помогите разобраться.
Первые 2 строчки заполнил обычным циклом, для остальных делал следующее:
Пробывал сначала бежать по каждой строчке и если встречается '1' то смотреть что после нее, если '0' , то в следующую записывалась '1' если после '1' всречалась снова '1' то '1' записывалась после текущей позиции.




k:=strtoint(kolvo_el);
stringgrid1.ColCount:=k;//количество колонок
if (k mod 2)>0 then
begin
stringgrid1.RowCount:=sqr(k);
end
else
begin
stringgrid1.RowCount:=sqr(k)+1;
end;
i:=stringgrid1.colCount-1;
j:=1;
kk:=0;
for x:=0 to stringgrid1.RowCount-1 do //stringgrid1.RowCount-1
begin
for y:=0 to stringgrid1.ColCount-1 do
begin
if x=0 then
begin
stringgrid1.Cells[i,1]:=inttostr(0);
dec(i);
end;
if x=1 then
begin
if y=0 then
begin
stringgrid1.Cells[i,2]:=inttostr(1);
dec(i);
end
else
begin
stringgrid1.Cells[i,2]:=inttostr(0);
dec(i);
end;
end;
if (x=2)or(x>2){and(x<>stringgrid1.ColCount-1)} then
begin
if i=0 then
begin
i:=stringgrid1.ColCount-1;
end;
if stringgrid1.Cells[i,j-1]=inttostr(1) then
begin
if stringgrid1.Cells[i-1,j-1]=inttostr(0) then
begin
stringgrid1.Cells[i-1,j]:=inttostr(1);
end;
if stringgrid1.Cells[i-1,j-1]=inttostr(1) then
begin
stringgrid1.Cells[i+1,j]:=inttostr(1);
end;
{stringgrid1.Cells[i,j]:=inttostr(1); }

end;

stringgrid1.cells[i,j]:='0';
dec(i);
end;

end;
{if (x=0)or(x=1)or(y=0) then}
i:=stringgrid1.ColCount-1;
inc(j);
end;
end;



Затем пробывал бежать по каждому столбцу т.е. если последний столбец, то заполняется так 0,1,0,1,0,1......
предпоследний так 00,11,00,11,00........ и т.д. Тут столкнулся с проблемой как реализовать такой цикл.


kolvo_el:=edit1.Text;
label1.Caption:=kolvo_el;
k:=strtoint(kolvo_el);
stringgrid1.ColCount:=k;//количество колонок
if (k mod 2)>0 then
begin
stringgrid1.RowCount:=sqr(k);
end
else
begin
stringgrid1.RowCount:=sqr(k)+1;
end;
i:=stringgrid1.colCount-1;
j:=1;
kk:=0;
for y:=0 to stringgrid1.RowCount-1 do
begin
for m:=0 to 1 do
begin
stringgrid1.Cells[i,j]:=inttostr(m);
inc(j);
end;
end;
//i:=stringgrid1.ColCount-1;
end;



P.S. Заранее благодарен за помощь
volvo
На самом деле все проще:

procedure TForm1.Button1Click(Sender: TObject);
var X, T, myCol: integer;
begin
StringGrid1.RowCount := 1 shl StringGrid1.ColCount;
for X := 0 to StringGrid1.RowCount - 1 do
begin
T := X;
for myCol := StringGrid1.ColCount downto 1 do
begin
StringGrid1.Cells[myCol - 1, X] := IntToStr(T mod 2);
T := T div 2;
end;
end;
end;
- делает то, что тебе надо... При условии, что у СтрингГрида FixedRows = 0 и FixedCols = 0...
ninja
Огромное спасибо, все получилось. smile.gif
TarasBer
inttostr(1) - в цитатник
Я бы добавил к решению Вольво то, что в данном случает логичнее вместо div 2 писать shr 1 (это не только быстрее, это действительно логичнее - ведь нам нужно двоичное разложение числа), а вместо StringGrid1.Cells[myCol - 1, X] := IntToStr(T mod 2);
логичнее
if odd(t) then StringGrid1.Cells[myCol - 1, X] := '1'
else StringGrid1.Cells[myCol - 1, X] := '0';
andriano
Не согласен по обоим пунктам.
Цитата(TarasBer @ 20.09.2009 14:40) *

inttostr(1) - в цитатник
Я бы добавил к решению Вольво то, что в данном случает логичнее вместо div 2 писать shr 1 (это не только
быстрее, это действительно логичнее - ведь нам нужно двоичное разложение числа),
Это не просто нелогично, это аппаратнозависимо, т.к. будет выполняться только на компьютерах с двоичным представлением информации (а есть еще и троичные, хоть это и экзотика).
Но аппаратная зависимость, которая в данном случае налицо, здесь совершенно не нужна.
Цитата

а вместо StringGrid1.Cells[myCol - 1, X] := IntToStr(T mod 2);
логичнее
if odd(t) then StringGrid1.Cells[myCol - 1, X] := '1'
else StringGrid1.Cells[myCol - 1, X] := '0';
И чем это логичнее?
Что будет быстрее выполняться - также сказать трудно.
Зато исходный вариант короче в записи и, на мой взгляд, нагляднее.
TarasBer
Цитата(andriano @ 20.09.2009 16:22) *

Не согласен по обоим пунктам.
Это не просто нелогично, это аппаратнозависимо, т.к. будет выполняться только на компьютерах с двоичным представлением информации (а есть еще и троичные, хоть это и экзотика).

Бывает, кирпичи на голову падают.
Цитата

Но аппаратная зависимость, которая в данном случае налицо, здесь совершенно не нужна.И чем это логичнее?
Что будет быстрее выполняться - также сказать трудно.
Зато исходный вариант короче в записи и, на мой взгляд, нагляднее.

Хорошо, StringGrid1.Cells[myCol - 1, X] := char((T and 1) + byte('0'));
Только не надо говорить про зависимость от кодировки.
ninja
Сталкнулся еще с одной проблемой:
Мне необходимо теперь по определенным правилам например если это сложение то сложить определенные столбцы т.е. Все условие моей задачи состоит в том чтобы вывести таблицу истиности для заданной формулы, причем количество переменных неограничено. Например данно 2 переменных x1 и x2 и сама функция x1^x2
^ - умножение
выводится таблица для 2х переменных
Код

00
01
10
11


результат должен получается такой

0
0
0
1



Проблема в реализации т.е.
Я сначала пробегаю по строке отбрасываю x и функция принимает вид 1^2.....
для 3x переменных я сделал:


repeat
for k:=kk to length(str1) do
begin
case str1[k] of
'1':begin
xx:=1;
end;
'2':begin
yy:=1;
end;
'3':begin
zz:=1;
end;
'f':begin
ff:=1;
end;
'^':begin
kon:=1;
end;
'|':begin
dez:=1;
end;
'+':begin
sloj:=1;
end;
'>':begin
impl:=1;
end;
'~':begin
ekviv:=1;
end;
'-':begin
shtrix:=1;
end;
'<':begin
strelka:=1;
end;
'!':begin
otric:=1;
end;
end;
if ((xx=1)and(yy=1)) then begin
break;
end;
if ((xx=1)and(zz=1)) then begin
break;
end;
if ((xx=1)and(ff=1)) then begin
break;
end;
if ((yy=1)and(zz=1)) then begin
break;
end;
if ((yy=1)and(ff=1)) then begin
break;
end;
if ((zz=1)and(ff=1)) then begin
break;
end;
if ((otric=1)and(xx=1)) then begin
break;
end;
if ((otric=1)and(yy=1)) then begin
break;
end;
if ((otric=1)and(zz=1)) then begin
break;
end;
if ((otric=1)and(ff=1)) then begin
break;
end;
end;
if ((xx=1)and(yy=1)) then
begin
if kon=1 then
begin
j:=1;
repeat
znach1:=strtoint(stringgrid1.Cells[0,j]);
znach2:=strtoint(stringgrid1.Cells[1,j]);
stringgrid1.Cells[3,j]:=inttostr(znach1*znach2);
inc(j);
until j=9;
xx:=0;
yy:=0;
zz:=0;
ff:=1;
kon:=0;
end;
if dez=1 then
begin
j:=1;
repeat
znach1:=strtoint(stringgrid1.Cells[0,j]);
znach2:=strtoint(stringgrid1.Cells[1,j]);
if ((znach1=0)and(znach2=0))then
stringgrid1.Cells[3,j]:=inttostr(0)
else
stringgrid1.Cells[3,j]:=inttostr(1);
inc(j);
until j=9;
xx:=0;
yy:=0;
zz:=0;
ff:=1;
kon:=0;
dez:=0;
end;
.......................
........................
.......................
......................
kk:=k;
inc(kk);
k:=kk;
if k>length(str1) then break;
until k=length(str1);



Если переменных 3, 1^2^3, то сначала выполняется 1^2 переменной ff:=1 и зазем выполняется ff^3
Получается все очень громоздко, если есть идеи пожалуйста поделитесь.

Спасибо.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.