• No se han encontrado resultados

C++ Basico aprendizaje

N/A
N/A
Protected

Academic year: 2021

Share "C++ Basico aprendizaje"

Copied!
92
0
0

Texto completo

(1)

Índice General

Índice General

• 1. Compilación de un programa en 1. Compilación de un programa en C/C++C/C++ ……….

……….

pagina 4

pagina 4

o

o 1.1 Creación, compilación y ejecución de un 1.1 Creación, compilación y ejecución de un programaprograma 

 1.1.1 Creación del programa1.1.1 Creación del programa 

 1.1.2 Compilación1.1.2 Compilación 

 1.1.3 Ejecución del programa1.1.3 Ejecución del programa o

o 1.2 El modelo de compilación de C1.2 El modelo de compilación de C o o 1.3 El preprocesador 1.3 El preprocesador  o o 1.4 Compilador de C1.4 Compilador de C o o 1.5 Ensamblador 1.5 Ensamblador  o o 1.6 Ligador 1.6 Ligador  o

o 1.7 Algunas opciones útiles del compilador 1.7 Algunas opciones útiles del compilador  o

o 1.8 Uso de las bibliotecas1.8 Uso de las bibliotecas o

o 1.9 Ejemplos1.9 Ejemplos 

 1.9.1 Creación de una biblioteca estática1.9.1 Creación de una biblioteca estática 

 1.9.2 Creación de una biblioteca compartida1.9.2 Creación de una biblioteca compartida o

o 1.10 Funciones de la biblioteca de UNIX1.10 Funciones de la biblioteca de UNIX 

 1.10.1 Encontrando información acerca de las1.10.1 Encontrando información acerca de las bibliotecas. bibliotecas. o o 1.11 Ejercicios1.11 Ejercicios • • 2. Principios de2. Principios de C C……….……….

pagina 11

pagina 11

o

o 2.1 Orígenes del C2.1 Orígenes del C o

o 2.2 Características de C2.2 Características de C o

o 2.3 Estructura de un programa en C2.3 Estructura de un programa en C o

o 2.4 Variables2.4 Variables 

 2.4.1 Definición de variables globales2.4.1 Definición de variables globales 

 2.4.2 Lectura y escritura de variables2.4.2 Lectura y escritura de variables o

o 2.5 Constantes2.5 Constantes o

o 2.6 Operadores Aritméticos2.6 Operadores Aritméticos o

o 2.7 Operadores de Comparación2.7 Operadores de Comparación o

o 2.8 Operadores lógicos2.8 Operadores lógicos o

o 2.9 Orden de precedencia2.9 Orden de precedencia o

o 2.10 Ejercicios2.10 Ejercicios

• 3. Estructuras Condicionales3. Estructuras Condicionales……….……….

pagina 17

pagina 17

o

o 3.1 La sentencia if 3.1 La sentencia if  o

o 3.2 El operador ?3.2 El operador ? o

o 3.3 La sentencia switch3.3 La sentencia switch o o 3.4 Ejercicios3.4 Ejercicios • • 4. Iteración4. Iteración………

pagina 20

pagina 20

o

o 4.1 La sentencia for 4.1 La sentencia for  o

o 4.2 La sentencia while4.2 La sentencia while o

o 4.3 La sentencia do-while4.3 La sentencia do-while o

o 4.4 Uso de break y continue4.4 Uso de break y continue o

o 4.5 Ejercicios4.5 Ejercicios

• 5. Arreglos y cadenas5. Arreglos y cadenas……….……….

pagina 25

pagina 25

o

o 5.1 Arreglos unidimensionales y multidimensionales5.1 Arreglos unidimensionales y multidimensionales o o 5.2 Cadenas5.2 Cadenas o o 5.3 Ejercicios5.3 Ejercicios • • 6. Funciones6. Funciones……….……….

pagina 28

pagina 28

o

o 6.1 Funciones void6.1 Funciones void o

o 6.2 Funciones y arreglos6.2 Funciones y arreglos o

o 6.3 Prototipos de funciones6.3 Prototipos de funciones o

o 6.4 Ejercicios6.4 Ejercicios o

o

• 7. Más tipos de datos7. Más tipos de datos……….……….

pagina 30

pagina 30

o

o 7.1 Estructuras7.1 Estructuras 

(2)

o

o 7.2 Uniones7.2 Uniones o

o 7.3 Conversión de tipos (casts)7.3 Conversión de tipos (casts) o

o 7.4 Enumeraciones7.4 Enumeraciones o

o 7.5 Variables estáticas7.5 Variables estáticas o o 7.6 Ejercicios7.6 Ejercicios • • 8. Apuntadores8. Apuntadores………..….………..….

pagina 35

pagina 35

o

o 8.1 Definición de un apuntador 8.1 Definición de un apuntador  o

o 8.2 Apuntadores y Funciones8.2 Apuntadores y Funciones o

o 8.3 Apuntadores y arreglos8.3 Apuntadores y arreglos o

o 8.4 Arreglos de apuntadores8.4 Arreglos de apuntadores o

o 8.5 Arreglos multidimensionales y apuntadores8.5 Arreglos multidimensionales y apuntadores o

o 8.6 Inicialización estática de arreglos de apuntadores8.6 Inicialización estática de arreglos de apuntadores o

o 8.7 Apuntadores y estructuras8.7 Apuntadores y estructuras o

o 8.8 Fallas comunes con apuntadores8.8 Fallas comunes con apuntadores o

o 8.9 Ejercicios8.9 Ejercicios

• 9. Asignación dinámica de memoria y Estructuras dinámicas9. Asignación dinámica de memoria y Estructuras dinámicas ….

….

pagina 42

pagina 42

o

o 9.1 Uso de malloc, sizeof y free9.1 Uso de malloc, sizeof y free o

o 9.2 calloc y realloc9.2 calloc y realloc o

o 9.3 Listas ligadas9.3 Listas ligadas o

o 9.4 Programa de revisión9.4 Programa de revisión o

o 9.5 Ejercicios9.5 Ejercicios

• 10. Tópicos avanzados con apuntadores10. Tópicos avanzados con apuntadores……… ……… ……

pagina 46

pagina 46

o

o 10.1 Apuntadores a apuntadores10.1 Apuntadores a apuntadores o

o 10.2 Entrada en la línea de comandos10.2 Entrada en la línea de comandos o

o 10.3 Apuntadores a funciones10.3 Apuntadores a funciones o

o 10.4 Ejercicios10.4 Ejercicios

• 11. Operadores de bajo nivel y campos de bit11. Operadores de bajo nivel y campos de bit………

pagina 50

pagina 50

o

o 11.1 Operadores sobre bits11.1 Operadores sobre bits o

o 11.2 Campos de bit11.2 Campos de bit   11.2.1 Portabilidad11.2.1 Portabilidad o o 11.3 Ejercicios11.3 Ejercicios • • 12. El preprocesador de C12. El preprocesador de C………..………….………..………….

pagina 53

pagina 53

o

o 12.1 Directivas del preprocesador 12.1 Directivas del preprocesador    12.1.1 #define12.1.1 #define   12.1.2 #undef 12.1.2 #undef    12.1.3 #include12.1.3 #include 

 12.1.4 #if Inclusión condicional12.1.4 #if Inclusión condicional o

o 12.2 Control del preprocesador del compilador 12.2 Control del preprocesador del compilador  o

o 12.3 Otras directivas del preprocesador 12.3 Otras directivas del preprocesador  o

o 12.4 Ejercicios12.4 Ejercicios

• 13. C, UNIX y las bibliotecas estándar 13. C, UNIX y las bibliotecas estándar ……….……….

pagina 57

pagina 57

o

o 13.1 Ventajas del usar UNIX con C13.1 Ventajas del usar UNIX con C o

o 13.2 Uso de funciones de bibliotecas y llamadas del13.2 Uso de funciones de bibliotecas y llamadas del sistema

sistema

• 14. Biblioteca <stdlib.h>14. Biblioteca <stdlib.h>……….……….

pagina 58

pagina 58

o

o 14.1 Funciones aritméticas14.1 Funciones aritméticas o

o 14.2 Números aleatorios14.2 Números aleatorios o

o 14.3 Conversión de cadenas14.3 Conversión de cadenas o

o 14.4 Búsqueda y ordenamiento14.4 Búsqueda y ordenamiento o

(3)

• 15. Biblioteca <math.h>15. Biblioteca <math.h>……….……….

pagina 62

pagina 62

o

o 15.1 Funciones matemáticas15.1 Funciones matemáticas o

o 15.2 Constantes matemáticas15.2 Constantes matemáticas

• 16. Entrada y salida (E/S) stdio.h16. Entrada y salida (E/S) stdio.h……….………. ((

No viene)

No viene)

o

o 16.1 Reportando errores16.1 Reportando errores   16.1.1 perror()16.1.1 perror()   16.1.2 errno16.1.2 errno   16.1.3 exit16.1.3 exit o o 16.2 Flujos16.2 Flujos 

 16.2.1 Flujos predefinidos16.2.1 Flujos predefinidos o

o 16.3 E/S Basica16.3 E/S Basica o

o 16.4 E/S formateada16.4 E/S formateada   16.4.1 printf 16.4.1 printf    16.4.2 scanf 16.4.2 scanf  o o 16.5 Archivos16.5 Archivos 

 16.5.1 Lectura y escritura de archivos16.5.1 Lectura y escritura de archivos o

o 16.6 sprintf y sscanf 16.6 sprintf y sscanf  

 16.6.1 Petición del estado del flujo16.6.1 Petición del estado del flujo o

o 16.7 E/S de bajo nivel 16.7 E/S de bajo nivel o sin almacenamiento intermedioo sin almacenamiento intermedio o

o 16.8 Ejercicios16.8 Ejercicios

• 17. Manejo de cadenas <string.h>17. Manejo de cadenas <string.h>………..………..

pagina 63

pagina 63

o

o 17.1 Funciones básicas para el manejo de 17.1 Funciones básicas para el manejo de cadenascadenas 

 17.1.1 Búsqueda en cadenas17.1.1 Búsqueda en cadenas o

o 17.2 Prueba y conversión de caracteres <ctype.h>17.2 Prueba y conversión de caracteres <ctype.h> o

o 17.3 Operaciones con la memoria <memory.h>17.3 Operaciones con la memoria <memory.h> o

o 17.4 Ejercicios17.4 Ejercicios

• 18. Acceso de Archivos y llamadas al sistema de directorios18. Acceso de Archivos y llamadas al sistema de directorios ….

….

pagina 67

pagina 67

o

o 18.1 Funciones para el manejo de directorios 18.1 Funciones para el manejo de directorios <unistd.h><unistd.h> 

 18.1.1 Busqueda y ordenamiento de18.1.1 Busqueda y ordenamiento de directorios: sys/types.h,sys/dir.h

directorios: sys/types.h,sys/dir.h o

o 18.2 Rutinas de manipulación de archivos: unistd.h,18.2 Rutinas de manipulación de archivos: unistd.h, sys/types.h, sys/stat.h

sys/types.h, sys/stat.h 

 18.2.1 Permisos de accesos a archivos18.2.1 Permisos de accesos a archivos 

 18.2.2 Estado de un archivo18.2.2 Estado de un archivo 

 18.2.3 Manipulación de archivos: stdio.h,18.2.3 Manipulación de archivos: stdio.h, unistd.h

unistd.h 

 18.2.4 Creación de archivos temporales:18.2.4 Creación de archivos temporales: <stdio.h>

<stdio.h> o

o 18.3 Ejercicios18.3 Ejercicios

• 19. Funciones para el tiempo19. Funciones para el tiempo……….……….

pagina 71

pagina 71

o

o 19.1 Funciones básicas para el tiempo19.1 Funciones básicas para el tiempo o

o 19.2 Ejemplos de aplicaciones de funciones del tiempo.19.2 Ejemplos de aplicaciones de funciones del tiempo. 

 19.2.1 Ejemplo 1: Tiempo (en segundos) para19.2.1 Ejemplo 1: Tiempo (en segundos) para hacer algún cálculo.

hacer algún cálculo. 

 19.2.2 Ejemplo 2: Inicializar la semilla de un19.2.2 Ejemplo 2: Inicializar la semilla de un número aleatorio.

número aleatorio. o

o 19.3 Ejercicios19.3 Ejercicios

• 20. Control de procesos: <stdlib.h>, <unistd.h>……….20. Control de procesos: <stdlib.h>, <unistd.h>……….

pagina 75

pagina 75

o

o 20.1 Ejecutando comandos de UNIX desde C20.1 Ejecutando comandos de UNIX desde C o o 20.2 execl()20.2 execl() o o 20.3 fork()20.3 fork() o o 20.4 wait()20.4 wait() o o 20.5 exit()20.5 exit() o o 20.6 Ejercicios20.6 Ejercicios

(4)

• 21. Compilación de Programas con Archivos 21. Compilación de Programas con Archivos MúltiplesMúltiples……..…….. ….

….

pagina 79

pagina 79

o

o 21.1 Archivos Cabezera21.1 Archivos Cabezera o

o 21.2 Variables y Funciones Externas21.2 Variables y Funciones Externas 

 21.2.1 Alcance de las variables externas21.2.1 Alcance de las variables externas o

o 21.3 Ventajas de Usar Varios Archivos21.3 Ventajas de Usar Varios Archivos o

o 21.4 Como dividir un programa en varios 21.4 Como dividir un programa en varios archivosarchivos o

o 21.5 Organización de los Datos en cada 21.5 Organización de los Datos en cada ArchivoArchivo o

o 21.6 La utilería Make21.6 La utilería Make 

 21.6.1 Programando Make21.6.1 Programando Make o

o 21.7 Creación de un Archivo Make (Makefile)21.7 Creación de un Archivo Make (Makefile) o

o 21.8 Uso de macros con Make21.8 Uso de macros con Make o

o 21.9 Ejecución de Make21.9 Ejecución de Make

• 22. Comunicación entre procesos (IPC Interprocess22. Comunicación entre procesos (IPC Interprocess Communication),

Communication), PIPES

PIPES………..………..…

pagina86

pagina86

o

o 22.1 Entubando en un programa de C <stdio.h>22.1 Entubando en un programa de C <stdio.h> 

 22.1.1 popen() Tubería formateada22.1.1 popen() Tubería formateada 

 22.1.2 pipe() Tubería de bajo nivel22.1.2 pipe() Tubería de bajo nivel

• 23. Sockets23. Sockets

……….

……….

pagina89

pagina89

o

o 23.1 Creación y nombrado de sockets23.1 Creación y nombrado de sockets o

o 23.2 Conectando sockets de flujo23.2 Conectando sockets de flujo 

 23.2.1 Transferencia de datos en un flujo y23.2.1 Transferencia de datos en un flujo y cerrado

cerrado

Subsecciones Subsecciones

• 1.1 Creación, compilación y ejecución de 1.1 Creación, compilación y ejecución de un programaun programa o

o 1.1.1 Creación del programa1.1.1 Creación del programa o

o 1.1.2 Compilación1.1.2 Compilación o

o 1.1.3 Ejecución del programa1.1.3 Ejecución del programa

• 1.2 El modelo de compilación de C1.2 El modelo de compilación de C • • 1.3 El preprocesador 1.3 El preprocesador  • • 1.4 Compilador de C1.4 Compilador de C • • 1.5 Ensamblador 1.5 Ensamblador  • • 1.6 Ligador 1.6 Ligador  •

• 1.7 Algunas opciones útiles del compilador 1.7 Algunas opciones útiles del compilador  •

• 1.8 Uso de las bibliotecas1.8 Uso de las bibliotecas •

• 1.9 Ejemplos1.9 Ejemplos o

o 1.9.1 Creación de una biblioteca estática1.9.1 Creación de una biblioteca estática o

o 1.9.2 Creación de una biblioteca compartida1.9.2 Creación de una biblioteca compartida

• 1.10 Funciones de la biblioteca de UNIX1.10 Funciones de la biblioteca de UNIX o

o 1.10.1 Encontrando información acerca de las1.10.1 Encontrando información acerca de las bibliotecas.

bibliotecas.

(5)

1. Compilación de un programa en C/C++

1. Compilación de un programa en C/C++

En esta capítulo se dan las procesos básicos que se requieren para En esta capítulo se dan las procesos básicos que se requieren para compilar un programa de C. Se describe también el modelo de compilar un programa de C. Se describe también el modelo de compilación de C y también como

compilación de C y también como C soporta bibliotecas adicionales.C soporta bibliotecas adicionales.

1.1 Creación, compilación y ejecución de un programa

1.1 Creación, compilación y ejecución de un programa

1.1.1 Creación del programa

1.1.1 Creación del programa

Se puede crear un archivo que contenga el programa completo, como Se puede crear un archivo que contenga el programa completo, como en los ejemplos que se tienen

en los ejemplos que se tienen más adelante. Se puede usar más adelante. Se puede usar cualquier cualquier  editor de textos ordinario con el que se este familiarizado. Un editor  editor de textos ordinario con el que se este familiarizado. Un editor  disponible en la mayoría de los sistemas UNIX es

disponible en la mayoría de los sistemas UNIX esvivi, y en Linux se, y en Linux se puede usar 

puede usar  pico  pico ..

Por convención el nombre del archivo debe terminar con `` Por convención el nombre del archivo debe terminar con ``.c .c '''' por  por  ejemplo: miprograma.c progprueba.c 

ejemplo: miprograma.c progprueba.c . El contenido del archivo deberá. El contenido del archivo deberá obedecer la sintaxis de C.

obedecer la sintaxis de C.

1.1.2 Compilación

1.1.2 Compilación

Existen muchos compiladores de C. El

Existen muchos compiladores de C. Elcc cc es el compilador estándar dees el compilador estándar de Sun. El compilador GNU de C es

Sun. El compilador GNU de C esgcc gcc , el cual es bastante popular y, el cual es bastante popular y esta disponible en varias plataformas.

esta disponible en varias plataformas.

Existen también compiladores equivalentes de C++

Existen también compiladores equivalentes de C++ los cualeslos cuales usualmente son nombrados como

usualmente son nombrados comoCC CC . Por ejemplo, Sun provee CC y. Por ejemplo, Sun provee CC y GNU

GNUGCC GCC . El compilador de GNU es también denotado como. El compilador de GNU es también denotado comog++ g++ .. Existen otros compiladores menos comunes de C y C++. En general Existen otros compiladores menos comunes de C y C++. En general todos los compiladores mencionados operan esencialmente de todos los compiladores mencionados operan esencialmente de lala misma forma y comparten muchas opciones comunes en la línea de misma forma y comparten muchas opciones comunes en la línea de opciones. Más adelante se listan

opciones. Más adelante se listan y se dan ejemplos de opcionesy se dan ejemplos de opciones comunes de los compiladores. Sin embargo, la mejor referencia de comunes de los compiladores. Sin embargo, la mejor referencia de cada compilador es a través de las páginas en línea, del manual del cada compilador es a través de las páginas en línea, del manual del sistema. Por ejemplo:

sistema. Por ejemplo: man gcc  man gcc ..

Para compilar el programa usaremos el comando

Para compilar el programa usaremos el comandogcc gcc . El comando. El comando deberá ser seguido por el nombre del programa en C que se quiere deberá ser seguido por el nombre del programa en C que se quiere compilar. Un determinado número de opciones

compilar. Un determinado número de opciones del compilador puedendel compilador pueden ser indicadas también. Por el momento no haremos uso de estas ser indicadas también. Por el momento no haremos uso de estas opciones todavía, se irán comentando algunas más esenciales. opciones todavía, se irán comentando algunas más esenciales. Por lo tanto, el comando básico de compilación es:

Por lo tanto, el comando básico de compilación es: gcc programa.c

gcc programa.c

donde

donde  programa.c programa.ces el nombre del archivo.es el nombre del archivo.

Si hay errores obvios en el programa (tales como palabras mal escritas, Si hay errores obvios en el programa (tales como palabras mal escritas, caracteres no tecleados u omisiones de punto y coma), el compilador se caracteres no tecleados u omisiones de punto y coma), el compilador se detendrá y los reportará.

detendrá y los reportará.

Podría haber desde luego errores

Podría haber desde luego errores lógicos que el compilador no podrálógicos que el compilador no podrá detectar. En el caso que esta fuera la situación se le estará indicando a detectar. En el caso que esta fuera la situación se le estará indicando a la computadora que haga las operaciones incorrectas.

la computadora que haga las operaciones incorrectas.

Cuando el compilador ha terminado con éxito, la versión compilada, o el Cuando el compilador ha terminado con éxito, la versión compilada, o el ejecutable, es dejado en un archivo

ejecutable, es dejado en un archivo llamadollamado a.out a.out , o si la opción, o si la opción -o-oeses usada con el compilador, el nombre después de

usada con el compilador, el nombre después de -o-o es el nombre deles el nombre del programa compilado.

programa compilado.

Se recomienda y es más conveniente usar la opción

Se recomienda y es más conveniente usar la opción -o-ocon el nombrecon el nombre del archivo ejecutable como se muestra a continuación:

del archivo ejecutable como se muestra a continuación: gcc -o programa programa.c

gcc -o programa programa.c

el cual pone el programa compilado en el archivo del programa señalado, en éste caso en el cual pone el programa compilado en el archivo del programa señalado, en éste caso en  programa

 programa, en vez del archivo, en vez del archivo a.out a.out ..

1.1.3 Ejecución del programa

1.1.3 Ejecución del programa

El siguiente estado es correr el programa ejecutable. Para correr un El siguiente estado es correr el programa ejecutable. Para correr un ejecutable en UNIX, simplemente se escribe el nombre del archivo que ejecutable en UNIX, simplemente se escribe el nombre del archivo que lo contiene, en este caso

lo contiene, en este caso programa programa (o(o a.out a.out ).).

Con lo anterior, se ejecuta el programa, mostrando algún resultado en Con lo anterior, se ejecuta el programa, mostrando algún resultado en la pantalla. En éste estado, podría haber errores en tiempo de ejecución la pantalla. En éste estado, podría haber errores en tiempo de ejecución ((run-time errorsrun-time errors), tales como división por cero, o bien, podrían hacerse), tales como división por cero, o bien, podrían hacerse evidentes al ver que el programa no produce la salida correcta. evidentes al ver que el programa no produce la salida correcta.

(6)

Si lo anterior sucede, entonces se debe regresar a editar el archivo del Si lo anterior sucede, entonces se debe regresar a editar el archivo del programa, recompilarlo, y ejecutarlo nuevamente.

programa, recompilarlo, y ejecutarlo nuevamente.

1.2 El modelo de compilación de C

1.2 El modelo de compilación de C

En la figura

En la figura 1.11.1se muestran las distintas étapas que cubre else muestran las distintas étapas que cubre el compilador para obtener el código ejecutable.

compilador para obtener el código ejecutable.

Figura 1.1:

Figura 1.1:Modelo de compilación de C.Modelo de compilación de C.

1.3 El preprocesador 

1.3 El preprocesador 

Esta parte del proceso de compilación será cubierta con más detalle en Esta parte del proceso de compilación será cubierta con más detalle en el capítulo

el capítulo 1212referente al preprocesador. Sin embargo, se da algunareferente al preprocesador. Sin embargo, se da alguna información básica para algunos programas de C.

información básica para algunos programas de C.

El preprocesador acepta el código fuente como entrada y es El preprocesador acepta el código fuente como entrada y es responsable de:

responsable de: •

• quitar los comentariosquitar los comentarios

• interpretar lasinterpretar las directivas del preprocesador directivas del preprocesador las cuales inician conlas cuales inician con #.

#.

Por ejemplo: Por ejemplo: •

• #include#include-- incluye el contenido del archivo nombrado. Estos-- incluye el contenido del archivo nombrado. Estos son usualmente llamados archivos de

son usualmente llamados archivos de cabecera (header)cabecera (header). Por ejemplo:. Por ejemplo: o

o #include <math.h> #include <math.h> -- Archivo de la biblioteca-- Archivo de la biblioteca estándar de matemáticas.

estándar de matemáticas. o

o #include <stdio.h> #include <stdio.h> -- Archivo de la biblioteca-- Archivo de la biblioteca estándar de Entrada/Salida.

estándar de Entrada/Salida. •

• #define#define-- define un nombre simbólico o constante. Sustitución-- define un nombre simbólico o constante. Sustitución de macros.

de macros. o

o #define TAM_MAX_ARREGLO 100#define TAM_MAX_ARREGLO 100

1.4 Compilador de C

1.4 Compilador de C

El compilador de C traduce

El compilador de C traduce el código fuente en código de el código fuente en código de ensamblador.ensamblador. El código fuente es recibido del

El código fuente es recibido del preprocesador.preprocesador.

1.5 Ensamblador 

1.5 Ensamblador 

El ensamblador crea el código fuentei o los archivos objeto. En los El ensamblador crea el código fuentei o los archivos objeto. En los sistemas con UNIX se podrán ver los archivos con el sufijo sistemas con UNIX se podrán ver los archivos con el sufijo.o .o ..

1.6 Ligador 

1.6 Ligador 

Si algún archivo fuente hace referencia a funciones de una biblioteca o Si algún archivo fuente hace referencia a funciones de una biblioteca o de funciones que están definidas en otros archivos fuentes, el de funciones que están definidas en otros archivos fuentes, el ligador ligador  combina estas funciones (con

combina estas funciones (con main() main()) para crear un archivo) para crear un archivo ejecutable. Las referencias a variables externas en esta étapa son ejecutable. Las referencias a variables externas en esta étapa son resueltas.

resueltas.

1.7 Algunas opciones útiles del compilador 

1.7 Algunas opciones útiles del compilador 

Descrito el modelo básico de compilación,

Descrito el modelo básico de compilación, se darán algunas opcionesse darán algunas opciones útiles y algunas veces esenciales. De nueva cuenta, se recomienda útiles y algunas veces esenciales. De nueva cuenta, se recomienda revisar las páginas de

revisar las páginas de man  man para mayor información y opcionespara mayor información y opciones adicionales.

(7)

-E

-E

Se compilador se detiene en la étapa de preprocesamiento y el resultado se Se compilador se detiene en la étapa de preprocesamiento y el resultado se muestra en la salida estándar.

muestra en la salida estándar.

gcc -E arch1.c 

gcc -E arch1.c 

-c

-c

Suprime el proceso de ligado y produce un archivo

Suprime el proceso de ligado y produce un archivo .o .o para cada archivo fuentepara cada archivo fuente listado. Después los archivos objeto pueden ser ligados por el comando

listado. Después los archivos objeto pueden ser ligados por el comando gcc gcc , por , por  ejemplo:

ejemplo:

gcc arch1.o arch2.o ... -o ejecutable

gcc arch1.o arch2.o ... -o ejecutable

-lbiblioteca

-lbiblioteca

Liga con las bibliotecas objeto. Esta opción deberá seguir los argumentos de los Liga con las bibliotecas objeto. Esta opción deberá seguir los argumentos de los arc

archivhivos os fuefuentente. . Las Las bibbiblioliotectecas as objobjeto eto son son guaguardardadas das y y puepueden den estaestar r  estandarizadas, un tercero o usuario las crea. Probablemente la biblioteca más estandarizadas, un tercero o usuario las crea. Probablemente la biblioteca más comúnmente usada es la biblioteca matemática (

comúnmente usada es la biblioteca matemática ( math.h  math.h ). Esta biblioteca deberá). Esta biblioteca deberá ligarse explícitamente si se desea usar las funciones matemáticas (y por supuesto ligarse explícitamente si se desea usar las funciones matemáticas (y por supuesto no olvidar el archivo cabecera

no olvidar el archivo cabecera#include <math.h> #include <math.h> , en el programa que llama a, en el programa que llama a las funciones), por ejemplo:

las funciones), por ejemplo:

gcc calc.c -o calc -lm 

gcc calc.c -o calc -lm 

Muchas otras bibliotecas son ligadas de esta forma. Muchas otras bibliotecas son ligadas de esta forma.

-Ldirectorio

-Ldirectorio

Agrega directorios a la lista de directorios que contienen las rutinas de la biblioteca Agrega directorios a la lista de directorios que contienen las rutinas de la biblioteca de objetos. El ligador siempre busca las bibliotecas estándares y del sistema en de objetos. El ligador siempre busca las bibliotecas estándares y del sistema en

/lib 

/lib yy /usr/lib /usr/lib . Si se quieren ligar bibliotecas personales o instaladas por . Si se quieren ligar bibliotecas personales o instaladas por  usted, se tendrá que especificar donde estan guardados los archivos, por ejemplo: usted, se tendrá que especificar donde estan guardados los archivos, por ejemplo:

gcc prog.c -L/home/minombr/mislibs milib.a

gcc prog.c -L/home/minombr/mislibs milib.a

-Itrayectoria

-Itrayectoria

Agrega una trayectoria o ruta a la lista de directorios en los cuales se buscarán los Agrega una trayectoria o ruta a la lista de directorios en los cuales se buscarán los archi

archivos vos cabececabecerara #include#include con nombrcon nombres es relrelatiativos (es vos (es decdecir, los ir, los que noque no empiezan con diagonal /).

empiezan con diagonal /).

El procesador por default, primero busca los archivos

El procesador por default, primero busca los archivos#include#includeen el directorioen el directorio que contiene el archivo fuente, y después en los directorios nombrados con la que contiene el archivo fuente, y después en los directorios nombrados con la opción

opción

-I

-I

si hubiera, y finalmente, ensi hubiera, y finalmente, en/usr/include/usr/include. Por lo tanto, si se quiere. Por lo tanto, si se quiere incluir archivos de cabecera guardados en

incluir archivos de cabecera guardados en/home/minombr/miscabeceras/home/minombr/miscabecerassese tendrá que hacer:

tendrá que hacer:

gcc prog.c -I/home/minombr/miscabeceras

gcc prog.c -I/home/minombr/miscabeceras

Nota:

Nota:

Las cabeceras de las bibliotecas del sistema son guardados en un lugar Las cabeceras de las bibliotecas del sistema son guardados en un lugar  especi

especial al ((/usr/include/usr/include) y no son afectadas por la opción) y no son afectadas por la opción -I -I . Los archivos. Los archivos cabecera del sistema y del usuario son incluídos en una manera un poco diferente. cabecera del sistema y del usuario son incluídos en una manera un poco diferente.

-g

-g

Opción para llamar las opciones de depuración (debug). Instruye al compilador  Opción para llamar las opciones de depuración (debug). Instruye al compilador  para producir información adicional en la tabla de símbolos que es usado por una para producir información adicional en la tabla de símbolos que es usado por una variedad de utilerías de depuración. Por ejemplo, si se emplea el depurador de variedad de utilerías de depuración. Por ejemplo, si se emplea el depurador de GNU

GNU, , el el proprogragrama ma debdeberá erá comcompilpilarsarse e de de la la sigsiguieuiente nte forforma ma parpara a gengeneraerar r  extensiones de GDB: extensiones de GDB: gcc -ggdb -o prog prog.c  gcc -ggdb -o prog prog.c  -D -D Def

Define ine símsímbolbolos os comcomo o ideidentintificficadoadores res ((-D -D ideidentintificficadoador) r) o o comcomo o valvaloreores s ((-

-D 

D símbolo=valor) en una forma similar a la directiva del preprocesador símbolo=valor) en una forma similar a la directiva del preprocesador #define#define).).

-v

-v

Muestra en la salida estandar de errores los comandos ejecutados en las étapas Muestra en la salida estandar de errores los comandos ejecutados en las étapas de compilación.

de compilación.

1.8 Uso de las bibliotecas

1.8 Uso de las bibliotecas

C es un lenguaje extremadamente pequeño. Muchas de las funciones C es un lenguaje extremadamente pequeño. Muchas de las funciones que tienen otros lenguajes no están en C, por ejemplo, no hay que tienen otros lenguajes no están en C, por ejemplo, no hay funciones para E/S, manejo de cadenas o funciones matemáticas. funciones para E/S, manejo de cadenas o funciones matemáticas. La funcionalidad de C se obtiene a través de un rico conjunto de La funcionalidad de C se obtiene a través de un rico conjunto de bibliotecas de funciones.

bibliotecas de funciones.

Como resultado, muchas implementaciones de C

Como resultado, muchas implementaciones de C incluyen bibliotecasincluyen bibliotecas

estándar 

estándar de funciones para varias finalidades. Para muchos propósitosde funciones para varias finalidades. Para muchos propósitos

básicos estas podrían ser consideradas como parte de C. Pero pueden básicos estas podrían ser consideradas como parte de C. Pero pueden variar de máquina a máquina.

(8)

Un programador puede también desarrollar sus propias

Un programador puede también desarrollar sus propias funciones defunciones de biblioteca e incluso bibliotecas especiales de terceros,

biblioteca e incluso bibliotecas especiales de terceros, por ejemplo,por ejemplo, NAG o PHIGS.

NAG o PHIGS.

Todas las bibliotecas (excepto E/S estándar) requieren ser  Todas las bibliotecas (excepto E/S estándar) requieren ser  explícitamente ligadas con la opción

explícitamente ligadas con la opción-l-ly, posiblemente cony, posiblemente conL L , como se, como se señalo previamente.

señalo previamente.

1.9 Ejemplos

1.9 Ejemplos

1.9.1 Creación de una biblioteca estática

1.9.1 Creación de una biblioteca estática

Si se tiene un conjunto de rutinas que se usen en forma frecuente, se Si se tiene un conjunto de rutinas que se usen en forma frecuente, se podría desear agruparlas en un conjunto de archivos fuente, compilar  podría desear agruparlas en un conjunto de archivos fuente, compilar  cada archivo fuente en un archivo objeto, y entonces crear una cada archivo fuente en un archivo objeto, y entonces crear una biblioteca con los archivos objeto. Con

biblioteca con los archivos objeto. Con lo anterior se puede ahorrar lo anterior se puede ahorrar  tiempo al compilar en aquellos programas donde s

tiempo al compilar en aquellos programas donde s ean usadas.ean usadas. Supongamos que se tiene un conjunto

Supongamos que se tiene un conjunto de archivos que contengande archivos que contengan rutinas que son usadas frecuentemente, por ejemplo un archivo rutinas que son usadas frecuentemente, por ejemplo un archivo

cubo.c  cubo.c :: float cubo(float x) float cubo(float x) { { return (x*x*x); return (x*x*x); } } y otro archivo

y otro archivofactorial.c factorial.c  int factorial(int n) int factorial(int n) { { int i, res=1; int i, res=1;

for(i=1; i<=n; i++)

for(i=1; i<=n; i++)

res*=i; res*=i; return (res); return (res); } }

Para los archivos de nuestras funciones también se debe tener un Para los archivos de nuestras funciones también se debe tener un archivo de cabezera, para que puedan

archivo de cabezera, para que puedan ser usadas, suponiendo que seser usadas, suponiendo que se tiene el siguiente archivo

tiene el siguiente archivolibmm.h libmm.h con el siguiente contenido:con el siguiente contenido:

extern float cubo(float);

extern float cubo(float);

extern int factorial(int);

extern int factorial(int);

El código que use la biblioteca que se esta creando podría ser: El código que use la biblioteca que se esta creando podría ser: /* Programa prueba.c */ /* Programa prueba.c */ #include "libmm.h" #include "libmm.h" #define VALOR 4 #define VALOR 4 main() main() { {

 printf("El cubo de %d es %f\n",VALOR, cubo(VALOR) );

 printf("El cubo de %d es %f\n",VALOR, cubo(VALOR) );

 printf("\t y su factorial es %d\n",factorial(VALOR) );

 printf("\t y su factorial es %d\n",factorial(VALOR) );

}

}

Para crear la biblioteca se deben compilar los archivos fuente, que lo Para crear la biblioteca se deben compilar los archivos fuente, que lo podemos hacer de la siguiente forma:

podemos hacer de la siguiente forma: $ gcc -c

$ gcc -c cubo.c factorial.ccubo.c factorial.c

Lo cual nos dejará los archivos

Lo cual nos dejará los archivos cubo.ocubo.oyy factorial.ofactorial.o. Después se debe. Después se debe crear la biblioteca con los archivos fuentes, suponiendo que nuestra crear la biblioteca con los archivos fuentes, suponiendo que nuestra biblioteca se llame

biblioteca se llame libmm.alibmm.a, tendrás que hacerlo con el comando, tendrás que hacerlo con el comandoar ar  así:

así:

$ ar r libmm.a cubo.o factorial.o

$ ar r libmm.a cubo.o factorial.o

Cuando se actualiza una biblioteca, se necesita borrar el archivo Cuando se actualiza una biblioteca, se necesita borrar el archivo anterior (

anterior (libmm.alibmm.a). El último paso es crear un índice para la biblioteca,). El último paso es crear un índice para la biblioteca, lo que permite que el ligador pueda encontrar las rutinas. Lo anterior, lo lo que permite que el ligador pueda encontrar las rutinas. Lo anterior, lo hacemos con el comando

hacemos con el comandoranlib ranlib , por lo que teclearemos ahora:, por lo que teclearemos ahora: $ ranlib libmm.a

$ ranlib libmm.a

Los últimos dos pasos pudieron ser combinados en uno sólo, entonces Los últimos dos pasos pudieron ser combinados en uno sólo, entonces hubieramos podido teclear:

hubieramos podido teclear: $ar rs

$ar rs libmm.a cubo.o factorial.olibmm.a cubo.o factorial.o

Ahora que ya tenemos la biblioteca, es conveniente que coloquemos Ahora que ya tenemos la biblioteca, es conveniente que coloquemos nuestra biblioteca y el archivo cabezera

(9)

Supongamos que dejamos la biblioteca en

Supongamos que dejamos la biblioteca en~/lib ~/lib y el fichero cabezeray el fichero cabezera en

en~/include~/include, debemos hacer lo siguiente:, debemos hacer lo siguiente: $ mkdir ../include $ mkdir ../include $ mkdir ../lib $ mkdir ../lib $ mv libmm.h ../include $ mv libmm.h ../include $ mv libmm.a ../lib $ mv libmm.a ../lib

Si llegarás a modificar la biblioteca, tendrías que repetir la última Si llegarás a modificar la biblioteca, tendrías que repetir la última instrucción.

instrucción.

Se debe ahora compilar el archivo

Se debe ahora compilar el archivo con la biblioteca, de la siguientecon la biblioteca, de la siguiente forma:

forma:

gcc -I../include -L../lib -o prueba prueba.c -lmm

gcc -I../include -L../lib -o prueba prueba.c -lmm

1.9.2 Creación de una biblioteca compartida

1.9.2 Creación de una biblioteca compartida

Las ventajas que presentan las bibliotecas compartidas, es la reducción Las ventajas que presentan las bibliotecas compartidas, es la reducción en el consumo de memoria, si son usadas por más de un proceso, en el consumo de memoria, si son usadas por más de un proceso, además de la reducción del tamaño

además de la reducción del tamaño del código ejecutable. También sedel código ejecutable. También se hace el desarrollo más fácil, ya que cuando se hace algún cambio en la hace el desarrollo más fácil, ya que cuando se hace algún cambio en la biblioteca, no se necesita recompilar y

biblioteca, no se necesita recompilar y reenlazar la aplicación cada vez.reenlazar la aplicación cada vez. Se requiere lo anterior sólo si se modifico el número de argumentos con Se requiere lo anterior sólo si se modifico el número de argumentos con los que se llama una función

los que se llama una función o se cambio el tamaño o se cambio el tamaño de algunade alguna estructura.

estructura.

El código de la biblioteca compartida necesita

El código de la biblioteca compartida necesita ser independiente de laser independiente de la posición, para hacer posible que sea usado

posición, para hacer posible que sea usado el código por variosel código por varios programas. Para crear la biblioteca hacerlo de la siguiente forma: programas. Para crear la biblioteca hacerlo de la siguiente forma: $ gcc -c -fPIC cubo.c factorial.c

$ gcc -c -fPIC cubo.c factorial.c

Para generar la biblioteca dinámica hacer lo

Para generar la biblioteca dinámica hacer lo siguiente:siguiente: $ gcc -shared -o libmm.so cubo.o factorial.o

$ gcc -shared -o libmm.so cubo.o factorial.o

No existe un paso para la

No existe un paso para la indexación como ocurre en las bibliotecasindexación como ocurre en las bibliotecas estáticas.

estáticas.

Después habrá que mover la biblioteca

Después habrá que mover la biblioteca dinámica a su directoriodinámica a su directorio correspondiente (

correspondiente (../lib ../lib ) y proceder a compilar para que nuestro) y proceder a compilar para que nuestro código use la biblioteca.

código use la biblioteca.

$ gcc -I../include -L../lib -o prueba prueba.c -lmm

$ gcc -I../include -L../lib -o prueba prueba.c -lmm

Nos preguntamos que sucede si hay una biblioteca compartida Nos preguntamos que sucede si hay una biblioteca compartida ((libmm.so libmm.so ) y una estática () y una estática (libmm.alibmm.a) disponibles. En este caso, el) disponibles. En este caso, el ligador siempre toma la compartida. Si se desea hacer uso de la ligador siempre toma la compartida. Si se desea hacer uso de la estática, se tendrá que nombrar explícitamente en la línea de estática, se tendrá que nombrar explícitamente en la línea de comandos:

comandos: $ gcc -I

$ gcc -I../include -L../lib -o prueba prueba.c libmm.a../include -L../lib -o prueba prueba.c libmm.a

Cuando se usan bibliotecas compartidas un comando útil es Cuando se usan bibliotecas compartidas un comando útil esldd ldd , el, el cual nos informa que bibliotecas compartidas

cual nos informa que bibliotecas compartidas un programa ejecutableun programa ejecutable usa, a continuación un ejemplo:

usa, a continuación un ejemplo: $ ldd prueba $ ldd prueba libstuff.so => libstuff.so (0x40018000) libstuff.so => libstuff.so (0x40018000) libc.so.6 => /lib/i686/libc.so.6 (0x4002f000) libc.so.6 => /lib/i686/libc.so.6 (0x4002f000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Como se ve en cada línea aparece el nombre de la biblioteca, el camino Como se ve en cada línea aparece el nombre de la biblioteca, el camino completo a la biblioteca que es usada, y donde en el espacio de completo a la biblioteca que es usada, y donde en el espacio de direcciones virtuales la biblioteca esta mapeada.

direcciones virtuales la biblioteca esta mapeada. Si

Sildd ldd muestra como salidamuestra como salidanot found not found para alguna biblioteca, se vanpara alguna biblioteca, se van a tener problemas y el programa no podra ser ejecutado. Una forma de a tener problemas y el programa no podra ser ejecutado. Una forma de arreglarlo es buscar la biblioteca y colocarla en el lugar correcto para arreglarlo es buscar la biblioteca y colocarla en el lugar correcto para que el programa

que el programaloader loader la encuentre, que siempre busca por defaultla encuentre, que siempre busca por default en

enlib lib yy/usr/lib /usr/lib . Si se tienen bibliotecas en otro directorio, crear . Si se tienen bibliotecas en otro directorio, crear  una variable de ambiente

una variable de ambienteLD_LIBRARY_PATH LD_LIBRARY_PATH y poner los directoriosy poner los directorios separados por 

separados por ;;..

1.10 Funciones de la biblioteca de UNIX

1.10 Funciones de la biblioteca de UNIX

El sistema UNIX da un gran número de funciones de C. Algunas El sistema UNIX da un gran número de funciones de C. Algunas implementan operaciones de uso frecuente, mientras otras están muy implementan operaciones de uso frecuente, mientras otras están muy especializadas en relación a su aplicación.

(10)

No reinvente la rueda. Se recomienda

No reinvente la rueda. Se recomienda revisar si una función en revisar si una función en algunaalguna biblioteca existe, en vez de hacer la tarea de escribir su propia versión. biblioteca existe, en vez de hacer la tarea de escribir su propia versión. Con lo anterior se reduce el tiempo de desarrollo de un programa. Ya Con lo anterior se reduce el tiempo de desarrollo de un programa. Ya que las funciones de la biblioteca han

que las funciones de la biblioteca han sido probadas, por lo que estaránsido probadas, por lo que estarán corregidas, a diferencia de cualquiera que un

corregidas, a diferencia de cualquiera que un programador puedaprogramador pueda escribir. Lo anterior reducirá el tiempo

escribir. Lo anterior reducirá el tiempo de depuración del programa.de depuración del programa.

1.10.1 Encontrando información acerca de las bibliotecas.

1.10.1 Encontrando información acerca de las bibliotecas.

El manual de UNIX tiene una entrada para todas las funciones El manual de UNIX tiene una entrada para todas las funciones disponibles. La documentación de funciones esta guardada disponibles. La documentación de funciones esta guardada en laen la

sección 3 

sección 3 del manual, y hay muchas otras útiles que hacen llamadas aldel manual, y hay muchas otras útiles que hacen llamadas al sistema en la

sistema en lasección 2 sección 2 . Si ya sabe el nombre de la función que se. Si ya sabe el nombre de la función que se

quiere revisar, puede leer la página tecleando: quiere revisar, puede leer la página tecleando:

 man 3 sqrt

 man 3 sqrt

Si no sabe el nombre de la función, una lista completa esta incluida en Si no sabe el nombre de la función, una lista completa esta incluida en la página introductoria de la sección 3

la página introductoria de la sección 3 del manual. Para leerlo, teclee:del manual. Para leerlo, teclee:

 man 3 intro 

 man 3 intro 

Hay aproximadamente 700 funciones. El número tiende a Hay aproximadamente 700 funciones. El número tiende a incrementarse con cada actualización al sistema. incrementarse con cada actualización al sistema. En cualquier página del manual, la sección

En cualquier página del manual, la sección de SYNOPSIS incluyede SYNOPSIS incluye información del uso de la función. Por ejemplo:

información del uso de la función. Por ejemplo:

#include <time.h> 

#include <time.h> 

char *ctime(const time_t *timep);

char *ctime(const time_t *timep); Lo que significa que se debe tener  Lo que significa que se debe tener 

#include <time.h> 

#include <time.h> 

en el archivo del programa que

en el archivo del programa que hace el llamado ahace el llamado actimectime. Y que la. Y que la función ctime toma un apuntador del tipo

función ctime toma un apuntador del tipotime_ttime_tcomo un argumento,como un argumento, y regresa una cadena

y regresa una cadenachar * char * ..

En la sección DESCRIPTION se

En la sección DESCRIPTION se da una pequeña descripción de lo queda una pequeña descripción de lo que hace la función.

hace la función.

1.11 Ejercicios

1.11 Ejercicios

1.

1.

Escribe, compila y corre el siguiente programa. Modifica el programaEscribe, compila y corre el siguiente programa. Modifica el programa  para que incluyas tu nombre y la forma como hicistes lo anterior. Para iniciar   para que incluyas tu nombre y la forma como hicistes lo anterior. Para iniciar 

un comentario usa

un comentario usa/* /* y para terminarloy para terminarlo*/ */ :: 2. 2. mamainin()() 3. 3. {{ 4. 4. inint t i;i; 5. 5. 6.

6. printf("\t printf("\t Numero Numero \t\t \t\t Cubo\n\Cubo\n\n");n");

7.

7.

8.

8. for( for( i=0; i=0; i<=2i<=20; 0; ++i)++i)

9.

9. printf("\t printf("\t %d %d \t\t\t \t\t\t %d %d \n",i,i*i*i \n",i,i*i*i ););

10.}

10.}

11.

11. El siguEl siguientiente proge programa usrama usa la biblia la bibliotecoteca matema matemáticática. Tecla. Tecléaloéalo, compil, compilaloalo y ejecutalo. Incluye con comentarios dentro del programa tu nombre y la forma y ejecutalo. Incluye con comentarios dentro del programa tu nombre y la forma como hicistes lo anterior.

como hicistes lo anterior. 12.#include <math.h> 12.#include <math.h> 13. 13. 14.main() 14.main() 15.{ 15.{ 16. 16. int int i;i; 17. 17. 18.

18. printf("\tAnprintf("\tAngulo \t\t gulo \t\t Seno\n\nSeno\n\n");");

19.

19.

20.

20. for( for( i=0; i=0; i<=360; i<=360; i+=15)i+=15)

21.

21. printf("\t printf("\t %d %d \t\t\t \t\t\t %f %f \n",i,sin((dou\n",i,sin((double) ble) i*M_PI/18i*M_PI/180.0));0.0));

22.}

22.}

23.

23.

Busca en los directoriosBusca en los directorios/lib /lib yy/usr/lib /usr/lib las bibliotecas que estánlas bibliotecas que están disponibles. Manda 3 nombres de estáticas y 3 de compartidas.

disponibles. Manda 3 nombres de estáticas y 3 de compartidas. o

o Use el comandoUse el comando man  man para obtener detalles de laspara obtener detalles de las funciones de la biblioteca.

funciones de la biblioteca. o

o Selecciona alguna biblioteca y ve los códigos Selecciona alguna biblioteca y ve los códigos objetosobjetos que contiene, puedes teclear:

que contiene, puedes teclear:ar tv bibliotecaar tv biblioteca

24.

24.

Ve enVe en/usr/include/usr/includeque archivos de cabecera están disponibles.que archivos de cabecera están disponibles. o

o Usa los comandosUsa los comandos more moreoocatcatpara ver los archivos depara ver los archivos de texto.

texto. o

o Explora los archivos cabecera para ver el contenido,Explora los archivos cabecera para ver el contenido, observando las directivas de preprocesamiento

observando las directivas de preprocesamiento include, defineinclude, define,, las definiciones de los tipos y los prototipos de las funciones. las definiciones de los tipos y los prototipos de las funciones. Envia 10 casos donde se hayan usado las directivas Envia 10 casos donde se hayan usado las directivas

(11)

anteriores, indicando de que archivo de cabezera anteriores, indicando de que archivo de cabezera laslas obtuvistes.

obtuvistes.

25.

25.

Supongamos que se tiene un programa en C el cual tiene la funciónSupongamos que se tiene un programa en C el cual tiene la función   principal en

  principal en main.c  main.c y que se tienen otras funciones en los archivosy que se tienen otras funciones en los archivos input.c input.c  y

youtput.c output.c :: o

o ¿De qué forma habría que compilar y ligar este¿De qué forma habría que compilar y ligar este programa?

programa? o

o ¿Cómo se deberán modificar los comandos anteriores¿Cómo se deberán modificar los comandos anteriores para ligar una biblioteca llamada

para ligar una biblioteca llamada proceso1 proceso1guardada en elguardada en el directorio estándar de las bibliotecas del sistema?

directorio estándar de las bibliotecas del sistema? o

o ¿Cómo modificarías los comandos anteriores para ligar ¿Cómo modificarías los comandos anteriores para ligar  una biblioteca llamada

una biblioteca llamada proceso2  proceso2 guardada en tu directorioguardada en tu directorio casa?

casa? o

o Algunos archivos cabecera necesitan ser leídos yAlgunos archivos cabecera necesitan ser leídos y encontrados en el subdirectorio

encontrados en el subdirectorioheader header de su directorio casade su directorio casa y también en directorio de trabajo actual. ¿Cómo se

y también en directorio de trabajo actual. ¿Cómo se modificarían los comandos de compilación para hacer modificarían los comandos de compilación para hacer lolo señalado?

señalado?

• 2.1 Orígenes del C2.1 Orígenes del C •

• 2.2 Características de C2.2 Características de C •

• 2.3 Estructura de un programa en C2.3 Estructura de un programa en C •

• 2.4 Variables2.4 Variables o

o 2.4.1 Definición de variables globales2.4.1 Definición de variables globales o

o 2.4.2 Lectura y escritura de variables2.4.2 Lectura y escritura de variables

• 2.5 Constantes2.5 Constantes •

• 2.6 Operadores Aritméticos2.6 Operadores Aritméticos •

• 2.7 Operadores de Comparación2.7 Operadores de Comparación •

• 2.8 Operadores lógicos2.8 Operadores lógicos •

• 2.9 Orden de precedencia2.9 Orden de precedencia •

• 2.10 Ejercicios2.10 Ejercicios

2. Principios de C

2. Principios de C

En este capítulo se ofrece una breve historia del desarrollo del lenguaje En este capítulo se ofrece una breve historia del desarrollo del lenguaje C y se consideran también sus características.

C y se consideran también sus características.

En el resto del capítulo se ven los aspectos básicos de los programas En el resto del capítulo se ven los aspectos básicos de los programas de C, tales como su estructura, la declaración de variables, tipos de de C, tales como su estructura, la declaración de variables, tipos de datos y operadores.

datos y operadores.

2.1 Orígenes del C

2.1 Orígenes del C

El proceso de desarrollo del lenguaje C

El proceso de desarrollo del lenguaje C se origina con la creación de se origina con la creación de unun lenguaje llamado BCPL, que fue desarrollado por Martin Richards. El lenguaje llamado BCPL, que fue desarrollado por Martin Richards. El BCPL tuvo influencia en un lenguaje llamado B, el cual se usó en 1970 BCPL tuvo influencia en un lenguaje llamado B, el cual se usó en 1970 y fue inventado por Ken Thompson y que permitió el desarrollo de C en y fue inventado por Ken Thompson y que permitió el desarrollo de C en 1971, el cual lo inventó e implementó Dennis Ritchie. Para 1973 el 1971, el cual lo inventó e implementó Dennis Ritchie. Para 1973 el sistema operativo UNIX estaba casi totalmente escrito en C. sistema operativo UNIX estaba casi totalmente escrito en C. Durante muchos años el estándar para C fue la versión 5 del sistema Durante muchos años el estándar para C fue la versión 5 del sistema operativo UNIX, documentada en ``The C Programming Language'' operativo UNIX, documentada en ``The C Programming Language'' escrito por Brian W. Kernighan and Dennis M. Ritchie in 1978 escrito por Brian W. Kernighan and Dennis M. Ritchie in 1978 comúnmente referido como K&R.

comúnmente referido como K&R.

Posteriormente se hicieron varias implementaciones las Posteriormente se hicieron varias implementaciones las cualescuales mostraban las siguientes tendencias:

mostraban las siguientes tendencias: •

• Nuevas característicasNuevas características •

• Diferencias de máquinasDiferencias de máquinas •

• Diferencias de productosDiferencias de productos •

• Errores en los compiladoresErrores en los compiladores •

(12)

Esto originó que en el verano de 1983 se estableciera un comité para Esto originó que en el verano de 1983 se estableciera un comité para resolver estas discrepancias, el cual empezó a trabajar en un estándar  resolver estas discrepancias, el cual empezó a trabajar en un estándar  ANSI C, la cual fue completada en 1988.

ANSI C, la cual fue completada en 1988.

2.2 Características de C

2.2 Características de C

Algunas de las características más importantes que definen el lenguaje Algunas de las características más importantes que definen el lenguaje y que han permitido que sea tan popular, como lenguaje de

y que han permitido que sea tan popular, como lenguaje de programación son:

programación son: •

• Tamaño pequeño.Tamaño pequeño. •

• Uso extensivo de llamadas a funciones.Uso extensivo de llamadas a funciones. •

• Comandos breves (poco tecleo).Comandos breves (poco tecleo). •

• Lenguaje estructurado.Lenguaje estructurado. •

• Programación de bajo nivel (nivel bit)Programación de bajo nivel (nivel bit) •

• Implementación de apuntadores - uso extImplementación de apuntadores - uso ext ensivo de apuntadoresensivo de apuntadores para la memoria, arreglos, estructuras y funciones

para la memoria, arreglos, estructuras y funciones

Las diversas razones por la cual se ha convertido en un lenguaje de Las diversas razones por la cual se ha convertido en un lenguaje de uso profesional son:

uso profesional son: •

• El uso de constructores de alto nivel.El uso de constructores de alto nivel. •

• El poder manejar actividades de bajo-nivel.El poder manejar actividades de bajo-nivel. •

• El generar programas eficientes.El generar programas eficientes. •

• La posibilidad de poder ser compilado en una La posibilidad de poder ser compilado en una variedad devariedad de computadoras, con pocos cambios (portabilidad).

computadoras, con pocos cambios (portabilidad).

Un punto en contra es que tiene una detección pobre de errores, lo cual Un punto en contra es que tiene una detección pobre de errores, lo cual en ocasiones es problemático para los

en ocasiones es problemático para los principiantes.principiantes.

2.3 Estructura de un programa en C

2.3 Estructura de un programa en C

Un programa de C tiene básicamente la siguiente forma: Un programa de C tiene básicamente la siguiente forma: •

• Comandos del preprocesador.Comandos del preprocesador. •

• Definiciones de tipos.Definiciones de tipos.

• Prototipos de funciones - declara el tipo de función y lasPrototipos de funciones - declara el tipo de función y las variables pasadas a la misma.

variables pasadas a la misma. •

• VariablesVariables •

• FuncionesFunciones

Para un programa se debe tener una función Para un programa se debe tener una función main() main().. Una función tiene la forma:

Una función tiene la forma:

tipo nombre_de_la_funcion (parámetros)

tipo nombre_de_la_funcion (parámetros)

{ { variables locales variables locales sentencias de C sentencias de C } }

Si la definición del tipo es omitida, C asume que la función regresa un Si la definición del tipo es omitida, C asume que la función regresa un tipo entero.

tipo entero.

Nota:

Nota:

Lo anterior puede ser una fuente de problemas en unLo anterior puede ser una fuente de problemas en un programa.

programa.

A continuación se muestra un primer programa: A continuación se muestra un primer programa: /* Programa ejemplo */ /* Programa ejemplo */ main() main() { {

 printf( "Me gusta C\n" );

 printf( "Me gusta C\n" );

exit (0); exit (0); } } NOTAS: NOTAS: •

• C requiere un punto y coma al final de cada sentencia.C requiere un punto y coma al final de cada sentencia. •

•  printf  printf es una función estándar de C, la cual es llamada en laes una función estándar de C, la cual es llamada en la función

función main() main().. •

(13)

• exit()exit()es también una función estándar que hace que eles también una función estándar que hace que el programa termine. En el sentido estricto no es necesario ya que es la programa termine. En el sentido estricto no es necesario ya que es la última línea de

última línea de main() main()y de cualquier forma terminará el programa.y de cualquier forma terminará el programa. En caso de que se hubiera llamado a la función

En caso de que se hubiera llamado a la función printf  printf de la siguientede la siguiente forma:

forma:

 printf(".\n.1\n..2\n...3\n");

 printf(".\n.1\n..2\n...3\n");

La salida tendría la siguiente forma: La salida tendría la siguiente forma: .1 .1 ..2 ..2 ...3 ...3

2.4 Variables

2.4 Variables

C tiene los siguientes tipos de datos simples: C tiene los siguientes tipos de datos simples:

Tabla 2.1:

Tabla 2.1:Tipos de CTipos de C

T

Tiippo o TTaammaañño o ((bbyytteess) ) LíímLmiitte e iinnffeerriioor r LLíímmiitte e ssuuppeerriioor  r  

cchhaarr 11 ----

----u

unnssiiggnneed d cchhaarr 11 sshhoorrt t iinntt 22 u

unnssiiggnneed d sshhoorrt t iinntt 22 ((lloonngg) ) iinntt 44

ffllooaatt 44

d

doouubbllee 88

Los tipos de datos básicos tiene varios

Los tipos de datos básicos tiene varios modificadoresmodificadoresque les preceden.que les preceden. Se usa un modificador para alterar el significado de un tipo base para Se usa un modificador para alterar el significado de un tipo base para que encaje con las diversas necesidades

que encaje con las diversas necesidades o situaciones. Loso situaciones. Los modificadores son:

modificadores son:signed signed ,,unsigned unsigned ,,long long yyshortshort.. En los sistemas UNIX todos los tipos

En los sistemas UNIX todos los tiposintintsonsonlong intlong int, a menos que, a menos que se especifique explícitamente

se especifique explícitamenteshort intshort int..

Nota:

Nota:

no hay un tipo booleano en C -- se deberá usar no hay un tipo booleano en C -- se deberá usar char char ,,intinto aúno aún mejor 

mejor unsigned char unsigned char ..

signed 

signed ,,unsigned unsigned ,,long long yyshortshortpueden ser usados con los tipospueden ser usados con los tipos

char 

char eeintint. Aunque es permitido el uso de. Aunque es permitido el uso designed signed en enteros, esen enteros, es redundante porque la declaración de entero por defecto asume un redundante porque la declaración de entero por defecto asume un número con signo.

número con signo.

Para declarar una variable en C, se debe seguir el siguiente formato: Para declarar una variable en C, se debe seguir el siguiente formato:

tipo lista_variables;

tipo lista_variables; tipo

tipo es un tipo válido de C yes un tipo válido de C y lista_variableslista_variables puede consistir en uno opuede consistir en uno o más indentificadores separados por una coma. Un identificador debe más indentificadores separados por una coma. Un identificador debe comenzar con una letra o un guión bajo.

comenzar con una letra o un guión bajo. Ejemplo: Ejemplo: int i, j, k; int i, j, k; float x,y,z; float x,y,z; char ch; char ch;

2.4.1 Definición de variables globales

2.4.1 Definición de variables globales

Una varible global se declara fuera

Una varible global se declara fuera de todas las funciones, incluyendo ade todas las funciones, incluyendo a la función

la función main() main(). Una variable global puede ser utilizada en . Una variable global puede ser utilizada en cualquier cualquier  parte del programa.

parte del programa. Por ejemplo: Por ejemplo: short numero, suma;

(14)

int numerogr, sumagr;

int numerogr, sumagr;

char letra; char letra; main() main() { { ... ... } }

Es también posible preinicializar variables globales usando el operador  Es también posible preinicializar variables globales usando el operador  de asignación

de asignación= = , por ejemplo:, por ejemplo: float suma= 0.0;

float suma= 0.0;

int sumagr= 0;

int sumagr= 0;

char letra= 'A';

char letra= 'A';

main() main() { { ... ... } }

Que es lo mismo que: Que es lo mismo que: float suma; float suma; int sumagr; int sumagr; char letra; char letra; main() main() { { suma suma = 0= 0.0;.0; sumagr= 0; sumagr= 0; letra = 'A'; letra = 'A'; ... ... } }

Dentro de C también se permite la asignación múltiple usando el Dentro de C también se permite la asignación múltiple usando el operador 

operador = = , por ejemplo:, por ejemplo: a = b = c = d = 3;

a = b = c = d = 3;

...que es lo mismo, pero más eficiente que: ...que es lo mismo, pero más eficiente que: a = 3; a = 3;  b = 3;  b = 3; c = 3; c = 3; d = 3; d = 3;

La asignación múltiple se puede llevar a cabo, si todos los tipos de las La asignación múltiple se puede llevar a cabo, si todos los tipos de las variables son iguales.

variables son iguales.

Se pueden redefinir los tipos de C usando

Se pueden redefinir los tipos de C usandotypedef typedef . Como un ejemplo. Como un ejemplo de un simple uso se considera como se crean dos nuevos tipos real y de un simple uso se considera como se crean dos nuevos tipos real y letra. Estos nuevos tipos pueden ser usados de igual forma como los letra. Estos nuevos tipos pueden ser usados de igual forma como los tipos predefinidos de C.

tipos predefinidos de C. typedef float real;

typedef float real;

typedef char letra;

typedef char letra;

/* Declaracion de variables usando el nuevo tipo */

/* Declaracion de variables usando el nuevo tipo */

real suma=0.0;

real suma=0.0;

letra sig_letra;

letra sig_letra;

2.4.2 Lectura y escritura de variables

2.4.2 Lectura y escritura de variables

El lenguaje C usa salida formateada. La función

El lenguaje C usa salida formateada. La función printf  printf tiene untiene un caracter especial para formatear (%) -- un caracter enseguida define un caracter especial para formatear (%) -- un caracter enseguida define un cierto tipo de formato para una variable.

cierto tipo de formato para una variable.

%c caracteres %c caracteres %s cadena de aracteres %s cadena de aracteres %d enteros %d enteros %f flotantes %f flotantes Por ejemplo: Por ejemplo:  printf("%c %d %f",ch,i,x);  printf("%c %d %f",ch,i,x);

La sentencia de formato se encierra entre

La sentencia de formato se encierra entre" "" ", y enseguida las, y enseguida las variables. Asegurarse que el orden de formateo y los tipos de datos de variables. Asegurarse que el orden de formateo y los tipos de datos de las variables coincidan.

las variables coincidan.

scanf()

scanf()es la función para entrar valores a variables. Su formato eses la función para entrar valores a variables. Su formato es similar a

similar a printf  printf . Por ejemplo:. Por ejemplo: scanf("%c %d %f %s",&ch, &i, &x,

(15)

Observar que se antepone

Observar que se antepone&&a los nombres de las varibles, excepto a laa los nombres de las varibles, excepto a la cadena de caracteres. En el capítulo

cadena de caracteres. En el capítulo 88que trata sobre apuntadores seque trata sobre apuntadores se revisará más a fondo el uso de este operador.

revisará más a fondo el uso de este operador.

2.5 Constantes

2.5 Constantes

ANSI C permite declarar 

ANSI C permite declarar constantesconstantes. Cuando se declara una constante. Cuando se declara una constante es un poco parecido a declarar una variable, excepto que el valor no es un poco parecido a declarar una variable, excepto que el valor no puede ser cambiado.

puede ser cambiado. La palabra clave

La palabra claveconstconstse usa para declarar una constante, como sese usa para declarar una constante, como se muestra a continuación: muestra a continuación: const a = 1; const a = 1; int a = 2; int a = 2;

Notas:

Notas:

• Se puede usar Se puede usar constconstantes o después del tipo.antes o después del tipo. •

• Es usual inicializar una constante con Es usual inicializar una constante con un valor, ya que no puedeun valor, ya que no puede ser cambiada

ser cambiada de alguna otra formade alguna otra forma.. La directiva del preprocesador 

La directiva del preprocesador #define#definees un método más flexiblees un método más flexible para definir 

para definir constantesconstantes en un programa.en un programa. Frecuentemente se ve la declaración

Frecuentemente se ve la declaraciónconstconsten los parámetros de laen los parámetros de la función. Lo anterior simplemente indica que

función. Lo anterior simplemente indica que la función no cambiara ella función no cambiara el valor del parámetro. Por ejemplo, la siguiente función usa este valor del parámetro. Por ejemplo, la siguiente función usa este concepto:

concepto:

char *strcpy(char *dest, const char *orig);

char *strcpy(char *dest, const char *orig); El segundo argumento

El segundo argumentoorig orig es una cadena de C que no será alterada,es una cadena de C que no será alterada, cuando se use la función de

cuando se use la función de la biblioteca para copiar cadenas.la biblioteca para copiar cadenas.

2.6 Operadores Aritméticos

2.6 Operadores Aritméticos

Lo mismo que en otros lenguajes de programación, en C se tienen los Lo mismo que en otros lenguajes de programación, en C se tienen los operadores aritméticos más usuales (

operadores aritméticos más usuales (+ + suma,suma,--resta,resta,* * multiplicación,multiplicación,

/ división ydivisión y%%módulo).módulo). El operador de asignación es

El operador de asignación es= = , por ejemplo:, por ejemplo:i=4; ch='y';i=4; ch='y'; Incremento

Incremento++ ++ y decrementoy decremento----unario. Los cuales son más eficientesunario. Los cuales son más eficientes que las respectivas asignaciones. Por ejemplo:

que las respectivas asignaciones. Por ejemplo:x++ x++ es más rápido quees más rápido que

x=x+1

x=x+1.. Los operadores

Los operadores++ ++ yy----pueden ser prefijos o postfijos. Cuando sonpueden ser prefijos o postfijos. Cuando son prefijos, el valor es calculado antes de que la expresión sea evaluada, y prefijos, el valor es calculado antes de que la expresión sea evaluada, y cuando es postfijo el valor

cuando es postfijo el valor es calculado después que la expresión eses calculado después que la expresión es evaluada.

evaluada.

En el siguiente ejemplo,

En el siguiente ejemplo,++z++zes prefijo yes prefijo y----es postfijo:es postfijo: int x,y,z; int x,y,z; main() main() { { x=( ( ++z ) - ( y-- ) ) % 100; x=( ( ++z ) - ( y-- ) ) % 100; } } Que es equivalente a: Que es equivalente a: int x,y,z; int x,y,z; main() main() { { z++; z++; x = ( z-y ) % 100; x = ( z-y ) % 100; y--; y--; } } El operador 

El operador %%(módulo o residuo) solamente trabaja con enteros,(módulo o residuo) solamente trabaja con enteros, aunque existe una función para flotantes (

aunque existe una función para flotantes (15.115.1fmod()fmod()) de la biblioteca) de la biblioteca matemática.

matemática. El operador división

El operador división/ / es para división entera y flotantes. Por lo tantoes para división entera y flotantes. Por lo tanto hay que tener cuidado. El resultado de

hay que tener cuidado. El resultado dex = 3 / 2;x = 3 / 2;es uno, aún sies uno, aún six x  es declarado como float. La regla es: si ambos argumentos en una es declarado como float. La regla es: si ambos argumentos en una

Referencias

Documento similar

El tercero tiene notas bajas pero la mayor es estadística, una de las temáticas trabajadas de forma más mecánica, asimismo el último arquetipo muestra que, aun con notas buenas,

pues aixó es lo pichOi', Qni hacha vist á Pepa Lluesma y á tats així el 'apaüatsL .. Podrá dir qne disfras,ats mas ha vist en

 Noordermer: Si, si y no porque son muy pocos los docentes que cuando planifican piensan en las diferentes respuestas que van a tener en el grupo, en general como docentes, como

La Normativa de evaluación del rendimiento académico de los estudiantes y de revisión de calificaciones de la Universidad de Santiago de Compostela, aprobada por el Pleno or-

Objetivo del Proyecto: Fortalecer el proyecto educativo del Centro Fe y Alegría Chiantla, fortaleciendo los procesos que lo constituyen, en el marco de la calidad educativa del

El Centro de juventud y familia del colegio Santa Mariana de Jesús orienta, guía y acompaña a la comunidad Marianita dinamizando espacios para la formación en liderazgo,

Gastos derivados de la recaudación de los derechos económicos de la entidad local o de sus organis- mos autónomos cuando aquélla se efectúe por otras enti- dades locales o

1. LAS GARANTÍAS CONSTITUCIONALES.—2. C) La reforma constitucional de 1994. D) Las tres etapas del amparo argentino. F) Las vías previas al amparo. H) La acción es judicial en