Autor Tema: problema de devolucion y cambio en Java  (Leído 18282 veces)

galoroca2013

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 9
    • Ver Perfil
problema de devolucion y cambio en Java
« en: 22 de Enero 2014, 18:27 »
Hola buenas tardes antes de cualquier cosa Felicitaciones por tan excelente Foro; es lo mejor que he encontrado en la red; asi mismo agradezco cualquier tipo de ayuda que me pùedan prestar. Estoy haciendo el programa de "devolucion y cambio" en java pero no me funciona y no encuentro donde está el error. El enunciado es el siguiente:
Se tiene un conjunto de N tipos de monedas, cada una con un valor xi. Se supone que contamos con una cantidad ilimitada de monedas de cada tipo. El problema consiste en hallar el número mínimo de monedas que necesitamos para dar una cierta cantidad C.
Hay que tener en cuenta que un algoritmo voraz que eligiese siempre la moneda de mayor valor que se pueda tomar para acercarse a la cantidad C no funcionaría para cualquier conjunto de tipos de monedas. Por ejemplo, si tenemos monedas de valores 1, 6 y 10, y la cantidad a completar fuera 24, la estrategia voraz elegiría las siguientes monedas: 10, 10, 1, 1, 1 y 1. Es decir se darían 6 monedas, cuando es posible devolver esa cantidad con solo 4 monedas de valor 6.
2.2.- Argumentos y parámetros La práctica se invoca usando la siguiente sintaxis:
cambio [-t][-h] [fichero_entrada] [fichero_salida]
Los argumentos son los siguientes:
-t: traza cada paso de manera que se describa la aplicación del algoritmo utilizado.
-h: muestra una ayuda y la sintaxis del comando.
fichero_entrada: es el nombre del fichero del que se leen los datos del sistema monetario: número de tipos de monedas y sus valores y la cantidad que se desea devolver.
fichero_salida: es el nombre del fichero que se creará para almacenar la salida. Si el fichero ya existe, el comando dará un error. Si falta este argumento, el programa muestra el resultado por pantalla.
2.3- Datos de entrada
El fichero de datos de entrada consta de:
Una primera línea que indica la cantidad que se desea devolver, C.
Una segunda línea que indica el valor de N que es el número de tipos de moneda del sistema monetario.  N líneas con un valor cada una que expresa el valor de una moneda. Estas líneas estarán ordenadas de forma creciente. La entrada termina cuando se llega al final del fichero.  Por ejemplo, supongamos que se desea devolver la cantidad C=24, que el sistema monetario dispone de 3 tipos de moneda y sus valores son 1, 6 y 10. El fichero de entrada contendría:
24
3
1
6
10
2.4- Datos de salida
La salida es una secuencia de líneas indicando en cada línea la cantidad de cada tipo de moneda que hay que utilizar, solo si dicha cantidad es distinta de 0.
En el ejemplo, la salida sería:
4 monedas de 6
Mi programa esta desarrollado con una sola clase

Si alguien me puede indicar dónde y como solucionar el error quedaré muy agradecida.
Un saludo.

 
« Última modificación: 29 de Septiembre 2014, 14:11 por Alex Rodríguez »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2074
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:devolucion y cambio
« Respuesta #1 en: 22 de Enero 2014, 22:34 »
Hola Olga, al poner el código como texto hay determinadas partes que el editor toma como etiquetas y no queda correctamente escrito (por eso lo he borrado de tu anterior mensaje, ya que quedó ilegible). Para insertar el código haz lo siguiente: pulsa el icono # del editor del foro. Cuando lo haces, te aparecerán las metaetiquetas [ code] [ / code] . A continuación escribe el código dentro de esas metaetiquetas, así el editor no te introducirá cambios, sino que el código quedará "tal cual". Ejemplo:

Código: [Seleccionar]
line1
line2
for int i = 0; i<10; i++
etc.
etc.

No he mirado el código por lo que te he comentado, esperaré a ver si lo puedes poner como te he indicado, no obstante hay una primera cosa que llama la atención. ¿Por qué tienes desarrollado el programa en una sola clase java? ¿No sería más lógico usar varias clases?

Por otro lado indicas que no usas estrategia voraz, ¿qué estrategia es la que aplicas?


Responsable de departamento de producción aprenderaprogramar.com

galoroca2013

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 9
    • Ver Perfil
Re:devolucion y cambio
« Respuesta #2 en: 23 de Enero 2014, 00:27 »
Hola Cesar espero que te llegue esta mensaje; antes de cualquier cosa gracias por responder tan pronto, gracias por tan excelente foro y gracias por todo lo aprendido; así mismo los animo a seguir con esta idea; para nosotros los principiantes en la programación es un soporte único; sigan Adelante que pocos foros de programación son tan buenos como este.
Por otra parte contesto a la pregunta; implemente el programa en una sola clase por sugerencia de mi tutor, porque cuando inicie la asignatura no sabia nada bsolutamente nada de programación en Java, él me dijo que eso facilitaria la implementación en el desarrollo de la practica, dijo que así no se me complicaria; por lo que también estoy muy agradecida con él.  Si revisas en mis mensajes anteriores he manifestado mi interés en realizar un curso via online con ustedes de Java, debido a que las otras asignaturas que tengo que homologar están basadas en Java.
Por último te copio nuevamente lo que he realizado de la práctica a ver si la puedes ver, es de anotar que es mi primer programa en Java y que todo lo que he realizado lo he hecho ayudada por este gran foro.

...

 
« Última modificación: 23 de Enero 2014, 08:32 por César Krall »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2074
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:devolucion y cambio
« Respuesta #3 en: 23 de Enero 2014, 08:41 »
Hola, nuevamente problema con el código al pegarlo, no pasa nada, te indico nuevamente cómo se debe hacer para insertar código. Te lo indico paso a paso para que no haya dudas:

1) Inicia sesión en el foro
2) Sitúate en este último mensaje y pulsa sobre el icono "Responder"
3) A continuación te aparece el editor donde escribir. En la parte de encima del editor aparecen distintos iconos.
4) Escribe el texto que quieras, por ejemplo "Hola, aquí adjunto el código:"
5) Pulsa enter dos veces para dejar una pequeña separación
6) Pulsa el icono con un símbolo # que tienes entre los iconos que aparecen encima del espacio donde se escribe. Cuando pulsas ese icono, te aparecerá en el espacio donde se escribe [code ] [/ code]
7) Pega el código justo en medio de esas dos etiquetas, por ejemplo [code ] public class Test () { ... etc ... etc ...[/ code]
8 ) Pulsa "Previsualizar". Al ver el mensaje debes comprobar que el código aparece así:
Código: [Seleccionar]
public class Test ()
línea 1
línea 2
etc.
etc.
etc.

9) Si todo está correcto, pulsa "Publicar". Si hay algo incorrecto, cambia lo que sea oportuno en el editor y vuelve a pulsar previsualizar tantas veces como sea necesario hasta que todo esté correcto.

He intentado explicarlo lo mejor posible, si tienes algún problema avísame. Saludos!


Responsable de departamento de producción aprenderaprogramar.com

galoroca2013

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 9
    • Ver Perfil
Re:devolucion y cambio
« Respuesta #4 en: 23 de Enero 2014, 10:30 »
Hola Cesar buenos días gracias por tan excelente explicación ¡como lo haces siempre ! espero que te llegue. Quedo al pendiente de cualquer aporte de tun parte; espero que tengas un buen dia y nuevamente gracias.
Código: [Seleccionar]
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;

public class cambio
{
private static boolean t = false;
private static boolean h = false;
private static String fichero_entrada = null;
private static String fichero_salida = null;
private static String fichero_solucion;
private int[][] matrizCambio;
private int[] vectorMonedas;
private int cantidad;
private int[] vectorSeleccion;
public cambio(int i, int[] js) {
// TODO Auto-generated constructor stub
}
public static void main(String[] args){
//Argumentos de prueba - Borrar
//args = new String [] {"-t","-h", "fichero_entrada","fichero_salida"};
if(args.length<=1){
for(int i=0;i<args.length;i++){
if(args[i].equals("-h")){
h = true;
}
else if(args[i].equals("-t")){
t = true;
}
else if(fichero_entrada == null){
fichero_entrada = args[i];
}
else{
fichero_salida = args[i];
}
}
if(h){
System.out.println("----------------------------- AYUDA --------------------------------");
System.out.println("cambio [-t][-h] [<fichero_entrada>][<fichero_salida>]");
System.out.println("   -t: Traza cada paso del algoritmo y describe utilización del algoritmo");
System.out.println("   -h: Muestra una ayuda y la sintaxis del comando");
System.out.println("   fichero_entrada: Se leen los datos del S.M No. de tipo de monedas y la cantidad que se desea devolver");
System.out.println("   fichero_salida: Almacena la salida, si el fichero ya existe el comando dara un error");
System.out.println("----------------------------------------------------------------------------------------------------------");
}
if(fichero_entrada != null){
ArrayList<String> lista=leerFichero(fichero_entrada);
// if(tieneSolucion(lista)){
String resultado = calcularCambio(lista);
if(fichero_salida !=null){
guardarSolucion(fichero_salida, resultado);
}
System.out.println("Resultado: "  + resultado);
//  }
//  else{
//  System.ot.println("No tiene solucion");
//
//    }
} else{
System.out.println("Faltan argumentos");
}
}
}
private static String calcularCambio(ArrayList<String> lista) {
// TODO Auto-generated method stub
return fichero_solucion;
}
private static ArrayList<String> leerFichero(String rutaFichero){
ArrayList<String>lista=new ArrayList<String>();
try {
Scanner s=new Scanner(new File(rutaFichero));           
while (s.hasNext()){
lista.add(s.next());
}
s.close();
}catch (FileNotFoundException e) {
System.out.println(e);
}
return lista;
}
/**
* Metodo con el que guardamos la solucion en el fichero de salida
*
* @param String filename, con el que indicamos el nombre del nuevo sifhero de salida.
* @param ArrayList<Integer> lista, con los valores que vamos a guardar en el fichero.
* */
private static void guardarSolucion(String filename, String resultado) {
BufferedWriter bufferedWriter = null;
//Crea un nuevo bufferedWritter y comprueba si hay excepciones
try {
bufferedWriter = new BufferedWriter(new FileWriter(filename));
bufferedWriter.write("resultado: "+ resultado);
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
finally {
//Cierra el bufferedWritter
try {
if (bufferedWriter != null) {
bufferedWriter.flush();
bufferedWriter.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
void Cambio(int cantidad, int[]  monedas){
this.cantidad = cantidad;
this.vectorMonedas = monedas;
matrizCambio = calcularMonedas(cantidad, monedas);
vectorSeleccion = seleccionarMonedas(cantidad, monedas, matrizCambio);
}
public int[] getVectorSeleccion(){
return this.vectorSeleccion;
}
private int[][] calcularMonedas(int cantidad, int[]  monedas){
int[][] matrizCambio = new int[monedas.length + 1][cantidad + 1];
for (int i = 0; i < monedas.length; i++)
matrizCambio[i][0] = 0;
for (int j = 1; j <= cantidad; j++)
matrizCambio[0][j] = 99;
for (int i = 1; i <= monedas.length; i++)
for (int j = 1; j <= cantidad; j++) {
if (j < monedas[i - 1]) {
matrizCambio[i][j] = matrizCambio[i - 1][j];
} else {
int minimo = 0;
minimo = min(matrizCambio[i - 1][j] , matrizCambio[i][j- monedas[i - 1]] + 1);
matrizCambio[i][j] = minimo;
}
cambio c = new cambio(24, new int[]{1,6,10});
c.getVectorSeleccion();
}
return matrizCambio;
}
private int[] seleccionarMonedas(int c, int[] monedas, int[][]tabla ){
int i,j;
int[] seleccion = new int[monedas.length];
for(i = 0; i< monedas.length; i++){             seleccion[i]=0;         }         i= monedas.length;         j= c;         while(j>0){
if(i>1 && tabla[i][j]==tabla[i-1][j]){
i--;
}
else{
seleccion[i-1]++;
j = j - monedas[i-1];
}
}
return seleccion;
}
private int min(int a, int b){
if(a<b)
return a;
else
return b;
}
}

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2074
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:devolucion y cambio
« Respuesta #5 en: 23 de Enero 2014, 23:24 »
Ahora sí entró bien el código. Tengo que mirarlo con calma porque esto no se puede revisar en cinco minutos... iré comentando cuestiones a medida que lo vaya viendo. Saludos.
Responsable de departamento de producción aprenderaprogramar.com

galoroca2013

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 9
    • Ver Perfil
Re:devolucion y cambio
« Respuesta #6 en: 23 de Enero 2014, 23:53 »
Muchísimas gracias Cesar, yo estoy muy al pendiente de cualquier información que me puedas enviar.

Que tengas buena noche

Un saludo

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2074
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:devolucion y cambio
« Respuesta #7 en: 24 de Enero 2014, 09:54 »
He comenzado a revisar y como primera cuestión me he encontrado la siguiente:

    public static void main(String[] args){
        if(args.length<=1){

      ... aquí se trata de hacer una identificación de los argumentos que recibe el método main


}


La cuestión es: args.length representa el número de elementos en el array de parámetros que recibe el método main y que se supone que indican los parámetros de ejecución. Si pones args.length <=1 (estás considerando el caso de que vengan 0 ó 1 argumentos) después no tiene sentido que trates de comprobar qué parámetros son los que vienen, porque si entras en ese if significa que te vienen cero o un parámetros para ejecutar el programa. Entiendo que lo mínimo que necesitas es 1 argumento que será -h para pedir la ayuda, lo siguiente mínimo serán 2 argumentos que serán el fichero de entrada y el fichero de salida. args.length te devuelve el número de argumentos y no el índice máximo del array args, quizás ahí esté la confusión.

Supongamos un array mesa que tiene como elementos mesa[0] y mesa[1]. Entonces mesa.lenght te devuelve 2 porque es el número de elementos de que consta el array, a pesar de que el índice máximo dentro del array sea 1.


Supongamos que cambiamos la condición por if(args.length>=1){ ...

si sigo la traza de ejecución llegaríamos a String resultado = calcularCambio(lista); y si buscamos este método encontramos:

    private static String calcularCambio(ArrayList<String> lista) {
        // TODO Auto-generated method stub
        return fichero_solucion;
    }

La pregunta es: ¿qué hace el método calcularCambio?

Responsable de departamento de producción aprenderaprogramar.com

galoroca2013

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 9
    • Ver Perfil
Re:devolucion y cambio
« Respuesta #8 en: 24 de Enero 2014, 10:48 »
Hola Cesar buenos días, mira calcularCambio tiene que calcular el número de monedas a devolver; siempre y cuando se tenga dentro de ellas la unidad(1) porque de lo contrario dará un error. No sé si me explique bien pero es la idea.  Nuevamente gracias por tu ayuda, ya no me siento tan sola en esto y te lo debo a ti; necesitaba a alguien que me ayudara; hay muchas cosas que no entiendo yo he tratado de realizarlas leyendo aquí en este gran foro y buscando en los libros, pero no es nada fácil y menos cuando se estudia a distancia.

Espero que pases un buen día.

Un saludo



César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2074
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:devolucion y cambio
« Respuesta #9 en: 25 de Enero 2014, 12:47 »
Sí, te has explicado bien, lo que te preguntaba es si tú esperabas que este método hiciera algo:

    private static String calcularCambio(ArrayList<String> lista) {
        // TODO Auto-generated method stub
        return fichero_solucion;
    }

Porque a mí la impresión que me da es que no hace nada (o al menos no me parece que haga nada útil), pero no sé si tú estabas suponiendo que debía hacer algo.

De cualquier forma voy a mirarlo con más calma cuando pueda. Saludos.

Responsable de departamento de producción aprenderaprogramar.com

galoroca2013

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 9
    • Ver Perfil
Re:devolucion y cambio
« Respuesta #10 en: 25 de Enero 2014, 14:08 »
Bueneos días Cesar; Por  eso me devuelve NULL o fichero no encontrado? Una pregunta Cesar el NULL que és lo que hace realmente en un programa? porque estoy hecha todo un lio.......

Que tengas buen fin de semana y muchas gracias!!
 




César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2074
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:devolucion y cambio
« Respuesta #11 en: 26 de Enero 2014, 21:49 »
Hola, NULL puede tener distintos significados en java. Uno de ellos es que un objeto que has creado no tiene contenidos válidos o no ha sido inicializado a contenido alguno.

Te copio "la definición": La palabra clave null indica que un objeto se encuentra vacío, carente de contenido. Esto puede deberse a que no se ha inicializado, a que su contenido ha sido eliminado usando una instrucción del tipo nombreDelObjeto = null;, o a otros motivos.


Si te fijas como atributo de la clase cambio tenemos private static String fichero_salida = null;

El atributo es static (de clase) y se está inicializando como null (vacío).


Suponiendo que invocamos con estos atributos: "-t","-h", "datosCambio.txt","resultadosCambio.txt"

lo que veo que hace el programa es

1) Comprobar si hay atributos (suponiendo que usamos if(args.length>=1) )

2) Recorrer los atributos de entrada almacenados en el vector args y reconocer si viene una h, una t, un nombre de fichero de entrada y/o un nombre de fichero de salida.

3) Si hay fichero de entrada lee los datos y los guarda en el ArrayList lista

4) Crea un String denominado resultado que llama al método calcularCambio y le pasa como parámetro el ArrayList lista

5) El método calcular cambio hace return fichero_solucion; siendo fichero_solucion un atributo de clase, tipo String, que no se ha inicializado y por tanto contiene null. Por tanto resultado contiene null (¿qué significado tiene el uso de este atributo denominado fichero_solucion?)

6) Se invoca guardarSolucion(fichero_salida, resultado);

7) En el método se escribe bufferedWriter.write("resultado: "+ resultado); y como resultado vale null, aparece por pantalla resultado: null

Responsable de departamento de producción aprenderaprogramar.com

galoroca2013

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 9
    • Ver Perfil
Re:devolucion y cambio
« Respuesta #12 en: 27 de Enero 2014, 11:21 »
Hola Cesar buenos días, ¡ gran foro es éste! y tú "eres excelente" transmitiendo tus conocimientos, graciasssss

Un saludo

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".