функция F=x1^x2 выводится таблица истинности
Код
0
0
0
1
Проблема заключается в том, что когда ввожу функцию состоящую из более чем 12 элементов, x1^x2^.....^x12 появляется ошибка
Нажмите для просмотра прикрепленного файла
Или если ввести например функцию состоящую из 8 элементов и многократно нажать на кнопку "Посчитать" появляется такая ошибка
Нажмите для просмотра прикрепленного файла
Также появляется ошибка
"Invalid pointer operation"
Делфи я изучаю не так давно, могу предположить что проблема связана с нехваткой памяти....
Сам алгоритм выполнения программы простой:
Пользователем вводится количество элементов, затем заполняется таблица для этих элементов, одновременно заполнятеся 2я таблица для результата с количеством строк равном количеству строк в 1й таблице.
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;
Далее пользователь вводит функцию например x1^x2^x3:
Сначала отбрасываются x получается 1^2^3, цифры соответствуют номерам столбцов 1й таблицы из которых следует брать значения
Берется 1я строка, 1-ой таблицы, цифры 1,2,3 заменяются значениями
repeat
for b:=ee to length(str4) do
begin
if (str4[b] in ['0'..'9']) then
begin
if (str4[b+1] in ['0'..'9']) then
begin
per:=1;
chislo:=copy(str4,b,2);
ch:=stringgrid1.Cells[strtoint(chislo)-1,j];
str4[b]:=ch[1];
delete(str4,b+1,1);
break;
end
else
begin
ch:=stringgrid1.cells[strtoint(str4[b])-1,j];
str4[b]:=ch[1];
end;
end;
end;
ee:=b;
inc(ee);
b:=ee;
if b>length(str4) then break;
until ee=length(str4);
получается 0^0^0
Далее запускается цикл который по определенным правилам производит определенные действия со значениями
for i:=1 to stringgrid1.colCount do
begin
while k<8 do
Begin
if length(str3)=1 then break; ///////////
inc(k);
ch:=mas[k];
for b:=p to length(str3) do
Begin
if (ch[1]=str3[b]) then Begin
case ch[1] of
'!':begin
if str3[b+1]='0' then ch1:='1'
else ch1:='0';
str3[b+1]:=ch1[1];
delete(str3,b,1);
k:=0;
p:=1;
end;
'^':Begin
if (str3[b-1]=str3[b+1])and(str3[b-1]='1') then
ch1:='1'
else ch1:='0';
str3[b-1]:=ch1[1];
delete(str3,b,2);
p:=1;
k:=0;
end;
'+':begin
if (str3[b-1]=str3[b+1]) then
ch1:='0'
else ch1:='1';
str3[b-1]:=ch1[1];
delete(str3,b,2);
p:=1;
k:=0;
end;
'v':Begin
if(str3[b-1]='1')or(str3[b+1]='1') then ch1:='1'
else ch1:='0';
str3[b-1]:=ch1[1];
delete(str3,b,2);
p:=1;
k:=0;
End;
'>':begin
if (str3[b-1]='1')and(str3[b+1]='0') then
ch1:='0'
else ch1:='1';
str3[b-1]:=ch1[1];
delete(str3,b,2);
p:=1;
k:=0;
end;
'~':begin
if ((str3[b-1]='0')and(str3[b+1]='0'))or
((str3[b-1]='1')and(str3[b+1]='1')) then
ch1:='1'
else ch1:='0';
str3[b-1]:=ch1[1];
delete(str3,b,2);
p:=1;
k:=0;
end;
'|':begin
if (str3[b-1]='1')and(str3[b+1]='1') then
ch1:='0'
else ch1:='1';
str3[b-1]:=ch1[1];
delete(str3,b,2);
p:=1;
k:=0;
end;
'<':begin
if (str3[b-1]='0')and(str3[b+1]='0') then
ch1:='1'
else ch1:='0';
str3[b-1]:=ch1[1];
delete(str3,b,2);
p:=1;
k:=0;
end;
end;
end;
end;
end;
end;
результат получается "0" значение заносится во вторую таблицу и затем берется 2я строка из 1-ой таблицы, и так пока не пройдем по всем строкам 1й таблицы.
Когда проверяю отладчиком, все нормально, т.е. алгоритм вроде правильный.
Еще небольшая проблема, тоже скорей всего связанная с памятью, если не ошибаюсь, когда ввожу больше 17 элементов компьютер зависает.
Сама программа Нажмите для просмотра прикрепленного файла
Помогите разобраться с проблемой
Заранее Благодарен за помощь.