2013-09-27 3 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

Ничто не выпрыгивает как очевидный вопрос, хотя я не прикоснулся Pascal годами. Вы пробовали пройти через код? Что вы прокомментируете в теле 'Line', он все еще застревает? - Я ржавый здесь, если у вас есть эта полуплотность в конце определения процедуры? – asawyer

ответ

3

Вы используете один и тот же глобальный счетчик цикла переменной i в двух местах на то же время (внутри Line и в кольце основного тела, которое его вызывает). (Это одна из причин того, что глобальные переменные плохо, кстати.)

// 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; 
Смежные вопросы