Aprender a programar - Recomendaciones

Los dos últimos ejercicios de la lección los he tenido que hacer hoy porque he tenido bastante poco tiempo estos días con St. Patrick y festividades varias.

Estoy segurísimo que hay una manera más sencilla de hacer que Java te muestre una linea de texto + el resultado de una operación + otra linea de texto en la misma linea, pero he probado varias opciones que pensaba que podían funcionar y como no lo han hecho he tirado por la siguiente opción.

Tampoco tengo muy claro si el "comentario multi linea" que tenía que poner en el programa lo tengo que poner al lado como lo he escrito o lo puedo poner debajo de la línea 8.

Se lo acabo de mandar al profe para ver que me cuenta.

Ver el archivo adjunto 36075

No sé nada de java, pero creo que la función format es tu amiga:

 
Bien pensado pero para que lo sepas. Usando el operador + puedes concatenar Strings. Usando el carácter especial dentro de un String \n se interpreta como un salto de línea. Ej:

System.out.print(“Salto de línea al final de esta frase\n”);
System.out.println(“1 + 2 = ”+(1+2));

Gracias!! Vamos a ver cuando llego a los operadores 😊.
La siguiente lección, 3, es sobre variables.

Screenshot 2022-03-22 at 12.10.26.png

No sé nada de java, pero creo que la función format es tu amiga:


¡Esta web me la voy a guardar de referencia!

Muchas gracias 😊
 
Vamos a ver.. ¿porque Java tiene tantas variables que se podrían combinar en una sola?

Me parece que la diferencia entre un byte, short, int o long, aparte de la cantidad de bits que tiene o almacena cada uno, es nula, ¿no?.

Quiero pensar que usas uno u otro dependiendo de la memoria que tenga el ordenador o la memoria que use el programa que estás haciendo pero, ¿no sería más sencillo que solo hubiese una variable de cada tipo y que fuese más o menos inteligente?.

Por lo que he aprendido en esta lección tienes que poner una L al final del número si declaras una variable long para que Java no de error así que bien podrían inventar una variable única en la que pusieses la letra al final del numero, ya sea entero o con decimal.

Igual hay una en lecciones más avanzadas 😄
 
Vamos a ver.. ¿porque Java tiene tantas variables que se podrían combinar en una sola?

Me parece que la diferencia entre un byte, short, int o long, aparte de la cantidad de bits que tiene o almacena cada uno, es nula, ¿no?.

Quiero pensar que usas uno u otro dependiendo de la memoria que tenga el ordenador o la memoria que use el programa que estás haciendo pero, ¿no sería más sencillo que solo hubiese una variable de cada tipo y que fuese más o menos inteligente?.

Por lo que he aprendido en esta lección tienes que poner una L al final del número si declaras una variable long para que Java no de error así que bien podrían inventar una variable única en la que pusieses la letra al final del numero, ya sea entero o con decimal.

Igual hay una en lecciones más avanzadas 😄
Esta pregunta, no su respuesta, es el mayor quebradero de cabeza de "los de sistemas".
No es "contra" ti @Miguel_Angel , ni mucho menos. Pero de la misma manera que te enseñan que hay diferentes tipos de variables, deberían explicar el porqué.
 
Esta pregunta, no su respuesta, es el mayor quebradero de cabeza de "los de sistemas".
No es "contra" ti @Miguel_Angel , ni mucho menos. Pero de la misma manera que te enseñan que hay diferentes tipos de variables, deberían explicar el porqué.
Jajaja me encantaría escuchar los debates sobre esta pregunta.

De momento lo que me han explicado es lo siguiente, que está bastante claro:

byte - A byte is ideal for storing very small whole numbers, it has a size of 8 bits
short - A short is ideal for storing relatively small whole numbers, it has a size of 16 bits
int - An int is ideal for storing relatively large numbers, it has a size of 32 bits
long - A long is ideal for storing extremely large numbers, it has a size of 64 bits

float - A float is ideal for storing decimal / floating point numbers, it has a size of 32 bits.
By default, a literal decimal number in Java is treated as a double (which is larger than a float).
The compiler will not allow you to put a double into a variable of type float (it is too big), hence, we need to tell the compiler, to treat this literal value as a float by appending the F or f.
double - A double is ideal for storing extremely large decimal / floating point numbers

boolean - A boolean can only store a value of true or false, it has a size of 1 bit

char - A char can only store a single character, it has a size of 16 bits

String - A String is a data type that can be used to store a string of characters.
 
Lo primero es hablar con más propiedad. No es que Java tenga muchas variables. No son variables, son tipos básicos o primitivas del lenguaje. Todos los que has puesto en el mensaje anterior lo son excepto String que como bien indica es un tipo de dato. Fíjate que todos empiezan por minúscula excepto String que empieza por mayúscula.
 
Lo segundo es que todas esas primitivas existen por algún motivo. Es cierto que a simple vista te puede parecer que a lo mejor un double y un float parecen lo mismo, pero para que vas a usar un double de 64 bits para representar 3,14 cuando lo puedes hacer con un float que te ocupa la mitad. En un programa de prácticas da igual pero cuando escalas a aplicaciones complejas estas consumiendo recursos de la máquina sin necesidad.

Esas primitivas al fin y al cabo son los ladrillos que permiten edificar el resto de tipos de datos del lenguaje. Tu con el tiempo acabarás usando más tipos de datos y menos primitivas excepto las típicas para cosas puntuales, como un boolean, int o lo que sea.
 
De lo poco que recuerdo de mis clases de programación, que es muy poco, era algo así como dice Discord. Tratar de usar el tipo de variable más pequeña que sirva para tu propósito.
 
Última edición:
Vamos a ver.. ¿porque Java tiene tantas variables que se podrían combinar en una sola?
¿Por qué existen diferentes tipos de CPU cuándo podríamos tener todos un i7 tope de gama?
¿Por qué existen diferentes tipos de carretera cuándo podríamos tener todo autovías de 6 carriles?
¿Por qué existen diferentes tipos de motores y combustibles cuándo todos podrían ser iguales?

Las respuestas son siempre las mismas: coste. No "cuesta" lo mismo mover un byte que mover un long. No cuesta lo mismo mover un char que mover un string, o un stream. Ni cuesta lo mismo, en tamaño, ni en tiempo.

Este tipo de respuestas no las vas a conocer mediante el aprendizaje de un lenguaje de alto nivel, este tipo de cosas las entiendes muy bien cuando has programado en ensamblador o sabes cómo funciona una CPU en su sentido más básico (registros AX, BX, pila, conceptos FIFO, LIFO... etc).

Debido a que muchos programadores no tienen ni la más remota idea de estos temas ni se han peleado con algo así, ni se plantean porqué no es lo mismo hacer un bucle "for" de 0 a "n", que hacerlo decreciente de "n" a 0.
Son ese tipo de cosas las que marcan la diferencia entre que una aplicación corra bien y fluida en una máquina "x", o que necesite una mucho mayor para ir a la velocidad del anterior caso.
 
¿Por qué existen diferentes tipos de CPU cuándo podríamos tener todos un i7 tope de gama?
¿Por qué existen diferentes tipos de carretera cuándo podríamos tener todo autovías de 6 carriles?
¿Por qué existen diferentes tipos de motores y combustibles cuándo todos podrían ser iguales?

Las respuestas son siempre las mismas: coste. No "cuesta" lo mismo mover un byte que mover un long. No cuesta lo mismo mover un char que mover un string, o un stream. Ni cuesta lo mismo, en tamaño, ni en tiempo.

Este tipo de respuestas no las vas a conocer mediante el aprendizaje de un lenguaje de alto nivel, este tipo de cosas las entiendes muy bien cuando has programado en ensamblador o sabes cómo funciona una CPU en su sentido más básico (registros AX, BX, pila, conceptos FIFO, LIFO... etc).

Debido a que muchos programadores no tienen ni la más remota idea de estos temas ni se han peleado con algo así, ni se plantean porqué no es lo mismo hacer un bucle "for" de 0 a "n", que hacerlo decreciente de "n" a 0.
Son ese tipo de cosas las que marcan la diferencia entre que una aplicación corra bien y fluida en una máquina "x", o que necesite una mucho mayor para ir a la velocidad del anterior caso.
¡Gracias por la explicacion! 😊

Entiendo que Java tiene todas estas cosas por eficiencia e imagino que tambien porque es mas dificil que cometas un error si tienes que escribir exactamente lo que quieres.

Tambien, desde mi posicion de estudiante de dos dias pienso que igual que pones una L o una F al final de algunos de estos tipos basicos / primitivas pues ya que te inventas un lenguaje hazlo para que tengas solo un tipo basico y luego le añadas la letra al final para hacerlo mas intuitivo.

O ya que te lo estas inventando, que sea el propio programa el que reconozca lo que estas escribiendo! :P

Pues esa es una de las "cosas" que los programadores actuales parecen pasarse por le forro de los cojones
Quiero pensar que si eres un programador bueno querras que tu programa sea lo mas eficiente posible ¿no?

De lo poco que recuerdo de mis clases de programación, que es muy poco, era algo así como dice Discord. Tratar de usar el tipo de variable más pequeña que sirva para tu propósito.
Esto me lo apunto.
En mi trabajo aplico algo parecido, ilumino de la manera mas simple posible.
Si puedo iluminar con una luz, mejor que con dos.. y si puedo iluminar sin ninguna luz artificial mejor incluso.
 
Es que aquí no es un consejo, ha de hacerse así. No tiene importancia en un problema simple, pero es vital cuando vas hacia problemas mayores.

Un programador que no tenga eso claro va a poder hacer algunos tipos de trabajo, pero en otros va a fracasar. No todo se solventa poniendo más y más hardware, porque la relación entre HW y coste no es lineal.

Un ejemplo muy tonto. En una base de datos, un campo de tipo "cadena" le puedes especificar el largo máximo que puede tener (en caracteres) o indicarle que es "sin límite" (en realidad si que lo tiene, pero es enoooooorme).

La diferencia entre crear una base de datos con los campos del tamaño que necesitas o hacerlo con campos "sin límite" es capital a poco que esa base de datos vaya a tener cierto volumen. Con los índices pasa más o menos lo mismo.

En las variables, igual. Cuando llegues a la programación orientada a objetos, verás que no sabrás cuantos de ellos vas a necesitar crear, que es un sistema donde las cosas de crean según se necesitan, y que aquí los límites se alcanzan más rápido de lo que uno cree.
 
Tercer ejercicio que me ha traído por los cerros de la amargura.

Por alguna extraña razón la primera vez que he escrito el programa me ha dado unos cuantos errores al compilar.
Entre ellos uno que decía algo así como que byte no era un String y que "Float" no necesitaba comillas.

Así que he quitado las comillas de los tipos Float y aun así me seguía diciendo que byte no era un string.

Total, que he puesto el byte entre /* */ y de repente funcionaba todo.

Me he ido a dar una vuelta y cuando he llegado a casa me he sentado en el ordenador, he quitado los /* */, no ha funcionado y he dicho: "Hombre, ¡¡¡es que tengo el literal del "byte" entre comillas!!!", así que he quitado las comillas y tachan! Ha funcionado!!!!

Screenshot 2022-03-30 at 17.21.35.png
 
Tercer ejercicio que me ha traído por los cerros de la amargura.

Por alguna extraña razón la primera vez que he escrito el programa me ha dado unos cuantos errores al compilar.
Entre ellos uno que decía algo así como que byte no era un String y que "Float" no necesitaba comillas.

Así que he quitado las comillas de los tipos Float y aun así me seguía diciendo que byte no era un string.

Total, que he puesto el byte entre /* */ y de repente funcionaba todo.

Me he ido a dar una vuelta y cuando he llegado a casa me he sentado en el ordenador, he quitado los /* */, no ha funcionado y he dicho: "Hombre, ¡¡¡es que tengo el literal del "byte" entre comillas!!!", así que he quitado las comillas y tachan! Ha funcionado!!!!

Ver el archivo adjunto 36264
Te falta otra variable:

boolean isForero = true;
System.out.println ( "Juasjuasjuasjuas, no follas ni pagando, jajajajaja!!!");
 
Última edición:
Si lo comentas todo tampoco peta. :juas
Todos esos System.out.println se que se pueden poner en una sola linea.. ¡pero no me dejan todavia!.

Lo de comentar todas las cosas estaba en el ejercicio!!

@TheReeler ese boolean no compilaria! 🤣

La solución del profe de este ejercicio me parece muchísimo más limpia.

Eso sí, me pregunto si no es mejor poner los Output debajo de la variable para que todo el mundo sepa rápidamente que ese Output es de esa variable en vez de tener todas las variables juntas y luego todos los Output juntos.
Screenshot 2022-03-30 at 21.17.08.png
 
Última edición:
¿A quién se le ocurrió hacer los ++ y los --?

int id = 6;
int newId = ++id;

¿Porque la variable id es 7? Entiendo que newId sea 7 porque has incrementado el valor por 1 antes de poner la variable pero ¿porque ese preincrement afecta también a la variable id?

int id = 6;
int newId = id++; aquí el newId sería 6 + 1 también porque ya ha ejecutado la línea de código el programa, ¿no?

Por otro lado, el operador "%" es un poco cutre, ¿no? ¿lo usáis mucho los pros?

Screenshot 2022-04-04 at 13.26.45.png
 
Última edición:
Los operadores de incremento y decremento se usan mucho pero no se suelen usar de la forma que se aplica en el ejemplo, eso es solo para que veas como funciona la diferencia entre si es prefijo o posfijo.

El módulo es muy útil y se depende de lo que programes puedes acabar utilizándolo para cosas puntuales que te salvan la vida o nada.
 
Vamos a ver, en un tutorial que me han puesto hay algo que no entiendo @Discord Pie

public class IncrementDecrement1 {

public static void main(String[] args){

int x = 1;

int y = ++x + x++;

System.out.println("x: " + x + "y: " + y);
}
}


¿Porqué la variable x, que ya tiene un valor asignado igual a 1 se convierte en 3 por arte de magia cuando se usa el valor de x para asignarselo a y tras hacer las operaciones ++x + x++?, ¿las variables se modifican a cada linea de código a menos que pongas la abreviatura final?, si es así, ¡menudo lío! y si es así, ¿porqué la suma de ++x + x++ no es 5 si incrementamos el valor de x por 1 en ++x y nos da 2 + (2 incrementado otra vez por 1) que sería 3?
 
Vamos a ver, en un tutorial que me han puesto hay algo que no entiendo @Discord Pie

public class IncrementDecrement1 {

public static void main(String[] args){

int x = 1;

int y = ++x + x++;

System.out.println("x: " + x + "y: " + y);
}
}


¿Porqué la variable x, que ya tiene un valor asignado igual a 1 se convierte en 3 por arte de magia cuando se usa el valor de x para asignarselo a y tras hacer las operaciones ++x + x++?, ¿las variables se modifican a cada linea de código a menos que pongas la abreviatura final?, si es así, ¡menudo lío! y si es así, ¿porqué la suma de ++x + x++ no es 5 si incrementamos el valor de x por 1 en ++x y nos da 2 + (2 incrementado otra vez por 1) que sería 3?

Vamos por partes:

y = ++x + x++;

Vamos a dividir la operación:

y = (x = x + 1) + (x = x + 1)

Primero se harían las operaciones entre paréntesis.

Primero las de la izquierda luego las de la derecha.

La diferencia de la primera con la segunda es que en la primera al ser un operador de incremento prefijo primero se hace el incremento en memoria y luego se asigna el valor del mismo a x.

En la segunda primero guarda el valor original de x que es el que se va a devolver, y luego hace el incremento sobre este en memoria para finalmente asignar el valor del mismo a x.

Esta diferencia es importante entenderla a nivel de código máquina. Aquí tienes el código ensamblador para C en x86:


Yo te lo explico en cristiano si no lo entiendes.

Cuando compilas transformas el código que has escrito a un código que entiende la máquina en la que lo vas a ejecutar, el código máquina. Y vengo a hablar de esto porque para las instrucciones de incremento/decremento prefijo y posfijo no solo hay diferencias en el comportamiento de lo que devuelven sino que ademas hay un paso extra en el lenguaje maquina asociado a la del posfijo siendo la del prefijo más óptima. Esto es importante saberlo porque donde más se usan estas operaciones suele ser en bucles que se repiten muchas veces y si ahorras a la máquina una instrucción por cada bucle ahorras mucho cuando escalas.

Para los dos casos concretos de tu ejemplo cada operación funcionaría del siguiente modo. Ten en cuenta que el valor de la variable x está en una zona de memoria dedicada para ello, pero a la hora de trabajar con los valores el procesador trabaja con una copia de esta memoria en una memoria local mucho más rápida con la que opera la unidad aritmética lógica de la CPU que se llaman registros. Por eso primero hay que copiar la variable de la memoria al registro. (R = x) luego operar en los registros, y luego volver a copiar los resultados a memoria (x = R)

Si entiendes esto así jamás se te olvidará.


++x
primer paréntesis

R1 = x
(x en memoria vale 1 y eso se asigna al registro R1)

R1 = R1+1
(el valor del registro R1, 1, es autoincrementado en 1, o sea 2)

x = R1
(el valor del registro R1 se asigna al valor de x en memoria, o sea 2)
(ahora x vale 2)

finalmente el operador devuelve R1 o sea 2


x++
segundo paréntesis

R1 = x
(x en memoria vale 2 y eso se asigna al registro R1)

R2 = R1
(el valor del registro R1, 2, se asigna al registro R2)

R2 = R2+1
(el valor del registro R2, 2, es autoincrementado en 1, o sea 3)

x = R2 (3)
(el valor del registro R2, 3, se asigna al valor de x en memoria, o sea 3)
(ahora x vale 3)

finalmente el operador devuelve R1 o sea 2


Lo que quedaría y = 2 + 2 que sería 4 si no me equivoco…. 😅 si me equivoco en el resultado de “y” bueno pero la explicación de los prefijos y sufijos si es así. :hola
 
Última edición:
Arriba Pie