for循环在达到目标后继续进行。德尔福

时间:2017-10-08 14:27:43

标签: delphi for-loop delphi-7

此问题仅显示数字,大于12,包括。

这两张照片一次拍摄。怎么可能呢?

For循环必须从0到12-1 = 11,不是吗?

然而,当我使用while循环时,它可以正常工作。

是我的错还是德尔福?

P.S。代码下来吼叫。 1 1

unit Unit1;
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Label1: TLabel;
    Button3: TButton;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  n:Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);    //Button, that sets array length
var
  i, index:Integer;
begin
    val(Edit1.Text, n, index);                  
    if(index<>0) then
    begin
      ShowMessage('Wrong number');
      Edit1.Clear();
      exit;
    end;
    StringGrid1.ColCount:=n;
    for i:=0 to n-1 do                           
      StringGrid1.Cells[i,0]:=IntToStr(i+1);
    StringGrid1.SetFocus();
end;

procedure TForm1.Button2Click(Sender: TObject);        //Main button
var
  i, index:Integer;
  a:array[0..10] of Real;
  denom, sum:Real;
begin
  i:=0;
  sum:=0;
  denom:=-1;

 //that for loop from screenshot is here

  for i:=0 to n-1 do
  //while i<=(n-1) do
  begin
    Val(StringGrid1.cells[i,1], a[i], index);    
    if(index<>0) then
    begin
      ShowMessage('Wrong number with ' + IntToStr(i+1) + ' Id');
      StringGrid1.Col:=i;
      StringGrid1.Row:=1;
      StringGrid1.SetFocus();
      exit;
    end;
    a[i]:=a[i]/denom;                            
    sum:=sum+a[i];
    StringGrid1.Cells[i,2]:=FloatToStrF(a[i],ffFixed,5,3);    
    denom:=-denom*(i+2);
    //Inc(i);
    end;
    Label2.Caption:=FloatToStrF(sum,ffFixed,5,3);
end;

//code down bellow just allow to go to another cell by pressing Enter


procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if  (Key=#13) and (StringGrid1.Col=(n-1)) then   
      Button2.SetFocus()
  else if (Key=#13) and (StringGrid1.Col<>(n-1)) then
      StringGrid1.Col:=StringGrid1.Col+1;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Close();
end;

end.

2 个答案:

答案 0 :(得分:-1)

至于回答你的问题'这怎么可能'......

在你的屏幕中,n是12.正如Kermation所指出的,a的最高索引是10,所以当我是11时,除非你激活了范围检查,否则当你写入[11]时(i = 11) )你会覆盖别的东西。这是在局部变量区域中,因此它可能是i,或者甚至是内部变量,你看不到像for循环所用的限制,它是在循环开始时计算的。一旦你允许这种情况发生,几乎任何事情都是可能的。

当然,问题的确切表现将从编译器的一个版本到另一个版本。在一个版本中,您可能会侥幸逃脱。在另一个你不会。

答案 1 :(得分:-2)

数组a的大小较小,然后是较小的数量。