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 ... 27 28 29 30 31 [32] 33 34 35 36 37 ... 50
621
Citar
Se ocupa el procesador eclipce para realizar el codigo, se que es mejor aprender con generador de texto
Primero comentar que no estoy de acuerdo con esa afirmación.

Los entornos de desarrollo como Eclipse, NetBeans, IntelliJ,.... son una ayuda excelente.
Tienen cientos de funciones que los aprendices no vamos a usar, pero también tienen otras que sí son útiles.
Informan al usuario de si se ha escrito mal una instrucción, de si está llamando a una clase que requiere hacer un import, de si estamos intentando usar una variable que no se ha inicializado, o que está fuera de ámbito (scope), etc...
Son pequeñas ayudas que evitan que el usuario pierda demasiado tiempo corrigiendo la sintaxis de lo que ha escrito, y se pueda centrar más en desarrollar la lógica que el programa ha de seguir, que es lo importante y en lo que ninguna máquina podrá ayudarle.

Por supuesto, es importante ser capaz de evitar uno mismo todos esos errores y poder escribir un programa sin ayudas en cualquier editor, incluso en el Bloc de Notas de Windows...
Pero esa habilidad se va adquiriendo con el tiempo, a fuerza de escribir código cada día. Así que al principio mejor que los aprendices puedan centrarse en desarrollar lógica, y no en perder tiempo en buscar un fallo que puede ser tan tonto como haber escrito la palabra System todo en minúsuculas...


Dicho esto, sobre el programa que te piden.
Lo ideal es modularlo, usar un método/función para cada uno de los ejercicios que pide.
Así el programa principal, solo ha de mostrar un menú e invocar a la función que desarrolle el ejercicio escogido por el usuario.

Te dejo una posible solución, a ver si te sirve para entender mejor y familiarizarte con Java, y así en el futuro te sea más fácil desarrollar código por tu cuenta.
Cualquier cosa que no entiendas, por favor, pregúntala aquí en este mismo tema.

Un saludo.

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

public class MenuEjercicios {

private static Scanner teclado = new Scanner(System.in);

public static void main(String[] args) {
String opcion = "";

do {
System.out.println("\n\t\tOPCIONES");
System.out.println("(1) -- Leer tres números por consola");
System.out.println("(2) -- Leer cinco palabras");
System.out.println("(3) -- Generar cien aleatorios y contar pares/impares");
System.out.println("(4) -- Leer palabras y mostrar las que superan 5 letras");
System.out.println("(5) -- SALIR");
System.out.print("Opcion: ");
opcion = teclado.nextLine();

switch(opcion) {
case "1":
ejercicio1();
break;
case "2":
ejercicio2();
break;
case "3":
ejercicio3();
break;
case "4":
ejercicio4();
break;
case "5":
System.out.println("\n\t\tFIN DE PROGRAMA");
break;
default:
System.out.println("\nOpción errónea");
}

}while(!opcion.equals("5"));

}

/**
* Leer tres números por consola hasta que la resta del primero con el segundo sea igual al
* tercer número que se leyó. Mostrar la cantidad de intentos que se hicieron hasta obtener el
* resultado deseado.
*/
private static void ejercicio1() {

int intentos = 0;
int num1 = 0, num2 = 0, num3 = 0;

do {
intentos++;
System.out.print("\nPrimer número: ");
num1 = Integer.parseInt(teclado.nextLine());
System.out.print("\nSegundo número: ");
num2 = Integer.parseInt(teclado.nextLine());
System.out.print("\nTercer número: ");
num3 = Integer.parseInt(teclado.nextLine());
}while(num1 - num2 != num3);

System.out.println("\nIntentos necesarios: " + intentos);

System.out.println("\n\t\tPulsa INTRO para continuar...");
teclado.nextLine();
}

/**
* Leer 5 palabras y muestre con un mensaje si la palabra comienza con vocal o consonante.
*/
private static void ejercicio2() {

for (int i = 1; i <= 5; i++) {
System.out.print("\nPalabra: ");
String palabra = teclado.nextLine().toLowerCase();

char comienzo = palabra.charAt(0);

switch(comienzo) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
System.out.println("Comienza por vocal");
break;
default:
System.out.println("Comienza por consonante");
}
}

System.out.println("\n\t\tPulsa INTRO para continuar...");
teclado.nextLine();
}

/**
* Generar 100 números aleatorios y mostrar la cantidad de números pares
* y la cantidad de números impares.
*/
private static void ejercicio3() {
//Con la clase Random obtendremos números aleatorios
Random azar = new Random();
int pares = 0, impares = 0;

//Un número es par si al dividir entre 2, su resto es 0.
//Para eso usamos el operador MODULO, en Java es --> %
for (int i = 1; i <= 100; i++) {
if (azar.nextInt() % 2 == 0)
pares++;
else
impares++;
}

System.out.println("\n100 números aleatorios generados...");
System.out.println("Cantidad pares: " + pares);
System.out.println("Cantidad impares: " + impares);

System.out.println("\n\t\tPulsa INTRO para continuar...");
teclado.nextLine();
}

/**
* Leer palabras hasta que se ingrese la palabra stop y mostrar
* las palabras que tengan mas de 5 letras.
*/
private static void ejercicio4() {
/*
* Con la clase StringBuilder podemos concatenar
* juntas las palabras que superen 5 letras.
*/
StringBuilder palabras5 = new StringBuilder();
String palabra = "";

System.out.println("\nIntroduzca palabras.\nPara terminar ingrese stop");
while (!palabra.equals("stop")) {
System.out.print("Palabra: ");
palabra = teclado.nextLine();
if (palabra.length() > 5)
palabras5.append(palabra +"\n");
}

System.out.println("\nPalabras introducidas que superan las 5 letras:");
System.out.println(palabras5.toString());

System.out.println("\n\t\tPulsa INTRO para continuar...");
teclado.nextLine();
}

}


622
A continuación una propuesta para el main.
Como digo, creo que no requiere menú, aunque el ejercicio podría ser más interesante con él.

Yo lo he hecho sin menú, siguiendo cada paso estipulado en el enunciado del ejercicio.

Código: [Seleccionar]
public class TestClientes {

public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);

/*Cree 4 instancias de clientes en la clase con el método main.*/

//Podemos crear instancias individuales...
Cliente cliente1 = new Cliente();
Cliente cliente2 = new Cliente();
Cliente cliente3 = new Cliente();
Cliente cliente4 = new Cliente();

//Pero el código será más óptimo y menos repetitivo si los agrupamos en un array
//porque podremos usar bucles para trabajar con ellos
Cliente[] clientes = {cliente1, cliente2, cliente3, cliente4};

/*Asigne valores a cada cliente. Debe leer los datos por consola.*/
for (int i = 0; i < clientes.length; i++) {
System.out.println("\nDatos nuevo Cliente....");
System.out.print("R.U.T: ");
clientes[i].setRut(teclado.nextLine());
System.out.print("Nombre: ");
clientes[i].setNombre(teclado.nextLine());
System.out.print("Apellido: ");
clientes[i].setApellido(teclado.nextLine());
System.out.print("E-Mail: ");
clientes[i].setEmail(teclado.nextLine());
System.out.print("Nº Cuenta: ");
clientes[i].setNumCuenta(teclado.nextLine());
System.out.print("Saldo: ");
clientes[i].setSaldo(Float.parseFloat(teclado.nextLine()));
System.out.print("Tipo Cuenta: ");
clientes[i].setTipoCuenta(teclado.nextLine());
}

/*Mostrar los datos de los 4 clientes.*/

System.out.println("\nClientes registrados...");

for (Cliente cli: clientes)
System.out.println(cli + "\n");

/*Depositar a cada cliente y mostrar los clientes.*/
System.out.println("\nHaga un depósito a cada cliente.");

for (int i = 0; i < clientes.length; i++) {
System.out.println("\nDepósito Cliente #" + (i+1));
System.out.println("Monto: ");
clientes[i].depositar(Float.parseFloat(teclado.nextLine()));
}

System.out.println("\nDepósitos realizados...");

for (Cliente cli: clientes)
System.out.println(cli + "\n");

/*Girar en cada cliente y mostrar los clientes.*/
System.out.println("\nHaga un giro en cada cliente.");

for (int i = 0; i < clientes.length; i++) {
System.out.println("\nGiro Cliente #" + (i+1));
System.out.println("Monto: ");
clientes[i].girar(Float.parseFloat(teclado.nextLine()));
}

System.out.println("\nGiros realizados...");

for (Cliente cli: clientes)
System.out.println(cli + "\n");

/* Modificar dos datos (excepto el saldo) de un cliente y después mostrar los datos de
* ese cliente.
*/

cliente1.setNombre("Nombre Cambiado");
cliente1.setEmail("Email Cambiado");
System.out.println("\nDatos del Cliente1 cambiados.\n");
System.out.println(cliente1);

teclado.close();
}

}

623
Hola.
En principio para este programa no se necesitaría un menú de opciones.
Se podría poner, pero el enunciado más bien parece que desea que se siga una serie de pasos concretos, como un guión ya escrito, y no tanto que el usuario pueda moverse por un menú.

En cualquier caso, antes de todo esto, hay que escribir las clases Persona y Cliente (que va a heredar de Persona).

A continuación pongo cómo podrían ser estas dos clases.
Míratelas bien, asegúrate de que entiendes bien cada línea, decide si te parecen acordes a los que pide el enunciado..., y luego pasamos a ver como podría ser el main

Clase Persona
Código: [Seleccionar]
public class Persona {

private String rut;
private String nombre;
private String apellido;
private String email;

public Persona() {
rut = "";
nombre = "";
apellido = "";
email = "";
}

public Persona(String rut, String nombre, String apellido, String email) {
this.rut = rut;
this.nombre = nombre;
this.apellido = apellido;
this.email = email;
}

public String getRut() {
return rut;
}

public void setRut(String rut) {
this.rut = rut;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getApellido() {
return apellido;
}

public void setApellido(String apellido) {
this.apellido = apellido;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

@Override
public String toString() {
return "RUT: " + rut +
"\nNombre: " + nombre +
"\nApellido: " + apellido +
"\nE-Mail: " + email;
}

}

Clase Cliente
Código: [Seleccionar]
public class Cliente extends Persona{

private String numCuenta;
private float saldo;
private String tipoCuenta;

public Cliente() {
super();
numCuenta = "";
saldo = 0f;
tipoCuenta = "";
}

public Cliente(String rut, String nombre, String apellido, String email, String numCuenta,
float saldo, String tipoCuenta) {
super(rut, nombre, apellido, email);
this.numCuenta = numCuenta;
this.saldo = saldo;
this.tipoCuenta = tipoCuenta;
}

public String getNumCuenta() {
return numCuenta;
}

public void setNumCuenta(String numCuenta) {
this.numCuenta = numCuenta;
}

public float getSaldo() {
return saldo;
}

public void setSaldo(float saldo) {
this.saldo = saldo;
}

public String getTipoCuenta() {
return tipoCuenta;
}

public void setTipoCuenta(String tipoCuenta) {
this.tipoCuenta = tipoCuenta;
}

public void depositar(float monto) {
saldo += monto;
}

public void girar(float monto) {
if (monto >= saldo)
System.out.println("No hay suficiente saldo para hacer el giro");
else
saldo -= monto;
}

@Override
public String toString() {
return super.toString() +
"\nNúmero Cuenta: " + numCuenta +
"\nSaldo: " + String.format("%.2f", saldo) +
"\nTipo Cuenta: " + tipoCuenta;
}

}

624
Hola hize una variable del primer ejercicio que solicite ayuda, me quedo algo simple y sin mucho detalle pero me gustaria su opinion

public class Ejemplo1.9 {
       
        public static void main (String[] args) {
 
        Scanner leer=new Scanner(system.in);
        num=leer.nextInt();
       
        for(int j=1;j < num+1; j++) {
             for(int i=0; i < j;i++) {
                  System.out.print("* ");
             }
             System.out.print("\n");
       }
}


Supongo que funcionar, funciona.
Así que podemos decir que está "bien".

Sin embargo, digamos que se vale de una "complicación" innecesaria y además al leerlo no es tan evidente el propósito del código.
Me refiero a que por ejemplo el código que yo puse, es evidente que leemos un valor por teclado y lo usamos como límite para ambos bucles.

En la variante que tú has escrito, en esencia hace esto mismo, pero no es tan evidente al leerlo.
El valor se usa como condición límite del primer bucle, pero sumándole + 1.., y luego para el segundo bucle como límite se usa el índice del primer bucle... que no tiene un valor fijo y va aumentando con cada iteración....

Si alguien, que desconoce el enunciado y el propósito del ejercicio, lee ese código... pues le va a costar entender la lógica que se está siguiendo.

Debemos procurar que nuestro código, no solo lo entienda la máquina que lo va a compilar, también que sea legible y de fácil comprensión para otros humanos.

Pero bueno, tu código es correcto. Y aunque no sea la solución ideal, como experimento propio está bien.
Es buena idea explorar soluciones alternativas y experimentar con el código.
Ayuda mucho a familiarizarse con la programación general y con el lenguaje en particular.
Un saludo.

625
Hola.
No se porque usas dos objetos Triangulo.
Entiendo que con uno ya te sirve para calcular área y perímetro.
Y así además, te habrías evitado este error, que es el motivo de que no obtengas perímetro:

Citar
<%
            String n1=request.getParameter("base");
            String n2=request.getParameter("altura");
                     
            Triangulo t=new Triangulo(n1,n2);
            t.sacarArea();
            int area=t.getArea();
           
            Triangulo p=new Triangulo(n1,n2);
            t.sacarPerimetro(); //Calculas el perímetro en el triángulo t
            int perimetro=p.getPerimetro(); //Pero luego pides resultado a p, que no ha hecho ningún cálculo
        %>

Si vas a usar dos triángulos, ha de pedirle a p que calcule el perímetro.
Pero vamos, que con un único triángulo podrías hacer ambos cálculos.

Un saludo.

626
Muchas gracias, te he hecho caso e intar hacerlo yo el primer ejercicio gracias a tu ayuda me a resultado facil, no se como subir una captura de mi codigo pero a quedado parecido. Y el segundo ejercicio me a sido dificil y no me a resultado, e me guiado pero con tu codigo pero no me a resultado a si que solo copie el codigo y sigo comparando el porque no resulta el mio.

Saludos.

Puedes compartir tu código pegando el texto aquí en el foro directamente.

Al escribir un mensaje, arriba verás varios botones.
Si pulsas el que tiene este símbolo -->

Aparecerán en el mensaje las etiquetas CODE.
Puedes pegar el código dentro de esas etiquetas.

Y si no, lo pegas tal cuál y ya está pero con esas etiquetas quedará mejor.


Así podemos ver tu código y averiguar porque está fallando.

Un saludo.

627
Hola
Ejercicio 1 lo resuelves usando dos bucles for anidados, cada uno se va a repetir las veces que indique el valor ingresado por teclado.

El bucle interno escribiría en la misma línea un asterisco cada vez que se repita.
El bucle externo, lo que hace es repetir este bucle interno y cuando termina cada repetición, hace un salto de línea para que el bucle interno siga escribiendo asteriscos en la línea siguiente.

ES más fácil de lo que parece, intenta hacerlo.
Si no te sale, pregunta por aquí o si quieres fíjate en el código que pongo a continuación.
Pero importante que primero lo intentes tú, aunque te salga un horror de código que no sirva para nada.
Se aprende más intentando y fallando, que copiando directamente una solución.

Código: [Seleccionar]
public class Ej1 {

public static void main(String[] args) {

Scanner teclado = new Scanner(System.in);
System.out.print("Ingrese valor: ");
int valor = teclado.nextInt();
teclado.close();

/*
* Usamos dos bucles anidados para crear el cuadrado.
* Si pensamos en el cuadrado como una tabla de asteriscos,
* el primer bucle crearía las FILAS
* y el segundo las COLUMNAS
*/
for (int fila = 1; fila <= valor; fila++) {
for (int columna = 1; columna <= valor; columna++)
System.out.print("*");

System.out.println();//Salto de línea para pasar a la siguiente FILA
}

}

}


El segundo ejercicio.
Hay cuatro opciones y recomiendo "modular" el código. Es decir, que cada opción sea un procedimiento escrito por separado del código principal.

El main, el código principal, solo debería presentar menú y pedir opción. Que se repita hasta que el usuario elija terminar el programa.
Con un switch, analiza la opción ingresada y llamaría al procedimiento correspondiente según dicha opción.
Este podría ser el código del main. Como digo, lo que hace es invocar los procedimientos que resuelven cada opción del menú

Citar
   public static void main(String[] args) {
      
      int opcion = 0;
      
      do {
         System.out.println("\n\t\tMENU\n");
         System.out.println("(1) - Leer 20 numeros");
         System.out.println("(2) - Leer palabras");
         System.out.println("(3) - Veces se repite una palabra");
         System.out.println("(4) - Leer 2 numeros");
         System.out.println("(5) - CERRAR PROGRAMA");
         opcion = Integer.parseInt(teclado.nextLine());
         
         switch(opcion) {
         case 1:
            leer20numeros();
            System.out.println("\nPulse INTRO para volver al menu");
            teclado.nextLine();
            break;
         case 2:
            leerPalabras();
            System.out.println("\nPulse INTRO para volver al menu");
            teclado.nextLine();
            break;
         case 3:
            vecesRepitePalabra();
            System.out.println("\nPulse INTRO para volver al menu");
            teclado.nextLine();
            break;
         case 4:
            leer2numeros();
            System.out.println("\nPulse INTRO para volver al menu");
            teclado.nextLine();
            break;
         case 5:
            System.out.println("\n\t\tFIN DE PROGRAMA");
            break;
         default:
            System.out.println("Opcion equivocada");
            System.out.println("\nPulse INTRO para volver al menu");
            teclado.nextLine();
         }
         
      }while(opcion != 5);

   }

El código de cada opción, no es difícil.

Opcion 1, leer 20 números  y sumar por separado los pares y los impares.
Declaramos dos variables acumuladora, una para suma pares y la otra para los impares
Usas un bucle for que lea acepte 20 números por teclado.
Cada vez que se ingresa un número, se comprueba si es par o impar y se acumula en la variable correspondiente.
Podemos saber si un número es par dividiéndolo por 2 y comprobar si el resto es 0, es decir, usamos el operador "módulo", que en Java está representado con el operador %

Cuando termina el bucle, se muestran ambas sumas en pantalla.

Te dejo una solución, pero de nuevo insisto en la importancia de que primero lo intentes tú por tu cuenta.

Código: [Seleccionar]
private static void leer20numeros() {
int sumaPares = 0, sumaImpares = 0;
for (int i = 1; i <= 20; i++) {
System.out.println("\nEntrada " + i + "/20");
System.out.print("Ingrese numero: ");
int numero = Integer.parseInt(teclado.nextLine());
if (numero % 2 == 0)
sumaPares += numero;
else
sumaImpares += numero;
}
System.out.println("\nSuma de pares: " + sumaPares);
System.out.println("Suma de impares: " + sumaImpares);
}

Opción 2: Leer varias palabras y que se detenga al leer FIN, y muestre todas las palabras que se leyeron.
Hay que usar un bucle while y que pida palabras para ir coleccionándolas.
El bucle while se repite mientras la palabra ingresada sea distinto de "FIN".
Al terminar el bucle, se muestran las palabras ingresadas.

Para coleccionar las palabras, hay varias fórmulas.
Una podría ser usar una estructura de datos dinámica como List,ArrayList, etc..

Otra podría ser usar un String e ir concatenando las palabras una tras otra, intercalando una coma o un espacio en blanco entre cada palabra.
Sin embarco, los objetos String son "inmutables", no se pueden modificar. Entonces, cuando concatenamos Strings, nos parece que los estamos modificando, pero en realidad se está creando un objeto nuevo, y los otros objetos String que hemos usado para concatenar, no desaparecen. Se quedan en memoria ocupando recursos hasta que termine el programa.

A efectos prácticos, esto no es problema para un ejercicio tan sencillo, pero no esta de más que intentemos que nuestro código sea lo más eficiente posible.
Así que para evitar esto, podemos usar la clase StringBuilder.
Esta clase nos da un objeto similar a un String que sí es "mutable" y podremos concatenarle todos los String que queramos sin que eso suponga desperdiciar recursos.

Pero bueno, en cualquier caso, estas tres formas de solucionarlo son válidas.
Yo he optado por usar StringBuilder:

Código: [Seleccionar]
private static void leerPalabras() {
/*
* Las palabras a leer se podrían concatenar en un
* String normal. Pero internamente un String es estático,
* no se puede modificar, así que cuando concatenamos dos
* String, no estamos modificando ninguno, estamos creando un
* tercer String nuevo. Esto supone consumir más recursos del sistema.
*
* StringBuilder es un objeto dinámico, si es modificable y las concatenaciones
* que hagamos no implican crear nuevos objetos, solo modificar el ya existente.
*/
StringBuilder palabras = new StringBuilder();
String palabra = "";
while (!palabra.equals("FIN")) {
System.out.print("Ingrese palabra (FIN para terminar): ");
palabra = teclado.nextLine();
if (!palabra.equals("FIN")) {
palabras.append(palabra);
palabras.append(" ");
}
}
System.out.println("\nPalabras ingresadas:");
System.out.println(palabras.toString());
}

Opción 3: Leer 30 palabras y mostrar cuantas veces esta una determinada palabra. La palabra a buscar debe leerse antes de ingresar las 30 palabras.
Primero pedimos la palabra a buscar.
Luego las 30 palabras donde debemos buscar.

Como ya sabemos de antemano que han de ser 30 palabra, esta vez para coleccionar estas palabras podemos usar un simple array de String.

Cuando tengamos las 30 palabras, recorremos el array con un bucle y cada palabra la comparamos con la que estamos buscando.
Si son iguales, aumentamos una variable contador.
Luego mostramos resultado

Código: [Seleccionar]
private static void vecesRepitePalabra() {
System.out.print("\nIngrese palabra a buscar: ");
String palabra = teclado.nextLine();
System.out.println("A continuación ingrese 30 palabras...");
String[] palabras = new String[30];

for (int i = 0; i < 30; i++) {
System.out.println("\nEntrada " + (i+1) + "/30");
System.out.print("Palabra: ");
palabras[i] = teclado.nextLine();
}
//Contamos repeticiones
int repite = 0;
for (String p: palabras)
if (p.contentEquals(palabra))
repite++;
//Resultado
System.out.println("\nLa palabra " + palabra + " se repite " + repite + " veces.");
}

Opción 4: Leer 2 números. El primero debe estar entre 5 y 50 y el segundo no debe ser par.
Entregar como resultado la suma de los dos números, en caso de que sean correctos los
valores, en caso contrario mostrar un mensaje de error.


Muy sencillo, pedimos dos números.
Comprobamos si el primero está entre 5 y 50.
Si no lo está, mensaje de error y se acabó.

Si es correcto, comprobamos el segundo número.
Si no lo es, mensaje error y fin.

Si es correcto, pues mostramos la suma de ambos números.

Código: [Seleccionar]
private static void leer2numeros() {
int num1 = 0, num2 = 0;

System.out.print("\nPrimer numero (entre 5 y 50): ");
num1 = Integer.parseInt(teclado.nextLine());
System.out.print("Segundo numero (ha de ser impar): ");
num2 = Integer.parseInt(teclado.nextLine());

if (num1 < 5 || num1 > 50)
System.out.println("ERROR (numero 1 no está entre 5 y 50)");
else if (num2 % 2 == 0)
System.out.println("ERROR (el segundo número es par)");
else
System.out.println("Suma de numeros: " + (num1 + num2));
}


Y eso es todo, a continuación de dejo el código de esta clase al completo, main y procedimientos.
E insisto una vez más, intenta comenzar tú un código, no importa si sale mal o si apenas llegas a escribir 5 líneas antes de atascarte.
Es así como se aprende, cometiendo errores.

Cualquier duda que tengas, pregúntala por aquí.
Un saludo.

Código: [Seleccionar]
public class Ej2 {

/*
* Objeto Scanner lo declaramos en ámbito global para que
* sea accesible a todos los métodos/procedimientos y
* puedan utilizarlo
*/
private static Scanner teclado = new Scanner(System.in);

public static void main(String[] args) {

int opcion = 0;

do {
System.out.println("\n\t\tMENU\n");
System.out.println("(1) - Leer 20 numeros");
System.out.println("(2) - Leer palabras");
System.out.println("(3) - Veces se repite una palabra");
System.out.println("(4) - Leer 2 numeros");
System.out.println("(5) - CERRAR PROGRAMA");
opcion = Integer.parseInt(teclado.nextLine());

switch(opcion) {
case 1:
leer20numeros();
System.out.println("\nPulse INTRO para volver al menu");
teclado.nextLine();
break;
case 2:
leerPalabras();
System.out.println("\nPulse INTRO para volver al menu");
teclado.nextLine();
break;
case 3:
vecesRepitePalabra();
System.out.println("\nPulse INTRO para volver al menu");
teclado.nextLine();
break;
case 4:
leer2numeros();
System.out.println("\nPulse INTRO para volver al menu");
teclado.nextLine();
break;
case 5:
System.out.println("\n\t\tFIN DE PROGRAMA");
break;
default:
System.out.println("Opcion equivocada");
System.out.println("\nPulse INTRO para volver al menu");
teclado.nextLine();
}

}while(opcion != 5);

}

private static void leer20numeros() {
int sumaPares = 0, sumaImpares = 0;
for (int i = 1; i <= 20; i++) {
System.out.println("\nEntrada " + i + "/20");
System.out.print("Ingrese numero: ");
int numero = Integer.parseInt(teclado.nextLine());
if (numero % 2 == 0)
sumaPares += numero;
else
sumaImpares += numero;
}
System.out.println("\nSuma de pares: " + sumaPares);
System.out.println("Suma de impares: " + sumaImpares);
}


private static void leerPalabras() {
/*
* Las palabras a leer se podrían concatenar en un
* String normal. Pero internamente un String es estático,
* no se puede modificar, así que cuando concatenamos dos
* String, no estamos modificando ninguno, estamos creando un
* tercer String nuevo. Esto supone consumir más recursos del sistema.
*
* StringBuilder es un objeto dinámico, si es modificable y las concatenaciones
* que hagamos no implican crear nuevos objetos, solo modificar el ya existente.
*/
StringBuilder palabras = new StringBuilder();
String palabra = "";
while (!palabra.equals("FIN")) {
System.out.print("Ingrese palabra (FIN para terminar): ");
palabra = teclado.nextLine();
if (!palabra.equals("FIN")) {
palabras.append(palabra);
palabras.append(" ");
}
}
System.out.println("\nPalabras ingresadas:");
System.out.println(palabras.toString());
}

private static void vecesRepitePalabra() {
System.out.print("\nIngrese palabra a buscar: ");
String palabra = teclado.nextLine();
System.out.println("A continuación ingrese 30 palabras...");
String[] palabras = new String[30];

for (int i = 0; i < 30; i++) {
System.out.println("\nEntrada " + (i+1) + "/30");
System.out.print("Palabra: ");
palabras[i] = teclado.nextLine();
}
//Contamos repeticiones
int repite = 0;
for (String p: palabras)
if (p.contentEquals(palabra))
repite++;
//Resultado
System.out.println("\nLa palabra " + palabra + " se repite " + repite + " veces.");
}

private static void leer2numeros() {
int num1 = 0, num2 = 0;

System.out.print("\nPrimer numero (entre 5 y 50): ");
num1 = Integer.parseInt(teclado.nextLine());
System.out.print("Segundo numero (ha de ser impar): ");
num2 = Integer.parseInt(teclado.nextLine());

if (num1 < 5 || num1 > 50)
System.out.println("ERROR (numero 1 no está entre 5 y 50)");
else if (num2 % 2 == 0)
System.out.println("ERROR (el segundo número es par)");
else
System.out.println("Suma de numeros: " + (num1 + num2));
}
}

628
Hola.
C no es mi fuerte, pero puedo ayudarte.

Creo que sería conveniente modular más el programa, es decir, repartir las tareas en distintas funciones, cada una que se ocupe de una cosa concreta y tenga sus propias variables.
Eso hace el programa más legible, especialmente en uno como este donde hay switchs anidados.

Para que las respuestas sean visibles y no desaparezcan en 1ms, puedes usar la instrucción system("pause").
Esto detiene la ejecución del programa hasta que el usuario pulsa una tecla, y así dispone de tiempo para ver el último mensaje aparecido en pantalla.

Lo de los signos de puntuación lo puedes resolver exactamente igual a como resuelves lo de las vocales.
En el switch, puedes añadir cases como
case '.':
case ',':

Para detectar puntos y comas, y más cases que puedas considerar necesarios para identificar signos de puntuación.

Te dejo un código hecho por mí para que veas cómo lo he resuelto.
He modulado el programa en distintas funciones, una para cada opción del menú.

El resto del código es casi igual al tuyo. Solo cambia que esta modulado, uso unas pocas variables menos, para contar vocales he preferido usar un vector de 5 elementos... y poco más.

Revísalo y pregunta cualquier cosa que no entiendas.
Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>

//Declaración de Funciones
void menuNumerico();
void ecuacionSegundoGrado();
void numerosPrimos();
void factorial();

void menuAlfanumerico();
void invertirTexto();
void contarLetrasSignos();

int main() {

system("color f0");
char opcion;

do {
system("cls");
printf(" M E N U  P R I N C I P A L  ");
printf("\n A).-Operaciones Numericas");
printf("\n B).-Operaciones Alfa-Numericas");
printf("\n C).-Salir");
printf("\n\n Elija la opcion: ");
scanf("%c",&opcion);

switch(opcion) {
case 'a':
menuNumerico();
break;
case 'b':
menuAlfanumerico();
break;
case 'c':
printf("\n\tFIN DE PROGRAMA\n");
}

} while(opcion !='c');

return 0;
} //Fin del main

//Definición de funciones
void menuNumerico() {
char opcion;

do {
system("cls");

printf("\n OPERACIONES NUMERICAS");
printf("\n a).-Resolucion de la ecuacion general de segundo grado \n");
printf("\n b).-Obtener los primeros 100 numeros primos \n");
printf("\n c).-Obtener el factorial de un numero (maximo:50) \n");
printf("\n d).-Regresar al menu anterior \n");
printf("\n\n Elija una opcion: ");
scanf("%c",&opcion);

switch(opcion) {
case 'a':
ecuacionSegundoGrado();
break;
case 'b':
numerosPrimos();
break;
case 'c':
factorial();
break;
case 'd':
printf("\nRegresando a menu principal\n");
}
}while(opcion != 'd');
system("pause");
}

void ecuacionSegundoGrado() {
int a, b, c, d;
float xg,yg;

printf("\n\tECUACION SEGUNDO GRADO\n");
printf("Dame el valor de a: ");
scanf("%d",&a);
while (a == 0)
{
printf("Dame el valor de a: ");
scanf("%d",&a);}
printf("Dame el valor de b: ");
scanf("%d",&b);
printf("Dame el valor de c: ");
scanf("%d",&c);
d = b*b-4*a*c;
if (d > 0)
{
xg = (-b+sqrt(d))/(2*a);
yg = (-b-sqrt(d))/(2*a);
printf("x1 = %.2f\n",xg);
printf("x2 = %.2f\n",yg);}
else if (d == 0) {
xg = (-b)/(2*a);
printf("x1 = %.2f\n",xg);}
else
printf("La ecuacion no tiene solucion");

system("pause");
}


void numerosPrimos() {
int ipp,xpp,cont;

printf("\n\t100 PRIMEROS NUMEROS PRIMOS\n");
for(ipp = 2 ; ipp <=542;ipp++) {
for(xpp = 2 ; xpp <= ipp;xpp++)
if(ipp % xpp == 0)
cont++;
if(cont == 1)
printf("%d-",ipp);
cont = 0 ;
}
printf("\n");
system("pause");
}

void factorial() {
int numerof, xf;
float factorial = 1;

printf("\n\tFACTORIAL\n");
printf("Introduce un numero:");
scanf("%d",&numerof);
for(xf=numerof;xf>1;xf--)
{
factorial=factorial*xf;
}
printf("%f\n",factorial);
system("pause");
}

void menuAlfanumerico() {
char opcion;

do {
system("cls");
printf("\n OPERACIONES ALFA-NUMERICAS");
printf("\n X).-Leer un texto (maximo 500 caracteres) y mostrar el texto introducido al reves \n");
printf("\n Y).-Leer un texto (maximo 500 caracteres) y contar cuantas letras vocales hay escritas \n");
printf("\n Z).-Regresar al menu anterior \n");
printf("\n\n Elija una opcion: ");
scanf("%c",&opcion);

switch(opcion) {
case 'x':
invertirTexto();
break;
case 'y':
contarLetrasSignos();
break;
case 'z':
printf("\nRegresando a menu principal\n");
}

}while (opcion != 'z');
system("pause");
}

void invertirTexto() {
char cadena[500];
int ivt = 0;

printf("\n\tINVERTIR TEXTO\n");
printf("Introduce tu texto: ");
fflush(stdin);
fgets(cadena, 500, stdin);
printf("\nTu texto es:\n%s\n", cadena);
while(cadena[ivt]!='\0'){
ivt++;}
printf("El texto al rev\x82s es: ");
for (int j=ivt-1; j>=0; j--){
printf("%c", cadena[j]);}
puts("");

system("pause");
}

void contarLetrasSignos() {
char cadena[500];
int vocales[] = {0, 0, 0, 0, 0};
int signos = 0;

printf("\nCONTAR VOCALES Y SIGNOS\n");
printf("Introduce tu texto: ");
fflush(stdin);
fgets(cadena, 500, stdin);

for(int i=0; cadena[i] !='\0' && cadena[i] !='\n'; i++){
switch(cadena[i]){
case 'a':
case 'A':
vocales[0]++;
break;
case 'e':
case 'E':
vocales[1]++;
break;
case 'i':
case 'I':
vocales[2]++;
break;
case 'o':
case 'O':
vocales[3]++;
break;
case 'u':
case 'U':
vocales[4]++;
break;
case ',':
case '.':
case ';':
signos++;
}
}

printf("\n VOCAL \t Repite");
printf("\n A \t %d",vocales[0]);
printf("\n E \t %d",vocales[1]);
printf("\n I \t %d",vocales[2]);
printf("\n O \t %d",vocales[3]);
printf("\n U \t %d",vocales[4]);
printf("\n\nSignos puntuacion encontrados: %d\n", signos);

system("pause");
}

629
Interesante propuesta.
La verdad es que poco más se puede hacer, ya que en modo consola las posibilidades de lo que mostramos en pantalla son muy limitadas en Java.

Lo único que le faltaría añadir sería una opción para poder salir del programa, ya que el bucle de "juego" se repite infinitas veces.

Sobre lo del objeto Scanner, a ver si lo explico mejor.

Cuando tú escribes algo, ya sea en Java, en Bloc de Notas, en un foro...en cualquier soporte informático, con el teclado estamos enviando caracteres que se muestran en pantalla y forman palabras, instrucciones, números y operaciones, etc...

Pero hay algunas teclas que envían caracteres especiales, caracteres que no se ven en pantalla, pero que cumplen una función.

Uno de ellos es el carácter que se produce cuando pulsamos la tecla enter, o intro, o como queramos llamarla...
Este carácter, su función es poner fin a la línea que estamos escribiendo y se llama "retorno de carro". No de "coche", de carro.
Este nombre viene heredado de las antiguas máquinas de escribir, donde para poner fin a una línea y comenzar la siguiente se accionaba una palanca:



Al accionar esta palanca, el "carro" volvía a la posición original ,el rodillo saltaba a la línea siguiente, y se podía seguir escribiendo de izquierda a derecha.

Bueno, lo que nos interesa a nosotros... este carácter como digo, es invisible en pantalla y el usuario no lo ve, pero el ordenador sí, para él es otro carácter más y suele representarlo con el carácter \r

Así que cuando escribimos esto:

Citar
Línea 1.
Línea 2.
Línea 3.

El ordenador recibe esto:

Citar
Línea 1.\r
Línea 2.\r
Línea 3.\r

En Java, la clase Scanner se encarga de recibir datos de los sistemas de entrada. Generalmente el teclado, pero podrían ser otros como un fichero de texto.
Scanner funciona como una cola, va recibiendo bytes (para crear una carácter se usa un byte de información) y de estos captura, en orden de llegada, lo que le solicitemos.

Si a Scanner le pedimos que capture una entrada de datos usando el método nextLine(), es decir, que capture una línea, pues va a recoger todos los bytes/caracteres necesarios para crear una línea y eso incluye el carácter \r

Entonces, si al hacer nextLine() le tecleamos esto:
Citar
Hola que tal, buenas tardes\r
Capturará TODOS los caracteres, porque todos conforman una línea y la "cola de datos" (stream) del Scanner quedará vacía.

Pero, y ahora viene el problema, si le pedimos que capture datos con el método nextInt(), es decir, que capture los caracteres necesarios para crear un valor numérico entero, esto va a excluir el caracter \r, porque con eso no se hace un valor numérico.
El carácter retorno de carro, a nextInt() le va a servir para saber que tiene que dejar de buscar caracteres válidos para crear un número, pero no lo capturará.

Entonces, si a nextInt() le damos esto:

Citar
129\r
Cogerá el 1, el 2 y el 9.., pero no el \r. Y este \r se va a quedar en la "cola de datos".

Y aquí es donde viene el problema.

Si después de esto seguimos pidiendo leer números con nextInt(), nextDouble(), etc... no habrá problema.
Estos métodos se encontrarán el \r en la cola, pero no le harán caso porque todavía no han entrado caracteres para crear valores numéricos. Cuando empiecen a entrar, los irán capturando hasta que el usuario ponga fin enviando un nuevo \r, que los métodos no recogerán y también quedará olvidado en la cola de datos.

Pero, si tras leer números y dejar caracteres \r en la cola de datos, queremos leer una línea con nextLine(), será entonces cuando el usuario no podrá introducir nada.
Porque cuando nextLine() se vaya a la cola de datos a esperar que el usuario teclee cosas, se encontrará los \r olvidados de las lecturas anteriores.
Y este es un carácter que nextLine() NO DEBE ignorar, puede usarlos para conformar lo que se le ha pedido, una línea.

Y de hecho, es el carácter que pone fin a la línea, así que nextLine() da por finalizada la captura de datos, sin que el usuario haya podido teclear absolutamente nada.
nextLine() ha creado una línea vacía (que técnicamente es válida), pero el usuario se queda asombrado porque parece que el programa se ha saltado la entrada de datos.

Por esto, cuando en un programa queramos leer números y líneas, es mejor usar para todo nextLine() y si hace falta, parsear a Integer, Float o lo que sea...
Así se evita dejar retornos de carros abandonados en la cola del Scanner.

Si solo se van a leer valores numéricos y/o valores char (que en realidad también es un numérico) pues entonces no hay problema.

Espero que con esta explicación más extensa se entienda mejor.
He de decir que esto del Scanner nos vuelve locos a TODOS cuando empezamos a programar en Java, no eres el único je je..

Y además decir que no es un error de Java, ni nada parecido. En realidad es una consecuencia lógica al hacer lecturas de datos, no se si podríamos decir, a "bajo nivel".

Esto mismo ocurre también por ejemplo en lenguaje C.

630
Genial.
Si quieres, puedes publicar aquí tu solución y podría servir de ayuda a otros.

Un saludo.

631
Citar
2. Volver a ingresar las notas de un alumno. Permite volver a ingresar las notas de un alumno identificado por el índice de la posición el vector o ArrayList y reemplaza el promedio.
    3. Eliminar las notas de un alumno. Elimina el promedio de notas del vector o ArrayList desde una posición específica.

Para modificar y eliminar, hay que preguntar al usuario sobre cuál posición del ArrayList quiere actuar.
En pantalla puedes pedirle que introduzca la posición, entre 0 y la última posición disponible actualmente.

Esta última posición puedes saberla preguntando al ArrayList su tamaño size() y restarle menos 1

Es decir, si el ArrayList tiene 10 elementos, las posiciones disponibles para elegir serían entre 0 y 9.
Cuando el usuario te ha dado la posición, ya puedes actuar en ella.

Para eliminar, tienes el método remove(int posicion).
Para modificar, tienes el método set(int posicion, Float nuevoPromedio)

Para conocer los métodos de cada clase, SIEMPRE conviene consultar la documentación de Oracle.
ArrayList Oracle

Por ejemplo, eliminar se podría escribir así:
Código: [Seleccionar]
case 3:
System.out.println("Indique posición del promedio a eliminar, entre 0 y " + (promedios.size() - 1));
int posEliminar = teclado.nextInt();
promedios.remove(posEliminar);
break;

Modificar sería parecido, solo que tras pedir la posición a modificar, luego habría que volver a pedir otra vez notas, calcular promedio y usar el método set() para modificar el promedio anterior.


632
Hola.
Estas actividades hay que afrontarlas por partes, paso a paso.
Por ejemplo, está claro que se va a tener que mostrar un menú con 5 opciones:
Citar
Para la interfaz de usuario, considera un menú con las siguientes opciones:
    1. Ingresar las notas de un alumno. Permite ingresar una cantidad inicialmente desconocida de notas, imprimir el promedio por pantalla y almacenarlo en el vector o ArrayList.
    2. Volver a ingresar las notas de un alumno. Permite volver a ingresar las notas de un alumno identificado por el índice de la posición el vector o ArrayList y reemplaza el promedio.
    3. Eliminar las notas de un alumno. Elimina el promedio de notas del vector o ArrayList desde una posición específica.
    4. Imprimir el porcentaje de aprobados. Calcula e imprime por pantalla la cantidad y porcentaje de aprobados.
    5. Salir. Termina el programa.

Pues bien, hay que empezar por mostrar ese menú, aunque no tenga ninguna funcionalidad, ni haga nada.
Tan solo hay que tener en cuenta que se ha de mostrar hasta que el usuario introduzca un 5 como opción.
Así que obviamente, el menú irá dentro de un bucle.
Y como no sabemos cuántas veces se va a repetir el bucle, porque será el usuario quien decida cuando poner fin, pues el bucle que nos conviene será un while, o un do while

A continuación pongo un código que podría servir para mostrar dicho menú, y pedir opción por teclado mediante la clase Scanner.
Con un switch analizaríamos que opción ha escogido el usuario, para ejecutar el código correspondiente a cada opción (de momento, no los tenemos)
Además ya tiene declarado un ArrayList para almacenar los promedios de notas, aunque todavía no hacemos nada con él:

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

public class Promedios {

public static void main(String[] args) {

Scanner teclado = new Scanner(System.in);
ArrayList<Float> promedios = new ArrayList<Float>();
int opcion = 0;

do {
System.out.println("\n(1) -> Ingresar notas de nuevo alumno");
System.out.println("(2) -> Modificar notas de alumno existente");
System.out.println("(3) -> Eliminar notas de alumno existente");
System.out.println("(4) -> Imprimir porcentaje de aprobados");
System.out.println("(5) -> SALIR");
opcion = teclado.nextInt();

switch(opcion) {
case 1:
System.out.println("En construccion...");
//TODO: Codigo para ingresar notas
break;
case 2:
System.out.println("En construccion...");
//TODO: Codigo para modificar notas
break;
case 3:
System.out.println("En construccion...");
//TODO: Codigo para eliminar notas
break;
case 4:
System.out.println("En construccion...");
//TODO: Codigo para calcular y mostrar porcentaje aprobados
break;
case 5:
System.out.println("\nFIN DE PROGRAMA");
break;
default:
System.out.println("Opción equivocada");
}

}while(opcion != 5);

teclado.close();
}

}

Bien, lo primero es que te leas este código y estés seguro de que entiendes qué hace cada líneas y por qué ....
Lo que no sepas, pregúntalo.

Luego, hay que pensar en el código de cada opción..
La primera opción pide:
Citar
    1. Ingresar las notas de un alumno. Permite ingresar una cantidad inicialmente desconocida de notas, imprimir el promedio por pantalla y almacenarlo en el vector o ArrayList.

Bien, hay que pedir una serie indeterminada de notas y calcular su promedio.
Cuando dice indeterminada, es que no sabemos cuántas notas va a introducir el usuario. Él decide cuando terminar.
¿Cómo gestionamos esto?
De nuevo, obviamente pediremos notas dentro de un bucle while o do while.
Para que el usuario ponga fin a ese bucle, podemos preguntarle si quiere continuar (si o no) después de que haya introducido cada nota.
O más fácil aún, en pantalla le decimos que introduzca notas, y que inserte el valor -1 para terminar.
Con esto, ya estamos pidiendo notas hasta que el usuario quiera parar.

Con estas notas, hay que calcular un promedio.
Es decir, cada nota que pedimos la tenemos que acumular en una variable y además contarla en otra variable.

Así, cuando el usuario ponga fin a la inserción de las notas, tendremos la suma de ellas acumulada y habremos contado cuántas se han introducido, justo lo que necesitamos para calcular el promedio. (acumulado / contado)

Una vez calculado, lo imprimimos en pantalla y lo guardamos en el ArrayList.

Pues con esta explicación, intenta tú escribir esta parte del código. No importa si no te sale o te equivocas (mejor, es cuando más se aprende, cometiendo errores).
Inténtalo y si no lo consigues te diré como hacerlo.

Puedes escribirlo primero en pseudocódigo (que para eso lo enseñan) por si te es más fácil crear la lógica a seguir, y luego lo trasladas a Java.

Un saludo.

633
Hola.
Cuando analizas qué animal es, y su estado, no haría falta preguntar dos veces el tipo de animal:

Por ejemplo, aquí preguntas dos veces si es vaca
Citar
      Si especie = "vaca" & estado = "sana" Entonces
         vacas = vacas +1
         v_sanas <- v_sanas + 1
      Sino
         si especie = "vaca" & estado = "enferma" Entonces
            vacas = vacas +1
            v_enfermas = v_enfermas + 1
         FinSi
      FinSi

Se puede hacer preguntándolo una sola vez.
Y para evaluar el estado, tampoco hace falta preguntar si es "sana" y si no lo es, preguntar si es "enferma"
Solo hay dos posibilidades, así que si no es "sana", pues obligatoriamente será "enferma"
Citar
      Si especie = "vaca" Entonces
         vacas = vacas +1
         Si estado = "sana" Entonces
             v_sanas <- v_sanas + 1
         Sino
             v_enfermas = v_enfermas + 1   
         FinSi
      FinSi

Funcionar, funciona igual de bien que como lo has hecho tú. Prácticamente es lo mismo, pero evitas preguntas redundantes y el código queda un poco más simplificado.


Sobre los grupos, si divides entre 19 el total contado de cada animal, sabrás cuantos grupos hay.

Supón que has contado 43 vacas, si hacemos una división entera, es decir, ignoramos la parte decimal:
43 / 19 = 2
Pues hay 2 grupos de 19 vacas.

El sobrante, lo obtienes sacando el resto o módulo de esa misma división:
43 MOD 19  = 5
Hay un sobrante de 5 vacas.

Así que con vacas / 19 tendrás los grupos de vacas, y con vacas MOD 19 el sobrante.


634
Más o menos, estos serían los pasos a seguir:

1 Declaras dos variables contador, una para contar votos a favor y otra para votos en contra.

2 Preguntas cuántos integrantes hay en el consejo.

3 Con este número de integrantes, puedes hacer un bucle for para que cada integrante emita su voto.

4 Pides voto por teclado, con una pregunta simple: "¿Está a favor?(s/n)"
Esta petición, es la que tienes que hacer dentro de un do ..while, que se repita mientras el voto sea distinto de "s" o de "n".

5 Cuando ya tengas una "s" o una "n", el bucle do while termina y entonces evalúas el voto.
Si es una "s" incrementas el contador de votos a favor. Si es "n" incrementas el de votos en contra.

6 Todo esto se repite hasta que termine el bucle for. Será entonces cuando puedas mostrar los porcentajes de ambos votos


Intenta tú un código que siga esos pasos. Y si te atascas o no funciona, muéstralo y te ayudamos a completarlo.

635
Hola.

¿En que necesitas ayuda exactamente?
¿En usar NetBeans? ¿En hacer un diagrama UML? ¿En emplear POO? ¿En escribir el código?
¿En todo?....

En cualquier caso, lo primero es analizar el enunciado e identificar las "entidades" que toman parte. De estas entidades, tendremos que crear clases para modelarlas.

Por ejemplo. Es evidente que una entidad será Asignatura.
Una Asignatura tiene un nombre y según el enunciado, va a tener tres notas parciales.
Si creamos una clase de esta entidad, pues sus atributos serán el nombre de Asignatura, de tipo String y las tres notas, que podrían ser de tipo float si queremos recibir notas con decimales.
Estas tres notas parciales se pueden gestionar como tres atributos separados, o bien agruparlas en un único array de tres elementos float. Esto va a gusto del programador (a mi me gusta más usar el array).

Tenemos los atributos, ahora hay que pensar en su constructor.
Con un constructor que reciba por parámetros el nombre que tendrá la Asignatura, sería suficiente.
Si hemos elegido usar un array para las notas, el constructor además se encargaría de inicializarlo.

Ahora pensemos en los métodos.

Uno será el típico getNombre() para obtener un String con el nombre de la asignatura.
Parece que no será necesario un setNombre() para poder cambiar el nombre, pero se le puede poner si se desea.

Lo que si será necesario será un método para recibir las notas parciales que tiene la asignatura.
Puede llamarse setNotaParcial()
Si se ha elegido usar tres atributos separados para las notas, se necesitarán tres métodos distintos, uno para cada atributo.
Si se ha elegido usar un array, pues será suficiente un único método, pero este método además de recibir la nota que hay que establecer, ha de recibir en que posición del array se ha insertar (un valor int entre 0 y 2)

El enunciado pide que se pueda calcular la nota definitiva de una Asignatura, es decir, la nota que podemos calcular según las tres notas parciales.
Así que podemos incluir ya un método para que la Asignatura sea capaz de hacer este cómputo por ella misma.
Un método que puede llamarse getNotaDefinitiva() y retorne un valor float si se ha elegido usar notas con decimales, o un int si se ha elegido usar valores enteros para las notas.

El diagrama UML para esta clase podría ser:




Bien, otra entidad evidente sería Estudiante.
Un Estudiante tendría también un nombre y 5 Asignaturas.
Las Asignaturas, pueden tratarse individualmente en 5 atributos distintos, o como antes, usar un array de 5 elementos.

Diseña tú el UML para la clase Estudiante, con esos atributos. Piensa que constructor y métodos puede necesitar.

Compártelo aquí cuando lo tengas y vemos si hay que corregir o añadir algo.

Un saludo.

636
El problema está aquí:

Citar
Doctor doctor = JOptionPane.showInputDialog(null, "Doctor:", "Nuevo Doctor", JOptionPane.QUESTION_MESSAGE);
      Paciente paciente = JOptionPane.showInputDialog(null, "Paciente:", "Nuevo Paciente", JOptionPane.QUESTION_MESSAGE);

JOptionPane te devuelve una cadena String pero tu estás intentado guardar ese dato como si fuera un objeto Doctor y un objeto Paciente.
Esto no es así de fácil  ::)

Lo que te de el JOptionPane, lo tienes que guardar en un String.
Y con ese String, pedirle a las clase GestorDoctor que te propocione un Doctor, y a la clase GestorPaciente que te de un paciente.

Entonces, primero hay que pensar que dato queremos pedir con el JOptionPane, para que las clases Gestoras sepan encontrar el Doctor y Paciente que deseamos.

Lo ideal sería pedir el ID, ya que es un identificador único. Así le pasamos el ID a la clase Gestora, busca en su ArrayList, y devuelve el Doctor/Paciente que tenga ese ID.

También se puede buscar por nombre, pero en el "mundo real" cabe la posibilidad de que dos doctores o dos pacientes se llamen igual.
Además se complica porque habría que pedir nombre y apellidos.

Por eso se prefiere usar identificadores únicos.
Pero bueno, esto solo es un ejercicio, decide tú cuál atributo quieres pedir para buscar.

Entonces, a la clase GestorDoctor le podemos añadir un método como este:

Código: [Seleccionar]

public Doctor getDoctor(String id) {
for (Doctor doc: doctores)
if (doc.getId().equals(id))
return doc; //Doctor encontrado
//Si el bucle no ha retornado ningún Doctor, es que no existe ese ID
return null;
}

Esto recorre el ArrayList de doctores y si encuentra uno que coincida con el ID recibido por parámetro, lo retorna.
Si no hay ninguno, retorna valor null.

A la clase GestorPaciente le pondremos un método que haga lo mismo.

Con esto al crear Cita, cogemos los String que nos da el JOptionPane y los usamos para buscar Doctores y Pacientes.
Pero, aquí nos topamos con otro problema.

Para buscar Doctores y Pacientes, tenemos que tener acceso a la instancia de GestorDoctor y de GestorPaciente.

Pero la clase GestorCita, no tiene acceso a estas instancias. Estas instancias existen y son visibles solo en el método main() de la clase principal, quedan fuera del ámbito de GestorCita.
¿Cómo solucionarlo?
Pues para no tener que hacer un rediseño del código, lo más fácil es proporcionar a la clase GestorCita unas referencias a las instancias de GestorDoctor y GestorPaciente, para que pueda acceder a ellas y obtener los datos que necesita.
Así que GestorCita tendrá dos nuevos atributos, que serán las referencias a estos objetos.

Estas referencias, se las podemos pasar por su constructor.
La clase GestorCita podría quedar más o menos así:

Citar
public class GestorCita {

   private ArrayList<Cita> citas;

   //Referencias a las instancias de los gestores de doctores y pacientes
   private GestorDoctor doctores;
   private GestorPaciente pacientes;


   public GestorCita(GestorDoctor gestDoc, GestorPaciente gestPaci) {
      citas = new ArrayList<Cita>();
      doctores = gestDoc;
      pacientes = gestPaci;

   }

   public boolean nuevoCita() {
      String id = JOptionPane.showInputDialog(null, "Introduzca Identificador:", "Nuevo Cita", JOptionPane.QUESTION_MESSAGE);
      String fecha = JOptionPane.showInputDialog(null, "Fecha:", "Nuevo Fecha", JOptionPane.QUESTION_MESSAGE);
      String hora = JOptionPane.showInputDialog(null, "Hora:", "Nuevo Hora", JOptionPane.QUESTION_MESSAGE);
      String motivo = JOptionPane.showInputDialog(null, "Motivo:", "Nuevo Motivo", JOptionPane.QUESTION_MESSAGE);
      String iDdoctor = JOptionPane.showInputDialog(null, "ID del Doctor:", "Nuevo Doctor", JOptionPane.QUESTION_MESSAGE);
      String iDpaciente = JOptionPane.showInputDialog(null, "ID del Paciente:", "Nuevo Paciente", JOptionPane.QUESTION_MESSAGE);

      //Pedimos los datos a los gestores que tenemos referenciados
      Doctor doctor = doctores.getDoctor(iDdoctor);
      Paciente paciente = pacientes.getPaciente(iDpaciente);

      
      Cita nuevoCita = new Cita(id, fecha, hora, motivo, doctor, paciente);
      return citas.add(nuevoCita);
      //Devuelve TRUE si se insertó correctamente, FALSE si no se pudo insertar
   }

}



Y ahora, en la clase principal donde instanciamos los gestores, primero instanciamos los gestores de Doctores y Pacientes, y por último el gestor de Citas, quien recibirá referencias de los dos gestores anteriores.

Citar
public class Clinica {

   private static ArrayList<Administrador> administradores = new ArrayList<Administrador>();
   private static GestorDoctor doctores = new GestorDoctor();
   private static GestorPaciente pacientes = new GestorPaciente();
   private static GestorCita citas = new GestorCita(doctores, pacientes);//Pasamos referencias
   private static Scanner teclado = new Scanner(System.in);

   public static void main(String[] args) {
      crearAdmins();

      if (validarAcceso()) {
         System.out.println("\nUsuario autorizado\n");
         ................
         ................
         ................

637
Cada vez que se ejecuta el método crearCSV(), se genera un archivo nuevo.
Si en lugar de eso queremos que se vaya agregando información al archivo, entonces hay que añadirle el parámetro TRUE al constructor del objeto FileWriter que usamos para escribir los datos en el archivo.

Citar
FileWriter escritor = new FileWriter(archivo, true);

Ahora las líneas se irán añadiendo al archivo, pero esto plantea un problema.
El código que escribí, SIEMPRE inserta una línea con una cabecera, y SIEMPRE escribe TODOS los objetos contenidos en el ArrayList.

Es decir, si registro al Doctor Pepe y creo el CSV. Insertará una cabecera y los datos del Doctor Pepe.
Eso está bien.

Pero si acto seguido registros a la Dra Susana y creo de nuevo el CSV, lo que añadirá a continuación es otra vez la cabecera, otra vez los datos del Dr. Pepe y por último a la Dra.Susana.
Y si registro un tercer doctor, de nuevo redundará otra cabecera, otra vez el Dr. Pepe, la Dra Susana y el tercer doctor..


Habría que cambiar la estrategia, que solo inserte la línea de cabecera (la que da nombres a las columnas de datos) la primera vez que se crea el archivo.
Esto lo podemos controlar con un boolean

Y que solo escriba la última entrada recibida en el ArrayList, para que no repita los datos de los registros anteriores.
Esto lo conseguimos consultando cuánto mide el ArrayList y restándole -1 para obtener el indice del último registro recibido.
Marco en negrita los cambios que haríamos al método de crearCSV().

Citar
   
   public void crearCSV() {
      
      File archivo = new File("D:/csv/doctores.csv");
      
      try {
         //Si no existe archivo, intentamos crearlo
         boolean primeraVez = false;
         if (!archivo.exists()) {
            File carpeta = archivo.getParentFile();
            carpeta.mkdirs();
            archivo.createNewFile();
            primeraVez = true; //Primera vez que trabajamos en este archivo
         }
         
         FileWriter escritor = new FileWriter(archivo, true);
         //Cabecera para datos del CSV, solo si es la primera vez
         if (primeraVez)
            escritor.append("#ID;Nombre;Apellidos;Especialidad\n");

         
         //Datos del último Doctor registrado
         int ultimo = doctores.size() - 1;
         escritor.append(doctores.get(ultimo).generaLineaCSV());
//Insertamos linea CSV
         
         escritor.close();
      } catch (IOException e) {
         System.out.println("Error de acceso a: " + archivo.getAbsolutePath());
      }
   }

De este modo, solo escribe el último Doctor registrado. Por lo tanto, nos será más comodo si en lugar de invocar este método desde el main() después de cada Doctor registrado, lo podemos invocar desde dentro del método que usemos para crear Doctores.
Así cada vez que se da de alta un nuevo Doctor, automáticamente se genera la línea CSV correspondiente.
Ya no es necesario solicitarlo en el main de la clase principal

Citar
   
   public void nuevoDoctor() {
      System.out.println("\nALTA NUEVO DOCTOR");
      System.out.println("---- ----- ------\n");
      System.out.print("ID: ");
      String id = teclado.nextLine();
      System.out.print("Nombre: ");
      String nombre = teclado.nextLine();
      System.out.print("Apellidos: ");
      String apell = teclado.nextLine();
      System.out.print("Especialidad: ");
      String espe = teclado.nextLine();
      
      doctores.add(new Doctor(id, nombre, apell, espe));
      crearCSV(); //Añadimos nueva línea CSV al archivo en disco
   }

Lo mismo habrá que hacer con las Citas y los Pacientes.

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

Sobre las Citas, y relacionar Doctores y Pacientes.

No se como habrás escrito tu clase Cita, pero entiendo que lo de relacionar consiste en que una Cita tendrá entre sus atributos, un Doctor y un Paciente, además de los otros atributos indicados por el enunciado.

Puedes incluso porporcionarle dos constructores.
Uno que reciba todos los parámetros para todos los atributos.
Otro que solo reciba ID, hora, fecha y motivo. Con la idea de luego usar los setters para agregar un Doctor y un Paciente a esta Cita.

Código: [Seleccionar]
public class Cita {

private String id;
private String fecha;
private String hora;
private String motivo;
private Doctor doctor;
private Paciente paciente;

public Cita(String id, String fecha, String hora, String motivo,
Doctor doctor, Paciente paciente) {
this.id = id;
this.fecha = fecha;
this.hora = hora;
this.motivo = motivo;
this.doctor = doctor;
this.paciente = paciente;
}

public Cita(String id, String fecha, String hora, String motivo) {
this.id = id;
this.fecha = fecha;
this.hora = hora;
this.motivo = motivo;
}

public String getMotivo() {
return motivo;
}

public void setMotivo(String motivo) {
this.motivo = motivo;
}

public Paciente getPaciente() {
return paciente;
}

public void setPaciente(Paciente paciente) {
this.paciente = paciente;
}

}

638
Hola.

Cuando hay herencias, los constructores de las clases hijas han de recibir, como mínimo, los parámetros que exige el constructor de la clase padre.

Por eso el primer constructor te lo da por bueno, pero el segundo constructor te lo rechaza.

En lugar de dos constructores, haz solo uno que reciba TODOS los parámetros: los exigidos por la clase padre y los que incorpora la clase hija.

Por ejemplo, para la clase AulaTeorica, fíjate en este constructor.
Recibe los 4 parámetros, los tres primeros se los pasamos a la clase padre.
El cuarto, lo usamos para la clase hija

Citar
public class AulaTeorica extends Aula{

    private String tipoPupitre;

    public AulaTeorica(String nombreAula, String ubicacionAula, int capacidadAula, int tipoPupitre) {
        super(nombreAula, ubicacionAula, capacidadAula);
        this.tipoPupitre = tipoPupitre;
    }

//Creación de métodos Getter y Setter   
   
    public String getTipoPupitre() {
        return tipoPupitre;
    }
   
    public void setTipoPupitre(String tipoPupitre){
    this.tipoPupitre = tipoPupitre;
    }
}

639
El resto de tu programa, lo colocas dentro del if que acepta la validación.

Citar
   public static void main(String[] args) {
      crearAdmins();

      if (validarAcceso()) {
         System.out.println("\nUsuario autorizado\n");
         doctores.nuevoDoctor();
         doctores.modificarDoctor();
         doctores.mostrarDoctores();
         pacientes.nuevoPaciente();
         pacientes.mostrarPacientes();
         pacientes.modificarPaciente();
         pacientes.borrarPaciente();
         citas.nuevoCita();
         citas.mostrarCitas();

      }
      else
         System.out.println("\nUsuario no autorizado.");

      System.out.println("\n\t\tFIN DE PROGRAMA");

   }



Para crear un CSV. Hay librerías externas que se pueden usar.
Pero en realidad un CSV es un tipo de archivo muy sencillo y si tan solo queremos crearlos, podemos hacerlo fácilmente nosotros.

Un CSV básicamente son líneas de datos separados por un delimitador, habitualmente un punto y coma ;

Para facilitar aún más el proceso, podemos enseñarle a nuestras clases a crear una línea CSV con sus datos.
Por ejemplo la clase Doctor, podemos incluirle este método:
Código: [Seleccionar]
     
      public String generaLineaCSV() {
      return String.format("%s;%s;%s;%s\n", id, nombre, apellidos, especialidad);
      }

Con ese método, podmos pedirle a cada objeto Doctor que nos retorne un String con sus datos formateados en CSV.

Luego, desde la clase GestorDoctor, ahí podemos escribir otro método que se encargue de escribir en disco un archivo CSV, con las líneas que le proporcione cada uno de los doctores que está gestionando.
Un método como este:
Código: [Seleccionar]

public void crearCSV() {

File archivo = new File("D:/csv/doctores.csv");

try {
//Si no existe archivo, intentamos crearlo
if (!archivo.exists()) {
File carpeta = archivo.getParentFile();
carpeta.mkdirs();
archivo.createNewFile();
}

FileWriter escritor = new FileWriter(archivo);
//Cabecera para datos del CSV
escritor.append("#ID;Nombre;Apellidos;Especialidad\n");

//Datos de los doctores
for (Doctor doc: doctores)
escritor.append(doc.generaLineaCSV());//Insertamos linea CSV

escritor.close();
} catch (IOException e) {
System.out.println("Error de acceso a: " + archivo.getAbsolutePath());
}
}


De este modo, si en mi programa clínica (que no está completo y solo gestiona doctores) doy de alta a tres doctores y genero un CSV:

Código: [Seleccionar]
public static void main(String[] args) {
crearAdmins();

if (validarAcceso()) {
System.out.println("\nUsuario autorizado\n");
doctores.nuevoDoctor();
doctores.nuevoDoctor();
doctores.nuevoDoctor();
doctores.crearCSV();
}
else
System.out.println("\nUsuario no autorizado.");

System.out.println("\n\t\tFIN DE PROGRAMA");

}

Citar
ACCESO AL SISTEMA
------ -- -------

Nombre: Kabuto
Password: 1234

Usuario autorizado


ALTA NUEVO DOCTOR
---- ----- ------

ID: ID001
Nombre: Ramon
Apellidos: Luna
Especialidad: Cardiologia

ALTA NUEVO DOCTOR
---- ----- ------

ID: ID002
Nombre: Susana
Apellidos: Lopez
Especialidad: Hematologia

ALTA NUEVO DOCTOR
---- ----- ------

ID: ID003
Nombre: Raul
Apellidos: Molino
Especialidad: Endoscopia

      FIN DE PROGRAMA


Puedo comprobar que se ha generado un archivo CSV:


Y si lo abro, tengo los datos disponibles en una hoja de cálculo:

640
Venga, en marcha, que ya tengo teclado nuevo je je ...

Mira, para lo del acceso autorizado, para no quedarnos cortos haciéndolo demasiado sencillo, pues haremos una clase Administrador, que total tampoco es tanto trabajo.
Como lo único que tenemos que hacer es comprobar si el Administrador que accede al programa existe o no, esta clase puede ser muy sencilla.

De atributos, un nombre y un password.
Un constructor que reciba los valores para estos atributos.

Y de método, podemos sobreescribir el método equals() para facilitar el poder comparar distintos objetos Administrador para decidir si son el mismo y aceptar su acceso, o si son diferentes y no dejarle acceder.

El método equals() lo heredan TODAS las clases que escribamos en Java, pero si queremos que funcione correctamente tenemos que sobreescribirlo y "enseñarle" como debe compararse con otros objetos para determinar si son equivalentes o no.

En nuestro caso, queremos que dos Administradores se consideren equivalentes si coinciden el nombre y el password. Han de coincidir los dos.
Así que eso es lo que escribo en el método equals().

Código: [Seleccionar]
public class Administrador {

private String nombre;
private String password;

public Administrador(String nom, String pass) {
nombre = nom;
password = pass;
}

@Override
public boolean equals(Object objeto) {
if (objeto instanceof Administrador) { //Objeto si es clase Administrador
//Casteamos objeto a Administrador
Administrador otroAdmin = (Administrador)objeto;
//Comparamos si coinciden nombre y password
if (nombre.equals(otroAdmin.nombre) && password.equals(otroAdmin.password))
return true; //Coinciden ambos, los objetos representan al mismo Administrador
else
return false;//Nombre o contraseña no coinciden, son Administradores diferentes.
}
else //Objeto a comparar no es de clase Administrador
return false;
}

}


Una vez tenemos esta clase, en la clase main, podemos crear un ArrayList con unos cuantos Administradores ya creados por defecto.
Y podemos usar un método de tipo boolean para validar el acceso.
Este método pedirá al usuario un nombre y una contraseña.
Con estos datos creará un objeto Administrador.
Y comprobará si el ArrayList contiene un Administrador equivalente, en caso afirmativo se retorna true y es entonces cuando comenzará el programa que tú ya llevas escrito.

Si no hay un Administrador con esos datos de acceso, se retorna false y entonces sale un mensaje indicando que este usuario no está autorizado y el programa termina.

Código: [Seleccionar]
public class Clinica {

private static ArrayList<Administrador> administradores = new ArrayList<Administrador>();
private static Scanner teclado = new Scanner(System.in);

public static void main(String[] args) {
crearAdmins();

if (validarAcceso()) {
System.out.println("\nUsuario autorizado\n");
//Comienza el programa
//...
//...
//...
//...
}
else
System.out.println("\nUsuario no autorizado.");

System.out.println("\n\t\tFIN DE PROGRAMA");

}

private static void crearAdmins() {
administradores.add(new Administrador("Kabuto", "1234"));
administradores.add(new Administrador("jonatthan23", "5678"));
administradores.add(new Administrador("Ogramar", "0000"));
}

private static boolean validarAcceso( ) {

System.out.println("ACCESO AL SISTEMA");
System.out.println("------ -- -------\n");
System.out.print("Nombre: ");
String nombre = teclado.nextLine();
System.out.print("Password: ");
String password = teclado.nextLine();

Administrador admin = new Administrador(nombre, password);

return administradores.contains(admin);

}

}


Y yo creo que con esto es más que suficiente para cumplir con ese punto del enunciado.  ;)

Páginas: 1 ... 27 28 29 30 31 [32] 33 34 35 36 37 ... 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".