Está en la página 1de 13

APUNTES TIC TEMA 4

Con este tema se pretende abrir dos puertas importantes en programación.


Por un lado, completar el estudio de las distintas estructuras de control
utilizadas para encaminar la ejecución de nuestros programas hacia las
instrucciones adecuadas en cada momento, todo ello desde la perspectiva
del pseudocódigo. Por otro lado, realizar una primera aplicación de lo
aprendido en pseudocódigo a un lenguaje de programación, en concreto
PHP, un lenguaje que permite realizar scripts destinado sobre todo a
conseguir páginas web dinámicas.

Las estructuras condicionales son aquellas que permiten tener dos o


más alternativas en el flujo de ejecución de los programas,
proporcionando al programador la herramienta adecuada para conseguir
que los algoritmos puedan ejecutar ciertos pasos en lugar de otros.
Estructuras repetitivas o bucles
Estas estructuras de control son las que permiten ejecutar una serie de
instrucciones de forma repetitiva. Reciben el nombre de estructuras
repetitivas, estructuras iterativas o bucles.

En el uso de las estructuras repetitivas es muy común cometer el error de


crear un bucle infinito

3.1 Bucle "MIENTRAS"


La instrucción "Mientras" evaluará una condición, se ejecutará el
bloque de instrucciones del interior del bucle. Al llegar al final del bucle,
se regresará al principio para volver a evaluar la condición y comenzar
de nuevo el proceso, que seguirá ejecutándose de forma cíclica hasta
que la condición deje de cumplirse.

Sintaxis:
Mientras (condición) Hacer
Bloque de instrucciones
FinMientras
Para que el programa entre a procesar lo previsto dentro del bucle se
tiene que cumplir una condición. Es decir si nunca se cumple esa
condición el programa no entrará nunca en el interior del bucle. Por
tanto el programa entrará en el bucle, cero, una, dos, ... o bien n veces,
pero no debe entrar infinitas veces.
Es importante no olvidar esta característica de la instrucción. Una vez
que el flujo de ejecución pase al interior del bucle, la condición deberá
pasar de verdadera a falsa en algún momento para que el bucle tenga
fin. El progamador tiene diversas formas de controlar todo esto para
que no se produzca el bloqueo, por ejemplo mediante cambios en
valores de las variables, contadores, salidas directas o deseadas por el
usuario, etc.
Esta instrucción, al igual que las anteriores, permite anidamientos
(huelga ya decir la importancia de las tabulaciones de cara a la fácil
comprensión del programa).
3.2 Bucle "REPETIR...HASTA"
Esta instrucción es muy parecida a la precedente. También se trata de
un bucle que tiene que tener una salida válida para evitar bloqueos y
donde igualmente se usan los controles comentados en el apartado
anterior. En cuanto al número de repeticiones, al igual que en la
anterior es indeterminado, es decir no está prefijado, pero debe ser
finito, aunque hay una diferencia fundamental, que la condición se
evalúa al final de la sintaxis, por lo que como mínimo al menos una
vez se ejecutará lo que esté programado en el interior del bucle.
Después si la condición sigue manteniéndose la iteración continúa,
hasta que la condición mute a verdadera. Si sólo se cumple una vez
entrará una vez y seguirá después de la instrucción "Hasta que" por la
ruta normal del programa.
Este tipo de bucle es idóneo para depurar datos de entrada por teclado
ya que dichos datos al menos se deben teclear una vez. Por ejemplo,
imagina que tu programa debe pedirle por teclado al usuario un
número comprendido entre 1 y 10, si el usuario introduce un número
que no esté en ese intervalo el programa debe pedirle de nuevo un
número correcto, y seguir así hasta que el número cumpla la condición.

Sintaxis:
Repetir
Instrucción.
Instrucción.
...
...
Hasta Que (condición)
PHP es un lenguaje de script, multiplataforma y con licencia libre.
Cualquier editor de textos te servirá para escribir código en PHP. Sus
scripts pueden ser incrustados en el código html de las páginas web
para convertirlas en páginas web dinámicas. Se suele utilizar por
tanto, del lado del servidor para darle ese dinamismo a los sitios web.

2. Estructuras estáticas
Son aquellas en las que el tamaño ocupado en memoria se
define antes de que el programa se ejecute y no puede
modificarse dicho tamaño durante la ejecución del programa.

Para entender y tratar correctamente las estructuras estáticas de datos


(tablas) son necesarios los siguientes conceptos:
• Tabla: estructura de datos formada por un número finito de
elementos, todos ellos del mismo tipo y ubicados en
direcciones de memoria fisicamente contiguas.
• Elemento: cada uno de los datos básicos que forman parte
de una tabla.
• Nombre de tabla: identificador usado para hacer referencia
a una tabla y, de forma global, los elementos que la forman.
• Tipo de tabla: Indica el tipo de dato básico que es común a
todos y cada uno de los elementos que forman dicha
estructura (entero, real, carácter o lógico).
• Índice: valor numérico entero y positivo a través del cual
podemos acceder directa o indirectamente a los distintos
elementos de una tabla, pues marca la situación relativa de
cada elemento dentro de la misma. El valor inicial de un
índice suele ser cero.
• Tamaño de tabla: el tamaño o longitud de una tabla viene
determinado por el número máximo de elementos que la
forman, siendo el tamaño mínimo un elemento y el tamaño
máximo N elementos.
• Acceso a los elementos o componentes de una tabla:
los elementos o componentes de una tabla tratados
individualmente son datos que reciben el mismo trato que
cualquier otra variable simple, con un tipo de dato que
coincide con el tipo de la tabla y una denominación propia
que les distingue del resto de los elementos o componentes
que constituyen dicha estructura. Para acceder o referenciar
un elemento en particular es suficiente con indicar el nombre
de la tabla seguido del índice correspondiente entre
paréntesis.
• Dimensión de tabla: viene determinada por el número de
índices que necesitamos para acceder a cualquiera de los
elementos que forman cualquiera de los elementos que
forman dicha estructura.

.
Según su dimensión, las tablas se pueden clasificar en:

• Unidimensionales (vectores).
• Bidimensionales (matrices, tablas o arrays).
• Multidimensionales (poliedros).

En la siguiente sección, nos centraremos en el estudio de las


estructuras de datos unidimensionales o vectores.

2.1. Vectores
A) Concepto y representación gráfica
Los vectores son estructuras de datos estáticas unidimensionales que
agrupan elementos del mismo tipo y se referencian bajo un nombre
o identificador común. Para representar gráficamente un vector
debemos tener en cuenta cómo están almacenados sus elementos,
esto es, en posiciones contiguas de memoria:
2.2. Matrices
A) Concepto y representación gráfica
Las matrices, arrays o tablas son estructuras de datos estáticas
unidimensionales que agrupan, al igual que los vectores, elementos
del mismo tipo y se referencian bajo un nombre o identificador
común. Para representar gráficamente una matriz debemos tener en
cuenta cómo están almacenados sus elementos, esto es, también en
posiciones contiguas de memoria:
2.3. Poliedros
A) Concepto
Los poliedros son estructuras de datos estáticas multidimensionales
(dimensión >= 3) que agrupan, al igual que las matrices, elementos
del mismo tipo y se referencian bajo un nombre o identificador
común.
La nomenclatura usada para acceder o hacer referencia a un
elemento es la siguiente: Nombre_poliedro(índice1, índice2,
índice3, ..., índiceN).
3. Estructuras dinámicas
Llegados a este punto, hemos estudiado las estructuras de datos que
obligan al programador a definir, antes de la ejecución del programa,
un tamaño y estructura que permanecerán fijas e invariables, siendo
su objetivo informar al compilador del espacio que debe reservar en
memoria para ellas (estructuras estáticas).
Además de estas, existen otros tipos de estructuras a través de las
cuales podemos dar solución a determinados problemas en los
cuales desconocemos la cantidad de memoria que
necesitaremos durante la ejecución del programa.
Por ello, es interesante disponer de métodos que permitan acceder a
las direcciones de memoria que se necesiten durante la ejecución de
dicho programa con la posibilidad de liberarlas, ofreciéndonos también
la posibilidad de modificar su tamaño y estructura en tiempo de
ejecución. Dichas estructuras se denotan con el nombre de dinámicas.
3.1. Punteros
A) Concepto y representación gráfica
Sin entrar en detalles, un puntero o apuntador es una variable estática
de tipo entero usada para contener la dirección de memoria de
otra variable (variable que apunta a otra variable).
Se utilizan principalmente para realizar operaciones con estructuras
dinámicas de datos, es decir, estructuras creadas en tiempo de
ejecución, siendo su objetivo el de permitir el manejo o
procesamiento (creación, acceso, eliminación, etc.) de estas
estructuras de datos.
Gráficamente:

Puntero → Dato

Variable estática Variable dinámica apuntada

.
B) Operaciones con punteros

• Definición: Nombre_Puntero es un puntero


a Tipo_Elemento.
• Inicialización: Nombre_Puntero = Nulo.
• Creación: Reservar(Nombre_Puntero).
• Destrucción: Liberar(Nombre_Puntero).
• Acceso: Nombre_Puntero (accedemos a la dirección de
memoria), Val-Nombre_Puntero (accedemos al valor contenido
en la dirección de memoria).

3.2. Pilas
A) Concepto
Una pila es una estructura de datos dinámica formada por un grupo
ordenado de elementos homogéneos (todos del mismo tipo) en la
que los elementos sólo pueden ser añadidos o eliminados por
un extremo llamado cabecera o cima (top) de la pila.
De esta forma, los elementos se extraen en orden inverso al seguido
en el proceso de inserción. Por ello, una pila es considerada una
estructura de datos LIFO (Last In First Out), esto es, que el último
elemento que entra es el primero que sale.
3.3. Listas
A) Concepto y tipos de listas
Una lista es una estructura dinámica de datos que contiene
una colección de elementos homogéneos (del mismo tipo) de
manera que se establece entre ellos un orden. Es decir, cada
elemento, menos el primero, tiene un predecesor, y cada elemento,
menos el último, tiene un sucesor.
Tanto las estructuras vistas en la sección anterior (pilas) como las que
veremos en la siguiente (colas) son tipos de listas.
Podemos distinguir, atendiendo a la organización de los nodos,
entre:

• Listas simplemente enlazadas: cada nodo tiene un campo que


apunta al siguiente nodo.
• Listas doblemente enlazadas: cada nodo dispone de un puntero
que apunta al siguiente nodo, y otro que apunta al nodo anterior.

Otra distinción puede ser:

• Listas lineales: son listas que tienen un comienzo y un final.


• Listas circulares: en estas listas el último elemento apunta al
primero, por lo tanto podríamos estar recorriéndolas siempre, ya
que no tienen final.

3.4. Colas
A) Concepto y representación gráfica
Una cola es un grupo ordenado de elementos del mismo tipo, en la cual
dichos elementos se añaden por un extremo (Final) y se quitan
por el otro extremo (Frente). Esto significa que los elementos se
sacan en el mismo orden en el que fueron insertados o introducidos en
la cola, siendo por ello considerada como una estructura de
datos FIFO (First In First Out), es decir, que el primer elemento en
entrar es el primer elemento en salir.
3.5. Estructuras dinámicas no lineales
Hasta el momento, todo lo que hemos visto han sido estructuras de
datos lineales, pero en ocasiones son necesarias otro tipo
de estructuras de datos jerarquizadas como pueden ser
los árboles o los grafos.
El objetivo de esta sección es introducirte un poco estas estructuras
con el fin de conocerlas superficialmente, requieren de experiencia y
algunos conocimientos extra que impiden profundizar en su estudio.
A) Árboles
Como se ha mencionado, un árbol es una estructura de
datos jerarquizada y no lineal constituida por un conjunto de
elementos homogéneos, es decir del mismo tipo, que se caracterizan
porque establecen una jerarquía entre los elementos que la forman.
Esta relación jerárquica entre sus nodos se establece de manera que
todos los nodos que componen el árbol tienen un único nodo padre,
que es el nodo que le precede en la jerarquía. La única excepción es
el nodo raíz, que se puede definir como aquel nodo que no tiene padre.
Todos los árboles tienen una única raíz.
Cada nodo puede tener 0, 1, o más de un nodo hijo. Un nodo hijo es
aquel que le sucede en la jerarquía. Si un nodo no tiene ningún hijo
se le llama nodo terminal u hoja. El número de hijos que tiene un
nodo es lo que denominaremos grado.
Un árbol se puede caracterizar por:

• Profundidad: máximo grado que alcanza el mismo.


• Peso: número de hojas del árbol.

Los árboles se clasifican en función del número máximo de


sucesores o descendientes de un nodo, de forma que un árbol
donde cada nodo tiene un máximo de dos sucesores se denomina árbol
binario (son los más usados); si tiene un máximo de tres sucesores se
denomina árbol ternario y así sucesivamente.
B) Grafos
Un grafo es una estructura de datos dinámica muy similar a los
árboles formado por un conjunto de nodos y otro conjunto de
arcos. Cada arco agrupa a dos nodos que pueden ser el mismo. Cada
arco puede tener peso, coste o distancia. Además de arcos pueden
estar orientados o no estarlo. En caso de estar orientados se
representan mediante una flecha, en caso contrario se representan
por un segmento.
Un grafo se puede recorrer igual que un árbol, bien por profundidad o
bien por anchura.
Algunos algoritmos importantes, como el de Djikstra, son desarrollados
mediante grafos. Resolver por ejemplo un problema de distancias entre
ciudades es típico de grafos. Aquí cada vértice sería una ciudad y cada
arco una carretera entre dos ciudades.
4. Funciones
Esta técnica de descomponer un programa (principal) en
subprogramas o módulos (secundarios) más sencillos nos permite
separadamente solucionar pequeños problemas que en un solo paso o
con un único programa sería una labor casi imposible.
El programa principal tomará el control al principio de la ejecución y
desde él se llamará a cada uno de los módulos. Una vez realizada la
llamada a un módulo, se transfiere el control a éste, que al terminar
devolverá el control a la instrucción siguiente desde la que fue llamado.
La estructura de un módulo o subprograma es la misma que la de
un programa:

• suministrando junto a su nombre (al ser llamado) la


información de entrada
• declarando las variables y/o constantes necesarias en su
interior
• realizando las acciones convenientes
• y por último devolviendo los resultados al programa que lo
llamó

Las principales ventajas de la programación modular son las


siguientes:

• Facilitar la comprensión del problema y su resolución


escalonada.
• Aumentar la claridad y legibilidad de los programas.
• Permitir la resolución del problema por varios
programadores a la vez.
• Reducir el tiempo de desarrollo aprovechando módulos
previamente desarrollados.
• Mejorar la depuración de los programas, pues se pueden
depurar los módulos aisladamente de forma más sencilla e
independiente.
• Facilitar un mejor y más rápido mantenimiento de la
aplicación al poder realizar modificaciones o
implementaciones de una forma más sencilla tomando como
base los módulos ya desarrollados.

Con el término Funciones, en programación, hacemos referencia a los


módulos o subprogramas anteriormente mencionados.
4.1. Clasificación de los módulos
Los módulos o funciones podemos clasificarlos atendiendo
a diferentes criterios.
En función de su situación con respecto al módulo que lo invoca:

• Interno: se encuentra en el mismo fichero que el módulo que lo


invoca.
• Externo: se encuentra en distinto fichero.

Atendiendo al posible retorno de un valor:


• Función: retorna un valor cuando devuelve el control al módulo
que lo invocó. Dicho valor será recogido para usarlo en una
expresión.
• Procedimiento: no hace un retorno explícito de un valor al
finalizar el módulo. Cuando se devuelve el control al módulo que
hizo la llamada, la ejecución continúa en la sentencia siguiente a
la que hizo la llamada.

En función de cuándo ha sido desarrollado:

• De programa: su desarrollo se ha realizado integramente en el


programa actual.
• De librería: ha sido desarrollado previamente y está contenido en
ficheros de librerías.

En función del número de módulos distintos que realizan la llamada:

• Subprograma: es invocado por un solo módulo.


• Rutina o subrutina: es invocado por diversos módulos.

En la práctica, una de las distinciones más claras en cuanto a módulos


es la de funciones frente a procedimientos, el retornar o no un
valor puede ser clave para continuar con el flujo natural y correcto de
un programa.
.
A) Ejemplo de procedimiento
En la
web http://www.desarrolloweb.com/articulos/312.phpencontramos un
ejemplo de creación de funciones en PHP. Se trata de hacer un
procedimiento que recibe un texto y lo escribe en la página con cada
carácter separado por "-". Es decir, si recibe "hola" debe escribir "h-o-
l-a" en la página web.
La manera de realizar esta función será recorrer el string, caracter a
caracter, para imprimir cada uno de los caracteres, seguido de el signo
"-". Recorreremos el string con un bucle for, desde el carater 0 hasta
el número de caracteres total de la cadena.
El número de caracteres de una cadena se obtiene con la función
predefinida en PHP strlen(), que recibe el string entre paréntesis y
devuelve el número de los caracteres que tenga.

.
B) Ejemplo de función
Para el caso de una función, vamos a crear un programa que genere
un número aleatorio entre 1 y 20 y calcule su sumatorio. Por ejemplo,
si sale el 5, el sumatorio desde 1 hasta 5 sería 1 + 2 + 3 + 4 + 5 = 15.
4.2. Ámbito de las variables
El ámbito de un identificador, ya sea una variable, una función, un
procedimiento, etc, es la parte del programa donde este
identificador puede ser utilizado, porque se conoce su existencia.
De esta forma, en función de su ámbito, las variables se pueden
clasificar en globales y locales.

• Variables globales: se definen en un lugar concreto del


programa que no pertenezca a ninguno de los
módulos o bien deben tener un identificador especial que
permita diferenciarlas. Dependiendo de dónde se definan, su
ámbito será distinto. Así, si se definen al comienzo del
programa, su ámbito de validez es todo el programa (todos
los módulos). Sin embargo, si se definen en otro punto del
programa (punto intermedio), su ámbito de validez es el
resto del programa (los módulos que están a continuación de
la definición).
• Variables locales: deben estar definidas dentro de un
módulo del programa y será en ese módulo donde tendrán
su ámbito de validez. En el caso de definir una variable local
dentro de un bloque que a su vez pertenece a un módulo, su
ámbito de validez será dicho bloque.
• 4.3. Parámetros
• Para establecer la relación o
acoplamiento entre varios módulos o funciones son necesarios
los llamados parámetros o argumentos. De esta forma se llama
a un módulo concreto pasando con una serie de parámetros para
que, a partir de ellos, dicho módulo se ejecute teniéndolos en
cuenta a modo de caja negra hasta devolver el resultado
correspondiente
Podemos considerar dos tipos de parámetros:

• Parámetros actuales: son variables


locales pertenecientes al módulo que realiza la
llamada y cuyo valor (contenido) o dirección de memoria es
enviado al módulo invocado.
• Parámetros formales: Son variables
locales, pertenecientes al módulo invocado, que reciben
el valor o la dirección de memoria de los parámetros actuales
del módulo que lo invoca en el momento de ser ejecutada la
llamada.
• 2. Archivos
• Un archivo o fichero es un estructura informática para el
almacenamiento de datos en memoria
secundaria gestionado por el sistema operativo. Se trata de un
conjunto de sectores físicos de un dispositivo de memoria
secundaria que guardan información sobre un tema concreto. El
Sistema Operativo (S.O.) es el encargado de gestionar qué
sectores pertenece a cada fichero, si están ocupados o libres, si
tienen fallos, si el sector esta completo, cuál es el siguiente
sector de un fichero, etc.
• La estructura de control que gestiona la información sobre
ficheros, sectores, ocupación, etc, se denomina Sistema de
archivos. Existen distintos sistemas de ficheros según el sistema
operativo con el que trabajemos: FAT16, FAT32, NTFS, EXT2,
RAISER, NFS, SySV, OS2, etc. Existen también sistemas de
ficheros estándar, independientes del sistema operativo, como el
ISO 9660 que corresponde con el formato habitual de los CD-
ROM de datos. Para poder trabajar con una unidad de
almacenamiento, debemos crear la información sobre sistema de
ficheros que reconoce el sistema operativo, a este proceso se le
denomina comúnmente formatear.
• Un archivo puede contener cualquier tipo de información:
instrucciones en C (c, cpp, h), en código máquina (.exe, com, lib,
obj, dll) , imagenes en distintos formatos ( jpg, gif, bmp),
documentos de texto sin formato (txt), con un formato especifico
(rtf, doc, html), sonido ( wav, mp3), video (avi,divx), fichas de
los clientes, una lista de alumnos, el registro de windows, etc.
• Un fichero no siempre se guarda en posiciones
consecutivas, sino que puede utilizar varios bloques en
distintas posiciones. El recorrido completo del archivo puede
implicar el posicionamiento en distintas posiciones del disco duro.
Este fenómeno se conoce como fragmentación y repercute
negativamente en el rendimiento de las operaciones de entrada
y salida.

También podría gustarte