[JAVA] Control: Nº2 Sección 3 Vespertino Forma A

Hace unos días me llegó por ahí el control de la sección 3 de vespertino. Y bueno, lo desarrollé para aquellos que son de esa sección o para todos los interesados.

Si se van dando cuenta, cada vez explico menos los métodos por motivos obvios. La gran mayoría de los métodos ya los hemos hecho en ejercicios anteriores, y sería tonto explicarlos de nuevos. Siempre la forma de hacer las cosas se va repitiendo.

Les dejo el control para los que no lo tegan:

[ Control 2 ]

De todas formas, cualquier duda ya saben a mi e-mail, que coloqué en unos post más abajo o comenten.

Gracias Pablo por el control.

Ah, se me olvida en la parte donde se crea el número al azar, no logre que me creara un número de entre 6 y 14 dígitos, sólo entre 6 y 9. ¿Por qué?, no sé. Tengo que investigar.

Saludos.

Clase plano


class Control2{

private long numero;

Control2(){

numero = (long)(Math.random()*(999999999+1-100000)+100000); // Entre 6 y 14

}

long getNumero(){

return numero;

}

void setNumero(long numero){

this.numero = numero;

}

/*
* Metodo tan simple (para algunos, claro) como sacar la cantidad
* de pares y impares. Osea, si tenemos el numero 123456, este
* contiene 3 pares (2, 4, 6) y 3 impares (1, 3, y 5) y hacer un
* if final con la condicion que corresponde, que en este caso
* era que si los pares son mayor o igual que los impares se
* devuelve true.
*/

boolean digitoPar(){

int pares = 0, impares = 0;
long copia = numero, digito = 0;

while(copia > 0){

digito = copia%10; // Extraemos el digito

if(digito%2 == 0){ // Es par

pares++;

} else { // Es impar

impares++;

}

copia = copia/10; // Avanzamos de digito

}

if(pares >= impares){ // Hacemos la pregunta

return true;

} else {

return false;

}

}

/*
* En este metodo teniamos que saber CUALES digitos eran
* pares y separarlos en un nuevo numero. Osea, si tenemos
* 123456, teniamos que separarlos y entregar un nuevo numero
* solo con los pares, que seria: 246.
*
* Bueno, en realidad en el control en ningun lado decia
* textual que el numero tenia que venir en ese orden, porque
* para que quede en ese orden hay que invertirlo (cosa
* que hicimos antes y lo puse aqui abajo) pero segun yo
* basta con obtener los numeros pares y hacer un nuevo numero
* con ellos.
*
* OJO: el CERO se toma como par. Pero basta cambiar la condicion
* del if y agregar que 'digito' sea distinto de 0 para que no
* sea contabilizado.
*/

long numeroDivisible(){

int i = 0;
long copia = numero, nuevo_numero = 0, digito = 0, nuevo_invertido = 0;

while(copia > 0){

digito = copia%10; // Extraemos el digito

if(digito%2 == 0){ // Si es par

nuevo_numero = (nuevo_numero*10)+digito; // Se agrega a una nueva cadena

}

copia = copia/10; // Avanzamos de digito

}

/*
* Aqui es donde invertimos el numero, cosa que ya vimos antes.
*/

while(nuevo_numero > 0){

digito = nuevo_numero%10; // Almacenamos el ultimo digito
nuevo_invertido = nuevo_invertido*10+digito; // Agregamos el digito a nuestro numero invertido
nuevo_numero = nuevo_numero/10; // Dividimos para avanzar al siguiente digito
i++;

}

return nuevo_invertido;

}

/*
* Aqui no se trabaja con UN digio, si no con DOS, por lo tanto
* algunas cosas cambian, nuestros '10' cambian por '100'. Fijense
* en 'digitos' y cuando avanzo de digito al final del primer while.
* Ahora tomo los 2 utimos digitos del numero luego sumo esos 2 digitos
* en el mismo if:
*
* if(digitos%10 + digitos/10 < 10)
*
* Si se complican con eso, es facil de entender. Por ejemplo, tenemos
* de digitos 68 -> 68%10 -> 8 ahi ya tenemos un digito de los 2. Luego
* decimos 68/10 -> 6 ahi esta el otro (claro, 6,8 pero se toma como entero)
* y los sumamos y hacemos la comparacion que si es menor de 10 aquella suma
* digitos pasa a ser 99 como dice el ejercicio.
*
* Luego vamos agregando nuestros digitos a un nuevo numero generado
* por nosotros. Esta vez se multiplica por 100 por que vamos agregando
* de 2 digitos a la vez.
*
* Por ultimo invertimos el numero para que lo muestre como debe, osea, en verdad
* como lo muestra el control mas que nada. Pero con que hayan hecho lo primero
* ya esta bueno segun yo, y es un logro.
*
* Les voy a hacer una traza de este, por si no lo entiende con el numero 123456:
*
*
* **** Primer while ****
* | copia | digitos | nuevo_numero |
* -----------------------------------
* | 123456 | 0 | 0 | Valores iniciales
* | 123456 | 56 | 56 |
* | 1234 | 99 | 5699 |
* | 12 | 99 | 569999 |
* -----------------------------------
*
* **** Segundo while ****
* | nuevo_numero | digito | nuevo_invertido |
* ------------------------------------------
* | 569999 | 0 | 0 | Valores iniciales
* | 569999 | 99 | 99 |
* | 5699 | 99 | 9999 |
* | 56 | 56 | 999956 |
* ------------------------------------------
*
* OJO: Esto funciona con cantidad de digitos pares, osea con un 1234567
* funciona mal.
*
*/

long modificaMenores9(){

int i = 0;
long copia = numero, nuevo_numero = 0, digitos = 0, nuevo_invertido = 0, digito = 0;

while(copia > 0){

digitos = copia%100;

if(digitos%10 + digitos/10 < 10){

digitos = 99;

}

nuevo_numero = (nuevo_numero*100)+digitos;

copia = copia/100;

}

/*
* Invertimos el numero, pero de a dos digitos
*/

while(nuevo_numero > 0){

digito = nuevo_numero%100; // Almacenamos el ultimo digito
nuevo_invertido = nuevo_invertido*100+digito; // Agregamos el digito a nuestro numero invertido
nuevo_numero = nuevo_numero/100; // Dividimos para avanzar al siguiente digito
i++;

}

return nuevo_invertido;

}

}


App

class AppControl2{

public static void main(String[]arg){

int op=1, op2=1, numero;

while(op != 0){

Control2 uno = new Control2();

while(op2 != 0){

System.out.println("");
System.out.println("[1] Numero generado");
System.out.println("[2] Digito Par");
System.out.println("[3] Numero Divisible");
System.out.println("[4] Modificado 9");
System.out.println("");
System.out.println("[0] Salir");
op2=Leer.datoInt();
System.out.println("");

switch(op2){

case 1:
System.out.println("El numero es: "+uno.getNumero());
break;

case 2:
if(uno.digitoPar()){

System.out.println("El numero SI es Numero Par");

} else {

System.out.println("El numero NO es Numero Par");

}
break;

case 3:
System.out.println("Divisibles por 2: "+uno.numeroDivisible());
break;

case 4:
System.out.println("Modificado 9: "+uno.modificaMenores9());
break;

case 0: // Si coloca SALIR no se hace nada, pero si se corta este while
break;

default: System.out.println("Opcion invalida. Intenta nuevamente.");

}

}

/*
* Al salir del menu, se pregunta si se desea genera otro numero
* con las opciones SI(1) y NO(2). Esa opcion es verificada en un
* switch que solo permite esas dos opcions. En el caso de que fuese
* SI 'op2' toma el valor de 1 para que entre nuevamente al segundo
* while. En el caso de que fuese NO, 'op' toma el valor de 0, y
* de este modo corta el while principal saliendo del programa.
*/

System.out.println("");
System.out.println("¿Desea generar otro numero? [1] SI | [2] NO");
op=Leer.datoInt();

switch(op){

case 1:
op2=1;
break;

case 2:
op=0;
break;

default: System.out.println("Opcion invalida. Intenta nuevamente.");
op2 = 0; // En el caso de colocar una opcion incorrecta
// Indicamos que 'op2' es 0 para que no entre al menu
// y se repita el while principala

}

}

System.out.println("Adios :)!");

}

}

Etiquetas Etiquetas: , , |

3 comentarios:

  1. The_wizard Says:

    Hola
    Mira, segun entendi al profesor la otra ves, para generar numeros mas grandes no basta con poner (long) al principio y darle tipo long...
    entendi algo asi como que todo numero se inicializa como int, y todo numero con decimal como double...
    por eso cuando usas float, tienes que poner la F despues del numero, para castearlo...
    ahora, para solucionar el problema puse esta linea...

    numero = (long)(Math.random()*(99999999999999l+1-100000)+100000);

    si te fijas el 99999999999999 no es una variable, por lo tanto tu no la declaras como int, el compilador solo la declara como int... lo que hice, fue castearla como long(le puse una L despues del numero)
    espero sirva de algo mi aporte... :S

    (te mandare enseguida el control2 de la seccion 4...)

    adios ;)

  2. Anónimo Says:

    teamoo
    fome tu blog no kasho na :B
    pero te amo igual uy-
    shaopeskao

  3. Álvaro Says:

    ojala exisitiera un blog como este pero para este año, por que este se ve viejito y yo soy d 1er año xD