Está en la página 1de 27

TEMA 1.- INTRODUCCION Maquinas y programas Dispositivo o instrumento fsico capaz de realizar un cierto trabajo u ocupacin.

Mquinas virtuales, son mquinas que , aunque no existan fsicamente, pueden concebirse y describirse con precisin y predecir su comportamiento. Maquinas programables Desde el punto de vista de su funcionamiento, se clasifican: No automticas, operador o agente externo desencadena determinadas operaciones en cada momento, por ejemplo maquina de escribir. Automticas, actan por si solas sin necesidad de operador, aunque pueden responder a estmulos externos, por ejemplo un ascensor. Su funcionamiento puede depender de la forma en que est construida, de los elementos que la componen, y la manera en que estn conectados entre s. Programables, son automticas, y su comportamiento no es siempre el mismo. Se conciben como una mquina base de comportamiento fijo, que se completa con una parte modificable que describe su funcionamiento que se denomina programa. Se comporta como diferentes mquinas particulares, en funcin del programa. Cuando opera bajo control de un programa se dice que el programa se ejecuta en dicha mquina. Concepto de cmputo En informtica se identifica computo con el tratamiento de la informacin. Un computo se concibe como un proceso, en donde se van realizando operaciones o clculos elementales hasta conseguir el resultado final. Concepto de computador Mquina programable para tratamiento de la informacin, es decir, mquina para realizar cmputos. Un programa de computador es una descripcin de un computo. Un programa tambin es una descripcin del comportamiento de una mquina, es decir, maquina virtual. Un computador posee elementos fijos asociados a los dispositivos fsicos (hardware). Un computador posee elementos modificables (programas, es decir, software). Los computadores actuales se denominan mquinas de programa almacenado. Estructura general de un computador:

Memoria, almacena datos y programas. Dispositivo entrada/salida, intercambian informacin con el exterior. Procesador, es el elemento de control, realiza operaciones elementales de tratamiento de informacin interna, u operaciones de entrada salida. Programacin e ingeniera del software Para realizar un determinado tratamiento de informacin con ayuda de un computador, es necesario: Construir computador (hardware), fabricantes de hardware. Desarrollar programa (software) fabricantes de software. Ejecutar programa en computador, usuario. Programacin Labor de desarrollar programas a pequea escala, realizadas por una sola persona. Las tcnicas para el desarrollo del software a gran escala constituyen la ingeniera del software. Consiste en descomponer el trabajo total de programacin en partes independientes, desarrolladas por miembros individuales. La ingeniera del software aade tcnicas organizativas a las tcnicas bsicas de programacin. Objetivos de a programacin Son los siguientes, y en el mismo orden de prioridad: CORRECCIN: Antes de desarrollar un programa debe especificarse con toda claridad el funcionamiento esperado. CLARIDAD: Las descripciones han de ser claras y fcilmente inteligibles por otras personas. EFICIENCIA: Una tarea puede ser programada de diferentes maneras. Algunos de estos programas sern ms eficientes que otros, aprovechando mejor los recursos. Lenguajes de programacin La forma de codificar programas de una mquina en particular se dice que es su cdigo mquina. Un programa codificado en el lenguaje mquina de un modelo de mquina no podr ser ejecutado en otro distinto. Si queremos que el programa funcione en diferentes mquinas tendremos que preparar versiones particulares en el lenguaje mquina de cada una de ellas. Los lenguajes de programacin simblicos sirven para que el programa pueda ser ledo con relativa facilidad, adems son formas de representacin

independientes de las mquinas donde se vayan a usar. Compiladores e intrpretes Son procesadores de lenguajes, es decir, programas especiales que realizan un tratamiento de la informacin en forma de texto que representa el programa en el lenguaje de programacin simblico. Programa fuente, programa en lenguaje simblico. Programa objeto, representacin de programa fuente en cdigo mquina. Compilador, programa que traduce programas en lenguaje simblico a cdigo mquina. Exige 2 etapas, en la primera se traduce el programa fuente a programa objeto, en la segunda se ejecuta el programa objeto y se procesan los datos. La compilacin solo se realiza una vez quedando el programa objeto disponible para ser utilizado tantas veces como se desee. Interprete, programa que analiza directamente la descripcin simblica del programa fuente y realiza las operaciones oportunas. Puede decirse que el interprete es (o simula) una mquina virtual, cuyo lenguaje mquina coincide con el lenguaje fuente. El proceso de un programa mediante interprete se limita solo ha ejecutar directamente el programa en la mquina virtual. El proceso es ms sencillo que el del compilador, su principal inconveniente es que la velocidad de ejecucin es ms lenta, ya que al tiempo que se van tratando los datos hay que ir haciendo el anlisis e interpretacin de las operaciones descritas. Modelos abstractos de cmputo Extraer conceptos comunes de un conjunto de lenguajes de programacin basados en elementos computacionales similares. Existen diversos modelos abstractos de cmputo o modelos de programacin: Funcional Modelo de flujo de datos Lgica Imperativa (el ms extendido) Modelo funcional Se base casi exclusivamente en el uso de funciones. Una funcin es una aplicacin, que hace corresponder un elemento de un conjunto de destino (resultado) a cada elemento de un conjunto de partida (argumento) para el que la funcin est definida. Funcin Resultado ---------------------Suma(a,b) a+b Diferencia(a,b) a-b

Para cmputos complejos, las funciones pueden combinarse, de manera que el resultado de un funcin se use como argumento para otra. 34x5+8x7--->Suma(Producto(34,5),Producto(8,7)) El proceso de computo llamado reduccin, se basa en reemplazar progresivamente cada funcin por el resultado de la misma. Compt parcial Expresin/Resultado --------------------------------------------Suma(Producto(34,5),Producto(8,7)) 34 x 5 Suma(170,Producto(8,7)) 8x7 Suma(170,56) 170+56 226 La programacin funcional permite la definicin de nuevas funciones a partir de las ya existentes, podemos crear una nueva funcin Cuadrado, para obtener el cuadrado de un nmero: Cuadrado(x):=Producto(x,y) El proceso llamado reescritura, consiste en reemplazar una funcin por su definicin, sustituyendo los argumentos simblicos en la definicin por los argumentos reales en el cmputo. Compt parcial -------------------reducir suma reescribir Cuadrado reducir producto Expresin/Resultado -------------------------Cuadrado(Suma(5,3)) Cuadrado(8) Producto (8,8) 64

Modelo de flujo de datos Corresponde a una red de operadores interconectados entre si. Cada operador lo representaremos grficamente mediante un cuadro con entradas y salidas, y dentro de l el smbolo de la operacin que realiza. Modelo de programacin lgica Se denomina programacin declarativa. Un programa consiste en plantear de manera formal un problema a base de declarar una serie de elementos conocidos, y luego preguntar por un resultado dejando que sea la propia mquina la que decida como obtenerlo. Los elementos conocidos que pueden declararse son hechos y reglas. Hecho, es una relacin entre objetos concretos. Regla, relacin general entre objetos que cumplen ciertas propiedades. Hijo(Juan,Luis) Juan es hijo de Luis. La verdadera potencia de la programacin lgica aparece cuando declaramos reglas. Padre(x,y):= Hijo(y,x) Padre(x,Sonia) x=Luis, x=Ana

Modelo imperativo Responde a la estructura interna de un computador, denominada arquitectura Von Neumann. Un programa aparece como una lista de instrucciones u ordenes elementales, que se ejecutan una tras otra, en el orden que aparecen en el programa. El orden de ejecucin puede saltarse mediante instrucciones de control. Las instrucciones tpicas son las de asignacin. Las instrucciones utilizan datos almacenados en memoria, que se denominan variables. Variable, representa un dato almacenado bajo un nombre dado. Elementos de programacin imperativa Procesador, entorno y acciones Procesador, todo agente capaz de leer las ordenes del programa y ejecutarlas. Es un elemento de control. Entorno, dispositivos de almacenamiento, o dispositivos de entrada/salida que permitirn tomar datos de partida del exterior y presentar resultados. Acciones, rdenes o instrucciones del programa que deben ser realizadas por el procesador, son las equivalentes a las instrucciones de un programa real. Acciones primitivas. Acciones compuestas Las acciones son directamente realizables por el procesador. El planteamiento de un programa complejo debe pasar por usar la idea de abstraccin para limitar la complejidad. Al desarrollar el programa habr sido preciso describir o descomponer las acciones compuestas en otras mas sencillas, hasta llegar a acciones primitivas, que son las que realmente podr ejecutar el procesador. Las acciones compuestas facilitan la compresin del programa en su conjunto. Esquemas de acciones Manera en la que varias acciones sencillas se combinan para realizar una accin complicada. La programacin estructurada sugiere el uso de 3 esquemas generales denominados secuencia, seleccin e iteracin, con los cuales se puede llegar a desarrollar un programa tan complicado como sea necesario.

TEMA 2.- ELEMENTOS BSICOS DE PROGRAMACIN Lenguaje C+Est constituido por un subconjunto del vocabulario de los lenguajes C y C++. Cualquier empresa de desarrollo debe disponer antes del inicio de cada desarrollo de un Manual de Estilo. Notacin BNF (Backus-Nur Form) Lo utilizamos para la definicin de las reglas gramaticales de programacin. Para estas reglas se utilizan los metasmbolos: ::= El elemento de la izq puede desarrollarse segn el de la drch. | Se puede elegir uno y slo uno de los elementos separados por este metasmbolo. {} Los elementos incluidos dentro de ellos se pueden repetir cero o ms veces. [] Los elementos incluido dentro pueden ser utilizados o no. () Agrupan elementos de su interior. Valores y tipos Pueden ser de diferentes clases. Un dato solo puede tomar valores de una clase. En programacin a las distintas clases de valores se les denomina tipos. Tipos abstractos de datos, identifican tanto el conjunto de valores que pueden tomar los datos de ese tipo, como las operaciones significativas que pueden hacerse con dichos valores. Representacin de valores constantes Valores numricos enteros Representan un nmero exacto de unidades. No pueden tener parte fraccionaria. Se escriben mediante una secuencia de uno o ms dgitos del 0 al 9. Pueden ir precedidos opcionalmente de los smbolos + o -. Valor_entero::=[+|-] Secuencia_dgitos Secuencia_dgitos::=Dgito{Dgito} Dgito::=0|1|2|3...|9 El lenguaje C+- considera que cuando el valor entero comienza por 0, se est escribiendo en base 8. Valores numricos reales Permiten expresar cualquier cantidad, incluyendo fracciones de unidad. Un mismo valor real, puede tener diferentes representaciones vlidas, el entero no. Se pueden representar de 2 maneras, en la notacin habitual decimal (45.6), o en notacin cientfica (456.E-1). Caracteres Se escriben poniendo el carcter entre apstrofos ('). El espacio en blanco es un carcter vlido. Hay que distinguir entre valor entero de un dgito (p.ej. 7) y el carcter

correspondiente a dicho dgito (p.ej '7'). El juego de caracteres que se puede utilizar, depende de la mquina que se est usando. Los caracteres de control (no tienen smbolo grfico) se representan mediante una secuencia de escape. '\n' Salto al comienzo de una nueva linea '\r' Retorno al comienzo de la misma linea '\t' Tabulacin '\'' Apstrofo '\\' Barra inclinada '\f' Borrado pantalla o salto de pgina Cadena de caracteres Se escribe como una secuencia de caracteres incluidos entre comillas. Si una cadena incluye comillas, se escribir mediante \. No hay que confundir carcter ('x') con cadena de caracteres (x). Es posible definir una cadena vaca . Tipos predefinidos En C+- hay 4 tipos de datos: int, float, char, bool. Un tipo de datos define: Coleccin de valores posibles. Operaciones significativas sobre ellos. INT Valores numricos enteros positivos y negativos. Dado el carcter fsico de los computadores el rango de valores nunca podr ser infinito. El rango de valores depender de la plataforma (procesador, S.O, y compilador) que se est utilizando. Las operaciones entre valores enteros son las operaciones aritmticas bsicas, que se realizan entre enteros y devuelven valores enteros. Cuando se realiza una operacin con enteros se debe tener en cuenta el rango de valores disponible en la plataforma que se est utilizando, ya que si se produce un resultado fuera de rango se producir un error. FLOAT Representa valores numricos reales, positivos o negativos. Al contrario que los int sta representacin puede no ser exacta. La representacin solo se puede considerar valida dentro de un rango. Tanto el rango como la precisin dependen de la plataforma.

Los valores reales se suelen representar internamente de forma equivalente a la notacin cientfica. Las operaciones entre reales dan como resultado un real con la precisin de la plataforma. CHAR No se representa como internamente como un dibujo, sino como un valor numrico entero que es su cdigo. Dependiendo del nmero de bits reservado para representar el cdigo de cada carcter podemos tener tablas ms o menos amplias. Los valores del tipo char ocupan 8 bits e incluyen el repertorio ASCII. Se puede representar cualquier carcter mediante la notacin char(x), p.ej. Char(65) letra A, posicin 65. En sentido inverso int('A') 65. Expresiones aritmticas Representa un clculo a realizar con valores numricos. Es una combinacin de operandos y operadores. Orden de los operadores (se evalan de izq a drch): Parentesis (no est en libro) Signo (no est en libro) Potencia (no est en libro) Producto y divisiones Sumas y restas Si se mezclan en una misma expresin valores de tipos diferentes, las expresiones aritmticas son completamente ambiguas, por lo que lo mejor es realizar conversin explicita. Float(45) 45.0 Int(34.7) 34 Por defecto C+- convierte de manera automtica todos los valores de una misma expresin al tipo del valor con mayor rango y precisin, pero nosotros debemos realizar la conversin explicita. Operaciones de escritura simples Printf Pertenece al mdulo stdio.h printf(cadena-de-caracteres); Escribe en la pantalla cadena-de-caracteres. Una cadena de caracteres con formatos deber incluir en su interior una especificacin de formato, printf(%5d,120/12); resultado = 10, se puede especificar el nmero de decimales, printf(10.3f,1.2); resultado 1.200

Cdigos de formato: d--> decimal entero f--> fixed point real e--> exponencial real con notacin exponencial g--> general real con/sin notacin exponencial c--> carcter carcter s--> string cadena de caracteres Estructura de un programa Un programa C+- se engloba dentro de una estructura principal main(), emjemplo: /** Programa: Hola */ #include <stdio.h> int main(){ printf(Hola\n); } Las lneas precedidas por el smbolo # se llama directivas para el compilador. Con la directiva #include se indica al compilador que utilice el mdulo de librera stdio.h para las operaciones de escritura. El cuerpo del programa contiene las sentencias ejecutables correspondientes a las acciones a realizar, entre los simbolos {}. Cada sentencia termina en ;.

TEMA 3.- CONTANTES Y VARIABLES Identificadores Nombres usados para identificar cada elemento del programa. Estn formados con caracteres alfabticos o numricos, sin espacios ni signos de puntuacin. Deben comenzar por una letra, p.ej. Indice, j5, Eje_3. Etc. No sern vlidos, 3_eje, dia del mes, Ao (no se puede utilizar la ) , etc. C+- distingue entre maysculas y minsculas. En el manual de estilo de C+- se sugieren las siguientes reglas a lo hora de asignar nombre: - Escribir todo el nombre en minsculas. - Escribir en maysculas o empezando por maysculas los nombres de las constantes globales. - Usar guiones o maysculas intermedias para los nombres compuestos. Vocabulario C+Palabras clave, sirven para delimitar determinadas construcciones del lenguaje, son elementos fijos. A este conjunto de elementos fijos se denominan palabras reservadas, p.ej. Bool, break, case, for, if, const, etc. Constantes Concepto de constante Es un valor fijo que se utiliza en el programa. El valor debe ser siempre el mismo para cualquier ejecucin del programa. Declaracin de constantes con nombre Consiste en asociar un identificador a dicho valor constante. La declaracin de la constante, especifica su nombre y tipo de valor asociado. Const float Pi = 3.14159265; Han de ser declaradas en el programa antes de ser utilizadas. Se puede declarar el valor de una constante en forma de expresin, p.ej. Const float diametro = 2*radio; Declaracin_de_constante::= const Tipo Nombre=Expresin_constante; Tipo:=identificador Nombre::=Identificador

Variables Concepto de variable Esta directamente asociado a la memoria del computador. Esta memoria permite almacenar informacin para ser usada posteriormente. Los valores almacenados en memoria pueden ser modificados. Una variable representa un valor almacenado, que puede ser modificado. Las variables de un programa se designan mediante nombre o identificadores. Declaracin de variables Cada variable tiene que tener asociado un tipo de valor. Si una variable tiene asociado un tipo int, solo podr almacenar valores de este tipo. Las variables han de ser declaradas antes de ser utilizadas en el programa. La declaracin simple especifica su nombre y tipo, p.ej. Int edad. Declaracin_de_variable::=Tipo Nombre{,Nombre}; Tipo::=Identificador, Nombre::=Identificador. Uso de variables. Inicializacin El valor almacenado en una variable puede utilizarse usando la variable como operando en una expresin aritmtica. El tipo declarado determina las operaciones que se podrn realizar. Int base, altura; int saldo, meses, dias; float volumen, area, gastos; char modelo, codigo; Se puede escribir expresiones como: base*altura dias+int(codigo) Pero es inapropiado escribir lo siguiente, ya que combina operandos de tipos diferentes: area/base saldo+gastos Si una variable no se ha almacenado todava ningn valor su uso conduce a un resultado imprevisible. Para usar una variable de forma correcta es necesario inicializarla antes de usar su valor. Sentencias de asignacin Una forma de conseguir que una variable guarde un determinado valor es mediante una sentencia de asignacin. Asignacin::=Variable=Expresion; Variable::=Identificador

Autoincremento y autodecremento Variable++; Incrementa el valor de la variable en 1, equivale a variable=variable+1; Variable--; Decrementa el valor de la variable en 1, equivale a variable=variable-1; Compatibilidad de tipos Una sentencia de asignacin puede resultar confusa si el tipo de la variable y el del resultado de la expresin son diferentes. El lenguaje C+- permite esta ambigedad, convierte previamente de manera automtica el valor a asignar al tipo de valor de la variable, pero es obligatorio que se realice siempre una conversin explicita. Int saldo; float gastos; saldo=int(gastos); Operaciones de lectura simples Procedimiento scanf Pertenece al mdulo de librera stdio.h. Lee los datos de entrada y los almacena en determinadas variables. scanf(cadena-con-formato,&variable1, &variable2...&variableN); Los nombres de las variables a leer van precedidos del carcter &. int mes,dia; float saldo; scanf(%d %f %d,&mes,&saldo,&dia); Debe contener un formato de conversin (%x) por cada variable a leer. Los formatos de conversin numricos pueden incluir la especificacin del tamao del dato, pero a diferencia de printf en scanf significa el tamao mximo del dato de entrada a leer, p.ej. 12345Xx %3d--> 123

TEMA 4.- METODOLOGIA DE DESARROLLO DE PROGRAMAS Desarrollo por refinamientos sucesivos 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 en lenguaje de programacin. Cada paso de refinamiento consiste en descomponer cada accin compleja en otras ms simples. Esta descomposicin exige: 1. Identificar las acciones componentes. Identificar la manera de combinar las acciones componentes para conseguir el efecto global. La forma en la que varias acciones se combinan en una accin compuesta constituye el esquema de la accin compuesta. Desarrollo de un esquema secuencial Para desarrollar una accin compuesta segn un esquema secuencial se necesitar: - Identificar las acciones componentes de la secuencia. Identificar las variables necesarias. - Identificar el orden en el que deben ejecutarse las acciones. Se utiliza una flecha () para indicar que una accin complicada se descompone en otras ms sencillas.

TEMA 7.- FUNCIONES Y PROCEDIMIENTOS Concepto de subprograma 1. Es una parte de un subprograma que se desarrolla por separado invocndolo mediante un nombre simblico. Un subprograma sirve para resolver un problema. El empleo de subprogramas resulta ventajoso en los siguientes casos: 2. Programas complejos: si el programa se escribe todo seguido resulta complicado de entender. Con subprogramas se reduce la complejidad de la visin global del programa. 3. Cuando se repiten operaciones anlogas: definiendo esa operacin como subprograma separado, su cdigo se escribir solo una vez, el tamao total del programa ser menor. Las 2 formas fundamentales de subprogramas en la programacin imperativa son las funciones y procedimientos. Funciones Es un tipo de subprograma que calcula como resultado un valor nico a partir de otros valores dados como argumentos. Definicin de funciones El primer paso es declarar su interfaz: float Potencia (float x, int n) int VolumenCubo(int lado) Los argumentos de la cabecera son los argumentos formales, no variables del programa. La definicin de una funcin se compone: Cabecera, que incluye su nombre, los argumentos con el correspondiente tipo para cada unos de ellos, y el tipo de resultado que proporciona. Cuerpo funcin, que tiene la misma estructura que un bloque de programa. Este bloque comienza con una parte declarativa y continua con la parte ejecutiva. En la declarativa se declaran constantes y variables locales (visibles solo en el cuerpo de la funcin). La parte ejecutiva est constituida por una secuencia de sentencias. Ejemplo: float Potencia(float x, int n){ float p = 1.0; for (int k = 1;k <= n; k++){ p = p * x; } return p; } La sentencia return devuelve como valor de la funcin el resultado de los clculos realizados.

Provoca la finalizacin inmediata de la funcin, el resultado debe ser un valor del tipo indicado en la declaracin de la funcin. Uso de funciones Para usar una funcin, se invoca dicha funcin escribiendo su nombre, y entre parntesis los valores concretos de los argumentos, separados por comas. Al invocar una funcin es obligatorio que los valores suministrados para los argumentos (argumentos reales) correspondan en nmero y tipo con los argumentos en la definicin (argumentos formales). El efecto de la invocacin de una funcin puede describirse: - Se evaluan las expresiones de los valores de los argumentos. - Se asignan dichos valores a los argumentos formales. - Se ejecuta el cdigo de la definicin de la funcin, hasta alcanzar la sentencia de retorno. - El valor retornado se usa en el punto donde se invoco la funcin. Funciones predefinidas Son las que forman parte del propio lenguaje de programacin. Ejemplo: int sizeof( tipo ). Las funciones predefinidas son, en general, seudofunciones. Funciones estndar Son funciones definidas en mdulos estndar. Pueden ser utilizadas sin necesidad de escribir su definicin. Hay que indicar que se van a utilizar dichos mdulos de librera mediante la directiva #include del correspondiente mdulo que los contenga. Procedimientos Es un subprograma que realiza una determinada accin. Se diferencia de las funciones en que no tiene como objetivo devolver ningn valor. Un procedimiento agrupa una sentencia o conjunto de sentencias que realizan una accin. Se pueden parametrizar mediante una serie de argumentos. Los procedimientos son acciones parametrizadas.

Definicin de procedimientos Es igual que una funcin, la principal diferencia es que no se declara el tipo de valor del resultado, ya que no existe, en su lugar se utiliza la palabra reservada void. Con cierta frecuencia interesa definir procedimientos sin argumentos. La sentencia return se puede escribir sin ninguna expresin, ya que no hay que devolver ningn valor, simplemente termina la ejecucin del procedimiento en ese momento. Uso de procedimientos Para usar un procedimiento hay que invocarlo. Los valores de los argumentos pueden darse mediante expresiones. Si no hay argumentos no se suprimen los parntesis. Los argumentos en la llamada debern ser compatibles con los indicados en la declaracin. El efecto de la invocacin de un procedimiento puede describirse: - Se evaluan las expresiones de los valores de los argumentos. - Se asignan dichos valores a los correspondientes argumentos formales. - Se ejecuta el cdigo del procedimiento, hasta alcanzar el final del bloque o una sentencia de retorno. - El programa que invoc al procedimiento continua en el punto siguiente a la sentencia de llamada. Paso de argumentos La manera de comunicar informacin entre las sentencias de un subprograma y el programa que lo utiliza es mediante los argumentos. Existen 2 formas distintas: paso de argumentos por valor y por referencia. Paso de argumentos por valor Los argumentos representan valores que se transmiten desde el programa que llama hacia el subprograma. En el caso de las funciones hay adems un valor de retorno, que es el valor de la funcin que se transmite desde el subprograma hacia el programa que lo llam.

Los argumentos reales en la llamada al subprograma pueden darse en forma de expresiones. El modo de paso por valor implica que los elementos usados como argumentos no pueden ser modificados por la sentencias del subprograma, incluso en el caso de que en el subprograma se ejecuten asignaciones a los argumentos formales. El paso por valor puede describirse: - Se evalan las expresiones de los argumentos reales usados en la llamada. - Los valores obtenidos se copian en los argumentos formales. - Los argumentos formales se usan como variables dentro del subprograma. Si se asignan valores no se modificaran los argumentos reales, sino la copia. Paso de argumentos por referencia El paso por referencia se indica en la cabecera, anteponiendo el smbolo & al nombre del argumento formal. Ejemplo: void OrdenarDos( int &y, int &z) Si un argumento se pasa por referencia no se puede utilizar como argumento real una expresin. La asignacin de un nuevo valor al argumento modifica la variable externa pasada como argumento. El paso por referencia puede describirse: - Se seleccionan las variables usadas como argumentos reales. - Se asocia cada variable con el argumento formal correspondiente. - Se ejecutan las sentencias del subprograma como si los argumentos formales fuesen los argumentos reales. Visibilidad. Estructura de bloques Un programa que contenga subprogramas tiene una estructura de bloques que marcan mbitos de visibilidad. Los elementos definidos en el mbito ms externo son elementos globales. Los elementos definidos en el interior del bloque de un subprograma son elementos locales a dicho programa. Los elementos locales de un bloque son invisibles desde el exterior del bloque y dejan de existir al finalizar la ejecucin del bloque. La vista externa de la cabecera es la interfaz del subprograma. El contenido lgico de la interfaz se denomina signatura del subprograma.

Recursividad de subprogramas Cuando un subprograma hace una llamada a s mismo. La ejecucin de un algoritmo recursivo debe terminar en algn momento. Para ello hay que controlar las llamadas recursivas en una estructura condicional. Uso de variables globales. Efectos secundarios Transparencia referencial, consiste en que el efecto de una llamada al subprograma pueda producirse simplemente con la informacin contenida en el cdigo de la llamada. Siempre que se invoque al subprograma con los mismos valores de los argumentos se debe obtener el mismo resultado. La transparencia referencial se garantiza si el cdigo del subprograma utiliza solamente elementos mencionados en la lista de argumentos o definidos como elementos locales. Utilizar variables globales que no se mencionan en la lista de argumentos, permite escribir subprogramas que carecen de T.Referencial. Cuando un subprograma modifica alguna variable externa se dice que se est produciendo efectos secundarios o laterales. La transparencia referencial para las funciones es una cualidad casi imprescindible. Todos los argumentos de las funciones deberan pasarse por valor. Una funcin que no produzca efectos laterales y todos sus argumentos se pasen por valor se dice que es una funcin pura. A veces el uso directo de variables globales puede tener alguna ventaja, si alguno de los argumentos son siempre los mismos en prcticamente todas las llamadas al subprograma. Redefinicin de elementos Al dar un nombre ya utilizado como global a un nuevo elemento local del bloque se est redefiniendo dicho nombre, perdiendo la posibilidad de acceso al elemento global. Se dice que el nombre local oculta al nombre global. Salvo que sea imprescindible no se debe utilizar la redefinicin de elementos.

Doble referencia Cuando una misma variable se referencia con 2 nombres distintos. Esto puede ocurrir en 2 situaciones muy concretas: - Cuando un subprograma utiliza una variable externa que tambin se le pasa como argumento. - Cuando para utilizar un subprograma se pasa la misma variable en 2 o ms argumentos.

TEMA 8.- METODOLOGIA DE DESARROLLO DE PRGRAMAS III Operaciones abstractas Los subprogramas permiten definir operaciones abstractas. Una abstraccin es una versin simplificada de una cierta entidad, de la que solo consideramos sus elementos esenciales prescindiendo de los detalles. Especificacin y realizacin Al plantear operaciones abstractas habremos de definir 2 posibles visiones: - Visin abstracta o simplificada, permite usar dicha operacin sin mas que conocer qu hace dicha operacin (especificacin). - Visin detallada o completa, define como se hace dicha operacin (realizacin). La especificacin puede ser una cabecera de subprograma. La especificacin completa debe establecer la semntica o significado de la operacin. La realizacin debe suministrar toda la informacin necesaria para poder ejecutar la operacin, ser la definicin completa del subprograma. Desarrollo descendente (top-down) Es simplemente desarrollo por refinamientos sucesivos, con posibilidad de definir operaciones abstractas. En cada etapa de refinamiento habr que optar por una de las alternativas siguientes: - Considerar la operacin como terminal, y codificarla en lenguaje de programacin. - Considerar la operacin como compleja, y descomponerla en otras ms sencillas. - Considerar la operacin como abstracta, y especificarla, escribiendo el subprograma que la realiza. Resultar ventajoso refinar una operacin si se consigue alguna de las ventajas siguientes: - Evitar mezclar en un fragmento de programa operaciones con un nivel de detalle diferente. - Evitar escribir repetidamente fragmentos de cdigo que realicen operaciones anlogas. El beneficio obtenido es una mejora en la calidad del programa, por el contrario, hay un aumento de eficiencia en ocupacin de memoria si se codifica como subprograma.

Desarrollo para reutilizacin La principal ventaja es que se amplia el conjunto de aplicaciones en que se podr reutilizar el subprograma. Su inconveniente es que ser ms costoso hacer el desarrollo del subprograma planteado como una operacin de uso general. Desarrollo ascendente (bottom-up) Consiste en ir creando subprogramas que realicen operaciones significativas de utilidad para el programa que se intenta construir. Esta tcnica es anloga a la del desarrollo de subprogramas pensando en su reutilizacin posterior. En este caso se trata de que la identificacin de las operaciones no surja de un proceso de descomposicin o refinamiento, sino simplemente pensando en el programa que se desarrolla. Programas robustos Se dice que un programa es robusto si su operacin se mantiene en condiciones controladas aunque se le suministren datos erroneos. Programacin a la defensiva Consiste en que cada programa o subprograma est escrito de manera que desconfe de los datos o argumentos con que se le invoca y devuelva siempre como resultado: - Resultado correcto si los datos estn bien. - Indicacin precisa de error, si los datos no son correctos. La mejora de la robustez tiene como contrapartida una cierta perdida de eficiencia. Tratamiento de excepciones Hay que considerar 2 actividades diferentes: - Deteccin de la situacin de error. - Correccin de la situacin de error. Si una operacin se ha escrito como subprograma, la programacin a la defensiva recomienda que la primera actividad se haga dentro del subprograma. La segunda actividad no puede realizarse dentro del subprograma, los programas que lo invocan sern quienes decidan como actuar frente al error. Tras la accin correctora se da por terminado el bloque.

La sentencia throw provoca la terminacin del subprograma realizando una terminacin por excepcin. La sentencia try agrupa el bloque de cdigo en el que se programa el algoritmo del problema a resolver sin tener en cuenta las posibles excepciones. La sentencia catch agrupa el cdigo para el tratamiento de la excepcin que se declara entre parentesis Ejemplo: if (n<=0){ thorw k; } . . . try { printf(Sentencia que ejecutamos si todo OK); } catch (int e){ if (e==0){ printf(Error n = 0); } else { printf(Error n<0); } }

TEMA 9.- DEFINICIN DE TIPOS Tipos definidos El tipo establece los posibles valores que puede tomar ese dato. La definicin de tipos supone crear un nuevo nivel de abstraccin dentro del programa. La declaracin de cada nuevo tipo se incia con la palabra calave typedef. Typedef int TipoEdad; TipoEdad edad1, edad2; La definicin de tipos es una declaracin de los esquemas de datos que se necesitan para organizar la informacin de un programa. Definicin de tipos enumerados Se define detrs de la palabra clave enum mediante un identificador del tipo y a continuacin se detalla la lista con los valores separados por comas y encerrados entre llaves. Typedef enun TipoDia{ Lunes, Martes, Miercoles, Jueves, Viernes, Sabado, Domingo } La enumeracin implica un orden, el primer elemento ocupa la posicin 0, el siguiente la 1, etc. Usos de tipos enumerados TipoDia diaSemana; diaSemana = Lunes; Con los tipos enumerados se puede utilizar la notacin int(e) para obtener la posicin de un valor en la lista. La operacin inversa ser TipoDia(0), que ser igual a Lunes. Un dato de tipo enumerado se puede pasar como argumento de procedimientos o funciones. El tipo predefinido bool int(false) == 0 int(true) == 1 Se puede pasar como argumento de un procedimiento o funcin y puede ser devuelto como resultado.

Tipos estructurados Es un tipo cuyos valores se constituyen agrupando datos de otros tipos ms sencillos. Los elementos de informacin que integran un valor estructurado se denominan componentes. 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 indice o nmero de orden que ocupa. Declaracin de vectores typedef TipoElemento TipoVector[NmeroElementos] typedef int TipoVector[10]; TipoVector vector1, vector2; La variabilidad del indice de un vector estar comprendida entre 0 y NumeroElementos-1. Inicializacin de un vector La inicializacin afecta a todos sus elementos, en ella se indica el valor inicial de todos los elementos agrupndolos entre llaves y separados por comas. TipoVector vector1 = {1,2,3,4...9}; Operaciones con elementos de vectores La referencia a un elemento concreto se hace mediante el nombre del vector seguido, entre corchetes, del ndice del elemento referenciado, por ejemplo: vector1[0] Un elemento de un vector puede formar parte de cualquier expresin con constantes, variables u otros elementos, teniendo en cuenta las reglas de compatibilidad. Como indice para designar un elemento se puede utilizar una variable o expresin. Siempre se debe comprobar que no existe ninguna posibilidad de que por error el ndice calculado por la expresin salga fuera del rango entre 0 y N-1.

Operaciones globales con vectores No existe posibilidad de asignacin global, la asignacin se tiene que programar explicitamente mediante un bucle que realice la copia elemento a elemento. For (int i = 0;i < NumeroElementos; i++){ vector2[i] = vector1[i]; } Paso de argumentos de tipo vector Otra manera habitual de operar globalmente con los vectores es utilizarlos como argumentos de procedimientos o funciones. El modo por defecto de paso de argumentos para vectores es por referencia, por lo que hay que tener en cuenta que el argumento real puede ser modificado. No es necesario que vaya precedido del & en la cabecera. Void LeerVector( TipoVector v){....} LeerVector(vector1); Cuando se utilizan argumentos de tipo formacin y no se quiere que se modifiquen los parmetros reales en la llamada al procedimiento, los argumentos formales deben ir precedidos de la palabra clave const. Void LeerVector( const TipoVector v){....} Cuando declaramos un argumento de tipo vector precedido de la palabra const es equivalente al paso de dicho argumento por valor. Vector de caracteres Las cadenas son vectores de caracteres. La caracterstica peculiar de las cadenas es la siguiente: - Es un vector en el que se pueden almacenar textos de diferentes longitudes. - Siempre se reserva espacio para un carcter ms, y se hace que todo cadena termine con un carcter nulo '\0' al final. Por ejemplo para declarar una cadena de 20 caracteres: typedef char Cadena20[21]; Cadena20 nombre, apellido; La librera string facilita el manejo de cadenas: 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), devuelve cero si c1 y c2 son iguales; menor que cero si c1 precede a c2 en orden alfabtico y mayor que cero si c2 precede a c1 en orden

alfabtico. No es posible realizar asignaciones globales entre cadenas. nombre=Jose; Error en C+Esta operacin se puede realizar utilizando la funcin strcpy vista anteriormente, strcpy(nombre,Jose); Tipo tupla y su necesidad En este esquema el dato estructurado est formado por una coleccin de componentes, cada uno de los cuales puede ser de un tipo diferente, y se identifican por un nombre. Tipo registro (struct) Los esquemas de tupla pueden usarse en programas en C+- definiendolos como estructuras del tipo registro o struct. Un registro struct es una estructura de datos formada por una coleccin de elementos de informacin llamados componentes. Definicin de registros typedef struct TipoFecha{ int dia; int mes; int anno; }; Variables de tipo registro y su inicializacin Para declarar variables de tipo registro es necesario haber realizado previamente la definicin del tipo de registro. TipoFecha hoy; Estas variables se pueden inicializar en la declaracin como los vectores, pero teniendo en cuenta el tipo de dato de cada campo. TipoFecha hoy {12, 12, 2010}; Uso de registros Se dispone de 2 posibilidades: - Operar con el dato completo, es bastante limitado, la nica operacin es la de asignacin. - Operar con cada campo por separado. Dos estructuras son compatibles en asignacin sin son del mismo tipo, o de tipos sinnimos, no es suficiente la llamada compatibilidad estructural, es decir, dos estructuras con los mismos campos no son compatibles si sus definiciones se hacen por separado.

Tambin es posible pasar como argumento un dato de tipo registro a una funcin o procedimiento, y que estos lo devuelvan como resultado. La forma de hacer referencia a un campo es fecha.dia