\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: 7 de Julho de 2009}

\title{Quarta Lista de Exercícios}

\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 três números de ponto flutuante do
dispositivo de entrada padrão, imprima se eles podem ou não formar um
triângulo e, 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}).

Para isso, defina um m\'etodo para leitura de um valor de tipo {\tt
double} que fa\c{c}a uma chamada ao m\'etodo {\tt parseFloat} da
classe {\tt Float} 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.

\item Escreva um programa que leia números entre 0 e 100, 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, contendo informação
sobre qual valor de entrada causou término do programa por n\~ao
constituir valor correto para uma nota.

\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}

