Sunteți pe pagina 1din 77

Java

JAVA PROGRAMMING III


Clase 2
DATOS Y VARIABLES

•  Un dato es un valor acerca de algo.


•  Las variables son elementos que almacenan datos.
•  Todo dato, según su naturaleza, pertenece a un tipo.
•  Una variable es siempre de algún tipo que determina
los valores que puede asumir.
TIPOS DE DATOS

•  En Java tenemos:
ü  Tipos de datos primitivos
ü Elemento de valor indivisible
ü Numéricos
ü Lógicos
ü Caracteres
ü  Clases
ü Objetos
ü Desde la perspectiva de los datos, un objeto es un
tipo de dato compuesto.
ü Aunque conceptualmente es mucho más que
un conjunto de datos.
TIPOS DE DATOS

•  Una variable puede ser


ü  De un tipo de dato primitivo
ü  De un tipo de Clase

•  Son dos “grandes tipos”


¿Y qué es lo que nos importa de esto?
TIPOS DE DATOS

•  Una variable de un tipo de dato primitivo


ü  Almacena en su contenido valores que representa el
dato.
ü Se llaman Variables de Valor.

int entero = 123; 123

entero

boolean logico = true; true

logico
TIPOS DE DATOS

•  Una variable de un tipo de Clase


ü  Almacena en su contenido un valor que es una
referencia a un objeto de dicha clase.
ü Se llaman Variables de referencias.

Scanner obj = new Scanner (...);

obj
Instancia de clase Scanner
LAS SENTENCIAS

•  Equivalen a las oraciones del lenguaje natural


ü  Solo que son para que las entienda el compilador JAVA
ü  En vez de terminar con punto, cada sentencia termina
con un punto y coma.
•  Representa un paso a seguir de los que conformarían
el programa.
ü  Cada sentencia es una unidad de código ejecutable
LAS SENTENCIAS

Existen cuatro categorías de sentencias:

Declaración

Secuencia o Expresión

Selección / Condicional
Estructuras de
Control de Flujo
Iteración
LAS SENTENCIAS

•  Las sentencias de expresión, selección e iteración se


encuentran exclusivamente dentro de un método ó
bloque
ü  Especifican la secuencia de pasos o algoritmos.

•  Las sentencias de declaración sirven a propósitos más


generales y están en cualquier lugar del programa
LA DECLARACION

•  Sirve para declarar los elementos que vamos a utilizar a


lo largo del programa.
ü  Según que elemento este declarando y como lo haga, voy a
tener que definirlo.
ü  Definir implica dar detalles de que estoy declarando.

•  Existen varios tipos, según que elemento declare, entre


ellos:
ü  Declaración de Variables. Se pueden definir en la declaración.
ü  Declaración de Clases. Se deben definir con su declaración.
ü  Declaración de Métodos. Se pueden definir en la declaración.
LA DECLARACION

A. De Variables
Son las sentencias en las cuales declaro una variable y a modo
optativo puedo definir su valor (inicializarla)

<TIPO> <IDENTIFICADOR VARIABLE> = <EXPR>;

LA SECUENCIA

•  Son una operación directa a realizar por la


máquina virtual de java
ü  Se llaman de expresión porque expresan cosas.
ü  Y también de secuencia porque se ejecutan una tras
a otra en un orden secuencial.
•  Existen cinco tipos:
ü Expresiones de Asignación
ü Expresiones de Incremento o Decremento
ü Expresiones de invocación a métodos.
ü Expresiones Creación de objetos
ü Expresiones Nulas “;”
SECUENCIA: ASIGNACION

•  Estuvimos utilizándolas sin llamarlas con ese nombre.


Son aquellas que emplean el operador de asignación,
vinculando a la izquierda un identificador y a la derecha
un expresión.
<IDENTIFICADOR VAR> = <EXPR>;

•  Ejemplos:
ü  num = 5; // num tendrá un valor igual a 5
ü  num = num * 6; // num se le asignara el valor resultante de
multiplicar el valor contenido en num (5) por 6.
ü  miBici = new Bicicleta (); // le estoy asignando una referencia al
objeto que estoy construyendo con el operador new.
•  Una sentencia de asignación no es una igualdad
matemática.
SECUENCIA: INC O DEC

•  El operador (++) incrementa en una unidad la variable


(numérica o carácter) a la que se aplica, mientras que (--) la
reduce en una unidad.

<IDENTIFICADOR VAR>++;
<IDENTIFICADOR VAR>--;
++<IDENTIFICADOR VAR>;
--<IDENTIFICADOR VAR>;

•  Ejemplos:
ü  //Asumieno que num vale 5
ü  num++; // num valdrá 6
ü  num--; // num volverá a valer 5.
ü  --num; // num valdrá 4
ü  ++num; // num valdrá 5.
SECUENCIA: INVOCACION

C. De invocación a métodos
Son las que invocan a un método de un objeto o clase.

<IDENTIFICADOR VAR>.<IDENTIFICADOR MÉTODO>( <ARGUMENTOS>);

•  Ejemplos:
ü  System.out.println("Hola gente!!!");
ü  scanner.nextInt();

•  Si no hay argumentos, igual deben ir los paréntesis de


apertura y cierre.
SECUENCIA: CONSTRUCCION

•  Consisten en construir objetos utilizando el operador new y


retornan una referencia.

new <TIPO DE CLASE> (<ARGUMENTOS>);

Ejemplo:
•  new Scanner (System.in);
SENTENCIAS DE CONTROL DE FLUJO

•  Guían el flujo de ejecución


ü  Las sentencias de control son la esencia de cualquier
lenguaje de programación, ya que gobiernan el flujo de
ejecución del programa.
•  Estas se usan exclusivamente dentro de los métodos.
SENTENCIAS CONDICIONALES

•  Las utilizamos cuando debemos tomar una decisión que


determine si se deben ejecutar una o varias sentencias
ü  Son quienes nos permiten bifurcar a distintos lados del
programa según que condiciones se presenten.
SELECCIÓN SIMPLE

•  Sirve para decidir si se ejecuta un conjunto de sentencias u otro en


base a una condición. Responden a la idea de “Si tal condición
entonces hago esto” adicionalmente se puede agregar un “sino”
para ejecutar acciones si no se cumple la condición.

if (<CONDICION>) // Los paréntesis deben encerrar la condición


{
<Sentencias que se ejecutan si se da la condición>
}
else
{
<Sentencias que se ejecutan si NO se la condición>
}
SELECCIÓN SIMPLE

if (<CONDICION1>)
{
<Sentencias que se ejecutan si se da la condición1> }
else if (<CONDICION2>)
{
<Sentencias que se ejecutan si se da la condición1> }
else if (<CONDICION3>)
{
<Sentencias que se ejecutan si se da la condición1> }
else
{
<Sentencias que se ejecutan si no se da ninguna de las condiciones
anteriores>
}
SELECCIÓN MULTIPLE
•  Esta sentencia, llamada “switch”, nos permite controlar el flujo
cuando se tiene que ejecutar un conjunto de sentencias en base al
valor que retorne una expresión.
•  Los valores de retorno tienen que ser del tipo byte, short, char, int y
tipos enumerados.
•  La sentencia switch evalúa su expresión y ejecuta el caso
apropiado.
Switch (<EXPRESION>)
{
case <VALOR1>:
<Sentencias>;
break;
case <VALOR2>
<Sentencias>;
break;
case <VALORN>:
<Sentencias>;
break;
default:
<Sentencias>;
break;
}
SELECCIÓN MULTIPLE

1. Cada case se corresponde con un único valor.


No se pueden establecer rangos o condiciones
sino que se debe comparar con valores
concretos.
2. Los valores no comprendidos en ningún case
se pueden gestionar en default, que es
opcional.
3. En ausencia de break, cuando se ejecuta una
sentencia case se ejecutan también todas las
case que van a continuación, hasta que se
llega a un break o hasta que se termina el
switch.
LA ITERACION

•  Para repetir un sentencia o conjunto de sentencias


(bloque)
ü  Al conjunto de sentencias que están dentro de la
iteración se las llama Ciclo o Bucle.
•  Cuando decimos que iteramos a través de los ciclos
nos referimos a que estamos ejecutando las sentencias
internas.
ü  Una iteración es equivalente a una ejecución del ciclo o
bucle.
ITERACION FOR

•  La sentencia “For”, proporciona una forma


compacta de hacer una recorrida sobre un
conjunto de valores en determinado orden.
•  Se utiliza para realizar iteraciones de las cuales
sabemos de antemano cuantos ciclos vamos a
realizar.
•  Se utiliza generalmente para poner todo el
código de un contador en una sola instrucción.
ITERACION FOR

•  Sintaxis:

for (<INICIO>; <COND>;<INCREMENTO>)
{
<Sentencias>
}

•  Ejemplos:

for (int i = 0;i < 5;i++)


{
System.out.println(“Efectúo la iteración número “ + i);
}

for (int i = 10;i > 0;i--) // decremento desde 10 hasta 0.


{
System.out.println(“Imprimo números positivos desde “
+ i);
}
ITERACION WHILE

•  La sentencia while (“mientras”) se utiliza para repetir un


conjunto de acciones que se deben realizar mientras se
cumpla una condición.
•  Las sentencias que están en el ciclo tienden a convertir en
falsa la condición de iteración puesto que sino nunca saldría
de este ciclo y se ejecutaría por siempre.
•  Ejemplo:
int i = 0;
while (i < 10) //condición
{
System.out.println(“Efectúo la iteración
número “ + i);
i++; // incremento el valor de la variable i
y tiendo a hacer falsa la condición.
}
ITERACION DO WHILE

•  La sentencia do-While tiene un uso muy similar al while, la


única diferencia es que se evalúa la condición al terminar una
iteración y no antes de comenzar como lo hace el “while”.
ü  Siempre se ejecuta al menos una vez
•  Ejemplo:

int i = 0;
do
{
System.out.println(“Efectúo la iteración número “
+ i);
i++; // incremento el valor de la variable i y
tiendo a falsificar la condición.
}
while (i < 10)
FOR Y WHILE

•  El while y el for pueden ser


intercambiados con facilidad, podemos verlo
con el siguiente ejemplo:

int i = 0 for (int i = 0;i <


while (i < 10) 10;i++)
{ {
// acciones // acciones
i++; }
}
COMPARACION DE CICLOS

While Do while For


Cuando no sabemos Cuando no sabemos Cuando sí sabemos
Uso el número de el número de el número de
iteraciones iteraciones iteraciones
Número de
0 o más veces 1 o más veces 0 o más veces
ejecuciones
Cuando la condición
Mostrar un menú,
de terminación no
mostrar mensajes Contar números,
es numérica, por
de error mientras el recorrer estructuras
Aplicación ejemplo, una función
usuario no de datos (veremos
boolean, también
seleccione una esto más adelante)
es útil para lectura
opción válida
de archivos
Frecuencia de uso Frecuente Poco frecuente Muy frecuente
LOS BLOQUES

•  Una sentencia compuesta o bloque es un conjunto de


sentencias encerrada entre llaves "{}".
•  Sintácticamente, un bloque se considera como una
única sentencia.
ü  Una unidad de código ejecutable
•  De ahora en más una sentencia se puede considerar
tanto como un bloque como una sentencia única.
AMBITOS Y BLOQUES

•  Cada vez que aparece un nuevo bloque se tabula a la


derecha.
ü  En la definición de un clase
ü  En la definición de un método
ü  El bloque interno de una estructura de control
ü Así es como los bloques internos de un if, else, switch,
while, do while y for definen un ámbito.
•  Cada bloque define un ámbito
ü  Al que pueden pertenecer las variables
AMBITOS Y ALCANCES

•  La declaración de una variable se realiza dentro de un


ámbito y en base a esto se determina donde se la
puede usar.
ü  Si dicho ámbito corresponde al cuerpo un método se
llaman variables locales.
ü Son variables temporales que solo se pueden utilizar
dentro del método
ü Se puede declarar en cualquier parte dentro del bloque
ü Solo se pueden acceder en las sentencias
posteriores y no anteriores.
•  De forma general el alcance de un identificador (sea
variable, clase, etc) es la parte del programa en donde
se puede usar dicho identificador.
•  Para las variables locales el alcance coincide con su
ámbito.
ALCANCE DE UN IDENTIFICADOR
AMBITOS Y ALCANCES

•  Recordar que:
ü  Por variables locales nos referimos a:
ü Parámetros en el encabezado + variables declaradas
en el cuerpo
ü Los parámetros no pueden ser redeclarados como
variables dentro del cuerpo del método.
LA NOMENCLATURA

•  Idéntica a la utilizada en el pseudo Código


•  Estilos tipográficos
ü  lowerCamelCase
ü Variables, Métodos
ü  UpperCamelCase
ü Clases, interfases y enumerados.
ü  UPPER_CASE
ü Constantes
•  Todas las palabras reservadas van en minúscula.
•  Indentación
ü  Las sentencias pertenecientes a un método se tabulan a
la derecha
ü  Todas las sentencias que están dentro de una estructura
de control se tabulan a la derecha
HACIA NUEVOS TIPOS

•  Hasta ahora trabajamos almacenando un dato en una


variable
ü  1 dato = 1 Variable
•  ¿Si tengo varios datos, tengo que declarar siempre
varias variables?
ü  Si el problema requiere que recordemos los datos
ingresados, entonces sí.
HACIA NUEVOS TIPOS

•  ¿Que pasa si quiero procesar 10, 100 o 10000


datos del mismo tipo?
ü  Por ejemplo, caudal de lluvia por día, gasto por mes,
nota por alumno, etc.
•  ¿Voy a declarar las 10000 variables?.
•  ¿Existe una forma más cómoda?
ü  Sí, una variable puede guardar muchos datos.
•  Todos los tipos que manejan conjuntos de datos
se llaman estructuras de datos.
LOS ARREGLOS

•  La primer estructura de datos que veremos se llama


arreglo o formación.
ü  Un arreglo es un conjunto de elementos homogéneos
(del mismo tipo) ubicados adyacentemente (uno
después de otro)
ü  La cantidad de elementos que contiene es un número
fijo que se determina cuando se construye el arreglo.
LOS ARREGLOS
•  Los arreglos son muy útiles en la programación ya que nos
permiten acceder a grandes cantidades de datos de manera
sencilla y rápida sin gastar mucha memoria.
•  Su principal desventaja es que una vez que se no se puede
cambiar su tamaño una vez construido.
Se enumeran desde 0

0 1 2 3 4 5 6 7 Indices

Arreglo de 8 elementos

Elemento ubicado
en el índice 2
LOS ARREGLOS

<TIPO>[] <IDENTIFICADOR VAR>;

•  La forma de declarar arreglos es similar a declarar variables


solo que agregamos algo nuevo: “[]”.
ü  Si en la declaración de la variable se incluyen corchetes quiere
decir que esta variable es un arreglo.

•  Ejemplos:

int[] arregloEnteros;
boolean[] arregloBooleanos;
double[] arregloDoubles;

•  Esto es la declaración de la variable que contendrá una


referencia a un arreglo.
ü  Pero todavía no lo construimos, solo lo declaramos y no
reservamos memoria para almacenar los elementos.
CONSTRUCCION DE ARREGLOS

<IDENTIFICADOR VAR> = new <TIPO>[<EXPR>];

•  Es muy importante que el tipo base que contiene la


declaración la variable corresponda con el tipo base del
arreglo que se esta construyendo, sino habrá un error de
incompatibilidad.
DECLARACION + DEFINICION

int[] arregloEnteros = new int[8];


Arreglo de 8 enteros
boolean[] arregloBooleanos = new
boolean[50];
ü  Arreglo de 50 booleanos

•  Si conocemos de antemano qué valores


contiene, podemos hacer lo siguiente:

double[] arregloDobles = {2,3.28733,5.20};


ü  En arregloDobles se almacena una referencia a un arreglo de
4 elementos dobles.
int[] arregloEnteros = {1};
ü  En arregloEnteros se almacena una referencia a un arreglo de
1 elementos entero.
ACCESO AL CONTENIDO

<IDENTIFICADOR VAR>[<EXPR>]

•  Recordar que los elementos se numeran desde 0 en adelante.

•  Ejemplos:
arregloEnteros[0] = 10; // al primer elemento
del arreglo le asigno un 10

arregloEnteros[1] = 10 + arregloEnteros[0]; //
al segundo elemento le asigno 10 más el valor
del primer elemento (10)

arregloEnteros[6 + 1] = 35; // al último


elemento (7) le asigno 35
LOS ARREGLOS

•  Cada arreglo de un tipo base, independientemente de la


longitud, define una clase.
int[] arreglo = new int[8];

Instancia de una clase Arreglo de tipo base int

0 1 2 3 4 5 6 7

Variable de
Referencia
8
arreglo
lenght
LOS ARREGLOS

•  Los arreglos de enteros son una clase


•  Los arreglos de booleans son otra clase
•  Los arreglos de bytes son otra clase
•  Los arreglos de doubles son otra clase
•  Los arreglos de String son otra clase
•  ¿Puedo tener arreglos de Scanner?
ü  Obvio que sí.
ü No tiene mucho sentido…, pero se puede.
ATRIBUTOS DE LOS ARREGLOS

•  Longitud
ü  Contiene el valor que equivale a la cantidad de
elementos de arreglo.
ü No se puede modificar
ü  Es un atributo de un objeto arreglo.
ü  Se puede acceder a dicho atributo a través de la variable
que tiene una referencia a una instancia concreta.

<IDENTIFICADOR VAR>.length

int[] arregloEnteros = new int[8];


int longitud = arregloEnteros.length; //
longitud valdrá 8
ARREGLOS E ITERACIONES
•  Los arreglos son “amigos” de las sentencias de iteración
•  Las iteraciones sirven para recorrer los elementos de un arreglo
con mayor flexibilidad.
public class DemoArregloFor
{
public static void main(String[] args)
{
int[] miArreglo; // declaro variable que referencia al arreglo
miArreglo = new int[10]; // creo el objeto arreglo de enteros
int i = 0;
for (i = 0;i < miArreglo.length;i++)
{
// con el contador recorro los elementos asignadole valor
miArreglo[i] = 100 * i;
}
for (i = 0;i < miArreglo.length;i++)
{
// con el contador recorro los elementos
System.out.println("Elemento en indice: " + i + miArreglo[i]);
}
}
}
USO DE LOS ARREGLOS

•  El principal uso de los arreglos es guardar una colección


de información.
•  Por ejemplo, todos los pedidos de una tienda, todos los
nombres de los clientes, todos los productos que se
venden.
•  Java utiliza arreglos para implementar la clase String
ü  En algunos lenguajes (como C) no existe un tipo String y
se utilizan arreglos de char para representar texto.
EJERCITANDO ARREGLOS

•  Realiza una aplicación Java sencilla en la cual


ü  Crees un arreglo llamado “notas” que tenga 5
números enteros que representen calificaciones de
alumno
ü Declaremos una variable llamada “notas” de tipo arreglo de
enteros
ü Construyamos un arreglo de 5 elementos y guardemos su
referencia en la variable de ese tipo.
ü Insertemos 5 valores que representen calificaciones
ü Utilicemos los índices
ü  Sumemos las 5 notas
ü  Obtengamos el promedio
LAS MATRICES

•  Una matriz es otra estructura de datos que agrupa arreglos.


ü  Manipula conjuntos de conjuntos.

Columnas

0 1 2 3 4 5 6 7
0

3
Filas

7
LAS MATRICES

•  Declaración
<tipo> <nombre>[][];

•  Construcción
<nombre> = new <tipo>[FILAS][COLS];

•  Acceso
<nombre>[FILA][COL]
ITERANDO EN LAS MATRICES

int mat[][] = new int[5][3];


for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 3; j++)
{
mat[i][j] = 1;
System.out.println ("Elemento " + i + " , " +
j + " vale " + mat[i][j]);
}
}
LA REALIDAD DE LAS MATRICES

•  Cada matriz de un tipo base,


independientemente de la longitud en términos
de filas y/o columnas, define una clase.
int[] matriz = new int[2][4];
Instancia de una clase Matriz de un Tipo Base int

Variable de
Referencia

matriz
LAS MATRICES

•  Se puede considerar a una matriz como un


arreglo cuyos elementos tienen referencias a
otros arreglos cuyos elementos tienen datos.

0 1 2 3 4 5 6 7
0

0 1 2 3 4 5 6 7
1

0 1 2 3 4 5 6 7
2
LAS MATRICES

int mat[][] = new int[5][3];


int arr[];
for (int i = 0; i < mat.length; i++)
{
arr = mat[i];
for (int j = 0; j < arr.length; j++)
{
arr[j] = i + j;
System.out.println ("Elemento " + i + " , " + j + "
vale " + arr[j]);
}
}
•  Una matriz es un arreglo de arreglos
•  Cada elemento de una fila es una referencia a un
arreglo
LAS MATRICES

•  Podría crear una matriz de la siguiente forma


int mat[][] = new int[3]
mat[0] = new int[8]
mat[1] = new int[5]
mat[2] = new int[6]
CASOS UTILES DE LAS MATRICES

•  Registro de cantidad de accidentes ocurridos


por días según meses.
ü  Los meses son las filas, y los días son las columnas.
ü El elemento en cuestión almacena la cantidad de accidentes.
•  Tabla que indica las calificaciones para los
alumnos de un curso
ü  Los cursos son las filas, el alumno se corresponde a
con una columna
ü El elemento en cuestión almacena la calificación.
ARREGLOS TRIDIMENSIONALES

•  No se suelen usar mucho


•  Pero pueden servir para casos en donde se
manejen muchos datos:
ü  Registro de cantidad de accidentes ocurridos por
días según meses según años.
ü Los año son matrices, los meses son las filas, y los días son
las columnas.
ü El elemento en cuestión almacena la cantidad de accidentes.

•  Solo los mencionamos, en la práctica suelen


utilizarse otras estructuras de datos.
EXTENDIENDO LOS TIPOS

•  Cuando comenzamos a trabajar disponemos de


un conjunto de tipos básicos.
•  ¿Qué ocurre si quiero crear mi propio tipo para
almacenar datos más complejos?
ü  Voy a tener que definirlos
•  Se pueden definir nuevos tipos de datos para
agrupar conceptualmente a un conjunto de
datos.
ü  Tal es el caso de los arreglos
ü  Esto es muy útil si quiero poner en un solo lugar
datos que representen una entidad o algo de interés
LOS DATOS TRADICIONALES

•  En el paradigma estructurado o modular (PEM) tenemos


los siguientes tipos de datos:
ü  Escalares
ü Un dato es representado por un valor indivisible.
ü  Compuestos (o Estructurados)
ü Un dato es representado por la combinación de
varios valores.
ü Homogéneos
ü Heterogéneos
LOS DATOS EN POO

•  En la filosofía del POO tenemos:


ü  Los tipos de datos primitivos
ü Elemento de valor indivisible
ü  Clases
ü Objetos
•  En java la única forma de agrupar datos en un mismo lugar
consiste en definir una nueva clase cuyos objetos contengan
tales datos.
ü  Recordemos que un objeto por definición tiene un conjunto de
datos que se conocen como atributos.
ü  Los objetos, desde esta perspectiva, funcionan como
contenedores de datos, o sea, como una estructura de datos.
•  De esta forma se diseñan clases cuyos objetos corresponden
a estructuras de datos o a entidades de la vida real.
ALGO MAS SOBRE LOS ARREGLOS

•  Los arreglos que usamos son objetos cuyos


atributos son: los elementos del arreglo y la
longitud.
•  Estos objetos pertenecen a una clase.
•  Por eso decimos que los arreglos se
implementan como clases.
ü  La definición conceptual : Clase (Los arreglos)
ü  La entidad concreta : Objeto (Él arreglo cuya
referencia se almacena en una clase)
ALGUNAS PRIMERAS CONCLUSIONES

•  Se puede considerar a la variable de tipo primitivo como


la “primera estructura de datos”
ü  Almacena solo un dato
•  Las estructuras de datos se implementan como clases
•  Las clases pueden conceptualizar:
ü  Entidades
–  Reales
–  Abstractas
ü  Estructuras de datos
•  Siendo los objetos: instancias concretas de dichos
conceptos.
PRECEDENCIA Y ASOCIACION

Tabla de Precedencia de operadores


Operadores Precedencia
Postfijos var++ var--

Unarios ++var --var +expr -expr ~ !


Multiplicativos * / %
Aditivos + -
Corrimientos Bits << >> >>>
De relación < > <= >= instanceof
De igualdad == !=
Bitwise AND &
Bitwise exclusive OR ^
Bitwise inclusive OR |
Lógico Y &&
Lógico O ||
Ternario ? :

Asignación = += -= *= /= %= &= ^= |= <<= >>= >>>=

•  Ej: 5*2 + 5 equivale a (5*2) + 5


ü  Puesto que el “*” tiene mayor precedencia que el “+”.
PRECEDENCIA Y ASOCIACION

•  ¿Que pasa cuando aparecen dos operadores con el mismo


nivel de precedencia compartiendo un mismo operando?
•  2 / 1 * 2
ü  ¿A que equivale?
ü (2 / 1) * 2 = 4
ü 2 / (1 * 2) = 1
•  Una regla debe gobernar qué se evalúa primero.
ü  La asociatividad de los operadores determina el orden de
evaluación.
•  Los operadores binarios son asociativos de izquierda a
derecha
ü Esto significa que el operando compartido siempre lo toma el
operador de la izquierda.
ü Iremos asociando (poniendo paréntesis) y evaluando los
operadores de izquierda a derecha.
PRECEDENCIA Y ASOCIACION

•  Puede ser conveniente inicializar en una misma


línea a muchas variables con un mismo valor.

int a, b, c;
a = b = c = 0; // Asigna las tres variables con
valor igual 0.

•  Los operadores de asignación son asociativos


de derecha a izquierda.
PRECEDENCIA Y ASOCIACION

•  Para resumir, debemos recodar que la precedencia y


asociatividad de los operadores determinan el orden
en que se van evaluando los operandos.
•  Los operadores de asignación
ü  Se asocian de derecha a izquierda
•  El resto de los operadores binarios
ü  Se asocian de izquierda a derecha
PRECEDENCIA Y ASOCIACION
•  Dentro de una operación este es el orden en que se
evalúan los operandos de un operador binario.
ü  Para operadores de asignación: Solo se evalúa el
operando derecho.
ü  El resultado se le asigna al operando izquierdo
ü  Para el resto de los operadores binarios: primero se
evalúa el operando izquierdo y luego el derecho.
ü  Y el operador los combina para generar un único
resultado
CONVERSIONES DE TIPOS

•  ¿Qué pasa cuando queremos asignar un tipo de dato a


otro tipo de dato distinto?
int i = 0.5;
double d = 2;
char c = 29;
i = ‘a’;
•  ¿Qué pasa cuando escribimos expresiones numéricas
en las que no todos los operandos son del mismo tipo?
int a = i + d

•  Nos referimos a la conversión de tipos que suele recibir


el nombre de Casting o a veces, influido por la lengua
castellana, casteo.
CONVERSIONES DE TIPOS

•  La conversión o casting se puede hacer entre tipos


de datos que guarden una cierta compatibilidad, es
decir, que tengan una misma naturaleza.
•  A veces esta conversión es:
ü  Automática : Conversión Implícita
ü  Manual: Conversión Explicita
ü Requiere que manualmente especifiquemos la
transformación
CONVERSIONES DE TIPOS PRIMITIVOS

•  Sabemos que existen diversas formas de almacenar


números, en variables de tipo int, byte, short, long, float,
double.
•  Cada tipo define un diferente formato bajo el cual se
guarda el dato.
CONVERSIONES IMPLICITAS

•  La conversión de un tipo con menos bits a un tipo con más


bits es implícita, ya que el tipo mayor puede almacenar
sin perdida de precisión el número de menos bits.

int i = 200;
float f = i; // hay una conversión implícita
double d = f; // hay otra conversión
implícita
CONVERSIONES EXPLICITAS
•  La conversión de un tipo con más bits a un tipo de
menos bits es explícita y nos vemos obligamos a
especificar el casteo.
ü  De esta forma el compilador nos advierte que seamos
conscientes de que se puede estar perdiendo información.

float f = 200;
int i = f; // esto no compila, debo corregirlo
int i = (int) f; // ahora compila, hago una
conversión explicita
i = (int) 20.4 // i almacena 20
i = (int) 20.9 // i almacena 20 (no hay un buen
redondeo)

•  La conversión explicita se realiza poniendo entre


paréntesis el tipo de dato seguido de la expresión
que quiero convertir.
CONVERSIONES DE NUMEROS Y CHAR

•  Cada carácter se almacena como una serie de


bits.
ü  Dicha serie consiste de 16 bits.
ü  Los bits se pueden interpretar además como un
número
ü  De esta forma cada carácter tiene un código
numérico.
•  Se puede trabajar con números y caracteres
realizando conversiones y equivalencias entre
ellos.
CONVERSIONES DE NUMEROS Y CHAR

•  A una variable de tipo de dato carácter podemos


asignarle expresiones que retornen un valor numérico
ü  Entendiendo que se le asignará el carácter que tiene
dicho código numérico.
•  De forma inversa a una variable de tipo numérico le
podemos asignar un carácter
ü  Entendiendo que se le asignará el código numérico del
carácter.
CONVERSIONES DE NUMEROS Y CHAR

char c;
int i;
i = ‘a’ // (1) en i queda 97
i = (int) ‘a’; // (2) en i queda 97, es lo mismo que (1)
c = 97; // (3) en c queda ‘a’. Le asigno el carácter cuyo
código es 97
c = (char) 97; // (4) en c queda ‘a’, es lo mismo que (3).
c = i; // (5) No se puede. Debo convertir explícitamente.
c = (char) i; // (6) en c queda ‘a’. Convierto a carácter.
c = ‘a’+1; // (7) en c queda ‘b’. Es un caso “raro” pero se
permite.
c = (int) ‘a’+1; // (8) en c queda ‘b’. Es lo mismo que (7)
c = (char) (i+2); // (9) en queda ‘c’. (char) (97+2)
OPERADOR TERNARIO ?:

•  Presentaremos un nuevo operador que puede ser útil.

•  <condición> ? <expr1> : <expr2>

•  Si la condición es cierta se evalúa la expr1 sino la expr2.


ü  Es un “atajo” a la sentencia if-else
ü  Se usa para ocasiones en donde se tiene que
asignar a una variable valores según una condición.

•  boolean esBisiesto = false;


•  int dias = esBisiesto ? 29 : 28;

•  int cofactor = (dias < 28) ? 1 : 2;

S-ar putea să vă placă și