PROGRAM Bissec;
  {Este programa calcula raiz pelo metodo da BISSECAO}
  USES CRT,PRINTER;
  CONST
    maximo_de_iteracoes = 20; { numero maximo de iteracoes permitidas }
    Equacao = 'COS (x) -  x*x  = 0 '; { equacao a ser resolvida }
  VAR
    inicio_do_intervalo,fim_do_intervalo,ponto_medio,funcao_no_inicio,
    funcao_no_fim,funcao_no_meio,intervalo_inicial,intervalo_atual,
    tolerancia :    REAL;

    i,numero_de_iteracoes :   INTEGER;

  FUNCTION Funcao ( x : REAL ) : REAL;

    BEGIN  { Funcao }
      Funcao := COS ( x ) - x*x;
    END; { Funcao }

  BEGIN { Bissec }
    CLRSCR;
    WRITELN ('Calculo da raiz da equacao ',Equacao,' ( metodo da bissecao )');
    WRITELN ( 'Forneca o inicio e o fim do intervalo, ',
               'bem como a tolerancia desejada');
    WRITE ( 'Ponto inicial '); READLN ( inicio_do_intervalo );
    WRITE ( 'Ponto final '); READLN ( fim_do_intervalo );
    WRITE ( 'Tolerancia '); READLN ( tolerancia );
    WRITELN (Lst, 'Calculo da raiz da equacao ',Equacao,
                        ' ( metodo da bissecao )');
    WRITELN (Lst, 'Inicio do intervalo -> ',inicio_do_intervalo:4:1);
    WRITELN (Lst, 'Fim do intervalo    -> ',fim_do_intervalo:4:1);
    WRITELN (Lst, 'Tolerancia          -> ',tolerancia:6:4);
    funcao_no_inicio := Funcao ( inicio_do_intervalo );
    funcao_no_fim := Funcao ( fim_do_intervalo );
    intervalo_atual := fim_do_intervalo - inicio_do_intervalo;
    i := 0;
    REPEAT
      ponto_medio := ( inicio_do_intervalo + fim_do_intervalo ) / 2;
      funcao_no_meio := Funcao ( ponto_medio );
      IF funcao_no_meio * funcao_no_inicio > 0
        then   inicio_do_intervalo := ponto_medio
        else   fim_do_intervalo := ponto_medio;
      intervalo_atual := intervalo_atual / 2;
      i := i + 1;
    UNTIL  ( intervalo_atual < tolerancia ) OR ( funcao_no_meio = 0 )
          OR ( i > maximo_de_iteracoes );
    if ( funcao_no_meio = 0 ) OR (intervalo_atual < tolerancia )
      THEN WRITELN (Lst, ' A raiz vale ',ponto_medio:8:4 )
      ELSE WRITELN (Lst, ' Nao houve convergencia com ',maximo_de_iteracoes,
                     ' iteracoes ');
      READ
END.  { Fim do Bissec }

