Unidad 1 Tipos de Datos Simples: Estructura de datos Son todos aquellos que abarcan una sola casilla de memoria como los , enteros, flotantes, etc. Estructurales: Arreglos de cadenas, pilas o estructuras, abarcan más de una casilla de memoria. TABLA COMUN DE TIPOS DE DATOS TIPO RANGO BYTES ENTEROS Entero −32,768 a 32,767 2 Entero sin signo 0 a 65,535 2 Corto −32,768 a 32,767 2 Corto sin signo 0 a 65,535 2 Largo entero −2,147,483,648 a 4 2,147,483,295 Largo sin signo 0 a 4,294,967,295 4 CARACTER Carácter −128 a 127 1 Carácter sin signo 0 a 255 1 DE PUNTO FLOTANTE Flotante 3.4−38 a 3.438 4 Doble 1.7−308 a 1.7308 8 Largo doble 3.4−4932 a 3.44932 10 No tienen .descomposición., están predefinidos en el lenguaje. Tipos compuestos: Aparte de los anteriores, C++ soporta tipos compuestos (también denominados tipos-clase). Son compuestos o agregados de tipos básicos, por esta razón se les denomina también tipos agregados o abstractos ADTs (.Abstract data types.). El .material. De que están compuestos son los tipos básicos, bien en estado .puro. O en sus diversas .adaptaciones.. El proceso es recursivo, de forma que un tipo complejo puede contener miembros que son a su vez tipos complejos y así sucesivamente. Desde el punto de vista semántico la gramática C++ establece como tipos compuestos (.Compound types.) Los siguientes: . Arreglos. Matrices de objetos de cualquier tipo. Funciones, que aceptan parámetros de ciertos tipos y devuelven void u objetos (o referencias a objetos) de cierto tipo. Punteros a-void; punteros a-objetos, o punteros a-función (incluyendo miembros estáticos de clases) de un tipo determinado. Punteros a miembros no-estáticos de clases (que señalan miembros de un tipo determinado dentro de objetos de una clase determinada). Referencias a objetos o funciones de un tipo determinado. Clases. Uniones. También existen tipos de datos definidos por el usuario que varían sus sintaxis según el lenguaje de programación. 1.1.1 Tipos de Datos simples Tipos de datos simples Es uno de los conceptos fundamentales de cualquier lenguaje de programación. Estos definen los métodos de almacenamiento disponibles para representar información, junto con la manera en que dicha información ha de ser interpretada. Para crear una variable (de un tipo simple) en memoria debe declararse indicando su tipo de variable y su identificador que la identificará de forma única. La sintaxis de declaración de variables es la siguiente: Tipo Simple Identificador1, Identificador2; Esta sentencia indica al compilador que reserve memoria para dos variables del tipo simple Tipo Simple con nombres Identificador1 e Identificador2.Los tipos de datos en Java pueden dividirse en dos categorías: simples y compuestos. Los simples son tipos nucleares que no se derivan de otros tipos, como los enteros, de coma flotante, booleanos y de carácter. Los tipos compuestos se basan en los tipos simples, e incluyen las cadenas, las matrices y tanto las clases como las interfaces, en general. Cada tipo de datos simple soporta un conjunto de literales que le pueden ser asignados, para darles valor. En este apartado se explican los tipos de datos simples (o primitivos) que presenta Java, así como los literales que soporta (sintaxis de los valores que se les puede asignar). a.) Tipos de datos enteros Se usan para representar números enteros con signo. Hay cuatro tipos: byte, short, int y long. Tipo Tamaño Byte 1Byte (8 bits) Short 2 Bytes (16 bits) Int 4 Bytes (32 bits) Long 8 Bytes (64 bits) Literales enteros Son básicos en la programación y presentan tres formatos: Decimal: Los literales decimales aparecen como números ordinarios sin ninguna notación especial. Hexadecimal: Los hexadecimales (base 16) aparecen con un 0x ó 0X inicial, notación similar a la utilizada en C y C++. Octal: Los octales aparecen con un 0 inicial delante de los dígitos. Por ejemplo, un literal entero para el número decimal 12 se representa en Java como 12 en decimal, como 0xC en hexadecimal, y como 014 en octal. Los literales enteros se almacenan por defecto en el tipo int, (4 bytes con signo), o si se trabaja con números muy grandes, con el tipo long, (8 bytes con signo), añadiendo una L ó l al final del número. La declaración de variables enteras es muy sencilla. Un ejemplo de ello sería: Long numeroLargo = 0xC; // Por defecto vale 12 b.) Tipos de datos en coma flotante Se usan para representar números con partes fraccionarias. Hay dos tipos de coma flotante: float y double. El primero reserva almacenamiento para un número de precisión simple de 4 bytes y el segundo lo hace para un numero de precisión doble de 8 bytes. Tipo Tamaño Float 4 Byte (32 bits) Double 8 Bytes (64 bits) Tabla 6: Tipos de datos numéricos en coma flotante Literales en coma flotante Representan números decimales con partes fraccionarias. Pueden representarse con notación estándar (563,84) o científica (5.6384e2). De forma predeterminada son del tipo double (8 bytes). Existe la opción de usar un tipo más corto (el tipo float de 4 bytes), especificándolo con una F ó f al final del número. La declaración de variables de coma flotante es muy similar a la de las variables enteras. Por ejemplo: Double miPi = 314.16e-2; // Aproximadamente Float temperatura = (float) 36.6; // Paciente sin fiebre Se realiza un moldeado a temperatura, porque todos los literales con decimales por defecto se consideran double. C.) Tipo de datos boolean Se usa para almacenar variables que presenten dos estados, que serán representados por los valores true y false. Representan valores bi-estado, provenientes del denominado álgebra de Boole. Literales Booleanos Java utiliza dos palabras clave para los estados: true (para verdadero) y false (para falso). Este tipo de literales es nuevo respecto a C/C++, lenguajes en los que el valor de falso se representaba por un 0 numérico, y verdadero cualquier número que no fuese el 0. Para declarar un dato del tipo booleano se utiliza la palabra reservada boolean: Boolean recibo Pagado = false; // ¡¿Aun no nos han pagado?! d.) Tipo de datos carácter Se usa para almacenar caracteres Unicode simples. Debido a que el conjunto de caracteres Unicode se compone de valores de 16 bits, el tipo de datos char se almacena en un entero sin signo de 16 bits. Literales carácter Representan un único carácter y aparecen dentro de un par de comillas simples. De forma similar que en C/C++. Los caracteres especiales (de control y no imprimibles) se representan con una barra invertida (=\‘) seguida del código carácter. Descripción Representación Valor Unicode Carácter Unicode \udddd Numero octal \ddd Barra invertida \u005C Continuación Retroceso \b \u0008 Retorno de carro \r \u000D Alimentación de formularios \f \u000C Tabulación horizontal \t \u0009 Línea nueva \n \u000A Comillas simples \‘ \u0027 Comillas dobles \. \u0022 Números arábigos ASCII 0–9 \u0030 a \u0039 Alfabeto ASCII en mayúsculas A.-Z \u0041 a \u005A Alfabeto ASCII en minúsculas a.-z \u0061 a \u007A Tabla 7: Caracteres especiales Java Las variables de tipo char se declaran de la siguiente forma: Char letraMayuscula = =A‘; // Observe la necesidad de las = = Char letraV = =\u0056'; // Letra =V‘ e.) Conversión de tipos de datos Es posible transformar el tipo de una variable u objeto en otro diferente al original con el que fue declarado. Este proceso se denomina .conversión., .moldeado. o .tipado.. La conversión se lleva a cabo colocando el tipo destino entre paréntesis, a la izquierda del valor que queremos convertir de la forma siguiente: Char c = (char) System.in.read (); La función read devuelve un valor int, que se convierte en un char debido a la conversión (char), y el valor resultante se almacena en la variable de tipo carácter c. El tamaño de los tipos que queremos convertir es muy importante. No todos los tipos se convertirán de forma segura. Por ejemplo, al convertir un long en un int, el compilador corta los 32 bits superiores del long (de 64 bits), de forma que encajen en los 32 bits del int, con lo que si contienen información útil, esta se perderá. Por ello se establece la norma de que .en las conversiones el tipo destino siempre debe ser igual o mayor que el tipo fuente: Tipo Origen Tipo Destino Byte Double, float, long, int, char, short Short Double, float, long, int Char Double, float, long, int Int Double, float, long Long Double, float Float Double 1.1.1.1 DEFINICIÓN DE BIT, BYTE, CARÁCTER Y PALABRA Bit: es una síntesis de dos términos en inglés: Binary digit, que en español significan dígito binario, o lo que es lo mismo, número (dígito) con dos posibles valores (binario). El término surge de usar las dos primeras letras de Binary con la última de digito.: bit. Es la unidad de información más sencilla posible en el sistema binario. Byte: Unidad de información que consta de 8 bits equivalente a un único caracter, como una letra, número o signo de puntuación. Caracter: Es un elemento tomado de un conjunto de símbolos. Un ejemplo de un conjunto de símbolos es {0,1,2,3,4,5,6,7,8,9,A,B,C….Y,z,¡,-,+,*} en el cual se incluyen dígitos, los caracteres del alfabeto y algunos caracteres especiales. Un compilador de lenguaje reconoce un conjunto particular de caracteres. Palabra: Conjunto de bits que, como unidad elemental, puede manipular una computadora. La longitud en bits de una palabra en una computadora puede ser de 8, 16, 32, etc., y depende del microprocesador de su unidad central de proceso. 1.1.1.2 Manipulación de bits Esta puede almacenar de acuerdo a la forma en que se estén especificando a continuación daré algunos ejemplos donde se aplican: & conjuncion | DISYUNCIONDISYUNCION EXCLUSIVA ¬ NEGACION (COMPLEMENTO A 1) >> DESPLAZAMIENTO DE BITS A LA DERECHA << DESPLAZAMIENTO DE BITS A LA IZQUIERDA ROR ROTACION A LA DERECHA ROL ROTACION A LA IZQUIERDA C-2 COMPLEMENTO A 2 NOTA: ESTOS SE APLICAN A TIPOS DE DATOS ENTEROS EN EL LENGUAJE 1.1.1.3 Representación de datos simples Los principales utilizados en la computadora son: texto, números imágenes y audio. Texto: Una pieza de texto en cualquier idioma, es una secuencia de símbolos usados para representar una idea en ese idioma. Por Ejemplo: Una computadora ocupa una secuencia de bits para ejecutar las instrucciones de un programa. Para representar cualquier símbolo se puede utilizar un patrón de bits. Dicho de otra forma la palabra byte esta formada por 4 símbolos en los que cada patrón define un solo símbolo. Carácter B Y T E Código ASCII 100010 1011001 1010100 1000101 Decimal 66 89 84 69 7bits carácter 1 bit=0.1 2bit =4 (00, 01, 10, 11) 4 bit =8 5 bit=16 6 bit=32 7 bit=128 Código ASCII El Instituto Nacional Norteamericano de Estándares, desarrollo un código llamado ―código norteamericano de estándares para intercambios de información‖ (ASCII), este código utiliza 7 bits para cada símbolo lo que significa 128 caracteres distintos son los que corresponden a este código. Números Los números se representan utilizando el sistema binario, los números se pueden representar dentro de la computadora clasificándolos de acuerdo a sus características como por ejemplo si son positivos, negativos o si utilizan decimales. En la actualidad la representación de uso más común es el complemento a dos porque permite manejar la memoria de una computadora de manera más eficiente. En la actualidad la representaron del uso mas común es el complemento a dos porque permite manejar la memoria de una computadora de manera más eficiente. Imágenes Se representa mediante dos métodos gráficos de mapa de bits y grafico vertical. Mapa de bits: En este método una imagen se divide en una matriz de pixeles (elemento de imagen) en donde cada píxel es un pequeño punto, el tamaño del píxel depende de la resolución. P/E 00011000 00011000 01111110 01111110 00011000 00011000 0 blanco 1 negro Para representar imágenes a color cada píxel se descompone en tres colores primarios (RGB) Red, Green, Blue, luego se mide la intensidad de cada color y se le suma un patrón de bits. En otras palabras cada píxel tiene tres patrones de bits: • Uno para la intensidad de rojo • Uno para el verde y el azul. COLOR R G B Rojo 11111111 00000000 00000000 Verde 00000000 11111111 00000000 Azul 00000000 00000000 11111111 Convertidores de código binario en línea: http://www.eztigma.tk/juegos/binary.php http://nickciske.com/tools/binary.php Imágenes grafico vertical El problema de grafico de mapa de bits es que los patrones de bits exactos para representar una imagen deben guardarse en la computadora, posteriormente si desea cambiar el tamaño de la imagen debe debes cambiar el tamaño de los pixeles los cuales crean una apariencia difusa y granulada. No obstante el grafico vertical no guarda patrones de bits, una imagen se descompone en una combinación de curvas y líneas. Audio Aunque no hay un estándar para descargar un contenido de música la idea es convertir el audio a datos digitales y usar patrones de bits. El audio por naturaleza es información análoga (continua). DIGITAL ANALOGOS VIDEO Es una representación de imágenes cuadros o frames y sonido en el tiempo; una película es una serie de cuadros desplegados unos tras otros para crear la ilusión de movimiento. Así que almacena de igual manera que una imagen y un sonido en la computadora. Pixeles: 123 1.1.2 Tipos de datos abstractos En la historia de la ciencia de la computación los programadores han tenido que lidiar durante mucho tiempo con el problema de la complejidad , y a fin de entender lo que son las técnicas orientadas a objetos encontramos diferentes mecanismos para controlarla y a la cabeza de ellos encontramos a la abstracción esto es, la capacidad para encapsular y aislar la información de diseño y ejecución, esto es las técnicas orientadas a objetos son el producto de una progresión que va desde los procedimientos, a los módulos, los tipos de datos abstractos y los objetos. Un tipo de datos abstracto es aquel definido por el programador que puede ser manipulado de una manera similar a los definidos por el sistema. Al igual que estos últimos, un tipo de dato abstracto corresponde a un conjunto (tal vez tamaño infinito) ..00.. HECTORINN..00.. De valores lícitos y de un numero de operaciones primitivas que pueden ejecutarse sobre ellos. El usuario puede crear variables con valores que fluctúen dentro del conjunto aceptado y actuar sobre dichos valores por medio de las operaciones definidas. Por ejemplo si tomamos como ejemplo una pila y la definimos como n tipo de dato abstracto y las operaciones como las únicas validas para ejecutar con ejemplares de la pila. Para construir un tipo de dato abstracto, debemos ser capaces de: • Exportar una definición de tipo • Proporcionar un conjunto de operaciones que pueden usarse para manipular los ejemplares del tipo. • Proteger los datos asociados con el tipo de tal manera que se pueda operar con ellos solo mediante la operación provista. • Crear múltiples ejemplares del tipo. La abstracción es la acción de separar mentalmente o bien la Representación de las características esenciales de algo sin incluir antecedentes o detalles irrelevantes, se le llama así por que la abstracción debe de encapsular todas las propiedades esenciales de algo, en términos de programación esto quiere decir que los objetos deben abstraer tanto los datos como los procesos. L a idea básica es que un objeto esta definido por una lista de atributos abstractos (con frecuencia, divididos en variables de instancia y variables de clase, tales como tamaño, posición el color, los procedimientos. Un tipo abstracto de datos es una abstracción, que describe un conjunto de objetos en términos de una estructura de datos encapsulada u oculta y las operaciones sobre esta estructura. Lo tipos de datos abstractos, al contrario de los tipos de datos primitivos, pueden ser definidos por el usuario al construir una aplicación, en lugar de ser construidos por el diseñador del lenguaje subyacente. En las clases de programación los ADT incluyen métodos por ejemplo un ADT que represente longitudes expresadas en unidades inglesas incluirá métodos para sumar pies y pulgadas. El encapsulamiento, o su equivalente, el ocultamiento de información, se refiere a la practica de incluir dentro de un objeto todo lo que necesita, y de hacerlo, además, de tal manera que ningún objeto necesite conocer nunca su estructura interna. 1.2 Estructura de datos 1.2.1 Definición En programación, una estructura de datos es una forma de organizar un conjunto de datos elementales (un dato elemental es la mínima información que se tiene en el sistema) con el objetivo de facilitar la manipulación de estos datos como un todo o individualmente. Una estructura de datos define la organización e interrelaciona miento de estos, y un conjunto de operaciones que se pueden realizar sobre él. Las operaciones básicas son: Alta, adicionar un nuevo valor a la estructura. Baja, borrar un valor de la estructura. Búsqueda, encontrar un determinado valor en la estructura para realizar una operación con este valor, en forma SECUENCIAL o BINARIO (siempre y cuando los datos estén ordenados)… Otras operaciones que se pueden realizar son: Ordenamiento, de los elementos pertenecientes a la estructura. Apareo, dadas dos estructuras originar una nueva ordenada y que contenga a las apareadas. Cada estructura ofrece ventajas y desventajas en relación a la simplicidad y eficiencia para la realización de cada operación. De esta forma, la elección de la estructura de datos apropiada para cada problema depende de factores como la frecuencia y el orden en que se realiza cada operación sobre los datos. 1.2.2 CLASIFICACIÓN DE ESTRUCTURAS DE DATOS: Una estructura de datos es una clase de datos que se puede caracterizar por su organización y operaciones definidas sobre ella. Algunas veces a estas estructuras se les llama tipos de datos. Y en ellas encontramos las siguientes: ESTRUCTURAS LÓGICAS DE DATOS: En un programa, cada variable pertenece a alguna estructura de datos explícita o implícitamente definida, la cual determina el conjunto de operaciones validas para ella. Las estructuras de datos que se discuten aquí son estructuras de datos lógicas. Cada estructura de datos lógica puede tener varias representaciones físicas diferentes para sus almacenamientos posibles. ESTRUCTURAS PRIMITIVAS Y SIMPLES: Son primitivas aquellas que no están compuestas por otras estructuras de datos por ejemplo, enteros, booleanos y caracteres. Otras estructuras de datos se pueden construir de una o mas primitivas. Las estructuras de datos simples que consideramos se construyen a partir de estructuras primitivas y son: cadenas, arreglos y registros. A estas estructuras de datos las respaldan muchos lenguajes de programación. ESTRUCTURAS LINEALES Y NO LINEALES: Las estructuras de datos simples se pueden combinar de varias maneras para formar estructuras mas complejas. Las dos cases principales de estructuras de datos son las lineales y las no lineales, dependiendo de la complejidad de las relaciones lógicas que representan. Las estructuras de datos lineales incluyen pilas, colas y listas ligadas lineales. Las estructuras de datos no lineales incluyen grafos y árboles. arreglos1 1.2.2.1 Lineales y no Lineales Estructura de datos lineales: arreglos, listas enlazadas, pilas y colas. Comprender, definir y utilizar os conceptos de las estructuras lineales – arreglos unidimensionales, bidimensionales y arreglos paralelos. Conocer y utilizar las operaciones mas usuales con arreglos unidimensionales y bidimensionales. Manejar los términos punteros y arreglos de punteros. Definir una lista enlazada y conocer y hacer uso de las operaciones mas comunes Definir y diferenciar las estructuras de datos TAD pilas y colas. Utilizar cada una de estas estructuras en la codificación de un algoritmo, utilizando el lenguaje de programación C++. Arreglos: Es un conjunto de datos o una estructura de datos homogéneos que se encuentran ubicados en forma consecutiva en la memoria RAM (sirve para almacenar datos en forma temporal).Un arreglo puede definirse como un grupo o una colección finita, homogénea y ordenada de elementos. Los arreglos pueden ser de los siguientes tipos: • De una dimensión. • De dos dimensiones. • De tres o más dimensiones. Listas enlazadas. Simples. Dobles. Circulares Multilistas Clases para la implementación de Listas Pilas. Una pila (stack en inglés) es una lista ordinal o estructura de datos en la que el modo de acceso a sus elementos es de tipo LIFO (del inglés Last In First Out, último en entrar, primero en salir) que permite almacenar y recuperar datos. Se aplica en multitud de ocasiones en informática debido a su simplicidad y ordenación implícita en la propia estructura. Colas. Una cola es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la operación de inserción push se realiza por un extremo y la operación de extracción pop por el otro. También se le llama estructura FIFO (del inglés First In First Out), debido a que el primer elemento en entrar será también el primero en salir. Estructura de datos no lineales: árboles y grafos. Diferenciar entre las estructuras árboles y grafos. Conocer la representación en memoria de un árbol y de un grafo. Árboles. • Árboles binarios. • Árboles de expresión. • Construcción de árbol binario. • Recorrido de un árbol. • Aplicación de árboles binarios. • Árbol binario y de búsqueda. • Opresiones con árboles binarios de búsqueda. Grafos. Un grafo (específicamente, grafo simple no dirigido) es un par G D .V; E/ D .V .G/; V .E//, donde V es un conjunto finito no vacío de elementos llamados vértices y E es un conjunto de pares desordenados de elementos distintos de V llamados aristas. Es decir, una arista e 2 E tiene la forma fu; vg, donde u; v 2 V y u 6D v. La terminología en teoría de grafos varía muchísimo: prácticamente no hay dos textos que adopten la misma. En particular, los vértices de un grafo también reciben a veces el nombre de nodos, y las aristas arcos, ejes o líneas. 1.2.2.2 Dinámicas y Estáticas Datos estáticos: su tamaño y forma es constante durante la ejecución de un programa y por tanto se determinan en tiempo de compilación. El ejemplo típico son los arrays. Tienen el problema de que hay que dimensionar la estructura de antemano, lo que puede conllevar desperdicio o falta de memoria. Datos dinámicos: su tamaño y forma es variable (o puede serlo) a lo largo de un programa, por lo que se crean y destruyen en tiempo de ejecución. Esto permite dimensionar la estructura de datos de una forma precisa: se va asignando memoria en tiempo de ejecución según se va necesitando.