Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Que opinan ustedes de este ejercicio

he visto este trozo de codigo que me han pasado de no recuerdo y me he quedado alucinado; en teoria es simple pero no lo acabo de pillar


La pregunta es: <¿Que imprime? hay errores? si hay errores son de ejecucioon o de compilacion? (no se vale usar algun tipo de ayuda en el editor de texto)


public class test5 {
public static void main (String[] args) {
int numero = 100;
if(numero >= 100){
int arreglo[] = new int[]{10, 20, 30, 40, 50, 70, 80, 90, 100, 90,
numero = ((numero != 100) ? 0 : 999999),
numero = 10, 200, 300, 400
}

/** IMPRIMIENDO EL VALOR DE NUMERO **/
/* System.out.println ("imprimiendo el valor de numero: " + numero);*/;
/***/

for(int i = 0; i <= 10; i++)
numero = i;
imprimeValor( String.valueOf(arreglo[numero]) );
}
}

public static void imprimeValor(String valor){
if(valor != null)
System.out.println (valor);
}
}

Mi experiencia con este codigo:

0) no tenia constancia que se pudiesen definir arrays de la siguiente manera y no acabo
de entender:
int arreglo[] = new int[] (dato, dato,....)

y sin poner al final el punto y coma ";"

yo tenia constancia de lo siguiente:
int arreglo[] = new int[cant];
int arreglo[] = {dato, dato,...};
int[] arreglo = new int[cant];
int[] arreglo = {dato, dato,...};

1) no sabia que dentro de los arrays se pueden poner expresiones
ejemplo la expresion del operdor ternario.
numero = ((numero != 100) ? 0 : 999999)

2) no acabo de pillar cuando pone
numero = 10, 200, 300, 400
una variable definida tipo int cabe dentro de ella un array?

3) el trozo de comentario no lo acabo de pillar (me imagino que sea para despistar)

4) empleando netbeans, este no se queja (no da error) y encima como resultado da 99999

5) si el haces lo siguiente:
for(int i = 0; i <= 10; i++) {
numero = i;
imprimeValor( String.valueOf(arreglo[numero]) );
}
}

he puesto dos parentesis mas entonces lista de 10 hasta 99999
pero si cambio el i<=10 por i i<=15 lista hasta los valores 10, 200, 300, 400

Que opinan ustedes? me lo pueden explicar porque yo me he quedado perplejo

si la mision es listar todos los valores entonces el codigo si esta mal y puede ser un error de ejecucio creo. ahora si lo que se pretende es dar el 99999 solo no acabo de entender

enero 18, 2013 | Registered Commenterobv

hola, el codigo si es una jodida jaja esa es la forma de no escribir codigo ajja.

va enpesemos por la declaracion del vector que es lo más feo que he visto ajaj.
int arreglo[] = new int[]{10, 20, 30, 40, 50, 70, 80, 90, 100, 90,
numero = ((numero != 100) ? 0 : 999999),
numero = 10, 200, 300, 400
}


va lo que esta haciendo aquí numero = ((numero != 100) ? 0 : 999999) es poner el numero 0 en el vector si numero no es 100 y 999999 si es 100 aparte si se lo asigna a numero, es to si es valido, ya que java permite poner en la declaración de un vector cualquier expresión que retorne el tipo de dato del vector en si. incluso puedes poner una llamada a un metodo que te retorne un entero.

ahora esto numero = 10: va lo que hace es poner valor 10 en el vector y asignarle 10 al numero.
sabiendo que al principio numero fue declarado asi
int numero = 100;
entonces resumimos el vector para entenderlo a la siguiente declaracion:

int arreglo[] = new int[]{10, 20, 30, 40, 50, 70, 80, 90, 100, 90,999999/*esto es porque numero=100*/,10, 200, 300, 400 };
va el valor de numero=10; porque es la ultima asignacion que se hace.

ahora viene el bendito for
for(int i = 0; i <= 10; i++)
numero = i;

va lo unico que hace es asignar el valor de i a numero
, al salir del for el numero tiene valor de 10

de ahi viene la siguiente linea

imprimeValor( String.valueOf(arreglo[numero]) );

va como ya sabemos que numero tiene el valor de 10.
ahora en el vector resumido que hise arriba.
int arreglo[] = new int[]{10, 20, 30, 40, 50, 70, 80, 90, 100, 90,999999/*esto es porque numero=100*/,10, 200, 300, 400 };
este contando desde 0 como lo hace java el numero que esta en la casilla 10 es 999999.

y he ahi porque imprime 999999.
jaja una desperdiciada de código si pero es una manera de evaluar nuestro conocimiento del lenguaje ahora en usarlo en algo serio si es de lo peor ajaja.

.bueno espero verme explicado, si alguien ve otra cosa que aporte jaja que ese codigo tan grande se le puede sacar muchas cosas jajaj

enero 18, 2013 | Registered Commenterjhosep

???? no acabo de entenderte del todo jhosep....

lo siento pero gracias por la explicacion :)

enero 18, 2013 | Unregistered Commenterobv

jjja no tengas pena, es que el código si es una completa enredadera, en todo hay trampa por ejemplo tu caíste en una :D
jaja tu dices esto:
0) no tenia constancia que se pudiesen definir arrays de la siguiente manera y no acabo
de entender:
int arreglo[] = new int[] (dato, dato,....)

y sin poner al final el punto y coma ";"

pero no es cierto ajja
/** IMPRIMIENDO EL VALOR DE NUMERO **/
/* System.out.println ("imprimiendo el valor de numero: " + numero);*/; <--- ves ahi esta después de cerrar comentario

. realmente el codigo lo que hace es imprimir el valor de la casilla del array indicado por numero, todo el codigo se la pasan cambiando el valor de numero para perder al lector incluso el for esta hecho con esa mala intención
for(int i = 0; i <= 10; i++)
numero = i;
debes de hacerlo
for(int i = 0; i <= 10; i++){
numero = i;}
, lamento no poderte explicar de manera que entiendas pero analízalo, hazlo en un ide correlo paso a paso jaja veras que ahí lo entiendes .
me imagino que ese código lo sacaste de algún tipo de examen no?

y respondiendo la pregunta: se imprime 999999 y no hay ningún tipo de errores.
bueno si hay uno es la peor manera de escribir codigo ajajj XD

enero 18, 2013 | Registered Commenterjhosep

int arreglo[] = new int[] (dato, dato,....)

entonces es valida esta expresion sin acabar con ;?

he estado jugando con ese programita en netbeans y observo cosas curiosas.
caso1:
el que muestro arriba
dentro del if hay el for y observamos que no se queja el netbeans al encontrar el array (tendria que dar error por faltar el ; y se debe a que hay el for i llama al metodo imprimeValor.

si hacemos otro if seguido y creamos una variable de tipo int llamada valor realizamos un if y dentro de este in int[] llamado listado y hacemos lo mismo (añadimos el for llamando al metodo) entonces si me da una queja el netbeans diciendo que falta el ;

tiene que haber alguna explicacion de porque pasa todo esto pero ya no lo voy a dar mas vueltas al asunto.


pero con este ejemplo ya no entiendo nada.... :(

enero 19, 2013 | Unregistered Commenterobv

Bueno por si lees esto @obv, creo que te estas confundiendo y he ahi que no entiendes el codigo, lo pongo como referencia, la parte que vi que estas confundio
if(numero >= 100){
int arreglo[] = new int[]{10, 20, 30, 40, 50, 70, 80, 90, 100, 90,
numero = ((numero != 100) ? 0 : 999999),
numero = 10, 200, 300, 400
}

/** IMPRIMIENDO EL VALOR DE NUMERO **/
/* System.out.println ("imprimiendo el valor de numero: " + numero);*/;
/***/

quitando los comentarios esto queda asi
if(numero >= 100){
int arreglo[] = new int[]{10, 20, 30, 40, 50, 70, 80, 90, 100, 90,
numero = ((numero != 100) ? 0 : 999999),
numero = 10, 200, 300, 400
};
lo ves ahi esta el punto y coma que dices que no ves. y la forma de declarar el vector si es valida, viendolo un poco más general la declaracion seria asi
tipodato id[]= new tipodato[]{exp,..,exp} donde exp, es una expresion que retorna un valor que debe ser del mismo tipo de dato que declarastes el vector. las expresiones pueden ser funciones, el operador ternario, incluso asignaciones.

espero haberme explicado, pero te aliendo a que sigas estudiando más el lenguaje y revisando codigo, porque asi se te sera más sencillo encontrar errores en tu propio codigo. pero esto es con experiencia y mucha paciencia ver errores en codigo cuesta.
exitos.

enero 22, 2013 | Registered Commenterjhosep