\documentclass{article}

\usepackage[portuguese]{babel}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}

\addtolength{\textwidth}{1.5cm}
\setlength{\oddsidemargin}{0pt}

\author{Carlos Camarão}

\date{Data de Entrega: 3 de Novembro de 2009}

\title{TP3}

\begin{document}

\maketitle

{\parindent 0pt Para facilitar o trabalho do monitor, por favor
escreva as solu\c{c}\~oes em arquivos {\tt Problema1.java}, {\tt
Problema2.java} e {\tt Problema3.java}, com as classes que contêm o
método {\tt main} com o mesmo nome do arquivo (sem a extens\~ao {\tt
.java}).

\begin{enumerate}

\item Escreva um programa que leia um nome de arquivo, fornecido pelo
usuário, e em seguida leia repetidamente três valores de ponto
flutuante contidos no arquivo com o nome especificado, e imprima: i)
se cada sequência de três valores podem ou não formar um triângulo, e
ii) em caso positivo imprima também mensagem informando os valores do
perímetro e da área do triângulo.

A área do triângulo pode ser calculada usando:

   \[ \text{{\tt Math}.{\tt sqrt}}(s\times
   (s-a)\times(s-b)\times(s-c)) \]
onde $s$ é o semiperímetro (i.e. $p/2$, onde $p$ é o perímetro) do
triângulo de lados $a$,$b$,$c$.

{\tt sqrt} é um método estático da classe {\tt Math} de {\tt
java.lang}.

O programa deve fazer {\em validação dos dados de entrada\/}, isto é,
garantir que os dados de entrada sejam sempre valores válidos para o
tipo esperado --- no caso, valores v\'alidos do tipo {\tt double} e
nome de um arquivo existente.

Para isso, para leitura de valores do tipo {\tt double} defina
m\'etodo para leitura de valor desse tipo que fa\c{c}a uma chamada ao
m\'etodo {\tt parseDouble} da classe {\tt Double} e defina um tratador
que i) trate a exce\c{c}\~ao que pode ser causada pela chamada a esse
m\'etodo (da classe {\tt NumberFormatException}) e ii) chame o
m\'etodo recursivamente caso ocorra exceção.

\item Escreva um programa que leia o nome de um arquivo e números
entre 0 e 100, contidos nesse arquivo, que correspondem a notas de
alunos, e imprima, para cada número lido, uma linha, no dispositivo de
saída padrão, com um caractere que representa o conceito
correspondente ao número lido. O conceito deve ser computado de acordo
com a tabela a seguir:

   \begin{center}
       \begin{tabular}{|l|c|} \hline
          {\bf Nota} & {\bf Conceito}\\
          0 a 59     & R \\
          60 a 74    & C \\
          75 a 89    & B \\
          90 a 100   & A \\ \hline
       \end{tabular}
   \end{center}

O programa deve garantir que o valor lido para a nota de um aluno seja
um valor correto (entre 0 e 100). Para isso, o programa definir um
m\'etodo para leitura da nota e propagar uma exce\c{c}\~ao de tipo
{\tt NotaInvalida} caso o valor lido n\~ao constitua um valor inteiro
entre 0 e 100. A classe {\tt NotaInvalida} deve ser definida como uma
subclasse da classe {\tt Exception}. O programa deve tratar
poss\'{\i}vel exce\c{c}\~ao que seja causada, de modo a terminar o
programa e imprimir mensagem que informe o erro e qual valor de
entrada causou término do programa por não constituir valor correto
para uma nota.

O programa deve também tratar o caso em que o nome especificado para o
arquivo não exista. Nesse caso, o programa deve solicitar que o
usuário digite outro nome, até que o nome de um arquivo que de fato
exista seja especificado.

\item Em Java, uma exce\c{c}\~ao n\~ao \'e causada quando o resultado
de uma opera\c{c}\~o aritm\'etica com valores inteiros tem magnitude
grande demais para poder ser armazenado no espa\c{c}o de mem\'oria
reservado para valores desses tipos (essa condi\c{c}\~ao \'e comumente
chamada, em ingl\^es, de {\em overflow\/}; em portugu\^es podemos
chamar essa condi\c{c}\~ao de ``incapacidade de armazenamento", ou
``estouro").

No caso da adi\c{c}\~ao de dois inteiros, tal condi\c{c}\~ao ocorre se
e somente se as duas parcelas da adi\c{c}\~ao t\^em o mesmo sinal e o
sinal do resultado \'e diferente do sinal das parcelas (quando as duas
parcelas t\^em sinais diferentes entre si, nunca pode ocorrer uma
incapacidade de armazemento). Em outras palavras, em caso de
incapacidade de armazenamento o resultado \'e negativo se os operandos
s\~ao positivos, e positivo se os operandos s\~ao negativos .

Com base nisso, escreva um programa que defina um m\'etodo est\'atico
{\tt soma} que, ao receber dois argumentos do tipo {\tt int}, retorna
a soma desses argumentos se n\~ao houver incapacidade de armazenamento
e causa uma exce\c{c}\~ao de tipo {\tt ArithmeticException} caso
contr\'ario. 

O programa deve ler repetidamente dois n\'umeros inteiros diferentes
de zero, chamar o m\'etodo {\tt soma} para somar os dois inteiros
lidos e imprimir, dependendo dos valores dos argumentos, o resultado
da soma, caso o valor da soma possa ser armazenado em um valor de tipo
{\tt int}, caso contr\'ario uma mensagem apropriada para o usu\'ario
(indicando que o valor da soma n\~ao pode ser armazenado em um valor
de tipo {\tt int}).

A leitura deve terminar quando um dos valores lidos for igual a zero.

\end{enumerate}

\end{document}

