oct-07 1
Fundamentos de Programación
Tema 3:
Tipos de Datos Primitivos
Dpto. de Ingeniería de Sistemas Telemáticos http://www.lab.dit.upm.es/~fprg/
oct-07 2
Elementos de un lenguaje
Un sublenguaje para definir los datos (álgebra)
representación de la información
qué datos tenemos
cómo los llamamos
cómo son (estructura)
qué se puede hacer con ellos
Un sublenguaje para definir los algoritmos
qué le hacemos a los datos
en qué orden (cuándo se lo hacemos)
cuántas veces
oct-07 3
Datos
Tipos
álgebra
definen el rango (dominio) y las operaciones
Valores
Representación del rango
Variables
Continentes de valores
de un cierto tipo
oct-07 4
Valores Enteros
Números enteros
decimales: 53, 2300, -7, 0
hexadecimales: 0x35
octales: 065
no son enteros válidos:
12,34
45.67
13E5
Valores Reales
Números reales (punto flotante)
notación decimal y científica
5. -0.78 0.00000034 123.0
-23.4E8 123.E-34
no son válidos
.58
4,76
56.3F14
Valores Caracteres y Cadenas
Caracteres
´a´ ´Ñ´ ´?´
Cadenas de caracteres (strings)
”Hola a todos” -> Hola a todos
”esto es una cadena” -> esto es una cadena
”dijo ´Adios´ y se fué” -> dijo ’Adios’ y se fué
”qué \”raro\” es esto” -> qué ”raro” es esto
oct-07 7
Valores Lógicos (booleanos)
Sólo dos valores: {true, false}
En minúsculas
Se usan en operaciones de comparación y lógicas
oct-07 8
Enumerados
Definición de conjuntos por extensión
Nombre y Rango
Calificación є { Suspenso , Aprobado , Bien , Notable , Sobresaliente }
DiaSemana є { Lunes , Martes , Miércoles , Jueves , Viernes , Sábado , Domingo };
oct-07 9
Tipos Simples y Objetos
En Java se distingue entre:
Tipos simples o primitivos: números, caracteres,
predefinidos en el lenguaje: sintaxis especial
Objetos
definibles por el programador
disponibles en la API de Java
arrays (matrices, vectores, ¡arreglos!)
manejo similar a los objetos
pero con sintaxis especial
oct-07 10
Tipos enteros
Formado por valores enteros
Varios rangos (n bits [0..2
n-1] ó [-2
n-1.. 2
n-1-1])
En los programas, sus valores se escriben en decimal, hexadecimal u octal
byte 8 bits [-128..127]
short 16 bits [-32768..+32767]
int 32 bits [-2147483658..+2147483647]
long 64 bits [-9223372036854775808..
+9223372036854775807]
Operaciones sobre enteros
Predefinidas en el lenguaje Java
- menos unario
* producto
/ división ¡enteros! 4/2 = 2 pero 4/3 = 1
% módulo (resto para valores positivos)
i % j = i - (i / j) * j
signo(i % j) = signo (i)
+ suma
- resta
Operaciones sobre enteros
Disponibles en el API de Java (Math)
Math.abs(x) valor absoluto
Math.sqrt(x) raíz cuadrada
Math.pow(x,y) x elevado a y
oct-07 13
Expresiones ariméticas
1 - 2 * 3 + 4
(1 - 2) * (3 + 4)
10 / 3 / 2
Se evalúan los paréntesis
por orden de precedencia
1º: - unario
2º: * / %
3º: + - binario
de izquierda a derecha
oct-07 14
Tipos reales (¡flotantes!)
Formado por valores reales
rango: [menor .. mayor]
mantisa y exponente
precisión: número de cifras significativas
float 32 bits -3.4029234E+38..+3.4029234E+38 6 cifras significativas
double 64 bits -1.79769313486231570E+308 ..
+1.79769313486231570E+308 15 cifras significativas
oct-07 15
Operaciones sobre reales
Predefinidas por el lenguaje JAVA
- menos unario
* producto
/ división
+ suma
- resta
oct-07 16
Operaciones sobre reales
Disponibles en el API de JAVA (Math)
Math.abs(x) valor absoluto
Math.ceil(x) redondeo entero superior
Math.floor(x) redondeo entero inferior
Math.cos(x) coseno
Math.tan(x) tangente
Math.sqrt(x) raiz cuadrada
Math.exp(x) ex
Math.pow(x, y) potenciación xy
Math.log(x) logaritmo neperiano
...
Tipo booleano
Se usan en operaciones de comparación y lógicas
o representan condiciones
[true,false]
Operaciones sobre booleanos
Predefinidos por el lenguaje JAVA
&& AND con cortocircuito
|| OR con cortocircuito
^ XOR (OR exclusivo)
! NOT (negación)
& AND lógico (sin cortocircuito)
| OR lógico (sin cortocircuito)
oct-07 19
Operaciones sobre booleanos
A && B : si A entonces B si no, false
Si A es false, B no se evalúa
A || B : si A entonces true si no, B
Si A es true, B no se evalúa
oct-07 20
Operadores Relacionales
Predefinidos por el lenguaje Java
== igualdad
!= distinto
< menor que
<= menor o igual
> mayor
>= mayor o igual
ATENCIÓN: prioridad operadores relacionales menor que ningún otro operador
bisiesto = (año % 4 == 0) & (año % 100 != 0)
| (año % 400 == 0);
oct-07 21
Tipo carácter
Se llama char
Ocupa 16 bits
Estándar UNICODE 2.0, que incluye ASCII
admite ISO-latin-1, cirílico, kanji, ...
Valores de \u0000 .. \uFFFF
Más cómodo: ´a´, ´J´, ´ñ´ , …
Especiales: ´\n´ ´\t´ ´\r´ ´\\´ ´\´´
ordenados ´A´ < ´B´ < ....;´a´ < ´b´ < ...;
´0´ < ´1´... < ´9´
oct-07 22
Operaciones sobre caracteres
Predefinidos los relacionales (==, <, …)
Resto, en el API de Java
IsLowerCase(c) true si c es letra y minúscula, falso en caso contrario
IsUpperCase(c) true si c es letra y mayúscula
toLowerCase(c) Si c es letra mayúscula, devuelve la minúscula correspondiente, si no, devuelve c
toUpperCase (c) Si c es letra minúscula, devuelve la mayúscula correspondiente, si no, devuelve c
Enumerados
En java:
enum Calificacion {SUSPENSO, APROBADO, BIEN, NOTABLE, SOBRESALIENTE};
enum TurnoDeClase { MAÑANA, TARDE };
Enum DiaSemana {LUNES, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO, DOMINGO};
Uso Enumerados
boolean NoHayClase=
dia == DiaSemana.SABADO
|| dia == DiaSemana.DOMINGO;
oct-07 25
Conversiones
Las operaciones determinan el tipo a devolver a partir de los operandos
4 / 3 -> 1 (int, int) -> int
a veces, no es el resultado deseado
Conversión de tipos:
Implícita (definida en el lenguaje)
Explícita (casting o promoción), forzada por el programador
oct-07 26
Promoción
(nombre de tipo) expresión
Convierten el valor de la expresión a un valor del tipo entre paréntesis
(char)98 -> devuelve ´b´
(int)10.0 -> devuelve el entero 10
(double)10 -> devuelve el double 10.0
Los valores se pueden ver alterados
oct-07 27
Conversiones implícitas
5.0 / 4 -> 1.25
El 4 se convierte “automáticamente” en 4.0 para poder dividir
La promoción tiene mayor prioridad
(float) 5 / 4 -> 1.25 (formato float)
El 5 se convierte por la promoción forzada a 5.0, el 4 se convierte “automáticamente”
oct-07 28
Conversiones implícitas
Sólo aplica a tipos primitivos
De tipos “pequeños” a “grandes”:
byte a short, int, long, float, o double
short a int, long, float o double
char a int, long, float, o double (¡OJO!)
int a long, float o double
long a float o double
float a double
¡Se puede perder información!
En el paso de long a float o double
En el paso de int a float
Convertir cadenas en otros valores
Típicamente, desde línea de comandos
double base= Double.valueOf(args[0]).doubleValue();int x= Integer.valueOf(args[1]).IntValue();
Otra forma:
int precio= Integer.parseInt(args[1]);
Si no se puede convertir, se lanzará una excepción:
el programa termina abruptamente
Atributos
Una variable almacena un valor
se define (declaración)
se crean
se cargan con un valor inicial (datos de entrada)
su valor se modifica (algoritmo)
llegan a un valor final (resultado)
oct-07 31
Definición de atributos
Se elige un nombre (identificador)
Se antepone el tipo adecuado
int n;
char respuesta;
double base, altura, superficie;
oct-07 32
Identificadores
Identificador: nombre de un elemento del programa:
variables, constantes, clases, métodos, etc.
Reglas:
secuencia de caracteres (letras, dígitos, ´$´ y ´_´)
longitud ilimitada
no pueden comenzar por número
mayúsculas != minúsculas
dos identificadores son iguales si coinciden todos sus caracteres
oct-07 33
Identificadores
Válidos:
x, base, hola, respuesta, díaDelMes, saldo_cliente, a1x, eje3, año, _preparado, $saldoCliente
No válidos:
1x, no#valido, día del mes
No se pueden usar como identificadores las palabras reservadas del lenguaje:
public, static, class, goto, for,...
oct-07 34
Identificadores
Deben asegurar la legibilidad
significativos
x * y ; // multiplica dos números
base * altura; // calcula superficie
• ¡pero es el mismo código!
legibles, sin abreviaturas ni contracciones
sinónimos cortos
combinar mayúsculas y minúsculas
añadir comentario al final de la línea para aclarar
int base; // base del triángulo
Carga de atributos
Se pone el nombre de la variable, el signo ´=´ y una expresión del mismo tipo
int x, y;
x = 2 * 8;
y = 7.5 / 3; // ERROR: tipos distintos!
y = (int)Math.sqrt(x); // correcto!
x = y * 3; // recarga la variable x, se olvida el viejo valor
Carga inicial
En Java, al declarar una variable de un tipo primitivo, toma un valor inicial por defecto:
números enteros: 0
números reales: 0.0
booleanos: false;
caracteres: \u0000 // carácter nulo
referencias: null
oct-07 37
Carga en la declaración
Se puede asignar un valor inicial en la declaración de variables
int m = 7;
double x = 10.0, y = 3 * 5;
float p = m / 10.0, q = 2 * p;
La expresión ha de poderse resolver (todos los valores conocidos)
oct-07 38
Constantes
Se pueden declarar atributos con un valor inmutable.
final int maximo= 100;
final float velocidadLuz= 300000.0;
Error:
final int numAlumnos; // ¡fija el valor a 0!
numAlumnos= 540; // no se puede cambiar
El valor de las constantes se proporciona en la declaración
oct-07 39
Criterios de declaración de constantes
Declararla antes de usarla (obligatorio)
Declarar una constante para valores significativos
Elegir un nombre claro e inequívoco
Declararla en un solo lugar
para facilitar mantenimiento mediante cambio sistemático
no redefinir la misma constante en varios puntos
oct-07 40
Envoltorios
Clases especiales para “envolver” tipos simples
Boolean, Character, Integer, Long, Double, Float
No hay para Byte ni Short
Usados para
convertir a tipo String (imprimir)
leer de una cadena
utilleria
MIN_VALUE, MAX_VALUE para números