2017-10-08 107 views
-2

這個問題只出現在數字上,更大,然後12包括。For循環在達到目標後繼續前進。德爾福

這兩張照片在一次拍攝。它甚至可能如何?

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. 
+3

[看這裏](https://stackoverflow.com/a/35478474/2292722)瞭解如何在各種情況下使用*循環控制變量*。 –

+0

帶有退出語句的循環?我甚至不需要閱讀你的代碼就可以知道它們在這裏是錯誤的邏輯。如果循環必須停止一個條件,比使用條件循環(重複,直到或同時執行)而不是無條件循環。當你的循環之後的所有代碼都不會在退出時被執行。這是很難讀的代碼 – GuidoG

回答

-2

陣列a尺寸較小,則細胞的量。

+1

雖然你是對的,但你不能解釋爲什麼這可能很重要。 – Dsm

+0

您應該像@Dsm所說的那樣爲您的回答添加解釋,或者將其刪除,imo。 – MartynA

-1

至於回答你的「這怎麼可能連」的問題...

在你的屏幕,n爲12。正如Kermation指出,一個最高的指數是10,所以,當我是11,除非你有範圍檢查激活,當你寫信給[11](i = 11)時,你會覆蓋別的東西。這是在局部變量區域,所以它可能是我,例如,甚至內部變量,你看不到像循環開始時計算的for循環的限制。一旦你允許這發生,幾乎任何事情都是可能的。

當然,問題的確切表現形式將從編譯器的一個版本到另一個版本。在一個版本中,你可能會擺脫它。在另一個你不會。