这个程序有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;

解决方案 »

  1.   


    这里有问题
      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;
      

  2.   

    没有细看。貌似
    SETLENGTH(COUNTERS,12)====>COUNTERS[0],COUNTERS[1]......COUNTERS[11]
    所以,改用SETLENGTH(COUNTERS,13)即可,其中COUNTERS[0]空着不用。
      

  3.   

      x := 0;   for i := 1 to 12 do 
      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); 
      

  4.   


      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;
      

  5.   

    忘了把
    Edit_VisibleData.Text := IntToStr(x); 
    改为
    Edit_VisibleData.Text := IntToStr(j); 
      

  6.   

    编译器报错,Division by zore
      

  7.   

    按你的思路改下你的代码:
      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;
      

  8.   

    原来的代码写法比较冗长, 而且在counters的使用上还存在着问题(动态数组的下标是从0开始的)
    修改成这样试试: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;