Presentación de la Materia: Programa de Estudios Horar io Lunes 08:30 10:30 Material: Apuntes ftp://ftp.paginasprodigy.com Usuario; tmx9714074 Contraseña: 11466 Softwa re: Java C++ Visual Basic 6 Visual Basic 2005 Bibliografía: Manuales del Lenguaje Evaluaciones 1 Parcial 28 de Septiembre 2 Parcial 4 de Octubre 3 Parcial 14 de Diciembre Portafolio de Evidencias Apuntes Tareas Investigacio nes Practicas o ejercicios resueltos Mauricio Ramos Davila 1
Unidad 1 Tipos de Datos Simples: Estructura de datos Son todos aquellos que abarcan una sola casilla de memoria como los boleanos, 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 E N T E R O S 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 2,147,483,295 4 Largo sin signo 0 a 4,294,967,295 4 C A R A C T E R Caracter 128 a 127 1 Caracter sin signo 0 a 255 1 DE PUNTO FLOTANTE Flotante 3.4 38 a 3.4 38 4 Doble 1.7 308 a 1.7 308 8 Mauricio Ramos Davila 2
Largo doble 3.4 4932 a 3.4 4932 10 Primitiv os: 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 Mauricio Ramos Davila 3
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ñ Mauricio Ramos Davila 4
o byt e 1Byte (8 bits) sho rt 2 Bytes (16 bits) Mauricio Ramos Davila 5
in t 4 Bytes (32 bits) lon g 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 Mauricio Ramos Davila 6
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 flo at 4 Byte (32 bits) Mauricio Ramos Davila 7
doub le 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 Mauricio Ramos Davila 8
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 recibopagado = false; // Aun no nos han pagado?! Mauricio Ramos Davila 9
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 Representac ión Valor Unicode Caracter Unicode \udddd Numero octal \ddd Barra invertida \u005c Continua ción Retroceso \b \u0008 Retorno de carro Mauricio Ramos Davila 10
\r INSTITUTO TECNOLOGICO EL LLANO \u000d Alimentación de formularios \f Mauricio Ramos Davila 11
\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 Mauricio Ramos Davila 12
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á. Mauricio Ramos Davila 13
Por ello se establece la norma de que en las conversiones el tipo destino siempre debe ser igual o mayor que el tipo fuente : Mauricio Ramos Davila 14
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, flotat flota 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 digit.: 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 Mauricio Ramos Davila 15
un conjunto particular de caracteres. 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. Mauricio Ramos Davila 16
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 interrelacionamiento de estos, y un conjunto de operaciones que se pueden realizar sobre él. Las operaciones básicas son: Mauricio Ramos Davila 17
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: Mauricio Ramos Davila 18
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 Mauricio Ramos Davila 19
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. 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++. Arregl os: 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. Mauricio Ramos Davila 20
Mauricio Ramos Davila 21
Listas enlazadas. Simples. Dobles. Mauricio Ramos Davila 22
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 Mauricio Ramos Davila 23
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. Cola s. 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. Mauricio Ramos Davila 24
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. Mauricio Ramos Davila 25 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. Mauricio Ramos Davila 26