You are on page 1of 75

TEMA_1 ---------------------------------- Introduccin

1. Mquinas y programas Qu es la Informtica? Ciencia que estudia el tratamiento automtico y racional de la informacin. Qu es un sistema informtico? Es el conjunto de elementos necesarios para llevar a cabo el tratamiento automtico de la informacin. Partes de un sistema informtico Mquina (Hardware) Programa (Software): Programas base Programas de aplicacin Programa + Mquina base = (PC ms el sistema operativo) Computador = sistema informtico = mquina programable 2. 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

3. 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 Diferencias entre ellos? 1

Archivo fuente COMPILADORES Archivo ejecutable nombre.cpp nombre.exe

Escribimos el programa con el cdigo correspondiente (archivo fuente):

Compilamos el fichero fuente:

Una vez ya tenemos el programa compilado sin ningn error ya podemos ejecutarlo:

4. 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)

TEMA_2 --------------- Elementos_bsicos


1. Notacin BNF (Backus-Naur Form) Es el conjunto de reglas gramaticales en las que se basa un lenguaje de programacin. Para describir estas reglas se utilizan una serie de metasmbolos: :: = Metasmbolo de definicin | Metasmbolo de alternativa { } Metasmbolo de repeticin [ ] Metasmbolo de opcin ( ) Metasmbolo 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. Ejemplo: Elementos bsicos BNF (Pg 435 del libro) Valor_entero ::= [+ | -] secuencia_dgitos Secuencia_digitos ::= Digito {Digito} Digito ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Valor_real ::= Valor_entero [Secuencia_digitos] [Escala] Escala ::= E Valor_entero Etc, ... 2. Valores y tipos Datos de entrada Programa Datos de salida

3. 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. Tamao de palabra Rango de valores enteros 16 bits -32768 ... 0 ... 32768 32 bits -2147483648 ... 0 ... 2147483648 64 bits -9223372036854775808 ... 0 ... 9223372036854775808 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> Las operaciones que podemos hacer con estos datos son: Ejemplo x%y x/y x*y x-y x+y Significado Mdulo o resto Divisin Multiplicacin Resto Suma Operador % / * +

Con los enteros se cumplir siempre: a = b * (a / b) + (a% b) 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. Tamao de palabra y precisin 32 bits; 6 cifras decimales Rango de valores enteros -3.4E +38 ..- 1.2E-38 O 1.2E-38 .. +3.4 E +38 -1.7E +308 ..- 2.3E-308 O +2.3 E-308 .. +1.7 E +308

64 bits; 15 cifras decimales

Para valores reales no se cumple siempre que: (a / b) * b = a 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): 2

int ("A") 65

int ("Z") 90

Evidentemente se cumplir:
char (int (c)) = c int (char (x)) = x

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 4. Expresiones aritmticas Si no se utilizan parntesis el orden de prioridad en una expresin es: 1. Operadores multiplicativos * / % 2. Operadores aditivos + Ejemplos:
5 * 30 + 5 = 155 float (45) = 45.0 334 / 6 % 4 * 5 = 15 int (56.8) = 56 -5 * 10% 3 / 2 = -1 nt (33.7) / 5 = 6 33 / int(5.3) = 6 25 * int (3.5) = 75

5. 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); El especificador de formato tendr el siguiente aspecto: % [Flags] [largo] [. Ruego] [h | l | L] tipo 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". Ejemplos: printf ("%d", 120/12) 10 printf ("Resultado = %d", 120/12) Resultado = 10 printf ("Datos: %d # %d", 23 * 67, -50) Datos: 1541 # -50 printf ("Resultado = %5d", 120/12) Resultado = ... 10 printf ("Resultado = %3d", 100 * 34) Resultado = 34000 printf ("Datos: %7d # %5d", 23 * 6, -50) Datos: ... .138 # ..- 50 printf ("Resultado = %10.3f", 1.2) Resultado = ... .. 1.200 printf (Resultado = %10.4e ", 23.1 * 67.4) Resultado = 0.1557E +04 printf ("Resultado =% 15.3g",-50.6E-6) Resultado = ... ..- 0.506E-04 3

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 6. 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 } De momento la estructura que utilizaremos ser esta: / * Comentario del que hace el programa y el autor * / LIBRERIA STANDARD DE ENTRADA Y SALIDA #include <stdio.h> FUNCIN O BLOQUE PRINCIPAL int main () { instrucciones } Ejemplo: /************************************* Programa que muestra una frase por pantalla Autor: Xavi Fontana *************************************/ #include <stdio.h> int main () { printf ("Introduce tu nombre: "); } 4

TEMA_3 --------- Constantes_y_variables


1. Identificadores Datos de entrada Programa Datos de salida 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. La regla BNF para un identificador: ID ::= letra {letra | guin | Dgito} Seran identificadores vlidos: Indice, precio, precio_base, nota1, nota20 No seran vlidos: 3nota, precio$, # Precio, ao, da del mes, 50 C + + distingue entre maysculas y minsculas, por lo tanto los siguientes identificadores haran referencia a datos diferentes: Diasemana, diasemana, DIASEMANA, diaSemana Hay palabras que no se pueden utilizar como identificadores, aquellas palabras que forman parte dela sintaxis propia de C+- (palabras reservadas): main, int, float, char, const, void, true, if, else, for, while, case, struct, new, private, and, or, don, this, ... 2. Constantes Son datos que mantienen su valor durante toda la ejecucin del programa. La forma de declarar una constante es: const tipo nombre = valor; Ejemplos: const float Pi = 3.14159265; const float NumeroE = 2.718281828459; const int largo = 50; const float radio = 5.10; Tambin se puede declarar una constante basndose en otra ya declarada: const float dimetro = 2 * radio; const float perimetro = 2 * Pi * radio; Qu ventaja puede tener el hacer uso de constantes con nombre a un programa? 3. Variables Son datos que pueden ir variando su valor durante la ejecucin del programa. La forma de declarar las variables es: tiposdevariable nombreVariable; Ejemplos: int da; int da, mes, ao; float precio; float precioneto, preciobruto; 1

char tecla; Podemos dar valores iniciales a las variables en la misma declaracin: char tecla ="*"; float suma = 0; Asignacin de variables Instruccin que nos permite darle un valor a una variable o tambin podemos hacerlo en cualquier momento de la ejecucin del programa: suma = 100; suma = suma + valor; tecla = 'x'; area = base * altura; El requisito que debe tener una asignacin es que en la parte izquierda debe hay habr una nica variable en la parte derecha puede hay habr una constante o una expresin. Sentencias de autoincremento y autodecremento Cuando tengamos una asignacin de esta forma: variable = variable +1; Se puede simplificar con: variable + +; Cuando tengamos una asignacin de esta forma: variable = variable - 1; Se puede simplificar con: variable - -; Compatibilidad de tipos Una sentencia de asignacin puede resultar confusa si el tipo de variable y el del resultado de la expresin son diferentes (de igual manera ocurre con una operacin aritmtica antro operandos de distinto tipo. C +- no es "fuertemente tipado" y permite estas ambigedades. Para salvar estas ambigedades C +- convierte previamente de forma automtica el valor a asignar al tipo del valor de la variable. As, para mejorar el estilo de programacin se recomienda hacer la conversin: int saldo; float gastos; .... saldo = int (gastos); 4. Lectura de variables Para leer variables desde el teclado hacemos uso de la funcin scanf que est en la librera <stdio.h>:
scanf (cadena con formatos, &variable1, &variable2, ... ...., variables); scanf ("%d", &a); lee

un valor entero por teclado, el valor se asigna a la variable int a. scanf ("%c", &a); lee un valor de tipo carcter y se le asigna a la variable a. scanf ("% f", & a); lee un valor real para teclado, y ese valor se le asigna a la variable real a.

Podemos leer varias variables con una nica instruccin scanf:


int dia, mes, anno; ... ... ... printf (Introduce da mes y ao: "); scanf ("%d %d %d", &dia, &mes, &anno);

Apretando una vez INTRO :

O apretando 3 veces INTRO:

O tambin se puede hacer con varias instrucciones scanf:

Ejemplo: Programa que nos calcula las operaciones bsicas entre dos nmeros

Ejemplo: Programa que nos pide una cantidad total de segundos y tenemos que convertirlo en horas, minutos y segundos.

Ejemplo: Programa que calcula el rea y el volumen de un cilindro a partir del radio y de la altura.

TEMA_4 --------------------- Metodologa 1


1. Introduccin En este tema se presentan algunas recomendaciones a la hora resolver un problema y a la hora de su codificacin. No aporta ningn cdigo nuevo. 2. Descomposicin en subproblemas (tcnica de 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. Por ejemplo si nos piden hacer el siguiente programa:

Si intenta hacer este programa veris como es muy difcil sacar una solucin sin descomponer el problema. La tcnica de refinamientos sucesivos consistir en sacar una solucin dividiendo el problema en subproblemas ms sencillos y combinando la solucin de estos subproblemas: - Pintar la parte izquierda superior del rombo - Pintar la parte derecha superior del rombo - Pintar la parte izquierda inferior del rombo - Pintar la parte derecha inferior del rombo 3. Aspectos de estilo Encolumnado Comentarios Eleccin de nombres Uso correcto de maysculas y minsculas Constantes con nombre

TEMA_5 --------- Estructuras_de_control


1. Introduccin Si nos piden hacer los siguientes tipos de programas: "Hacer un programa en C / C + + que lee un nmero entero N desde teclado y nos muestre por pantalla si es par o impar ". "Hacer un programa en C / C + + que nos calcula y muestre la nota media de N alumnos (N ledo por teclado) ". Con las instrucciones vistas hasta ahora no los podramos hacer, necesitamos lo que llamamos estructuras de control (una estructura condicional para el primer programa y una estructura repetitiva o iterativa para el segundo). La programacin estructurada utiliza estas estructuras de control: Secuencia Seleccin o condicional iterativa o repetitiva 2. Estructura secuencia Las estructuras secuenciales estn formadas por un conjunto de instrucciones que se ejecutarn siguiendo el orden que estn en el programa.
#include <stdio.h> int main () { instruccion1 instruccion2 ...... instruccionN }

3. Estructura condicional de seleccin. Sentencia IF Se utilizan cuando se quiere ejecutar un grupo de instrucciones u otro grupo dependiendo de un valor o condicin. Tiene uno de los dos formatos siguientes if (condicin) { if (condicin) { accin 1; accin 1; } } else { accin 2; } Ejemplo: Programa que comprueba si un nmero es par o impar.

Ejemplo: Supongamos que una entrada al cine vale 8 y que hay un descuento segn la edad del espectador: Se quiere hacer un programa que nos calcula el total a pagar a la edad del espectador.
75% Ms de 65 aos 0% De 18 a 65 aos 50% De 6 a 18 aos 100% De 0 a 6 aos

Otra forma de hacerlo es utilizando estructuras IF anidadas:

Ejemplo: Programa que nos muestre un men con varias opciones y que segn la opcin elegida se ejecute un programa u otro:

4. Estructura repetitiva o iterativa Supongamos que queremos aadir una opcin al men para salir y que el programa se repita hasta que nosotros apretamos la opcin de salir:

Para poder hacer esto necesitamos otra estructura de control, concretamente una estructura de control iterativa. La estructura es:
while (condicin) { Accin 1 Accin 2 ... ... .... Accin N }

Ejemplo: Programa que nos calcula el factorial de un nmero N.

Ejemplo: Programa que nos calcula la media de N notas (N es leido por teclado):

5. Estructura repetitiva FOR Se utiliza cuando sabemos de antemano cuantas repeticiones queremos realizar. Su sintaxis es:
for (int index=valorInicial; ndice<=valorFinal; ndice + +) { Acciones }

Tambin puede ser con ndice decreciente:


for (int index = valorInicial; ndice> = valorFinal; ndice - -) { Acciones }

Ejemplo: Programa que muestra los nmeros pares que hay entre 1 y N (N es introducido por teclado)

Qu modificacin harais para que aparte de mostrarles desde 1 a N nos los muestre desde un nmero a otro y nos calcule la media de los pares?

TEMA_6 ---------------- Metodologa 2


1. Introduccin En este tema: -Se vuelve a hablar de la tcnica de refinamientos sucesivos, ahora aprovechando el uso de las estructuras de control de seleccin y de repeticin. -Se parte de la idea de verificacin de programas. -Se habla de eficiencia 2. Uso de esquemas de seleccin e iteracin Esquemas de seleccin Habr que: a) Identificar cada una de las alternativas del esquema y las acciones correspondientes. b) Identificar las condiciones para seleccionar una alternativa u otra. Ejemplo: Desarrolla un esquema de seleccin para calcular cuntos das tiene el mes de Febrero de un determinado ao: a) Las alternativas es que tenga 28 o 29, y las acciones ser asignar ese valor a una variable: das = 28 o bien das = 29 b) La condicin para elegir una accin u otra es que el ao sea bisiesto o no. De forma simplificada (pero vlida para los aos 1901 y 2099) es que el ao sea mltiplo de 4: ao%4 == 0 El esquema de seleccin sera: El esquema de seleccin simplificado sera:
if (ao% 4 == 0) { das = 29; } else { das = 28; } das = 28; if (ao% 4 == 0) { das = 29; }

Esquemas de iteracin Habr que: a) Identificar las acciones tiles a repetir y las variables necesarias. Precisar el significado de estas variables al principio y final de cada repeticin. b) Identificar como actualizar la informacin a pasar de cada iteracin a la siguiente. c) Identificar la condicin de finalizacin. d) Identificar los valores iniciales de las variables antes de entrar al bucle. Ejemplo: Desarrolla un esquema repetitivo que imprima la series de Fibonacci. Cada trmino de esta serie se obtiene sumando los dos anteriores. La serie comienza con los trminos 0, 1, .. a) Acciones tiles a repetir: Imprimir un trmino
printf ("%10d \ n", termino);

Variables necesarias: El trmino a imprimir.


int termino;

Valor al comenzar la repeticin: ltimo trmino impreso hasta el momento. b) Actualizar las variables al pasar de una repeticin a otra: Antes de imprimir, calcular el trmino actual a partir de los dos anteriores (hay que tener almacenado el ltimo trmino).
aux = termino + anterior; anterior = termino; termino = aux;

Variables adicionales: El penltimo trmino y una variable auxiliar.


int anterior; int aux;

c) Condicin de finalizacin: El trmino siguiente superar el rango de los enteros. Hay que evaluar la condicin sin calcular explcitamente el valor de ese trmino, porque se producira overflow (desbordamiento de memoria).
INT_MAX-termino < anterior

d) Valores iniciales de las variables Los dos primeros trminos 0 y 1


anterior = 0; termino = 1;

El esquema iterativo o bucle sera:


int termino, anterior, aux; anterior = 0; termino = 1; while (INT_MAX - termino> = anterior) { aux = termino + anterior; anterior = termino; termino = aux; printf ("%10d\n", termino); }

3. 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. 4. 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. No vamos a utilizar ninguna unidad de medida de tiempo sino que utilizaremos una notacin formal (una cota superior del nmero de instrucciones a ejecutar en el peor de los casos). Estas notaciones especiales se llaman anotaciones asintticas y son las siguientes ordenadas de mayor a menor eficiencia. O (1) <<O (lg n) <<O (n) <<O (nlogn) <<O (n ^ 2) <<O (n ^ k) <<O (2 ^ n) O (1) complejidad constante O (n) complejidad lineal Ejemplo:
B: = B + 1; for (int i=1, i<=n, i + +) { printf ("Hola \ n"); } O (1) O (n) (se repite n veces)

O (Lg n) complejidad logartmica O (n ^ 2) complejidad cuadrtica, ...

La complejidad de todo el programa estar formada por la suma de las complejidades de todas las instrucciones del programa. La suma de las complejidades siempre es igual a la peor de las complejidades O (1) + O (n) = O (n) Ejemplo: Cul sera la complejidad de este algoritmo?
if (a>b) { printf ("Hola \ n"); } else { for (int i = 1, i<=n, i + +) { for (int j = 1, j <= n, j + +) { x:= x + i; } z:= z +1; } } z:= z +1;

TEMA_7 -- Funciones_y_procedimientos
1. Introduccin La tcnica de refinamientos sucesivos consiste en dividir un problema en subproblemas mucho ms sencillos de resolverlos. Por la misma razn, un programa lo podemos desglosar en subprogramas, y cada subprograma que realice una parte del programa. El uso de subprogramas a los programas es bastante conveniente, sobre todo en los dos siguientes casos: a) Para programas complejos y largos. b) Cuando en diferentes partes de un programa se repiten un determinado grupo de instrucciones. Ejemplo: Si queremos hacer un programa que nos calcule el permetro de un tringulo a partir de las coordenadas ledas desde el teclado. A B C Utilizando refinamientos sucesivos desglosamos el programa en 3 subprogramas: 1) Leer las coordenadas de A, B y C 2) Calcular el permetro 3) Mostrar el permetro 2. Funciones y procedimientos Hay 2 tipos de subprogramas: - Procedimientos y

- Funciones

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

tipo_resultado nombre_funcion (lista_argumentos o parmetros)


/ / Cuerpo de la funcin

{ declaracin de variables; instruccin 1; ......... instruccin N; } Ejemplo: Programa que nos calcula el mximo entre dos nmeros. Sin utilizar funcin Haciendo uso de una funcin

Resultado de mbos programas:

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 la 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 mdulo que llama le pasa a la funcin para que realice operaciones con ellos. Ejemplo: Programa que utiliza una funcin para validar una fecha.

Ejemplo: Programa que hace uso de una funcin para calcular la potencia de un nmero positivo elevado a otro numero. Por ejemplo, 5 ^ 2 = 25

Ejemplo: Programa que utiliza una funcin para calcular la distancia entre dos puntos P1 y P2

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 ^ y float sqrtf (float x) Raz cuadrada de x Hay muchas ms ... EJERCICIO: Qu mostrar por pantalla el programa?

Procedimientos Son subprogramas que realizan una cierta tarea o accin. No devuelven ningn valor. Ejemplo: el programa de la silla:

3. Paso de Argumentos o Parmetros 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. Los parmetros o argumentos se pueden clasificar en: - Parmetros actuales o reales - Parmetros formales 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 - Por direccin o por referencia 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 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. Ejemplo En esta funcin el paso de parmetros es por valor: int funcion1 (int x, int y) En cambio en esta otra: int funcion2 (int x, int & y) el paso del parmetro "x" es por valor y el del parmetro "y", por referencia. NOTA: En C / C + + en lugar de utilizar el smbolo & para indicar que es un paso para referencia se utiliza el * Ejemplo: Programa que utiliza una funcin para intercambiar los valores de dos variables.

4. 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 (#include), de la definicin de constantes y antes de cualquier funcin. El mbito de una 5

variable global son todas las funciones que componen el programa, cualquier funcin puede acceder a esas variables para leer y escribir en ellas.

Ejemplo: Dado el siguiente programa

- Qu mostrar por pantalla? - Indica el mbito de las diferentes variables que intervienen en el programa 5. Recursividad de subprogramas Un lenguaje de programacin se dice que es recursivo si una funcin (o subprograma) puede llamarse a s misma. Ejemplo: Funcin recursiva que calcula el factorial de un nmero

Ejemplo: Funcin recursiva que calcula los primeros trminos de la serie de Fibonacci {1,2,3,5,8,13,21 ,...}

7. Problemas al utilizar subprogramas El uso inadecuado de las variables que pasamos como argumentos puede dar lugar a algunos problemas: 1. Efectos secundarios. 2. Redefinicin de elementos. 3. Doble referencia 1. Efectos secundarios Cuando un subprograma modifica alguna variable externa, se dice que est produciendo efectos secundarios o laterales. El concepto contrario al efecto lateral sera la transparencia referencial. Siempre que llamamos a un subprograma con los mismos parmetros se debe obtener el mismo resultado. NOTA: Es aconsejable pasarle a los subprogramas los parmetros que necesita el subprograma y modificar lo menos posible variables globales directamente.
float base, altura; .... float AreaRectangulo () { return base * altura; } ... ... base = 3.0; altura = 2.5; printf ("% f", AreaRectangle ()); float AreaRectangle (float base, float altura) { return base * altura; } ... .. printf ("% f", AreaRectangle (3.0,2.5);

Esta opcin es ms recomendable.

2. 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. 3. 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.
int global; void Cuadrado (int & dato) { global = 5; dato = dato * dato; } global = 3; Cuadrado (global); Qu valor tendr la variable global?

void CuadradoCubo (int & x, int & x2, int & x3) { x2 = x * x; x3 = x * x * x; } Si ejecutamos con: A = 4; CuadradoCubo (A, A, B); Qu valores tendrn A y B? A=16 y B=4096

TEMA_8 ------------ Metodologa 3


1. Introduccin En este tema se ampla la metodologa de desarrollo para refinamientos sucesivos con la posibilidad de utilizar subprogramas como tcnica de abstraccin. 2.Operaciones abstractas El uso de subprogramas a los programas supone un primer nivel de abstraccin, por ejemplo, cuando hacemos uso de una funcin o procedimiento desde una librera que hace la funcin o procedimiento pero no sabemos nada de su cdigo. As pues en cualquier abstraccin (libreras, funciones, procedimientos, etc, ..), podemos distinguir dos partes: 1) La especificacin: Qu hace realmente? cabecera de la funcin o procedimiento. 2) La implementacin o realizacin: Cmo lo hace? Sera el algoritmo codificado. Ejemplo / * Devuelve el mximo de dos nmeros * / int maximo (int a, int b) { if (a> b) { return a; } else { return b; } }

Especificacin

Implementacin

Si ahora utilizamos otro algoritmo para implementar la funcin mximo: / * Devuelve el mximo de dos nmeros * / int maximo (int a, int b) { int m = a; if (b> m) { m = b; } return m; } La especificacin es la misma de antes, por lo tanto una misma especificacin puede tener diferentes implementaciones, para esto muchas veces nos interesa ms saber lo que hace la funcin que cmo lo hace, ocultando al usuario la implementacin de la funcin. La especificacin formal de una funcin viene dada por: {Precondicin} Cabecera de la funcin. Conjunto de estados posibles que deben cumplir los parmetros de entrada de la funcin antes de ejecutarse. {Postcondicin} Estado en que se encontrar la variable de salida de la funcin una vez se haya ejecutado el cdigo de la funcin. Ejemplo: Especifica una funcin que devuelva el cubo de un numero entero. {Q a Z} fun cubo (a: entero) dev (c: entero) {R c = a3} Ejemplo: Especifica una funcin que nos devuelve el valor mximo de un vector.

3. Desarrollo haciendo uso de abstracciones Hay diferentes estrategias de desarrollar programas en uso de abstracciones: 3.1 Desarrollo descendente (Top-Down). La programacin descendente o "Top - Down" es el proceso mediante el cual un problema se descompone en una serie de niveles o pasos sucesivos de refinamiento. La metodologa descendente consiste en efectuar una relacin entre las sucesivas etapas de estructuracin de modo que existe una relacin entre ellas mediante entradas y salidas de informacin. El problema se descompone en varias estructuras jerrquicas, de forma que se pueda considerar cada estructura desde dos puntos de vista: Qu hace? y Cmo lo hace?

La utilizacin de la tcnica de diseo Top-Down tiene los siguientes objetivos bsicos: a) Simplificacin del problema y de los subprogramas de cada descomposicin. b) Las diferentes partes del problema pueden ser programadas de modo independiente e incluso por diferentes personas. c) El programa final queda estructurado en forma de bloque o mdulos lo que hace ms sencilla y fcil su lectura y mantenimiento. 3.2 Reutilizacin del cdigo La reutilizacin de cdigo se refiere al comportamiento y a las tcnicas que garantizan que una parte o la totalidad de un programa informtico existente se pueda utilizar en la construccin de un otro programa. De esta forma se aprovecha el trabajo anterior, economiza tiempo, y se reduce la redundancia. Los procedimientos y funciones, cuando ms 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. 3.3 Desarrollo ascendente (Bottom-Up) El diseo ascendente se refiere a la identificacin de aquellos procesos que hay computarizado a medida que vayan apareciendo, su anlisis como sistema y su codificacin para resolver el problema inmediato. Cuando la programacin se realiza internamente y hace un enfoque ascendente, es difcil llegar a integrar los subsistemas. Los problemas de integracin entre los subsistemas son sumamente costosos y muchos de ellos no se solucionan hasta que la programacin alcanza la fecha lmite para la integracin total del sistema. 4. Programas robustos Cualquier programa debe ser: - Correcto. Los resultados que d son los esperados - Claro. Cualquier programador pueda entender como est estructurado. - 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 errneas. 4.1 Programacin a la defensiva La programacin defensiva es una forma de diseo defensivo aplicada al diseo de 2

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 se 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: a) Calidad, reduciendo el nmero de fallos de software y, en consecuencia, problemas. b) Haciendo el cdigo fuente comprensible - el cdigo fuente debe ser legible y comprensible, a prueba de una auditora de cdigo. c) Hacer que el software se comporte de una manera predecible a pesar de entradas o acciones de usuario inesperadas. 4.2 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 la 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 * / } ... } EJEMPLO: Programa que nos calcula el factorial de un nmero controlando los posibles errores.
int FactorialRobusto (int n) { int f = 1; if (n<0) { throw 0; } for (int k=2; k <= n; k++) { if (f> INT_MAX / k) { throw k; } f = f + k; } return f; }

TEMA_9 -------- Definicin_tipos


1. Introduccin Aparte del tipo de datos predefinidas en C (int, char y float), el programador tambin puede definirse sus propios tipos de datos en 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 vlido: 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; Nota: Con definicin de tipo mejoramos en muchos casos la legibilidad del programa, pero slo con definicin de tipo simples como en estos ejemplos no podramos abarcar y resolver todos los problemas que nos puedan plantear, por tanto necesitamos utilizar otros tipos "ms potentes", por ejemplo: tipo enumerado, tipo vector, tipo cadena o string, registros, ... 2. Tipo enumerado Cuando definimos tipos enumerados indicar todos los posibles valores que puede tomar ese tipo. Por ejemplo: typedef enum tipodia {Lunes, Martes, Mircoles, Jueves, Viernes, Sbado, Domingo}; typedef enum TipoMes {Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre}; typedef enum TipoEstadoCivil {Casado, Soltero, Viudo, Separado}; typedef enum TipoColor {Rojo, Amarillo, Azul}; typedef enum TipoDireccion {Norte, Sur, Este, Oeste}; Todos los elementos de un tipo enumerado o lista enumerada tienen asignado un nmero que hace referencia al lugar que ocupan en la lista (comienza por 0). Por ejemplo, dado la siguiente lista enumerada: typedef enum TipoPieza {Rey, Reina, Alfil, Caballo, Torre, Peon}; El elemento Rey tiene asociado el 0, Reina el 1, Alfil el 2, Caballo el 3, Torre el 4 y Peon el 5. Los tipos enumerados se consideran tipos ordinales (al igual que los int y char), ya que tienen un orden establecido de antemano. Una vez hemos definido un tipo de datos enumerado ya podemos definir variables de ese tipo de la siguiente manera: Tipodia da; TipoMes mes; 1

TipoColor color = Rojo; da = Martes; color = Azul; mes = abril; Como los tipos enumerados son ordinales, podemos utilizarlos en comparaciones como por ejemplo: If (mes>=Julio) { ... } while (da<Sbado) { .... } Para hacer referencia al lugar que ocupa un elemento en la lista lo hacemos as: int (Abril) -> 3 int (Viudo) -> 2 int (Martes) -> 1 Para hacer referencia al elemento que ocupa una determinada posicin lo hacemos as: TipoMes (3) -> Abril TipoEstadoCivil (2) -> Viudo Tipod (1) -> Martes Podemos ir pasando de un elemento a otro de una lista enumerada de la siguiente manera: da = jueves; da = tipodia (int (da) +1); mes = Julio; mes = TipoMes (int (mes) -1); En el primer caso tendramos: da = viernes; mes = junio; Tipo predefinido bool El tipo predefinido bool se puede considerar como un tipo enumerado con dos valores: typedef enum bool {false, true}; Se cumple: int (false) 0 y int (true) 1 EJEMPLO 1: tipos enumerados Qu mostrar el siguiente programa?

EJEMPLO 2: tipos enumerados Qu mostrar ahora el programa?

Ejemplo 3: Tipo enumerados Qu hace el siguiente programa?

3. Tipos estructurados Todos los tipos de datos que hemos visto hasta ahora son tipos de datos escalares y simples, que no se pueden descomponer en otras ms simples. Con estos tipos de datos podemos resolver problemas muy sencillos. Vamos a ver ahora los tipos de datos estructurados, sern tipo de datos formadas por otros tipos ms simples. 3.1 Tipos vector o array Supongamos que tenemos una empresa que tiene 40 sucursales y que cada final de mes se dedica a recoger las ventas que ha hecho cada una de estas sucursales y sumarlas con el fin de obtener el total de ventas netas a lo largo del mes. Por almacenar las ventas de las 40 sucursales dentro de nuestro programa la primera solucin que se nos vendra a la cabeza sera declarar 40 variables de tipo 'int', pedir sus 40 valores y hacer la suma de las cuarenta variables inmediatamente despus. En la prctica nunca se utiliza una solucin as, y lo que se hace es agrupar todos los valores dentro de una variable de tipo vector. Un vector es una variable compuesta, que puede almacenar muchos valores de un mismo tipo. Nombre: V Posicin: 0 1 2 3 4 n-3 n-2 n-1 Valores: V0 V1 V2 V3 ... ... ... Vn-3 Vn-2 Vn-1 Declaracin de vectores: typedef float TipoVectorNotes [100]; typedef char TipoNom [30]; typedef int TipoTemperatures [12]; typedef int TipoVector [20]; Tambin podemos definir vectores basados en otros tipos ya definidos por el programador, por ejemplo si definimos los siguientes tipos enumerados: typedef enum tipod {Lunes, Martes, Mircoles, Jueves, Viernes, Sbado, Domingo}; typedef enum TipoEstatCivil {Casado, Soltero, Viudo, Separado}; typedef enum TipoColor {Rojo, Amarillo, Azul}; 4

Podramos definir los siguientes vectores: typedef tipod TipoAgenda [7]; typedef TipoColor TipoPaleta [3]; Inicializar un vector Consiste en dar valores iniciales a un vector. Lo podemos hacer en el mismo momento de definir la variable vector: typedef int TipoTemperaturas [12]; TipoTemperaturas temperaturas = {12,13,16,19,20,35,29,30,20,16,14,13}; typedef float TipoVectorNotas [100]; TipoVectorNotas notas = {5.7,8.5,9.0,3.4}; O tambin lo podemos hacer en cualquier parte del cuerpo del programa con asignaciones, por ejemplo Qu harn las siguientes instrucciones? temperaturas [2] = 18; temperaturas [11] = 5; notas [2] = 2.4; notas [3] = 6.0; Nota: En C+-, no es posible asignar el contenido de un vector a otro del mismo tipo: V2 = V1; INCORRECTO la asignacin global de vectores lo haremos mediante un recorrido del vector. Por ejemplo, para asignar el contenido del vector V1 al contenido del vector V2 lo haremos as: for (int i = 1; i<num_elementos; i++) { V2[i] = V1[i]; } Ejemplo: Programa que genera un vector para almacenar 5 nmeros enteros ledos por el teclado y los muestre una vez creado.

Ejemplo: El problema de calcular el total de las ventas de todas las sucursales, haciendo uso de vectores, el podramos resolver de la siguiente forma:

Ejemplo: Programa que guarda en un vector llamado Datos, 20 enteros y nos calcula la posicin del elemento que contiene el valor mximo.

3.2 Vectores de caracteres (cadenas o strings) Una cadena de caracteres o string es un vector de caracteres que finaliza con un carcter especial llamado carcter final de cadena y que se representa por \0 Para crear, por ejemplo, Una cadena de caracteres de la palabra "hola", sus elementos debern ser:

La declaracin de una cadena de caracteres es igual que cualquier otro vector, pero hay que tener en cuenta, que hay que reservar un espacio ms para el carcter final de cadena \0. Por lo tanto si se quiere declarar una cadena de caracteres que pueda guardar frases de tamao N, en la declaracin la declararemos como de tamao N +1 6

typedef char NombreVector [N+1] Por ejemplo, si queremos en un vector guardar palabras de tamao mximo 10 caracteres, la cadena la tendremos que definir como: typedef char palabra [11]; Ejemplo de definicin de cadenas e inicializacin: typedef char TipoNombre [20]; typedef char TipoDomicilio [30]; TipoNombre nombre = "Xavier Fontana; TipoDomicilio calle = "C / Colon - 24; Al igual que los otros tipos de vectores es INCORRECTO la asignacin completa de una cadena. Por ejemplo; nombre = "Pepe"; O nom1 = nom2;

Ejemplo: Programa que nos pide un nombre y una direccin y nos muestra lo que ha ledo.

En C y C+- tenemos una librera que contiene funciones especializadas para el tratamiento de cadenas de caracteres y que se llama <string.h> Entre las funciones que ms utilizaremos tenemos: strlen (cadena) Devuelve la longitud de una cadena strcmp (cadena1, cadena2) Compara dos cadenas y devuelve 0 si las dos son iguales, devuelve un valor negativo si cadena1 va antes que cadena2 en el diccionario y devuelve un valor positivo si cadena1 va despus que cadena2 en el diccionario. strcpy (cadena1, cadena2) Copia cadena2 en cadena1 strcat (cadena1, cadena2) Concatena cadena2 a continuacin de cadena1. Ejemplo: Programa que nos muestra la longitud de una cadena.

Ejemplo: Programa que nos pide un usuario y contrasea continuamente hasta que introducimos las correctas.

4. Tipo tupla o registro En los apartados anteriores hemos visto que un vector nos permite agrupar un conjunto de datos donde todos ellos son del mismo tipo. En ocasiones existe la necesidad de agrupar datos de diferente tipo, como por ejemplo los datos de la cuenta bancaria de un cliente (nombre cliente, n de cuenta, saldo disponible, etc, ..). Para poder guardar un conjunto de datos de distinto tipo, simples o compuestas, en C se define un nuevo tipo de datos compuesto llamado estructura. As pues, una estructura o registro es un tipo de datos compuesto que puede guardar un conjunto de datos de diferentes tipos. En cada uno de los datos o elementos guardados dentro de una estructura se llama campo. 8

La definicin de una estructura en C + + tiene la siguiente sintaxis: typedef struct nombre_estructura { tipo_dato campo1; tipo_dato campo2; ......................... tipo_dato campoN; }; EJEMPLO: Se quiere definir una estructura en C que contenga las principales datos de una tarjeta de crdito. typedef struct TipoTarjeta { int num_tarjeta; char tipo_compte; char nombre[40]; float saldo; }; Ejemplo: Estructura para guardar fechas typedef enum TipoMes {Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre}; typedef struct TipoFecha { int da; TipoMes mes; int anno; }; Podemos definir variables de tipo registro as TipoFecha fecha1, fecha2; Y tambin podemos inicializarlas TipoFecha fecha1 = {15, Noviembre, 2010}; OPERACIONES BSICAS CON ESTRUCTURAS Las operaciones con estructuras se realizan normalmente sobre cada uno de los campos de la estructura., exceptuando la operacin de asignacin, la cual tambin se puede aplicar sobre la estructura completa. En este ltimo caso, se copian todos los valores de una variable estructura en otra, esta copia de los valores de una variable se producir siempre que las dos variables pertenecen al mismo tipo de estructura. 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 individuales. Para acceder a un determinado campo para poder leer o escribir en el lo haremos: variable.campo donde: - variable: se refiere al nombre de una variable de tipo estructura - campo: nombre del campo definido dentro de la estructura El punto (.) Separa el nombre de la variable del nombre del campo elegido.

Ejemplo uso de registros

EJEMPLO: Programa que nos guarda los datos de un trabajador a un registro y nos las muestra en un determinado formato:

Qu modificacin haramos al programa para que nos pudiera guardar un determinado nmero de registros, uno para cada uno de los trabajadores?

10

11

TEMA_10 ----

Ampliacin_estructuras_control

1. Introduccin Aqu vamos a ver algunas estructuras de control nuevas. 2. Estructura repetitiva DO .. WHILE do { Accin } While (condicin); Ejemplo: Qu harn los siguientes cdigos? Ejemplo 1 do { ... .. operaciones ... .... printf ("Otra operacin (S / N )?); scanf ("%c", &tecla); } While (tecla = = "S" | | tecla = = "s"); Ejemplo 2 do { printf ("Mes actual?); scanf ("% d", &mes); } While ((mes <1) | | (mes> 12)); Ejemplo: Programa que nos muestra un men de forma continuada mientras no apretamos una opcin vlida.

3. Sentencia continue La sentencia continue dentro de cualquier bucle (while, for, do) lo que hace es finalizar la repeticin en curso e inicia la siguiente repeticin. Ejemplo: Qu har el siguiente cdigo? for (int i = 0; i <N, i ++) { 1

... ... .. if (vector[i] = = 0) { continue; } ... ... calculo = calculo / vector [i]; } Ejemplo: Qu har el siguiente cdigo? while (condicin) { instruccion1; instruccion2; if (condicion2) { continue; } instruccion3; instruccion4; } Instrucci5; 4. Estructura de seleccin SWITCH switch (expresion) { case valor1: instrucci1; instrucci2; ................. break; ................ case valorN: instruccion1; instruccion2; ................. break; default: instruccion1; instruccion2; ................. instrucciones; break; } Ejemplo: Qu har el siguiente cdigo? switch (mes) { case Junio: sueldo = sueldo + pagaextra; break; case Diciembre: sueldo = sueldo + pagaextra; break; default: ; } 2

Hara lo mismo la siguiente expresin: switch (mes) { case Junio: case Diciembre: sueldo = sueldo + pagaextra; break; default: ; } Ejemplo: Qu har el siguiente programa?

Ejemplo: Programa que nos muestra continuamente un men de opciones para calcular reas de diferentes figuras geomtricas.

TEMA_11 ---------- Estructuras_de_datos


1. Introduccin Se trata de ampliar las estructuras de datos vistas al tema 9 (vectores y registros). 2. Argumentos de tipo vector abierto Los vectores con un tamao indefinido se llaman Vectores abiertos Para qu se utilizan los vectores abiertos? Si tenemos definido el siguiente tipo de vector: const int TAM = 10; typedef int TipoVector [TAM]; TipoVector v1, v2; void MostrarVector (TipoVector v) { for (int i = 0; y <TAM, y + +) { printf ("% d", v [i]); } printf ("\ n"); } Podramos hacer uso de este procedimiento directamente sin ningn problema: MostrarVector (v1); MostrarVector (v2);

Pero, Qu pasa si quisiramos utilizar el procedimiento MostrarVector para mostrar un vector de tamao diferente a v1 y v2? No podramos hacer uso de ese procedimiento para imprimir un vector de tamao diferente a 10.

QU PASA? En cambio, si hubiramos definido en el procedimiento MostrarVector en el paso de argumentos, v como un vector abierto, podramos hacer uso del procedimiento fuera el que fuera el tamao del vector. Para definir el procedimiento MostrarVector como un vector abierto a su argumento lo haramos as: void MostrarVector (int v [], int nelementos) { for (int i = 0; i<nelementos; i++) { printf ("% d", v [i]); } printf ("\ n"); } En el libro veris que en los parmetros o argumentos que le pasamos al procedimiento aparece la palabra const void MostrarVector (const int v [], int nelements) Qu nos indica esto? Que estamos pasando el vector correspondiente por valor y no por referencia.

Ejemplo: Programa que analiza un texto y cuenta el nmero de letras y dgitos. Qu nos indica la palabra const dentro del argumento de un procedimiento o funcin? Que estamos pasando el vector correspondiente por valor y no por referencia.

3. Formaciones anidadas. Matrices o tablas Se define un vector multidimensional como un vector el que sus elementos son tambin vectores, es decir, es un vector de vectores. Para hacer referencia a un vector multidimensional habr que hacer uso de varios ndices. Los vectores multidimensionales ms utilizados son los bidimensionales o matrices, los cuales vendrn definidos por dos ndices (normalmente, fila y columna). columnas j

filas i Matriz de 4x5 tabla [i] [j] tabla [0] [0] = 2 tabla [0] [1] = 3 tabla [0] [2] = 7 tabla [0] [3] = 1 tabla [0] [4] = 4 tabla [1] [0] = 12 tabla [1] [1] = 2 tabla [1] [2] = 4 tabla [1] [3] = 5 tabla [1] [4] = 9

tabla [2] [0] = 11 tabla [2] [1] = 7 tabla [2] [2] = 23 tabla [2] [3] = 18 tabla [2] [4] = 12 tabla [3] [0] = 15 tabla [3] [1] = 32 tabla [3] [2] = 54 tabla [3] [3] = 27 tabla [3] [4] = 6 3

Para definir una matriz: const int NFILAS = 4; const int NCOL = 5; typedef int TipoElemento; typedef TipoElemento TipoFila [NCOL]; typedef TipoFila TipoMatriz [NFILAS]; Una vez tenemos definido el TipoMatriz correspondiente 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 con matrices Ejemplo: Programa que guarda valores a una matriz y los muestra una vez guardados.

NOTA: No podemos pasar matrices abiertas -> Si ponemos: void MostraMatriz (const int M [][], int filas, int columnas) { printf ("\ n Los valores guardados en la matriz son: \ n"); for (int i = 0; y <FILAS; y + +) { for (int j = 0; j <COL; j + +) { printf ("% d", M [i] [j]); } printf ("\ n"); } } Nos dara error de compilacin 4. Esquema de unin Hay programas donde es deseable que el tipo de un dato vare o cambie segn las circunstancias. Seran situaciones tpicas de un esquema de unin: - Datos que pueden representarse de diferentes maneras - Programas que operan indistintamente con varias clases de datos - Datos estructurados con elementos opcionales. Tipo_union = variante1 | variante2 | variante3 | ... .... Ejemplos numero_general = entero | frac | real coordenadas = coordenadas_cartesianas | coordenadas_polares figura = punto | crculo | rectngulo | tringulo | etc Para definir un tipo unin lo hacemos: typedef struct TipoFraccion { int numerador; int denominador; }; typedef union TipoNumero { int valorEntero; float valorReal; TipoFraccion valorRacional; }; NOTA: En una estructura de tipo union, para cada dato particular slo tendr asignado uno de los campos de la estructura. Los campos son alternativos, o un campo u otro, pero no varios a la vez. Una vez tenemos definido el tipo unin correspondiente TipoNumero ya podemos definir variables de ese tipo: TipoNumero numero, otro, fraccion1, fraccion2;

La forma de utilizar estos tipos es como un registro: numero.valorEntero = 33; otro.valorReal = float (numero.valorEntero); fraccion1.valorRacional.numerador = 33; fraccion1.valorRacional.denominador = 44; Un dato de tipo union no contiene en s mismo informacin de cul es la variante activa en un momento dado. Esa informacin debe estar disponible de forma clara mediante otros medios. Por ejemplo, al redactar un procedimiento para imprimir un dato del TipoNumero habra que pasarle tambin como argumento una indicacin de la variable aplicable: typedef enum ClaseNumero {Entero, Real, Fraccin}; void EscribirNumero (TipoNumero n, ClaseNumero c) { switch (c) { case Entero: printf ("% d", n.valorEntero); break; case Real: printf ("% f", n.valorReal); break; case fraccin: printf ("% d /% d", n.valorRacional.numerador, n.valorRacional.denominador); break; default: printf (?????); } } 5. Registros con variantes El hecho de que un dato de tipo union vaya acompaada de informacin complementaria para saber cul es la variante aplicable hace que los tipos union aparezcan siempre formando parte de otras estructuras ms complejas, por ejemplo, en registros variantes. Los registros variantes son tuplas (registros) en las que tendremos una serie de campos fijos aplicables a todos los datos de la tupla y otro grupo de campos variantes aplicables slo a ciertos datos. Se suele reservar un campo fijo para indicar explcitamente cul es la variante aplicable en cada momento.

EJEMPLO 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 (?????); } } EJEMPLO: Disea un tipo de datos que nos guarde informacin sobre un electrodomstico, concretamente, para una radio y una tv, y que si se trata de la tv el campo caracterstico variante ser el tamao y si es una radio el campo caracterstico variante es la potencia. typedef char TipoCadena [20]; typedef enum Aparatos {radio, tv}; typedef union TipoCaracteristica { int tamao; float potencia, } typedef struct TipoRegistre { int cdigo; TipoCadena descripcin; TipoCadena proveedor; float precio; *Aparatos clase; TipoCaracteristica valor; }

*Campo discriminante, que nos indicar cul es la variante aplicable en cada caso.

TEMA_12 Operaciones_tpicas_con_vectores
1. Introduccin Se trata de ver las operaciones tpicas que podemos hacer a un vector. 2. Esquema de recorrido Se trata de recorrer todos los elementos del vector para hacer una determinada operacin con ellos. El esquema general podra ser: iniciar operacin while (quedan elementos para tratar) { elegir uno de ellos y tratarlo } completar la operacin O tambin: iniciar operacin for (int i=0; i<N, i++) { tratar vector[i] } completar la operacin Ejemplo: Programa que calcula la suma de los elementos de un vector.

Ejemplo: Programa que nos muestra el mximo y el mnimo de un vector.

3. Bsqueda en un vector Una operacin de bsqueda de un elemento en un vector consiste en: Determinar si el elemento pertenece o no al vector. 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 binaria o dicotmica Bsqueda secuencial La bsqueda 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). Ejemplo: Programa que comprueba si un elemento est o no en un vector.

BSQUEDA BINARIA o dicotmicos La bsqueda secuencial 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 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 binaria 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 del central. -En la segunda repeticin el tramo a buscar es la mitad (bien derecha o bien izquierdo) 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. Ejemplo: Programa que hace una bsqueda dicotmica a un vector.

Para insertar un nuevo elemento a un vector en una determinada posicin, hay que: 1. Comprobar que el vector no est lleno 2. Preguntar al usuario qu elemento quiere insertar y en qu lugar 3. Desplazamos todos los elementos que hay en partir de la posicin a insertar un lugar hacia la derecha. 4. Asignamos ese lugar que ha quedado libre al nuevo elemento Ejemplo: Supone que quieres insertar el valor 64 al puesto 4 Vector original 2 8 2 Vector final 2 8

15 15

23

56 23 56

15

64

23

56

4. Insercin de un elemento a un vector Ejemplo: Programa que inserta un elemento a un vector en una determinada posicin.

5. Ordenacin Hay veces en que es conveniente tener un vector ordenado, por ejemplo en caso de querer aplicarle posteriormente una bsqueda dicotmica. Existen diferentes mtodos de ordenacin: - Mtodo de intercambio o burbuja - Mtodo de insercin - Mtodo de seleccin En el libro de texto describe slo al mtodo de insercin. Ordenamiento por insercin directa En este tipo de algoritmo, los elementos que van a ser ordenados son considerados uno cada vez. Cada elemento se INSERTADO en la posicin apropiada respecto al resto de los elementos ya ordenados. Ejemplo: A = 15, 67, 08, 16, 44, 27, 12, 35 Comparaciones realizadas: 1 pasada A[2]<A[1] 67<15 No hay intercambio A = 15, 67, 08, 16, 44, 27, 12, 35 2 pasada A[3]<A[2] 08<67 A = 15, 08, 67, 16, 44, 27, 12, 35 3 pasada A[4]<A[3] 08<15 A = 08, 15, 67, 16, 44, 27, 12, 35 Y as sucesivamente ... Si hay intercambio

Si hay intercambio

Ejemplo 2: Ordenar el vector V = 44, 55, 12, 42, 94, 18, 06, 67

EJEMPLO: Supongamos que queremos ordenar estos valores con el algoritmo de insercin directa: 45, 52, 21, 37, 49, 72, 14. As pues, n = 7 Empezamos a analizar el segundo elemento. El primero est en orden respecto a s mismo. Forma l solo una lista ordenada. Intentaremos mantener una lista ordenada al principio del vector: 1 pasada: El primer elemento forma la lista ordenada, y vamos a ver que hacemos con el segundo. 45, 52, 21, 37, 49, 72, 14 Comparamos 52 con la anterior. Como est en orden, paramos. 45, 52, 21, 37, 49, 72, 14 45 y 52 forman la lista ordenada ahora. (S, s ... estn en orden entre ellos 45<52) 2 pasada: Hay dos elementos en orden relativo entre ellos y vamos a ver que hacemos con el tercero. 45, 52, 21, 37, 49, 72, 14 Comparamos el 21 con el anterior (52). No estn en orden, as que los intercambiamos. 45, 21, 52, 37, 49, 72, 14 Comparamos el 21 con el anterior (45). No estn en orden, as que los intercambiamos. 21, 45, 52, 37, 49, 72, 14 Ya no hay ms que comparar. El 21 est en su sitio respeto a los dems de la lista. 21, 45, 52, 37, 49, 72, 14 Ahora 21, 45 y 52 forman la lista ordenada. 3 pasada: Hay tres elementos en orden relativo entre ellos y vamos a ver que hacemos con el cuarto. 21, 45, 52, 37, 49, 72, 14 Comparamos el 37 con el anterior (52). No estn en orden, as que los intercambiamos. 21, 45, 37, 52, 49, 72, 14 Comparamos el 37 con el anterior (45). No estn en orden, as que los intercambiamos. 21, 37, 45, 52, 49, 72, 14 Comparamos el 37 con el anterior (21). S estn en orden, as que paramos. 21, 37, 45, 52, 49, 72, 14 Ahora 21, 37, 45 y 52 forman la lista ordenada. 7

4 pasada: Hay cuatro elementos en orden relativo entre ellos y vamos a ver que hacemos con el quinto. 21, 37, 45, 52, 49, 72, 14 Comparamos el 49 con el anterior (52). No estn en orden, as que los intercambiamos. 21, 37, 45, 49, 52, 72, 14 Comparamos el 49 con el anterior (45). s estn en orden, as que paramos. 21, 37, 45, 49, 52, 72, 14 Ahora 21, 37, 45, 49 y 52 forman la lista ordenada. 5 pasada: Hay cinco elementos en orden relativo entre ellos y vamos a ver que hacemos con el sexto. 21, 37, 45, 49, 52, 72, 14 Comparamos el 72 con el anterior (52). S estn en orden, as que paramos. 21, 37, 45, 49, 52, 72, 14 Ahora 21, 37, 45, 49, 52 y 72 forman la lista ordenada. 6 y ltima pasada: Hay seis elementos en orden relativo entre ellos y vamos a ver que hacemos con el sptimo. 21, 37, 45, 49, 52, 72, 14 Comparamos el 14 con el anterior (72). No estn en orden, as que los intercambiamos. 21, 37, 45, 49, 52, 14, 72 Comparamos el 14 con el anterior (52). No estn en orden, as que los intercambiamos. 21, 37, 45, 49, 14, 52, 72 Comparamos el 14 con el anterior (49). No estn en orden, as que los intercambiamos. 21, 37, 45, 14, 49, 52, 72 Comparamos el 14 con el anterior (45). No estn en orden, as que los intercambiamos. 21, 37, 14, 45, 49, 52, 72 Comparamos el 14 con el anterior (37). No estn en orden, as que los intercambiamos. 21, 14, 37, 45, 49, 52, 72 Comparamos el 14 con el anterior (21). No estn en orden, as que los intercambiamos. 14, 21, 37, 45, 49, 52, 72 Comparamos el 14 con el anterior (21). No estn en orden, as que los intercambiamos. 14, 21, 37, 45, 49, 52, 72 Ya no hay ms para comparar, as que el 14 est en su sitio. Ya no quedan elementos a analizar al final del vector, as que hemos finalizado y el vector est ordenado. Ejemplo: Programa que ordena un vector de enteros por insercin directa.

TEMA_13 ------------- Punteros


1. Introduccin. Estructuras de datos no acotadas. Los tipos de datos y variables vistas hasta ahora se llaman estticas, porque su tamao se especifica a priori por el programador. El compilador reserva un espacio en memoria constante para la variable esttica durante toda la ejecucin del programa. Existen una gran cantidad de aplicaciones en las que no es posible conocer a priori la dimensin o tamao de las variables, en estos casos habr que hacer uso de variables dinmicas. Estas estructuras se caracterizan por la reserva y liberacin de memoria que se realiza durante la ejecucin del programa, y este espacio puede variar. Casos prcticos donde haremos uso de variables dinmicas: - Creacin de listas de cualquier tipo: lista de clientes de un banco, etc - Programas grficos Para crear estructuras dinmicas necesario hacer uso de punteros. 2. Punteros Un puntero hace referencia a la direccin donde se guarda en memoria el dato al tipo de al cual indica. Segn su tipo, se establece el tamao de la zona. Un dato declarado de tipo puntero no tiene por defecto el espacio requerido reservado. Sino, es necesario definir esta direccin mediante funciones dedicadas. Variable apuntada

Puntero

El tipo de un puntero indica el tipo de variable a la que apunta. typedef TipoVariable * TipoPunter; Por ejemplo: typedef int * TP_entero; TP_enter p; * P = 33; printf ("% d", * p); Qu hace este cdigo? - Defendemos un tipo puntero de enteros TP_entero - Declara una variable p de tipo puntero - Asigna el valor 33 a la variable dinmica a la que apunta p. - Muestra el valor de la variable apuntada por p. Qu diferencia hay entre p y *p? 3. Uso de variables dinmicas Las variables dinmicas no tienen espacio reservado en memoria de antemano como ocurra en las variables estticas, sino que reservan ese espacio a partir de punteros en el momento en el que se indique. La forma de crear una variable dinmica es mediante el operador new: typedef TipoVariable * TipoPuntero; TipoPuntero p; p = new TipoVariable;

Ejemplo: typedef int * TipoPunteroEntero; 1

TipoPunteroEntero p1, p2; p1 = new int; p2 = p1; Ejemplo: En algunos casos las variables dinmicas pueden estar perdidas si no se tiene un poco de cuidado. typedef int * TipoPunteroEntero; TipoPunteroEntero p1, p2; p1 = new int; p2 = new int; p2 = p1; En este caso la variable dinmica creada con: p2 = new int; Queda perdida sin posibilidad de ser utilizada. Hay que tener cuidado! ATENCIN, ATENCIN! CUANDO TENEMOS PUNTEROS DE TIPO DE DATOS SIMPLES SEGN PONE AL LIBRO NOS DARA ERROR DE COMPILACIN

Hay que hacer la siguiente modificacin:

HAY QUE distinguir entre 2

EL CONTENIDO DE LA VARIABLE DINMICA A LA QUE APUNTA UN PUNTERO (* p) Y la direccin de la VARIABLE DINMICA (p)

Ejemplo: Qu mostrara el siguiente programa?

La compilacin nos la har correctamente, pero cuando ejecutamos el programa nos dar un error de ejecucin ya que la variable dinmica del puntero p2 no la hemos creado. Habra que aadir la lnea: p2 = new TipoValor; Ejemplo: Qu mostrara el siguiente programa?

Una vez ya no se utiliza una variable dinmica se puede liberar el espacio utilizado por este mediante la sentencia: delete p;

NOTA: La sentencia delete destruye la variable dinmica apuntada por el puntero, pero NO garantiza que el puntero tome el valor NULL. Punteros a registros CUANDO UTILIZAMOS PUNTEROS ESTRUCTURAS O REGISTROS, PARA HACER REFERENCIA A UN CAMPO DE LA ESTRUCTURA UTILIZAMOS EL OPERADOR -> variable_puntero_estructura -> campo_estructura

4. ESTRUCTURA SECUENCIA O Lista Enlazada Una lista es una estructura 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 (Estructuras de datos estticas). Las operaciones que podemos hacer en una lista contigua son: 4

- Ordenarla - Buscar un elemento - Aadir un elemento - Eliminar un elemento - Borrar la lista completa - Copiar una lista origen a un destino - Concatenar varias listas - Dividir una lista en sublistas Listas enlazadas: Son aquellas listas los elementos de las que se encuentran almacenados en posiciones de memoria no contiguas. Cada nodo es equivalente a un struct (registro) y est formado por dos campos: - Campo valor, que es el campo que contiene el dato - 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 { tipos_elemento valor; TipoNodo * siguiente; };

EJEMPLO: PROGRAMA QUE NOS CREA UNA LISTA DINMICA DE ENTEROS Y NOS LA MUESTRA

TEMA_14 --------------- TADS


1. Qu se conoce como TAD? Un TAD es una agrupacin de una coleccin de valores y una coleccin de operaciones de manipulacin. En C++ la implementacin de TADs se realiza a partir de clases. En cambio el C+- no se contempla la implementacin de clases, est ms limitado en este sentido. En C + - podemos utilizar la estructura registro para poder suplir esta carencia. Podemos aadir a parte de los campos que forman la estructura registro, operaciones o procedimientos que podemos aplicar a esos campos. Ejemplo de TAD typedef struct TipoPunto { float x; float y; void Leer (); void Escribir (); float Distancia (TipoPunto p); }; Uso de un TAD TipoPunto p, q; px = 3.3; py = 4.4; p.Leer (); p.Escribir (); printf ("% f", p.Distancia (q)); Aparte de definir dentro del registro los procedimientos y funciones estos subprogramas deben implementarse fuera del registro 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); }

Ejemplo: Programa que haciendo uso de un registro como TAD calcula la distancia entre dos puntos A y B.

2. Ocultacin Para que un tipo sea realmente abstracto hara falta que los detalles de implementacin no fueron visibles. Tanto en las campos como en los procedimientos. En el caso anterior de TipoPunto los campos x e y son visibles en todo momento, y pueden funcionar consultados y modificados por los procedimientos de exija estructura sin ningn tipo de problema, ya que cualquier pareja de coordenadas define un punto vlido. No ocurre lo mismo con otros tipos de datos. Por ejemplo, si guardamos el valor de una fecha como una tupla numrica (da, mes, ao) no se puede admitir cualquier combinacin de valores. La fecha (20,7,2010) sera vlida, pero (7,20,2010) no sera correcta. Si se quiere definir el tipo fecha como un tipo abstracto habra que ocultar los detalles de representacin interna de los valores, de forma que slo se puedan construir fechas utilizando operaciones que garantizan la correccin de los valores de los tipos. Para permitir esta ocultacin los tipos struct admiten la posibilidad de declarar 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 da, mes, 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.

TEMA_15 -------------- Mdulos


1. Concepto de mdulo Un mdulo es un fragmento de programa desarrollado de forma independiente (diseado y compilado 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, slo hay que saber que hace el mdulo y sus funciones, pero no tenemos por qu saber cmo est implementado. 2. Especificacin y realizacin Al igual que en cualquier elemento abstracto, en un mdulo podemos distinguir: - La especificacin Qu hace el mdulo? (Interfaz o interfaz) - La realizacin Cmo lo hace? (Implementacin o realizacin) Cuando un programa hace uso de otros mdulos hay que tener en cuenta los siguientes conceptos: - Compilacin separada: El proyecto o programa estar formado por varios ficheros fuente, cada uno de los cuales se compilar por separado. - Compilacin segura: Al compilar un fichero fuente, el compilador comprueba que el uso de los elementos de otros mdulos es consistente con la interfaz. - Ocultacin: Al compilar un fichero fuente el compilador no utiliza informacin de los detalles de realizacin de los elementos de otros mdulos. 3. Mdulos en C + Para crear un mdulo en C + -, habr que crear dos ficheros: - El fichero de interfaz (nombre_modulo.h) - El archivo de implementacin (nombre_modulo.cpp) Archivo de interfaz (nombre_modulo.h) # Pragma once Definicin de constantes Definicin de tipo Definicin de variables globales Definicin de procedimientos y funciones Archivo de implementacin (nombre_modulo.cpp) # Include <stdio.h> # Include "nommodul.h .......... Implementacin o codificacin de los procedimientos y funciones definidos en el mdulo interfaz. Programa principal # Include <stdio.h> # Include "nombre_modulo.h .......... int main () { .......................... }

EJEMPLO 1: UTILIZACIN DE MDULOS

EJEMPLO 2: UTILIZACIN DE MDULOS Supongamos que tenemos el siguiente diseo de mdulos: Programa principal Moduls3.cpp Librera propia Tabulacio.h Tabulacio.cpp

Al igual que el ejemplo de antes creamos un proyecto de consola y le aadimos los 3 ficheros que formarn el proyecto: 3

Archivo de interfaz Tabulacio.h

Archivo de implementacin "Tabulacio.cpp

Archivo programa principal Moduls3.cpp

4. DATOS ENCAPSULADOS Cuando definimos un tipo abstracto de datos, luego hay que declarar variables de ese tipo para poder trabajar con ellas. Los datos encapsuladas nos permiten declarar dentro de un mdulo una variable y evitar una declaracin explcita externa. Por ejemplo, el mdulo de implementacin pondramos: static Untipo valorInterno; static void Operacion3 () { ..... valorinterno ...... } void Operacion1 () { ..... valorinterno ....... } void Operacion2 () { ..... Valorinterno ...... } 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 poner delante de ellos la palabra static.

You might also like