CursoC II a2

download CursoC II a2

of 25

Transcript of CursoC II a2

  • 7/25/2019 CursoC II a2

    1/25

    1

    Programacin en C 1

    Programacin en C

    DATSI, FI, UPM

    Jos M. Pea

    [email protected]

    (Segunda Parte)

    Programacin en C 2

    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 dembito de las variables.

    Punteros y memoriadinmica.

    Operadores de bit. Preprocesador C y

    compilacin.

    Libreras estndar.

    Ejemplos II.

  • 7/25/2019 CursoC II a2

    2/25

    2

    Programacin en C 3

    Programacin en C

    Modificadores de mbito

    Programacin en C 4

    Modificadores de Variables

    La declaracin de variables acepta los siguientesmodificadores: 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.

  • 7/25/2019 CursoC II a2

    3/25

    3

    Programacin en C 5

    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 6

    Modificadores de Variables (static)

    void cuenta()

    {

    static int cnt=0;

    printf(%d\n,cnt++)

    }

    int main()

    {

    cuenta();cuenta();cuenta();cuenta();

    return 0;

    }

    Salida:

    01

    23

  • 7/25/2019 CursoC II a2

    4/25

    4

    Programacin en C 7

    Modificadores de Variables (const)

    const int max=10;

    int letra(const char* text, char l)

    {

    int i,acc=0;

    for(i=0;i

  • 7/25/2019 CursoC II a2

    5/25

    5

    Programacin en C 9

    Modificadores de Funciones

    Fichero1.c:

    static void func()

    {

    ...

    }

    void aux()

    {

    func();

    }

    Fichero2.c:

    extern void aux();

    int main()

    {

    aux();

    func(); /* NO

    VISIBLE */

    }

    Programacin en C 10

    Modificadores de Funciones

    Fichero1.c

    compilacincompilacin

    Fichero1.o

    aux Impl G

    func Impl L

    aux Impl G

    func Impl L

    enlaceenlace

    Fichero2.c

    compilacincompilacin

    Fichero2.o

    aux Undef

    func Undef

    main Impl G

    aux Undef

    func Undef

    main Impl G

    EJECUTABLE

  • 7/25/2019 CursoC II a2

    6/25

    6

    Programacin en C 11

    Modificadores de Funciones

    inline int max(int a, int b)

    {

    if(a>b)

    return a;

    else

    return b;

    }

    ....

    x=max(x+1,y);

    {if(x+1>y)

    x=x+1;else

    x=y;}

    Programacin en C 12

    Programacin en C

    Punteros y Memoria Dinmica

  • 7/25/2019 CursoC II a2

    7/25

    7

    Programacin en C 13

    Aritmtica de Punteros

    Las variables de tipo puntero soportan ciertasoperaciones aritmticas.char v[]=Coleccin;

    char *p=v;

    C o l e c c i n \0v

    v[7]

    *(p+2)

    for(p=v;*p;p++){printf(%c,*p)

    }

    Programacin en C 14

    Aritmtica de Punteros

    Las operaciones soportadas sobre punteros son: Suma y resta de valores enteros (+,-,++ y --).

    Comparacin y relacin (,=,== y !=). Valor booleano (comparacin conNULL).

    void copiar(char* dest, const char* orig)

    {

    if(orig && dest)

    while(*orig)

    *dest++=*orig++;

    }

  • 7/25/2019 CursoC II a2

    8/25

    8

    Programacin en C 15

    Aritmtica de Punteros

    Las operaciones de suma o resta sobre punterosmodifican 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_int

    3F0

    p_int + 1++sizeof(int)=4

    3F1 3F2 3F3 3F4 3F5 3F6 3F7 3F8 3F9 3FA 3FB

    p_char ++

    p_char + 1

    Programacin en C 16

    Punteros a Funciones

    Mecanismo para pasar funciones como argumento:char (*f)(int,int);

    f es un puntero a una funcin que devuelve unchar yrecibe dos enteros como argumento.

    A un puntero a funcin se le puede asignar como valorcualquier identificador de funcin que tenga los mismosargumentos y resultado.

  • 7/25/2019 CursoC II a2

    9/25

    9

    Programacin en C 17

    Punteros a Funciones

    char* menor (char** text,

    int tam,

    int (*compara)(char*,char*))

    {

    int i;

    char* min=text[0];

    for(i=1;i

  • 7/25/2019 CursoC II a2

    10/25

    10

    Programacin en C 19

    Memoria Dinmica

    Adems de la reserva de espacio esttica (cuando sedeclara una variable), es posible reservar memoria deforma 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 elespacio de memoria dinmica.

    Programacin en C 20

    Memoria Dinmica

    int a,b[2];

    int* i;

    char* c;

    i=(int*)malloc(sizeof(int));

    c=(char*)malloc(sizeof(char));

    free(i);

    c=(char*)realloc(c,sizeof(char)*9);

    ab[0]

    ic

    b[1]

    ab[0]

    ic

    b[1]

    a

    b[0]

    ic

    b[1]

    *c*i

    *c

    Esttica Dinmica

  • 7/25/2019 CursoC II a2

    11/25

    11

    Programacin en C 21

    Programacin en C

    Operadores deBit

    Programacin en C 22

    Operadores de Bit

    Adems de los operadores aritmticos y booleanosexisten operadores numricos a nivel debit:

    AND: & OR: |

    XOR:

    NOT: ~

    Desplazamientos: >

  • 7/25/2019 CursoC II a2

    12/25

    12

    Programacin en C 23

    Operadores de Bit

    char a=48;

    char b=19;

    char x,y,z,w,t,s;

    x=a & b;

    y=a | b;

    z=a ^ b;w=~a;

    t=a>>2;

    s=b

  • 7/25/2019 CursoC II a2

    13/25

    13

    Programacin en C 25

    Programacin en C

    Preprocesador y Compilacin

    Programacin en C 26

    Fase de Compilacin

    .c.c

    Fichero Fuente

    Preprocesamiento .c.c Paso a Ensamblador .s.s

    .o.o

    EnsamblarCompilacin

    .o.o.o.o.o.o.o.oEXEEXE

    Enlazado

    .a.aLibreras

    Fichero Ejecutable

  • 7/25/2019 CursoC II a2

    14/25

    14

    Programacin en C 27

    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

    Programacin en C 28

    Constantes y Macros

    Permite asociar valores constantes a ciertosidentificadores expandidos en fase depreprocesamiento:#definevar i ab l ev al or

    Define funciones que son expandidas en fase depreprocesamiento:#definemac r o(a r gs, . . .) f unc i n

  • 7/25/2019 CursoC II a2

    15/25

    15

    Programacin en C 29

    Constantes y Macros

    #define PI 3.14

    #defineNUM_ELEM 5

    #defineAREA(rad) PI*rad*rad

    #defineMAX(a,b) (a>b ? a : b)

    int main()

    {

    int i;float vec[NUM_ELEM];

    for(i=0;i

  • 7/25/2019 CursoC II a2

    16/25

    16

    Programacin en C 31

    Macros vs Funciones

    int func_max(int a, int b)

    { return (a>b ? a : b); }

    #definemacro_max(a,b) (a>b ? a : b)

    int a=2,b=3,max;

    max=func_max(a++,b--);

    max

    3

    a

    3

    b

    2

    Usando funciones

    max=macro_max(a++,b--);

    max

    2

    a

    3

    b

    1

    Usando macros

    Programacin en C 32

    Inclusin de Ficheros

    Los prototipos de las funciones usadas por variosficheros fuente se suelen definir en fichero de cabecera.#include Cabeceras del sistema.

    #include mis_func.h Ficheros de cabecera locales.

    #include aux.hint main(){ ...}

    #include aux.hint main(){ ...}

    fich.c

    int func1(int a);viod func2();

    int func1(int a);viod func2();

    aux.h

    int func1(int a);viod func2();

    int main(){ ...}

    int func1(int a);viod func2();

    int main(){ ...}Preprocesamiento

  • 7/25/2019 CursoC II a2

    17/25

    17

    Programacin en C 33

    Inclusin de Ficheros

    La inclusin de ficheros esta sujeta a las siguientesrecomendaciones:

    Por lo general los ficheros de cabecera tienen comoextensin .h

    En los ficheros de cabecerano se incluyenimplementacin de funciones

    Las variables en un fichero de cabecera sondeclaradasextern y se encuentran declaradas en algn otrofichero.c

    Programacin en C 34

    Sentencias Condicionales

    Para incluir cdigo cuya compilacin es dependiente deciertas opciones, se usan los bloques:#ifdefv ar i ab l e

    . . .

    #endif

    #ifndefvar i ab l e

    . . .

    #endif

  • 7/25/2019 CursoC II a2

    18/25

    18

    Programacin en C 35

    Ejemplo: Depuracin

    #define DEBUG

    int main()

    {

    int i,acc;

    for(i=0;i

  • 7/25/2019 CursoC II a2

    19/25

    19

    Programacin en C 37

    Enlace de Ficheros

    .c.cextern int v;int main() {.h().}extern void k();static h() {.k().}

    .c.cint k() {.l().}int l() {...}int v;

    .o.o3A00: f3A08: main3B12: hv

    k

    .o.o1600: k17FF: l1812: v

    EXE

    EXE

    gcc -cgcc -c

    gcc -o

    Compilacin

    Enlace

    Programacin en C 38

    Programacin en C

    Libreras Estndar

  • 7/25/2019 CursoC II a2

    20/25

    20

    Programacin en C 39

    Manejo de Cadenas

    char* strcat(char*,char*): Concatena cadenas.

    char* strchr(char*,char): Busca un carcter.

    int strcmp(char*,char*): Comparacin 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.

    ...

    Programacin en C 40

    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): Copiamemoria hasta que encuentra un byte.

    ...

  • 7/25/2019 CursoC II a2

    21/25

    21

    Programacin en C 41

    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 carcter desde fichero.

    char* fgets(char*,int,FILE*): Lee una lnea.

    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.

    Programacin en C 42

    Ficheros Especiales

    Existen tres variables de tipo FILE* asociados a tresficheros estndar:

    stdin: Entrada estndar. stdout: Salida estndar.

    stdout: Salida de error estndar.

    fprintf(stdout,Usuario: );

    fscanf(stdin,%s,usr);

    fprintf(stderr,Error:No vlido);

  • 7/25/2019 CursoC II a2

    22/25

    22

    Programacin en C 43

    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 44

    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 arraya real.

    char* itoa(char*,int): Traduce un entero a array.

    Como alternativa se pueden usar las funciones:

    sscanf y sprintf.

  • 7/25/2019 CursoC II a2

    23/25

    23

    Programacin en C 45

    Funciones Matemticas

    double exp(double): Calcula ex.

    double log(double): Calcula el logaritmo natural.

    double log10(doubel): Calcula el logaritmo en base 10.

    double pow(double,double): Calcula xy.

    double sqrt(double): Calcula la raz cuadrada.

    double sin(double): Calcula el seno (en radianes).

    double cos(double): Calcula el coseno (en radianes).

    double sinh(double): Calcula el seno hiperblico.

    double atan(double): Calcula el arco tangente.

    ...

    Programacin en C 46

    Uso de Funciones de Librera

    El uso de las funciones de librera estndar esta sujetoa las siguientes recomendaciones:

    Estudiar la pgina del manual (man 3 sprintf

    ).

    Incluir en el fichero fuente el fichero de cabeceraadecuado (#include ).

    Enlazar la librera si es necesario (gcc .... -lm).

  • 7/25/2019 CursoC II a2

    24/25

    24

    Programacin en C 47

    Programacin en C

    Argumentos del Programa

    Programacin en C 48

    Argumentos demain

    La funcin principalmain puede recibir argumentosque permiten acceder a los parmetros con los que esllamado el ejecutable.

    int main(int argc, char* argv[])

    int argc : Nmero de parmetros.

    char* argv[] : Parmetros del ejecutable.

  • 7/25/2019 CursoC II a2

    25/25

    Programacin en C 49

    Argumentos demain

    $ 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 \0d o s \0

    t r e s \0

    c u a t \0r o

    Programacin en C 50

    Argumentos demain

    int main(int argc, char* argv[])

    {

    int i=0;

    printf(Ejecutable: %s\n,argv[0]);

    for(i=0;i