[JAVA] Ejercicio Java , no se por donde cogerlo

Iniciado por Xh4xor23, 25 Marzo 2014, 20:12 PM

0 Miembros y 1 Visitante están viendo este tema.

Xh4xor23

Tema Resuelto.

ThinkByYourself

1. Le pasas un número al programa
2. Calculas la multiplicación de él por el anterior, por el anterior, por el anterior... y así hasta 1 (0 no porque sino se jode el invento).
3. Al resultado, le coges los dígitos de más a la izquierda, y vas cogiendo de dos en dos (si se queda uno suelto, también entra, creo...). Con cada par, coges y lo substituyes por el ASCII (en decimal, supongo) que le corresponda a dicho valor. Pero si el valor que forma la pareja es igual o menor que 32, en lugar de eso, lo cambias por un ~.
4. Imprimir cada vez que se pase por el 3, hasta terminar con todo el resultado del 2.
Creo.
No te voy a engañar.
Todos hemos sido programados para normalizar la psicopatía de las élites económicas y políticas, y para realimentar su patrón de ciega codicia.

Mitsu

#2
La verdad no te entiendo, pero supongo que quieres que a partir de un numero, se descomponga en parejas de derecha a izquierda, y convierta cada pareja en ascii y su queda un digito unico, lo convierte tambien. Este code te servirá:

Código (=java) [Seleccionar]

public static  void getAsciiPorNumeroEnPares(int numero) {
String digitos = String.valueOf(numero); // convierte el numero a string
String temp = digitos; // copia el string para recorrer el for
List<Character> digitosAscii = new ArrayList<>(); // almacena los caracteres ascii
// temp.length()/2 porque se toman los numeros en pareja
for(byte i=0; i<temp.length()/2; i++) {
int digito; // almacena el digito a guardar en ascii
if(digitos.length() >= 2) {
int inicio = digitos.length() -2; // inicio = cantidad de digitos del numero - 2
int finalx = digitos.length(); // final = cantidad de digitos del numero
// obtiene la ultima pareja (derecha) de los digitos
digito = Integer.valueOf(digitos.substring(inicio,finalx));
// elimina la pareja que se ha tomado de los digitos
digitos = digitos.substring(0,finalx-2);
}
else {
// si solo queda un digito lo convierte a entero para convertirlo a ascii
digito = Integer.valueOf(digitos);
}
digitosAscii.add((char) digito); // convierte el digito a ascii lo agrega a la lista
}
// recorre la lista de codigos ascii y los imprime
for(char c : digitosAscii)
System.out.println("Digito:\t"+c);
}

Xh4xor23

Cita de: Mitsu en 26 Marzo 2014, 06:33 AM
La verdad no te entiendo, pero supongo que quieres que a partir de un numero, se descomponga en parejas de derecha a izquierda, y convierta cada pareja en ascii y su queda un digito unico, lo convierte tambien. Este code te servirá:

Código (=java) [Seleccionar]

public static getAsciiPorNumeroEnPares(int numero) {
String digitos = String.valueOf(numero); // convierte el numero a string
String temp = digitos; // copia el string para recorrer el for
List<Character> digitosAscii = new ArrayList<>(); // almacena los caracteres ascii
// temp.length()/2 porque se toman los numeros en pareja
for(byte i=0; i<temp.length()/2; i++) {
int digito; // almacena el digito a guardar en ascii
if(digitos.length() >= 2) {
int inicio = digitos.length() -2; // inicio = cantidad de digitos del numero - 2
int finalx = digitos.length(); // final = cantidad de digitos del numero
// obtiene la ultima pareja (derecha) de los digitos
digito = Integer.valueOf(digitos.substring(inicio,finalx));
// elimina la pareja que se ha tomado de los digitos
digitos = digitos.substring(0,finalx-2);
}
else {
// si solo queda un digito lo convierte a entero para convertirlo a ascii
digito = Integer.valueOf(digitos);
}
digitosAscii.add((char) digito); // convierte el digito a ascii lo agrega a la lista
}
// recorre la lista de codigos ascii y los imprime
for(char c : digitosAscii)
System.out.println("Digito:\t"+c);
}



Muchas Gracias Mitsu, la verdad que os he puesto el enunciado tal y como nos lo dan y es que es francamente ilegible...

Te queria preguntar que necesito para compilarlo y probarlo (perdona mi ignorancia es que soy novato :S) porque lo he cargado en eclipse y me salen mogollon de errores imagino que sea porque tengo que añadir la clase..

De todas formas muchas gracias.

Mitsu

#4
Te salen errores en primera porque olvidé colocar el tipo de retorno al método (ya se lo puse, mira el nuevo código). Además, como eres nuevo intuyo que no sabes aún los conceptos de POO. No te preocupes, todo con calma, paso por paso. Es mejor para tí si haces todo en el main (programación estructurada) ,luego te darás cuenta que ésto no es lo óptimo ya que tendrás el determinado "código spaghetti".

Te sugiero que antes de empezar a realizar ejercicios en un lenguaje, primero estudies el lenguaje. Si no, es como tratar de desarrollar un problema de geometría sin haberla estudiado antes.

Código (=java) [Seleccionar]

public static void main (String[] args) {
Scanner read = new Scanner(System.in);
System.out.println("Ingresa un numero:");
int num = read.nextInt();
int numero = factorial(num);

String digitos = String.valueOf(numero); // convierte el numero a string
String temp = digitos; // copia el string para recorrer el for
List<Character> digitosAscii = new ArrayList<>(); // almacena los caracteres ascii
// temp.length()/2 porque se toman los numeros en pareja
for(byte i=0; i<temp.length()/2; i++) {
int digito; // almacena el digito a guardar en ascii
if(digitos.length() >= 2) {
int inicio = digitos.length() -2; // inicio = cantidad de digitos del numero - 2
int finalx = digitos.length(); // final = cantidad de digitos del numero
// obtiene la ultima pareja (derecha) de los digitos
digito = Integer.valueOf(digitos.substring(inicio,finalx));
// elimina la pareja que se ha tomado de los digitos
digitos = digitos.substring(0,finalx-2);
}
else {
// si solo queda un digito lo convierte a entero para convertirlo a ascii
digito = Integer.valueOf(digitos);
}
digitosAscii.add((char) digito); // convierte el digito a ascii lo agrega a la lista
}
// recorre la lista de codigos ascii y los imprime
for(char c : digitosAscii)
System.out.println("Digito:\t"+c);
}


PD: Si tu duda fue disipada, por favor marca el tema como solucionado.

acarllc

#5
Código (java) [Seleccionar]
import java.util.Scanner;

/*
* Se calculará el factorial del número de entrada.
* A continuación se recorrerá el número factorial tomando una pareja de dígitos comenzando en los dígitos
* más significativos (si queda uno se usará el dígito que queda) y sustituyendo ese par de dígitos
* por el carácter ASCII asociado al valor decimal del número formado por ellos.
*
* Si el número formado por los dígitos es menor o igual que 32, el carácter asociado será el carácter tilde '~'
*
* Finalmente se imprimirá la cadena resultante de realizar el paso 2 hasta que no queden dígitos del número
* factorial
*
* */

/**
* @author acarllc
* For elhacker.net
*/
public class Main {
private static Scanner in;

public static void main(String[] args) {
in = new Scanner(System.in);
new Main().process();
in.close();
}

private void process() {
int num = leerNumero();
String fact = calcularFactorial(num);
imprimirParejasEnAscii(fact);
}

private void imprimirParejasEnAscii(String pFact) {
int i = 0;
String dobleCaracterS = "";
int dobleCaracter;
while(i < pFact.length()){
dobleCaracterS += pFact.charAt(i);
i++;
if(i < pFact.length()){
dobleCaracterS += pFact.charAt(i);
i++;
}
dobleCaracter = Integer.parseInt(dobleCaracterS);
if(dobleCaracter < 32){
System.out.print("~");
}else{
System.out.print((char) dobleCaracter);
}
dobleCaracterS = "";
}
}

private String calcularFactorial(int pNum) {
String factS = "1";
int fact = 1;
for (int i=1; i<=pNum; i++) {
fact = fact * i;
}
factS = Integer.toString(fact);
return factS;
}

public short leerNumero(){
return in.nextShort();
}


}

Charlicines

Hola Xh4xor23, veras he intentado hacer ese ejercicio con una compañera de tu clase asi que mas o menos se lo que habeis dado en clase, asi que hice el programa de esta manera muy sencilla sin usar clases ni arrays y algunas mas cosas que seguro no habeis dado en clase asi que para que lo entiendas un poco aqui tienes. Tengo que decir que estoy dando programacion en el primer curso de una formacion profesional de grado superior por lo que mis conocimientos no son muy avanzados aun y parte de este codigo lo logre tomando como ejemplos algunas ideas que han aportado otras personas en este post con sus codigos, si veis algun fallo o algo que no os guste decidme :D

Código (java) [Seleccionar]
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package practica;

import java.util.Scanner;

/**
*
* @author Charlie
*/
public class Practica {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       
        Scanner sc = new Scanner(System.in);
       
        short num; //inicializamos la variable del numero que queremos pedir al usuario
               
        System.out.println("Introduca un numero entero positivo."); // un print donde avisemos al usuario que debe introducir el numero a continuacion
        num = sc.nextShort(); // pedimos por teclado un numero y lo guardamos en la variable "num"
       
        //Calculamos el factorial de num
       
       
        int fact = 1;
        for(int i = 2 ; i <= num ; i++){
            fact *= i;
        }
        System.out.println(fact); //no te lo pide el enunciado pero yo imprimo el resultado del factorial por comodidad y hacer mis comprobaciones
       
       
        String cadena = String.valueOf(fact); // pasamos a string el numero factorial para poder recorrerlo mas adelante en le "for"
       
       
        String parejaS = ""; // creamos esta variable string para guardar las parejas de digitos que vamos cogiendo del numero factorial
        int pareja; // lo mismo pero de tipo entero para mas adelante poder hacer la conversion a acsii, ya que solo funciona con numeros enteros no con string
       
        for (int i = 0; i < cadena.length(); i++) { //iniciamos el for
            parejaS += cadena.charAt(i); // aqui vamos cogiendo cada digito del numero factorial pasando por todas sus posiociones "i"
            while (parejaS.length() == 2) { // creamo un while para decirle al rpograma que solo vaya guardando digitos de dos en dos
                pareja = Integer.parseInt(parejaS); // y aqui es cuando pasamos esa pareja de digitos que estaban de tipo string a tipo entero
                if (pareja <= 32) {  // creamos un if y preguntamos que si la pareja de numero que hemos cogido anteriormente es menor o igual que 32 pues...
                    System.out.print("~"); // ... la imrpimimos haciendo que valga directamente "~"
                }else{ // en el caso de que no sea menor o igual a 32, es decir, mayor pues...
                System.out.print((char)pareja);  // hacemos la conversion de dicho numero pasandolo a acsii             
                }
                parejaS = ""; // y esto es para actualizar la variable, es decir, el factorial de 7 es 5040, pues una vez hecho todo el "if" anterior con el 50 pues se restablezca su valor a cadena vacia para deja paso al siguiente numero que seria el 40 y asi evitar que se nos amontonen los numeros
            }
        }   
       
        int n = cadena.length(); //como ultimo creamos una variable que nos diga la longitud de nuestra numero
        //si la longitud es impar significa que nos sobrara un numero que quedara solitario por ejemplo con el factorial de 8 que es 40320 el ultimo 0 se nos queda sin pareja, pues para cogerlo hacemos lo siguiente
        if (n%2 != 0) { // si la longitud de n es impar significa que sobra un numero al final por lo que...
            System.out.print("~"); // ese numero siempre será menor que 32 ya que solo es un digito y lo maximo es 9 asi que lo sustituimos por la "~"
        }       
   }
}


He probado el ejercicio con varios ejemplos no solo con el numero 7 y me va perfecto aqui tienes los ejemplos, suerte!!


Xh4xor23

Muchas Gracias , era exactamente lo que me pedía .
Si alguien mas quiere el enunciado se lo mando por privado.

Gracias al resto también.

Un salu2

7Bliz