Puyover escribió:Puyover escribió:Tengo un problemilla... Estoy intentando hacer un programa que me calcule las raices de una función mediante el método de newton y vale, funciona perfectamente... si no fuera por un pequeño detalle.
Os pongo el código y una captura del error:for (i = 0; i < 21; i++) {
expresionO = funcion(s);
expresionDerivada = derivada(s);
expresionS = new Format("%.2E").format(expresionO);
expresionDS = new Format("%.2E").format(expresionDerivada);
if (i < 10) {
buffer += i + ". " + formatea.format(s) + " "
+ expresionS + "\t" + expresionDS + "\n";
} else {
buffer += i + ". " + formatea.format(s) + " "
+ expresionS + "\t" + expresionDS + "\n";
}
sant = s;
s = (Double) (s - expresionO / expresionDerivada);
salidaArea.setText("");
if (s == sant) {
if (i < 10) {
buffer += i + 1 + ". " + formatea.format(s) + " "
+ expresionS + "\t" + expresionDS + "\n";
} else {
buffer += i + 1 + ". " + formatea.format(s) + " "
+ expresionS + "\t" + expresionDS + "\n";
}
break;
}
Como veis en las dos últimas líneas f(s(n)) vale 0.00E+000 cuando debería de valer 4.44E-16 y la cosa es que las demás operaciones las hace bien el cachondo
He de decir que uso dos librerías externas: JEP (Java Expresion Parser) y Format, que sirven para reconocer expresiones matemáticas y formatear la salida respectivamente. Esas funcionan perfectamente y ahí no está el problema porque hasta con un println simple me muestra 0.0000000000000000 -.-U
Y por mas que le doy vueltas no caigo en el error y me está sacando ya de quicio
A ver si podéis iluminarme >.<
Me autocito diciendo que es la cosa mas rara que me ha pasado en la vida y que solo presenta ese "problema" (lo pongo entre comillas porque por dentro el programa funciona perfectamente y las operaciones las hace correctamente) en las funciones polinomiales del tipo: x + x + x + ... + n (donde n es una constante y las x son variables (da igual cuantas x pongas)).
Aunque viendo esto me hace pensar que puede ser el parser :/
Voy a hacer unas pruebas y edito.
EDITO: Nada, no es el parser. Si meto la fórmula directamente en el código fuente sigue dándome el mismo error. En fin lo dejaré así y ya está -.-U
xgc1986 escribió:podrias poner el codigo hecho con Bigdecimal?
y si la funcion no es muy larga ponla entera en vez del trozo
private void resultadosButton1ActionPerformed(java.awt.event.ActionEvent evt) {
BigDecimal s = new BigDecimal(Double.parseDouble(s0Field.getText()));
BigDecimal sant = new BigDecimal(-1);
String expresionS;
String expresionDS;
BigDecimal expresionDerivada = new BigDecimal(-1);
BigDecimal expresionO = new BigDecimal(-1); // Expresión original
DefaultTableModel modelo = (DefaultTableModel) jTable1.getModel();
buffer = "";
if (modelo.getRowCount() != 0) {
for (int i = modelo.getRowCount() - 1; i >= 0; i--) {
modelo.removeRow(i);
}
}
try {
for (int i = 0; i < 100; i++) {
expresionO = funcion(s);
expresionDerivada = derivada(s);
expresionS = expresionO.toString();//new Format("%.2E").format(expresionO);
expresionDS = expresionDerivada.toString();//new Format("%.2E").format(expresionDerivada);
// Salida de datos por la tabla
//*****************************************************
modelo.addRow(new Vector());
jTable1.setValueAt(i, i, 0);
//if (s < 0) {
jTable1.setValueAt(formatea.format(s), i, 1);
/*} else {
jTable1.setValueAt("+" + formatea.format(s), i, 1);
}*/
//if (expresionO < 0) {
jTable1.setValueAt(expresionS, i, 2);
/*} else {
jTable1.setValueAt("+" + expresionS, i, 2);
}*/
//if (expresionDerivada < 0) {
jTable1.setValueAt(expresionDS, i, 3);
/*} else {
jTable1.setValueAt("+" + expresionDS, i, 3);
}*/
//*****************************************************
sant = s;
s = sant.subtract(expresionO.divide(expresionDerivada));
if (s.equals(sant)) {
// Salida de datos por la tabla (el del último miembro)
//*****************************************************
modelo.addRow(new Vector());
jTable1.setValueAt(i+1, i+1, 0);
//if (s < 0) {
jTable1.setValueAt(formatea.format(s), i+1, 1);
/*} else {
jTable1.setValueAt("+" + formatea.format(s), i+1, 1);
}*/
//if (expresionO < 0) {
jTable1.setValueAt(expresionS, i+1, 2);
/*} else {
jTable1.setValueAt("+" + expresionS, i+1, 2);
}*/
//if (expresionDerivada < 0) {
jTable1.setValueAt(expresionDS, i+1, 3);
/*} else {
jTable1.setValueAt("+" + expresionDS, i+1, 3);
}*/
//*****************************************************
break;
}
}
if (s.equals(sant)) {
buffer = "Solucion aproximada: " + formatea.format(s);
salidaField.setText(buffer);
} else {
buffer = "Tras 100 iteraciones la sucesion no converge";
salidaField.setText(buffer);
}
resultadosNewtonDialog.pack();
resultadosNewtonDialog.setVisible(true);
} catch (ParseException e) {
JOptionPane
.showMessageDialog(
null,
"Comprueba que hallas introducido la formula correctamente",
"Error", JOptionPane.ERROR_MESSAGE);
}
}
private BigDecimal funcion(BigDecimal x) throws ParseException {
BigDecimal expresionR;
jep.addVariable("x", x);
expresion = jep.parse(expresionField.getText());
expresionR = BigDecimal.valueOf((Double) jep.evaluate(expresion));
return expresionR;
}
private BigDecimal derivada(BigDecimal x) throws ParseException {
BigDecimal expresionR;
jep.addVariable("x", x);
expresionD = jep.parse(expresionDerivadaField.getText());
expresionR = BigDecimal.valueOf((Double) jep.evaluate(expresionD));
return expresionR;
}
xgc1986 escribió:en el primer codigo que me has puesto, he visto por que te sale el error, y es por que esta variable cuando la creas, la haces a partir de un double, entonces pierdes pecision
por ejemplo:
MAL -> BigDecimal d = new BigDecimal(20.51) // d = 20.510000000000001563194018672220408916473388671875
BIEN -> BigDecimal d = new BigDecimal("20.51") // d = 20.51
tienes que evitar contruir un BigDecimal a partir de un double, hazlo de un string
entonces en la segunda linea del primer codigo has de poner
BigDecimal s = new BigDecimal(s0Field.getText());
Y sobre los codigos 2 y 3 le linea:
expresionR = BigDecimal.valueOf((Double) jep.evaluate(expresionD));
pues no se que devuelve jep.evaluate(expresionID), pero si devuelve un String haz
expresionR = new BigDecimal(jep.evaluate(expresionD));
si no devuelve un String dimelo miramos otra forma de hacer esta parte
ya no he visto nada mas ya contaras que tal va ahora
edito la funcion divide de BigDecimal ademas puedes elegir a cuantas decimales quieres que te redondee, y que tipo de redondeo
xxxxx.divide(yyyyy,50,RoundingMode.HALF_EVEN));
oscarmu escribió:Hola chicos,
Tengo un par de dudas. Como sabeis adquiri el Core Java 2 en ingles en Amazon. No me queda muy clara la idea de interface i clase abstracta. Podriais explicarmela un poco mas?
Gracias.
oscarmu escribió:Hola chicos,
Tengo un par de dudas. Como sabeis adquiri el Core Java 2 en ingles en Amazon. No me queda muy clara la idea de interface i clase abstracta. Podriais explicarmela un poco mas?
Gracias.
public interface Funciones {
public void respirar();
public void caminar();
public void correr();
}
public class Animal implements Funciones {
public void respirar() {
//lo que sea
}
public void caminar() {
//lo que sea
}
public void correr() {
//
}
}
//Como la clase Animal implementa Funciones, o programas los métodos especificados en ella o aquí no compila ni Chuck Norris xD
public class Perro extends Animal {
//Los métodos definidos en la interfaz están programados en la clase padre, así que no es necesario programarlos aquí, a menos que aquí
//el método haga algo concreto
//De igual forma, puedo declarar ahora métodos específicos para el perro
public void ladrar() {
System.out.println("guau");
}
}
public class Gato extends Animal {
//Los métodos definidos en la interfaz están programados en la clase padre, así que no es necesario programarlos aquí, a menos que aquí
//el método haga algo concreto
//De igual forma, puedo declarar ahora métodos específicos para el perro
public void maullar() {
System.out.println("miau");
}
}
public class Caballo extends Animal {
//Los métodos definidos en la interfaz están programados en la clase padre, así que no es necesario programarlos aquí, a menos que aquí
//el método haga algo concreto
//De igual forma, puedo declarar ahora métodos específicos para el perro
public void cocear() {
System.out.println("Ay, eso duele xD");
}
}
sergimax escribió:Hola, tengo una duda respecto a arrays, tengo declarado un array de String de dimension 10 por ejemplo, al que le introduzco 4 objetos en sus primeras posiciones, mi pregunta es ¿como puedo crear un metodo que elimine un objeto del array (comparando lo que haya en cada posicion con el String que le de yo en el metodo (borrarContenido (String contenido)) y que a su vez haga que las demas cosas ya guardadas ocupen el espacio vacio?)
Por ejemplo, si en las primeras 4 posiciones del array meto "Juan" "Pedro" "Javier" y "Luis", si luego en el metodo quiero que borre "Pedro", el metodo debe ir por cada posicion comparando si es igual a "Pedro" y si es asi borrarlo y que "Javier" ocupe la posicion de "Pedro" y "Luis" la de Javier claro esta.
Lo de compararlo lo tengo solucionado, pero no se como borrar el objeto de una posicion y luego mover los demas atributos.
Gracias de antemano.
for(int i = 0; i < array.length-1; i++) {
array[i] = array[i+1];
}
array[array.length-1] = "";
sergimax escribió:Hola, tengo una duda respecto a arrays, tengo declarado un array de String de dimension 10 por ejemplo, al que le introduzco 4 objetos en sus primeras posiciones, mi pregunta es ¿como puedo crear un metodo que elimine un objeto del array (comparando lo que haya en cada posicion con el String que le de yo en el metodo (borrarContenido (String contenido)) y que a su vez haga que las demas cosas ya guardadas ocupen el espacio vacio?)
Por ejemplo, si en las primeras 4 posiciones del array meto "Juan" "Pedro" "Javier" y "Luis", si luego en el metodo quiero que borre "Pedro", el metodo debe ir por cada posicion comparando si es igual a "Pedro" y si es asi borrarlo y que "Javier" ocupe la posicion de "Pedro" y "Luis" la de Javier claro esta.
Lo de compararlo lo tengo solucionado, pero no se como borrar el objeto de una posicion y luego mover los demas atributos.
Gracias de antemano.
Puyover escribió:Claro pero imagina que mueves todos de lado... que pasa con el último hueco? se queda vacio? Si es así deberías de hacer algo como:for(int i = 0; i < array.length-1; i++) {
array[i] = array[i+1];
}
array[array.length-1] = "";
Así se te moverían y el último hueco se quedaría vacío.
Un saludo.
PD: i sería la posición del que quieres eliminar, no tiene que ser necesariamente 0.
daniel_5 escribió:para borrar el objeto de una posicion utiliza el método
remove(Object); Si quieres borrar el objeto
remove(int); Si quieres borrar según la posición
Para reordenar el array yo lo que haría sería recorrerlo y meterlo en un array ausiliar todo lo "not null" vaciar el original y copiar el ausiliar al original, si es muy grande el vector no es eficiente, pero para eso utilizaría la clase vector y no un array
sergimax escribió:Esto serviria para ArrayList imagino, pero para un Array normal no funciona, al menos eso he comprobado.
Fox escribió:Auch, parece que mi tochaco de ayer no sirvió para nada jeje.
Se usan clases abstractas en vez de clases normales pues las clases se usan para representar objetos concretos, por ejemplo: Un perro, un gato... O sea, puedes crear una instancia de un perro al cual llamar rufus y que sea con el pelo marroncito. Lo mismo con un gato llamado minino y pelo blanco.
Las clases abstractas no representan objetos concretos, como podría ser "Animal", tu no puedes crear un animal como tal, necesitarías crear un gato o un perro. ¿Para qué las clases abstractas entonces? Pues se usan como clases bases en las jerarquías de clases.
Es tontería tener una clase perro y separadamente otra clase gato, estaría bien que ambas fueran hijas de una clase común que tenga ciertos métodos en común para los gatos y los perros. Esa clase base puede ser o bien una clase normal o bien una abstracta, pero en este caso concreto, una buena clase padre para esas dos podría ser "AnimalCompañia", obviamente no te interesa poder crear instancias de AnimalCompañia puesto que eso no es _nada_ realmente, solo un concepto pero que no tiene representación real, así que la marcas abstracta obligando a los programadores a usar o bien gato o bien perro.
Las clases abstractas se usan para eso, para que sean las clases bases de ciertas jerarquias como la de este ejemplo.
Las interfaces por otro lado y como ya dije, se usan para modelar comportamientos, y eso creo que lo expliqué bien ya en mi otro mensaje.
xgc1986 escribió:Buenas, tengo una dudilla.
En c++ cuando heredo de otra clase puedo hacer que todo lo que hereda pase a ser private, protected o normal. Y me gustaria saber si en JAVA tambien se puede, y si se puede, entonces saber como se hace.
El caso es que quiero heredar una clase, pero no me interesa que la gente use las funciones que hereda. Y se me habia ocurrido primero sobreescribir estas clases para que en vez de llamar a la clase al cual heredo, llamen a las mias que no harian nada. Pero lo veo muy costoso ya que son bastantes, y absurdo crear clases que no hacen nada.
Gracias
Edito:
Se me acaba de ocurrir como puedo hacerlo de una manera sencilla, en vez de heredar esa clase, la uso como variable privada. xD
oscarmu escribió:Muchas gracias FOX i muchas gracias a todos.
Aun del todo todo claro no me ha quedado. Pero almenos ahora tengo una idea general. Supongo que toca avanzar un poco.
oscarmu escribió:Una preguntita tonta. De java, basicament, me gustaria crear aplicacions para internet usando los applets. Para eso debo programar la parte visual con AWT, no?
Apartir de aqui, con que software se programa en AWT o Swing? Con netbeans voy bien? O mejor eclipse...? Recomendaciones?
Muchisimas gracias.
Puyover escribió:oscarmu escribió:Una preguntita tonta. De java, basicament, me gustaria crear aplicacions para internet usando los applets. Para eso debo programar la parte visual con AWT, no?
Apartir de aqui, con que software se programa en AWT o Swing? Con netbeans voy bien? O mejor eclipse...? Recomendaciones?
Muchisimas gracias.
No estoy muy puesto en applets; todo lo que he hecho hasta ahora ha sido aplicaciones de escritorio, sin embargo, yo antes usaba netbeans y eso de que no me dejara tocar las partes de código que yo quisiera me ponía de los nervios, por lo que me pasé a eclipse y con sus respectivos plugins sigo hoy en día y me encanta.
Un saludo.
oscarmu escribió:Puyover escribió:oscarmu escribió:Una preguntita tonta. De java, basicament, me gustaria crear aplicacions para internet usando los applets. Para eso debo programar la parte visual con AWT, no?
Apartir de aqui, con que software se programa en AWT o Swing? Con netbeans voy bien? O mejor eclipse...? Recomendaciones?
Muchisimas gracias.
No estoy muy puesto en applets; todo lo que he hecho hasta ahora ha sido aplicaciones de escritorio, sin embargo, yo antes usaba netbeans y eso de que no me dejara tocar las partes de código que yo quisiera me ponía de los nervios, por lo que me pasé a eclipse y con sus respectivos plugins sigo hoy en día y me encanta.
Un saludo.
Que tipo de plugins utilizas?
Gracias.
Exception in thread "main" java.lang.NullPointerException
at Vivienda.<init>(Vivienda.java:33)
at main.main(main.java:13)
codigo.setnnumero(nnumero);
Vivienda casa1=new Vivienda(1199,'v',1070,"Casa numero 1");
Iverson88 escribió:Hola buenas a ver si me podéis echar una mano.
Estoy haciendo un programa simple que simula una inmobiliaria. Lo tengo terminado pero me he encontrado con un par de fallos que se donde están (me lo dice el IDE) pero no se solucionar :S
El error es el siguiente:Exception in thread "main" java.lang.NullPointerException
at Vivienda.<init>(Vivienda.java:33)
at main.main(main.java:13)
Decir que es un programa con varias clases y uso composición.
El error que me marca en la clase Vivienda.java en la línea 33 tengo lo siguiente:codigo.setnnumero(nnumero);
Donde codigo es otra clase formada por un numero y una letra, y en este caso le quiero mandar un numero.
El otro error en el "main" (es como le llamado a la clase principal. Tengo esto en la línea del error:Vivienda casa1=new Vivienda(1199,'v',1070,"Casa numero 1");
Lo que hago es crear una vivienda con esos datos como atributos que mando a la clase Vivienda que tiene sus respectivos constructores... :S
A ver si alguien me puede echar una mano. Gracias
codigo=new Codigo();
//Método de busqueda por descripción.
void buscar(String cad_des)
{
int i=0;
int j=0;
int contadorA=0;
int contadorV=0;
Vivienda vivienda_a_buscar;
String descripcion="";
//Buscamos primero en las viviendas de alquiler
for(i=0;i<alquiler.size();i++)
{
vivienda_a_buscar=(Vivienda)alquiler.elementAt(i);
descripcion=vivienda_a_buscar.getdes();
for(j=0;j<descripcion.length();i++)
{
while(contadorA!=cad_des.length())
{
if(descripcion.charAt(i)==cad_des.charAt(contadorA))
{
contadorA ++;
}
else
{
contadorA=0;
}
}
if(contadorA>0)
{
System.out.println(alquiler.elementAt(i).toString());
}
}
}
//Ahora en las de venta
for(i=0;i<venta.size();i++)
{
vivienda_a_buscar=(Vivienda)venta.elementAt(i);
descripcion=vivienda_a_buscar.getdes();
for(j=0;j<descripcion.length();i++)
{
while(contadorV!=cad_des.length())
{
if(descripcion.charAt(i)==cad_des.charAt(contadorV))
{
contadorV ++;
}
else
{
contadorV=0;
}
}
if(contadorV>0)
{
System.out.println(venta.elementAt(i).toString());
}
}
}
}
El_RapEro escribió:Alguien sabe cómo poner un temporizador que salte de forma periódica?
Saludos.
Fox escribió:El_RapEro escribió:Alguien sabe cómo poner un temporizador que salte de forma periódica?
Saludos.
Sí, busca la clase Timer.
// Creamos 2 aeropuertos; uno tendrá 3 compañías y otro 2
Aeropuerto barajas = new Aeropuerto(3, "Barajas", "Madrid");
Aeropuerto el_prat = new Aeropuerto(2, "El Prat", "Barcelona");
// Creamos las companias de barajas
Compania [] compania = new Compania[barajas.getNumCompanias()];
compania[0] = new Compania(3, 2, "AirEuropa");
compania[1] = new Compania(2, 1, "Spanair");
compania[2] = new Compania(1, 2, "Ryanair");
Fox escribió:No te entiendo muy bien Puyover...
Para empezar, no uses arrays a pelo, eso está muy feo, usa algo del estilo:
ArrayList<Compañia> que es mucho más rápido, más util y más facil de usar.
Yo imagino que podrías hacer algo en plan
Aeropuerto barajas = new Aeropuerto(.....);
ArrayList<Compañia> compañias = new ArrayList<Compañia>();
compañias.add(new Compañia(......));
compañias.add.....
y finalmente
barajas.setCompañias(compañias);
Pero vamos, no sé si estoy entendiendo bien lo que necesitas.
Puyover escribió:Fox escribió:No te entiendo muy bien Puyover...
Para empezar, no uses arrays a pelo, eso está muy feo, usa algo del estilo:
ArrayList<Compañia> que es mucho más rápido, más util y más facil de usar.
Yo imagino que podrías hacer algo en plan
Aeropuerto barajas = new Aeropuerto(.....);
ArrayList<Compañia> compañias = new ArrayList<Compañia>();
compañias.add(new Compañia(......));
compañias.add.....
y finalmente
barajas.setCompañias(compañias);
Pero vamos, no sé si estoy entendiendo bien lo que necesitas.
Ah mira lo de ArrayList me va a venir al dedo xD
Lo que quiero decir es que, yo no puedo instanciar directamente objetos de la clase Compania (y de ninguna de las siguientes por debajo de Aeropuerto) sin pasar por Aeropuerto. O sea para crear un Pasajero por ejemplo, necesitaría pasar por Aeropuerto, Compania y Vuelo. Lo que no debo hacer es crear Pasajeros directamente porque no estarían relacionados con ningún Vuelo, ni este con ninguna Compania, ni esta con ningún Aeropuerto :S
No se si me explico, es que es un poco raro xD
zaius5 escribió:En un evento KeyTipped comopuedo distingir que el boton pulsado sea intro??
zaius5 escribió:En un evento KeyTipped comopuedo distingir que el boton pulsado sea intro??
private void jTextArea1KeyPressed(java.awt.event.KeyEvent evt) {
if (evt.isActionKey()){
jTextArea2.append ("Se ha presionado la tecla modificadora " + evt.getKeyModifiersText(evt.getKeyCode()) + "\n Su codigo es " + evt.getKeyCode() + "\n");
}
else{
jTextArea2.append ("Se ha presionado la tecla " + evt.getKeyText(evt.getKeyCode()) + "\n Su codigo es " + evt.getKeyCode() +"\n");
}
Fox escribió:zaius5 escribió:En un evento KeyTipped comopuedo distingir que el boton pulsado sea intro??
Dentro de mi ignoracia de Java, normalmente este tipo de eventos trae consigo la tecla que has pulsado. Luego Java tendrá una clase con una colección de teclas y solo es comparar.
Segun veo google, el evento es del tipo KeyEvent y ahi recoges la tecla que has pulsado, solo tendrías que comparar para ver si tu tecla es VK_ENTER.
xgc1986 escribió:Alguien sabe omo hacer un System("clear") en java (o cualquier otro system)?
he estado buscando, y la solucion de escribir linieas en blanco es muy patillera, y si hago
Runtime.getRuntime().exec("clear");
entonces, me lo hace pero no en la consola, me ejecuta este comando pero no me limpia la consola