SEMINARIO C para programadores java (este seminario forma parte de las actividades del proyecto piloto) Sesión 3



Documentos relacionados
Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C Sesión 2

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C Sesión 3

1. Lenguajes de programación. 2. Compilador. 3. Mi primer programa. EDM. Introducción al lenguaje C _ 1

El lenguaje C. if (a>3) { printf("hola"); // bloque printf("%d",a); // de getch(); //código } Partes de un programa en C.

Apuntadores en C y C++

SEMINARIO C para programadores java (este seminario forma parte de las actividades del proyecto piloto) Sesión 2

Programación 1 Grado de Ingeniería Robótica

Tema 18: Memoria dinámica y su uso en C

Punteros. Programación en C 1

Informática PRÀCTICA 9 Curs Práctica Nº 9: Rango y precisión de representación de números en el ordenador.

Lenguajes de programación LPSI EUI UPM CADENAS DE CARACTERES

Punteros. Índice. 1. Qué es un puntero y por que son importantes.

El lenguaje C. 1. Estructuras. Principios de Programación Definicion de estructuras

Memoria Dinámica. Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez

Introducción al lenguaje C

SEMINARIO C para programadores java (este seminario forma parte de las actividades del proyecto piloto) Sesión 1

2. Variables dinámicas

Tipos de Datos en C. Palabras reservadas en C

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

La sintaxis básica para definir una clase es la que a continuación se muestra:

EJERCICIOS DE PROGRAMACIÓN EN C. DIBUJAR UN ROMBO O DIAMANTE. CALCULAR SUMATORIOS. (CU00542F)

TIPOS DE DATOS BASICOS EN LENGUAJE C

1. Presentación del lenguaje C Creado en 1972 por D. Ritchie Lenguaje de propósito general Portátil o transportable (generalmente) Inicialmente de niv

CAPITULO 2: VARIABLES Y CONSTANTES

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 1

Una expresión es una combinación de uno o más operandos y operadores para obtener un resultado.

Programación I Funciones

Programación 2. Grado en Estadística Aplicada. Curso Generación de números pseudoaleatorios. Manejo de ficheros de texto.

CURSO DE LENGUAJE C. 4.1 Conceptos básicos de funciones 4.2 Funciones que regresan valores no enteros 4.3 Variables externas 4.4 Reglas de alcance

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Índice. Estructuras de datos en Memoria Principal: Vectores. Matrices. Cadenas de caracteres. Estructuras. Estructuras de datos en Memoria Externa:

INTRODUCCIÓN AL LENGUAJE DE PROGRAMACIÓN C

GESTIÓN DE MEMORIA DINÁMICA EN C 1. Creación y destrucción de variables dinámicas

Apuntadores y Memoria dinámica. Apuntadores. M.C. Yolanda Moyao Martínez

Operaciones de E/S en ANSI C

Repaso 02: Apuntadores y manejo de memoria dinámica

Entrada y Salida de Datos. Lectura de archivos.

4. El código BCD utiliza para codificar cada símbolo decimal: a) 4 bits b) 6 bits c) 8 bits d) ninguna de las anteriores es correcta

Programación I Teoría : Entrada/Salida - Archivos.

Tema 7: Polimorfismo. Índice

ESTRUCTURA DE DATOS. Memoria estática Memoria dinámica Tipo puntero Declaración de punteros Gestión de memoria dinámica Resumen ejemplo

PROGRAMACION MODULAR FUNCIONES

funciones printf scanf

PUNTEROS (APUNTADORES)

Lenguaje C Elementos de un Programa. Ing. Hugo Fdo. Velasco Peña Universidad Nacional 2006

Informática Ingeniería en Electrónica y Automática Industrial

Índice. Estructuras de datos en Memoria Principal. Vectores. Matrices. Cadenas de caracteres. Estructuras. Estructuras de datos en Memoria Externa

UNIDAD ACADÉMICA PROFESIONAL TIANGUISTENCO

Un puntero no es más que una variable estática cuyo contenido es una dirección de memoria.

Analista Universitario en Sistemas. Taller de Programación II. Instituto Politécnico Superior MEMORIA DINAMICA

Una función es un miniprograma dentro de un programa. Las funciones contienen varias

Laboratorio de Arquitectura de Redes. Entrada y salida estándar

Guía práctica de estudio 04. Almacenamiento en tiempo de ejecución

Introducción al lenguaje C

Universidad del Papaloapan

Tema 6: Memoria dinámica

E/S POR CONSOLA DE C++ Parte I. Elementos Básicos Dr. Oldemar Rodríguez R.

Manejo de memoria en C

El lenguaje C. hace que prog lea el contenido de infile en vez de leer del teclado. Otro ejemplo:

Punteros. Definición Un puntero es un dato que contiene una dirección de memoria.

FUNDAMENTOS DE INFORMÁTICA

TEMA 4 ALGUNAS FUNCIONES DEL LENGUAJE C

Estructuras Dinámicas

Estructuración del programa en partes más pequeñas y sencillas

Procesos e Hilos en C

Elementos de un programa en C

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 2

Introducción al lenguaje C

CAPITULO 6: FUNCIONES

Apuntadores (Punteros)

Informática Ingeniería en Electrónica y Automática Industrial

Informática Ingeniería en Electrónica y Automática Industrial

UNAN LEÓN Departamento de Computación. Asignatura: ALGORITMO Y ESTRUCTURA DE DATOS MANEJO DE ARCHIVOS (FICHEROS) EN C

Clase adicional 2. Estructuras básicas de control. Temas

Cadenas de Caracteres

ESTRUCTURAS. Struct Identificador_ tipo_estructura { Tipo miembro_1; /*Declaración de los miembros*/

Se guardan en archivos con extencion c y los cabezales con extension h

Metodología y Tecnología de la Programación

El lenguaje de Programación C. Fernando J. Pereda

Programación En Lenguaje C

TEMA 2. LENGUAJE C. CONCEPTOS BÁSICOS Y PROGRAMACIÓN ELEMENTAL.

Introducción a C. Grupo de Sistemas y Comunicaciones. Febrero 2008 C 1. Programación imperativa estructurada.

Programación. Test Autoevaluación Tema 3

Algoritmo, Estructuras y Programación II Ing. Marglorie Colina

Categorías de métodos. Métodos constructores y destructores

APELLIDOS NOMBRE GRUPO CALIFICACIÓN FECHA

Unidad IV Arreglos y estructuras. M.C. Juan Carlos Olivares Rojas

Prof. Dr. Paul Bustamante

Programas. Estructura de un programa simple

Introducción a la Programación

PROBLEMA 1. Rellena el hueco 1 (línea 23). Realiza la reserva de memoria para almacenar los n puntos.

Programación estructurada (Introducción a lenguaje C)

Programación Estructurada. Sesión 2:El lenguaje de programación C

Tema ADQUISICIÓN Y TRATAMIENTO DE DATOS. Departamento de Ciencias de la Computación e IA. Subprogramas en C

TEMA 8: Gestión dinámica de memoria

Tema 13: Apuntadores en C

Apellidos: Nombre: Matrícula: Examen Programación para Sistemas Grado en Ingeniería Informática (2009)

Transcripción:

Algoritmos y Estructuras de Datos 2º de Ingeniería Informática, Curso 2008/2009 SEMINARIO C para programadores java (este seminario forma parte de las actividades del proyecto piloto) Sesión 3 Contenidos: 1. Funciones 2. Gestión dinámica de memoria. 3. Funciones de E/S. Ejercicios

Algoritmos y Estructuras de Datos, 2007/2008 2/8 1. Funciones Estructura de definición de funciones: tipo_devuelto nombre_función ( parámetros ) { cuerpo Ej.: int suma (int a, int b) { int r= a+b; return r; Una función no se puede declarar dentro de otra (no se pueden anidar), aunque sí se pueden definir y anidar bloques: { { { { Valor devuelto. o Sólo puede haber 1 tipo devuelto (como en Módula o Pascal). o Si no devuelve nada se pone: void o Por defecto, si no se pone nada, se supone que devuelve un int. o Se puede devolver un struct o union, pero no un array. En su lugar, se puede devolver un puntero al array. o Acabar la ejecución del procedimiento: return; o Acabar y devolver un valor: return expresion; Parámetros. o Lista de pares: (tipo1 nombre1, tipo2 nombre2,...) o Cada nombre debe llevar su tipo (aunque se repitan). o El paso es siempre por valor. o Simulación del paso por referencia: usar punteros. void suma2 (int a, int *b) { int r; r= a + *b; *b= r; o OJO: no devolver variable local por referencia: la variable local está en la pila, y desaparece al acabar la ejecución de la función. Ejemplo: o Paso de arrays: void suma3 (int a, int b) { int r; r= a + *b; return &r; float media (int array[], int tamanno)... no se especifica el tamaño del array a recibir; el paso de parámetros array es por referencia: se accede al array original a través de la variabl-parámetro alternativa: usar punteros (int * array en vez de int array[]) Ejemplo de función recursiva: int factorial(int n) { if (n=0) return 1; return n*factorial(n-1);

Algoritmos y Estructuras de Datos, 2007/2008 3/8 Variables locales. o Se crean en la pila para cada llamada y se eliminan al acabar la llamada. Insistimos: no devolver por referencia. o Se llaman variables auto; auto es la opción por defecto, no hace falta indicarla. o Deben ir siempre al principio del cuerpo de la función, justo después de las llaves, {. Nunca entre líneas de código. En C++ sí se puede. o Variables locales static: primero: olvidar significado de variable static en java 1 (variable de clase compartido por todos los objetos de esa clase); en C, son variables: locales en cuanto a visibilidad globales en cuanto a tiempo de vida: o existen haya o no haya en marcha una ejecución de la función; o conservan sus valores entre distintas llamadas Inicializar en declaración; se ejecutará sólo en la primera llamada. OJO: no usar junto con recursividad: hay una sóla instancia de la variable para todas las llamadas recursivas a la función; ejemplo: pensar función factorial, implementada con variable static? Ejemplo de uso: int ticket(void) { static int turno=1; return turno++; o Variables locales register: sugiere al compilador que la variable sea almacenada en un registro de la CPU (a ser posible). float media (int array[], int tam) { static float acum; register int i; for (i= 0, acum= 0; i<tam; i++) acum+= array[i]; return acum/tamanno; Declaración de una función. En algunos casos puede ser necesario declarar la sintaxis de la función antes de definirla (p. ej. si hay doble recursividad). tipo_devuelto nombre_función ( parámetros ); o En la lista de parámetros se pueden poner sólo los tipos (omitir los nombres). int suma (int, int); float media (int [], int); 1 sabéis lo que son las variables static en java?

Algoritmos y Estructuras de Datos, 2007/2008 4/8 Parámetros y valor devuelto por la función main. o Valor devuelto. Si existe, debe ser un int. Es el valor devuelto por el programa al sistema operativo, como código de error. o Parámetros. Indican los argumentos escritos por el usuario en la línea de comandos. Primero: de tipo int. Número de argumentos introducidos. Segundo: array de cadenas (char *). Indica el contenido de esos argumentos. main(int num_arg, char *str_arg[]){ int i; printf("hay %d argumentos.\n", num_arg); for(i=0; i<num_arg; i++) printf("argumento %d: %s\n", i, str_arg[i]); Paso de funciones como parámetros. o Es posible definir punteros a funciones, pasarlas como parámetros de una función y aplicar los operadores de dirección e indirección (llamar a la función apuntada). o Declaración de parámetro de tipo puntero a función: valor_devuelto (*nombre_parametro) (tipo1, tipo2,...) o Ejemplo. #include <stdio.h> #include <stdlib.h> int suma (int a, int b) {return a+b; int mult (int a, int b) {return a*b; int opera (int a, int b, int (*op)(int,int)) { return(*op)(a, b); main(int argc, char *argv[]) { int a, b; if (argc<3) return -1; /* ERROR: faltan operandos */ a= atoi(argv[1]); b= atoi(argv[2]); printf("suma: %d\n",opera(a, b, &suma)); printf("prod: %d\n",opera(a, b, &mult));

Algoritmos y Estructuras de Datos, 2007/2008 5/8 2. Gestión dinámica de memoria Se puede reservar memoria en tiempo de ejecución. Las funciones para reserva de memoria están en: stdlib.h Toda la memoria reservada debe ser liberada antes de acabar. Es decir, no hay liberación automática de memoria, NO HAY RECOLECTOR DE BASURA. El manejo de memoria dinámica se hace usando punteros. int *arraydimanico; float **matrizdinamica= NULL; Reserva de memoria: malloc void * malloc (unsigned tamano) o Reserva tamano bytes de memoria y devuelve un puntero a la zona reservada. arraydinamico = (int *) malloc (100*sizeof(int)); o Devuelve NULL si no se ha podido reservar esa cantidad. o No se inicializa la memoria. Reserva e inicialización de memoria: calloc void * calloc (unsigned ndatos, unsigned size) o Reserva ndatos*size bytes de memoria y devuelve un puntero a la zona reservada. Se supone que size es el tamaño del tipo de datos a escribir y ndatos el número de datos. arraydinamico = (int *) calloc (100, sizeof(int)); o Devuelve NULL si no se ha podido reservar esa cantidad. o Se inicializa la memoria reservada con 0. Relocalizar de memoria: realloc void * realloc (void *ptr, unsigned tamano) o Redimensiona la cantidad de memoria reservada previamente a la nueva cantidad de bytes dada en tamano. o Si el nuevo tamaño es mayor, espacio nuevo no se inicializa. o Devuelve NULL si no se pudo satisfacer la demanda. Liberar memoria: free void free(void *ptr) o Libera una zona de memoria reservada antes. No usar si ptr == NULL. o OJO: no hay recolector de basura; liberar la memoria reservadada cuando ya no se vaya a usar. Buena costumbre: liberar donde se reserva. o No hacer free sobre puntero no inicializado o ya liberado. o No basta con hacer ptr=null: eso haría que la memoria se pierda.

Algoritmos y Estructuras de Datos, 2007/2008 6/8 Ejemplo. #include <stdio.h> #include <stdlib.h> char *memoria= NULL; int main() { char c; long i, tam= 0; do { tam+= 1000000; memoria= (char *) malloc (tam); if (!memoria) { printf("error. Imposible reservar más memoria.\n"); return 0; printf("reservados %ld bytes...\n", tam); for (i= 0; i<tam; i++) memoria[i]= (char) i; printf("pulse s para seguir saturando la máquina.\n"); while ((c= getchar())=='\n'); free(memoria); while (c=='s' c=='s'); return 0; Otro ejemplo: páginas 310 y 311 del texto guía. IMPORTANTE: No acceder a lo apuntado por un puntero: - antes de que apunte a una dirección válida (variable estática, local, o de memoria dinámica reservada previamente) - después de haber liberado la memoria a la que apuntaba - después de haber asignado NULL al puntero 3. Funciones de E/S No forman parte del lenguaje, están en librería estándar: #include <stdio.h> Escribir por pantalla: printf printf ( <cadena> ); printf ( <cadena con formato>, <expresión 1>, <expresión 2>,...); printf(" Buenos días!"); printf("un entero: %d y un real: %f\n", 27*12, 3.1416); En lugar de System.out.println( Un entero: + 27*12 + y un real: +3.1416 );

Algoritmos y Estructuras de Datos, 2007/2008 7/8 Especificación de formato en printf: % [flags] [width] [.prec] [h l L] caracter_tipo Caracteres de tipo: d, i (decimal), o (octal), u (unsigned), x, X (hexadecimal), f (float con la forma [-]dddd.dddd), e, E, (float con la forma [-]d.dddd e[+/-]ddd), g, G (float inteligente ), c (char), s (string), p (puntero). sprintf. Igual que printf, pero en lugar de escribir en pantalla escribe el resultado en una cadena (el primer parámetro). char resultado[100]; sprintf(resultado, "Probando sprintf con el número %u.\n", -1); printf(resultado); Leer de teclado: scanf (en lugar de BufferedReader, InputStreamReader ) Formato parecido a la función printf. int scanf (<cadena con huecos>, &<var1>, &<var2>,...); int i, j, n; float r; char cadena[20]; n= scanf("%d", &i); Lee un entero y lo guarda en i n= scanf("%d %f", &j, &r); Lee un entero (en j) y un real (en r) n= scanf("%s", cadena); Lee una cadena (hasta el primer espacio) El valor devuelto por scanf indica el número de huecos leídos. Los especificadores de formato son los mismos que para printf. sscanf. El equivalente a scanf, pero en lugar de leer de teclado lee los caracteres de una cadena (el primer parámetro). char entrada_simulada[100]= " 26 88.3 92"; int a, b; float g; sscanf(entrada_simulada, "%d %f %d", &a, &g, &b); putchar(char c). Escribe un carácter por pantalla. Equivale a: printf("%c", c) char getchar(void). Lee un carácter de teclado. Equivale a: (scanf("%c", &c), c) Ejemplo. #include <stdio.h> main() { int i, n; float f; char cadena[30]; printf("introduce un entero, un float y una cadena:"); /* Probar distintas posibilidades en la siguiente línea */ n= scanf("%d %f %s", &i, &f, cadena); /* Adaptando también este printf, claro */ printf("huecos leídos: %d\nvalores: %d, %f, %s \n",n,i,f,cadena);

Algoritmos y Estructuras de Datos, 2007/2008 8/8 Ojo: normalmente la salida estándar es la pantalla y la entrada estándar el teclado. Pero se puede utilizar redirección de entrada y salida. >> gcc ejer1.c o ejer1.out Compilamos el programa de ejemplo >>./ejer1.out Ejecutamos. E/S: teclado/pantalla >>./ejer1.out > res.txt Ahora la salida va al fichero res.txt >>./ejer1.out < in.txt Aquí la entrada está en el fich. in.txt >>./ejer1.out >res.txt <in.txt La entrada estándar, salida estándar y salida de error estándar también se pueden manejar como ficheros (con los nombres stdin, stdout y stderr) con las funciones que veremos a continuación. Ejercicios 1. Haz un programa que reciba n+2 argumentos en la línea de comandos, con n<=5. Los dos primeros son nombres de ficheros de texto, los n restantes palabras. La salida será el número de veces que aparece cada una de esas palabra en el fichero de texto correspondiente al primer argumento. Esa información se escribirá en un fichero de texto cuyo nombre vendrá dado por el segundo argumento. 2. Escribe un procedimiento que reserve memoria para una matriz de reales de tamaño a b, y otro que multiplique dos matrices de dimensiones compatibles. 3. Encuentra y corrige el error existente en el siguiente programa. Antes de ejecutarlo deduce el resultado que tendrá. #include <stdio.h> #define CUADRADO1 (A) A*A #define CUADRADO2(A) (A)*(A) #define CUADRADO3(A) ((A)= (A)*(A)) int main (void) { int i= 3, j= 4; printf("cuadrado1(%d+1)= %d\n", i, CUADRADO1(i+1)); printf("cuadrado2(%d+1)= %d\n", i, CUADRADO2(i+1)); CUADRADO3 (j); printf("cuadrado3(%d)= %d\n", j, CUADRADO3(j)); return 0;