\documentclass[11pt]{article}

%% Escrevendo em português
\usepackage[brazil]{babel}
\usepackage[latin1]{inputenc}
%\usepackage{isolatin1}

%% Tamanho da página
\setlength{\textwidth}{17cm}
\setlength{\textheight}{23cm}

%% Parágrafo
\setlength{\parindent}{5mm}
\setlength{\parskip}{1mm}

%% Empurra para cá empurra para lá
\evensidemargin -0.3cm
\oddsidemargin -0.3cm
\topmargin -0.7in

%% Figuras  eps
\usepackage{graphics}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\hfill {\small Departamento de Ciência da Computação -- IME-USP}

\begin{center}
  \textbf{\large MAC 115 -- Introdução à Computação para Ciências Exatas e
    Tecnologia}
  
  \textsc{Instituto de Física  -- Segundo Semestre de 2001 -  Bacharelado Noturno}
\end{center}

\noindent
Segundo Exercício-Programa (EP2)\hfill Prazo de entrega: 29 de outubro de 2001

\begin{center}
  \underline{\Large Lojas MacBrás}
\end{center}

\noindent 

A crise econômica afugentou os clientes das Lojas MacBrás. Para
atraí-los de volta, os Srs.~Sabitudo e Sabinada, diretores da famosa
rede de lojas, decidiram flexibilizar as formas de pagamento e de
crédito aos clientes.

Por causa da variação constante dos juros no país, e da alteração dos
preços dos produtos devido às promoções, os diretores depararam-se com
o seguinte problema: {\it como prover os vendedores com uma ferramenta
  que lhes permitam responder `num piscar de olhos' as questões
  formuladas pelos clientes a respeito dos diversos planos de
  crediário já existentes, ou sobre outros possíveis planos que sejam
  compatíveis com a disponibilidade financeira dos clientes?}

Para resolver esse problema, os diretores Sabitudo e Sabinada, cientes
da boa fama dos estudantes do Bacharelado noturno da Física da USP,
contrataram {\bf você} (você mesmo!) como programador(a),
incumbindo-o(a) de fazer um programa que seja capaz de calcular
algumas opções de crédito, descritas a seguir.

Você pode considerar que todos os planos de pagamento têm prestações e
juros fixos. A primeira prestação é paga sempre no ato da compra.
Você pode assumir também que os juros são sempre positivos e não
maiores que $200\%$ ao mês.  As fórmulas dadas também consideram que
os juros estão na forma fracionária, ou seja, um juro de $5\%$
corresponde nas fórmulas ao valor  $0,05$.

A seguir descrevemos os vários problemas (opções de crédito)
levantados pelos diretores, e indicamos como você pode resolver esses
problemas. Temos certeza que, como um bom(boa) aluno(a) da disciplina
MAC115, você irá se desincumbir muito facilmente desta tarefa!



\section{Cálculo do valor à vista}

Um dos problemas levantados é o de saber o valor à vista
correspondente a um plano de pagamento.

Ou seja, deseja-se calcular o valor à vista $v$, dados o número $n$ de
meses, o valor $p$ de cada prestação e o valor $j$ dos juros mensais
cobrados. Sabe-se que vale a igualdade
\[
v = p + \frac{p}{1+j} + \frac{p}{(1+j)^{2}} +\cdots+ \frac{p}{(1+j)^{n-1}}.
\]
Como a soma acima é a soma de uma progressão geométrica, a fórmula
pode ser simplificada para
\begin{equation}
v = \frac{p}{j}\left(1+j - \frac{1}{(1+j)^{n-1}}\right).
\label{eq:ValorAtual}
\end{equation}

\section{Cálculo do valor das prestações}

Outro problema levantado é o de calcular o valor das prestações quando
são dados o valor à vista $v$, o número de prestações $n$ e os juros
$j$ cobrados.

O cálculo pode ser facilmente deduzido de (\ref{eq:ValorAtual}):
\[
p=\frac{vj}{1+j - 1/(1+j)^{n-1}}.
\]

\section{\label{juros}Cálculo do valor dos juros}

O próximo problema é calcular o valor $j$ dos juros, dados o valor à
vista $v$, o valor $p$ das prestações e o número $n$ de prestações
mensais. Neste caso, o problema consiste em encontrar um $j$ que torne
a seguinte função $f(j)$ igual a zero (compare com
(\ref{eq:ValorAtual})):
%Portanto, buscamos um $j$ tal que
%\[
%v = \frac{p}{j}\left(1+j - \frac{1}{(1+j)^{n-1}}\right).
%\]
%Ou seja, queremos calcular o zero da função
\begin{equation}
f(j)=v - \frac{p}{j}\left(1+j - \frac{1}{(1+j)^{n-1}}\right).
\label{eq:fj}
\end{equation}

O método que você deve implementar para calcular o zero dessa função é
descrito na Seção \ref{sec:ZeroFuncao}.

\section{Cálculo do número de prestações}

Dado um valor à vista $v$, um juro mensal $j$ e um valor máximo de
prestação $p$, o próximo problema é o de determinar o número de meses
e o valor exato da prestação a ser paga.  O valor exato a ser
encontrado é fixo e é o maior possível (menor que $p$).  Um detalhe:
os diretores não permitem fazer um crediário que ultrapassasse $8$
anos (96 meses).  O método que você deve implementar é o seguinte:
\begin{enumerate}
\item Fixe $j$ e $p$ e calcule o menor $n$ para o qual o valor à vista é
  maior ou igual a $v$, considerando-se o valor dado de $p$. (Como é
  bom ter um computador para fazer esse tipo de busca!) Note que, 
como o número de prestações tem que ser no máximo $96$ (8 anos), 
para que tal $n$ exista, é necessário e suficiente que
\[
v < \frac{p}{j}\left(1+j - \frac{1}{(1+j)^{96-1}}\right).
\]
\item Tendo encontrado o valor de $n$ (do item anterior),
 precisamos encontrar $p' \leq p$ para o qual
\[
v = \frac{p'}{j}\left(1+j - \frac{1}{(1+j)^{n-1}}\right).
\]
\end{enumerate}


\section{Funções a serem implementadas}

O seu programa deve, obrigatoriamente, conter {\it pelo menos} as
seguintes funções. Encorajamos você a implementar outras funções 
(à sua escolha). 

{\small
\begin{enumerate}
\item 
\begin{verbatim}
double pot(double x, int n);
/* Dados um valor real x e um inteiro n >= 0, a função devolve o     */
/* valor da enésima potência de x.                                   */
\end{verbatim}
\item
\begin{verbatim}
double valor_a_vista(double p, double j, int n);
/* Dados o valor da prestação p, o valor dos juros j e o número de   */
/* prestações n, a função devolve o valor à vista correspondente.    */
\end{verbatim} 
\item 
\begin{verbatim}
double valor_prestacao(double v, double j, int n);
/* Dados o valor à vista v, o valor dos juros j e o número de         */
/* prestações n, a função devolve o valor da prestação a ser pago.    */ 
\end{verbatim}
\item 
\begin{verbatim}
double valor_juros(double v, double p, int n);
/* Dados o valor à vista v, o valor das prestações p e o número de    */
/* prestações n, a função devolve o valor dos juros que está sendo    */
/* cobrado.                                                           */
\end{verbatim}
\item 
% 
% \begin{verbatim}
% int num_prest(float v, float *p, float j, int *n);
% /* Os dados de entrada são o valor a vista v, o valor máximo a ser    */
% /* pago em cada prestação *p, o valor de juros cobrado j. Caso seja  */
% /* possível o pagamento do valor a vista v, a função devolve 1 e      */
% /* calcula o número *n de prestações e o valor exato de cada          */
% /* prestação, atribuindo esse valor à própria variável *p. Caso não    */
% /* seja possível o pagamento do valor a vista v, a função devolve 0.  */ 
% \end{verbatim}
% \item 
\begin{verbatim}
double  acha_zero(double v, double p, int n);
/* Esta função devolve o valor de j para o qual a função f(j) da      */
/* Seção 3 tem valor zero.                                            */
\end{verbatim}
\end{enumerate}
}

\section{Entrada e Saída}

Os dados de entrada serão lidos de um arquivo. (Para isso, você deve
executar o seu programa usando comandos de redirecionamento. O seu
professor irá explicar como fazer isso.) O nome do arquivo de entrada
deve ser, {\bf obrigatoriamente, ``entrada.txt''}.  A primeira linha
desse arquivo deve conter um número inteiro indicando quantos
problemas deverão ser analisados. A seguir, cada linha do arquivo
estará correspondendo a um problema e conterá um caractere seguido de
três números reais ou de dois números reais e um terceiro número
inteiro.  Mais precisamente, você deve prever $4$ casos:
\begin{enumerate}
\item se o primeiro caractere é um `v', os números correspondem, na
  ordem, ao valor da prestação, ao valor dos juros e ao
  número de meses. Neste caso, desejamos encontrar o valor à vista
  correspondente.
\item se o primeiro caractere é um `p', os números correspondem, na
  ordem, ao valor à vista a ser pago, ao valor dos juros e ao
  número de meses. Neste caso, desejamos encontrar o valor da prestação.
\item se o primeiro caractere é um `j', os números correspondem, na
  ordem, ao valor à vista a ser pago, ao valor da prestação e ao
  número de meses. Neste caso, desejamos encontrar o valor dos
  juros. Você pode supor que o valor à vista é menor que o número de
  meses multiplicado pelo valor das prestações.
\item se o primeiro caractere é um `n', os números correspondem, na
  ordem, ao valor à vista a ser pago, ao valor máximo da prestação e
  ao valor dos juros. Neste caso, desejamos
  encontrar, se possível, o número de meses e o valor exato da
  prestação. 
\end{enumerate}

A saída deverá também ser gravada em um arquivo chamado,
\textbf{obrigatoriamente}, de \textbf{``saida.txt''}.
O arquivo de saída deve conter um cabeçalho com pelo menos
o seu nome e número usp.
A cada linha do arquivo de entrada devem corresponder três linhas do
arquivo de saída. A primeira linha mostra os dados de entrada,
a segunda linha a resposta calculada e a terceira linha fica em branco.

\subsection{\label{exemplo}Exemplo de Entrada e Saída}

Considere que o arquivo ``entrada.txt'' tenha o seguinte conteúdo.
{\small
\begin{verbatim}
19
v  70.00   3.2   15
p 850.05   3.2   15
n 850.05  70.0  3.2 
j 850.05  70.0   15
v  70  1  15
p 980.26 1  15
n 980.25 70.0  1
j 980.25 70.0  15
v  90 50 2
p 150 50 2
n 150 90 50
j 150 90 2
v 1000 200 10
p 1499.97 200 10
n 1499.97 1000 200
j 1499.97 1000 10
n 1200 100 10
n 20810 1000 5
n 20805.8 1000 5
\end{verbatim}
}
Um possível arquivo ``saida.txt'' é mostrado a seguir.
Como os valores obtidos abaixo envolvem contas com números
reais, podem ocorrer pequenas divergências entre os resultados abaixo
e os seus resultados, devido a erros de arredondamento.
{\small
\begin{verbatim}
*******************************************************
*****                                              ****
*****  Segundo Exercicio Programa MAC115           ****
*****  Processamento do arquivo entrada.txt        ****
*****  Programa escrito por: Espertinho Começacedo ****
*****  Numero USP: 9914045                         ****
*****  Professor: Ajudador dos Esforçados          ****
*****  Turma: xx                                   ****
*****                                              ****
*******************************************************

Prestacao = 70.00   Juros = 3.20%   Meses = 15
Valor `a vista: 850.05

Valor `a vista = 850.05   Juros = 3.20%   Meses = 15
Valor da prestacao: 70.00

Valor `a vista = 850.05   Prestacao = 70.00   Juros = 3.20%
Valor da prestacao: 70.00   Numero de meses: 15

Valor `a vista = 850.05   Prestacao = 70.00   Meses = 15
Valor dos juros: 3.20%

Prestacao = 70.00   Juros = 1.00%   Meses = 15
Valor `a vista: 980.26

Valor `a vista = 980.26   Juros = 1.00%   Meses = 15
Valor da prestacao: 70.00

Valor `a vista = 980.25   Prestacao = 70.00   Juros = 1.00%
Valor da prestacao: 70.00   Numero de meses: 15

Valor `a vista = 980.25   Prestacao = 70.00   Meses = 15
Valor dos juros: 1.00%

Prestacao = 90.00   Juros = 50.00%   Meses = 2
Valor `a vista: 150.00

Valor `a vista = 150.00   Juros = 50.00%   Meses = 2
Valor da prestacao: 90.00

Valor `a vista = 150.00   Prestacao = 90.00   Juros = 50.00%
Valor da prestacao: 90.00   Numero de meses: 2

Valor `a vista = 150.00   Prestacao = 90.00   Meses = 2
Valor dos juros: 50.00%

Prestacao = 1000.00   Juros = 200.00%   Meses = 10
Valor `a vista: 1499.97

Valor `a vista = 1499.97   Juros = 200.00%   Meses = 10
Valor da prestacao: 1000.00

Valor `a vista = 1499.97   Prestacao = 1000.00   Juros = 200.00%
Valor da prestacao: 1000.00   Numero de meses: 10

Valor `a vista = 1499.97   Prestacao = 1000.00   Meses = 10
Valor dos juros: 200.00%

Valor `a vista = 1200.00   Prestacao = 100.00   Juros = 10.00%
Nao e' possivel pagar o valor a vista

Valor `a vista = 20810.00   Prestacao = 1000.00   Juros = 5.00%
Nao e' possivel pagar o valor a vista

Valor `a vista = 20805.80   Prestacao = 1000.00   Juros = 5.00%
Valor da prestacao: 1000.00   Numero de meses: 96
\end{verbatim}
}

\section{Zero de Funções: Método de Newton}
\label{sec:ZeroFuncao}

O método de Newton é um dos métodos iterativos mais gerais para
resolver $f(x) = 0$. Começa-se a iteração com uma estimativa inicial
$x_0$ da solução $x^*$.  Dada uma estimativa $x_i$, o método de Newton
aproxima $f(x)$ pela reta tangente ao ponto $f(x_i)$. O zero da reta
tangente (isto é, o ponto onde esta reta intersecta o eixo das
abscissas) é tomado como nova estimativa de $x^*$. Veja na
Figura~\ref{fig:Newton} uma ilustração desse método. Para derivar as
fórmulas usadas pelo método, vamos expandir $f(x)$ por uma série de
Taylor ao redor do ponto $x_i$:
\[
f(x) = f(x_i) + f'(x_i)(x-x_i) + \cdots.
\]

A linha tangente é dada pelos dois primeiros termos da série
\[
y = f(x_i) + f'(x_i)(x - x_i).
\]
Igualando $y$ a zero temos: 
\begin{equation}
x_{i+1} = x_i - f(x_i) / f'(x_i).
\label{eq:Newton}
\end{equation}

%O método porém requer que $f'(x_i)$ seja diferente de zero.
Para a nossa função $f(x)$ definida por (\ref{eq:fj}), temos
que a sua derivada $f'(x)$ é:
\begin{equation}
f'(x)=\frac{p}{x^2}(1+x-\frac{1}{(1+x)^{n-1}})-\frac{p}{x}(1+\frac{n-1}{(1+x)^n}).
\label{eq:Derivada}
\end{equation}

Oservamos que para calcular cada nova estimativa só precisamos da
estimativa imediatamente anterior. Ou seja, são suficientes duas
variáveis para fazer isso (não precisa ir armazenando todas as
estimativas $x_0$, $x_1$, $x_2, \ldots$). Um algoritmo possível é o
seguinte (note que basicamente só temos $x_0$ e $x_1$): 

\begin{enumerate}
\item Comece com $i=0$ e um valor inicial $x_{0}$;
\item Calcule $x_{i+1}$ usando (\ref{eq:Newton}), (\ref{eq:fj}) e
  (\ref{eq:Derivada}). 
\item Se $|x_{i+1}-x_i| \leq \mbox{tol}_1$ então pare.
\item Se $|f(x_{i+i})| \leq \mbox{tol}_2$ então pare.
\item Faça $x_{i} = x_{i+1}$ e retorne ao passo 2.
\end{enumerate}

Para a implementação do programa,
você pode assumir que as tolerâncias $\mbox{tol}_1$ e 
 $\mbox{tol}_2$ sejam   $\mbox{tol}_1 = \mbox{tol}_2 = 0.0001$, 
e como valor 
inicial adote $x_{0} = 0.10~(= 10\%)$.


\begin{figure}
\begin{center}
\scalebox{0.5}{\includegraphics{newton.eps}}
\end{center}
\caption{\label{fig:Newton}Ilustração do Método de Newton.}
\end{figure}

\end{document}
