You are on page 1of 27

FUNDAMENTOS

DE PROGRAMACIN
RAFAEL LPEZ NAVARRO
CURSO 2011/2012 UNED

TEMA 1 -.- INTRODUCCIN


1.1- Programacin e ingeniera del software
Qu es un algoritmo? Conjunto de pasos necesarios para resolver un determinado
problema.
Los algoritmos deben ser: - Correctas
- Claros - Eficientes
Qu es un programa? Es la implementacin o codificacin de un determinado algoritmo en
uso de algn lenguaje de programacin.
Lenguaje de programacin: Conjunto de smbolos y reglas para crear programas.
Programacin e ingeniera del software?
Programacin = En general se encarga de desarrollar programas a pequea escala.
Ingeniera del software = Conjunto de etapas necesarias para desarrollar programas a gran
escala y de
gran calidad.
Etapas de la ingeniera del software:
Anlisis
Diseo
Codificacin
Pruebas y Mantenimiento

- Compiladores y interpretes Qu es un traductor? Es un programa que traduce el cdigo
fuente de un programa a un cdigo que
pueda entender la CPU. Hay dos tipos de traductores:
Compiladores
Intrpretes

- Modelos abstractos de programacin
Actualmente existen diferentes modelos de programacin (o paradigmas de programacin):


- Programacin funcional


- Programacin lgica


- Programacin imperativa


- Modelo de flujo de datos


- Programacin orientada a objetos (POO)

-Objetivos de la programacin
CORRECIN: Un programa debe realizar el tratamiento esperado, y no producir
resultados errneos.
CLARIDAD: Prcticamente todos los programas han de ser modificados despus de
haber sido desarrollados inicialmente. Es fundamental que sus descripciones sean
claras y fcilmente inteligibles por otras personas.
EFICIENCIA: Una tarea de tratamiento de informacin puede ser programada de muy
diferentes maneras sobre un computador determinado, es decir, habr muchos
programas distintos que producirn los resultados deseados.

TEMA 2 -.- ELEMENTOS_BASICOS


2.1 - Notacin BNF (backups-Naur Form)

Es el conjunto de reglas gramaticales en las que se basa un lenguaje de programacin. Para


describir estas reglas se utilizan una seria de meta smbolos:

::= Meta smbolo de definicin


| Meta smbolo de alternativa
{ } Meta smbolo de repeticin
[ ] Meta smbolo de opcin
( ) Meta smbolo de agrupacin

Las reglas BNF tendrn dos tipos de elementos:
Elemento terminal: Son elementos que forman parte del lenguaje C+-
Elemento no terminal: Estn definidos a partir de los elementos terminales a partir de
las reglas de produccin.

2.2 Tipos predefinidos


Tipo entero (int) Este tipo puede tomar valores positivos y negativos. El rango de
valores que puede tomar depende de la plataforma (combinacin de procesador,
sistema operativo y compilador) utilizada.
Para poder controlar los valores mximo y mnimo que podemos utilizar no es preciso
recordar estos valores, podemos utilizar las constantes INT_MAX y INT_MIN que estn
en la librera <limits.h>

Tipo real (float)
Este tipo puede tomar valores positivos y negativos, y puede tener una parte decimal. Es
una representacin no exacta. El rango de valores que puede tomar depende de la
plataforma (combinacin de procesador, sistema operativo y compilador) utilizada.

Tipo carcter (char)


Lo utilizaremos para manejar caracteres imprimibles: "A", "a", "B", "b", ... ."@","{", .... y no
imprimibles: RETURN, ESCAPE, F1, F2, .... Incluye la prctica totalidad de caracteres
utilizados en el Mundo
Para hacer referencia a un carcter de la mesa del cdigo ascii podemos hacer uso de la
funcin char(x): char(13) Tecla Return char(27) tecla ESCAPE char(65) letra
"A"
Tambin podemos hacer referencia al lugar de la tabla que ocupa un carcter en uso de
la funcin int(c):


int ("Z")90
Si hacemos uso de la librera <ctype.h> podemos utilizar las siguientes funciones para a
manejar caracteres:
-isalpha(c)Comprueba si c es una letra o no isascii(c)Comprueba si c es un carcter
ASCII -isblank(c)Comprueba si c es un espacio en blanco o tabulacin
iscntrl(c)Comprueba si c es un carcter de control o no isdigit(c)Comprueba si c es
un dgito decimal (0 .. 9) o no ----tolower(c)Pasa a minscula el carcter c
-toupper(c)Pasa a mayscula el carcter c

2.3 Expresiones aritmticas

Si no se utilizan parntesis el orden de prioridad en una expresin es:


1. Operadores multiplicativos * / %
2. Operadores aditivos + -

2.4 Operaciones de escritura simples

El procedimiento printf est en la librera <stdio.h> y sirve para mostrar o escribir por
pantalla un valor:

Ejemplos:

printf ("Introduce tu nombre:"); printf ("---- Bienvenido a este programa --- \ n ");

Cuando a parte de texto queremos mostrar valores numricos, la funcin printf necesita
saber el tipo de datos que tiene que escribir para saber cmo las ha de escribir. El formato
o forma de utilizar esta funcin es:

printf ("cadena con formatos", valor1, valor3, ... valorN);

Nota: no es obligatorio el signo de % de principio del especificador, y el tipo de datos que
se quiere mostrar. Esto es lo ms normal y lo que se ve en esta asignatura. En caso de que
se quiera especificar ms los datos de salida se utilizan los dems parmetros, que estn
entre "corchetes".

Los tipos habituales:
Una cadena de caracteres: s
Un carcter: c Valor real con / o sin notacin exponencial, con un nmero dado de
decimales de precisin .Los ceros y puntos decimal salen si es necesario: g
Valor real con notacin exponencial e [+/-] ddd. e
Valor real (punto fijo) de la forma [-] dddd.dddd. f
Entero decimal (un entero): d

Nota: %10.3f real en coma fija que reserva 10 espacios y una precisin de 3
decimales

2.5 - ESTRUCTURA DE UN PROGRAMA EN C / C + -


CABECERA DEL PROGRAMA

/ * Nombre del programa. Autor * / / * Descripcin del programa * /
LLAMADAS EN LIBRERAS Y

#include <nombre_libreria.h>
DEFINICIONES DE CONSTANTES

const tipo nombre_constante = valor
DECLARACIN DE FUNCIONES
tipo_dato funcin A (parmetros)
tipo_dato funcin B (parmetros)
DECLARACIN DE VAIABLES GLOBALES
int a; float b;
FUNCIN PRINCIPAL
tipo_dato main () {
instrucciones
}

TEMA 3 -.- CONSTANTES Y VARIABLES


3.1- IDENTIFICADORES:
Cualquier dato que se utiliza en un programa tiene asociada los siguientes atributos:

Identificador Tipo Valor



Reglas para identificador:
-Palabra formada por caracteres alfabticos o numricos
-No valen los espacios en blanco ni signos de puntuacin
-Es necesario que comience por una letra
-Pueden utilizarse las 52 letras maysculas y minsculas del alfabeto ingls, la barra de
subrayado y los dgitos de 0 a 9.

3.2 - CONSTANTES:
Son datos que mantienen su valor durante toda la ejecucin del programa. La forma de
declarar una constante es:


Const tip nombre =valor;

3.3- VARIABLES

Son datos que pueden ir variando su valor durante la ejecucin del programa.
La forma de declarar la variable es:


tipoDeVariable nombreVariable;

3.4- LECTURA DE VARIABLES (SCANF)


Para leer variables desde el teclado hacemos uso de la funcin scanf que est en la
librera <stdio.h>
Scanf (%d,&a); lee un valor entero por teclado, el valor se asigna a la variable
int a;

TEMA 4 -.- METODOLOGA 1


4.1 DESCOMPOSICIN EN SUBPROBLEMAS(REFINAMIENTOS SUCESIVOS)
A la hora de resolver problemas complejos lo mejor es intentar descomponer el problema
en subproblemas ms pequeos y ms fciles de resolver.
Consiste en expresar inicialmente el programa a desarrollar como una accin global, que
si es necesario se ir descomponiendo en acciones ms sencillas hasta llegar a acciones
simples que puedan ser expresadas directamente como sentencias del lenguaje de
programacin.
Cada paso de refinamiento consiste en descomponer cada accin compleja en otras ms
simples. Esta descomposicin exige:
o Identificar las acciones componentes.
o Identificar la manera de combinar las acciones componentes para conseguir el
efecto global.

4.2 ASPECTOS DE ESTILO

Encolumnado
Comentarios
Eleccin de nombres
Uso correcto de maysculas y minsculas
Constantes con nombre.

TEMA 5 -.- ESTRUCTURAS DE CONTROL


5.1 Programacin estructurada

Es una metodologa de programacin que fundamentalmente trata de construir


programas que sean fcilmente comprensibles.
Un programa no solo debe funcionar correctamente, sino que ademas debe estar escrito
de manera que se facilite su compresin posterior.


-Representacin de la estructura de un programa

La estructura de los programas imperativos se representa tradicionalmente
mediante diagramas de flujo llamados en ingles flow-chart. Estos diagramas contienen dos
elementos bsicos, correspondientes a acciones y condiciones. Las acciones son
rectngulos y las condiciones son rombos. Las condiciones equivalen a preguntas a las
que se puede responder SI o NO.

Accin

SI

NO

El flujo de control durante la ejecucin del programa se refleja mediante lneas o vas que
van de un elemento a otro. Las acciones tienen una sola va de entrada o comienzo y una
de terminacin o salida. Las condiciones tienen una va de entrada, y dos vas de salida
marcadas son SI y NO.

La programacin estructurada recomienda descomponer las acciones usando las
estructuras ms sencillas posibles, que son:
Secuencia: secuencia de acciones.
Seleccin: consiste en ejecutar una accin u otra.
Iteracin: repeticin de una accin mientras que se cumpla una determinada
condicin. (Bucle)

5.2 - ESTRUCTURAS BSICAS EN C+-

Sentencia IF
Sentencia WHILE
Sentencia FOR

TEMA 6 -.- METODOLOGA 2


6.1 DESARROLLO CON ESQUEMAS DE SELECCIN E ITERACIN
Se tiente 3 posibilidades a la hora de refinar una accin compuesta:
Organizarla como secuencia de acciones
Organizarla como seleccin entre acciones alternativas.
Organizarla como iteracin de acciones.

1.1 ESQUEMAS DE SELECCIN


Consiste en plantear una accin compuesta como la realizacin de una accin entre varias
posibles, dependiendo de ciertas condiciones.
Para desarrollar un esquema de seleccin debemos identificar sus elementos
componentes. Por tanto habr que:
Identificar cada una de las alternativas del esquema, y las acciones
correspondientes.
Identificar las condiciones para seleccionar una alternativa u otra.

1.2 ESQUEMAS DE ITERACIN
Una iteracin o bucle consiste en la repeticin de una accin o grupo de acciones hasta
conseguir el resultado deseado.
Identificar las acciones tiles a repetir, y las variables necesarias. Precisar el
significado de estas variables al comienzo y final de cada repeticin.
Identificar cmo actualizar la informacin al pasar de cada iteracin a la siguiente.
Identificar la condicin de terminacin.
Identificar los valores iniciales de las variables, y si es necesaria alguna accin
para asignrselos antes de entrar en el bucle.

6.2 VERIFICACIN DE PROGRAMAS

Un programa es correcto si produce siempre los resultados esperados de acuerdo con la


especificacin del programa. Una forma de verificar un programa es mediante ensayos.
Consiste en ejecutar el programa con unos datos preparados de antemano y a los que
sabemos cul ser el resultado correcto. Si con la ejecucin del programa con estos datos se
obtienen los resultados esperados no podemos afirmar que el programa sea correcto ya que
puede tener un caso concreto y no probado que d resultados inesperados. La nica forma
de verificar un programa es con una demostracin formal utilizando la lgica de predicados.

6.3- EFICIENCIA DE PROGRAMAS. COMPLEJIDAD.


El coste que tiene un programa va a estar en funcin de los recursos que consume.
Recursos son la memoria, el tiempo de procesador y el tiempo que tarda en ejecutarse.
Nosotros slo nos fijaremos en el tiempo que tarda un algoritmo en ejecutarse, que vendr
en funcin del nmero de instrucciones que ejecuta.

TEMA 7 -.- FUNCIONES Y PROCEDIMIENTOS


7.1 CONCEPTO DE SUBPROGRAMA
Es una parte de un programa. Como mecanismo de programacin, un subprograma es una
parte de un programa que se desarrolla por separado y se utiliza invocndolo mediante un
nombre simblico.

7.2 FUNCIONES

Una funcin permite agrupar un conjunto de instrucciones en un bloque que tpicamente


realizar una tarea concreta. Su estructura en C tiene dos partes:
El encabezamiento de la funcin
El cuerpo de la funcin

//encabezamiento de la funcin (descripcin)



tipo_resultado nombre_funcion (lista_argumentos o parmetros)
{
declaracin de variables;
instrucciones.
}

Al encabezamiento de una funcin se define el nombre de la funcin y el modo en el que
se le va a transferir informacin.
Tipo_resultado representa el tipo de dato (void, int, char, float) que devuelve la funcin
al mdulo que le ha llamado.
Nombre_funcion Hace referencia al nombre que utilizaremos para llamar a la funcin
desde otro mdulo.
Lista_argumentos Es un listado de variables o de valores que el modulo que llama le pasa
a la funcin para que realice operaciones con ellos.

Algunas funciones predefinidas
Librera ctype.h
char toupper (char c)Convierte es mayscula
char tolower (char c)Convierte es minscula
bool isblank (char c)Comprueba si c es un espacio en blanco o tabulacin
bool isdigit (char c)Comprueba si c es un nmero entre 0 y 9
bool isalpha (char c)Comprueba si c es un carcter o no
Librera math.h
float Tanf (float x)Tangente (x)
float cosf (float x)Coseno (x)
float senf (float x)Seno (x)
float powf (float x, float y)Potencia x ^
float sqrtf (float x)Raz cuadrada de x

7.3 PROCEDIMIENTOS
Son subprogramas que realizan una cierta tarea o accin. No devuelven ningn valor.

7.4 PASO DE ARGUMENTOS O PARAMETROS A FUNCIONES Y PROCEDIMIENTOS


Cuando una funcin llama a otra funcin para que se ejecute hay un intercambio de
informacin entre las dos funciones. Este intercambio de informacin se lleva a cabo
mediante el uso de parmetros o argumentos.
Se pueden clasificar en:
Parmetros actuales: son variables locales que pertenecen a la funcin que realiza
la llamada y el valor (contenido) o la direccin de memoria de esta variable es
enviada a la funcin invocada.
Parmetros formales: son variables locales, que pertenecen al mdulo invocado,
que reciben el valor o la direccin de memoria de los parmetros actuales del
mdulo que lo invoca en el momento de ser ejecutada la llamada.
Tenemos dos formas de pasarle los argumentos a una funcin o un procedimiento
Por valor: Se enva una copia del valor que tienen cada uno de los parmetros
actuales en el momento de realizar la llamada. Esta valoracin son recogidos por los
parmetros formales del mdulo invocado. En este caso el mdulo invocado no
puede modificar el valor original de las variables actuales.

Por referencia: en este caso, el mdulo invocado, en lugar de trabajar con los
valores de las variables actuales, trabaja sobre las direcciones de las variables
locales. Por tanto en este caso el mdulo invocado puede modificar los valores de las
variables actuales del mdulo que hace la llamada. Este uso ofrece menos seguridad
que el paso por valor.

7.5 VARIABLES LOCALES Y GLOBALES


Variable local: Es aquella que su uso est restringido a la funcin que la ha declarado, se
dice entonces que la variable es local a esa funcin. Esto implica que esa variable slo va a
poder ser manipulada en esa seccin, y no se podr hacer referencia fuera de esa seccin.
Cualquier variable que se define dentro de las claves del cuerpo de una funcin se
interpreta como una variable local en esa funcin.
Variable global: es aquella que se define fuera del cuerpo de cualquier funcin,
normalmente al principio del programa, tras la definicin de los archivos de biblioteca, de
la definicin de constantes y antes de cualquier funcin. El mbito de una variable global
son todas las funciones que componen el programa, cualquier funcin puede acceder a esas
variables para leer y escribir en ellas.

7.6 RECURSIVIDAD DE SUBPROGRAMAS


Cuando un subprograma hace una llamada a s mismo se dice que es un subprograma
recursivo. (algoritmo del factorial)
Int FactorialRecursivo (int n) {
If (n<=1){
Return 1;
} else {
return n * FactorialRecursivo(n-1);
}
}

7.7 Problemas al utilizar subprogramas

El uso inadecuado de las variables que pasamos como argumentos puede dar lugar a
algunos problemas:
Efectos secundarios.
Cuando un subprograma modifica alguna variable externa, se dice que est
produciendo efectos secundarios o laterales. El concepto al efecto lateral sera la
transparencia referencial. Siempre que llamamos a un subprograma con los mismo
parmetros se debe obtener el mismo resultado.
Redefinicin de elementos.
Cuando a un subprograma se define una variable local da igual el nombre que
elegimos, ya que al ser local slo afecta al propio subprograma. El problema viene
cuando el nombre de la variable local que elegimos es lo mismo que una variable
global. Aparte de sacar resultados incorrectos, se pierde mucho en claridad.
Doble referencia(aliasing)
Se produce cuando una misma variable se referencia con dos nombres diferentes. Se
puede dar los siguientes casos:
1. Cuando un subprograma utiliza una variable externa que tambin se le pasa
como argumento.
2. Cuando para utilizar un subprograma se pasa la misma variable en dos o ms
argumentos.

TEMA 8 -.- METODOLOGA 3


8.1-OPERACIONES ABSTRACTAS

Los subprogramas constituyen un primer paso hacia la metodologa de programacin
basada en abstracciones. Los subprogramas permiten definir operaciones abstractas.
Una abstraccin es una visin simplificada de una cierta entidad, de la que slo
consideramos sus elementos esenciales, prescindiendo en lo posible de los detalles. Las
entidades que podemos abstraer para materializarlas como subprogramas osn, en genral,
oeraciones ( accin o funcin).
Especificacin: Que hace la operacin ( punto de vista de quien la invoca)
Realizacin: Cmo se hace la operacin (punto de vista de quien la ejecuta).
La especificacin consiste en indicar cul es el nombre de la operacin y cuales son sus
argumentos.
La realizacin debe suministrar toda la informacin necesaria para poder ejecutar la
operacin (cdigo).

8.2-DESARROLLO USANDO ABSTRACCIONES


Desarrollo descendente: desarrollo por refinamientos sucesivos, teniendo en cuenta adems
la posibilidad de definir operaciones abstractas. En cada etapa de refinamiento de una
operacin habr que optar por una de las alterativas siguientes:
Considerar la operacin como operacin terminal, y codificarla mediante sentencias
del lenguaje de programacin
Considerar la operacin como operacin compleja, y descomponerla en otras ms
sencillas.
Considerar la operacin como operacin abstracta, y especificarla, escribiendo ms
adelante el subprograma que la realiza.
Resultar ventajoso definir una operacin como abstracta si se consigue alguna de las ventajas
siguientes:
Evitar mezclar en un determinado fragmento de programa operaciones con un nivel
de detalle muy diferente.
Evitar escribir repetidamente fragmentos de cdigo que realicen operaciones
anlogas.

Reutilizacin: Si la operacin identificada como operacin abstracta tiene un cierto sentido en
s misma, es muy posible que resulte de utilidad en otros programas, adems de en aqul para
el cual se ha desarrollado. La escritura de otros programas que se utilicen esa misma operacin
resulta mas sencilla, ya que se aprovecha el cdigo de su definicin, que ya estaba escrito.
Los procedimientos y funciones cuanto mas genricos sean en su comportamiento, ms
reutilizables son. Un procedimiento o funcin es reutilizable si podemos aplicarlo no slo al
programa para el que est diseado, sino que tambin a otros programas en los que se requiere
un procedimiento o funcin similar.

Desarrollo ascendente: Consiste en ir creando subprogramas que realicen operaciones
significativas de utilidad para el programa que se intenta construir, hasta que finalmente sea
posible escribir el programa principal, de manera relativamente sencilla, apoyndose en los
subprogramas desarrollados hasta ese momento.

8.3 PROGRAMAS ROBUSTOS

Cualquier programa deber ser:


o Correcto: Los resultados que d son los esperados.
o Claro: Cualquier programador pueda entender como est estructurado.
o Eficiente: Que consume los mnimos recursos en cuanto a tiempo y memoria. Se dice
que un programa es robusto si controla sus operaciones aunque le introducimos datos
incorrectos y errneos.
-Programacin a la defensiva: Es una forma de diseo defensivo aplicada al diseo de
programas que busca garantizar el comportamiento de todo elemento de una aplicacin ante
cualquier situacin de uso por incorrecta o imprevisible que sta pueda parecer. En general,
esto supone multiplicar las comprobaciones que hacen en todos los mdulos programados, con
la consiguiente penalizacin en carga de procesador, tiempo y aumento de la complejidad del
cdigo.
Las tcnicas de programacin defensiva se utilizan especialmente en componentes crticos, en
los que un mal funcionamiento, ya sea por descuido o por un ataque malicioso, podra tener
consecuencias graves. La programacin defensiva es un enfoque que busca mejorar el software
y el cdigo fuente, en trminos de:
o Calidad, reduciendo el nmero de fallos de software y, en consecuencia, problemas.
o Haciendo el cdigo fuente comprensible (el cdigo fuente debe ser legible y
comprensible, a prueba de una auditora de cdigo.
o Hacer que el software se comporte de una manera predecible a pesar de entradas o
acciones de usuario inesperadas.
8.3.1 Tratamiento de excepciones:
Ante la posibilidad de errores con los datos que se opera a un programa, hay que considerar
dos actividades diferentes:
a) Deteccin de situacin de error-
b) Correccin de la situacin de error.
En C+- la sentencia throw provoca una terminacin de un subprograma para excepcin:
void operacion (argumentos) {
... ....
}
accion1
if (error1) {
throw excepcion1; / * Finaliza con una excepcin * /
} ...
accion2 if (error2) {
throw excepcion2; / * Finaliza con una excepcin * /
} ...
}

TEMA 9 -.- DEFINICIN DE TIPOS

A parte de los tipos de datos predefinidos en C+- (int, char, float..) el programador tambin
puede definirse sus propios tipos de datos con el uso de la instruccin typedef, por ejemplo
Typedef int TipoEdad;
Typedef char TipoSexo;
Typedef float TipoAltura;

Una vez declarados los tipos se pueden definir y declarar variables de esos tipos que acabamos
de definir, por ejemplo sera valido:
TipoEdad edad1, edad2;
TipoSexo sexo;
TipoAltura altura;
Y podramos utilizar estas variables como las variables que hemos visto hasta ahora:
Edad2= edad1 + 10;
Sexo = H;
Altura = 1,72;

9.1 TIPO ENUMERADO


Podemos definir una lista de valores con los tipos predefinidos y con los tipos que el
programador cree. Esta lista tomar valores numricos automticamente empezando por el
valor 0 y hasta n-1.
Typedef enum {Lunes,Martes,Miercoles,Jueves,Viernes,Sabado,Domingo};
Los tipos enumerados se consideran tipos ordinales (al igual que los int y char), ya que tienen
un orden establecido de antemano.
Como los tipos enumerados son ordinales, podemos utilizarlos en comparaciones como por
ejemplo:
If ( mes >= Julio) { }
Para hacer referencia al lugar que ocupa un elemento en la lista lo hacemos as:
Int (abril)>3
Podemos ir pasando de un elemento a otro de una lista enumerada de la siguiente manera:
Dia= jueves;
Dia = tipodia(int(dia)+1);

Tipo predefinido bool
El tipo predefinido bool se puede considerar como un tipo enumerado con dos valores:
Typedef enum bool {false,true};
Se cumple que false=0 y true=1.

9.2 TIPOS ESTRUCTURADOS


Un tipo estructurado de datos, o estructura de datos, es un tipo cuyos valores se construyen
agrupando datos de otros tipos ms sencillos. Los elementos de informacin que integran un
valor estructurado se denominan componentes. Todos los tipos estructurados se definen, en
ltimo trmino, a partir de tipos simples combinados.

9.3 TIPO FORMACION Y SU NECESIDAD


Estas estructuras se denominan genricamente formaciones (en ingles array) y permiten la
generalizacin de la declaracin, referencia y manipulacin de colecciones de datos todos del
mismo tipo.

9.4 TIPO VECTOR


Est constituido por una serie de valores, todos ellos del mismo tipo, a los que se les da un
nombre comn que identifica a toda la estructura globalmente. Cada valor concreto dentro de
la estructura se distingue por su ndice o nmero de orden que ocupa en la serie.
DECLARACIN: Se declara de la siguiente forma:
typedef TipoElemento TipoVector{NumElemtos}

donde TypoVector es el nombre del nuevo tipo de vector que se declara y NumElementos es un
valor constante que indica el nmero de elementos que constituyen el vector. El tamao del
array estar comprendido entre 0 y NumElementos-1. TipoElemento corresponde al tipo de
dato de cada uno de los elementos del vector y puede ser cualquier tipo de dato predefinido del
lenguaje o definido por el programado.
INICIALIZACIN: En el caso de un vector la inicializacin afecta a todos sus elementos y por
tanto la notacin es algo especial y en ella se indica el valor inicial de todos los elementos
agrupndolos entre llaves {..} y separndolos por comas (,).

TipoAgenda agendaUno = { Lunes, Martes, Mircoles, Jueves, Viernes..};
OPERACIONES CON VECTORES: La mayora de las operaciones interesantes con vectores hay
que realizarlas operando con sus elementos uno por uno. La referencia a un elemento concreto
de un vector se hace mediante el nombre del vector seguido, entre corchetes, del ndice del
elemento referenciado.
VectorUno[0]; // frase[13];
Un elemento de un vector puede formar parte de cualquier expresin con constantes, variables
u otros elementos.

9.5 VECTOR DE CARACTERES


Las cadenas de caracteres son en realidad vectores de caracteres. En C+- cualquier tipo vector
cuya declaracin sea de la forma:

Typedef char Nombre [N];
se considera una cadena o string, con independencia de su longitud particular, esto es, del valor
de N. Es un vector en el que se pueden almacenar textos de diferentes longitudes (si caben).
Para distinguir la longitud til en cada momento se reserva siempre espacio para un carcter
ms, y si hace que toda cadena termine con carcter nulo \0 situado al final.

Typedef char Cadena20[21];

FUNCIONES:
Strcpy( c1,c2 ) Copia c2 en c1
Strcat ( c1,c2 ) Concatena c2 a continuacin de c1
Strlen( c1 ) Devuelve la longitud de c1
Strcmp ( c1,c2 ) Compara c1 y c2

9.6 TIPO TUPLA Y SU NECESIDAD

Otra forma de construir un dato estructurado consiste en agrupar elementos de informacin


usando el esquema de tupla o agregado. En este esquema el dato estructurado est formado por
una coleccin de componentes, cada uno de los cuales puede ser de un tipo diferente.
Por ejemplo, una fecha se escribe habitualmente como un dato compuesto de los elementos,
da, mes y ao.
Tupla: Coleccin de elementos componentes, de diferentes tipos, cada uno de los cuales se
identifica por un nombre.
Un aspecto importante del empleo de datos estructurados corresponde al punto de vista de
abstraccin. Una tupla, como cualquier otro dato compuesto, puede verse de forma abstracta
como un todo, prescindiendo del detalle de sus componentes. La posibilidad de hacer
referencia a toda la coleccin de elementos mediante un nombre nico correspondiente al dato
compuesto simplifica en muchos casos la escritura del programa que lo maneja.


9.7 TIPO REGISTRO (STRUCT)
Los esquemas de tupla pueden usarse en programas en C+- definindolos como estructuras del
tipo registro o struct. Un registro struct es una estructura de datos formada por una coleccin
de elementos de informacin llamados campos.
DEFINICIN DE REGISTROS: se hace utilizando la palabra clave struct:

Typedef struct Tipo-registro {

Tipo-campo1 nombre-campo1;

Tipo-campo2 nombre-campo2;

.

};
Cada una de las parejas Tipo-campo y nombre-campo, separadas por punto y coma, define un
campo o elemento componente y su correspondiente ipo. Adems hay que tener en cuenta que
la estrucutra acaba siempre con punto y coma:

Typedef enum TipoMes {

Enero, febrero

};
VARIABLES DE TIPO REGISTRO Y SU INICIALIZACIN: Para declara variables de tipo
registro es necesario haber realizado previamente la deinicin del tipo del registro. No se
permite declarar variables de tipo annimo.

TipoFecha ayer, hoy;

TipoPunto punto1, punto2;

TipoFecha hoy = {12 ,Marzo,2009};
USO: Al manejar datos estructurados de tipo registro se dispone de dos posibilidades. Operar
con el dato completo, o bien operar con cada campo por separado. Las posibilidades de operar
con el dato completo son bastante limitadas. La nica operacin admisible es la de asignacin.
En estas asignaciones debe cumplirse la compatibilidad de tipos. No es suficiente la
compatibilidad estructural, es decir, dos estructuras con los mismos campos no son
compatibles si sus definiciones se hacen por separado.
ACCESO A UNA ESTRUCTURA: Dado que los campos de una estructura se procesa
generalmente de forma individual, deber poder acceder a cada uno de estos campos
individualmente. Para acceder a un determinado campo para poder leer o escribir en l
haremos: variable.campo

TEMA 10-.- AMPLIACIN DE ESTRUCTURAS DE CONTROL


10.1 ESTRUCTURAS COMPLEMENTARIAS DE ITERACIN
10.1.1 Repeticin: sentencia DO
A veces resulta mas natural comprobar la condicin que controla las iteraciones al finalizar
cada una de ellas, en lugar de hacerlo al comienzo de las mismas. La condicin que controla
las repeticiones es una expresin cuyo resultado es un valor de tipo bool. Si el resultado es
true se vuelve a ejecutar la accin y cuando el resultado es false finaliza la ejecucin de la
estructura.
Do {
Operaciones.
Printf (otra operacin);
Scanf(% &tecla);
} while (tecla== s);


10.1.2 Sentencia continue
Esta sentencia dentro de cualquier bucle (while, for o do) finaliza la iteracin en curso e
inicia la siguiente iteracin. A veces dependiendo de la evolucin de los clculos realizados
en una iteracin, no tiene sentido completar la iteracin que se est realizando y resulta ms
adecuado iniciar una nueva.
For (int i = 0; i < N; i++){
If (vectorCoeficientes[i] == 0){

Continue;
}
calculo = calculo / vectorCoeficientes[i];
}

10.2 ESTRUCTURAS COMPLEMENTARIAS DE SELECCIN


El if es una estructura de seleccin pero cuando tenemos que hacer muchos if anidades se
vuelve inestable y difcil de entender para resolver este problema utilizaremos el switch.

10.2.1 Sentencia SWITCH


Cuando la seleccin entre varios casos alternativos depende del valor que toma una
determinada variable o del resultado final de una expresin, es necesario realizar
comparaciones de esa misma variable o expresin con todos los valores que puede tomar,
uno por uno, para decidir el camino a tomar.
Switch (expresion) {
Case valor1:

Accin A;
Break;
Case valor2:
Case valor3:

Accion B;
Break;

}
La sentencia comienza con la palabra clave switch y a continuacin, entre parntesis, se
indica la expresin, despus, para cada valor que puede tomar la variable utilizaremos la
palabra clave case seguido del valor que pueda tomar y dos puntos (:) Y despus la sentencia
a realizar, y para cerrar el case utilizaremos un break. El manual de estilo de C+- impone que
cada accin finaliza siempre con la sentencia break para que finalice la sentencia swith
despus de cada accin. El uso del break es obligatorio para C+- y opcional para C/C++.

TEMA 11-.- ESTRUCTURAS DE DATOS


11.1 ARGUMENTOS DE TIPO VECTOR ABIERTO

Los vectores con un tamao indefinido se denominan vectores abiertos. En C+- los argumentos
de tipo vector abierto se especifican de manera similar a una declaracin de tipo vecotr,
omitiendo el tamo explicito pero no los corchetes (^*): const int V[ ];
El precio que hay que pagar por disponer de esat facilidad es tener que pasar siempre la
longitud concreta del vector como argumento, en cada llamada.

EscribirVectorAbierto (vectorDos, NumeroElementos);

11.2 FORMACIONES ANIDADAS. MATRICES


11.2.1 Declaracin de matrices y uso de sus elementos
Las matrices son estructuras de tipo formacin (array) de dos o ms dimensiones. Una
forma sencilla de plantear la definicin de estas estructuras es considerarlas como vectores
cuyos elementos son a su vez vectores. Los vectores multidimensionales ms utilizados son
los bidimensionales o matrices, los cuales vendrn definidos por dos ndices ( normalmente,
fila y columna).
DEFINICIN: const int NFILAS=4;
Const int NCOL=5;
Typedef int TipoElemento;
Typedef TipoElemento TipoFila [NCOL];
Typedef TipoFila TipoMatriz [NFILAS];
Una vez tenemos definido el TipMatriz ya podemos definir una variable de ese tipo:

TipoMatriz tabla1, tabla2;
La definicin de tipos que hemos hecho la podramos simplificar:

Typedef int TipoMatriz [4] [5];

TipoMatriz tabla1,tabla2;

OPERACIONES: Las operaciones con elementos individuales de una matrid pueden hacerse
directamente, de forma anloga a la operacin con variables simpes de ese tipo. En cambio
las operaciones globales con matrices han de plantearse de manera similar a las operaciones
globales con vectores. En general se operar elemento a elemento, o a lo sumo por filas
completas.

11.3 EL ESQUEMA UNIN


Hay aplicaciones en las que resultara deseable que el tipo de un dato variase segn las
circunstancias. Si las posibilidades de variacin son un conjunto finito de tipos, entocnes se
puede decir que el tipo del dato corresponde a un esquema que es la unin de los tipos
particulares posibles. Cada uno de los tipos particulares constituye una variante o alternativa
del tipo unin. Como situaciones tpicas en las que se pueden aplicar los esquemas unin
tenemos:
Datos que pueden representarse de diferentes maneras.
Programas que operan indistintamente con varias clases de datos.
Datos estructurados con elementos opcionales.
Ejemplo: numero_general = entero | fraccin | real
11.3.1 El tipo unin
Un tipo unin se define como una coleccin de campos alternativos, de tal manera que cada
dato particular slo usar uno de esos campos en un momento dado, dependiendo de la
alternativa aplicable. La definicin es similar a la de un agregado o struct, usando ahora la
palabra clave unin:

Typedef unin TipoNumero {


Int valorEntero;


Float valorReal;


TipoFraccion valorRacional;
};
La referencia a los elementos componentes se hace tambin como en los tipos struct:

Tiponumero numero, otro, fraccion1, fraccion2;


Numero.valorentero = 33;

Otro.valorreal = float (numero.valorentero);

Fraccion2.valorracional = fraccion1.valorracional;
Como se ha dicho, slo una de las variantes puede estar vigente en un momento dado. Si
asignamos valor a una de ellas ser sta la que exista a partir de ese momento, al tiempo que
dejan de existir las dems.
11.3.2 Registros con Variantes
El hecho de que un dato de tipo unin deba ir acompaado de informacin complementaria
para saber cul es la variante aplicable hace que los tipos unin aparezcan casi siempre
formando parte de estructuras mas complejas.
Un ejemplo es lo que se denomina como registros con variantes. Se trata de agregados o
tuplas en los que hay una coleccin de campos fijos, aplicables en todos los casos, y campos
variantes que se definen segn el esquema unin. Adems suele reservarse un campo fijo
para indicar explcitamente cual es la variante aplicable en cada momento, a esto se le llama
discriminante.

typedef enum ClaseNumero {Enter, Real, Fraccin};
typedef struct TipoFraccio {
int numerador;
int denominador;
}
typedef union TipoValor {
int valorEnter;
float valorReal;
TipoFraccio valorracional; };
typedef struct TipoNumero {
ClaseNumero clase; Campo discriminante
TipoValor valor; }
void EscriureNumero (TipoNumero n) {
switch (n.clase) {
case Enter: printf ("% d", n.valor.valorEnter); break;
case Real: printf ("% f", n.valor.valorReal); break;
case fraccin: printf ("% d /% d", n.valor.valorRacional.numerad oro,
n.valor.valorRacional.denominador); break;
default: printf (?????); }
}

TEMA 12 -.- ESQUEMAS TIPICOS DE OPERACIN CON FORMACIONES


12.1 ESQUEMAS DE RECORRIDO
Consiste en realizar cierta operacin con todos y cada uno de los elementos de una formacin.
Aplicable a vector con cualquier dimensin y mtrices. El forma ms general del esquema de
recorrido sera:

Iniciar operacin


While (quedan elementos sin tratar){



Elegir uno de ellos y tratarlo


}


completar operacin
La terminacin del elemento while est garantizada ya que el nmero de elementos que faltan
por tratar es un valor finito no negativo, que va disminuyendo en cada iteracin.

Para el recorrido de matrices necesitaremos dos for por ejemplo:



For (int=0; i<N;i++){


For (int j=0; j<N; j++){


Z [i][j]=0;


}

}

12.1.1 Recorrido no lineal
En ciertos casos el elemento a procesar debe elegirse realizando ciertos clculos y el
contador de iteraciones sirve fundamentalmente para contabilizar el avance del recorrido y
detectar el final del bucle.

12.2 BUSQUEDA EN UN VECTOR


Una operacin de bsqueda de un elemento en un vector consiste en:
1- Determinar si el elemento pertenece o no al vector.
2- En caso de que el elemento pertenezca al vector determinar cul es su lugar o posicin
en el vector.
Dos de los mtodos ms usuales de bsqueda en vectores son:
Bsqueda secuencial o lineal
Bsqueda binario o dicotmica.
BUSQUEDA SECUENCIAL: consiste en explorar secuencialmente (recorrer) un vector desde
el primer elemento hasta el ltimo y comprobar si alguno de los elementos del vector
contiene el valor buscado (comparar cada elemento con el elemento a buscar).
BUSQUEDA BINARIO o dicotmicos: requiere, para el peor de los casos ( cuando el
elemento a buscar es el ltimo o no se encuentra) recorrer todo el vector y hacer un nmero
de comparaciones igual al tamao del vector.
Para vectores con muchos elementos esta bsqueda quizs no sea muy conveniente.
La bsqueda binaria requiere menos comparaciones (iteraciones) que la secuencial, pero
para realizar la bsqueda es necesario que el vector est previamente ordenado.
La bsqueda binario consiste en:
En la primera repeticin analizamos el elemento central del vector
Si el valor a buscar coincide con este central ya se ha acabado de buscar.
Si el valor a buscar es menor que el central se buscar en el tramo izquierdo al
central en uso de la misma tcnica, y sino se buscar en el tramo derecho.
En la segunda repeticin el tramo a buscar es la mitad (izquierda o derecha al
central) del vector y el elemento a evaluar es el central de este nuevo tramo.
Estos pasos se repetirn hasta que encontremos el elemento o hasta que el tramo a buscar se
reduce a un elemento y basta.

12.3 INSERCION

El problema que se plantea aqu es insertar un nuevo elemento en una coleccin de elementos
ordenados, manteniendo el orden de la coleccin. Tenemos elementos almacenados en un
vector, ocupando posiciones desde el principio hasta el final quedando libre algunos elementos
del final.
La operacin se puede realizar de forma iterativa, examinando los elementos empezando por el
final hasta encontrar uno que sea inferior o igual al que se quiere insertar. Los elementos
mayores que el que se quiere insertar se van moviendo una posicin hacia delante, con lo que
va quedando un huevo en medio del vector. Al encontrar un elemento menor que el nuevo, se
copia el nuevo elemento en el

hueco que hay en ese momento.








12.4 ORDENACIN POR INSERCIN DIRECTA


Aqu se aborda una solucin para la ordenacin de datos almacenados en un vector. El mtodo
ms sencillo es el de ordenacin por insercin directa. Est basado en el esquema de insercin
mostrado en el apartado anterior. Ejemplo: queremos ordenar un vector v de diez elementos (0
a 9) y que inicialmente esta desordenado, {21,5,3,12,65,9,36,7,2,45} Para comenzar el primer
elemento (21) ya est ordenado consigo mismo. Luego extraemos el segundo elemento (5) y se
genera un hueco , que se puede utilizar para ampliar la parte del vector ya ordenada. El mtodo
de ordenacin consiste en insertar el elemento extrado en su lugar correspondiente entre los
elementos ya ordenador. Este proceso se repite con el tercero y sucesivamente.

12.5 SIMPLIFICACIN DE LAS CONDICIONES DE CONTORNO


La programacin de operaciones con vectores, realizadas elemento a elemento, exige con
frecuencia realizar un tratamiento especial de los elementos extremos del vector o, en general,
de los elementos del contorno de una formacin. A continuacin veremos algunas tcnicas
particulares para evitar la necesidad de detectar de manera explicita si se ha llegado a un
elemento del contorno y/o realizar con l un tratamiento especial.

12.5.1 Tcnica del centinela
Por ejemplo, en el procedimiento general de bsqueda es necesario comprobar en cada
iteracin una condicin doble: si no se ha alcanzado todava el final del vector, y si se
encuentra el elemento buscado. La doble condicin del bucle complica el cdigo y supone un
tiempo adicional en la ejecucin de cada operacin.
La tcnica centinela consiste en incluir el dato a buscar en el vector antes de comenzar la
bsqueda. El vector se amplia en +1. Se colocal al final si la bsqueda es hacia delante y
viceversa. Este actuar de centinela y asegura que la bsqueda nunca acaba de manera
infructuosa. El esquema de bsqueda se simplifica a una condicin :


Inicar operacin(colocar centinela)

While (no se encuentre un elemento aceptable) {


Elegir siguiente elemento y ver si es aceptable
}
completar operacin ( si se ha encontrado el centinela, indicare fallo en la bsqueda)

TEMA 13 -.- PUNTEROS Y VARIABLES DINMICAS


Los tipos de datos y variables vistas hasta ahora se llaman estticas, porque su tamao se
especifica al inicio por el programador. El compilador reserva un espacio en memoria constante
para la variable esttica durante toda la ejecucin del programa. En ocasiones no se puede

conocer el tamao de las variables, en estos casos habr que hacer uso de variables dinmicas.
Estas estructuras se caracerizan por la reserva y liberacin de memoria que se realiza durante
la ejecucin del programa, y este espacio puede variar.

13.1 LA ESTRUCTURA SECUENCIA


Puede definirse como un esquema de datos del tipo iterativo, pero con un nmero variable de
componentes. La estructura secuencia resulta parecida a una formacin con nmero variable
de elementos. Hay 2 tipos de operaciones:

Operaciones de construccin:
Aadir o retirar componentes al principio de la secuencia.
Aadir o retirar componentes al final de la secuencia.
Aadir o retirar componentes en posiciones intermedias de la secuencia.
Operaciones de acceso:
Acceso secuencial: las componentes deben tratarse una por una, en el orden en
que aparecen en la secuencia.
Acceso directo: se puede acceder a cualquier componente directamente
indicando su posicin, como en una formacin o vector.
Para el caso de acceso secuencial, el tratamiento de una secuencia se realiza empleando un
cursor. El cursor es una variable que seala a un elemento de la secuencia. El acceso, insercin o
eliminacin de componentes de la secuencia se hace actuando sobre el elemento sealado por
el cursor. Para actuar sobre el cursor se suelen plantear las siguientes operaciones:
Iniciar: Pone el cursor sealando al primer elemento
Avanzar: El cursor pasa a sealar al siguiente elemento.
Fin: Es una funcin que indica si el cursor ha llegado al final de la secuencia.

13.2 VARIABLES DINAMICAS.


Una manera de realizar estructuras de datos ilimitadas es mediante el empleo de variables
dinmicas. No se declara como tal, sino que se crea en el momento necesario, y se destruye
cuando ya no se necesita. No tienen nombre, sino que se designan mediante otras variables
llamadas punteros o referencias.
13.2.1 Punteros
Son variables simples cuyo contenido es precisamente una referencia a otra variable. El
valor de un puntero no es representable como nmero o texto. En su lugar usaremos una
representacin grfica en la que utilizaremos una flecha para enlazar una variable de tipo
puntero con la variable a la que hace referencia.

Variable
Puntero
apuntada
Declaracin
de punteros: El tipo de
puntero especifica en realidad el tipo de variable a la que puede apuntar.
Typedef tipo-de-variable* tipo-puntero;
Una vez declarado el tipo, se pueden declarar variables puntero de dicho tipo. Una variable
puntero se puede usar para designar la variable apuntada mediante la notacin:
*puntero
Ejemplo:
Typedef int* tp_entero;
Tp_entero pe;
*pe = 33;
printf (%d,*pe);

Estas sentencias asignan el valor 33 a la variable dinmica sealada por el puntero pe, y
luego la imprime.
Para poder detectar si un puntero seala realmente o no a otra variable, existe el valor
especial NULL (no es una palabra clave, esta dentro de la librera stdlib.h) Este valor es
compatible con cualquier tipo de puntero, e indica que el puntero no seala a ninguna
variable. Se usar para inicializar las variables de tipo puntero al comienzo del programa:
If (*pe = NULL) {

*pe = 33;

printf (%d, *pe);
}
13.2.2 Uso de variables dinmicas
Las variables dinmicas no tienen reservado el espacio en memoria que tienen las dems
variables, sino que se crean a partir de punteros en el momento en que se indique. Una vez
creadas siguen existiendo incluso despus de que termine la ejecucin del subprograma
donde se crean. Se crean as:

Typedef Tipo-de-variable* tipo-puntero;

Tipo-puntero puntero;

Puntero = new tipo-de-variable;
El operador new crea una variable dinmica del tipo indicado y devuelve una referencia
que puede asignarse aun puntero de tipo compatible.
La variable dinmica se crea a base de reservarle el espacio necesario en una zona general
de memoria gestionada dinmicamente. En principio no se puede asumir que la variable
recin creada tenga un valor concreto, igual que las variables normales que se declaran sin
un valor inicial explicito.
Una vez creadas siguen existiendo hasta que el programador no especifique que ya no se
necesita. Para ello existe la sentencia delete, que permite destruir la variable dinmica:

Delete puntero;

13.3 REALIZACIN DE SECUENCIAS MEDIANTE PUNTEROS o Lista enlazada

Los punteros son un elemento de programacin de muy bajo nivel. Los lenguajes de
programacin simblicos deberan evitar su empleo, sustituyendo por mecanismos mas
potentes de declaracin de estructuras de datos, que permitiesen definir directamente
estructuras dinmicas ilimitadas.
Para crear una secuencia ilimitada tendremos que recurrir al empleo de variables dinmicas y
punteros, enlazando cada elemento de la secuencia con el siguiente. Cada elemento de la
secuencia se materializa como un registro con dos campos: el primero contiene el valor de una
componente, y el segundo es un puntero que seala al siguiente. El ltimo apuntar a NULL.
Una lista es una esctructura de datos dinmica formada por un conjunto de elementos,
llamados nodos, del mismo tipo y almacenados en la memoria principal siguiendo una
secuencia lgica.
Podemos distinguir:
Listas contiguas: Son aquellas en las que los elementos se guardan en posiciones de
memoria contiguas, de forma que equivalen a tablas o vectores unidimensionales . Las
operaciones que podemos hacer en una lista contigua son:
o Ordenarla
o Copiar una lista origen a un
o Buscar un elemento
destino
o Aadir un elemento
o Concatenar varias listas
o Eliminar un elemento
o Dividir una lista en sublistas
o Borrar la lista completa

Listas enlazadas: Son aquellas en la que los elementos se encuentran almacenados en


posiciones de memoria no contiguas. Cada nodo es equivalente a un struct (registro) y
est formado por dos campos:
o Campo valor, que es el campo que contiene el dato
o Campo siguiente: es el campo que acta de enlace con el siguiente nodo de la lista en
secuencia lgica.
Para definir un nodo:

Typedef struct tiponodo {


Tipo_elemento valor:


Tiponodo* siguiente;

};

13.4 PUNTEROS Y PASO DE ARGUMENTOS


Como cualquier otro dato, un puntero puede pasarse como argumento a un subprograma. Por
defecto, los datos de tipo puntero se pasan como argumentos por valor. Si se desea usar un
subprograma para modificar datos de tipo puntero, entonces habr que pasar el puntero por
referencia.

13.4.1 Paso de argumentos mediante punteros
En general el valor de un puntero en s mismo no es significativo, sino que el puntero es
slo un medio para designar la variable apuntada. Desde un punto de vista conceptual el
paso de un puntero como argumento puede ser considerado equivalente a pasar como
argumento la variable apuntada.
La dificultad reside en el hecho de que pasar un puntero por valor no evita que el
subprograma pueda modificar la variable apuntada.

TEMA 14-.- TIPOS ABSTRACTOS DE DATOS (TAD)

Concepto: Si identifica el concepto de tipo de dato con el del conjunto de valores que pueden
tomar los datos de este tipo.
Un enfoque mas moderno de la programacin trata de asociar la idea de tipo de datos con la
clase de valores, abstractos, que pueden tomar los datos. Esto quiere decir que la
representacin o codificacin particular de los valores no cambia, el tipo del dato considerado.

En el enfoque actual de la programacin se identifican los tipos de datos de forma
completamente abstracta, llegando a la idea de tipo abstracto de datos (TAD). Esto quiere decir
que un programa que use ese tipo de datos no debera necesitar ningn cambio por el hecho de
modificar la representacin o codificacin de los valores de ese tipo. Si analizamos con cuidado
que necesita un programa para poder usar datos de un tipo, encontramos que hace falta:
o Hacer referencia al tipo en s, mediante un nombre, para poder definir variables,
subprogramas, etc.
o Hacer referencia a algunos valores particulares, generalmente como constantes con
nombre.
o Invocar operaciones de manipulacin de los valores de ese tipo, bien usando operadores
en expresiones aritmticas o bien mediante subprogramas.
El conjunto de todos estos elementos constituye el tipo abstracto de datos (TAD):


Un tipo abstracto de datos es una agrupacin de una coleccin de valores y una coleccin
de operaciones de manipulacin.
Es importante comprender que estas colecciones son cerradas, es decir slo se deben poder
usar los valores abstractos y las operaciones declaradas para ese tipo. Adems los detalles de
cmo se representan los valores y cmo se implementan las operaciones pueden estar ocultos
para quien utiliza el tipo abstracto.

14.1 REALIZACIN DE TIPOS ABSTRACTOS EN C+-

DEFINICION: De esta manera se pueden definir tipos abstractos de datos, ya que:


o Los campos de datos sirven para almacenar el contenido de informacin del dato
abstracto.
o Los subprogramas permiten definir operaciones sobre esos datos.
o La posibilidad de declarar ciertos elementos como privados permite ocultar detales de
implementacin, y dejar visible slo la interfaz del tipo abstracto.

Ejemplo de TAD
typedef struct TipoPunto {
float x;
float y;
void Leer ();
void Escribir ();
float Distancia (TipoPunto p);
};
A parte de definir dentro del registro los procedimientos y funciones estos subprogramas
deben implementarse fuera del registro (fuera del .h) de la siguiente manera:
void TipoPunto::Leer( ) {
printf ("Coordenada X?");
scanf ("% f", & x);
printf ("Coordenada Y?");
scanf ("% f", & y);
}
void TipoPunto::Escribir( ) {
printf ((%f, %f), x, y);
}
float TipoPunto::Distancia (TipoPunto p) {
float deltaX, deltaY;
deltaX = xp.x;
deltaY = yp.y;
}
return sqrt (deltaX * deltaX + deltaY * deltaY);
}

14.2 OCULTACIN
Para que un tipo sea realmente abstracto hara falta que los detalles de implemtenacin no
fueran visibles. Tanto en los campos como en los procedimientos. En el caso anterior del
TipoPunto los campos x e y son visibles en todo momento, y pueden funcionar consultados y
modificados por el cdigo que usa el tipo.

Para permitir esta ocultacin los tipos struct admiten la posibilidad de declara ciertos
elementos componentes como privados, utilizando la palabra clave private para delimitar una
zona de declaraciones privadas dentro de la estructura.
Ejemplo
typedef struct TipoData {
void pone (int da, int mes, int ao);
int Da ();
int Mes ();
int Ao ();
void Leer ();
bool EsCorrecta (int da, int mes, int ao);
........
private:
int da, mes, ao;
};
Las variables dia, mes y ao slo son visibles (accesibles) desde las funciones y procedimientos que
estn definidos dentro de la estructura, ya que estn definidas con el modificador private.

14.3 METODOLOGA BASADA EN ABSTRACCIONES

La tcnica de programacin estructurada, basada en refinamientos sucesivos, puede ampliarse


para contemplar la descomposicin modular de un programa. La metodologa de desarrollo
ser esencialmente la misma que se ha presentado anteriormente. La diferencia es que ahora
disponemos tambin de un nuevo mecanismo de abstraccin, que son los tipos abstractos de
datos.
En cualquier caso el desarrollo deber atender tanto a la organizacin de las operaciones como
a la de los datos sobre los que operan, de manera que habr que ir realizando simultneamente
las siguientes actividades:
o Identificar las operaciones a realizar, y refinarlas.
o Identificar las estructuras de informacin y refinarlas.
14.3.1 Desarrollo por refinamiento basado en abstracciones
En cada etapa de refinamiento de una operacin hay que optar por una de las alternativas
siguientes:
o Considerar la operacin como operacin terminal, y codificarla mediante sentencias
del lenguaje de programacin
o Considerar la operacin como operacin compleja, y descomponerla en otras ms
sencillas.
o Considerar la operacin como operacin abstracta, y especificarla, escribiendo ms
adelante el subprograma que la realiza.
Ahora podemos reformular estas opciones para las estructuras de datos a utilizar:
o Considerar el dato como un dato elemental, y usar directamente un tipo predefinido
del lenguaje para representarlo.
o Considerar el dato como un dato complejo, y descomponerlo en otros ms sencillos
(como registro, unin o formacin).
o Considerar el dato como un dato abstracto y especificar su interfaz, dejando para
ms adelante los detalles de su implementacin.

TEMA 15 -.- MDULOS

CONCEPTO: un mdulo es un fragmento de programa desarrollado de forma independiente


(diseado y compilando de forma independiente del programa que lo va a utilizar). El concepto

de mdulo est ntimamente asociado a la abstraccin de datos. Cuando utilizamos un mdulo a


un programa, solo hay que saber que hace el mdulo y sus funciones, pero no tenemos por qu
saber cmo esta implementado.
La razn de exigir compilacin por separado para los distintos mdulos de un programa
obedece a la necesidad de limitar la complejidad de aquello que est siendo elaborado por una
persona en un momento dado. El programador podr concentrarse en el mdulo prescindiendo
en parte de cmo se utiliza ese modulo desde el resto del programa.
El concepto de mdulo esta ntimamente ligado al concepto de abstraccin.
ESPECIFICACIN Y REALIZACIN: Al igual que en cualquier elemento abstracto, en un mdulo
podemos distinguir:
o La especificacin del modulo es todo lo que se necesita para poder usar los elementos
definidos en l. (que hace el mdulo) (interfaz)
o La realizacin del modulo consistir en la realizacin de cada uno de los elementos
abstractos contenidos en dicho modulo.(como lo hace).
15.1.1 Compilacin separada
Los lenguajes de programacin que permiten programar usando mdulos pueden emplear
diversas tcnicas para definirlos e invocar los elementos definidos en ellos.
o Compilacin separada: El programa est formado por varios ficheros fuente, cada uno de
los cuales se compila por separado.
o Compilacin segura: Al compilar un fichero fuente el compilador comprueba que el uso
de elementos de otros mdulos es consistente con la interfaz.
o Ocultacin: Al compilar un fichero fuente el compilador no usa informacin de los
detalles de realizacin de los elementos de otros mdulos.
15.1.2 Descomposicin modular
La posibilidad de compilar mdulos de forma separada permite repartir el trabajo de
desarrollo de un programa, a base de realizar su descomposicin modular. Los diferentes
mdulos pueden ser encargados a programadores diferentes y gracias a ello todos pueden
trabajar al mismo tiempo.
De esta forma se puede desarrollar en un tiempo razonable los grandes programas
correspondientes a las aplicaciones de hoy dia, que totalizan cientos de miles o millones de
sentencias.
La descomposicin modular puede reflejarse en un diagrama de estructura.


A


B


En este diagrama se representa
cada mdulo
como un rectngulo, con el
nombre del mdulo en su
C interior.
D
Las lneas indican las relaciones
de uso,
pueden llevar punta de flecha
si es necesario indicar expresamente cul es el sentido de la relacin. Normalmente no es
necesario, pues, como en este caso, un mdulo que usa otro se dibuja por encima de l. Las
lneas se interpretan en la direccin de arriba abajo.
El objetivo de la ingeniera de software es facilitar el desarrollo de una aplicacin de forma
organizada, de manera que muchas personas puedan colaborar simultneamente en un mismo
proyecto. Para que la descomposicin en mdulos sea adecuada, desde un punto de vista,
conviene que los mdulos resulten tan independientes unos de otros como sea posible. Esta
independencia se analiza segn dos criterios, denominados acoplamiento y cohesin.

o El acoplamiento entre mdulos indica cuntos elementos distintos o caractersticas de


uno o varios mdulos han de ser tenidos en cuenta a la vez al usar un mdulo desde
otro. Este acoplamiento debe reducirse a un mnimo.
o La cohesin indica el grado de relacin que existe entre los distintos elementos de un
mismo mdulo, y debe ser lo mayor posible. Esto quiere decir que dos elementos
ntimamente relacionados deberan ser definidos en el mismo mdulo, y que un mismo
mdulo no debe incluir elementos sin relacin entre s.

15.2 MDULOS EN C+-


Un programa descompuesto en mdulos se escribe como un conjunto de ficheros fuente
relacionados entre s, y que pueden compilarse por separado. Cada fichero fuente constituye
as una unidad de compilacin.

15.2.1 Proceso de compilacin simple
Un fichero fuente es un fichero de texto que contiene el cdigo de una unidad de compilacin,
es decir, es posible invocar el compilador dndole como entrada solo ese fichero fuente.
La compilacin de un fichero fuente produce un fichero objeto que contiene la traduccin del
cdigo C+- a instrucciones de mquina. Los ficheros fuente tienen la extensin .cpp, los ficheros
objeto la extensin .o.



..cpp
.o
.exe
compilador
Montador



15.2.2 Mdulo principal
Cuando se descompone un programa en mdulos uno de ellos debe ser el mdulo principal uno
de ellos ha de ser el programa principal (main).

15.2.3 Mdulos no principales
No permiten generar un programa ejecutable por s solos ( sin main). Estn destinados a ser
usados por el programa principal. Hay que distinguir los elementos pblicos y los privados. La
distincin de estos elementos se hace repartiendo el cdigo del modulo en dos ficheros fuente
separados: un fichero interfaz (.h) o fichero de cabecera, y un fichero de implementacin (.cpp).
Los ficheros de cabecera (.h) se deben incluir en los ficheros de implenteacin (cpp) y esto se
hace con la directiva #include que sirve para hacer referencia a un fichero fuente desde otro, y
tiene como parmetro el nombre dl fichero fsico (.h) incluyendo la extensin.
15.2.4 Uso de mdulos
Para usar los elementos pblicos definidos en un mdulo hay que incluir la interfaz de ese
mdulo en el cdigo donde se vaya a utilizar, con la directiva #include. La novedad ahora es que
los nombres de los ficheros de la propia aplicacin deben escribirse entre comillas (.) y no
entre ngulos (<>). Con esto se indica al compilador que debe buscar dichos ficheros en
donde reside el cdigo fuente de la aplicacin y no donde est instalada.

15.2.5 Declaracin y definicin de elementos pblicos
En la declaracin de un elemento hay que especificar lo necesario para que el compilador pueda
compilar correctamente el cdigo que usa dicho elemento.

En la definicin de un elemento hay que especificar lo necesario para que el compilador genere
el cdigo del propio elemento.
o Los tipos y constantes se especifican totalmente en el fichero de interfaz. No hay
declaracin y definicin separadas.
o Las variables se definen de la manera habitual en el fichero de implementacin,
incluyendo la especificacin de valor inicial en su caso. En el fichero de interfaz se pone
adems una declaracin que indica el tipo y el nombre de la variable, sin indicar valor
inicial, y precedida de la palabra clave extern.
o Los subprogramas se definen de la manera habitual en el fichero de implementacin y
permiten al compilador generar el cdigo objeto del subprograma. En el fichero de
interfaz se pone adems una declaracin en forma de prototipo o cabecera de
subprograma slo con el tipo, nombre y argumentos.

15.3 DEPENDENCIAS ENTRE FICHEROS


Las relaciones de uso entre mdulos se corresponden, con las directivas #include usadas en un
fichero fuente para hacer visibles los elementos de otro, y que pueden aparecer en el fichero
.cpp y/o en el .h. La recomendacin es:
o Un fichero xxx.h debe incluir otros yyy.h que use directamente.
o Un fichero xxx.cpp debe incluir su propio xxx.h y otros yyy.h que use directamente.

15.3.1 Datos encapsulados
Cuando definimos un tipo abstracto de datos, luego hay que declarar variables de ese tipo para
poder trabajar con ellas.
Los datos encapsulados nos permiten declarar dentro de un mdulo una variable y evitar una
declaracin explicita externa.
Por ejemplo, el mdulo de implementacin pondramos:
Static Untipo valorInterno;
Static void Operacion3 ( ) {
..valor interno..
}
void Operacion1 ( ) {
..valor interno.
}
void Operacion2 ( ) {
.valor interno.
}
Hay que recordar que por defecto las variables y subprogramas definidos en el nivel ms
externo de un mdulo son globales por defecto. Para que sean tratados como locales hay que
poner delante de ellos la palabra static.

You might also like