Hola!

Registrándote como bakuno podrás publicar, compartir y comunicarte en privado con otros bakuos :D

Regístrame ya!

ayuda en java con maquina de cambio

roman777

Bovino maduro
Desde
13 Abr 2009
Mensajes
134
Tengo este codigo y quiero k me de la opcion que cuando ya no haya cambio de monedas de 10 se pueda combinar las de 5 y las de 1 peso para asi poder regresar el cambio de un billete de $ 100


package final_proy;

import java.util.Arrays;
import java.util.Scanner;

public class final_proy {

/**
* @param args
*/
public static void main(String[] args) {

Scanner S = new Scanner (System.in);

int[] Dinero = new int[] { 20, 50, 100 };
int[][] cambio = new int[][] { { 10, 25 }, { 5, 50 }, { 1, 75 } };
int valor = 0;
do {
System.out.print("Ingresa denominacion: ");
valor = S.nextInt();

if (Arrays.binarySearch(Dinero, valor) < 0)
System.out.println("Denominacion invalida");
else {
// System.out.println("Denominación valida");
System.out
.print("Para 10[1]\n Para 5[2]\n Para 1[3]\n Opcion: ");
int opcion = S.nextInt();
switch (opcion - 1) {
case 0:
int cantidad = cambio[0][0] * cambio[0][1];
if (valor <= cantidad) {
int moneda = valor / cambio[0][0];
cambio[0][1] -= moneda;
System.out.println("Su cambio es de " + moneda);
} else
System.out.println("No hay disponible");
break;
case 1:
cantidad = cambio[1][0] * cambio[1][1];
if (valor <= cantidad) {
int moneda = valor / cambio[1][0];
cambio[1][1] -= moneda;
System.out.println("Su cambio es de " + moneda);
} else
System.out.println("No hay disponible");
break;
case 2:
cantidad = cambio[2][0] * cambio[2][1];
if (valor <= cantidad) {
int moneda = valor / cambio[2][0];
cambio[2][1] -= moneda;
System.out.println("Su cambio es de " + moneda);
} else
System.out.println("No hay disponible");
break;
}
}
} while (valor != -1);
}
}
 
Vamos a crear dos funciones, una de ellas validará que aún quede cambio disponible, y la otra devolverá el cambio correspondiente.

Para ello utilizare tu propio código y le modificare un par de cosas.

Para la primera función vamos a tomar en cuenta el total de cambio disponible, no el total de cada nominacion:

Código:
boolean cambio_disponible_total()
{
   boolean disponible=false;

   int cantidad = cambio[0][0] * cambio[0][1]+cambio[1][0] * cambio[1][1]+cambio[2][0] * cambio[2][1];
   if (valor <= cantidad)
      disponible = true;
  
return disponible;
}
Ahora hagamos la función que devuelve el cambio:

Código:
int cambio(int i, int nominacion)
{

    int moneda = valor / cambio[i][0];
    cambio[i][1] -= moneda;

    if(moneda!=0)
    {
       if (valor<(cambio[i][0] * cambio[i][1]))
           System.out.println("su cambio es de"+moneda+" monedas de"+nominacion);
       else
           System.out.println("su cambio es de"+cambio[i][1]+" monedas de"+nominacion+" y se le dará el resto en monedas de otra nominacion por falta de monedas de "+nominacion);

    }
    valor=valor-nominacion*moneda;
return valor;
}

Si te das cuenta es casi el mismo código, excepto por:

valor=valor-nominacion*moneda;

¿que hace esto? Supongamos que quieres cambiar 100 en monedas de 10 (la nominacion), pero ya solo quedan 6 monedas de 10. Entonces valor=100, nominacion=10 y moneda=6: 100-10*6= 40 que aun faltan de cambiar. Esta función devuelve la cantidad que aún falte de cambiar, en caso no hayan suficientes monedas de la nominacion seleccionada. Valor al final valdría 40 (para este ejemplo).

Además, vemos que si hay suficiente cambio de la moneda seleccionada, la operación se hace sin problemas, sino, se procede a darle lo que queda en cantidad restante de la nominacion deseada y se le informa que se le dará el resto en otras nominaciones. Aparte se verifica que si se pueda dar cambio con esa nominación con el : if (moneda!=0)

Utilizamos estas funciones en tu código:


Código:
package final_proy;

import java.util.Arrays;
import java.util.Scanner;

public class final_proy {

/**
* @param args
*/

//Agregamos las funciones

boolean cambio_disponible()
{
   boolean disponible=false;

   int cantidad = cambio[0][0] * cambio[0][1]+cambio[1][0] * cambio[1][1]+cambio[2][0] * cambio[2][1];
   if (valor <= cantidad)
      disponible = true;
  
return disponible;
}


int cambio(int i, int nominacion)
{

    int moneda = valor / cambio[i][0];
    cambio[i][1] -= moneda;

    if(moneda!=0)
    {
       if (valor<(cambio[i][0] * cambio[i][1]))
           System.out.println("su cambio es de"+moneda+" monedas de"+nominacion);
       else
           System.out.println("su cambio es de"+cambio[i][1]+" monedas de"+nominacion+" y se le dará el resto en monedas de otra nominacion por falta de monedas de "+nominacion);

    }
    valor=valor-nominacion*moneda;
return valor;
}



public static void main(String[] args) {

Scanner S = new Scanner (System.in);

int[] Dinero = new int[] { 20, 50, 100 };
int[][] cambio = new int[][] { { 10, 25 }, { 5, 50 }, { 1, 75 } };

int valor = 0;
do {
System.out.print("Ingresa denominacion: ");
valor = S.nextInt();

if (Arrays.binarySearch(Dinero, valor) < 0)
System.out.println("Denominacion invalida");
else {
// System.out.println("Denominación valida");
System.out
.print("Para 10[1]\n Para 5[2]\n Para 1[3]\n Opcion: ");
int opcion = S.nextInt();

//Verificamos que haya cambio disponible en total

if(cambio disponible)
{
   switch (opcion - 1) {
   case 0:

      if (cambio(0,10)>0) /*si es cierto, quiere decir que no alcanzaron las de 10*/
          if (cambio(1,5)>0) /*Si es cierto, quiere decir que no alcanzaron las de 5*/
              cambio(2,1);

   break;

   case 1:

      if (cambio(1,5)>0) /*si es cierto, quiere decir que no alcanzaron las de 5*/
          if (cambio(0,10)>0) /*Si es cierto, quiere decir que no alcanzaron las de 10*/
              cambio(2,1);
   break;

   case 2:

      if (cambio(2,1)>0) /*si es cierto, quiere decir que no alcanzaron las de 1*/
          if (cambio(0,10)>0) /*Si es cierto, quiere decir que no alcanzaron las de 10*/
              cambio(1,5);
   break;
   }
}
else
   System.out.println("No hay cambio disponible, intente mas tarde");
}
} while (valor != -1);
}
}
Entonces, supongamos que quiero cambio en monedas de 5, para 20, pero ya solo tengo 3 monedas de 5. Sería el case 1, y haría:

Código:
if (cambio(1,5)>0)

En este punto ya se mando a escribir que el cambio es de 3 monedas de 5 y que se le dará el resto en otra nominación. Pero como valor = 5, la condición es cierta y pasa a :

Código:
 if (cambio(0,10)>0)

En este punto, como valor=5, moneda =0 (porque 5/10 =0), entonces valor sigue siendo 5 (porque el if en la función cambio() no se cumple) y la condición es verdadera, por lo que pasamos a la ultima linea:

Código:
cambio(2,1);

Donde se le darán las 5 monedas de a 1 restantes. Aún faltaría validar que pasa si no hay monedas de a 1 ni a 5, y el valor a cambiar es 5, y solo tengo una moneda de 10. Pero eso te lo dejo, el problema principal ya esta resuelto, espero haberte ayudado y espero haberme dado a entender. Si tienes preguntas, no dudes en hacerlas.

Saludos
 
yo estoy empesando en ingeneria en sistema apoko todo eso me lo tengo que aprender
para mi es como invocar al diablo jejejejejejeje
 
HOLA, ME PUEDES AYUDAR CON ESTE OTRO PORFA "salandrews"
cómo puedo guardar el contenido de mis 3 arreglos en un solo archivo de salida.txt.
y como puedo mostrar el contenido de cualquier archivo.


#include <stdio.h>
#include <conio.h>
#include <string.h>


void main(void)
{

FILE *fp1;
FILE *fp2;
FILE *fp3;
char archivo_1[80], archivo_2[80], archivo_3[80];
int lista_1[10], lista_2[10], lista_3[10], dato_leido, i;

clrscr();
strcpy(archivo_1,"c:\\tc3\\lista_1.txt");

fp1 = fopen (archivo_1,"r");
if (fp1 == NULL) {
printf("\n\n\tNo se pudo abrir el archivo %s", archivo_1);
perror("\nError:");
getch();
return;

} /* end-if */

fscanf(fp1,"%d",&dato_leido);
i = 0;
while (!feof(fp1)) {
lista_1 = dato_leido;
i++;
fscanf(fp1,"%d",&dato_leido);

} /* end-while */


fclose(fp1);

printf("\n\nMuestra el contenido del arreglo lista 1 [] \n\t");

for (i = 0; i < 10; i++)
printf("%d ",lista_1);

printf("\n\nPresione cualquier tecla para ver lista 2...");
getch();


// Clrscr();
strcpy(archivo_2,"c:\\tc3\\Lista_2.txt");

fp2 = fopen (archivo_2,"r");
if (fp2 == NULL) {
printf("\n\n\tNo se pudo abrir el archivo %s", archivo_2);
perror("\nError:");
getch();
return;

} /* end-if */

fscanf(fp1,"%d",&dato_leido);
i = 0;
while (!feof(fp2)) {
lista_2 = dato_leido;
i++;
fscanf(fp1,"%d",&dato_leido);

} /* end-while */


fclose(fp1);

printf("\n\nMuestra el contenido del arreglo lista 2 [] \n\t");

for (i = 0; i < 10; i++)
printf("%d ",lista_2);

printf("\n\nPresione cualquier tecla para ver la suma de las listas...");
getch();

for (i = 0; i < 10; i++)
lista_3 = lista_1 + lista_2;

printf("\n\nMuestra el resultado de las listas [] \n\t");

for (i = 0; i < 10; i++)
printf("%d ",lista_3);


printf("\n\nPresione cualquier tecla para generar archivo...");
getch();

printf("\n\n");

strcpy(archivo_1,"c:\\tc3\\lista_3.txt");
strcpy(archivo_2,"c:\\tc3\\lista_3.txt");
//strcpy(archivo_3,"c:\\tc3\\lista_3.txt");

fp1 = fopen (archivo_1,"w");
if (fp1 ==NULL) {
printf("\n\n\tNo se pudo abrir el archivo %s", archivo_1);
perror("\nError:");
getch();
return;
} /* end-if */

fp2 = fopen (archivo_2,"w");
if (fp2 ==NULL) {
printf("\n\n\tNo se pudo abrir el archivo %s", archivo_2);
perror("\nError:");
getch();
return;
} /* end-if */

//for (i = 9; i >=0; i--)
for (i = 0; i <=9; i++)
fprintf(fp1,"%d\r\n", lista_1);

fprintf(fp2,"%d\r\n", lista_2);


fclose(fp1);
fclose(fp2);

printf("\n\nSe creo el archivo lista_3.txt...");
getch();

} /* end-main */
 
Volver
Arriba