Luis Joyanes AGUILAR - Programación en C

Luis Joyanes AGUILAR - Programación en C

(Parte 1 de 11)

PROGRAMACI~N EN c Metodología, algoritmos

'

y estructura de datos

L Ignacio Zahonero Martinez

Departamento de Lenguajes y Sistemas Informáticos e Ingeniería del Software

Facultad de Informática/Escuela Universitaria de Informática Universidad Pontificia de Salamanca. Cumpus Madrid

MADRID BUEN,OS AIRES CARACAS -,GUATEMALA. LISBOA MÉXICO NUEVA YORK PANAMA SAN JUAN SANTAFE DE BOGOTA SANTIAGO SA0 PA,ULO AUCKLAND HAMBURG0 LONDRES MILAN MONTREAL NUEVA DELHI PARIS SAN FRANCISCO SIDNEY SINGAPUR ST. LOUIS TOKIO *TORONTO

Prólogo ,
Capítulo 1. Introducción a la ciencia de la computación y a la programación
1.1. ¿Qué es una computadora?
1.2. Organización física de una computadora (hardware)
1.2.1. Dispositivos de EntradafSalida (E/S)
1.2.2. La memoria central (interna)
1.2.3. La Unidad Central de Proceso (UCP)
1.2.4. El microprocesador
1.2.5. Memoria auxiliar (externa)
1.2.6. Proceso de ejecución de un programa
1.2.7. Comunicaciones: módems, redes, telefonía RDSI y ADSL
1.3. Concepto de algoritmo
1.3.1. Características de los algoritmos
1.4. El software (los programas)

PARTE I. METODOLOGíA DE LA PROGRAMACIÓN 1.2.8. La computadora personal multimedia ideal para 1 1.5. Los lenguajes de programación

1.5.4. Lenguajes de alto nivel
1.6. El lenguaje C: historia y características
1.6.1. Ventajas de C
1.6.2. Características
Capítulo 2. Fundamentos de programación
2.1. Fases en la resolución de problemas

1.6.3. Versiones actu ..

2.1.1. Análisis del problema
2.1.2. Diseño del algoritmo
2.1.3. Herramientas de la programación
2.1.4. Codificación de un programa

xv

vi Contenido

2.2. Programación modular

2.1.7. Documentación y

2.3.1. Recursos abstractos

2.3. Programación estructura tructurada: estru

2.7.1. Aserciones
2.7. Métodos formales de verificación de programas
2.8. Factores en la calidad del software

2.6.8. Iteración y e

Capítulo 3. El lenguaje C: elementos bá
3.1. Estructura general de un programa en,._...

PARTE I. FUNDAMENTOS DE PROGRAMACI~N EN c 3.1.1. Directivas del prepro

3.1.3. Función main ( )

3.1.2. Declaraciones global

3.1.5. Comentarios
3.2, Creación de un programa

3.1.4. Funciones definidas PO 3.3. El proceso de ejecución de 3.4. Depuración de un program

3.4.2. Errores lógicos
82
3.4.5. Errores en tiempo de
90
90

90 . . . . . . . . . .

3.6.5. Signos de puntuación y separadores92
3.6.6. Archivos de cabecera92
3.7. Tipos de datos en C92
3.7.1. Enteros(int)93
3.7.3. Caracteres (char)
3.8. El tipo de dato LÓGICO
3.9. Constantes
3.8.1. Escritura de valores lógicos97
es98
3.9.2. Constantes definidas (simbólicas)101
3.9.3. Constantes enumeradas
3.9.4. Constantes declaradas con latile
3.10.1. Declaracion103
3.10.2. Inicialización de variables105
3.10.3. Declaración o definición105
3.1. Duracióndeunavariable106
3.1.1. Variables locales106
3.1.2. Variables globales106
3.1.3. Variables dinámicas107
3.12.1. Salida
3.12.2. Entrada1
3.12.3. Salida de cadenas de caracteres112
3.12.4. Entrada de cadenas de caracteres112
3.13. Resumen113
3.14. Ejercicios113
3.10. Variables,
3.12. Entradas y salidas

Contenido vi¡ 3.7.2. Tipos de coma flotante ( f 1 oat ?

Capítulo 4. Operadores y expresiones114
4.1. Operadores y expresiones1 16
4.2. Operador de asignación116
4.3.1. Asociatividad119
4.3.2. Uso de paréntesis120
4.3. Operadores aritméticos117 ...
4.5. Operadores relacionales
4.6. Operadores lógicos125
4.6.1. Evaluación en cortocircuito127
4.6.2. Asignaciones booleatias (lógicas)128
4.7. Operadores de manipulación de bits129
4.7.1. Operadores de asignación adic130
4.8. Operador condicional132
4.9. Operador coma
4.7.2. Operadores de desplazamiento de bits (», «)
4.7.3. Operadores de direcciones131

4.4. Operadores de increment n y decrementación 13 1

4.12.1. Conversión im
4.12.3. Conversión explícita136
4.14. Resumen137
4.12.2. Reglas ......... ........

4.10. Operadores especiales 4.10.1. El operador ( ) 4.10.2. El operador [ ] 4.1. El operador SIZEOF . 4.12. Conversiones de tipos 4.13. Prioridad y asociatividad . ... 136

4.15. Ejercicios137
4.16. Problemas139
Capítulo 5. Estructuras de selección: sentencias if y switch142
5.1. Estructuras de control144
5.2. Lasentencia if

vi¡¡ Contenido

5.4. Sentencias i f - el se anidadas150

5.3. Sentencia i f de dos alternativas: i f - e 1 se

5.4.1. Sangría en las sentencias i 5.4.2. Comparación de sentencias

5.5. Sentencia de control switch154
5.5.1. Caso particular de case159
5.5.2. Uso de sentencias swi t c
5.6. Expresiones condicionales: el operador ? :
5.8. Puesta a punto de programas

5.9. Errores frecuentes de programación

5.7. Evaluación en cortocircuito de expresiones lógicas161
5.10. Resumen164
5.1. Ejercicios
5.12. Problemas167
6.1. La sentencia whi 1 e

Capítulo 6. Estructuras de control: bucles

6.1.2. Terminaciones anormales de un ciclo174

6.1.1. Operadores de inc

6.1.4. Bucles while con cero iteraciones174
6.1.6. Bucles controlados por indicadores (banderas)

6.1.3. Diseño eficiente d 6.1.7. La sentencia break en

6.1.5. Bucles controlados por centinelas175
6.1.8. Bucles while (true)178
6.2. Repetición: el bucle €or
6.2.1. Diferentes usos de bucles for184
6.3. Precauciones en el uso de for185
6.3.1. Bucles infinitos
6.3.2. Los bucles for vacíos
6.3.3. Sentencias nulas en bucles for188
6.3.4. Sentencias break y continue
6.4. Repetición: el bucle dowhi le .............. ............................. 190
6.4.1. Diferencias entre while y do-while
6.6. Diseño de bucles
6.6.1. Bucles para diseño de sumas y productos
6.6.2. Fin de un bucle194
6.6.3. Otras técnicas d196
6.6.4. Bucles for vacíos196
6.7. Bucles anidados197
6.8. Resumen
6.9. Ejercicios
6.10. Problemas203

188 191 6.5. Comparación de bucles while, for y do-whi le 6.1. Proyectos d 206

Capítulo7. Funciones208
7.1. Conceptodefunción210
7.2. Estructuradeunafunción211

7.2.1. Nombre de una función ...................................................... 213

Contenido

7.2.2. Tipo de dato de retorno

7.2.3. Resultados de una función

7.2.4. Llamada a una función
7.3. Prototipos de las funcionesI . . . . . . . . . . . . . . . . . . .

7.3.1. Prototipos con un número no

.~~....
7.4. Parámetros de una función
7.4.3. Diferencias entre paso de variables por valor y por referencia
7.4.4. Parámetros cons t de una función
7.6. Ámbito (alcance) . . . . . . . . ................................
7.6.2. Ambito del archivo fuente
7.6.3. Ambito de una función
7.6.4. Ambito de bloque
7.6.5. Variables locales
7.7.1. Variables automáticas
7.7.2. Variables externas
7.7.3. Variables registro
7.7.4. Variables estáticas
7.8. Concepto y uso de funcione a

7.6.1. Ambito del programa .

7.9.3. Funciones de conversión de caracteres
7.10.1. Funciones matemáticas
7.10.2. Funciones trigonométricas
7.10.3. Funciones logm’tmicas y exponenciales
7.10.4. Funciones aleatorias
7.7. Clases de almacenamiento
7.9. Funciones de carácter
7.10. Funciones numéricas . . . . . . ........................
7.13. Visibilidad de una función
7.13.2. Variables estáticas y automáticas
7.14. Compilación separada . . . . . .............................
7.17. Resumen
7.19. Problemas
Capítulo 8. Arrays (listas y tablas) . . . . .............................
8.1.2. Subíndices de un array
8.1.4. El tamaño de los arrays

7.9.1. Comprobación alfabética y de dígitos 7.9.2. Funciones de prueba de caracteres espe 7.13.1. Variables locales fren 8.1.3. Almacenamiento en me

s arrays

8.1.5. Verificación del rango

8.4. Arrays multidimensionales

8.2. Iniciaiización de un array 8.3. Arrays de caracteres y cadenas de 8.4.1. Inicialización de arrays mu

8.4.2. Acceso a los elementos de los arrays bidimensionales271
8.4.3. Lectura y escritura de arrays bidimensionales272

X Contenido 8.4.4. Acceso a elementos mediante bucles

8.4.5. Arrays de más de dos dimensiones274 ..................................
8.4.6. Una aplicación práctica274
8.5. Utilización de arrays como parámetros276
8.5.1. Precauciones
8.5.2. Paso de cadenas como parámetros
8.6.1. Algoritmo de la burbuja282
8.7. Búsqueda en listas284
8.8. Resumen
8.9. Ejercicios
8.6. Ordenación de listas282 .....................................
8.7.1. Búsqueda secuencia1 ............................. 28.5
8.10. Problemas ............. 291
Capítulo 9. Estructuras y uniones
9.1. Estructuras
de una estructura
9.1.2. Definición de variables de estructuras
9.1.3. Uso de estructuras en asignaciones
9.1.4. Inicialización de una declaración de estructuras
9.1.5. El tamaño de una estructura
9.2. Acceso a estructuras
9.3.1. Ejemplo de estructuras anidadas
9.4. Arrays de estructuras
9.6. Uniones
9.7. Enumeraciones
9.8. Campos de bit
9.9. Resumen
Capítulo 10. Punteros (apuntadores)322
10.1. Direcciones en memoria324
10.2. Concepto de puntero (apuntador)
10.2.1. Declaración de punteros
10.2.2. Inicialización (iniciación327

10.2.3. Indirección de punteros

10.3. Punteros null y void
10.4. Punteros a punteros331
10.5. Punteros y arrays332
10.5.1. Nombres de arrays nteros332
10.5.2. Ventajas de los punteros
10.6.1. Inicialización de u3.5
10.7. Punteros de cadenas3.5
10.7.1. Punteros versus arrays

10.2.4. Punteros y verificación d 10.6. Arrays de punteros ........................

10.8. Aritmética de punteros336
10.8.1. Una aplicación de ón de caracteres338
10.9. Punteros constantes frente a punteros a constantes339
10.9.1. Punteros constantes339
10.9.2. Punteros a constantes339
340
10.1.1. Inicialización de u343
348
349
10.13. Resumen
10.14. Ejercicios352
353
Capítulo 1. Asignación dinámica de memoria354
1.1. Gestión dinámica de la memoria356
1.2. Función malloc ( )357
1.2.1. Asignación de memoria de un tamaño desconocido361
1.1.1. Almacén libre (free store)357
1.2.2. Uso de mal loc ( ) para arrays multidimensionales
1.3. Liberación de memoria, función free ( )
1.4. Funciones de asignación de memoria call í )y realloc í)364
1.4.1. Función calloc ()364
1.4.2. Función realloc ()365
1.5. Asignación de memoria para array368
1.5.1. Asignación de memoria interactivamente369
1.5.2. Asignación de memoria para un array de estructuras371
1.8. Resumen376
1.9. Ejercicios376
1.10. Problemas377
1.6. Arrays dinámicos

Contenido Xi 1.7. Reglas de funcionamiento de la asignaci

Capítulo 12. Cadenas378
12.1. Conceptodecadena380

12.1.1. Declaración de variables de cadena 12.1.2. Inicialización de variables de cadena

12.2.2. Función putchar ( )385
12.2.3. Función puts ( )
389
389
12.5.1. La función s t391
adenas392
12.6.2. Las funciones strcat ( )y strncat ( )393
12.5. Asignación de cadenas391
12.7. Comparación de cadenas
12.7.3. La función strncmp ( ) .................... 396
12.7.4. La función strnicmp ( )
12.8. Inversión de cadenas
12.9.2. Función strlwr ( )
12.10. Conversión de cadenas a números399
12.10.1. Función atoi ()399
12.10.2. Función atof ( )
12.10.3. Función ato1 (1400
12.10.4. Entrada de números y cadenas
12.1.2. Función strrchr ()402
12.1.3. Función strspn ()
12.1.5. Función strpbrk ()403
12.1.6. Función strstr (1
12.1.7. Función strtok ()
12.12. Resumen405
12.14. Problemas
12.1. Búsqueda de caracteres y cadenas ...........................
12.1.4. Función strcspn () ....... 403
12.13. Ejercicios

xi¡ Contenido

Capítulo 13. Entradas y salidas por archivos410
13.2. Puntero FILE412
13.3. Apertura de un413
13.3.1. Modos de apertura de un archivo414
13.3.2. NULL y EOF415
13.3.3. Cierre de archivos415
13.4. Creación de un archivo secuencia1416
13.1. Flujos 412
417
421
423
13.5.2. Función de lectura f read ( )424
13.6.1. Función f seek ( )

PARTE Ill. ESTRUCTURA DE DATOS 13.7. Datos externos al programa co

13.6. Funciones para acceso aleatorio426
13.6.2. Función ftell ()431
13.8. Resumen434
435
13.10. Problemas436
Capítulo 14. Listas enlazadas438
14.1. Fundamentos teóricos440
14.2. Clasificación de las listas enlazadas441
14.3. Operaciones en listas enlazadas442
14.3.1. Declaración de un nodo442
14.3.2. Puntero de cabecera y cola443
14.3.3. El puntero nulo4
14.3.4. El operador - > de selecció445
14.3.5. Construcción de una lista445

Contenido xiii 14.3.6. Insertar un elemento en una lista 447

14.3.7. Búsqueda de un elemento453
14.3.8. Supresión de un nodo en una lista454
14.4. Lista doblemente enlazada456
14.4.1. Declaración de una lista doblemente enlazada
14.4.3. Supresión de un elemento en una lista doblemente enlazada
14.5. Listas circulares462
14.5.1. Insertar un elem en una lista circular462
14.7. Ejercicios468
14.8. Problemas468
14.4.2. Insertar un elemento en una lista doblemente enlazada
459
14.5.2. Supresión de un elemento en una lista circular463
14.6. Resumen 467
Capítulo 15. Pilas y colas
15.1. Concepto de pila ........... ...............
15.1.1. Especificaciones de una
15.2. El tipo pila implementado con arrays
15.2.1. Especificación del tipo pi 1 a
15.2.2. Implementación de las operaciones sobre pilas
15.2.3. Operaciones de verificación del estado de la pila
15.3. Colas
15.4. El tipo cola implementada con arrays
15.4.2. Especificación del tipo cola
15.4.3. Implementación del tipo cola
15.5.1. Declaración del tipo cola con listas
15.4.4. Operaciones de la cola
15.5. Realización de una cola con una lista enlazada
eraciones del tipo c o 1 a con listas
15.6. Resumen
15.7. Ejercicios
15.8. Problemas

15.4.1. Definición de la especificación de una cola 15.5.2. Codificación de 1

475 I I 1 484 I

Capítulo 16. Árboles
I 16.1. Árboles generales
504
16.3.1. Equilibrio

16.4.1. Diferentes ti [I

16.4. Estructura de un árbol binario511
e expresión
I
16.7.2. Recomdo enorden ...... 521
16.7.3. Recomdo postorden522

16.3.2. Árboles binarios completos ................... 525

528
16.9.1. Búsqueda528
16.9.2. Insertar un nodo
531
16.9.5. Recorridos de un árbol535
535
536
16.13. Problemas540
542
545
575
Apéndice C. Palabras reservadas de C++
Apéndice D. Guía de sintaxis ANSIASO estándar C++
Apéndice E. Biblioteca de funciones ANSI C
Apéndice F. Recursos (Libros/Revistas/URL de Interne713

xiv Contenido ÍNDICE ......................... .............................. ........ 727

y componentes y el mundo Web (C++, Java,) que dominan el campo informático y de la computación.

i Por qué un libro de C al principio del siglo XXI? A pesar de haber cumplido ya sus bodas de plata (25 años de vida), C viaja con toda salud hacia los 30 años de edad que cumplirá el próximo año. Sigue siendo una de las mejores opciones para la programación de los sistemas actuales y el medio más efi- ciente de aprendizaje para emigrar a los lenguajes reina, por excelencia, en el mundo orientado a objetos

(Parte 1 de 11)

Comentários