Professional Documents
Culture Documents
(Segunda Parte)
DATSI, FI, UPM Jos M. Pea
jmpena@fi.upm.es
Programacin en C
ndice
Estructura de un programa C. Variables bsicas. Operaciones aritmticas. Sentencias de control. Arrays y Strings. Funciones. Estructuras de datos. Entrada/Salida bsica. Ejemplos I. Modificadores de mbito de las variables. Punteros y memoria dinmica. Operadores de bit. Preprocesador C y compilacin. Libreras estndar. Ejemplos II.
2
Programacin en C
Programacin en C
Modificadores de mbito
Programacin en C
Modificadores de Variables
La declaracin 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.
Programacin en C
Modificadores de Variables
int una_funcion(int a, int b) { static char last; register int i; const int max=12; volatile long acc; .... }
Programacin en C
Modificadores de Funciones
Las funciones tambin pueden ser declaradas con ciertos modificadores:
static : Restriccin de enlace. Slo se puede usar dentro del mismo fichero (tambin variables globales). extern : La funcin o variable se encuentra declara pero no definida. Usada con variables globales. inline : La funcin es expandida ntegramente al ser invocada. No hay un salto a la funcin. Incrementa la eficiencia y aumenta el tamao del cdigo.
Programacin en C
Modificadores de Funciones
Fichero1.c: static void func() { ... } void aux() { func(); } Fichero2.c: extern void aux(); int main() { aux(); func(); /* NO VISIBLE */ }
9
Programacin en C
Modificadores de Funciones
Fichero1.c Fichero2.c
compilacin
Fichero1.o aux func Impl G Impl L
compilacin
Fichero2.o aux func main Undef Undef Impl G
enlace
EJECUTABLE
10
Programacin en C
Modificadores de Funciones
inline int max(int a, int b) { if(a>b) { return a; if(x+1>y) else x=x+1; else return b; x=y; } } .... x=max(x+1,y);
Programacin en C
11
Programacin en C
Punteros y Memoria Dinmica
Programacin en C
12
Aritmtica de Punteros
Las variables de tipo puntero soportan ciertas operaciones aritmticas. char v[]=Coleccin; for(p=v;*p;p++) char *p=v;
*(p+2)
{
} printf(%c,*p)
v C o l e c c i n \0
v[7]
Programacin en C
13
Aritmtica de Punteros
Las operaciones soportadas sobre punteros son:
Suma y resta de valores enteros (+,-,++ y --). Comparacin y relacin (<,>,<=,>=,== y !=). Valor booleano (comparacin con NULL).
void copiar(char* dest, const char* orig) { if(orig && dest) while(*orig) *dest++=*orig++; }
Programacin en C
14
Aritmtica 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
3F4 3F5 3F6 3F7 3F8 3F9 3FA 3FB
p_int
++ sizeof(int)=4
p_int + 1
15
Programacin en C
Punteros a Funciones
Mecanismo para pasar funciones como argumento:
char (*f)(int,int);
f es un puntero a una funcin que devuelve un char y recibe dos enteros como argumento. A un puntero a funcin se le puede asignar como valor cualquier identificador de funcin que tenga los mismos argumentos y resultado.
Programacin en C
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; }
Programacin en C
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) { .... }
Programacin en C
18
Memoria Dinmica
Adems de la reserva de espacio esttica (cuando se declara una variable), es posible reservar memoria de forma dinmica. Funciones de gestin de memoria dinmica:
void* malloc(size_t): Reserva memoria dinmica. free(void*): Libera memoria dinmica. void* realloc(void*,size_t): Ajusta el espacio de memoria dinmica.
Programacin en C
19
Memoria Dinmica
int int* char* a,b[2]; i; c;
Esttica Dinmica
i=(int*)malloc(sizeof(int)); c=(char*)malloc(sizeof(char));
*i *c
Programacin en C
20
Programacin en C
Operadores de Bit
Programacin en C
21
Operadores de Bit
Adems de los operadores aritmticos y booleanos existen operadores numricos a nivel de bit:
AND: & OR: | XOR: ^ NOT: ~ Desplazamientos: << y >>
Programacin en C
22
Operadores de Bit
char a=48; 00110000 a char b=19; 00010011 b char x,y,z,w,t,s; 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
Programacin en C
23
24
Programacin en C
Preprocesador y Compilacin
Programacin en C
25
Fase de Compilacin
.c
Preprocesamiento
.c
Paso a Ensamblador
.s
Ensamblar
Fichero Fuente
Compilacin
Enlazado
.o
Fichero Ejecutable
Programacin en C
.a
.o .o .o .o
Libreras
26
Programacin en C
27
Constantes y Macros
Permite asociar valores constantes a ciertos identificadores expandidos en fase de preprocesamiento:
#define variable valor
Programacin en C
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)); }
Programacin en C
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); }
Programacin en C
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--); max 3 a 3 b 2 Usando macros max=macro_max(a++,b--); max 2
Programacin en C
a 3
b 1
31
Inclusin 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. aux.h
int func1(int a); viod func2(); int func1(int a); viod func2(); int main() { ...}
fich.c
Preprocesamiento
Programacin en C
32
Inclusin de Ficheros
La inclusin de ficheros esta sujeta a las siguientes recomendaciones:
Por lo general los ficheros de cabecera tienen como extensin .h
En los ficheros de cabecera no se incluyen implementacin de funciones Las variables en un fichero de cabecera son declaradas extern y se encuentran declaradas en algn otro fichero .c
Programacin en C
33
Sentencias Condicionales
Para incluir cdigo cuya compilacin es dependiente de ciertas opciones, se usan los bloques:
#ifdef variable <bloque de sentencias> ... #endif #ifndef variable <bloque de sentencias> ... #endif
Programacin en C
34
Ejemplo: Depuracin
#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; }
Programacin en C
35
Programacin en C
36
Enlace de Ficheros
extern int v; int main() {.h().} extern void k(); static h() {.k().}
.c .o
.c .o
gcc -c
3A00: f 3A08: main 3B12: h v <undef> k <undef>
Compilacin
gcc -c
gcc -o
Enlace
Programacin en C
37
Programacin en C
Libreras Estndar
Programacin en C
38
Manejo de Cadenas
char* char* int char* char* int char* char* ... strcat(char*,char*): Concatena cadenas. strchr(char*,char): Busca un carcter. strcmp(char*,char*): Comparacin de cadenas. strcpy(char*,char*): Copia cadenas. strdup(char*): Duplica una cadena. strlen(char*): Longitud de una cadena. strncpy(int,char*,char*): Copia cadenas. strncat(int,char*,char*): Concatena.
Programacin en C
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. ...
Programacin en C
40
Entrada Salida
int int int int int char* FILE* int int int fprintf(FILE*,...): Salida sobre fichero. fscanf(FILE*,...): Entrada desde fichero. sprintf(char*,...): Salida sobre un buffer. sscanf(char*,...): Entrada desde un buffer. fgetc(FILE*): Lee un carcter desde fichero. fgets(char*,int,FILE*): Lee una lnea. fopen(char*,char*): Abre un fichero. fclose(FILE*): Cierra un fichero. fflush(FILE*): Descarga un buffer de fichero. feof(FILE*): Indica si ha finalizado un fichero.
Programacin en C
41
Ficheros Especiales
Existen tres variables de tipo FILE* asociados a tres ficheros estndar:
stdin: Entrada estndar. stdout: Salida estndar. stdout: Salida de error estndar.
42
Ordenacin y Bsqueda
void* bsearch(void*,void*,int,int, int (*)(void*,void*)): Bsqueda binaria sobre lista ordenada. void qsort(void*,int,int, int (*)(void*,void*)): Ordenacin mediante el algoritmo quicksort. char *vec[10]={casa,.....}; qsort((void*)vec,10,sizeof(char*),strcmp);
Programacin en C
43
Conversin 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.
Programacin en C
Funciones Matemticas
double double double double double double double double double ... exp(double): Calcula ex. log(double): Calcula el logaritmo natural. log10(doubel): Calcula el logaritmo en base 10. pow(double,double): Calcula xy. sqrt(double): Calcula la raz cuadrada. sin(double): Calcula el seno (en radianes). cos(double): Calcula el coseno (en radianes). sinh(double): Calcula el seno hiperblico. atan(double): Calcula el arco tangente.
Programacin en C
45
Programacin en C
46
Programacin en C
Argumentos del Programa
Programacin en C
47
Argumentos de main
La funcin principal main puede recibir argumentos que permiten acceder a los parmetros con los que es llamado el ejecutable.
int main(int argc, char* argv[]) int argc : Nmero de parmetros. char* argv[] : Parmetros del ejecutable.
Programacin en C
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]
p r o g \0 u n o \0 d o s \0 t r e s \0 c u a t r o \0
Programacin en C
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;
}
Programacin en C
50