这个程序有12个Edit控件,但是不能确定这12个Edit控件中哪些有内容(只能是整数,其它类型不用考虑),程序的任务就是 算出这些有内容的EDit中的整数的最大公约数。代码如下:function GCD(var x, y : integer) : Integer; //最大公约数
var z : Integer;
begin
repeat
z := x mod y;
x := y;
y := z
until z = 0;
Result := x;
end;procedure TForm_Counter.btnGCDClick(Sender: TObject);
var
EditText : array[1..12] of TEdit;
counters : array of Integer;
i, j : Integer;
x, y, z : Integer;
begin
EditText[1] := edtdata1;
EditText[2] := edtdata2;
EditText[3] := edtdata3;
EditText[4] := edtdata4;
EditText[5] := edtdata5;
EditText[6] := edtdata6;
EditText[7] := edtdata7;
EditText[8] := edtdata8;
EditText[9] := edtdata9;
EditText[10] := edtdata10;
EditText[11] := edtdata11;
EditText[12] := edtdata12;
y := 0;
x := 0;
z := 0;
SetLength(counters,12);
for i := 1 to 12 do
begin
if EditText[i].Text <> '' then
begin
counters[i] := StrToInt(edittext[i].Text);
y := y + 1;
end
else Break;
end;
SetLength(counters,y);
j := gcd(counters[1], counters[2]);
while (z <= y) do
begin
x := gcd(j, counters[y]);
Inc(z);
end;
Edit_VisibleData.Text := IntToStr(x);
end;
var z : Integer;
begin
repeat
z := x mod y;
x := y;
y := z
until z = 0;
Result := x;
end;procedure TForm_Counter.btnGCDClick(Sender: TObject);
var
EditText : array[1..12] of TEdit;
counters : array of Integer;
i, j : Integer;
x, y, z : Integer;
begin
EditText[1] := edtdata1;
EditText[2] := edtdata2;
EditText[3] := edtdata3;
EditText[4] := edtdata4;
EditText[5] := edtdata5;
EditText[6] := edtdata6;
EditText[7] := edtdata7;
EditText[8] := edtdata8;
EditText[9] := edtdata9;
EditText[10] := edtdata10;
EditText[11] := edtdata11;
EditText[12] := edtdata12;
y := 0;
x := 0;
z := 0;
SetLength(counters,12);
for i := 1 to 12 do
begin
if EditText[i].Text <> '' then
begin
counters[i] := StrToInt(edittext[i].Text);
y := y + 1;
end
else Break;
end;
SetLength(counters,y);
j := gcd(counters[1], counters[2]);
while (z <= y) do
begin
x := gcd(j, counters[y]);
Inc(z);
end;
Edit_VisibleData.Text := IntToStr(x);
end;
这里有问题
SetLength(counters,12); //12个
for i := 1 to 12 do
begin
if EditText[i].Text <> '' then
begin
counters[i] := StrToInt(edittext[i].Text);
y := y + 1;
end
else Break;
end; //此时counters是12长度,但是y不一定是12
SetLength(counters,y); //counters改成y,但是counters只是把后面的截掉了,counters中依然有未和edit对应的数据比如counters[11]的edit值为空,那counters[11]的值很可能巨大,因为你没有处理,循环后,假如y=11,SetLength(counters,y)后counters为11长度,但是counters[11]的值并没有变,你可以在循环时处理一下无值的edit,
for i := 1 to 12 do
begin
counters[i] := StrToIntDef(edittext[i].Text,0);//如果无数据,置为0
end;
SETLENGTH(COUNTERS,12)====>COUNTERS[0],COUNTERS[1]......COUNTERS[11]
所以,改用SETLENGTH(COUNTERS,13)即可,其中COUNTERS[0]空着不用。
begin
y := StrToIntDef(edittext[i].Text, 0);
if x = 0 then
x := y
else if y <> 0 then
x := gcd(x, y);
end; Edit_VisibleData.Text := IntToStr(x);
y := 0;
x := 0;
z := 0;
SetLength(counters,12);
for i := 1 to 12 do
begin
if EditText[i].Text <> '' then
begin
y := y + 1;
//counters[i] := StrToInt(edittext[i].Text);
counters[y] := StrToInt(edittext[i].Text);
end;
//else Break;
end;
//SetLength(counters,y);
j := gcd(counters[1], counters[2]);
z:=3;
//while (z <= y) do
while ((z <= y) and (j<>1))do //当j等于1时,就没必要再算了,最大公约数就为1了
begin
//x := gcd(j, counters[y]);
j := gcd(j, counters[z]);
Inc(z);
end;
Edit_VisibleData.Text := IntToStr(x);
end;
Edit_VisibleData.Text := IntToStr(x);
改为
Edit_VisibleData.Text := IntToStr(j);
var
EditText : array[1..12] of TEdit;
counters : array of Integer;
i, j : Integer;
x, y, z : Integer;
begin
EditText[1] := edtdata1;
EditText[2] := edtdata2;
EditText[3] := edtdata3;
EditText[4] := edtdata4;
EditText[5] := edtdata5;
EditText[6] := edtdata6;
EditText[7] := edtdata7;
EditText[8] := edtdata8;
EditText[9] := edtdata9;
EditText[10] := edtdata10;
EditText[11] := edtdata11;
EditText[12] := edtdata12;
y := 0;
x := 0;
z := 2;
SetLength(counters,13);
for i := 1 to 12 do
begin
if EditText[i].Text <> '' then
begin
counters[i] := StrToInt(edittext[i].Text);
y := y + 1;
end
else
Break;
end;
j := gcd(counters[1], counters[2]);
x:=j;
while (z < y) do
begin
x := gcd(j, counters[z+1]);
Inc(z);
end;
Edit_VisibleData.Text := IntToStr(x);
end;
修改成这样试试:procedure TForm_Counter.btnGCDClick(Sender: TObject);
const
N = 12; //输入框的数量, 输入框的Name是edtdata??这样的形式
var
counters: array of Integer;
AEdit : TEdit;
i, j, k : Integer;
begin
SetLength(counters, N);
j := 0;
for i := 1 to N do
begin
AEdit := TEdit(FindChildControl('edtdata'+ IntToStr(i)));
if (AEdit <> nil) and (AEdit.Text <> '') then
begin
counters[j] := StrToInt(AEdit.Text);
inc(j);
end;
end;
if j >= 2 then
begin
k := gcd(counters[0], counters[1]);
for i := 2 to j - 1 do k := gcd(k, counters[i]);
end
else if j >= 1 then
k := counters[0]
else
k := -1; if k = -1 then
Edit_VisibleData.Text := '没有输入任何数值'
else
Edit_VisibleData.Text := IntToStr(k);
end;