Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Kabuto

Páginas: 1 ... 15 16 17 18 19 [20] 21 22 23 24 25 ... 50
381

SI ME DAN LA REPUESTA LES AGRADEZCO MUCHISIMO

¿Solo quieres eso? ¿La respuesta?
¿No quieres intentar aprender a resolverlo tú?

Si solo quieres la respuesta, aquí la tienes: https://onlinegdb.com/_ANwO9XD1

Si quieres intentarlo, no pinches en ese enlace. Olvídalo y ponte a escribir código.

Comienza por pequeños objetivos. Por ejemplo simplemente haz que el programa pida un nombre y se repita continuamente hasta que el nombre sea "ZZZ".

Una vez tengas eso, haz que además pida el tipo de combustible, indicando que introduzca "I", "S", "D" o "ID" según el tipo que quiera elegir.
Puedes usar un bucle o un método para hacer que esta petición se repita hasta que te de uno de esos 4 valores posibles.
O simplemente aceptar cualquier cosa que el usuario introduzca si de momento no quieres complicarlo más.

Después añade que introduzca la modalidad. Que teclee "P" si quiere hacerlo "por precio" o "C" si prefiere "por capacidad".
De nuevo, elige si quieres hacer que la petición se repita hasta asegurarte de que recibes uno de esos valores, o aceptar cualquier cosa que el usuario teclee sin validar nada.

Ahora añade un IF para comprobar que modalidad ha indicado.
Si es "C", pues pide al usuario los litros que desea. No hagas nada con ellos por ahora, de momento solo pídelos.
Si en cambio es "P", pues entonces pide el importe en dólares.

Llegados a este punto, habría que escribir y usar los métodos que calculan el importe según la capacidad indicada, o bien, calcula la capacidad según importe indicado.

Pero esto déjalo para después. De momento intenta, si quieres, conseguir todo lo que hemos comentado.

Y si solo quieres la respuesta, pues la tienes en ese enlace que te he puesto.
Tú decides.
Un saludo.

382
Muestra lo que tengas o al menos explica que enfoque le estás dando.
Por ejemplo, supongo que Caso será una clase, pero ¿qué atributos tiene, o has decidido que va a tener?
¿ID de caso?
¿Nombre paciente?
¿DNi/Cedula paciente?
¿Fecha Nacimiento?
...


383
Para dar de baja, no podemos borrar directamente en el archivo. Hay que leer su contenido obviando lo que queremos "borrar" y luego volver a escribirlo todo, ya sin el dato que se ha de dar de baja.

Por otra parte, en este programa se requiere un menú de opciones y recomiendo usar métodos para cada acción, uno para escribir las altas, otro para hacer las bajas y otro para las consultas.

Te dejo una posible solución, con un menú mediante JOptionPane.
Hay comentarios explicando, pero pregunta cualquier cosa que no entiendas.
Un saludo.

Código: [Seleccionar]
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;

import javax.swing.JOptionPane;

public class ProyectoFinal {

public static void main(String[] args) {

final String[] OPCIONES = new String[] {"Alta", "Baja", "Consulta", "SALIR"};
int opcion = 0;

do {
opcion = JOptionPane.showOptionDialog(null, "Elija opcion:", "Menu Registro",
opcion, JOptionPane.QUESTION_MESSAGE, null, OPCIONES, null);

switch(opcion) {
case 0:
String nuevoNombre = JOptionPane.showInputDialog(null, "Ingresa el nombre",
                        "Solicitando datos", JOptionPane.QUESTION_MESSAGE);
String nuevoControl = JOptionPane.showInputDialog(null, "Ingresa el control",
                        "Solicitando datos", JOptionPane.QUESTION_MESSAGE);
alta(nuevoNombre, nuevoControl);
break;
case 1:
String borrarNombre = JOptionPane.showInputDialog(null, "Ingresa el nombre",
                        "Dar de baja", JOptionPane.QUESTION_MESSAGE);
baja(borrarNombre);
break;
case 2:
String consultaNombre = JOptionPane.showInputDialog(null, "Ingresa el nombre",
                        "Consultar", JOptionPane.QUESTION_MESSAGE);
String consulta = consulta(consultaNombre);
if (consulta == null)
JOptionPane.showMessageDialog(null, "No hay registro con ese nombre", "Consultar",
JOptionPane.WARNING_MESSAGE);
else
JOptionPane.showMessageDialog(null, "Datos encontrados:\n" + consulta, "Consultar",
JOptionPane.INFORMATION_MESSAGE);
break;
case 3:
JOptionPane.showMessageDialog(null, "FIN DE PROGRAMA", "Salir",
JOptionPane.INFORMATION_MESSAGE);
}
}while (opcion != 3);


}

private static void alta(String nombre, String control) {

try {
BufferedWriter escritor = new BufferedWriter(new FileWriter("proyecto.txt", true));
escritor.write(nombre + " -- " + control); //Escribimos nueva linea con los datos
escritor.newLine();
escritor.close();
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Error: " + ex.getMessage(), "Nueva Alta",
JOptionPane.WARNING_MESSAGE);
}
}

private static void baja(String nombre) {
/*
* Para dar de baja no podemos borrar directamente del archivo.
* Hay que leer todos los datos, excepto la línea a dar de baja y
* volver a escribir el resto.
*/
StringBuilder datosLeidos = new StringBuilder(); //Aquí almacenaremos las líneas leídas
try {
BufferedReader lector = new BufferedReader(new FileReader("proyecto.txt"));
String linea = lector.readLine(); //Leemos primera línea
while (linea != null) { //Mientras hayan líneas para leer...
if (!linea.startsWith(nombre)) //Si NO es la linea que queremos dar de baja
datosLeidos.append(linea + "\n"); //La guardamos

linea = lector.readLine(); //Leemos siguiente línea
}
lector.close();

//Ya hemos leído todos los datos excepto el que queremos dar de baja.
//Volvemos a volcarlos en el archivo de texto
BufferedWriter escritor = new BufferedWriter(new FileWriter("proyecto.txt", false));
escritor.write(datosLeidos.toString());
escritor.close();
//Proceso de baja terminado.
JOptionPane.showMessageDialog(null, "Registro Actualizado", "Baja",
JOptionPane.INFORMATION_MESSAGE);
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Error: " + ex.getMessage(), "Baja",
JOptionPane.WARNING_MESSAGE);
}
}

private static String consulta(String nombre) {
/*
* Para consultar buscamos por nombre en el archivo de texto
* y retornamos la línea de datos que corresponde
*/
try {
BufferedReader lector = new BufferedReader(new FileReader("proyecto.txt"));
String linea = lector.readLine();
while (linea != null) {
if (linea.startsWith(nombre)) { //Nombre encontrado, no hay que seguir buscando
lector.close(); //Cerramos lector
return linea; //Retornamos línea encontrada.
}
else //Si no, seguimos consultando líneas.
linea = lector.readLine();
}
lector.close();
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Error: " + ex.getMessage(), "Consulta",
JOptionPane.WARNING_MESSAGE);
}

//Si durante la lectura no se ha retornado la línea buscada,
//es que no existe el nombre que se busca. Retornamos null.
return null;
}

}

384
Revisa los nombres de variables, que estás usando.

-No estás usando ninguna agenda, si no un inventario. Tu HashTable se llama Inventario y es ahí donde tienes que agregar los productos
- No tienes ni necesitas ninguna variable "nombre"
- Al leer producto, has escrito mal el nombre, has puesto "productro"

Citar
            private static void Inventario() //AGREGAR PRODUCTO
            {
               
                string producto;
                int codigo;
                Console.Write("Procudto: ");
                productro = Console.ReadLine();
                Console.Write("Codigo: ");
                codigo = Convert.ToInt32(Console.ReadLine());
                agenda.Add(nombre, codigo);

                Console.WriteLine("Producto: {0} Codigo: {1}", nombre, codigo);

                return;
            }

385
Muy bien.

Efectivamente, el main lo ideal es que tenga el menor código posible. Es decir, la mayor parte de la lógica y funcionalidades debería estar en las otras clases.
El main solo debería invocarlas para ponerlas en marcha.

Esto implica que ahora tus clases Deck y Card son "autónomas". No están ligadas ni sometidas a ningún "main" en concreto y por tanto podrían ser usadas desde cualquier otro programa Java que las incluyese en sus librerías.

Solo comentar una cosita, de escasa importancia.
En la clase Deck, tras barajar las cartas las muestras con un foreach referenciando las cartas como Object.
Citar
    public void suflle() {
        Collections.shuffle(deck);
        System.out.println("Se mezcló el Deck.");
        for (Object elemento : deck) {
            System.out.print(elemento + " / ");
        }
    }

Esto funciona bien y no pasa nada.
Pero quizás sería más lógica referenciarlas directamente como Card

Citar
    public void suflle() {
        Collections.shuffle(deck);
        System.out.println("Se mezcló el Deck.");
        for (Card elemento : deck) {
            System.out.print(elemento + " / ");
        }
    }


Un saludo.

386
De hecho ahora me fijo que tampoco guardas los números en la lista (en el array)

A ver, limpiando un poco variables y líneas de código que no se usan, el programa podría quedar así:

Código: [Seleccionar]
#include <stdlib.h>
#include <stdio.h>

 int main()
 {
    int k;
    int t=40;
    int total = 0;
    int llave;
    int lista2[100], numero;
   
    printf("instrucciones: \n");
    printf("El juego trata sobre encontrar todas las veces que se repite un mismo numero en una lista de 100 numeros entre 1 y 9, \n para comenzar a jugar, eliges un numero entre 1 y 9, la computadora generará una lista aleatoria de números y luego \n aparecera el numero que tienes que buscar, la lista y el numero a encontrar son diferentes dependiendo del numero que \n elijas al principio, tienes 40 segundos para encontrar todas las veces que se repite, cuando termines ingresas cuantos encontraste en el apartado al final, ganas si respondes antes de que termine el tiempo y pierdes si se te acaban los 40 segundos" );
    printf("\n");
    printf( "Para continuar introduce un numero entre 1 y 9: " );
    scanf( "%d", &llave );
   
    srand( llave );
    for ( int i = 1; i <= 100; i++ )
    {
        lista2[i] = 1 + ( rand() % 9 ); //Guardamos numero generado en lista
    printf("%10d", lista2[i]); //Lo mostramos en pantalla
        if ( i % 5 == 0 )
        {
            printf( "\n" );
        }
    }
   
    //Generamos numero a buscar
    numero = 1 + ( rand() % 9 );
    //Mostramos en pantalla
    printf("Encuentra todos los %d \n", numero);
   
    //Contamos cuantas veces se repite el numero en la lista
for(int i=0; i<100; i++)
{
if(numero==lista2[i])
    total++;
}

    printf("cuantos hay? \n");
    scanf( "%u", &k );
    if (k == total)
    {
    printf("correcto :)\n");
    }
    else
    {
    printf("NO ES CIERTO\n");
    printf("Hay %d\n", total);
    }
     return 0;
}


Faltaría hacer lo que mencionas de que se repita hasta que introduzca una x.

Bueno, yo la verdad es que en lenguaje C no me manejo bien, nunca lo he estudiado, soy más de Java y C#.

He hecho un intento usando un bucle while, pidiendo el valor de la llave como un "char".
Si es una 'x' no se ejecuta el programa, de lo contrario, generamos números random con él (internamente, un char viene a ser lo mismo que un int).

Sin embargo, no funciona bien, solo deja introducir el valor de llave la primera vez, las siguientes iteraciones ya no pide el valor.
Da igual si limpio el buffer con fflush(), sigue fallando.

A ver si alguien que sepa más de C nos dice cómo solucionarlo:

Código: [Seleccionar]
#include <stdlib.h>
#include <stdio.h>

int main()
{
    int k;
    int t = 40;
    int total = 0;
    char llave = ' ';
    int lista2[100], numero;

    while (llave != 'x')
    {
       
        printf("instrucciones: \n");
        printf("El juego trata sobre encontrar todas las veces que se repite un mismo numero en una lista de 100 numeros entre 1 y 9, \n para comenzar a jugar, eliges un numero entre 1 y 9, la computadora generará una lista aleatoria de números y luego \n aparecera el numero que tienes que buscar, la lista y el numero a encontrar son diferentes dependiendo del numero que \n elijas al principio, tienes 40 segundos para encontrar todas las veces que se repite, cuando termines ingresas cuantos encontraste en el apartado al final, ganas si respondes antes de que termine el tiempo y pierdes si se te acaban los 40 segundos");
        printf("\n");
        printf("Para continuar introduce un numero entre 1 y 9(x para salir): ");
        fflush(stdin);
        scanf("%c", &llave);
        if (llave != 'x')
        {
            srand(llave);
            for (int i = 1; i <= 100; i++)
            {
                lista2[i] = 1 + (rand() % 9); //Guardamos numero generado en lista
                printf("%10d", lista2[i]); //Lo mostramos en pantalla
                if (i % 5 == 0)
                {
                    printf("\n");
                }
            }

            //Generamos numero a buscar
            numero = 1 + (rand() % 9);
            //Mostramos en pantalla
            printf("Encuentra todos los %d \n", numero);

            //Contamos cuantas veces se repite el numero en la lista
            for (int i = 0; i < 100; i++)
            {
                if (numero == lista2[i])
                    total++;
            }

            printf("cuantos hay? \n");
            scanf("%d", &k);

            if (k == total)
            {
                printf("correcto :)\n");
            }
            else
            {
                printf("NO ES CIERTO\n");
                printf("Hay %d\n", total);
            }
           
            system("pause");
        }
    }
    return 0;
}

387
Sí.
Tienes disponibles dos cursos gratuitos:
- Java desde 0
- Java avanzado Nivel 1

Es raro que te falle el comando, si has podido compilar el código, significa que la instalación de Java era correcta y deberías también poder lanzar el programa.
Recuerda que solo has de poner el nombre de la clase/archivo, no indiques la extensión .class
Citar
MAL: java Prueba.class
BIEN: java Prueba

En cualquier caso, tampoco te atasques mucho con esto. Rara vez vas a compilar un código escrito en el Bloc de Notas desde la línea de comandos... puede incluso que solo lo hagas en los inicios de los cursos...

Aunque conviene saber hacerlo, lo cierto es que normalmente siempre vas codificar y lanzar el programa desde algún IDE, ya sea NetBeans, Eclipse, IntelliJ,....

Lo importante es que aprendas a programar (variables, bucles, métodos, clases, objetos, herencias....), y no tanto a lanzar el programa desde línea de comandos. Esto es algo que se puede aprender en cualquier momento, los esfuerzos debes centrarlos en todo lo demás.

388
Cuando generas el número que hay que encontrar, que por cierto no hace falta que esté dentro de un bucle, y aún menos en uno diseñado para que se repita una sola vez..

el caso es que cuando generas el número a buscar, lo muestras en pantalla pero no lo guardas en ningún sitio:

Citar
  printf("encuentra todos los \n");
 for ( j = 1; j <= 1; j++ ) {
printf( "%10d", 1 + ( rand() % 9 ) );
 if ( j % 5 == 0 ) {
 printf( "\n" );
 }

Tú luego intentas contar las coincidencias del número a buscar, como si lo tuvieras guardado en la variable "numero", pero ahí no está.

Citar
numero=k;
   total=0;
   for(n=0;n<strlen(lista2);n++)
   {
      if(numero==lista2[n])
      total++;
   }

No está en ningún sitio. En "número" has asignado lo que tiene "k", pero "k" no tiene nada en ese momento.
Total, que el número a buscar, deberías guardarlo en "numero" al generarlo. Luego lo muestras y posteriormente podrás comparar para buscar repeticiones en la lista.

389
Para ejecutar el programa, el comando es java , no es javac

No se si estás siguiendo el curso de inicio en Java de esta web.
En este capítulo se explica lo que intentas hacer.

390
Hola.

Altas y Bajas... ¿de qué? ¿Clientes? ¿Productos? ¿Estudiantes? ¿Libros?...

En cualquier caso, yo comenzaría haciéndolo sin guardar en ficheros de texto, esta funcionalidad la añadiría al final, cuando ya se tuviera un programa funcionando con su menú y tal..

Comienza tú un código, llega hasta donde puedas y te ayudamos a completar.

391
Revisa bien cada apertura y cierre de llave.

Luego además, veo una cosa rara, parece que la definición de la función ordenar() está DENTRO del main()
Me refiero a la parte que marco en rojo:

Citar
      case 3:
   {printf("\nCuantas palabras deseas ordenar?:");
   scanf("%i",&n);
   fflush(stdin);
   char palabras[n][20];
   for(i=0;i<n;i++)
   {
      printf("\nINGRESA PALABRA?:");
      gets(palabras);
   }
   for(i=0;i<n;i++)
   {
      printf("\n%s",palabras);
   }
   ordenar(palabras,n);
   getch();
}
void ordenar(char palabras[][20],int n)
{
   for(i=0;i<n;i++)
   {
      for(j=0;j<n;j++)
      {
         if(palabras[0]>=palabras[j][0])
         {
            strcpy(letra,palabras);
            strcpy(palabras,palabras[j]);
            strcpy(palabras[j],letra);
         }
      }
   }
   printf("\nLOS FRASES ORDENADAS SON:");
   for(i=n-1;i>=0;i--)
   {
      printf("\n%s",palabras);
   }
   }

      getch();
      system("cls");
     break;
      case 4:
      printf("\n\t ¿Estás seguro de que NO ");
    break;
      default:
      printf("Esta opción no existe");
      getch();
      system("cls");
    }
     printf("\n\t quieres volver a ejecutar el programa?\n\t elige una opción:\n\t\t SI presiona 1 para volver\n\t\t NO presiona 4 para salir\n");
     scanf("%d",&opc);
     system("cls");

}
   while(opc!=4);
   printf("\n\t Adios!!!");


    }
}

Debería estar fuera del main, por ejemplo después, ya que antes del main ya se ha puesto la declaración de esta función.

Dentro del main, tendrás que llamar a esa función para que haga su cometido. Pero su definición, es decir, su código se ha de escribir fuera del main

392
Hola.

Puedes poner el main() en la clase Deck, sin embargo, no es lo ideal.
Cuando escribimos clases que modelan entidades del "mundo real": un carta, un mazo de cartas, un coche, una lavadora... suele ser preferible hacer que NO sean autoejecutables, es decir, que no tengan método main()

Imagina ahora que te piden hacer un programa donde tienes que usar 4 objetos Deck (4 mazos de cartas) para intercambiar cartas entre ellos, o simular una partida Poker o lo que sea..
Entonces te encontrarías con que cada uno de esos 4 objetos Deck tienen su propio método main().
Y en realidad no molestarían, porque en este supuesto estarías ejecutando el main() que simula la partida de Poker.
Pero en esos objetos Deck, tendrías código innecesario, métodos main() que no aportan nada.
Pero hay un problema mayor: muchas de las funciones que has puesto pick, suffle, head, hand.... son métodos estáticos pensados para ser ejecutados desde ese main()

En el supuesto programa que simularía la partida de Poker, los 4 Deck (mazos) que intervienen en la partida, no tendrían disponibles esas funciones de pick, hand, etc.... ¡¡a pesar de estar escritas en su clase Deck!!

Por eso yo hice una clase Card, una clase Deck y para ejecutar el programa, una clase a parte con el main().

Luego, otras cosas a mencionar sobre tu código.

Comienzas el programa creando una carta:

Citar
public class Deck {

    public static void main(String[] args)
    {
        Card card = new Card();

No se por qué lo haces, quizás piensas que es necesario para luego poder usar la clase Card... no se.

Pero no, no es necesario para nada. Ahí lo que estás haciendo es crear una carta.

Una carta sin atributos definidos (ni palo, ni valor, ni color), que estaría fuera del mazo, y que no interviene para nada en el resto del programa.

Así que esa línea la puedes borrar, porque no aporta absolutamente nada.


Más cosas, tras crear las cartas, intentas mostrarlas en pantalla.
Código: [Seleccionar]
for (Card elemento : deck) {
System.out.print(elemento + " / ");
}

Pero lo que haces es pasarle al System.out.print() directamente un objeto Card.

El System.out ni tiene ni pajolera idea de qué es un Card, no sabe como debe mostrar "eso" en pantalla, así que lo único que acierta a hacer, es mostrar en pantalla el identificador interno de esos objetos Card:
Citar
cardPoker2.Card@2f92e0f4 / cardPoker2.Card@28a418fc / cardPoker2.Card@5305068a / cardPoker2.Card@1f32e575

Y claro, no es eso lo que queremos.

El System.out básicamente solo sabe manejarse con objetos String, porque son cadenas de texto y eso es fácil de mostrar en pantalla.

Entonces, si queremos mostrar los datos de una Card en pantalla, tenemos dos opciones:
- Recurrir a los métodos getter
Código: [Seleccionar]
for (Card elemento : deck) {
System.out.println("Palo: " + elemento.getPalo());
System.out.println("Color: " + elemento.getColor());
System.out.println("Valor: " + elemento.getValor());
System.out.println("\n***************");
}
Y ahora en pantalla sí tenemos la información deseada:
Citar
Deck de Cartas para Iniciar:
Palo: corazones
Color: rojo
Valor: 2

***************
Palo: corazones
Color: rojo
Valor: 3

***************
Palo: corazones
Color: rojo
Valor: 4

***************
Palo: corazones
Color: rojo
Valor: 5

***************

Hay una segunda opción, que es más adecuada. Y es "enseñarle" a la clase Card cómo construir un String con sus datos, para que System.out y métodos similares, puedan utilizar ese String.

Para ello, añadimos este método a la clase Card:
Código: [Seleccionar]
    @Override
    public String toString() {
    return "Palo: " + palo + "\nColor: " + color +
    "\nValor: " + valor;
    }
En realidad, lo que hacemos es "sobreescribir" el método toString() que TODAS las clase Java heredan automáticamente de la clase Object (Object es una superclase, nivel Dios..., de las que todas las clases Java son hijas)
Por eso añadimos la etiqueta @Override, para indicar al compilador que no estamos creado un nuevo método, si no que estamos sobreescribiendo uno que ya existe por herencia de una superclase.

No importa si ahora mismo no entiendes bien esto de la herencia entre clases, la cuestión es que ahora la clase Card ya sabe como ha de construir un String que la represente.
Y el método System.out cuando recibe un objeto que NO es un String, lo que hace es consultar si dicho objeto dispone de un método toString().
Y como ahora Card ya lo tiene, ya si podemos mostrar cartas en pantalla sin tener que recurrir a los getters:

Código: [Seleccionar]
for (Card elemento : deck) {
System.out.println(elemento); //Aquí interviene el método toString()
System.out.println("\n***************");
}


Bien, más cosas.
En los métodos pick, hand, etc... pones que van a recibir un ArrayList pero sin especificar que clase van a contener esos ArrayList:
Citar
   public static void head(ArrayList deck){
      System.out.println(deck.get(0));
      deck.remove(0);
      System.out.println("Quedan " + deck.size() + " cartas");
   }
Esto, hoy día Java lo permite (en versiones más antiguas no lo permitía) pero no está bien visto.
Lo correcto es indicar la clase que va a contener esta colección. Además a la hora de leer el código otro programador que no seas tú, le será más informativo poder ver indicado que se trata de ArrayList que contienen Card.

Es más, esto nos puede ahorrar, posibles errores posteriores, como veremos después.
Así que a TODOS los métodos, hay que especificar la clase del ArrayList:
Citar
   public static void head(ArrayList<Card> deck){
      System.out.println(deck.get(0));
      deck.remove(0);
      System.out.println("Quedan " + deck.size() + " cartas");
   }


Y esto enlaza con el principal problema, al error que lanza tu programa.

En el método suflle, haces un Iterable de tipo String, para recorrer el ArrayList:

Citar
   public static void suflle(ArrayList deck){
      Collections.shuffle(deck);
      System.out.println("Se mezcló el Deck.");
      for (String elemento : (Iterable<String>) deck) {
         System.out.print(elemento + " / ");
      }
   }

Pero claro, el ArrayList no contiene objetos String, lo que contiene son Card.
Entonces al ejecutar el programa, Java se encuentra con que le pides que trate a un Card, como si fuera un String. Y entonces te avisa de que no sabe como hacer eso, mediante este error:
Citar
Exception in thread "main" java.lang.ClassCastException: class cardPoker2.Card cannot be cast to class java.lang.String

Este es un error de "ejecución", es decir, que ocurre mientras se ejecuta el programa.

Si hubieras especificado en el método suflle que el ArrayList es de Card, entonces habrías tenido un error de "compilación", que siempre es preferible a uno de "ejecución".

Es decir, como no especificabas qué clase contiene el ArrayList, el compilador dio por bueno que luego hicieras un Iterable de String.
Pero claro, eso no es correcto y se produce un error de "ejecución".

Si hubieras especificado la clase del ArrayList:
Citar
   public static void suflle(ArrayList<Card> deck){
      Collections.shuffle(deck);
      System.out.println("Se mezcló el Deck.");
      for (String elemento : (Iterable<String>) deck) {
         System.out.print(elemento + " / ");
      }
   }

entonces el compilador JAMÁS te habría permitido hacer un Iterable de String, y te habrías dado cuenta del problema antes de poder ejecutar el programa.
Si quieres usar un Iterable, ha de ser de clase Card, como el ArrayList.
Y como además ahora Card tiene un método toString(), ya si se mostrará en pantalla correctamente:

Citar
   public static void suflle(ArrayList<Card> deck){
      Collections.shuffle(deck);
      System.out.println("Se mezcló el Deck.");
      for (Card elemento : (Iterable<Card>) deck) {
         System.out.print(elemento + " / "); //Método toString() hace que se vea en pantalla
      }
   }

Sin embargo, no se necesita ningún Iterable (para los ArrayList nunca son necesarios), ya hemos visto al principio que basta con un for.
Código: [Seleccionar]
public static void suflle(ArrayList<Card> deck){
Collections.shuffle(deck);
System.out.println("Se mezcló el Deck.");
for (Card elemento : deck) {
System.out.print(elemento + " / ");
}
}

Y bueno, eso es todo.

Solo recalcar que lo ideal sería que la clase Deck, no tuviera main().
Ha de ser un programa que modele un mazo, pero no un programa que se ejecute.

Un saludo.

393
Tu clase Card, no está modelando una Carta.
Has creado una clase que contiene los valores posibles con los que se puede modelar una Carta, pero no representa una Carta.

Una Card/Carta tiene tres atributos: palo, color y valor.
Y cuando se vaya a crear un objeto Card, dichos atributos han de adquirir uno de esos posibles valores.
Esos posibles valores se los haremos llegar desde otra clase, pero la clase Card debería ser como esta:

Código: [Seleccionar]
public class Card {

private String palo;
private String color;
private String valor;

public Card(String palo, String color, String valor) {
this.palo = palo;
this.color = color;
this.valor = valor;
}

public String getPalo() {
return palo;
}

public void setPalo(String palo) {
this.palo = palo;
}

public String getColor() {
return color;
}

public void setColor(String color) {
this.color = color;
}

public String getValor() {
return valor;
}

public void setValor(String valor) {
this.valor = valor;
}

}

Luego, tu clase Deck, no representa un mazo de Cards.
En Deck has puesto el método main() (que no debería ir aquí)  y un ArrayList de String llamado deck.
Si ahí metes cadenas String, entonces no estás metiendo objetos Card. Y el objetivo del programa es ese, modelar un Deck de Cards

Por tanto la clase Deck, sí debe usar un ArrayList, pero que contenga objetos Card, no String.

En esta clase Deck, es donde podemos incluir los valores posibles de los atributos para construir las Card, es decir, los arrays que tú habías puesto en la clase Card

En el constructor de Deck, se inicializará el ArrayList de Card y comenzará el proceso de construcción de cartas.

En tu proceso de construcción cometes un pequeño fallo. Construyes cartas de ambos colores por igual.
Es decir, en tu mazo de cartas pueden haber Corazones negros y rojos, Tréboles negros y rojos, etc.... por eso consigues hasta 104 cartas.

Pero eso no es correcto. Cada palo es de un único color: Tréboles/Picas son de color negro y Corazones/Diamantes son de color rojo, formando un total de 52 cartas.

Si queremos respetar esto, hace que automatizar la creación de las cartas sea un poquito más complicado, pero no mucho más.
Lo más rápido, para no buscar fórmulas ingeniosas y complejas, sería crear primero las de un color y luego las del otro.
En el array de los cuatro PALOS disponibles, nos será más cómodo si los ordenamos por colores, por ejemplo primero los PALOS correspondientes al color ROJO (corazones/diamantes) y luego los del color NEGRO.

Esta podría ser la clase Deck:

Código: [Seleccionar]
import java.util.ArrayList;

public class Deck {

//Posibles valores de los atributos para construir objetos Card
private final String[] PALO = {"corazones", "diamantes", "trébol", "picas"};
private final String[] COLOR = {"rojo", "negro"};
private final String[] VALOR = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "A", "J", "Q", "K"};

//Mazo de cartas
private ArrayList<Card> deck;

public Deck() {
deck = new ArrayList<Card>();

//Construimos cartas de color ROJO
for (int palo = 0; palo < 2; palo++) //Se usa PALO[0] y PALO[1]
for (int valor = 0; valor < VALOR.length; valor++)
deck.add(new Card(PALO[palo], COLOR[0], VALOR[valor]));

//Construimos cartas de color NEGRO
for (int palo = 2; palo < 4; palo++) //Se usa PALO[2] y PALO[3]
for (int valor = 0; valor < VALOR.length; valor++)
deck.add(new Card(PALO[palo], COLOR[1], VALOR[valor]));
}

/**
* Retorna cuantas cartas tiene este mazo.
* El tamaño correcto tras la creación debería ser 52 cartas.
* @return Tamaño actual del mazo.
*/
public int getSize() {
return deck.size();
}

}

Incluyo también un método para saber cuántas cartas tiene el mazo.

Ahora, en una tercera clase, pondremos un main() para poner a prueba la construcción del mazo de cartas.
Código: [Seleccionar]
public class Test {

public static void main(String[] args) {

Deck mazo = new Deck();

//Confirmamos en pantalla cuantas Cards se han construido
System.out.println("Mazo construido. Cantidad de cartas: " + mazo.getSize());

}

}

Y al ejecutarlo veremos que tenemos la cantidad correcta de cartas:
Citar
Mazo construido. Cantidad de cartas: 52

Y listo. Con esto ya tenemos lo que pide el enunciado.
Una clase que modele una Card, con sus tres atributos.
Y otra clase que modele un Deck, que es un conjunto de Card´


Si algo no te ha quedado claro, no dudes en preguntar.
Un saludo.

394
Hola.

Para no repetir la cabecera, tendrías que cambiar la estrategia.

Antes de escribir datos, comprobar si YA existe o NO existe el archivo .csv.

Si NO existe, porque es la primera vez que se ejecuta el programa, pues haces una primera escritura de solo los datos de la cabecera.

Si YA existe, debemos dar por hecho que ya contiene la cabecera, y solo escribirías los datos.

La comprobación la puedes hacer en ese mismo método, o en otro a parte.
Si lo haces por separado, puedes hacer ese método de tipo boolean, de manera que si el archivo YA existe, o no existe pero sea ha creado correctamente, retorne TRUE.
Si no consigue crearlo (por el motivo que sea), retornaría FALSE.

Así, en el método donde guardas los datos en csv, si este segundo método de comprobación no te da el "visto bueno" retornando TRUE, pues entonces no intentar guardar ningún dato, porque no te va a ser posible de todos modos.

Por ejemplo:

Código: [Seleccionar]
private static boolean checkFile(String filepath) {

File fichero = new File(filepath);
if (!fichero.exists()) //Si NO existe, lo creamos e iniciamos cabecera
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(fichero));
bw.write("#ID,Doctor,Especialidad");
bw.newLine();
bw.close();
return true; //La creación fue BIEN :)
} catch (IOException e) {
JOptionPane.showMessageDialog(null,"No se pudo crear: " + filepath);
return false; //La creación fue mal :(
}
else //Fichero YA existe
return true; //Como ya existe, NADA que hacer, damos el visto bueno ;)
}

public static void saveRecord(String id,String doctor,String especialidad, String filepath){

if (checkFile(filepath)) { //Solo si checkfile() retorna TRUE, intentaremos guardar datos
try{
FileWriter fw = new FileWriter(filepath, true);
BufferedWriter bw = new BufferedWriter(fw);
//No se necesita cabecera, ya la tiene el archivo existente
bw.write(id+","+doctor+","+especialidad);
bw.newLine();
bw.close();

JOptionPane.showMessageDialog(null,"Record Saved!");
}
catch(Exception E){
JOptionPane.showMessageDialog(null,"Record Not Saved!");

}
}
}

395
Hola.
Lo primero es sumergirte en la metodología de la programación. Esto es independiente del lenguaje que se vaya a usar posteriormente o a que campo se quiera uno dedicar.

Conceptos como qué es una variable, un bucle, un condicional... son cosas comunes en todos los lenguajes (Java, Python, PHP...) y en todas las ramas de programación (diseño web, juegos, software de gestión...)

Para esto puedes empezar con estos dos cursos
Bases de la programación Nivel I
Curso Bases de la programación Nivel II

Sobre todo, paciencia y dedicación. Es posible que en esos cursos encuentres algún tema que no entiendas del todo, no importa. No te atasques, sigue adelante.
Siempre puedes volver a revisitar ese tema para intentar de nuevo comprenderlo o pedir ayuda por aquí en el foro.


Sobre que lenguaje aprender..., bueno, cualquiera de "propósito general" te puede ser útil para comenzar, antes de especializarte en algo más concreto. En cualquier caso, lo habitual es acabar manejándose en varios lenguajes, aunque siempre habrá uno o dos que dominaremos mucho más que por encima del resto.


Puesto que te interesa la programación de videojuegos, posiblemente C# (C Sharp) sea un lenguaje apropiado. Está muy ligado al motor Unity, un motor que permite crear juegos de corte profesional de forma bastante sencilla.

Actualmente no hay ningún curso de C# disponible en esta web. Sí que lo hay de Java que puede servirte para poner en práctica lo aprendido en los cursos anteriores y también para iniciarte en la Programación Orientada a Objetos (POO), algo absolutamente imprescindible.

Además, la estructura y sintaxis de Java es MUY SIMILAR a la de C#. Cuando pasas de un lenguaje a otro, hay veces que uno se olvida de que en realidad son lenguajes distintos.

Por supuesto, puedes optar por buscar directamente un curso de C#. Pero bueno, esto ya lo decides cuando toque.
Antes como dije, conviene empaparse bien de las bases de la programación.

Un saludo.

396
Hola.

Prueba sin el PrintWriter.

Con BufferedWriter debería bastarte:

Código: [Seleccionar]
    public static void  saveRecord(String id,String doctor,String especialidad, String filepath){
        try{
            FileWriter fw = new FileWriter(filepath, true);
            BufferedWriter bw = new BufferedWriter(fw);

            bw.write(id+","+doctor+","+especialidad);
            bw.close();

            JOptionPane.showMessageDialog(null,"Record Saved!");
        }
        catch(Exception E){
            JOptionPane.showMessageDialog(null,"Record Not Saved!");

        }
    }


Sobre el CSV.

Un CSV es simplemente un archivo de texto plano con valores separados por comas... así que en realidad ya lo estás creando.

Solo tendrías que cambiar el nombre del archivo para que se guarde como .csv y no como  .txt.
Más que nada para que el sistema operativo sepa con que programa debe asociar ese archivo.
Eso, y un salto de línea tras cada escritura de datos:

Código: [Seleccionar]
    public static void  saveRecord(String id,String doctor,String especialidad, String filepath){
        try{
            FileWriter fw = new FileWriter(filepath, true);
            BufferedWriter bw = new BufferedWriter(fw);

            bw.write(id+","+doctor+","+especialidad);
            bw.newLine(); //Salto de línea
            bw.close();

            JOptionPane.showMessageDialog(null,"Record Saved!");
        }
        catch(Exception E){
            JOptionPane.showMessageDialog(null,"Record Not Saved!");

        }
    }


Pruébalo y nos cuentas.

Un saludo.

397
Adjunto un zip en este mensaje con el código.
Por cierto, aunque este tema es largo, es interesante leerlo para ver como fue la evolución de la creación del programa y entenderlo mejor.

Si surge alguna duda, consultadla por aquí.

Un saludo.

398
Clase1 referencia = new Clase4()

Ahí se está instanciando un objeto de Clase4.
Sin embargo, se está referenciando como un objeto de Clase1.

Por lo tanto, de forma directa, solo podrán invocarse los métodos de Clase1.

Sin embargo, al invocar el método multiplicar(), como está sobreescrito en Clase2, será este método el que se ejecute, a pesar de que la referencia está como Clase1.

No podrá invocarse el método potenciacion() de forma directa. Sería necesario hacer un casting a Clase4, aún cuando lo que hemos instanciado es precisamente un Clase4.

Este es un buen ejercicio para distinguir entre los conceptos "instanciar" y "referenciar".


Puedes ponerlo a prueba mediante el código que dejo abajo.
Incluso puedes probarlo también y hacer más pruebas, en este editor online:
https://www.online-ide.com/8c6koBTxQv

Código: [Seleccionar]
public class Main
{
    public static void main(String[] args) {
       
        Clase1 referencia = new Clase4(); //Instanciamos un Clase4, pero lo referenciamos como Clase1
       
        referencia.multiplicar(); //Multiplicar de Clase2, aunque la referencia es Clase1, pero Clase2 lo ha sobreescrito
       
        ((Clase4) referencia).potenciacion(); //Para llamar a potenciacion() se requiere casting, a pesar de que es una instancia de Clase4
    }
   
    static class Clase1 {
        public void sumar() {
            System.out.println("Sumar de clase 1");
        }
        public void restar() {
            System.out.println("Restar de clase 1");
        }
        public void multiplicar() {
            System.out.println("Multiplicar de clase 1");
        }
    }
   
    static class Clase2 extends Clase1 {
        public void multiplicar() {
            System.out.println("Multiplicar de clase 2");
        }
    }
   
    static class Clase3 extends Clase1 {
        public void sumar() {
            System.out.println("Sumar de clase 3");
        }
    }
   
    static class Clase4 extends Clase2 {
        public void potenciacion() {
            System.out.println("Potenciacion de clase 4");
        }
    }
}

399
Comunidad / Re: Presentación
« en: 31 de Mayo 2021, 11:19 »
Bienvenido.

Sí, normalmente cuando se enseña Java para Android, se da por hecho que más o menos ya se sabe Java "tradicional" y programación, ya que lo que se enseña es cómo aplicar Java en Android..., y no tanto a la programación en Java.

Puedes probar a seguir el Curso de iniciación en Java, puede ayudarte a familiarizarte con el lenguaje y a la Programación Orientada a Objetos(POO)

400
Bueno, quizás tu maestro sabe algo que yo no se...
Si así fuera, cuéntanoslo  ;)

Un saludo.

Páginas: 1 ... 15 16 17 18 19 [20] 21 22 23 24 25 ... 50

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".