Programación en C. (Segunda Parte) DATSI, FI, UPM José M. Peña. jmpena@fi.upm.es. Programación en C



Documentos relacionados
Programación en C. (Segunda Parte) Programación en C 1. Índice

ICI 142 Fundamentos de Programación

Archivos. Programación en C 1

SOLUCION EXAMEN junio 2006

Esquema de un programa en C: bloques básicos

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

Computación I: Fundamentos

7. Manejo de Archivos en C.

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

TEMA 3: EL LENGUAJE C: PRESENTACIÓN

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

El lenguaje C: Elementos básicos del lenguaje

LENGUAJE. Tema 1 - Introducción

Introducción al lenguaje JAVA

Preliminares. Tipos de variables y Expresiones

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

Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS

El lenguaje C. #define MAX LINEA 1000 /* maximo tamanio de linea de entrada */

Arrays y Cadenas en C

Elementos léxicos del lenguaje de programación Java

Introducción al tipo de dato ARRAY

Universidad de Pamplona Materia: Programación 1 Docente: Ing. Lusbin Raúl Vargas LENGUAJE C ESTRUCTURA DE UN PROGRAMA EN C

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

TEMA 8: ESTRUCTURAS DE DATOS COMPLEJAS 1 VECTORES ESTÁTICOS 2 2 CADENAS O VECTORES DE CARACTERES 6 3 PASO DE CADENAS Y ARRAYS A FUNCIONES 8

Lenguaje C Funciones. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Introducción a la programación orientada a objetos

LENGUAJE ANSI C Guía de referencia

Tema 2: La clase string

Introducción al Dev-C++

Contenido. Capítulo 1. Introducción a lenguaje C 1

1 Estructura básica de un programa C++

Tema 3 Elementos básicos de programación

Reglas básicas de la programación en lenguaje C

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

CURSO de C++ Ignacio López

Tema 2. El lenguaje de programación Java (Parte 1)

Punteros. Programación en C 1

Lenguaje C Bucles, Condicionales, operadores y Algoritmos.

FUNDAMENTOS DE INFORMÁTICA 1º Ingeniería Industrial

Paso de Borland Turbo C (bajo DOS) a Anjuta (Linux) 1.

FILE *nombre_puntero_fichero; fopen(char_nombre_archivo,char_modo_apertura ); MODOS DE APERTURA. Abre un archivo de texto para lectura.

Sistemas Operativos I Manual de prácticas

Modulo 1 El lenguaje Java

Contenidos. Funciones (suplemento) Funciones. Justificación del uso de Funciones

1 ELEMENTOS BASICOS DEL LENGUAJE

INTRODUCCIÓN AL TIPO COMPUESTO CADENA CONTENIDOS

Repaso sobre lectura de datos desde la línea de comandos, manejo de memoria dinámica e introducción a la librería GSL

SOR -::- Prácticas -::- Curso 05/06. RCP es un estándar desarrollado por Sun Microsystems y usado por muchos distribuidores de sistemas UNIX.

UNIVERSIDAD DR. JOSE MATIAS DELGADO

8. Sentencia return y métodos

Tema 2. El lenguaje de programación Java. Arrays y cadenas

Contenidos. Gestión dinámica de memoria. Gestión dinámica de memoria. Introducción. 1. Introducción 2. El operador NEW 3. El operador DELETE

Vectores y matrices. Arrays Declaración Creación Acceso a los elementos de un array Manipulación de vectores y matrices

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

Tema 9. Vectores y Matrices

APÈNDIX: PREPROCESSADOR C

Entorno de Programación Visual Studio 6

Para leer la entrada de consola, lo primero que se hace es construir un Scanner que este asociado al flujo de entrada estándar System.

Una variable de clase escalar tiene un nivel de indirección igual a 1. Por ejemplo, las variables i, b y x definidas como se muestra a continuación.

Programando en C a Bajo Nivel

PROGRAMACIÓN N C++ CONSTRUCTORES PROG.C++ L11 CONSTRUCTORES DEL LENGUAJE

FUNDAMENTOS DE PROGRAMACIÓN

Fundamentos de la Programación

Entrada y salida de datos en C y C++

Tiempo de Compilación. Programa fuente. Secuencia. de caracteres. Scanner. Secuencia. de símbolos Parser. Compilador.

11. Algunas clases estándar de Java (II)

Java Inicial (20 horas)

Tema 7 Vectores y cadenas de caracteres. Fundamentos de Informática

Programación Avanzada para Sistemas de Telecomunicación. Objetos y clases. J.C. Cruellas. Objetos y clases

Prof. Dr. Paul Bustamante

6-REGISTROS DEL 8086 Y DEL 80286

Objetivos. El alumno conocerá los elementos indispensables de un ambiente de programación y será capaz de realizar programas básicos en lenguaje C.

Tema: Sobrecarga de Operadores.

GENERACIÓN DE CÓDIGO

GL-PCS2201-L05M FUNCIONES Y LA ESTRUCTURA DEL PROGRAMA EN LENGUAJE C

FACULTAD DE INGENIERÍA

TEMA 2. Agenda. Fundamentos de JAVA

CONCEPTOS BASICOS DEL LENGUAJE JAVA

Estructura de Datos [Tipos de datos concretos y tipos de datos abstractos]

Prácticas: Introducción a la programación en Java. Informática (1º Ingeniería Civil) Curso 2011/2012

Curso 0 de Informática

FACULTAD DE INGENIERÍA, U.B.A. Seminario de Sistemas Embebidos TRABAJO PRÁCTICO 0

INSTITUTO POLITECNICO NACIONAL. ESCUELA SUPEIRIOR DE INGENIERIA MECANICA Y ELECTRICA. UNIDAD CULHUACAN. INTEGRANTES: FLORES ACOLTZI ONESIMO

Lenguaje C. Enrique Vicente Bonet Esteban

Contenidos. Archivos en C++ Archivos en C++ Introducción

Práctica 3: Programación con subrutinas

FACULTAD DE INGENIERÍA

Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1

Sistemas Operativos Práctica 3

09/02/2016 ET1032 ET1032. Informática Industrial. Informática Industrial. Hacer programas 1. Hacer programas 2

ET1032. Informática Industrial. Hacer programas 1

Clases y Objetos. Informática II Ingeniería Electrónica

Programación Orientada a Objetos en Java

Abelardo Pardo. Iria Estévez Ayres. Damaris Fuentes Lorenzo. Pablo Basanta Val. Pedro J. Muñoz Merino. Hugo A. Parada.

Introducción al lenguaje de programación java

Objetivo de aprendizaje del tema

TIPOS DE DATOS DEFINIDOS POR EL PROGRAMADOR: Estructuras CONTENIDOS

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

Modelos de Computación I. Ingeniería Informática

Transcripción:

(Segunda Parte) DATSI, FI, UPM José M. Peña jmpena@fi.upm.es 1

Índice Estructura de un programa C. Variables básicas. Operaciones aritméticas. Sentencias de control. Arrays y Strings. Funciones. Estructuras de datos. Entrada/Salida básica. Ejemplos I. Modificadores de ámbito de las variables. Punteros y memoria dinámica. Operadores de bit. Preprocesador C y compilación. Librerías estándar. Ejemplos II. 2

Modificadores de Ámbito 3

Modificadores de Variables La declaración de variables acepta los siguientes modificadores: static (Local): El valor de la variable se conserve entre llamadas. Comportamiento similar a una variable global. register : La variable es almacenada siempre (si es posible) en un registro de la CPU (no en memoria). volatile : Un proceso exterior puede modificar la variable. const : La variable no puede ser modificada. 4

Modificadores de Variables int una_funcion(int a, int b) { static char last; register int i; const int max=12; volatile long acc;... } 5

Modificadores de Variables (static) void cuenta() { } static int cnt=0; printf( %d\n,cnt++) int main() { } cuenta();cuenta();cuenta();cuenta(); return 0; Salida: 0 1 2 3 6

Modificadores de Variables (const) const int max=10; int letra(const char* text, char l) { int i,acc=0; for(i=0;i<max && text[i];i++) if(text[i]==l) acc++; return acc; } 7

Modificadores de Funciones Las funciones también pueden ser declaradas con ciertos modificadores: static : Restricción de enlace. Sólo se puede usar dentro del mismo fichero (también variables globales). extern : La función o variable se encuentra declara pero no definida. Usada con variables globales. inline : La función es expandida íntegramente al ser invocada. No hay un salto a la función. Incrementa la eficiencia y aumenta el tamaño del código. 8

Modificadores de Funciones Fichero1.c: static void func() { }... void aux() { } func(); Fichero2.c: extern void aux(); int main() { } aux(); func(); /* NO VISIBLE */ 9

Modificadores de Funciones Fichero1.c Fichero2.c compilación compilación Fichero1.o aux aux Impl G func Impl L enlace Fichero2.o aux aux Undef func Undef main Impl G EJECUTABLE 10

Modificadores de Funciones inline int max(int a, int b) { } if(a>b) else... return a; return b; x=max(x+1,y); { if(x+1>y) x=x+1; else x=y; } 11

Punteros y Memoria Dinámica 12

Aritmética de Punteros Las variables de tipo puntero soportan ciertas operaciones aritméticas. char v[]= Colección ; char *p=v; *(p+2) for(p=v;*p;p++) { printf( %c,*p) } v C o l e c c i ó n \0 v[7] 13

Aritmética de Punteros Las operaciones soportadas sobre punteros son: Suma y resta de valores enteros (+,-,++ y --). Comparación y relación (<,>,<=,>=,== y!=). Valor booleano (comparación con NULL). void copiar(char* dest, const char* orig) { } if(orig && dest) while(*orig) *dest++=*orig++; 14

Aritmética de Punteros Las operaciones de suma o resta sobre punteros modifican el valor del dependiendo del tipo del puntero: int* p_int; char* p_char; p_int=p_char; p_int++; /* Suma sizeof(int) */ p_char++; /* Suma sizeof(char) */ p_char p_char + 1 ++ 3F0 3F1 3F2 3F3 3F4 3F5 3F6 3F7 3F8 3F9 3FA 3FB p_int ++ sizeof(int)=4 p_int + 1 15

Punteros a Funciones Mecanismo para pasar funciones como argumento: char (*f)(int,int); f es un puntero a una función que devuelve un char y recibe dos enteros como argumento. A un puntero a función se le puede asignar como valor cualquier identificador de función que tenga los mismos argumentos y resultado. 16

Punteros a Funciones char* menor (char** text, int tam, int (*compara)(char*,char*)) { int i; char* min=text[0]; for(i=1;i<tam;i++) if(*compara(menor,text[i])) min=text[i]; return min; } 17

Punteros a Funciones int main() { char *palabras[]={ hola, casa, perro, coche, rio }; printf( Menor:%s, menor(palabras,5,alfabetico)); return 0; } int alfabetico(char* a,char* b) {... } 18

Memoria Dinámica Además de la reserva de espacio estática (cuando se declara una variable), es posible reservar memoria de forma dinámica. Funciones de gestión de memoria dinámica: void* malloc(size_t): Reserva memoria dinámica. free(void*): Libera memoria dinámica. void* realloc(void*,size_t): Ajusta el espacio de memoria dinámica. 19

Memoria Dinámica int a,b[2]; int* i; char* c; Estática a b[0] b[1] i c Dinámica i=(int*)malloc(sizeof(int)); c=(char*)malloc(sizeof(char)); free(i); c=(char*)realloc(c,sizeof(char)*9); a b[0] b[1] i c a b[0] b[1] i c *i *c *c 20

Operadores de Bit 21

Operadores de Bit Además de los operadores aritméticos y booleanos existen operadores numéricos a nivel de bit: AND: & OR: XOR: ^ NOT: ~ Desplazamientos: << y >> 22

Operadores de Bit char a=48; 00110000 char b=19; 00010011 char x,y,z,w,t,s; a b x=a & b; y=a b; z=a ^ b; w=~a; t=a>>2; s=b<<3; 00010000 x = 16 00110011 y = 51 00100011 z = 35 11001111 w = 207 00001100 t = 12 10011000 s = 152 23

Uso de los Operadores de Bit const char LECTURA =1; const char ESCRITURA=2; const char EJECUCION=3; char permisos=lectura ESCRITURA; parmisos =EJECUCION; permisos&=~escritura; if(permisos & EJECUCION) printf( Es ejecutable ); 24

Preprocesador y Compilación 25

Fase de Compilación.c Preprocesamiento.c Paso a Ensamblador.s Fichero Fuente Compilación Ensamblar EXE EXE Fichero Ejecutable Enlazado.o.a Librerías.o.o.o.o 26

Directrices del Preprocesador Son expandidas en la fase de preprocesado: #define : Define una nueva constante o macro del preprocesador. #include : Incluye el contenido de otro fichero. #ifdef #ifndef : Preprocesamiento condicionado. #endif : Fin de bloque condicional. #error : Muestra un mensaje de error 27

Constantes y Macros Permite asociar valores constantes a ciertos identificadores expandidos en fase de preprocesamiento: #define variable valor Define funciones que son expandidas en fase de preprocesamiento: #define macro(args,...) función 28

Constantes y Macros #define PI 3.14 #define NUM_ELEM 5 #define AREA(rad) PI*rad*rad #define MAX(a,b) (a>b? a : b) int main() { int i; float vec[num_elem]; for(i=0;i<num_elem;i++) vec[i]=max((float)i*5.2,area(i)); } 29

Constantes y Macros Tras la fase de prerpocesamiento int main() { } int i; float vec[5]; for(i=0;i<5;i++) vec[i]=((float)i*5.2>3.14*i*i? (float)i*5.2 : 3.14*i*i); 30

Macros vs Funciones int func_max(int a, int b) { return (a>b? a : b); } #define macro_max(a,b) (a>b? a : b) int a=2,b=3,max; Usando funciones max=func_max(a++,b--); Usando macros max=macro_max(a++,b--); max 3 a 3 b 2 max 2 a 3 b 1 31

Inclusión de Ficheros Los prototipos de las funciones usadas por varios ficheros fuente se suelen definir en fichero de cabecera. #include <stdio.h> Cabeceras del sistema. #include mis_func.h Ficheros de cabecera locales. fich.c #include aux.h int main() {...} aux.h int func1(int a); viod func2(); Preprocesamiento int func1(int a); viod func2(); int main() {...} 32

Inclusión de Ficheros La inclusión de ficheros esta sujeta a las siguientes recomendaciones: Por lo general los ficheros de cabecera tienen como extensión.h En los ficheros de cabecera no se incluyen implementación de funciones Las variables en un fichero de cabecera son declaradas extern y se encuentran declaradas en algún otro fichero.c 33

Sentencias Condicionales Para incluir código cuya compilación es dependiente de ciertas opciones, se usan los bloques: #ifdef variable <bloque de sentencias>... #endif #ifndef variable <bloque de sentencias>... #endif 34

Ejemplo: Depuración #define DEBUG int main() { int i,acc; for(i=0;i<10;i++) acc=i*i-1; #ifdef DEBUG printf( Fin bucle acumulador: %d,acc); #endif return 0; } 35

Ejemplo: Fichero de Cabecera aux.h #ifndef _AUX_H_ #define _AUX_H_ <definiciones> #endif Evita la redefinicion de funciones y variables #include aux.h #include aux.h int main() {... } 36

Enlace de Ficheros extern int v; int main() {.h().} extern void k(); static h() {.k().} gcc -c 3A00: f 3A08: main 3B12: h v <undef> k <undef>.c.o int k() {.l().} int l() {...} int v; Compilación gcc -o EXE EXE 1600: k 17FF: l 1812: v Enlace gcc -c.c.o 37

Librerías Estándar 38

Manejo de Cadenas char* strcat(char*,char*): Concatena cadenas. char* strchr(char*,char): Busca un carácter. int strcmp(char*,char*): Comparación de cadenas. char* strcpy(char*,char*): Copia cadenas. char* strdup(char*): Duplica una cadena. int strlen(char*): Longitud de una cadena. char* strncpy(int,char*,char*): Copia cadenas. char* strncat(int,char*,char*): Concatena.... 39

Manejo de Buffers void* memcpy(void*,void*,int): Copia memoria. void* memmove(void*,void*,int): Copia memoria. int memcmp(void*,void*,int): Compara memoria. void* memset(void*,int,int): Rellena memoria. void bzero(void*,int): Pone a cero la memoria. void bcopy(void*,void*,int): Copia memoria. void* memccpy(void*,void*,int,int): Copia memoria hasta que encuentra un byte.... 40

Entrada Salida int fprintf(file*,...): Salida sobre fichero. int fscanf(file*,...): Entrada desde fichero. int sprintf(char*,...): Salida sobre un buffer. int sscanf(char*,...): Entrada desde un buffer. int fgetc(file*): Lee un carácter desde fichero. char* fgets(char*,int,file*): Lee una línea. FILE* fopen(char*,char*): Abre un fichero. int fclose(file*): Cierra un fichero. int fflush(file*): Descarga un buffer de fichero. int feof(file*): Indica si ha finalizado un fichero. 41

Ficheros Especiales Existen tres variables de tipo FILE* asociados a tres ficheros estándar: stdin: Entrada estándar. stdout: Salida estándar. stdout: Salida de error estándar. fprintf(stdout, Usuario: ); fscanf(stdin, %s,usr); fprintf(stderr, Error:No válido ); 42

Ordenación y Búsqueda void* bsearch(void*,void*,int,int, int (*)(void*,void*)): Búsqueda binaria sobre lista ordenada. void qsort(void*,int,int, int (*)(void*,void*)): Ordenación mediante el algoritmo quicksort. char *vec[10]={ casa,...}; qsort((void*)vec,10,sizeof(char*),strcmp); 43

Conversión de Tipo int atoi(char*): Traduce de string a entero. long atol(char*): Traduce de string a un entero largo. double atof(char*): Traduce de string a real. long strtol(char*,char**,int): Traduce de array a entero (en diferentes bases). double strtod(char*,char**): Traduce de array a real. char* itoa(char*,int): Traduce un entero a array. Como alternativa se pueden usar las funciones: sscanf y sprintf. 44

Funciones Matemáticas double exp(double): Calcula e x. double log(double): Calcula el logaritmo natural. double log10(doubel): Calcula el logaritmo en base 10. double pow(double,double): Calcula x y. double sqrt(double): Calcula la raíz cuadrada. double sin(double): Calcula el seno (en radianes). double cos(double): Calcula el coseno (en radianes). double sinh(double): Calcula el seno hiperbólico. double atan(double): Calcula el arco tangente.... 45

Uso de Funciones de Librería El uso de las funciones de librería estándar esta sujeto a las siguientes recomendaciones: Estudiar la página del manual (man 3 sprintf). Incluir en el fichero fuente el fichero de cabecera adecuado (#include <stdio.h>). Enlazar la librería si es necesario (gcc... -lm). 46

Argumentos del Programa 47

Argumentos de main La función principal main puede recibir argumentos que permiten acceder a los parámetros con los que es llamado el ejecutable. int main(int argc, char* argv[]) int argc : Número de parámetros. char* argv[] : Parámetros del ejecutable. 48

Argumentos de main $ gcc prog.c -o prog $ prog uno dos tres cuatro int main(int argc, char* argv[]) argc=5 argv[0] argv[1] argv[2] argv[3] argv[4] prog\0 uno\0 dos\0 tres\0 cuat ro\0 49

Argumentos de main int main(int argc, char* argv[]) { int i=0; printf( Ejecutable: %s\n,argv[0]); for(i=0;i<argc;i++) printf( Argumento[%d]: %s\n,i,argv[i]); } return 0; 50