_________________________________________________________________________
Your amazing program should calculate the sum if the numbers given in each line, and output on line for each question with the response. Numbers can be negative, really big and lines contain extra spaces, so make your program resistant to input.
Your program will need to read from standard input, line by line till the end of the input. Consider each line a different question. For each line you read, output the sum of all the given numbers.
Sample input
2 3 4 5 -1
Sample output
5 8
_________________________________________________________________________
UserInterface Class:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* Clase encargada de mantener el bucle de ejecución del programa hasta el fin de linea.
* @author Javier de Pedro López
*/
public class UserInterface {
/**
* Permite mantener el bucle de lecutra.
*/
public void run() throws IOException{
String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//Bucle que realiza las lecturas hasta que lo recibido sea EOF (null)
do{
line = reader.readLine();
if (line != null && !line.trim().equals("")){
SuperHardSum sum = new SuperHardSum(line);
System.out.println(sum.getSum());
}
} while(line != null);
}
}
SuperHardSum Class:
import java.math.BigInteger;
import java.util.StringTokenizer;
/**
* Realiza la suma de una linea completa
* @author Javier de Pedro López
*/
public class SuperHardSum {
//ATRIBUTOS//
private BigInteger _sum;
//CONSTRUCTOR//
/**
* Instancia un nuevo elemento para realizar sumas por linea.
* @param line linea sobre la que se realiza la suma.
*/
public SuperHardSum(String line){
_sum = new BigInteger("0");
StringTokenizer tokens = new StringTokenizer(line, " ");
while(tokens.hasMoreElements()){
StringTokenizer tokenProc = new StringTokenizer(tokens.nextToken(),"+");
_sum = _sum.add(new BigInteger(tokenProc.nextToken()));
}
}
/**
* Permite obtener la suma de toda la linea.
* @return la suma de toda la linea.
*/
public BigInteger getSum(){
return _sum;
}
}
En la línea resaltada podemos ver que se trata de convertir en tokens con el símbolo ‘+’, esto es porque en los tests se prueban números como +numero, y eso produce un error al tratar de convertirlo en BigInteger. De este modo quedan eliminados todos los + que puedan aparecer en las pruebas.
Comment copied from other entry
feantury
on junio 20, 2011 en 10:34 pm said: [Edit]
El código lo dejaré escrito de la misma manera que está de todos modos, puesto que la idea es dejar reflejado el trabajo que realicé en el concurso.
En cuanto a lo de los estándares java, así es como me obligan en la facultad por eso lo sigo, y la verdad resulta muy visible. =)
Lo del StringTokenizer no lo sabía, así que una cosa más a tener en cuenta.
Y la inicialización… metida de pata
No obstante, muchas gracias por los apuntes.
Un saludo.
Comment copied from other entry
CC on junio 20, 2011 en 10:26 pm said: [Edit]
Unas notas
Nombrar un atributo empezando por _ no entra dentro del estandar Java para el nombre de las variables.
StringTokenizer se queda desfasado ante la introduccion de la clase Scanner de Java5
new BigInteger(“0″) -> BigInteger.ONE;
salu2