2013-09-27 87 views
1

爲什麼程序會影響循環?爲什麼程序會影響循環?

當我把Line放在for -loop中時,它使得它變得無窮無盡,我只能關閉控制檯窗口並丟失所有未保存的數據。

這裏是我的程序的完整代碼,並有評論(末)這點問題:

uses crt; 
var 
n, i :integer; 
a, b, h, x, res :real; 


function func_1(y :real) : real; 
    begin 
    func_1:= (y*y*y*y) * (1 + sin(y) * sin(y)); 
    end; 


function func_2(y :real) : real; 
    begin 
    func_2:= sin(y/2)/cos(y/2); 
    end; 


function func_3(y :real) :real; 
    begin 
    func_3:= sin(y) * cos(y); 
    end; 

procedure Line(sideSymbolLeft: char; usualSymbol: char; 
       divideSymbol: char; sideSymbolRight: char); 
    begin 
    write(char(sideSymbolLeft)); 
    for i := 2 to 75 do 
     begin 
     write(char(usualSymbol)); 
     if ((i mod 19) = 0) then 
      write(char(divideSymbol)); 
     end; 
    writeln(char(sideSymbolRight)); 
    end; 


begin 
    clrscr; 

    a:= 0; 
    b:= 2 * pi; 
    n:= 7; 
    h:= (b - a)/n; 


    Line(char(201), char(205), char(205), char(187)); 
    writeln(char(186),'Functions of one variable':50,char(186):28); 
    Line(char(204), char(205), char(203), char(185)); 
    writeln(char(186),' Argument X ',char(186),' x^4*(1+sin^2(x)) ', 
      char(186),'  tg(x/2)  ',char(186),' sin(x)*cos(x) ',char(186)); 

    for i:= 0 to n do (* calculating all Xs (arguments) *) 
    begin 
     x:= a + (i * h); 
     write(' '); 
     write(x:8:3); 

     res:= func_1(x); 
     write('    '); 
     write(res:8:3); 

     res:= func_2(x); 
     write(' '); 
     write(res:8:3); 

     res:= func_3(x); 
     write('   '); 
     writeln(res:8:3); 

     (* HERE IS THAT PROCEDURE *) 
     (* When I put it here, the loop becomes endless *) 
     (* and I have to close the console (and lose all unsaved data) *) 
     Line(char(204), char(205), char(203), char(185)); 

    end; 


    readln; 
end. 
+0

沒有什麼是跳出作爲一個明顯的問題,雖然我還沒有觸及帕斯卡爾年。你有沒有嘗試單步執行代碼?你在評論'Line'的身體時,是否仍然卡住? - 我在這裏生鏽了,如果你在程序定義的最後有這個分號? – asawyer

回答

3

您使用的是相同的全局循環計數變量i在兩個地方的同時(在Line內部以及調用它的主體循環中)。 (這是一個全局變量是不好的原因之一,BTW)

// In Line() 
for i := 2 to 75 do 

// In calling code 
for i:= 0 to n do (* calculating all Xs (arguments) *) 

這意味着,每一次第二循環運行,並調用Line(),計數器會重新置位(內Line)至2

添加本地變量中Line有處理計數器來代替:

procedure Line(sideSymbolLeft: char; usualSymbol: char; 
       divideSymbol: char; sideSymbolRight: char); 
var 
    Ctr: Integer; 
begin 
    write(char(sideSymbolLeft)); 
    for Ctr := 2 to 75 do 
    begin 
    write(char(usualSymbol)); 
    if ((Ctr mod 19) = 0) then 
     write(char(divideSymbol)); 
    end; 
    writeln(char(sideSymbolRight)); 
end; 
相關問題