Prof. Ing. Octavio César Escobar Jaramillo [email protected]
1 /6
ALGORITMOS Y ESTRUCTURAS DE DATOS FUNDAMENTALES
La importancia de las computadoras radica fundamentalmente en su capacidad para procesar información. Esta característica les permite realizar actividades que antes solo realizaban los humanos.Con el propósito de que la inforación sea procesada, se reqioere que ésta se almacene en la memoria de la computadora. De acuerdo con la forma en que los datos se organizan, se clasifican en:
Tipos de datos simples. Tipos de datos estructurados.
La principal característica de los tipos de datos simples consiste en que ocupan sólo una casilla de memoria; por lo tanto, una variable simple hace referencia a un único valor a la vez. En este grupo de datos se encuentran por ejemplo: números enteros, números reales, caracteres, y booleanos.
Por otra parte, los tipos de datos estructurados se caracterizan por el hecho de que con un nombre – identificador de la variable estructurada- se hace referencia a un grupo de casillas de memoria. Es decir, un tipo de dato estructurado tiene varios componentes. Cada uno de estos puede ser un tipo de dato simple o estructurado. Sin embargo, los componentes básicos, los del nivel más bajo, de cualquier tipo de datos estructurado son siempre tipos de datos simples.
El estudio de las estructuras de datos constituye una de las principales actividades para llegar al desarrollo de grandes sistemas de software. Las estructuras de datos básicos que son útiles para la mayorái de lengüajes de progamación son: arreglos y registros.
Arreglos en programación C
Con frecuencia se presentan en la práctica problemas cuya solución no resulta fácil –a veces imposible- si se utilizan tipos de datos simples.
Para ilustrar esta dificultad observemos el siguiente problema:
Consideremos que en una universidad se conocen las calificaciones de un grupo de alumnos. Se necesita saber cuántos de éstos tienen una calificación superior al promedio del grupo. ¿Cómo resolver este problema?
Solución con tipos de datos simples: Doble lectura
{ Este algoritmo resuelve el problema realizando dos veces la lectura de datos} {I y CONT son variables de tipo entero. AC, PROM y C son variables de tipo real}
1. Hacer AC ç0 e I ç1 2. Mientras (I <= 50 ) Repetir
Escribir “Ingrese la calificación”, I Leer C
2 /6 3. {Fin del ciclo del paso 2}
4. Hacer PROM çAC/50
{Como se necesita indicar cuántos alumnos obtuvieron calificación superior al promedio se releerán las 50 calificaciones para comparar cada una con el promedio calculado en el paso 4}
Hacer CONT ç0 e I ç1 5. Mientras (I <= 50 ) Repetir
Escribir “Ingrese la calificación”, I Leer C
5.1 SI C > PROM entonces Hacer CONT çCONT + 1 5.2 {Fin del condicional del paso 5.1} Hacer I çI + 1
6. {Fin del ciclo del paso 5} 7. Escribir CONT
Problema a esta solución:
1. Se tiene que realizar doble lectura de las calificaciones. 2. Puede haber diferenciaentre la primera y segunda lectura
Los tipos de datos estructurados que ayudan a resolver problemas como éste son lso arreglos. Un arreglo unidimendional se define como una colección finita, homogénea y ordenada de elementos.
Finita: Todo arreglo tiene un límite; es decir, se debe determinar cuál será el número máximo de elementos que formarán parte del arreglo.
Homogénea: Todos los elementos de un arreglo son del mismo tipo.
Ordenada: Se puede determinar cuáles son el primero, el segundo, el tercero,… y el enésimo elemento. Los arreglos son una colección de variables del mismo tipo que se referencian utilizando un nombre común. Un arreglo consta de posiciones de memoria contigua. La dirección más baja corresponde al primer elemento y la más alta al último. Un arreglo puede tener una o varias dimensiones. Para acceder a un elemento en particular de un arreglo se usa un índice.
El formato para declarar un arreglo unidimensional es: tipo nombre_arr [ tamaño ]
Por ejemplo, para declarar un arreglo de enteros llamado listanum con diez elementos se hace de la siguiente forma:
int listanum[10];
En C, todos los arreglos usan cero como índice para el primer elemento. Por tanto, el ejemplo anterior declara un arreglo de enteros con diez elementos desde listanum[0] hasta listanum[9].
La forma como pueden ser accesados los elementos de un arreglo, es de la siguiente forma: listanum[2] = 15; /* Asigna 15 al 3er elemento del arreglo listanum*/
Prof. Ing. Octavio César Escobar Jaramillo [email protected]
3 /6
El lenguaje C no realiza comprobación de contornos en los arreglos. En el caso de que sobrepase el final durante una operación de asignación, entonces se asignarán valores a otra variable o a un trozo del código, esto es, si se dimensiona un arreglo de tamaño N, se puede referenciar el arreglo por encima de N sin provocar ningún mensaje de error en tiempo de compilación o ejecución, incluso aunque probablemente se provoque el fallo del programa. Como programador se es responsable de asegurar que todos los arreglos sean lo suficientemente grandes para guardar lo que pondrá en ellos el programa. C permite arreglos con más de una dimensión , el formato general es:
tipo nombre_arr [ tam1 ][ tam2 ] ... [ tamN];
Por ejemplo un arreglo de enteros bidimensionales se escribirá como: int tabladenums[50][50];
Observar que para declarar cada dimensión lleva sus propios paréntesis cuadrados.
Para acceder los elementos se procede de forma similar al ejemplo del arreglo unidimensional, esto es, tabladenums[2][3] = 15; /* Asigna 15 al elemento de la 3ª fila y la 4ª columna*/
num = tabladenums[25][16];
A continuación se muestra un ejemplo que asigna al primer elemento de un arreglo bidimensional cero, al siguiente 1, y así sucesivamente.
main() {
int t,i,num[3][4]; for(t=0; t<3; ++t) for(i=0; i<4; ++i) num[t][i]=(t*4)+i*1; for(t=0; t<3; ++t) {
for(i=0; i<4; ++i)
printf("num[%d][%d]=%d ", t,i,num[t][i]); printf("\n");
} }
En C se permite la inicialización de arreglos, debiendo seguir el siguiente formato: tipo nombre_arr[ tam1 ][ tam2 ] ... [ tamN] = {lista-valores};
Por ejemplo:
int i[10] = {1,2,3,4,5,6,7,8,9,10};
4 /6
Manejo de estructuras en programación C
Al contrario que los arrays, las estructuras nos permiten agrupar varios datos, que mantengan algún tipo de relación, aunque sean de distinto tipo, permitiendo manipularlos todos juntos, usando un mismo identificador, o cada uno por separado.
Las estructuras son llamadas también muy a menudo registros, o en inglés records. Tienen muchos aspectos en común con los registros usados en bases de datos. Y siguiendo la misma analogía, cada objeto de una estructura se denomina a menudo campo, o field.
Sintaxis:
struct [<identificador>] {
[<tipo> <nombre_objeto>[,<nombre_objeto>,...]]; } [<objeto_estructura>[,<objeto_estructura>,...];
El identificador de la estructura es un nombre opcional para referirse a la estructura.
Los objetos de estructura son objetos declarados del tipo de la estructura, y su inclusión también es opcional. Sin bien, aún siendo ambos opcionales, al menos uno de estos elementos debe existir. En el interior de una estructura, entre las llaves, se pueden definir todos los elementos que consideremos necesarios, del mismo modo que se declaran los objetos.
Las estructuras pueden referenciarse completas, usando su nombre y también se puede acceder a los elementos definidos en el interior de la estructura, usando el operador de selección (.), un punto.
Una vez definida una estructura, es decir, si hemos especificado un nombre para ella, se puede usar igual que cualquier otro tipo de C++. Esto significa que se pueden declarar más objetos del tipo de estructura en cualquier parte del programa. Para ello usaremos la forma normal de declaración de objetos, es decir:
[struct] <identificador> <objeto_estructura> [,<objeto_estructura>...];
En C++ la palabra struct es opcional en la declaración de objetos, al contrario de lo que sucede en C, en el que es obligatorio usarla.
Ejemplo: struct Persona { char Nombre[65]; char Direccion[65]; int AnioNacimiento; } Fulanito;
Prof. Ing. Octavio César Escobar Jaramillo [email protected]
5 /6 Resultado de la ejecución del programa aterior:
dame matricula :4928635 dame nombre :Luis Daniel Perez dame edad :10
MATRICULA =4928635 NOMBRE =Luis Daniel Perez MESES =120
6 /6