PROGRAMACIÓN Curso 0: Programación Alberto Sánchez <[email protected]> Alberto Sánchez Escuela Técnica Superior de Ingeniería Informática 1 Índice PROGRAMACIÓN Introducción a la programación Lenguaje C Programación estructurada Programación estructurada Variables Operadores Estructuras de control Estructuras de datos Entrada/Salida Funciones Aplicaciones modulares Escuela Técnica Superior de Ingeniería Informática 2 Definiciones PROGRAMACIÓN O Ordenador: máquina sin inteligencia propia, cuya finalidad es d d á i i i t li i i fi lid d interpretar el código (instrucciones) que se les proporciona g j q g j q p y Lenguaje máquina: lenguaje que la computadora "entiende" y es capaz de ejecutar (Os y 1s) Lenguaje de programación: medio de comunicación entre el programador y el ordenador El programador escribe en algún programador y el ordenador. El programador escribe en algún lenguaje de programación y utiliza las herramientas provistas (compiladores, etc.) por ese lenguaje para transformarlo en lenguaje máquina lenguaje máquina. Programa: secuencia de órdenes a ser ejecutadas por el ordenador escrito en algún lenguaje de programación Algoritmo: secuencia de instrucciones que permiten obtener un resultado en particular. Ej: receta de cocina Escuela Técnica Superior de Ingeniería Informática 3 Índice PROGRAMACIÓN Introducción a la programación Lenguaje C Programación estructurada Programación estructurada Variables Operadores Estructuras de control Estructuras de datos Entrada/Salida Funciones Aplicaciones modulares Escuela Técnica Superior de Ingeniería Informática 4 Características del lenguaje C PROGRAMACIÓN C es uno de los lenguajes de programación más extendidos hoy en día Historia de C: Historia de C: 1970 Bell desarrolla un nuevo S.O. para PDP‐11 ‐> UNICS ‐> UNIX. Difícil de programar en PDP‐11 p g 1972 Dennis Ritchie diseña el lenguaje de programación C Fabricantes crean sus propios compiladores ‐> pérdida de p p p p portabilidad 1980 Estandarización de C. ANSI C 1983 surge C++, versión de C orientada a objetos (Bjarne Stroustrup) Escuela Técnica Superior de Ingeniería Informática 5 Características de C PROGRAMACIÓN Sencillez Estructurado: su esquema de programación es imperativo vs. Orientado a objetos (C++, Java, …). C it Consiste en escribir una secuencia de instrucciones una ibi i d i t i detrás de la otra, las cuales se ejecutarán en orden. Compilado. Las órdenes son transformadas a lenguaje Compilado Las órdenes son transformadas a lenguaje máquina que se almacena en un archivo ejecutable. Potente. Aunque es un lenguaje de alto nivel, tiene Potente. Aunque es un lenguaje de alto nivel, tiene capacidades de bajo nivel Un lenguaje es de bajo nivel cuanto más cercano esté al código máquina. Un lenguaje que es de alto nivel cuanto más cercano esté del lenguaje humano. lenguaje humano. Escuela Técnica Superior de Ingeniería Informática 6 Índice PROGRAMACIÓN Introducción a la programación Lenguaje C Programación estructurada Programación estructurada Variables Operadores Estructuras de control Estructuras de datos Entrada/Salida Funciones Aplicaciones modulares Escuela Técnica Superior de Ingeniería Informática 7 Programación estructurada PROGRAMACIÓN La programación estructurada sigue tres reglas: Secuencia: las instrucciones del código se leen una detrás de otra Iteración: según cierta condición, un número de i t instrucciones puede repetirse un numero determinado de i d ti d t i d d veces Decisión: según ciertas condiciones se ejecutan o no un Decisión: según ciertas condiciones se ejecutan o no un conjunto de instrucciones Escuela Técnica Superior de Ingeniería Informática 8 Estructura de un programa PROGRAMACIÓN En la programación estructurada tiene que existir un inicio y un fin pe ecta e te de do de acue do a d ag a a de ujo de perfectamente definido de acuerdo al diagrama de flujo del programa Un Un programa bien estructurado debería tener algún subprograma programa bien estructurado debería tener algún subprograma que capture cualquier error dentro del programa Escuela Técnica Superior de Ingeniería Informática 9 Primer programa PROGRAMACIÓN #include <stdio.h> int main() { printf(“Hola mundo\n”); return 0; } #include : es una directiva de preprocesador. Lo que p p q hace es copiar todo el código del archivo stdio.h y pegarlo en esa línea. int main(): es la función que hace de punto de entrada del programa. Todo programa en C debe tener una función main. Escuela Técnica Superior de Ingeniería Informática 10 Primer programa PROGRAMACIÓN #include <stdio.h> int main() { printf(“Hola mundo\n”); return 0; } printf printf : es una llamada a una función de biblioteca, : es una llamada a una función de biblioteca, que imprime un string en la pantalla. “Hola Hola mundo\n mundo\n”:: es un string es un string constante. El caracter constante El caracter ‘\n’ indica un salto de línea. return: es el valor de retorno de la función. t l l d t d l f ió Escuela Técnica Superior de Ingeniería Informática 11 Primer programa PROGRAMACIÓN #include <stdio.h> int main() { printf(“Hola mundo\n”); return 0; } Las Las sentencias acaban en sentencias acaban en ‘;’ ; Las llaves { } se utilizan para definir bloques de código que forman el cuerpo de determinadas sentencias que forman el cuerpo de determinadas sentencias, en este caso una función. Escuela Técnica Superior de Ingeniería Informática 12 Comentarios PROGRAMACIÓN Comentario: líneas de texto que el compilador o el intérprete no consideran como parte del código, con lo cual no están sujetas a restricciones de sintaxis. Sirven para aclarar partes de código en posteriores lecturas y, en general, para anotar cualquier cosa que el programador considere oportuno. Es una prioridad documentar el código fuente ya que al momento de depurar ahorra mucho tiempo de análisis para su corrección o estudio. Escuela Técnica Superior de Ingeniería Informática 13 Comentarios PROGRAMACIÓN #include <stdio.h> /* Punto de entrada del p programa g */ / int main() { //Llamada a printf printf(“Hola mundo\n”); return 0; } Se pueden introducir comentarios dentro del código. Se pueden introducir comentarios dentro del código. Con // se introduce un comentario de una sola línea. Con /* y */ se introducen comentarios multilínea. C /* */ i t d t i ltilí Escuela Técnica Superior de Ingeniería Informática 14 Proceso de construcción PROGRAMACIÓN Preprocesado: Las directrices que comienzan por # son directrices del preprocesador. Son interpretadas por el preprocesador, normalmente con sustituciones. El código fuente ya preprocesado se Compilación: El código fuente ya preprocesado se transforma en código máquina. Enlazado: se integra todo el código objeto de las Enlazado: se integra todo el código objeto de las distintas unidades compiladas en un solo programa ejecutable. ejecutable Escuela Técnica Superior de Ingeniería Informática 15 Proceso de construcción PROGRAMACIÓN El compilador que se utiliza habitualmente en entornos UNIX (como Linux) es gcc (GNU C Compiler) Sintaxis: gcc archivo.c –o archivo: Preprocesa, compila y enlaza archivo.c generando el ejecutable archivo g j gcc archivo.c –c –o archivo.o: Preprocesa y compila archivo.c generando el fichero objeto archivo.o gcc archivo.o –o archivo: Enlaza archivo.o y genera el ejecutable archivo Entornos de compilación completos: Visual Studio, Dev C++ Escuela Técnica Superior de Ingeniería Informática 16 Índice PROGRAMACIÓN Introducción a la programación Lenguaje C Programación estructurada Programación estructurada Variables Operadores Estructuras de control Estructuras de datos Entrada/Salida Funciones Aplicaciones modulares Escuela Técnica Superior de Ingeniería Informática 17 Variables y constantes PROGRAMACIÓN El El ordenador sigue una serie de instrucciones. Pero d d i i d i i P esas instrucciones tienen que operar sobre una serie de datos El ordenador típico sólo procesa una de datos. El ordenador típico sólo procesa una instrucción a la vez, por lo que necesita 'espacios de memoria' donde guardar o depositar, a modo de memoria donde guardar o depositar a modo de cajones, los diversos datos con los que trabaja. Estos espacios de memoria corresponden: p p Variables: pensadas para ser leídas y modificadas Constantes: para datos que no pensamos modificar (ej: valor Pi para calcular el perímetro o área de un círculo). No puedan ser reescritas. Escuela Técnica Superior de Ingeniería Informática 18 Tipos de datos elementales PROGRAMACIÓN char: carácter int : entero con signo unsigned int : entero sin signo : entero sin signo long : entero largo con signo unsigned long : entero largo sin signo float : número en coma flotante, precisión simple double : número en coma flotante, doble precisión void : tipo vacío : tipo vacío Escuela Técnica Superior de Ingeniería Informática 19 Tipos de datos derivados PROGRAMACIÓN Tipos enumerados Ti d Rango de valores pequeño Cada valor identificado por un nombre p enum tMesesAnyo {enero=1, febrero, marzo, abril, mayo, j i j li junio, julio, agosto, septiembre, octubre, noviembre, t ti b t b i b diciembre}; Definición de tipos con typedef Permite crear nuevos tipos de datos Mejora legibilidad del código ó typedef <tipo> <alias>; Escuela Técnica Superior de Ingeniería Informática 20 Declaración de variables PROGRAMACIÓN /* Variables globales */ int i; int j = 10; float k, l; static char m; int funcion() { /* Variables locales */ char c; char d = ‘A’; static int e; . . . . . . return 0; } Escuela Técnica Superior de Ingeniería Informática 21 Declaración de variables PROGRAMACIÓN Tipos de variables Tipos de variables Global: si se declara fuera de cualquier f ió S función. Se puede acceder a ella desde d d ll d d cualquier función. Local: se declaran dentro de una función, y solo son visibles desde el bloque donde se solo son visibles desde el bloque donde se declaran. Escuela Técnica Superior de Ingeniería Informática 22 Variables externas PROGRAMACIÓN Variables globales: visibles por todas las funciones de un mismo fichero Variables externas: para compartir variables globales entre diferentes ficheros, han de ser declaradas en los ficheros donde se desea como compartir como variables extern con el mismo nombre y tipo. Esta declaración no reserva memoria: variables declaradas pero no definidas p Escuela Técnica Superior de Ingeniería Informática 23 Variables estáticas PROGRAMACIÓN Se declaran al principio de un bloque con static Son visibles dentro de ese bloque Al finalizar el bloque no se destruyen, conservando su valor entre distintas ejecuciones del bloque al que su valor entre distintas ejecuciones del bloque al que pertenecen Una Una variable global estática solo es accesible desde el variable global estática solo es accesible desde el fichero donde está declarada. Una variable local estática conserva el valor entre distintas llamadas a la función. Escuela Técnica Superior de Ingeniería Informática 24 Declaración de constantes PROGRAMACIÓN Varias formas de declararlas: Usando la directiva del preprocesador #define: #define MAX_SIZE 64 Usando un tipo enumerado: enum{ MAX SIZE = 64, MAX_SIZE 64 }; Usando const : Usando const : const int MAX_SIZE = 64; Escuela Técnica Superior de Ingeniería Informática 25 Constantes PROGRAMACIÓN Constantes carácter: encerrado entre apóstrofes Uso de \ para caracteres especiales Representación Descripción Carácter Descripción ASCII ‘\n’ Nueva línea LF 10 ‘\r’ Retorno de carro CR 13 ‘\ ’ ‘\t’ Tabulación b l ió HT 9 ‘\b’ Espacio BS 8 ‘\\’ \\ Barra invertida Barra invertida \ 92 ‘\’’ Comilla simple ‘ 39 ‘\”’ Doble comilla ’“ 34 Cadenas de caracteres: secuencia de caracteres encerrada entre comillas “ ”. el compilador añade al final el carácter nulo ‘\0’ Escuela Técnica Superior de Ingeniería Informática 26 Índice PROGRAMACIÓN Introducción a la programación Lenguaje C Programación estructurada Programación estructurada Variables Operadores Estructuras de control Estructuras de datos Entrada/Salida Funciones Aplicaciones modulares Escuela Técnica Superior de Ingeniería Informática 27 Operadores PROGRAMACIÓN Aritméticos: : suma, resta, multiplicación, división y resto de la división entera. +, -, *, /, % Lógicos: no existe un tipo de datos boolean. En C se utilizan enteros. 0 es falso y distinto de 0 es y verdadero: &&, , ||, ! : and, or y not. , y Relacionales (devuelven un entero: 0 ‐> falso, distinto de 0 ‐>> verdadero): de 0 verdadero): >, >=, <, <=, ==, != : mayor, mayor o igual, menor, menor o igual, igual, distinto. menor o igual, igual, distinto. Escuela Técnica Superior de Ingeniería Informática 28 Operadores PROGRAMACIÓN Asignación: a = b : asigna a a el valor de b a++, , ++a, , a--, , --a : p postincremento, preincremento, ,p , postdecremento, predecremento +=, -=, *=, /= : suma, resta, multiplicación y división con asignación. Ejemplo: a += b; es equivalente a: a = a + b; Otros: sizeof(variable o tipo): tamaño en memoria de la variable o tipo Escuela Técnica Superior de Ingeniería Informática 29 Operadores PROGRAMACIÓN Conversión de tipos: Implícita: En expresiones el tipo mas bajo promociona al mas alto long double > double > float > unsigned long long > long long > unsigned long > long > unsigned int > int > unsigned short > unsigned long > long > unsigned int > int > unsigned short > short > unsigned char > char En asignaciones el valor del lado derecho se convierte al tipo g p de la variable de la izquierda Explicita (casting) (tipo) expresion Escuela Técnica Superior de Ingeniería Informática 30 Operadores PROGRAMACIÓN Precedencia P d i Prioridad de unos operadores frente a otros operadores frente a otros Puede modificarse con p paréntesis Asociatividad define el orden de ejecución para operadores con idéntica d dé precedencia Escuela Técnica Superior de Ingeniería Informática 31 Índice PROGRAMACIÓN Introducción a la programación Lenguaje C Programación estructurada Programación estructurada Variables Operadores Estructuras de control Estructuras de datos Entrada/Salida Funciones Aplicaciones modulares Escuela Técnica Superior de Ingeniería Informática 32 Estructuras de control PROGRAMACIÓN P Permiten modificar el flujo de ejecución de las it difi l fl j d j ió d l instrucciones de un programa. Con las estructuras de control se puede hacer: Con las estructuras de control se puede hacer: Selección: De acuerdo a una condición, ejecutar un grupo u otro de sentencias (if‐then‐else, switch‐case) Iteración: Ejecutar un grupo de sentencias mientras exista una condición (while, do‐while) Ejecutar un grupo de sentencias el número de veces indicado en Ej t d t i el número de eces i di d una condición (for) Todas las estructuras de control tienen un único punto de entrada y un único punto de salida. d ú i d lid Las estructuras de control pueden anidarse. Escuela Técnica Superior de Ingeniería Informática 33 Estructuras de control PROGRAMACIÓN if – then – else if (expresion) { . . . . . . } else { . . . . . . } Llaves Llaves opcionales si solo hay una instrucción dentro opcionales si solo hay una instrucción dentro del bloque (mejor poner siempre) else l opcional i l Escuela Técnica Superior de Ingeniería Informática 34 Estructuras de control PROGRAMACIÓN switch‐case switch (expresion){ case valor1: . . . break; case valor2: . . . break; . . . . default: . . . } Solo evalúa valores discretos. default y break opcionales. Escuela Técnica Superior de Ingeniería Informática 35 Estructuras de control PROGRAMACIÓN while y do‐while while (expresion) { . . . } do { . . . } while(expresion); Mientras Mientras la expresión sea distinto de 0 se ejecuta el la expresión sea distinto de 0 se ejecuta el bucle. do‐while: el bucle se ejecuta al menos una vez. d hil l b l j t l Escuela Técnica Superior de Ingeniería Informática 36 Estructuras de control PROGRAMACIÓN for for(inicialización; condición; actualización) { . . . . . . } Inicialización: expresión que da un valor inicial al iterador del bucle. Condición: expresión de permanencia en el bucle. Cuando la condición no se cumple, se sale del bucle. Actualización: expresión que modifica el valor del A li ió ió difi l l d l iterador. Inicialización, condición y actualización son todas Inicialización condición y actualización son todas opcionales. Escuela Técnica Superior de Ingeniería Informática 37 Índice PROGRAMACIÓN Introducción a la programación Lenguaje C Programación estructurada Programación estructurada Variables Operadores Estructuras de control Estructuras de datos Entrada/Salida Funciones Aplicaciones modulares Escuela Técnica Superior de Ingeniería Informática 38 Estructuras de datos PROGRAMACIÓN FForma de organizar un conjunto de datos elementales con el d i j t d d t l t l l objetivo de facilitar su manipulación. Un dato elemental es la mínima información que se tiene en un sistema. Una Una estructura de datos define la organización de éstos y un conjunto de estructura de datos define la organización de éstos y un conjunto de operaciones que se pueden realizar sobre ellos. Las operaciones básicas son: Alta, adicionar un nuevo valor a la estructura. , Baja, borrar un valor de la estructura. Búsqueda, encontrar un determinado valor en la estructura para realizar una operación con este valor, en forma secuencial o binario (siempre y cuando los datos estén ordenados) datos estén ordenados). Cada estructura ofrece ventajas y desventajas en relación a la simplicidad y eficiencia para la realización de cada operación. De esta forma la elección de la estructura de datos apropiada para esta forma, la elección de la estructura de datos apropiada para cada problema depende de factores como la frecuencia y el orden en que se realiza cada operación sobre los datos. Escuela Técnica Superior de Ingeniería Informática 39 Arrays (Vectores) PROGRAMACIÓN Son variables que contienen una colección consecutiva de datos. Se declaran entre corchetes, y su tamaño debe ser Se declaran entre corchetes, y su tamaño debe ser fijado en tiempo de compilación. Se accede a los elementos también entre corchetes. Se accede a los elementos también entre corchetes Los índices comienzan en 0, y no hay comprobación. int a[10]; //array de 10 ints float b[2][10] //array de 2 dimensiones . . . a[0] = 10; b[1][4] = 5.3; a[20] [20] = 123; 123 //esto // no da d error de d compilación il ió Escuela Técnica Superior de Ingeniería Informática 40 Arrays o vectores PROGRAMACIÓN Arrays Tipos elementales (char, int, float...) Tipos derivados (punteros, arrays, estructuras…) Los elementos del array son accesibles a través de un í di índice valor entero entre 0..N‐1, siendo N el máximo número de elementos 0 1 2 3 4 25 1 3 4 1 vectorEnteros vectorEnteros[0] Tema I.5 T. de datos derivados vectorEnteros[1] vectorEnteros[2] vectorEnteros[3] Escuela Técnica Superior de Ingeniería Informática vectorEnteros[4] 41 Arrays (Vectores) PROGRAMACIÓN Al declarar un array se le puede dar valores iniciales a sus elementos: int int int i t int a[4] = {13, {13 1, 1 27, 27 1289}; b[] = {1, 3, 5, 7, 9}; c[4] = {23, 12}; //c[2] y c[3] sin inicializar d[2] = {12, {12 24, 24 91, 91 103}; 103} //warning // i Si Si no se especifica el tamaño, tomará el del número no se especifica el tamaño tomará el del número de elementos inicializados. Si se inicializan menos del tamaño los no Si se inicializan menos del tamaño, los no inicializados tendrán basura. Si se inicializan más del tamaño el compilador dará Si se inicializan más del tamaño, el compilador dará un aviso. Escuela Técnica Superior de Ingeniería Informática 42 Punteros PROGRAMACIÓN Concepto de variable Región en memoria reservada para almacenar un dato de un tipo determinado tipo determinado Posición de memoria inicial Tamaño en bytes y 0xA031 0xA032 0xA033 65 1 byte 3489 4 bytes 0xA034 char letra = ‘A’; unsigned int entero = 3489; 0xA038 Tema I.5 T. de datos derivados Escuela Técnica Superior de Ingeniería Informática 43 Punteros PROGRAMACIÓN Punteros: Variable que representa una posición de memoria que contiene un dato. Se declaran anteponiendo un * al nombre de la variable. tipo * identificador; float datoReal =123.4; float *float * pDatoReal = &datoReal; pDatoReal; 0xFE87A1 0 A030 0xA030 0xFE87A2 0xA031 123.4 0xFE87A6 Tema I.5 T. de datos derivados 0xFE87A2 0xF4532 4 bytes 4 bytes 0xA035 Escuela Técnica Superior de Ingeniería Informática 44 Punteros PROGRAMACIÓN Operaciones: El operador * dereferencia el puntero. Es decir, se accede al valor apuntado. El operador & devuelve la dirección de memoria donde se encuentra una variable. Es decir se obtiene un puntero a la variable. bl int a = 0; int *b; b = &a; // b apunta a la dirección donde está a *b = 127; // se guarda 127 en la dir. apuntada por b //En este punto la variable a tiene valor 127 Escuela Técnica Superior de Ingeniería Informática 45 Punteros PROGRAMACIÓN Operaciones: Los punteros se pueden sumar, restar, etc Esas operaciones se hacen en múltiplos del tamaño del p p dato apuntado. int *a = . . . . //a apunta a algún lugar a = a + 1; //ahora apunta sizeof(int) más adelante a = a + 4; //ahora apunta 4*sizeof(int) más adelante Escuela Técnica Superior de Ingeniería Informática 46 Punteros – Memoria dinámica PROGRAMACIÓN Cuando se declara una variable de tipo puntero, no apunta a ningún sitio “válido”, y no hay memoria reservada para esa variable. Para manejar memoria de forma dinámica, se utilizan las llamadas malloc y free. las llamadas malloc y free. void *malloc(size_t size): devuelve un puntero a una zona de memoria de size bytes. Como devuelve un zona de memoria de size bytes Como devuelve un puntero void* hay que convertirlo al tipo de puntero que se quiere usar que se quiere usar. void free(void *ptr): libera la zona de memoria apuntada por ptr t d t y obtenida previamente con malloc bt id i t ll Escuela Técnica Superior de Ingeniería Informática 47 Punteros – Memoria dinámica PROGRAMACIÓN Ejemplo: int *a, *b; // punteros a enteros //se reserva espacio en memoria para un entero //a apunta a ese espacio de memoria a = (int *) malloc (1*sizeof(int)); //se reserva espacio en memoria para 16 enteros //b apunta a ese espacio de memoria b = (int *) malloc (16*sizeof(int)); // //se libera el espacio p del primer p malloc free(a); //se libera el espacio del segundo malloc free(b); Escuela Técnica Superior de Ingeniería Informática 48 Relación entre punteros y arrays PROGRAMACIÓN Los arrays se pueden comportar como punteros, y los punteros como arrays. Una variable de tipo array es un puntero al primer elemento del array. Un puntero al primer elemento de una colección puede usarse como un Un puntero al primer elemento de una colección puede usarse como un array. int vectorEnteros[]={25,1,3,4,1}; 0 A010 0xA010 0xA014 0 A018 0xA018 0xA01C 0 A020 0xA020 0xA024 25 vectoEnteros[0] o *(vectorEnteros) 1 vectoEnteros[1] o *(vectorEnteros+1) ( ) 3 vectoEnteros[2] o *(vectorEnteros+2) 4 1 [ ] ( ) vectoEnteros[3] o *(vectorEnteros+3) vectoEnteros[4] o *(vectorEnteros+4) … Tema I.5 T. de datos derivados Escuela Técnica Superior de Ingeniería Informática 49 Arrays y punteros PROGRAMACIÓN Diferencias: Un array tiene un tamaño asociado, un puntero no: Un array es un puntero estático, no se puede cambiar el y p , p lugar al que apunta. int a[16]; //array de 16 elementos int s1 = sizeof(a); //s1 valdrá 16*sizeof(int) int *b = (int *) malloc (128*sizeof(int); //b es un puntero // p a una colección de 128 ints int s2 = sizeof(b); //s2 valdrá 4 u 8, que es el //tamaño de una dirección Escuela Técnica Superior de Ingeniería Informática 50 Strings PROGRAMACIÓN En C no existe un tipo de datos para strings. Se utilizan arrays de char acabados con el caracter ‘\0’ \0 Una cadena de caracteres entre comillas dobles es un inmediato que representa un string un inmediato que representa un string. char string1[] = “Hola”; char *string2 = “Hola”; char *string3[] string3[] = {‘H’ { H , ‘o’ o , ‘l’ l , ‘a’ a , ‘\0’} \0 } //Los 3 strings son iguales Escuela Técnica Superior de Ingeniería Informática 51 Strings ‐ Funciones PROGRAMACIÓN Algunas funciones de biblioteca para manejo de strings: strlen: devuelve la longitud del string. g g strcat: concatena dos strings. strcpy: copia un string sobre otro. py p g strdup: duplica un string. strchr: busca un carácter en el string. g Escuela Técnica Superior de Ingeniería Informática 52 Registros PROGRAMACIÓN Son tipos compuestos formados por elementos heterogéneos. Dentro del registro cada elemento tiene un Dentro del registro cada elemento tiene un identificador y un tipo. //Declaración del registro struct Complejo { float real; float imag; }; //Declaración de variables del tipo registro struct Complejo uncomplejo, otrocomplejo; Escuela Técnica Superior de Ingeniería Informática 53 Registros PROGRAMACIÓN Para acceder a los elementos de un registro estructura se utiliza el operador punto (.) uncomplejo.real p j = 1.3; ; uncomplejo.imag = 2.7; Si Si se trata de un puntero a registro se puede atajar t t d t it d t j con el operador flecha (‐>) struct Complejo *a = (struct Complejo p j *)malloc(sizeof(struct Complejo)); p j ; a->real = 2.4; //lo mismo que (*a).real = 2.4; a->imag a >imag = 3.14; //lo mismo que ( (*a).imag a).imag = 3.14; Escuela Técnica Superior de Ingeniería Informática 54 Estructuras de datos avanzadas PROGRAMACIÓN Listas Enlazadas Li t E l d Listas Simples Listas Doblemente Enlazadas Listas Circulares Colas (FIFO: First In ‐ First Out) Pilas (LIFO: Last In ‐ First Out) Árboles Árboles Binarios Á b l Bi i Tablas Hash (asocia claves con valores). Funciona transformando la clave con una función hash en un hash, , un número que la tabla hash utiliza para localizar el valor deseado. Escuela Técnica Superior de Ingeniería Informática 55 Índice PROGRAMACIÓN Introducción a la programación Lenguaje C Programación estructurada Programación estructurada Variables Operadores Estructuras de control Estructuras de datos Entrada/Salida Funciones Aplicaciones modulares Escuela Técnica Superior de Ingeniería Informática 56 Entrada/Salida PROGRAMACIÓN Definidas en stdio.h Funciones disponibles para entrada/salida: printf: permite escribir en la pantalla printf: permite escribir en la pantalla getchar/putchar : leer/escribir un caracter. scanf : para leer del teclado con formato scanf : para leer del teclado con formato. gets : para leer una línea del teclado (PELIGROSA. Mejor usar fgets). usar fgets). puts: para escribir una línea en la pantalla. Escuela Técnica Superior de Ingeniería Informática 57 printf PROGRAMACIÓN i t printf(const int i tf( t char h *f *format, t . . .); ) *format format es el string que se imprimirá en pantalla. es el string que se imprimirá en pantalla Admite una serie de caracteres de sustitución que serán reemplazados en orden por el resto de serán reemplazados en orden por el resto de argumentos e la función. char dia[] = “Domingo”; int hora = 12; int min = 30; printf(“Hoy es %s y son las %d:%d\n”, dia, hora, min); Escuela Técnica Superior de Ingeniería Informática 58 Entrada/Salida PROGRAMACIÓN Se debe especificar el formato de cada dato a utilizar [fl [flags] ] [ [ancho][.precisión] h ][ i ió ] [l [longitud] it d] especificador_formato ifi d f t Especificador de formato Descripción %c %d carácter indi id al carácter individual %i %u entero decimal con signo entero decimal sin signo g %o %ou entero octal con y sin signo %x %X entero hexadecimal con signo %xu %Xu entero hexadecimal sin signo %f %F double con notación decimal‐punto % %e %E d bl double con notación exponencial ió i l %g %G double %p valor de un puntero valor de un puntero %s cadena de caracteres Escuela Técnica Superior de Ingeniería Informática 59 scanf PROGRAMACIÓN Lectura por teclado de los datos de entrada scanf (cadena_de_control, _ _ &var1, &var2, …); cadena_de_control contiene especificadores de formato establecen la forma de leer los datos son los mismos que los utilizados en printf tantos especificadores como datos a leer int limite; printf("Introduzca el limite superior de la serie: "); scanf("%d", f("%d" &limite); &li i ) Escuela Técnica Superior de Ingeniería Informática 60 Entrada/Salida con ficheros PROGRAMACIÓN Las operaciones de E/S vienen precedidas de la creación de un stream o flujo de datos. Un stream nos permite establecer una conexión (entre un origen y un destino) a través de la cual circula información: FILE : es un tipo de datos que representa un fichero abierto Funciones y tipos de datos para el manejo de ficheros: fopen: abre un fichero. fclose: cierra un fichero. fread: leer datos de un fichero. f i fwrite: escribir datos a un fichero. ibi d fi h fprintf/fscanf: igual que printf y scanf pero con ficheros en lugar de stdout y stdin. de stdout y stdin fputs/fgets: escribe/lee una línea completa de un fichero. Escuela Técnica Superior de Ingeniería Informática 61 Entrada/Salida con ficheros PROGRAMACIÓN Apertura de un archivo A d hi FILE* fopen(const char* nombreArchivo, const char* modo); Modo Descripción r Solo lectura Solo lectura. w Trunca el fichero para escritura. a Escritura al final del fichero. r+ Lectura y escritura. w+ Lectura y escritura. Fichero creado si no existe. a+ Lectura desde comienzo y escritura desde el final. Devuelve un puntero a NULL si no se puede abrir el archivo Tema I.7 Otros aspectos Escuela Técnica Superior de Ingeniería Informática 62 Entrada/Salida con ficheros PROGRAMACIÓN Cierre de archivos Ci d hi int fclose( FILE* pf); Importancia de cerrar un fichero llos flujos FILE fl j FILE llevan asociado un buffer intermedio ll i d b ff i t di este buffer sólo se vuelca al fichero cuando esta lleno de esta forma se consigue reducir el número de accesos a un de esta forma se consigue reducir el número de accesos a un fichero durante la ejecución de un programa sino se cierra un archivo puede que no se guarden los últimos cambios hechos últimos cambios hechos. Devuelve un cero si el archivo se cerró con éxito Tema I.7 Otros aspectos Escuela Técnica Superior de Ingeniería Informática 63 Entrada/Salida con ficheros PROGRAMACIÓN Funciones de E/S de ficheros de texto fgetc() / fputc() int fputc(int c, FILE* pf); int fgetc(FILE* pf); fgets() / fputs() int fputs (const char *cad, FILE *pf); char* fgets(char* cad, int n, FILE *pf ); fscanf() / fprintf() int fprintf (FILE* PF, const char* cadControl,…); int fscanf(FILE* pf, const char* cadControl, …); ( p ) Tema I.7 Otros aspectos Escuela Técnica Superior de Ingeniería Informática 64 Entrada/Salida con ficheros PROGRAMACIÓN Funciones de E/S de ficheros binarios En los ficheros binarios la información se escribe tal cual se almacena en memoria Optimiza el tamaño ocupada por un archivo fread() f () / fwrite() f () size_t fwrite(const void* ptr, size_t tam, size_t n, FILE* pf); size_t fread(void* ptr, size_t tam, size_t n, FILE* pf); Tema I.7 Otros aspectos Escuela Técnica Superior de Ingeniería Informática 65 Otras utilidades PROGRAMACIÓN Control de errores: muchas de las funciones de biblioteca y llamadas al sistema proporcionan un código de error si no han conseguido realizar su propósito. La biblioteca estándar proporciona un mecanismo La biblioteca estándar proporciona un mecanismo para controlar estos errores y convertirlos en algo “legible”. legible . Por un lado está la variable global errno que es en la que dejan las funciones el código de error que dejan las funciones el código de error. La función strerror(int errno) convierte el código de error a una cadena de texto más explicativa. d d t t á li ti Escuela Técnica Superior de Ingeniería Informática 66 Otras utilidades PROGRAMACIÓN Ejemplo: #include <stdio.h> #include i l d <errno.h> h //Para // errno #include <string.h> //Para strerror int i t main() i () { FILE *f1; f1 = fopen( fopen("./out.txt /out txt", "r+"); r+ ); if(f1 == NULL) printf("Error al abrir el fichero.\n%s\n“,strerror(errno)); else fprintf(f1,”Hola mundo\n"); } Escuela Técnica Superior de Ingeniería Informática 67 Índice PROGRAMACIÓN Introducción a la programación Lenguaje C Programación estructurada Programación estructurada Variables Operadores Estructuras de control Estructuras de datos Entrada/Salida Funciones Aplicaciones modulares Escuela Técnica Superior de Ingeniería Informática 68 Funciones PROGRAMACIÓN Las funciones se pueden “declarar”, para que en el resto del código se sepa que existen y como es su interfaz (prototipo). Las funciones se deben “definir“ en alguna parte, implementando su funcionalidad (cuerpo). implementando su funcionalidad (cuerpo). //Declaración de la función int media(int a, int b); //Definición de la función int media(int a, int b) { int result; result = (a + b)/2; return result; } Escuela Técnica Superior de Ingeniería Informática 69 Funciones PROGRAMACIÓN Sintaxis: Nombre Argumentos Tipo del valor de Ti d l l d retorno Inicio y fin del cuerpo de la función int media(int a, int b) { int result; result = (a + b)/2; return result; } Valor de retorno Escuela Técnica Superior de Ingeniería Informática 70 Funciones ‐ Argumentos PROGRAMACIÓN Los argumentos siempre se pasan por valor. Si se quiere pasar un argumento por referencia se deben usar punteros. deben usar punteros. //Ejemplo de paso de argumentos por referencia //Función void id i intercambia(int bi (i *a, * int i *b) { int aux; aux = *a; * = *b; *a *b *b = *aux; } //Llamada a la función int x = 10, y = 20; . . . intercambia(&x, &y); Escuela Técnica Superior de Ingeniería Informática 71 Funciones ‐ Recursividad PROGRAMACIÓN U Una función es recursiva si durante su ejecución f ió i id j ió tiene una llamada a si misma Se distingue entre: S di i Recursividad directa Recursividad indirecta: varias se llaman unas a otras R i id d i di i ll formando ciclos Toda Toda función recursiva ha de presentar al menos una función recursiva ha de presentar al menos una condición de terminación Ejemplos: Cálculo del factorial mediante recursividad directa Escuela Técnica Superior de Ingeniería Informática 72 La función main PROGRAMACIÓN La función main es el punto de entrada del programa. Puede recibir argumentos que serán los argumentos Puede recibir argumentos que serán los argumentos que se le pasen por línea de comandos a la hora de ejecutar el programa. ejecutar el programa. int main(int argc, char *argv[]) argc: es un entero que indica el número de argumentos recibido. *argv[]: es un puntero a un array de strings. Cada entrada del array es uno de los argumentos. Escuela Técnica Superior de Ingeniería Informática 73 La función main PROGRAMACIÓN Ejemplo: #include <stdio.h> int main(int argc, char *argv[]) { printf("Se han recibido %d argumentos\n",argc); int i; for(i = 0; i < argc; i++) i ) { printf("Argumento %d = %s\n", i,argv[i]); } return 0; } Escuela Técnica Superior de Ingeniería Informática 74 Índice PROGRAMACIÓN Introducción a la programación Lenguaje C Programación estructurada Programación estructurada Variables Operadores Estructuras de control Estructuras de datos Entrada/Salida Funciones Aplicaciones modulares Escuela Técnica Superior de Ingeniería Informática 75 Aplicaciones modulares PROGRAMACIÓN La definición de un módulo en C viene dada por: L d fi i ió d ód l C i d d Un archivo de cabecera (.h) D Define la interfaz del módulo, es decir, qué ofrece el módulo fi l i t f d l ód l d i é f l ód l definido Debería contener: definiciones de tipos y declaraciones de p y funciones (prototipos) Un archivo fuente (.c) Define los detalles de implementación del módulo f l d ll d l ó d l ód l Inclusión de su correspondiente fichero de cabecera ( c ude) (#include) Definición de funciones declaradas y no declaradas en el fichero de cabecera Escuela Técnica Superior de Ingeniería Informática 76 Aplicaciones modulares PROGRAMACIÓN La posibilidad de definir módulos en C va permitir: Definición de nuevos tipos de datos junto con sus operaciones (TADs) Colección de valores legales de datos y operaciones primitivas que se pueden realizar sobre esos valores primitivas que se pueden realizar sobre esos valores La definición de un TAD implica la definición de: Un interfaz público Un interfaz público Representación privada o implementación En C no se puede ocultar la representación del TAD La creación de bibliotecas de funciones Escuela Técnica Superior de Ingeniería Informática 77 Librerias PROGRAMACIÓN Librería estática (libnombre.a): "se copia" en el ejecutable cuando lo compilamos. Sólo se copia aquella parte de la librería que se necesite. Librería dinámica (libnombre.so): NO se copia en nuestro programa al compilarlo. Cuando se ejecuta e ejecutable, cada vez que el código necesite algo de la librería, irá a buscarlo a ésta. Escuela Técnica Superior de Ingeniería Informática 78 Librería estática PROGRAMACIÓN Creación: C ió Obtener los ficheros objeto (.o) de todos nuestros fuentes (.c). Para ello se compilan con gcc ‐c fuente.c ‐o fuente.o. La opción ‐c le dice al compilador que no cree un ejecutable, sino sólo un fichero objeto Crear la librería (.a). Para ello se usa el comando ar con los siguientes parámetros: ar ‐rv libnombre.a fuente1.o fuente2.o ... La opción ‐r le p p dice al comando ar que tiene que insertar (o reemplazar si ya están dentro) los ficheros objeto en la librería. Compilación: cc ‐o miprograma miprograma.c ‐I<path1> ‐I<path2> ... ‐L<path1> ‐ L<path2> ... ‐llibreria1 ‐llibreria2 Los ‐llibreria L llib i son para indicar que se debe coger esa librería. El prefijo i di d b lib í El fij lib y la extensión .a ya la pone automáticamente el compilador. Ojo: es necesario ponerlas por orden. Escuela Técnica Superior de Ingeniería Informática 79 Librería dinámica PROGRAMACIÓN Creación: C ió Compilar los fuentes, igual que antes, para obtener los objetos. Crear la librería con el comando ld. Las opciones para este comando Crear la librería con el comando ld. Las opciones para este comando serían ld ‐o liblibreria.so objeto1.o objeto2.o ... ‐shared. La opción ‐o liblibreria.so le indica el nombre que queremos dar a la librería. La p q y opción ‐shared le indica que debe hacer una librería y no un ejecutable (opción por defecto). Compilación: cc ‐o miprograma miprograma.c ‐I<path1> ‐I<path2> ... ‐L<path1> ‐ i i I< th1> I< th2> L< th1> L<path2> ... ‐Bdynamic ‐llibreria1 ‐llibreria2 Definir la variable de entorno LD_LIBRARY_PATH, en la que ponemos todos los directorios donde haya librerías dinámicas de interés. d l di i d d h lib í di á i d i é $ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<path1>:<path2>:<path3> $ export LD_LIBRARY_PATH Escuela Técnica Superior de Ingeniería Informática 80 Makefile PROGRAMACIÓN Para Para simplificar el proceso de compilación lo habitual es hacer un fichero simplificar el proceso de compilación lo habitual es hacer un fichero Makefile en el mismo directorio donde estén los fuentes y utilizar make para compilarla Posible definición de variables: Posible definición de variables: CFLAGS=-I<path1> -I<path2> ... CC=gcc Ordenados en forma de reglas: objetivo: dependencias comandos Reglas virtuales: sin dependencias clean : rm *.o *~ Reglas implicitas: programa : programa programa.o o programa.o : programa.c Reglas patrón: %.o : %.c $(CC) $(CFLAGS) $< -o $@ Escuela Técnica Superior de Ingeniería Informática 81 Makefile PROGRAMACIÓN Creación de librerias: Librería estática: CFLAGS=‐I<path1> ‐I<path2> ... libnombre.a: libnombre.a (objeto1.o ojbeto2.o ...) Librería dinámica Lib í di á i liblibreria.so: objeto1.c objeto2.c ... cc ‐c ‐o objeto1 o objeto1 c cc ‐c ‐o objeto1.o objeto1.c cc ‐c ‐o objeto2.o objeto2.c ... ld ‐o liblibreria.so objeto1.o objeto2.o ... ‐shared rm objeto1.o objeto2.o ... Escuela Técnica Superior de Ingeniería Informática 82