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 - Jorge lopez

Páginas: 1 2 3 [4] 5 6 7 8 9 ... 13
61
Aprender a programar desde cero / Re:CU00653B metodo interno y externo
« en: 22 de Noviembre 2014, 15:25 »
Hola  jaivcaba!

a) Incorrecto, no se puede llamar a un método de un objeto declarado pero no creado, si haces eso obtendrás un error de tipo: java.lang.nullPointerException. Aunque has declarado el objeto por ejemplo: Persona p1; mientras no lo crees la variable p1 no estará apuntando a ningún objeto, de hay sale el error diciendo que estas intentando llamar a un método de una variable (tipo Objeto y/o Persona) que no esta referenciando o apuntando a ningún objeto, esto se soluciona cuando mas adelante en el código dices: p1 = new Persona(); y luego si llamas al metodo desde la variable p1.

b) Correcto.

c) Correcto, La llamada al método pow de la clase Math es una llamada a un método externo, porque? porque es una clase la cual no hemos declarado nosotros,  La llamada al método pow se hace sobre un objeto declarado y creado, pero no somos nosotros quienes lo hemos declarado y creado, sino es algo que Java hace de forma automática y lo hace en segundo plano.

Te sugiero que reflexiones sobre tu respuesta a la pregunta "a".

Saludos!

62
 Hola aleexx1724!

Tu clase esta correcta, nombre de la clase, declaración e inicializacion de variables, nombres y signatura de métodos, ext. Pero esto no es lo que exactamente pedía el enunciado del ejercicio, en este enunciado se pide elaborar un esquema de clases. Diseñar un esquema de clases antes de empezar a programar es una buena practica común entre buenos programadores, esto no es mas que dibujar las clases que necesitas usar en un proyecto, creando a su vez un diagrama de flujo.

Por ahora tal vez no comprendas mucho sobre el correcto diseño y uso de un esquema de clases, pero mas adelante conforme avances en el curso, descubrirás todas sus ventajas.

A continuación dejo un enlace donde puede verse una solución correcta al ejercicio: https://aprenderaprogramar.com/foros/index.php?topic=940.0

Saludos!

63
Citar
gracias por la ayuda, y por los zapatos.
;D ;D ;D ;D   ;D     ;D
;D           ;D   ;D ;D
;D           ;D   ;D ;D
;D ;D ;D ;D   ;D     ;D.

64
 Hola resakoso!

Tu ejercicio cumple perfectamente con lo requerido, no obstante te invito a que analices el siguiente código que he editado a partir de el código de tu clase Entradateclado que por cierto tiene un nombre que no cumple con una regla muy importante a la hora de programar.

Esta es la regla o estilo camelCase, exactamente su variación UpperCamelCase
http://es.wikipedia.org/wiki/CamelCase donde se usan palabras o frases compuestas, y donde la primera letra de cada palabra se escribe en mayúscula. La variación UpperCamelCase de la regla o etilo CamelCase en java se aplica a nombres de clases, para nombres de variables y métodos que usan palabras o frases compuestas por mas de una palabra, se usa la variación lowerCamelCase. Teniendo esto en cuenta, un nombre correcto para tu clase podría ser EntradaTeclado

A continuación dejo el nuevo código comentado en cada linea donde realice algunos cambios oportunos, a fin de que los analices y conserves lo que creas util:
Código: [Seleccionar]

import java.util.Scanner;

public class EntradaTeclado
{
   
    public EntradaTeclado()
    {
        //nada
    }   
   
   
    public static void main(String[] args)
    {
        String texto;
        String res = "";//inicializamos la variable res, con valor cadena de texto vacia
        Scanner entrada = new Scanner(System.in);
        System.out.print("Introduce texto: ");
        texto = entrada.nextLine();
        int sizeTexto = texto.length();//Capturamos el largo del texto escrito en una variable tipo int
        //En lugar de usar if con else anidando mas if con else, pues usamos if con tantos else if como nos sea necesario.
        if(sizeTexto < 5)
        {
            res = "La cadena introducida tiene menos de 5 caracteres";       
        }
        else if((sizeTexto >= 5)&&(sizeTexto <= 15))
        {
            res = "La cadena introducida tiene entre 5 y 15 caracteres";
        }
        else if(sizeTexto > 15)
        {
            res = "La cadena tiene mas de 15 caracteres";
        }
       
        if(texto.substring(0,1).equalsIgnoreCase("a"))/*Usamos el método equalsIgnoreCase(String anotherString); de la clase String para que el programa sepa
        como comportarse ante una "a" o una "A", Mayúscula/minúscula*/
        {
            res += " y comienza por la letra " + texto.substring(0,1);/*Con este substring extraemos la primera letra del texto para mostrarla por pantalla
            si es una "a" o una "A"*/
        }
        else
        {
            res += " y no comienza por la letra a/A";/*La funcion del operador += es igualar el valor de la variable que lo antecede, a la suma de un nuevo valor
            sobre esta misma variable, es lo mismo que decir: res = res + "nuevo String a sumar"*/
        }
        /*Nota: en tu código descuidas el uso de las llaves {} en los condicionales if, (en ocasiones faltan llaves) aunque el programa de momento se comporte bien
           esto podría ser perjudicial a lo largo, fíjate que yo coloco las {} siempre en su lugar correspondiente.*/
        System.out.println(res);
    }
   
}

Como siempre, cualquier duda no dudes en preguntar.

Saludos!

65
 Hola nuevamente LMP!

Intentare sacarte de tu confusion exponiendo una situación imaginaria ;).

Imagina que te invitan a una fiesta, la persona que te invita te dice: debes de llevar un frasco conteniendo tinta para zapatos de color rojo (esto seria un parámetro en un constructor) para que el portero te deje entrar a la fiesta, cuando llegues a la entrada le muestras el frasco al portero y el te dejara pasar y también te dejara conservar el frasco. Una vez que estés dentro, yo estaré esperando por ti y te regalare unos zapatos nuevos,
(los zapatos nuevos representan la expresión: new Taxi(); ) puedes usar tu frasco de tinta para tintar tus zapatos nuevos o bien puedes no usarlo y dejar tus zapatos nuevos de color negro.

Ahora intentare relacionar esta situación imaginaria con tu confusion: Un parámetro es como una llave para poder entrar (frasco de tinta) o ejecutar las instrucciones que contenga un método o constructor, normalmente el valor de un parámetro se usa en el cuerpo (el cuerpo de un método o constructor esta comprendido entre las llaves {...}) de un método o constructor, pero también un método o constructor puede pedir un parámetro pero no hacer uso de este en su cuerpo, (aunque no es lo normal) fíjate que en la fiesta el portero te deja entrar porque llevas lo que se te pide
(un frasco con tinta roja para zapatos) pero el portero no te dice y mucho menos te obliga a pintar los zapatos nuevos que yo te he regalado con la tinta que tienes en el frasco.

En tu nuevo constructor:
Código: [Seleccionar]
public TaxiCond (Taxi objetoTaxi, Persona objetoPersona) {
        vehiculoTaxi = new Taxi ( );
        conductorTaxi = new Persona (objetoPersona.getNombre() ); }
indicas lo siguiente: Este constructor solicita dos parámetros para poder ejecutarse,
(igual que como en la fiesta te solicitan el frasco con tinta para que puedas entrar) si le pasas como parámetros números enteros, el constructor te negara la entra o ejecución, porque lo que solicita es un objeto Taxi y un objeto Persona.

Una vez introduces los parámetros correctos indicas que la varia tipo Taxi "vehiculoTaxi" sera igual a un nuevo objeto de la clase Taxi, pero el hecho de que el parámetro que acabas de pasarle al constructor lo ayas construido con su constructor con parámetros, no incide en la creación del objeto de la variable "vehiculoTaxi", es como que entraste a la fiesta con tu frasco de tinta pero no tintaste tus zapatos, no le diste ningún uso al frasco.

No es lo mismo decir: regalo = new Zapatos(); a decir regalo = new Zapatos(frasco.tintarZapatos()); donde en el primer código tienes unos zapatos negros y en el segundo tienes unos zapatos rojos.

Tampoco es lo mismo decir: vehiculoTaxi = new Taxi(); a decir: vehiculoTaxi = new Taxi(objetoTaxi.getMatricula(), objetoTaxi.getDistrito(), objetoTaxi.getTipoMotor()); donde en el primer código creas un objeto de la clase Taxi usando el constructor general (sin parámetros) de la clase Taxi y en el segundo código creas un objeto de la clase Taxi usando el constructor con parámetros de la clase Taxi, pasandole los valores que has indicado en el parámetro objetoTaxi.

Espero que captes la idea, pero si aun te cuesta comprender después de esta "explicación" te recomiendo continuar avanzando en el curso, puesto que cosas que hoy te parecen super difíciles las dominaras mas adelante y luego te reirás cuando recuerdes que una vez tuviste una confusion en tan "sencilla" situación.

Saludos!

66
 Hola LMP!

Citar
Funciona bien, pero no se si se consideraría adecuado el modo para programar
Aunque como bien dices, funciona bien, esta forma de hacer esta tarea "no es recomendable" de un todo he intentare explicarte porque.

En java hay muchos factores que nos ayudan a mantener un orden a la hora de diseñar un código, un factor de estos (por mencionarte uno que otro) es un "simple" convenio entre programadores donde se a convenido que el nombre de una clase debe de comenzar siempre con una letra mayúscula, por tal motivo cuando por ejemplo yo creo una clase con nombre: persona donde al compilar la clase no me salta ningún error y todo sale bien, pero cuando otro programador con experiencia mira mi código nota que tengo una clase persona donde debería tener una clase Persona.

Que el nombre de mi clase inicie o no con una letra mayúscula ya es opción y responsabilidad mía como programador, puesto que el compilador java en cuanto a funcionamiento admite cualquiera de las dos formas, pero yo como programador debo de siempre pensar en hacer siempre lo correcto para diseñar un código de calidad donde también es importante el aspecto visual de mi código.

Porque es recomendable decir: "El objeto TaxiCond presenta estos datos. Matrícula: " + matricula... en lugar de decir: "El objeto TaxiCond presenta estos datos. Matrícula: " + getMatricula()...? Yo diría que por diversos motivos. 1ro: La forma correcta de declarar la variable matricula en la clase de este ejercicio es: private String matricula; Donde al declararla como private estamos indicando que dicha variable solo podrá ser usada por su clase y no por otras clases. El método getMatricula(); esta declarado como public, porque esta pensado para ser usado por otras clases interesadas en conocer el valor de la variable matricula, pero que no pueden usar directamente la variable matricula porque dicha variable esta declarada como private. Para que relaciones todo esto con tu duda te explico que un método get, no debería invocarse desde su propia clase, si no que en su lugar se usa la variable en si, por ejemplo lo correcto seria decir: System.out.println(matricula); y no decir: System.out.println(getMatricula());

2do: Un buen programador debe de optar siempre por diseñar un código lo mas corto claro y eficiente posible. Porque diría yo: System.out.println(getMatricula());? cuando puedo decir: System.out.println(matricula); donde obtendré el mismo resultado por pantalla, pero con esta ultima forma me ahorro tiempo al escribir por ser una linea de código mas corta (con menos caracteres) y también me ahorraría espacio en mi código por la misma razón y estoy diseñando un código mas corto y claro con la misma eficiencia de usar una forma u otra. Esto de ahorrar tiempo y espacio tal vez sea "insignificante" en una linea de código, pero recuerda que un código puede contener miles y miles de lineas de código, donde esto si seria bastante relevante.

3ro: Cuando uso una sintaxis como: System.out.println(matricula); estoy diseñando un código bajo un standar de programación (la mayoría de programadores del mundo lo hacen así) igual que declarar el nombre de una clase iniciando con letra mayúscula, por tanto, si otro programador mira mi código no notara algo "raro" a diferencia de si se encuentran con algo como: System.out.println(getMatricula()); en la clase propia de la variable matricula.

Espero que mi explicación te sea útil, y como siempre, cualquier duda no dudes en preguntar.

Saludos!

67
 Le estoy pasando el String "correocorrecto@hotmail.com" que para mi es un mail correcto, pero me devuelve false, y no he conseguido que me devuelva true sin modificar el patrón, te a funcionado correctamente este metodo? estoy yo indicando como parámetro un "correoincorrecto@@hitmail.c0m" ?

68
 Como que dos personas estábamos respondiendo un mismo tema a la vez  :o

Hola Mastermind! no es que yo contradiga tu respuesta, sino que soy un poquito exigente  ;D ;D

Saludos compañero!

69
 Hola Sixtoex!

Veo que tu programa trata de notificar al usuario cuando se escribe una dirección de correo electrónico de manera correcta o incorrecta, el criterio que has especificado para que el programa decida cuando esta bien o cuando esta mal se basa en el carácter '@' y como bien dices, has omitido otros criterios a tomar en cuenta para aumentar la eficiencia de tu programa, por ejemp: si el correo contiene o no un punto, si el correo contiene o no caracteres que en realidad no admite un correo, si el correo escrito es solo arrobas, donde por ejemp si le pasas el String " @@@@@@@" este te dice: "Escribistes perfectamente el correo" y muchos otros criterios que si no se toman en cuenta, podrían afectar la eficiencia de tu programa.

A la hora de diseñar un código, es preferible no omitir lo que es obvio presentara una deficiencia en nuestros programas, así los críticos que revisen tu código (en este caso yo)
se llevaran una buena impresión por ver un trabajo bien pensado y elaborado.

Aun tomando en cuenta que tu programa solo se basa en la presencia del carácter '@' en el String que indique el usuario, no puedo decir que tu programa funciona correctamente, ya que devuelve un dato erróneo ante un String "erróneo" como por ejemp: " @@@@@@@icuantas@massequieranincluir.com" donde el programa dice: "Escribistes perfectamente el correo".

En cuanto al código en si, me parece que el nombre de la clase no es un nombre apropiado. No has colocado un modificador de acceso (public, protected o private) a las variables de clase como es lo normal y según la situación.

Mis sugerencias: Rediseña el código de tu clase, tomando en cuenta las anteriores criticas constructivas para crear un programa mas eficiente.

Saludos!

70
Hola Ramon!

El curso Aprender programación java desde cero esta elaborado en base al IDE BlueJ, por tal motivo te recomendaría usarlo para realizar este curso, no obstante puedes usar el entorno de desarrollo de tu preferencia siempre y cuando seas capas de llevar el buen ritmo del curso usando un IDE que no es el propio usado a lo largo de todo el curso.

Te sugiero que leas (por adelantado) la entrega CU00613B https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=398:netbeans-eclipse-jcreator-jbuilder-icual-es-el-mejor-entorno-de-desarrollo-ide-para-java-cu00613b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188 del curso Aprender programación java desde cero donde podrás encontrar información útil relacionada a este tema, que tal vez te ayude a tomar la mejor decision.

Saludos!

71
Hola LMP!

Aquí tienes la respuesta: https://www.aprenderaprogramar.com/foros/index.php?topic=355

Saludos!

72
 Hola nuevamente Martin!

Para que puedas entender lo que pasa en tu código relacionado al error en compilación cannot find symbol- method method equalsIgnoreCase es necesario que comprendas algunas diferencias las cuales te explicare.

El metodo equals es un método cuya funcion es comparar la igualdad (semejanza, parentesco, ext..) entre dos objetos retornando como resultado un valor booleano, true en caso de que los objetos comparados sean iguales y false en caso contrario.

Este método puede ser invocado desde cualquier objeto para compararlo con otro objeto. Debemos recordar que en java trabajamos con objetos y que disponemos y podemos crear miles de tipos de objetos de diferentes tipos, por ejemplo: podemos crear objetos de una clase Persona, de una clase Medico, de una clase Casa, de una clase Scanner, y de miles de clases mas los cuales podríamos comparar usando el método equals.

Un String como: "enero" es un tipo objeto, en java un String (cadena de texto o caracteres) es un tipo especial el cual se trata como objeto, por tanto un código como:
Código: [Seleccionar]
String entrada = "enero";
Persona objetoPersona = new Persona();
if(entrada.equals(objetoPersona)){System.out.println("son iguales");}else{System.out.println("son diferentes");}
compilaría sin problemas, porque estamos comparando dos objetos, uno de tipo persona y una cadena de texto de tipo String. Esto corrobora lo que dices:
Citar
Si en vez de usar "equalsIgnoreCase" uso solo "equals", se compila sin errores, pero el programa no detecta cuando se acierta el mes..y sigue pidiendo otra entrada.
donde a pesar de que el código compila (porque estas usando equals para comparar dos objetos) el bucle while nunca tendrá salida aun cuando el usuario acierte el mes secreto, porque? Porque le has indicado al programa que el bucle terminara cuando entrada1 sea igual a mesSecreto (lo que altera el valor de i a 1) . entrada1 es un tipo EntradaDeTeclado y mesSecreto es un tipo String, por tanto nunca serán iguales, por tal motivo en este caso tu programa entraría en un bucle infinito.

El método equalsIgnoreCase a diferencia del metodo equals que compara cualquier tipo de objetos, solo compara objetos tipo String (cadenas de texto) por tal motivo cuando usas una sentencia como:
Código: [Seleccionar]
if(entrada1.equalsIgnoreCase(mesSecreto)){...} el código no compila, porque entrada1 es del tipo EntradaDeTeclado y mesSecreto es del tipo String y el método equalsIgnoreCase esta esperando dos tipos String para compararlos.

Aun corrijamos el error cannot find symbol- method method equalsIgnoreCase tu clase AdivinaMes presenta otras irregularidades y/o debilidades que merecen ser comentadas.

1ro: Estas imprimiendo por pantalla la variable mesSecreto antes de que el usuario intente adivinar el mes secreto, y desde ese momento deja de ser un mes secreto  ;)

2do: Creas una variable entrada1 y luego creas otra variable entrada2, en realidad con una sola variable (de nombre "entrada" por ejemplo) del tipo EntradaDeTeclado seria mas que suficiente.

3ro: Creas una variable int i; que prácticamente esta de mas para "controlar" la salida del bucle.

4to: No creas una variable (que si deberias crear) de tipo String para que almacene el String escrito por el usuario la cual seria usada para comparar en el condicional if dentro del bucle while, seria como decirle al programa: si lo que escribe el usuario es igual al mes secreto sin importar diferencias de mayúsculas y/o minúsculas (equalsIgnoreCase) has tal cosa.. Con la creación de esta nueva variable String y su correcto uso en el condicional if, eliminamos el error cannot find symbol- method method equalsIgnoreCase.

Al diseñar un código, debemos de tratar de que sea lo mas corto y claro posible, por eso es un abito positivo en un buen programador, la reutilizacion de código que no es mas que reutilizar un mismo recurso (variable, método, ext..) siempre que sea posible, antes de crear código (variable, método, ext..) nuevo.

A continuación dejo el código de tu clase AdivinaMes editado con algunas mejorías las cuales estarán comentadas en el código, te sugiero que analices cada punto y como siempre, si tienes alguna duda no dudes en preguntar.

Código: [Seleccionar]
public class AdivinaMes {

    public static void main (String[] Args)
    {

        String MesesA[] = {"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
       
        String mesSecreto = MesesA[(int)(Math.random()*12)];       
        System.out.println("Adivine el mes secreto.\nPorfavor introduzca el nombre de un mes:");
        EntradaDeTeclado entrada = new EntradaDeTeclado();
       
        String mes = entrada.getEntrada();/*Esta variable almacena lo que escriba el usuario por teclado, invocamos el metodo getEntrada()
        de la clase EntradaDeTeclado que nos devuelve el String escrito por el usuario para almacenarlo en esta variable "mes"*/
       
        while(!mes.equalsIgnoreCase(mesSecreto))/*el operador "!" antepuesto a la variable mes, hace que el valor booleano devuelto por
        la instruccion "while(mes.equalsIgnoreCase(mesSecreto))" sea su valor contrario, con esto sustituimos la variable int i; que daba salida
        al bucle.*/
        {
           if(!mes.equalsIgnoreCase(mesSecreto))
           {
                System.out.println("No ha acertado. Intente adivinarlo introduciendo otro mes: ");
                entrada.pedirEntrada();/*En lugar de crear una nueva variable entrada2 para crear un nuevo objeto EntradaDeTeclado, invocamos
                el metodo pedirEntrada() sobre el mismo objeto que ya aviamos creado, esto se conoce como reutilizacion de código.*/
                mes = entrada.getEntrada();
            }
        }
        System.out.println("\f\n¡Ha acertado! el mes secreto era " + mesSecreto + ".\n\nFin.");
    }
}
Saludos!

73
 Si, esto puede ser posible aunque un poco mas complejo que cuando creamos un método tipo procedimiento para que realice una tarea o proceso en relación a una/s variable/s especifica/s como es el caso del anterior código.

A continuación dejo un código el cual he diseñado haciendo uso de la clase Field del paquete java.reflect. y de la clase Scanner del paquete java.util.

public class IntercambiarValores
Código: [Seleccionar]
import java.lang.reflect.Field;
import java.util.Scanner;
public class IntercambiarValores
{
  public static void main(String []args)
  { 
     Scanner sc = new Scanner(System.in);
     Integer objeto1, objeto2;//Variables locales
     System.out.println("Este programa intercambia el valor entre dos objetos tipo Integer.\n\nPor favor indique el valor del objeto 1: ");
     objeto1 = sc.nextInt();
     
     System.out.println("\nPor favor indique el valor del objeto 2: ");
     objeto2 = sc.nextInt();
       
     System.out.println("\nValor inicial de las variables objeto1 y objeto2:\nobjeto1 = " + objeto1 +"\nobjeto2 = "+objeto2 + "\n");
       
     intercambio(objeto1, objeto2);
     System.out.println("\nValor actual de las variables objeto1 y objeto2:\nobjeto1 = " + objeto1 +"\nobjeto2 = "+objeto2 + "\n");
     
     System.out.println("\n\nSe ha realizado el intercambio de valores exitosamente.\n\nHasta luego!");
  }
   
  private static void intercambio(Integer obj1, Integer obj2)
  {
     try
     {
       Integer auxiliar = new Integer(obj2);
       Field valor = Integer.class.getDeclaredField("value");
       valor.setAccessible(true);
       valor.set(obj2, obj1);
       valor.set(obj1, auxiliar);
       valor.setAccessible(false);
     }
        catch(Exception e)
     {
       e.printStackTrace();
     }   
  }
}

Saludos!

74
 Hola  caludo!

Antes que nada te pongo en conocimiento que cuando vayas a introducir código en el foro, antes presiona el botón # (insertar codigo) que se encuentra arriba del campo de escritura, te saldrán las etiquetas: [code] [/code] y a continuación procede a pegar el codigo en medio de esas etiquetas. Ejemplo: [code]aquíElCódigo ..[/code]. Una vez escrito todo pulsa el botón previsualizar para comprobar si se ve bien y cuando estes conforme con lo previsualizado procede a publicar tu tema.

Respecto a tu duda. Para lograr lo que quieres usando un método tipo procedimiento (void) tienes que tener unos cuantos puntos claros, lo primero es saber que en una clase pueden existir variables generales
(de uso general o global en todo el código de la clase) y variables locales a un método (de uso exclusivo para el método donde son creadas). Un método (tipo funcion o tipo procedimiento) puede interactuar con variables generales o con variables locales, o con ambas al mismo tiempo, algo que debes tener claro es que no basta con pasarle como parámetros las variables num3 y num4 (intercambio(num3,num4);) al método intercambio para conseguir lo que quieres, también hace falta que las variables num3 y num4 estén relacionadas al método "intercambio" para que sufran o implementen los cambios, y también que estén vinculadas al metodo main para poder imprimirlas por pantalla mediante una instrucción "System.out.println();" Como hacer para que ambos métodos puedan usar una misma variable? Pues declaramos esas variables como variables generales de la clase.

Las variables locales de un método no las conoce otro método aunque tengan el mismo nombre (no son las mismas), a diferencia de las variables generales de una clase, donde si un método realiza un cambio en esta, el cambio sera notorio para todos los demás métodos que usen tal variable.

Si en tu clase "Estudio"tenemos las variables generales num3 y num4, las cuales usamos en el cuerpo de el método "intercambio" para que sufran un cambio y luego las usamos en el método main en una instruccion "System.out.println()" pues si conseguirás lo que quieres.

A continuación dejo una nueva clase creada a partir del código de tu clase "Estudio", te sugiero que la analices teniendo en cuenta lo que te he comentado.

Código: [Seleccionar]
public class IntercambiarValores
{
  private static int num3=10;//Variable general o global para toda la clase
  private static int num4=20;//Variable general o global para toda la clase
  public static void main(String []args)
  {   
       int num1=2;//Variable local solo para uso del método main
       int num2=5;//Variable local solo para uso del método main
       int prov;//Variable local solo para uso del método main
       
       System.out.println("Valor inicial de las variables num1 y num2:\nnum1 = " + num1 +"\nnum2 = "+num2);
       
       prov = num1;
       num1=num2;
       num2=prov;
       
       System.out.println("\nValor actual de las variables num1 y num2:\nnum1 = " + num1 +"\nnum2 = "+num2);
       System.out.println("\nValor inicial de las variables num3 y num4:\nnum3 = " + num3 +"\nnum4 = "+num4);
       
       intercambio(num3,num4);
       
       System.out.println("\nValor actual de las variables num3 y num4:\nnum3 = " + num3 +"\nnum4 = "+num4);

  }

  private static void intercambio(int num/*//Variable local solo para uso del método intercambio*/,int nume/*//Variable local solo para uso del método intercambio*/)
  { 
     int prov;//Variable local solo para uso del método intercambio
     prov = num;//Una variable local y una general
     num3 = num4; //Ambas variables generales o globales para el de el código en general de la clase
     num4 = prov;//Una variable general y una variable local
  }
}

Cualquier duda no dudes en preguntar.

Saludos!

75
 Hola jaivcaba!

Tu ejercicio cumple a la perfección con lo que se pide en el enunciado, sin embargo hay dos puntos a comentar relacionados al diseño del método Combinador.

1ro: Olvidaste indicar el tipo modificador de acceso para este método, en este caso "public"

2do: El nombre de un método ha de comenzar siempre con letra minúscula, en lugar de "Combinador" deberia ser "combinador". En caso de que el nombre tenga mas de una palabra, pues la primera letra de cada siguiente palabra se escribe en mayúscula, ejemp: "combinadorDeCadenas".

Otro punto mas, a comentar, es el nombre de la clase, en lugar de "ejercicioSubstring" debería ser "EjercicioSubstring". Siempre el nombre de una clase ha de comenzar con letra mayúscula.

Estos son "pequeños" detalles que debemos de tener en cuenta para diseñar un código optimo y agradable al ojo de quien lo mire.

Saludos!

76
  Una parte del enunciado del ejercicio dice:
Citar
Se debe pedir al
usuario un nombre y disco con más ventas de otro cantante famoso, y una vez introducidos los datos
mostrar la lista actualizada usando iterator. Una vez mostrada la lista actualizada, se debe dar opción a
elegir entre volver a introducir los datos de otro cantante o salir del programa
lo que hace al tercer cantante famoso obligatorio en la lista, en tu ejercicio el tercer cantante famoso es opcional, dando la opción de salir del programa solo con los dos cantantes famosos que están en la lista por defecto.  El verdadero objetivo en este ejercicio es dominar el uso de la clase Iterator y sus métodos, así como también dominar el uso de bucles, por lo tanto, que el agregar un tercer cantante a la lista sea una opción no es tan relevante, pero te lo comento porque es parte de lo que pide el enunciado.

Comentarios por clase:

public class EntradaTexto: Una variable de clase siempre ha de ser declarada con el modificador de acceso private a menos que en una situación especial se requiera lo contrario. Teniendo esto presente cambiamos tu linea de codigo:
Código: [Seleccionar]
public Scanner lector; por
Código: [Seleccionar]
private Scanner lector;En este curso en lecciones mas avanzadas encontraras detalles sobre los diferentes modificadores de acceso
(public, protected y private) en java y detalles sobre cuando usar uno u otro.

public class CantanteFamoso: Lo mismo sobre las variables de clase y su tipo de modificador de acceso
(Especificar su tipo de modificador de acceso como private)

El nombre de los métodos setDiscoVentas(); y getDiscoVentas(); no son apropiados, el nombre de un método set o get debe de ser una combinación de el prefijo set/get + exactamente el mismo nombre de la variable al que tal método este relacionado, debido a que la variable relacionada en este caso es "discoConMasVentas" un nombre correcto para estos métodos podría ser: setDiscoConMasVentas(); y getDiscoConMasVentas();

tu clase CantanteFamoso quedaría mas o menos así:
Código: [Seleccionar]

public class CantanteFamoso {
    private String nombre;
    private String discoConMasVentas;
   
    public CantanteFamoso() {
        nombre = "";
        discoConMasVentas = "";
    }
   
    public CantanteFamoso(String nombre, String disco) {
        this.nombre = nombre;
        discoConMasVentas = disco;
    }
   
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
   
    public void setDiscoConMasVentas(String disco) {
        discoConMasVentas = disco;
    }
   
    public String getNombre() {
        return nombre;
    }
   
    public String getDiscoConMasVentas(){
       return discoConMasVentas;
    }
   
    public void verDatosDelCantante()/*Este método nos evita el tener que repetir código en la clase con main, cada vez que deseemos conocer el nombre y disco con mas
    ventas de un cantante famoso solo con invocar este método desde la clase con main.*/
    {
      System.out.println("Nombre: " + nombre + "\nDisco con mas ventas: " + discoConMasVentas + "\n");
    }
}


public class ListaCantantesFamosos: Lo mismo sobre las variables de clase y su tipo de modificador de acceso
(Especificar su tipo de modificador de acceso como private)

En esta clase seria recomendable crear un método "get" para la variable general "listaCantantesFamosos" puesto que al declararla como  private nos generara un error en la clase con main ya que haces uso directo de esta variable en la clase Test, y el modificador de acceso private priva a otras clases de poder acceder a variables propias de su clase de origen. Tu clase ListaCantantesFamosos quedaría mas o menos así:
Código: [Seleccionar]

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class ListaCantantesFamosos {
    private List<CantanteFamoso> listaCantantesFamosos;//private en vez de public
   
    public ListaCantantesFamosos() {
        listaCantantesFamosos = new ArrayList<CantanteFamoso>();
    }
   
    public void addCantantes(CantanteFamoso nombre) {
        listaCantantesFamosos.add(nombre);
    }
   
    public void verCantantesEnLaLista()/*Es preferible que cada clase realice tareas propias de ella misma, por tal motivo creamos este método que usa la clase Iterator
    para recorrer la lista de cantantes famosos y ofrecer detalles de cada cantante famoso en la lista, esto ademas nos evita tener que usar varios ciclos (bucles) while
    en la clase con main, construyendo así un código mas corto claro y limpio.*/
    {
      Iterator it = listaCantantesFamosos.iterator();
      while(it.hasNext())
      {
        CantanteFamoso cantante = (CantanteFamoso)it.next();
        cantante.verDatosDelCantante();
      }
    }
   
    public List<CantanteFamoso> getListaCantantesFamosos()/*Este método nos devuelve un ArrayList sobre el cual podremos invocar algunos métodos que nos serán
    de utilidad en la clase con main, como por ejemplo, el método size(); ext..*/
    {
      return listaCantantesFamosos;
    }
}

public class Test: Un buen programador tratara de evitar siempre la duplicidad de código, en una clase con main, el no duplicar código es un "reto" que aumenta, puesto que esta clase se encarga de dirigir el programa, por tal motivo a la hora de diseñar un código, debemos de dejar todos los procesos y tareas en su sitio (clase) donde mayor se correspondan, para evitar tener un método main sobrecargado.

Tu clase Test no es que este mal, pero si se puede mejorar, te sugiero analizar el siguiente codigo, editado a partir de tu clase Test:
Código: [Seleccionar]
public class Test {   
    public Test() {
    }
   
    public static void main(String[] args) {
        ListaCantantesFamosos lista1 = new ListaCantantesFamosos();
       
        CantanteFamoso Cantante1 = new CantanteFamoso("Michael Jackson", "Thriller");
        CantanteFamoso Cantante2 = new CantanteFamoso("Luis Miguel", "Mi jardín oculto");
        lista1.addCantantes(Cantante1);
        lista1.addCantantes(Cantante2);
       
        EntradaTexto texto = new EntradaTexto();
        System.out.println("Tenemos una lista con los siguientes " + lista1.getListaCantantesFamosos().size() + " cantantes famosos:\n");       
        lista1.verCantantesEnLaLista();       
        System.out.println("Por favor agrega otro cantante famoso mas a nuestra lista.\n\nIntroduzca nombre del cantante: ");
        String cantante, disco;
        cantante = texto.leerTexto();
        System.out.println("\nIntroduzca nombre del disco mas vendido: ");
        disco = texto.leerTexto();
        lista1.addCantantes(new CantanteFamoso(cantante, disco));
        System.out.println("\nEsta es la lista actualizada:\n ");       
        lista1.verCantantesEnLaLista();
        String volver;
        do {           
            System.out.println("¿Desea añadir algún otro cantante famoso  a la lista?(y/n) ");
            volver = texto.leerTexto();
            if (volver.equals("y")) {
                System.out.println("Introduzca nombre del cantante: ");
                cantante = texto.leerTexto();
                System.out.println("Introduzca nombre del disco mas vendido: ");
                disco = texto.leerTexto();
                lista1.addCantantes(new CantanteFamoso(cantante, disco));
                System.out.println("\nEsta es la lista actualizada:\n");
                lista1.verCantantesEnLaLista();
            }
            else {
                System.out.println("\fAsi a quedado nuestra lista de " + lista1.getListaCantantesFamosos().size() + " cantantes famosos:\n");
                lista1.verCantantesEnLaLista();
                System.out.println("Gracias por ayudarnos con nuestra lista de cantantes famosos\n\nHasta luego!");
            }
        }while (volver.equalsIgnoreCase("y"));
    }
}

Cualquier duda no dudes en preguntar.

Saludos!

77
 Hola yaymalaga!

Estoy verificando tu ejercicio, en breve lo comento.

78
 Hola Martin!

Hace falta el código de la clase EntradaDeTeclado para poder compilar tu ejercicio y así poder ayudarte, publica todo el código relacionado a tus ejercicios para nosotros poder hacer un analisis completo, de ante mano te digo que veo algunos errores lógicos en la clase AdivinaMes los cuales comentare cuando suministres el resto del código faltante (clase EntradaDeTeclado y cualquier otra clase relacionada a este ejercicio, si existe)

Saludos!

79
Hola  crisnar456!

Esta podria ser una solucion a lo que indicas:

Código: [Seleccionar]
public class VectorInt
{
   public static void main(String []args)
   {
     int[] vector = {1,2,3,4,-5,6,-7,-8,-9,10};//Vector que contiene 10 enteros
     System.out.println("\nContenido inicial del vector\n");
     for(int obj: vector)//Uso de un for each para mostrar el contenido inicial del vector
     {
        System.out.println(obj);
     }
     System.out.println("\nContenido actual del vector (usando el método public static int abs(int a) de la clase Math)\n");
     for(int i = 0; i < vector.length; i++)//Uso de un for tradicional para recorrer y reasignar los nuevos numeros enteros (positivos) en determinadas posiciones del vector
     {
       vector[i] = Math.abs(vector[i]);//Aqui es donde realizamos la convercion de negativo a positivo mediante el metodo abs(int a); de la clase Math.
       System.out.println(vector[i]);
     }
   }
}

Te sugiero consultar la documentación de java en la clase Math y en su método abs(int a); el cual he usado para solucionar lo que planteas a fin de obtener detalles sobre este método, espero que no seas tan novato en java como para no conocer acerca del api de java y las ventajas que nos puede aportar a la hora de programar.

Cualquier duda no dudes en preguntar  ;).

Saludos!

80
 Tu código cumple con lo requerido, pero se puede mejorar.

Clase CantantesFamosos: Todo correcto

Clase TesCantantesFamosos: En esta clase lo que mas resalta es la duplicidad de código. Usar lineas de código idénticas (duplicar código) es algo que todo buen programador debe de evitar, una buena alternativa para evitar duplicar código, es ligar el código el cual nos vemos en la necesidad de duplicar a un método, así en ves de por ejemplo tener este fragmento de tu código:
Código: [Seleccionar]
System.out.print("Ingrese el primer Cantante famoso: ");
        String nom1 = sc.nextLine();
repetido varias veces a lo largo del código de la clase, pues usaríamos un método (o bucle como es en este caso) para evitar la duplicidad. Ahora esto parece insignificante porque solo repites este código dos veces, pero que harías si tuvieras que introducir 100 nombres de cantantes famosos?

A continuación dejo el código de la clase TestCantantesFamosos, ligeramente editada y comentada en los puntos editados:

clase TestCantantesFamosos
Código: [Seleccionar]
import java.util.Scanner;
/**
 * Write a description of class TestListaCantantesFamosos here.
 *
 * @author (your name)
 * @version (a version number or a date)
 */
public class TestListaCantantesFamosos{
   
    public TestListaCantantesFamosos(){
    }
   
    public static void main(String[] args){
      Scanner sc = new Scanner(System.in);
      ListaCantantesFamosos list = new ListaCantantesFamosos();
      System.out.print("Esta lista contiene " + list.getTamaño() + " nombres de cantantes famosos, por favor escribe 2 nombres mas para completar el top 5 de la semana.\n\n"); 
      for(int i = 0; i < 2; i++)
      {
          System.out.print("Ingrese el cantante famoso numero " + (list.getTamaño() + 1 )+ ": ");
          list.addNombre(sc.nextLine());
      } /*Con este bucle for, reducimos la cantidad de codigo y evitamos la duplicidad de codigo que tenias anteriormente.*/
       
      System.out.println("\nContenido de la lista en fila: " + list.getNombreCantantes());       
      //System.out.println(); //Lo puse para dejar un espacio. Otra opción para dejar un espacio o insertar un salto de linea es el uso de (\n)       
      System.out.println("\nContenido de la lista en columna:\n");
      for(int i = 0; i < list.getTamaño();i++){
             System.out.println(list.getNombreCantantes().get(i));
      }
    }
}

Saludos!

Páginas: 1 2 3 [4] 5 6 7 8 9 ... 13

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