Sie sind auf Seite 1von 26

Departamento de Lenguajes y Ciencias de la Computacin Universidad de Mlaga

ANSI C (Revisin)

1

Revisin de ANSI C
Lab. Software Comunicaciones ETSI Telecomunicacin Pedro Merino Gmez

Introduccin a Ansi C Variables, operadores y expresiones Control de flujo Arrays y cadenas de caracteres Funciones Estructuras y Uniones Punteros El pre-procesador de C Programacin modular en ANSI-C C, UNIX y las bibliotecas de funciones
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C

EJERCICIOS
Previos
0.1 Copiar todas las lneas de entrada en la salida, hasta pulsar CTRL D. 0.2 Imprimir la lnea de argumentos con la que se llama a un programa 0.3 Comprobar si un ordenador del laboratorio est funcionando mediante la creacin de una conexin TCP con sockets.

Introduccin a Ansi C
Temas a tratar ...
Historia Caractersticas C y Unix Estructura de un programa Compilacin y ejecucin

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C

Introduccin a Ansi C Historia


BCPL (1967), B (1970), C (1972), ANSI-C (1988, 1999), Ligado a UNIX desde 1973 ANSI C++, C# ...

Introduccin a Ansi C
Caractersticas Pequeo tamao Uso de funciones de librera Lenguaje estructurado Propsito general y prog. Sistemas Poco tipado, inseguro Bajo nivel , operaciones de bits y punteros

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C

Introduccin a Ansi C
Caractersticas Construcciones de alto nivel Manejo de tareas de bajo nivel Programas eficientes Compiladores para mltiples plataformas

Introduccin a Ansi C
UNIX y C C se dise para implementar UNIX Comandos escritos en C Las funciones de librera para acceso al sistema se usan mejor desde C

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C

Introduccin a Ansi C
Estructura de un programa Un programa C contiene
Ordenes para el preprocesador Definiciones de tipos Prototipos para funciones Variables Funciones Una funcin especial main()

Estructura bsica
Ejemplo mnimo
/* Esto es un comentario: el programa mas simple */ #include <stdio.h> int main(void ) { printf("hello, world\ n"); return 0; }

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 10

Estructura bsica
Ejemplo
/* Convierte de Celcius a Fahrenheit */ #include <stdio.h> main() { /* Declaraciones */ float celsius; float fahrenheit; /* Peticion de la entrada al usuario */ printf( " Type a number: "); scanf( "%f", & celsius); /* Calculo del resultado */ fahrenheit = celsius * 9 / 5.0 + 32; /* Impresion del resultado */ printf( "Celsius: %5.1f, Fahr: %5.1f\n", celsius , fahrenheit ); exit( 0 ); } /* fin del programa */
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Estructura bsica
Ejemplo
/* Imprime una tabla de conversion de temperaturas */ #include <stdio.h> int main(void ) { float fahr, celsius; int lower, upper , step; lower = 0; upper = 300; step = 20; printf("C F\ n\n"); celsius = lower; while (celsius <= upper) { fahr = (9.0/5.0) * celsius + 32.0; printf("%3.0f %6.1f \n", celsius, fahr); celsius = celsius + step; } }

ANSI C 11

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 12

Estructura bsica
Ejemplo
/* Imprime una tabla de conversion de temperaturas en orden inverso */ #include <stdio.h> int main(void ) { float fahr, celsius; int lower, upper , step; lower = 0; upper = 300; step = 20; printf("C F\ n\n"); for(celsius = upper; celsius >= lower ; celsius = celsius - step) { fahr = (9.0/5.0) * celsius + 32.0; printf("%3.0f %6.1f \n", celsius, fahr); } } #include <stdio.h>

Estructura bsica
Ejemplo
int main(void ) { printf("Press a key. ENTER would be nice :- )\n\n"); printf("The expression getchar() != EOF evaluates to %d\n", getchar() != EOF); }

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 13

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 14

Estructura bsica
Ejemplo
#include <stdio.h> int main(void ) { int c ; c = getchar (); while ( c!= EOF ) { putchar (c); c = getchar(); } }

Estructura bsica
Ejemplo
#include <stdio.h> int main(void ) { int c ; while ( (c = getchar()) != EOF ) { putchar (c); } }

Copia la entrada en la salida La entrada puede ser con buffer Puede redireccionarse la entrada y salida
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Cualquier expresin tiene un valor, y puede usarse en otras expresiones


ANSI C 15
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 16

Estructura bsica
Ejemplo
#include <stdio.h> int main(void ) { int nc; nc = 0; while (getchar() != EOF ) nc++; printf(%ld \n, nc); }

Estructura bsica
Ejemplo
/* Cuenta blancos, tabuladores y lineas nuevas */ #include <stdio.h> int main(void ) { int blanks=0, tabs=0, newlines=0; int c ; while ((c = getchar()) != EOF) { if(c == ' ') ++blanks; if(c == ' \t') ++tabs; if(c == ' \n') + +newlines; } printf("Blancos: %d\nTabs: %d\nLineas : %d\n", blanks, tabs, newlines) ; return 0; }

Las notaciones n++, ++n, n-- y --n incrementan y disminuyen en 1


Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 17

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 18

Estructura bsica
/* Sustituye tabuladores por espacios */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_BUFFER #define SPACE #define TAB 1024 (char)' ' (char)'\ t'

Estructura bsica
Ejemplo
int main(void ) { char Buffer[MAX_BUFFER]; int TabSize = 5, i, j, k; while (getline(Buffer, MAX_BUFFER) > 0) { for (i = 0; Buffer[i] != ' \0'; i++) { i f(Buffer[i] == TAB) { j = CalculateNumberOfSpaces(i, TabSize); for(k = 0; k < j; k++) { putchar(SPACE); } } else { putchar(Buffer[i]); } } }Merino Gmez Pedro Laboratorio de Software de Comunicaciones return 0; Curso 2001/2002 }

Ejemplo

int CalculateNumberOfSpaces(int Offset, int TabSize); int getline(char s[], int lim );

Las funciones se pueden referenciar antes de definirlas


Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 19

ANSI C 20

Estructura bsica
Ejemplo
int CalculateNumberOfSpaces(int Offset, int TabSize) { return TabSize - (Offset % TabSize); }

Compilacin
Temas a tratar ...
Modelo de compilacin Compiladores Ejecucin

int getline(char s[], int lim ) { int c, i; for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\ n'; ++i) s[i] = c; if(c == '\n') { s[i] = c; ++i; } s[i] = '\0'; return i; }
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 21

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 22

Compilacin
Modelo de compilacin
fuente
Preprocesador

Compilacin
Compilador
Los mas frecuente: cc gcc
cc -o ejecutable fuente.c gcc -o ejecutable fuente.c gcc fuente.c

Compilador

Ensamblador

libreras
Editor de enlace

ejecutable
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 23

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 24

Compilacin
Compilador

Compilacin
Ejecucin

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 25

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 26

EJERCICIOS
Introduccin
1.1 Escribir un programa que copie la entrada en la salida, sustituyendo cada cadena de espacios en blanco por un nico espacio en blanco. 1.2 Escribir un programa que elimine los espacios en blanco y tabuladores al final de cada lnea, y que borre las lneas en blanco. 1.3 Escribir una funcin reverse(s) que invierta una cadena de caracteres s. 1.4 Escribir un programa que elimine todos los comentarios de un programa C.

Variables y Operadores
Temas a tratar ...
Tipos de datos Declaracin de variables Variables locales, globales, externas y estticas. mbitos. Operadores aritmticos, relaciones y lgicos Operadores de asignacin Expresiones condicionales Precedencia de operadores Conversin de tipos
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 27

ANSI C 28

Variables y Operadores
Tipos de datos bsicos
Bsicos short int, unsigned int float long int double
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Variables y Operadores
Tamaos de lo tipos de datos
#include <stdio.h> #include <limits.h> int main () { printf("Size printf("Size printf("Size printf("Size printf("Size printf("Size printf("Size printf("Size printf("Size printf("Size printf("Size printf("Size printf("Size return 0; } ANSI C 29
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Otros arrays estructuras uniones enumerados puntero campo de bit

char, unsigned char void

of of of of of of of of of of of of of

Char %d\n", CHAR_BIT); Char Max %d \n", CHAR_MAX); Char Min %d \n", CHAR_MIN); int min %d\ n", INT_MIN); int max %d\ n", INT_MAX); long min %d \n", LONG_MIN); long max %d \n", LONG_MAX); short min % d\n", SHRT_MIN); short max % d\n", SHRT_MAX); unsigned char %d \n", UCHAR_MAX); unsigned long %d \n", ULONG_MAX); unsigned int %d\ n", UINT_MAX); unsigned short %d\n", USHRT_MAX);

ANSI C 30

Variables y Operadores
Declaraciones de variables
Nombres de variables:
letra + letras y dgitos Distincin entre maysculas y minsculas

Variables y Operadores
Atributos de las variables Locales: declaradas dentro de una funcin Globales: declaradas fuera de funciones Externas: declaradas en otro mdulo Estticas: no se eliminan hasta el final de la ejecucin, privadas Tipo de almacenamiento y tipo de acceso:
auto, register, static, extern, const, volatile
ANSI C 31
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Declaraciones
Tipo Variable1, Variable2; int entero; char caracter, c1, c2; enum Color { Verde, Amarillo, Rojo };

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 32

Variables y Operadores
Operadores
Aritmticos
Binarios
l

Variables y Operadores
Operadores Lgicos
l

+ , -, *, /, %

&&, ||

Relacionales
Los de mas precedencia
l

Manejo de bits
l

&

<<

>> ~

> , >=, <, <= ==, !=


Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Los de menos precedencia


l
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 33

ANSI C 34

Variables y Operadores
Operadores de asignacin Variable operador = expresion
X *= y +1 X = x * (y +1)

Variables y Operadores
Expresiones condicionales expresion1 ? expresion2 : expresion3
z = ( a > b) ? a : b
/* convierte mayuscula en minuscula */ int lower(int c) { return c >= 'A' && c <= 'Z' ? c + 'a' - 'A' : c; } int lower(int c) { char *Uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char *Lowercase = "abcdefghijklmnopqrstuvwxyz"; char *p = NULL; return NULL == (p = strchr( Uppercase, c)) ? c : *(Lowercase + (p - Uppercase)); }
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

/* cuenta los bits 1 en x */ int bitcount( unsigned x ) { int b; for (b = 0; x != 0; x &= (x-1)) b++; return b; }
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 35

ANSI C 36

Variables y Operadores
Precedencia y orden de evaluacin
Operadores () ! ~ * << < == & ^ | && || ?: = , += -= *= /= %= &= ^= |= <<= >>= <= / [] ++ % >> > != >= -> -+ * & (tipo) sizeof Orden de evaluacin Izquierda a derecha Derecha a izquierda Izquierda a derecha Izquierda a derecha Izquierda a derecha Izquierda a derecha Izquierda a derecha Izquierda a derecha Izquierda a derecha Izquierda a derecha Izquierda a derecha Derecha a izquierda Derecha a izquierda Izquierda a derecha
ANSI C 37

Variables y Operadores
Conversiones de tipo
Conversin implcita en argumentos de funciones Conversin explcita con el operador cast
Variable = (tipo) expresin

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 38

EJERCICIOS
Variables, operadores
2.1 Escribir una funcin mi_htoi(s) que devuelva el entero equivalente a una cadena de dgitos hexadecimales. 2.2 Escribir la funcion lower que convierte de mayusculas a minculas usando la expresin condicinal.

Control de flujo
Temas a tratar ...
Bloques de Instrucciones Instrucciones de Seleccin
Sentencia if Sentencia switch

Bucles

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Sentencia for Sentencia while Sentencia do-while Sentencias break, continue y goto

ANSI C 39

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 40

Control de flujo
Bloques de instrucciones
Instruccin o proposicin simple
Sentencia ;

Control de flujo
Seleccin if
Se emplea para expresar decisiones
if (expresin) Sentencia1 ; else Sentencia2 ; if (expresin) Bloque1 else Bloque2

Bloque de instrucciones
{ Sentencia1 ; Sentencia2 ; .... SentenciaN ; }

El bloque puede contener declaraciones de variables


Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 41

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 42

Control de flujo
Seleccin if
/* Imprime el area a partir del radio*/ #define Pi 3.14159 main() { float radius; printf( " Type a radius: "); scanf( "%f", & radius ); if ( radius < 0 ) { printf( "Error: Negative values not permitted \n" ); } else { printf( "Radius is %5.2f, area is %5.2f \n",radius, Pi * radius * radius) ; } exit( 0 ); }

Control de flujo
Seleccin if
Las construcciones if pueden anidarse La parte else es optativa
if ( n > if (a z else z 0 ) > b) = a; = b; if ( n > 0 ) { if (a > b) z = a; } else z = b;

El else se asocia al if sin else ms cercano


Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002 Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 43

ANSI C 44

Control de flujo
Seleccin else-if
El anidamiento puede generar una estructura else-if
if (expresin) Sentencia; else if (expresin) Sentencia; else if (expresin) Sentencia; else if (expresin) Sentencia; else Sentencia;
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Control de flujo
Seleccin if
main () { char ch; int a = 0, e = 0, i = 0, o = 0, u = 0; int total = 0, rest = 0; printf ( "Type sentence ending with a return: " ); while ( ( ch = getchar () ) != '\n' ) { if ( ch == 'a' ) a++; else if ( ch == 'e' ) e++; else if ( ch == 'i' ) i++; else if ( ch == 'o' ) o++; else if ( ch == 'u' ) u++; else rest++; total++; } ANSI C 45
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 46

Control de flujo
Seleccin switch
Se emplea para expresar decisiones mltiples Cada case se anota con uno o varios valores constantes
switch (expresin) { case exp-cont: Sentencias case exp-cont: Sentencias case exp-cont: Sentencias ...... default : Sentencias }
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Control de flujo
Seleccin switch
main () { int month; printf ( "Type the number of a month: " ); scanf ( "%d", &month ); printf( " \nName of month %d is ", month ) ; switch ( month ) { case 1: printf ( "January" ); break; case 2: printf ( "February" ); break; case 3: printf ( "March " ); break ; case 4: printf ( "April " ); break ; case 5: printf ( "May" ); break; case 6: printf ( "June" ); break; case 7: printf ( "July" ); break; case 8: printf ( "August" ); break; case 9: printf ( "September" ); break; case 10: printf ( "October" ); break; case 11: printf ( "November" ); break; case 12: printf ( "Devember" ); break; default : printf ( "Unknown" ); } putchar ( '\n' ); ANSI C 48

ANSI C 47

Pedro Merino Gmez Laboratorio de Software } Comunicaciones de Curso 2001/2002

Control de flujo
Seleccin switch
int d, m, y, max, /* dia, mes, ao, dias del mes*/ leap; /* para comprobar si es bisiesto */ main () { printf ( "Type day month year: " ); scanf ( "%d", &d ); scanf ( "%d", &m ); scanf ( "%d", &y ); printf( " \nDate following %d:%02d:%04d is ", d, m, y ); switch ( m ) { case 1: max = 31; break; case 2: max = 28; break; case 3: max = 31; break; case 4: max = 30; break; case 5: max = 31; break; case 6: max = 30; break; case 7: max = 31; break; case 8: max = 31; break; case 9: max = 30; break; case 10: max = 31; break; case 11: max = 30; break; Pedro Merino Gmez case 12: max = 31; Laboratorio de Software de Comunicaciones } Curso 2001/2002

Control de flujo
Seleccin switch
leap = ( y % 4 == 0 ) && ( ( y % 400 == 0 ) || ( y % 100 != 0 ) ); if ( m == 2 && leap ) max++; if ( d < max ) d++; else if ( m < 12 ) { /* && d == max */ d = 1; m++; } else { /* d == max, m == 12 */ d = 1; m = 1; y++; } printf ( "%2d:%02d:%04d\n", d, m, y ); exit( 0 ); }
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 49

ANSI C 50

Control de flujo
Bucle while
La expresin se evala antes de ejecutar el cuerpo Para continuar, expresin debe ser distinto de cero
while (expresin) sentencia; while (expresin) bloque while (expresin);

Control de flujo
Bucle while
void escape(char * s, char * t) { int i, j; i = j = 0; while ( t[i] ) { switch( t[i] ) { case '\n': s[j++] = '\ \'; s[j] = 'n'; break; case '\t': s[j++] = '\ \'; s[j] = 't'; break; default : s[j] = t[i]; break; }
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 51

ANSI C 52

Control de flujo
Bucle while
int base = 10; main () { char ch; int value = 0; printf( " Type base: " ); scanf( "%d", &base ); printf ( "Type number to be evaluated: " ); while ( ( ch = getchar () ) < '0' || ch >= '0' + base ) { if ( ch < 0 ) { printf( "No valid characters, result must be 0 \n" ); exit( 0 ); } } value = ch - '0'; while ( ( ch = getchar () ) >= '0' && ch < '0' + base ) value = value * base + ch - '0'; printf ( "Value is %d\n", value ); } Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002 ANSI C 53

Control de flujo
Bucle for
for (expr1; expr2; expr3) sentencia; bloque

equivale a
expr1; while (expr2){ sentencia; expr3 };

bloque

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 54

Control de flujo
Bucle for
#include <stdio.h>

Control de flujo
Bucle for
expr1

main() { float in, sum = 0.0, max = -1000000.0, min = 1000000.0; int i; for (i=0;i<10;++i) { printf("Enter number %d: \ n", i+1); scanf ("%f",&in); if ( max < in ) max = in; /* in is current largest */ if ( min > in ) min = in; /* in is current smallest */ sum += in; } printf("\nLargest = %10.3f, Smallest = %10.3f, Average %10.3f\n", max, min, sum / 10.0); exit (0);
Pedro Merino Gmez } Laboratorio de Software de Comunicaciones Curso 2001/2002

y expr3 pueden ser compuestas

for (expr1; expr2; expr3) sentencia; bloque

void reverse( char s[]) { int c, i, j; for (i=0, j = strlen(s)-1; { c = s[i]; s[i] = s[j]; s[j] = c; }
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

i<j; i++, j--)

ANSI C 55

ANSI C 56

Control de flujo
Bucle do-while
La expresin se evala despus de ejecutar
do sentencia; bloque; while (expresin);

Control de flujo
break y continue
break

void itoa(int n, char s[]) { int i, sign; sign = n; i = 0; do { s[i++] = abs(n % 10) + '0'; } while ( n /= 10 ); if (sign < 0) s[i++] = ' -'; s[i] = '\ 0'; reverse(s); }

sale de una rama de switch o del bucle for , while do ms interno continue corta la iteracin de un bucle e inicia una nueva
int trim(char s[]) { int n; sign = n; for (n = strlen (s)-1; n >= 0; n --) if(s[n] != && s[n] != \t && s[n] != \n) break; s[n+1] = \0; return(n); }
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 57

ANSI C 58

EJERCICIOS
Control de flujo
3.1 Escribir la funcin expand(s1, s2) que expanda la notacin abreviada a indicada en la cadena s1, en una lista completa abc -z, ..xyz en s2. 3.2 Escribir una funcin itob(n,s,b) que convierte el entero n en y una cadena s que representa al numero en base b. 3.3 Escribir una funcion itoa(n, l, s) que convierte el numero entero n en una cadena de caracteres de longitud l (insertando blancos por la izquierda hasta completar la longitud).

Arrays y cadenas de caracteres


Temas a tratar ...
Arrays unidimensionales Arrays multidimensionales Cadenas de caracteres

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 59

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 60

Arrays y cadenas de caracteres


Arrays unidimensionales
Declaracin
tipo nombre[tamao];

Arrays y cadenas de caracteres


Arrays unidimensionales
#include <stdio.h> main() { int arr[10]; int i; /* indice del array */ int in; for (i=0;i<10;++i) arr[i] = i; /* inicializacion con valores*/ for (i=0;i<10;++i) printf("%d ", arr [i]); /* impresion del array */ printf("Enter number to be searched for:\n"); scanf("%d", &in); i=0; while ( (i < 10) && ( arr[i++] != in) ); if ( i == 10 ) printf(" Number %d not found i n array\n", in); else printf(" Number %d found at array location %d\ n", in, i-1); }

Acceso a un elemento
nombre[ndice]

ndice

vara de 0 a tamao 1 La asignacin de arrays completos es Ilegal !! Inicializacin


tipo nombre[] = {const, const, .. const};

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 61

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 62

Arrays y cadenas de caracteres


Cadenas de caracteres
Declaracin como arrays
char nombre [tamao];

Arrays y cadenas de caracteres


Cadenas de caracteres
#include <stdio.h> #define MAXLINE 1000 int getline(char line[], int maxline); void copy(char to[], char from[]); int main(void ) { int len; /* loingutud de la linea actual */ int max=0; /* maxima longitud actual */ char line[MAXLINE]; /* linea actual*/ char longest[MAXLINE]; /* linea mas larga */ while ((len = getline( line, MAXLINE)) > 0) { printf("%d: %s", len, line); if(len > max) { max = len; copy(longest , line); } } if(max > 0) printf( "Longest is %d characters:\ n%s", max, longest); Pedro Merino Gmez printf("\n"); Laboratorio de Software de Comunicaciones Curso 2001/2002 } ANSI C 64

Acceso como array y con funciones especiales Almacenamiento con un terminador \0, que ocupa una posicin u n a Inicializacin
char cadena[] = {u, n, o, \0}; char cadena[] = {uno};
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

c o n s t a n t e \0

ANSI C 63

Arrays y cadenas de caracteres


Cadenas de caracteres
/* copy : copia una cadena de caracteres en otra */ void copy(char to[], char from[]) { int i ; i = 0; while ((to[i] = from[i]) != '\0') { ++i; } }

Arrays y cadenas de caracteres


Arrays multidimensionales
Declaracin
tipo nombre[tamao1][tamao2][tamao3][tamao4];

Acceso a un elemento
nombre[ndice1][ndice2][ndice3][ndice4]

Inicializacin
tipo nombre[][] = {{const, const, .. const}, {const, const, .. const}}

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 65

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 66

Departamento de Lenguajes y Ciencias de la Computacin Universidad de Mlaga

Funciones
Temas a tratar ...
Declaracin de funciones Ficheros de cabeceras Reglas de mbito Funciones y arrays Uso de variables estticas y registro Recursividad

Ansi C (Revisin)

Pedro Merino Gmez

67

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 68

Funciones
Declaracin de funciones
En C se usan como funciones y procedimientos Todas se definen como globales, sin anidamiento
tipo_devuelto nombre(par1, par2, ..) { variables locales cuerpo }

Funciones
Declaracin de funciones Pueden devolver cualquier tipo
excepto tipos funcin o arrays si no se especifica, devuelve int proposicin return devuelve el valor void para procedimientos Se necesita una definicin o declaracin antes de usarlas,
tipo_devuelto nombre(tipo_par1, tipo_par2, ..);

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 69

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 70

Funciones
Declaracin de funciones Los parmetros son de cualquier tipo Los parmetros se pasan por valor
excepto los arrays se realizan conversiones automticas de tipo
#include <stdio.h>

Funciones
Declaracin de funciones

int strrindex ( char s[], char t ) { int i ; int count = -1; for(i=0; s[i] != '\0'; i++) { if(s[i] == t) { count = i; } } return count; }

Almacenamiento automtico para parmetros y variables locales Posibilidad de declarar variables locales como estticas
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 71

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 72

Funciones
Ficheros de cabeceras Las funciones ya disponibles y las que se creen en otros ficheros deben declararse para utilizarlas Declaraciones agrupadas en ficheros .h
Entrada/salida <stdio.h> Manipulacin de cadenas <string.h> Funciones matemticas <math.h>

Funciones
Ficheros de cabeceras

La notacion < > indica que se encuentran en directorios estndar


Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 73

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 74

Funciones
Ficheros de cabeceras

Funciones
Reglas de mbito Variables de uso local, sin conflicto con externas
Los parmetros formales Las variables locales declaradas Las variables y funciones externas calificadas como static son visibles slo en el fichero que las contiene La calificacin de una variable local como static hace que sea permante (adems de privada)

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 75

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 76

Funciones
Funciones y arrays Las variables no pueden devolver arrays Los arrays como parmetros se tratan por referencia
Pueden pasarse como arrays abiertos Slo puede dejarse abierta la primera dimensin

Funciones
Recursividad Pueden hacerse llamadas recursivas directas o indirectas
void my _memrev(char *s, size_t n) { switch (n) { case 0: case 1: break ; case 2: case 3: swap(s, s + n - 1, 1); break ; default: my_memrev(s, n / 2); my_memrev(s + ((n + 1) / 2), n / 2); swap(s, s + ((n + 1) / 2), n / 2); break ; } } ANSI C 78

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 77

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

EJERCICIOS
Arrays y funciones
4.1 Escribir la funcion strcat(s,t) que aade la cadena s al final de t usando arrays de caracteres. 4.2 Escribir versiones de otras tres funciones estndar de manejo de caracteres usando array (usar man k ). 4.3 Escribir una versin recursiva de la funcin reverse() de ejercicio 1.3 4.3 Construir una funcin con dos parmetros que emplee las funciones de <math.h> y que imprima una tabla de valores generados para dos rangos concretos de sus parmetros.

Estructuras y uniones
Temas a tratar ...
Definicin y uso de estructuras Definicin de nuevos tipos de datos (typedef) Uniones

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 79

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 80

Estructuras y uniones
Definicin de estructuras
Una estructura es una coleccin de variables (incluidas estructuras)
struct nombre { tipo nombre_campo ; tipo nombre_campo ; ....... }

Estructuras y uniones
Definicin de estructuras
Diferentes formas de declarar variables
struct point { int x; int y; }; ...... struct point a, b; struct { int x; int y; } a, b;

En ANSI-C, una estructura puede utilizarse como una variable (asignacin, paso como parmetro, valor de vuelta de una funcin) Las estructuras no se pueden comparar
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Acceso a campos con .


b = a.x;
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

a.y = c;
ANSI C 82

ANSI C 81

Estructuras y uniones
Definicin de estructuras
Se puede renombrar un tipo simple o dar un nombre a un tipo compuesto
typedef int Longitud; typedef struct point { int x; Longitud i, j; int y; } Coordenadas; ...... Coordenadas a, b;

Estructuras y uniones
Definicin de estructuras
/* Almacenamiento de datos personales en una estructura */ #include <stdio.h> #define MAXLENGTH 20

typedef struct { char int float } personnel;

name[MAXLENGTH + 1]; age; salary;

personnel makepersonnel (char name[], int age, float salary); void printpersonnel(personnel p); float sumsalary(personnel x, personnel y);

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 83

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 84

Estructuras y uniones
Definicin de estructuras
personnel makepersonnel (char name[], int age, float salary) { int i; personnel p; i = 0; do p.name[i] = name[i]; while ( name[i++] != '\0'); p.age = age; p.salary = salary; return p; } void printpersonnel(personnel p) { printf( "Name = %s\nAge p.age, p.salary); } main() {

Estructuras y uniones
Definicin de estructuras
personnel p1, p2; p1 = makepersonnel ("Andrew", 21, 10000.0); p2 = makepersonnel ("Brian", 22, 20000.0); printpersonnel(p1); printpersonnel(p2); printf( "Sum of salaries = %.2f\n\n", sumsalary(p1, p2)); return 0; }

= %d\nSalary = %.2f\n\ n", p.name,

float sumsalary(personnel x, personnel y) { return x.salary + y.salary; } Pedro Merino Gmez


Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 85

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 86

Estructuras y uniones
Campos de bits
Se emplean para ahorrar almacenamiento
struct { unsigned int lectura : 1; unsigned int escritura : 1; unsigned int ejecucion : 1; } permisos;

Estructuras y uniones
Uniones Superposicin de elementos heterogneos Campos excluyentes en el tiempo Ocupa la memoria del campo mayor Acceso a elementos como campos de estucturas
union nombre { tipo1 elemento1; union cantidad { int ival; float fval ; } c;

permisos.lectura = 0; permisos.escritura = 1;

tipo2 elemento2; ........ } variables ;


Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

c.ival = 20;
ANSI C 88

ANSI C 87

EJERCICIOS
Estructuras
5.1 Escribir un programa que almacene una lista de expedientes d e alumnos en un array de estructuras. Contemplar las opciones de alta/baja y consulta (completa y por campo). No usar punteros.

Punteros
Temas a tratar ...
Definicin Punteros y funciones Punteros y arrays Punteros y estructuras Punteros a funciones Procesamiento de lnea de argumentos Gestin dinmica de memoria Errores frecuentes empleando punteros
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 89

ANSI C 90

Punteros
Definicin
Un puntero es una variable que contiene la direccin de una variable
char ( c) Int (x) struct (coordenadas) int * (puntero) Int (y)

Punteros
Definicin

Declaracin

tipo *nombre; int *puntero;

Asignacin de direccin (&) y desreferenciacin (*)


int y; puntero = &y; x = *puntero;
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002 Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

*puntero = *puntero + 5;

ANSI C 91

ANSI C 92

Punteros
Definicin El valor NULL puede asignarse a cualquier tipo de puntero
puntero = NULL;
char ( c) Int (x) struct (coordenadas) int * (puntero) Int (y)

Punteros
Aritmtica de punteros
El incremento o decremento de una variable tipo puntero depende del tipo de variable a la que apunta

int y, *py; py = &y; py++;

Significa que el puntero no apunta a ningn sitio No se puede desreferenciar


Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002 Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 93

ANSI C 94

Punteros
Punteros y funciones En general, C pasa los argumentos por valor El paso por referencia se realiza pasando la direccin de la variable
void swap(int x, int y) { int c; c = x; x = y; y = c;
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Punteros
Punteros y funciones
#include <ctype.h> int getch(void); void ungetch( int); int getint(int *pn ) { int c, sign, sawsign; while (isspace (c = getch())); if (!isdigit(c) && c != EOF && c != '+' && c != '-') { ungetch(c); /* it's not a number * / return 0; } sign = (c == ' -') ? -1 : 1; if (sawsign = (c == '+' || c == '-')) c = getch(); if (!isdigit(c)) { ungetch(c); if (sawsign) ungetch((sign == -1) ? '-' : '+'); return 0; Pedro Merino Gmez } Laboratorio de Software de Comunicaciones
Curso 2001/2002

void swap(int *px, int *py) { int c; c = *px; *px = *py; *py = c; }
ANSI C 95

ANSI C 96

Punteros
Punteros y funciones
for (*pn = 0; isdigit(c); c = getch ()) *pn = 10 * *pn + (c - '0'); *pn *= sign; if (c != EOF) ungetch(c); return c; }

Punteros
Punteros y funciones Una funcin puede devolver un puntero
typedef struct point { int x; int y; } Coordenadas; Coordenadas a, b, *crea_Coord(); main() { a = crea_Coord(); }

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 97

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 98

Punteros
Punteros y arrays En C, punteros y arrays estn muy relacionados El paso por referencia se realiza pasando la direccin como parmetro
int a[10], x; int *pa; pa = &a[0]; x = *pa; int a[10], x; int *pa; pa = a; x = *pa; a[i] pa[i]
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Punteros
Punteros y arrays Importante
Un puntero es una variable (pa=a y pa++ es legal) Un array no es una variable (a = pa y a++ es ilegal)

El paso de un array a una funcin se realiza con un puntero al primer elemento


int suma(int a[]);

*(a + i) *(pa + i)
ANSI C 99

int suma(int *a);


Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 100

Punteros
Punteros y arrays Los arrays de punteros son tiles para evitar movimientos de datos

Punteros
Punteros y arrays El almacenamiento depende de la declaracin
Char aname[][15] = {no month, jan, feb, ...}

Char *name[15] = {no month, jan, feb, ...}

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 101

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 102

Punteros
Punteros y estructuras La sintaxis para acceder a los campos de estructuras mediante punteros es distinta
struct point { int x; int y; }a, *pb;

Punteros
Punteros y estructuras Listas enlazadas de estructuras
typedef struct nodo { int dato; struct nodo *sig; } TIPONODO;

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 103

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 104

Punteros
Punteros a funciones Una funcin C no es una variable, pero
Se puede apuntar a la memoria donde comienza un segmento de cdigo (funcin) Se puede usar el puntero como el de una variable

Punteros
Punteros a funciones
int (*pf) () /* puntero a funcin que devuelve un entero */

void (*pv) () /* puntero a funcin que devuelve void */

Se define el tipo de las funciones


que tienen el mismo tipo de retorno y los mismos argumentos

char (*(*x())[])() /* puntero a funcin que devuelve un array de punteros a funciones que devuelven char */

char (*(*x[3])())[5] /* array de 3 punteros a funciones que devuelven punteros a arrays de 5 char */

Las funciones definidas que lo cumplan son valores del tipo


Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 105

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 106

EJERCICIOS
Punteros-1
6.1 Reescribir las funciones de los ejercicios 4.1, 4.2 y 4.3 empleando punteros. 6.2 Escribir un programa que ordene de forma ascendente un fichero de texto por lneas.

Punteros
Procesamiento de la lnea de argumentos El programa puede acceder a los argumentos que lo acompaan
%cc -o copy copy.c

cc es el programa -o copy y copy.c son los argumentos


main(int argc, char **argv)

argc : nmero de argumentos, incluido el nombre del programa argv apunta a cada argumento
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 107

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 108

EJERCICIOS
Punteros-2
7.1 Escribir una programa tail que imprime las ltimas n lneas de la entrada, siendo n un argumento de llamada en lnea de comandos. 7.2 Escribir un programa que admita hasta 10 enteros como argumentos en la lnea de comando, y que los imprima ordenados.

Punteros
Gestin dinmica de memoria C permite crear de forma dinmica espacio para cualquier tipo de variable y obtener su direccin en un puntero Funciones de la librera estndar (<stdlib.h>)
void *malloc(size_t size) void free(void *p) void *calloc(size_t elem, size_t size) void *realloc(void *p, size_t size)

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 109

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 110

Punteros
Gestin dinmica de memoria
#include <stdio.h> #include <malloc.h> main() { int size; int *arr; int i = 0; printf(Introduzca el numero de elementos del array\ n"); scanf("%d",&size); if ( (arr = (int *) malloc (size *sizeof(int ))) == NULL) { printf("Error: No hay memoria suficiente\n"); exit(-1); } /* lee los datos */ while (i< size) { printf (Introduzca numero %d:\n", i); scanf("%d", arr + i); ++i; Pedro Merino Gmez Laboratorio de Software de Comunicaciones } }
Curso 2001/2002

Punteros
Gestin dinmica de memoria
/* Implementacin de una cola con punteros */ #include <stdio.h> #define FALSE 0 #define NULL 0 typedef struct { int dataitem; struct listelement *link; } listelement; void Menu (int *choice) ; listelement * AddItem ( listelement * listpointer, int data); listelement * RemoveItem (listelement * listpointer); void PrintQueue (listelement * listpointer); void ClearQueue (listelement * listpointer);

ANSI C 111

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 112

Punteros
Gestin dinmica de memoria
main () { listelement listmember, * listpointer; int data, choice ; listpointer = NULL;

Punteros
Gestin dinmica de memoria
case 2: if (listpointer == NULL) printf (" Queue empty!\n"); else listpointer = RemoveItem (listpointer); break; case 3: PrintQueue (listpointer ); break; case 4: break; default: printf ("Invalid menu choice - try again\n"); break; } } while ( choice != 4); ClearQueue (listpointer);

do { Menu (& choice ); switch (choice) { case 1: printf ("Enter data item value to add "); scanf ("%d", &data); listpointer = AddItem ( listpointer , data); break;

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

} ANSI C 113

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 114

Punteros
Gestin dinmica de memoria
void Menu (int *choice) { char local;

Punteros
Gestin dinmica de memoria
listelement * AddItem (listelement * listpointer, int data) { listelement * lp = listpointer ; if (listpointer != NULL) { while ( listpointer -> link != NULL) listpointer = listpointer -> link; listpointer - > link = ( struct listelement *) malloc (sizeof (listelement)); listpointer = listpointer -> link; listpointer - > link = NULL; listpointer - > dataitem = data; return lp; } else { listpointer = (struct listelement *) malloc (sizeof (listelement)); listpointer - > link = NULL; listpointer - > dataitem = data; return listpointer ; } } ANSI C 115
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

printf (" \nEnter\t1 to add item,\n\ t2 to remove item\n\ \t3 to print queue \n\t4 to quit\n"); do { local = getchar (); if ((isdigit (local) == FALSE) && (local != ' \n')) { printf (" \nyou must enter an integer.\n"); printf (" Enter 1 to add, 2 to remove, 3 to print, 4 to quit\n"); } } while ( isdigit (( unsigned char) local) == FALSE); *choice = (int ) local - '0'; }

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 116

Punteros
Gestin dinmica de memoria
listelement * RemoveItem (listelement * listpointer) { listelement * tempp ; printf (" Element removed is %d \n", listpointer -> dataitem); tempp = listpointer -> link; free (listpointer); return tempp; } void PrintQueue (listelement * listpointer) { if (listpointer == NULL) printf ("queue is empty !\n"); else while ( listpointer != NULL) { printf ("%d\t", listpointer -> dataitem); listpointer = listpointer -> link; } printf (" \n"); }
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002 Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Punteros
Gestin dinmica de memoria
void ClearQueue (listelement * listpointer) { while (listpointer != NULL) { listpointer = RemoveItem (listpointer); } }

ANSI C 117

ANSI C 118

Punteros
Errores frecuentes No asignar memoria antes de usar
int *x; *x = 40; int *x; X = &y; *x = 40;

EJERCICIOS
Punteros-3
8.1 Reescribir el ejercicio 5.1 usando punteros y gestin dinmica de memoria. Definir una funcin que devuelve el puntero a un expediente. 8.2 Reescribir el programa presentado para gestionar una cola, de manera que ahora gestione los registros en forma de pila.

Reserva de memoria en la variable apuntada


*x = (int *)malloc(200); x = (int *)malloc(200);

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 119

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 120

EJERCICIOS
Funciones, estructuras, punteros
1. Comprobar si un array contenido en un estructura se pasa por valor o por referencia cuando se pasa la estructura a una funcin. 2. Escribir un programa que almacene una lista de expedientes d e alumnos en un array de estructuras. Contemplar las opciones de alta/baja y consulta (completa y por campo). No usar punteros. (5.1)

Preprocesador de C
Temas a tratar ...
Visin general Constantes y macros Inclusin de ficheros Seleccin Opciones en la llamada

3. Realizar el ejercicio 2 empleando punteros y gestin dinmica de memoria. (8.1). 4. 5. Escribir un programa que ordene de forma ascendente un fichero de texto por lneas (6.2).

Escribir 5 funciones que procesan 2 enteros de formas diferentes para devolver otro entero. Declarar un array de puntero a funciones que devuelven enteros. Escribir un programa que acepte dos enteros e n lnea de comandos y los procese con las funciones apuntadas en el Pedroarray. Merino Gmez Laboratorio de Software de Comunicaciones
Curso 2001/2002

ANSI C 121

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 122

Preprocesador de C
Visin general
/usr/lib/cpp es el preprocesador en Unix Utilizable con otros compiladores de C Procesa un fichero de entrada y genera otro de salida Puede invocarse de forma independiente (no recomendable !!) Adems de intrerpretar las directivas del fichero, admite opciones en la llamada
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Preprocesador de C
Constantes y macros
#define FALSE 0 #define TRUE !FALSE #define MAX(A,B) ( (A > B) ? (A) : (B) ) #define IGUAL == #define SIN_FIN while(1)

#define cuadrado(x) (x)*(x) cuadrado (z+1); cuadrado (z++);


Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

/* (z+1)*(z+1) */ /* (z++)*(z++) */
ANSI C 124

ANSI C 123

Preprocesador de C
Constantes y macros
Las definiciones pueden eliminarse
#undef FALSE int FALSE = 0;

Preprocesador de C
Inclusin de ficheros
Cualquier tipo de fichero de texto
El directorio de bsqueda depende de < >
#include <stdio.h>

Los argumentos de una macro pueden concatenarse


#define Concatena(a1, a2) a1 ## a2 Concatena(123, 45) genera 12345

#include funciones.h

Inclusin condicional
#if defined STANDARD #include <stdio.h> #else #include miio.h

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 125

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

#endif
ANSI C 126

Preprocesador de C
Seleccin
En general, la seleccin es como la de C
#if expr expr puede ser ... #elseif expr ... #elseif expr ... #else ... #endif
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Preprocesador de C
Opciones en la llamada
Las opciones mas frecuentes
-DConst -Dconst = valor -B -C -M makefile -P -Idirectorio -Ydirectorio
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

equivale a define expr comentarios C++ //

defined const ! defined const const == valor

deja los comentarios genera informacion para genera la salida limpia para buscar includes par includes estndar

ANSI C 127

ANSI C 128

EJERCICIOS
Preprocesador
9.1 Definir una macro para swap(tipo, v1, v2). 9.2 Redefinir instrucciones de C (do, while, ++ ,etc)

Programacin modular en C
Temas a tratar ...
Divisin de un programa en ficheros Compilacin separada Uso de la utilidad Make

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 129

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 130

Programacin modular en C
Divisin de un programa en ficheros
Motivos
Tamao Desarrollo en equipo Reutilizacin de cdigo

Programacin modular en C
Divisin de un programa en ficheros
Definicin f.h extern int v1; extern int f1(..) extern int f2(..) Implementacin f.c int v1; int f1() {.. } int f2 {.. }
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Programa p.c Declaracin #include f.h main{ a = f1( ..); b = f2(..); .. }


ANSI C 132

Estrategia
Fichero .h con declaracin de funciones y variables globales como externas Fichero .c con el cuerpo de las funciones y declaracin de las variables

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 131

Programacin modular en C
Compilacin separada
Necesidades
Compilacin se los .c, incluyendo los .h adecuados
gcc c f.c gCc c p.c

Programacin modular en C
Eliminacin de declaraciones
Definicin f.h extern int v1; extern int f1(..) extern int f2(..) Implementacin f.c int f1(..); Int f2(..); int v1; int f1() {... x=f2()... } int f2 {....y=f1().. } Programa p.c Declaracin #include f.h main{ a = f1( ..); b = f2(..); .. }
ANSI C 134

Generacin del ejecutable


gcc o exe f.o p.o

Si el nmero de ficheros es grande, hay que automatizar !!


Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 133

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Programacin modular en C
Eliminacin de declaraciones
Definicin f.h extern int v1; extern int f1(..) extern int f2(..) Implementacin f.c #define extern #include f.h #undef extern int f1() {... x=f2()... } int f2 {....y=f1().. }
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Programacin modular en C
Compilacin separada
Necesidades
Compilacin se los .c, incluyendo los .h adecuados
cc c f.c cc c p.c

Programa p.c Declaracin #include f.h

Generacin del ejecutable


main{ a = f1( ..); b = f2(..); .. }
cc o exe f.o p.o

Si el nmero de ficheros es grande, hay que automatizar !!


ANSI C 135
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 136

Programacin modular en C
Compilacin separada
Automatizar con script del shell Se compila todo por cada cambio Automatizar de forma inteligente recompilan slo los necesarios conocen las dependencias entre ficheros Herramientas inteligentes
make, touch sistemas de control de versiones
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

Programacin modular en C
Make Lenguaje
objetivos y sub-objetivos especificacin de dependencias

Herramienta que
procesa ficheros en ese lenguaje realiza las operaciones mnimas (basado en fechas) para conseguir el objetivo

ANSI C 137

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 138

Programacin modular en C
Make
CC=cc - g # or any other ansi compatible c compiler # CC=cc -g -DNXT # if you need the X operator in LTL CFLAGS= -ansi -D_POSIX_SOURCE # on some systems add: -I/usr /include # # # # # # # # # on Solaris: add -DSOLARIS on PCs: add -DPC on HP-UX machines, use: CFLAGS=-Aa -D_POSIX_SOURCE and add $(CFLAGS) to the spin .o line: $(CC) $(CFLAGS) - c y.tab.c for __FreeBSD __ delete -D_POSIX_SOURCE if all else fails, try compiling spin as: yacc -v -d spin.y cc -D... -o spin *.c # on Solaris: /usr /ccs/ bin/yacc # create y.output, and y.tab.h TL_OS=

Programacin modular en C
Make
tl_parse.o tl _lex. o tl_ main.o tl_trans. o tl_buchi.o \ tl_mem. o tl_rewrt. o tl_ cache. o $(SPIN_OS) $(TL_OS) $(CC) $(CFLAGS) -o spin $(SPIN_OS) $(TL_OS) spin.y $(YACC) $(YFLAGS) spin. y $(CC) - c y.tab.c rm -f y.tab.c mv y.tab.o spin.o

spin:

spin.o:

$(SPIN_OS): spin.h YACC=yacc YFLAGS= -v -d pangen5.o: $(TL_OS): tl. h main.o pangen2.o p s_msc .o: version .h pangen1.o: pangen1.h pangen3.h pangen2.o:Merino Gmez pangen2.h pangen4.h pangen5.h Pedro ANSI C 139
Laboratorio de Software de Comunicaciones Curso 2001/2002

pan_ast .c

SPIN_OS= spin .o spinlex .o sym .o vars.o main.o ps_msc.o \ mesg.o flow.o sched.o run.o pangen1.o pangen2.o \ pangen3.o pangen4.o pangen5.o guided.o dstep.o \ structs .o pc_ zpp.o
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 140

EJERCICIOS
Programacin modular
10.1 Reorganizar el c digo de los ejercicios 5.1, 8.1 y 8.2 para que tengan claramente separadas las definiciones e implementaciones de las funciones, as como el programa principal. 10.2 A adir variable globales para contar el nmero de accesos que se realiza a la cola (pila) del ejercicio anterior. La actualizacin de esas variables la realizan las funciones de insercin, borrado, etc., pero su consulta se hace desde main(). 10.3 Construir un fichero makefile que genere los ejecutables del ejercicio anterior, segn opciones del usuario (make pila make cola)

C, Unix y bibliotecas de funciones


Temas a tratar ...
Creacin y uso de bibliotecas de funciones Biblioteca estndar de C y llamadas al sistema Funciones de E/S

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 141

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 142

C, Unix y bibliotecas de funciones


Creacin y uso de bibliotecas de funciones
fuente
Preprocesador

C, Unix y bibliotecas de funciones


Creacin y uso de bibliotecas de funciones
Las bibliotecas de funciones tienen el cdigo .o de funciones muy empleadas Lugares y nombres habituales
/usr/lib/libc.a /usr/lib/socket.a

Compilador

Utilidades para su gestin


Ensamblador

ar ar t

almacena y elimina ficheros .o lista el contenido de una libreria aade ficheros da informacin sobre los .o

libreras
Editor de enlace

ar r nm

ejecutable
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 143

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 144

C, Unix y bibliotecas de funciones


Creacin y uso de bibliotecas de funciones
Bsqueda para linkar con ld
gcc o exe f.o ... nn.o -lsocket incluir libsocket.a

C, Unix y bibliotecas de funciones


Biblioteca estndar de C y llamadas al sistema
La biblioteca estndar de C contiene el cdigo de las funciones que debe proporcionar cualquier implementacin del lenguaje Las llamadas al sistema permiten acceder a algunos servicios del sistema operativo. No son estndar de C Un programa C puede usar funciones estndar, llamadas al sistema y otras bibliotecas disponibles
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

La variable LD_LIBRARY_PATH indica los directorios de bsqueda

Hay librerias que se incluyen por defecto: libc.a


Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 145

ANSI C 146

C, Unix y bibliotecas de funciones


Biblioteca estndar de C
<stdio.h> entrada/salida
fopen(), fflush(), fprintf (), fscanf (), fgetc(), putchar()

C, Unix y bibliotecas de funciones


Biblioteca estndar de C
<stdlib.h> utilidades varias
atof (), atoi (), malloc (), free(), abort() , system()

<errno.h>

manejo de errores

<assert.h>
assert()

diagnstico

clearerr(), feof (), ferror(), perror()

<string.h> manejo de cadenas de caracteres


strcpy (), strcat (), strcmp(), strstr(), strlen()

<stdarg.h> manejo de una lista de argumentos


v a_list, va_start(), var_arg(), v a_end()

<math.h>

funciones matemticas
ANSI C 147

<time.h>

fecha y hora

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

sin(), cos (), log(), sqrt(), exp(),

clock(), time(), difftime(),


Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 148

<

C, Unix y bibliotecas de funciones


Biblioteca estndar de C
<limits.h>
constantes que indican lmites de los tipos enteros
INT_MAX, LONG_MAX, UCHAR_MAX

C, Unix y bibliotecas de funciones


Entrada/salida estndar <stdio .h> Caracteres
int putchar (int); int getchar (void); /* EOF */

<float.h>

constantes que indican lmites de los tipos reales

Cadenas
int puts (char* s); char *gets (char*);

FLT_DIG, DBL_DIG, DNL_MAX

E/S con formato


int printf (char* s, ...); int scanf (char* s,...);
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002 Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 149

ANSI C 150

C, Unix y bibliotecas de funciones


Entrada/salida estndar <stdio .h>
Algunos descriptores de formato d: decimal o: octal x: hexadecimal u: decimal sin signo c: carcter s: cadena p: puntero e,f,g: nmero en punto flotante
Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

C, Unix y bibliotecas de funciones


Entrada/salida estndar <stdio .h> Manejo de ficheros con FILE * El tipo FILE* representa un flujo de caracteres Los flujos de entrada/salida estndar ya estn abiertos
stdin stdout stderr

ANSI C 151

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 152

C, Unix y bibliotecas de funciones


Entrada/salida estndar <stdio .h> Operaciones sobre ficheros
FILE* fopen ( const char* filename, const char* mode); El modo: r, w, a, r+, w+, a+, rb, wb, ab, ... int fclose (FILE*); int fflush (FILE*); Int fprintf(FILE* filename, const char* ) Int fscanf(FILE* filename, const char* )

EJERCICIOS
Funciones de librera
11.1 Escribir una versin propia de la funci n printf () ( fprintf ()) que slo admita como formatos legales %d, %c, %s y %p. Emplear la funcin printf estndar para implementarla. Emplear las macros y funciones de <stdarg.h> .

11.2 Repetir el ejercicio para la funcin scanf().

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 153

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 154

EJERCICIOS Preprocesador, make, ar ...


1. Reescribir algn ejericio del bloque anterior empleando un par de ficheros por cada funcin (.h y .c) y realizando compilacin separada. 2. Emplear un fichero makefile para construcir el ejemplo anterior. 3. Agrupar los ficheros .o de las funciones de los ejercicios 1 y 2 en un fichero .a (con ar) y emplear opciones de compilacin de gcc para linkar el ejecutable final. 4. Repetir el ejercicio 3 empleando la variable de LD_LIBRARY_PATH en lugar de opciones del compilador. entorno

Pedro Merino Gmez Laboratorio de Software de Comunicaciones Curso 2001/2002

ANSI C 155

Das könnte Ihnen auch gefallen