Mª CARMEN ARANDA GARRIDO
ANTONIO LUIS CARRILLO LEÓN
JOSÉ GALINDO GÓMEZ
JOSÉ ANTONIO GÓMEZ RUIZ
JOSÉ LUIS LEIVA OLIVENCIA
FUNDAMENTOS DE
INFORMÁTICA
UNIVERSIDAD DE MÁLAGA / MANUALES
FUNDAMENT
OS DE INFORMÁTICA
Mª Carmen
Aranda •
Antonio L. Carrillo • José Galindo • José
A. Gómez • José L. Leiva
90
9 788497 472876
ISBN 978-84-9747-287-6 Este libro se centra fundamentalmente en la enseñanza de la programación estructurada en el lenguaje C. Su principal valor es el enfoque pedagógico que presenta, muy apropiado para alumnos de primero de cualquier ingeniería. El libro está estructurado en 10 capítulos y tres apéndices. El primer capítulo es de introducción e inicia al lector en diversos temas que constituyen la base de conocimientos generales que un ingeniero de cualquier especialidad debe manejar sobre informática (sistemas operativos, bases de datos, periféricos, redes, Internet, etc.). El segundo de los capítulos introduce algunos conceptos de ingeniería del software de modo que el lector toma conciencia de los problemas que puede acarrear una programación desestructurada y carente de una metodología de diseño. Los capítulos 3 al 6 aportan todos los conceptos necesarios para poder desarrollar programas que no necesiten gestión dinámica de la memoria en lenguaje C. Los capítulos 7 al 10 aportan técnicas más avanzadas de programación (ficheros, recursividad y gestión dinámica de la memoria) que permiten desarrollar programas con una mayor funcionalidad. Al final de cada capítulo se incluye un apartado de ejercicios resueltos que, además de ilustrar los conceptos explicados a lo largo del capítulo, van introduciendo buenas prácticas de programación, cuyo aprendizaje concluye con la inclusión de un apéndice con normas de estilo recomendadas. Esta lista de ejercicios se completa con otros propuestos, pero no resueltos, clasificados por niveles de dificultad, lo que puede ayudar al lector a realizar una autoevaluación de su nivel de conocimientos de cada capítulo. Finalmente, cada capítulo se completa con un cuestionario resuelto que, junto a los ejemplos que inundan el texto, sirven para entender y afianzar los conceptos expuestos.
Mª carMen aranda garrido antonio luis carrillo león
josé galindo góMez josé antonio góMez ruiz josé luis leiva olivencia
fundaMentos de
inforMática
© Los autores
© Servicio de Publicaciones e Intercambio Científico
de la Universidad de Málaga
Imprime: Imagraf Impresores, S.A. Tel.: 952 32 85 97 I.S.B.N.: 978-84-9747-287-6
Depósito Legal: MA-2.967-2009 Diseño de la colección: J.M. Mercado
Índice General
Capítulo 1: Introducción y conceptos básicos ...1
1.1 Conceptos básicos. ...2
1.2 Evolución histórica ...5
1.2.1 Hechos históricos ...5
1.2.2 Generación de computadoras ...8
1.3 Clasificación de los ordenadores...10
1.4 Estructura funcional de un ordenador ...12
1.5 Representación de la información...14
1.5.1 Proceso de codificación. Códigos de E/S...14
1.5.2 Sistemas de numeración usuales en informática ...17
1.5.3 Conversión de decimal a base b ...18
1.5.4 Conversión de base b a decimal ...18
1.5.5 Cambio rápido de base ...19
1.5.6 Operaciones aritméticas y lógicas en binario ...21
1.5.7 Tipos de información y su representación...22
1.6 La memoria en el ordenador ...24
1.6.1 Características generales de la memoria RAM ...24
1.6.2 Tipos de memoria principal...25
1.6.3 Tipos de memoria ROM...26
1.6.4 Jerarquía de memoria ...27
1.7 Unidad central de proceso (CPU) ...28
1.7.1 Unidad de control ...29
1.7.3 El bus del sistema y la placa base ...32
1.7.4 Conectores y puertos de comunicación ...35
1.8 Periféricos ...36 1.8.1 Periféricos de entrada ...38 1.8.2 Periféricos de salida ...40 1.8.3 Memoria masiva...42 1.8.3.1 Discos magnéticos ...42 1.8.3.2 Discos ópticos...43
1.8.3.3 Dispositivos basados en memoria flash ...44
1.9 Redes...45
1.9.1 Tipos de redes ...46
1.9.2 Elementos para conectar un ordenador en una red...46
1.9.3 Topologías de una red local ...46
1.9.4 Tipos de cables-conexión ...48
1.10 Software ...49
1.11 Sistemas Operativos...50
1.11.1 Definición de sistema operativo ...51
1.11.2 Gestión de procesos...52
1.11.3 Gestión de la memoria principal ...54
1.11.4 Gestión de la entrada/salida (E/S) ...55
1.11.5 Gestión de ficheros...55
1.11.6 Sistemas operativos Windows...56
1.11.7 Sistemas operativos Unix ...56
1.11.8 Sistemas operativos Linux ...57
1.12 Bases de datos ...57
1.12.1 Introducción ...57
1.12.2 Terminología básica ...58
1.12.3 Sistemas de gestión de bases de datos...59
1.12.4 Relación entre datos. Sistema relacional...61
1.13 Internet ...62 1.13.1 Historia ...62 1.13.2 Servicios de Internet...64 1.13.3 Direccionamiento en Internet ...66 1.14 Cuestiones resueltas ...67 1.15 Ejercicios propuestos ...68
Capítulo 2: Algoritmos y programas ...71
2.1 Algoritmos ...72
2.1.1 Definición de algoritmo ...72
2.1.2 Propiedades de los algoritmos ...72
2.1.3 Estructura general de un algoritmo ...73
2.1.4 Diferencia entre un algoritmo y un programa ...73
2.1.5 Aspectos previos a considerar en el desarrollo de un algoritmo ...74
2.1.6 Ejemplos de algoritmos ...74
2.2 Ciclo de vida del software...76
2.2.1 Fase de análisis del problema ...77
2.2.2 Fase de desarrollo...77
2.2.2.1 Diseño ...77
2.2.2.2 Codificación ...77
2.2.2.3 Prueba ...78
2.2.3 Fase de mantenimiento ...78
2.2.4 Consideraciones. Aplicación a los problemas de este libro ...78
2.2.5 Paradigmas alternativos...79
2.3 Metodología de diseño. Programación estructurada ...79
2.3.1 Diseño descendente ...80
2.3.2 Estructuras de control ...83
2.4 Herramientas para la representación de algoritmos ...83
2.4.1 Organigramas o diagramas de flujo ...84
2.4.2 Pseudocódigo o pseudolenguaje ...88
2.5 Programas y lenguajes de programación ...91
2.6 Clasificación de los lenguajes de programación ...91
2.6.1 Tipos de lenguajes según su nivel de abstracción ...91
2.6.1.1 Lenguaje máquina...92
2.6.1.2 Ensambladores ...93
2.6.1.3 Lenguajes de alto nivel ...94
2.6.2 Tipos de lenguajes según su paradigma de programación ...95
2.6.2.1 Lenguajes imperativos o procedurales ...95
2.6.2.2 Lenguajes declarativos ...96
2.7 Traductores: compiladores e intérpretes ...97
2.7.1 Compiladores ...97
2.8 Ejercicios resueltos ...98
2.8.1 Comprobar propiedad...98
2.8.2 Ecuación de segundo grado ...100
2.8.3 Media aritmética ...101
2.8.4 Mayor de diez valores ...102
2.8.5 Producto de los mil primeros números naturales ...103
2.9 Cuestiones resueltas ...104
2.10 Ejercicios propuestos ...106
2.10.1 Nivel fácil...106
2.10.2 Nivel intermedio...106
2.10.3 Nivel avanzado...106
Capítulo 3: Introducción al lenguaje C ...109
3.1 Conceptos básicos: datos, tipos de datos, variables y constantes...110
3.2 El compilador, la librería estándar y el preprocesador de C ...111
3.2.1 El compilador ...111
3.2.2 Librería estándar...111
3.2.3 El preprocesador de C ...113
3.2.3.1 Directiva #include...113
3.2.3.2 Directiva #define...114
3.3 Estructura general de un programa en C ...115
3.3.1 La función main()...116
3.4 Componentes sintácticos: tokens ...117
3.4.1 Identificadores...117
3.4.2 Palabras reservadas ...118
3.4.3 Constantes ...118
3.4.4 Operadores ...119
3.4.5 Comentarios ...119
3.5 Tipos de datos en C. Declaración de variables ...120
3.5.1 Declaración de variables ...121
3.5.2 Tipos de datos enteros y enteros sin signo (positivos) ...121
3.5.2.1 Constantes enteras...122
3.5.3 Tipos de datos reales (o de punto flotante)...123
3.5.4 El tipo de dato carácter...126
3.5.4.1 Constantes de tipo carácter ...127
3.5.5 El tipo void...127
3.5.6 Constantes de tipo cadena de caracteres...128
3.5.7 Conversiones de tipo implícitas y explícitas (casting) ...128
3.6 Operadores, expresiones y sentencias ...129
3.6.1 Operadores ...129 3.6.1.1 Operadores de asignación ...130 3.6.1.2 Operadores aritméticos ...131 3.6.1.3 Operadores incrementales ...132 3.6.1.4 Operadores relacionales ...133 3.6.1.5 Operadores lógicos...135 3.6.1.6 Otros operadores ...136 3.6.2 Expresiones ...137 3.6.2.1 Expresiones aritméticas...137 3.6.2.2 Expresiones lógicas...138 3.6.2.3 Expresiones generales ...138
3.6.3 Reglas de precedencia y asociatividad ...138
3.6.4 Sentencias...139
3.7 Funciones básicas de entrada/salida...140
3.7.1 Función printf()...140
3.7.2 Función scanf()...143
3.7.2.1 El buffer de teclado (stdin) ...144
3.7.3 Otras funciones de entrada/salida...146
3.8 Funciones matemáticas ...148
3.9 Ejercicios resueltos ...149
3.9.1 Corregir errores en un programa ...149
3.9.2 Pasar una palabra de cuatro letras a mayúscula ...149
3.9.3 Tiempo transcurrido en un viaje...152
3.9.4 Operaciones básicas con dos enteros ...152
3.9.5 Número de bytes de un tipo entero con signo y sin signo ...153
3.9.6 Distancia euclídea de dos puntos ...153
3.10 Cuestiones resueltas ...154
3.11 Ejercicios propuestos ...156
3.11.2 Nivel intermedio...157
3.11.3 Nivel avanzado...158
Capítulo 4: Estructuras de control...161
4.1 Estructura secuencial...161
4.2 Estructura de selección...162
4.2.1 Estructura de selección simple: if...163
4.2.2 Estructura de selección doble: if-else...164
4.2.3 Estructura de selección múltiple ...166
4.2.4 Estructura de selección anidadas...167
4.2.5 El operador condicional ?:...168
4.2.6 La sentencia switch...169
4.3 Estructuras repetitivas, iterativas o bucles ...172
4.3.1 El bucle while...173
4.3.2 El bucle do..while...174
4.3.3 El bucle for...176
4.3.4 Sentencias break y continue...178
4.4 Diseño de bucles ...180 4.4.1 Anidamiento de bucles ...180 4.4.2 Bucles infinitos...181 4.4.3 Contadores...181 4.4.4 Acumuladores ...182 4.4.5 Interruptores o centinelas ...183
4.4.6 Valores máximos y mínimos...183
4.5 Ejercicios resueltos ...184
4.5.1 Edad de una persona...184
4.5.2 Pascua de resurrección ...185 4.5.3 Pirámide ...187 4.5.4 Sucesión de Fibonacci...188 4.5.5 Número primo ...188 4.6 Cuestiones resueltas ...189 4.7 Ejercicios propuestos ...192 4.7.1 Nivel fácil...192 4.7.2 Nivel intermedio...193 4.7.3 Nivel avanzado...195
Capítulo 5: Subprogramas: Las Funciones en C ...197
5.1 El concepto de subprograma como abstracción de operaciones. ...198
5.2 Las funciones en C...199
5.2.1 Un ejemplo simple ...199
5.2.2 Definición y llamada a una función ...200
5.2.3 Ejemplo: factorial y números combinatorios ...202
5.3 Variables locales: Ámbito y visibilidad ...204
5.4 Declaración o prototipo de funciones ...205
5.5 ¿Dónde definir las funciones en C? ...206
5.6 Funciones de tipo void...207
5.7 Introducción a los punteros: Operadores de dirección e indirección ...209
5.7.1 Punteros: Concepto y declaración ...210
5.7.2 El operador de dirección &...211
5.7.3 El operador de indirección *...212
5.8 Paso de argumentos a funciones ...215
5.8.1 Paso de argumentos por valor ...215
5.8.1.1 Características del paso de argumentos por valor...217
5.8.2 Paso de argumentos por referencia...217
5.8.2.1 Características del paso de argumentos por referencia ...219
5.8.3 Paso de argumentos por referencia en C++...220
5.8.3 Resumen de los tipos de paso de argumentos ...221
5.9 Tipos de argumentos: De entrada, de salida, de entrada/salida...222
5.10 Variables globales ...223
5.11 Ejercicios resueltos ...224
5.11.1 Números amigos...224
5.11.2 Años bisiestos...225
5.11.3 Ecuación de segundo grado...225
5.11.4 Suma y multiplicación de números complejos...227
5.12 Cuestiones resueltas ...227
5.13 Ejercicios propuestos ...231
5.13.1 Nivel fácil...231
5.13.2 Nivel intermedio...235
Capítulo 6: Tipos de Datos Estructurados ...241
6.1 Datos estructurados frente a datos simples ...241
6.2 El tipo array...243
6.2.1 Arrays unidimensionales ...243
6.2.1.1 Declaración y acceso...243
6.2.1.2 Inicialización de arrays ...246
6.2.1.3 Asignación y comparación de arrays ...248
6.2.1.4 Nombres de arrays ...249
6.2.1.5 Aritmética de punteros ...250
6.2.1.6 Acceso a un array con punteros ...251
6.2.1.7 Arrays como argumentos en funciones ...254
6.2.2 Arrays multidimensionales...256
6.2.2.1 Concepto y declaración...256
6.2.2.2 Acceso a los elementos ...257
6.2.2.3 Inicialización de arrays ...258
6.2.2.4 Arrays multidimensionales como argumentos en funciones.260 6.3 Cadenas de caracteres ...262
6.3.1 Concepto y declaración...262
6.3.2 Lectura de cadenas de caracteres por teclado ...264
6.3.3 Escritura por pantalla ...265
6.3.4 Cadenas de caracteres como argumentos en funciones...266
6.3.5 Funciones relacionadas ...267
6.4 Estructuras o registros...270
6.4.1 Declaración, acceso e inicialización...270
6.4.2 Asignación y comparación de estructuras ...272
6.4.3 Punteros a estructuras...273
6.4.4 Estructuras como argumentos y retorno en funciones...274
6.5 Anidamiento de estructuras de datos estáticas ...277
6.5.1 Estructuras con campos de tipo estructura ...277
6.5.2 Estructuras con campos array...278
6.5.3 Arrays de estructuras...279
6.6 Algoritmos de búsqueda...280
6.6.1 Búsqueda secuencial o lineal...280
6.6.2 Búsqueda binaria ...282
6.7.1 Algoritmo de ordenación por selección ...283
6.8 Ejercicios resueltos ...285
6.8.1 Cálculos diversos en un array...285
6.8.2 Dígitos repetidos ...286
6.8.3 Borrar carácter en una cadena ...288
6.8.4 Insertar una cadena en otra...289
6.8.5 Distancia entre estaciones ...290
6.8.6 Colores de coches...292 6.8.7 Gestión de un videoclub...295 6.9 Cuestiones resueltas ...304 6.10 Ejercicios propuestos ...306 6.10.1 Nivel fácil...306 6.10.2 Nivel intermedio...307 6.10.3 Nivel avanzado...310 Capítulo 7: Ficheros ...313 7.1 Tipos de ficheros...314
7.1.1 Clasificación de ficheros según su contenido...314
7.1.1.1 Ficheros de texto ...314
7.1.1.2 Ficheros binarios ...316
7.1.2 Clasificación de ficheros según su acceso...316
7.1.2.1 Ficheros secuenciales ...316
7.1.2.2 Ficheros de acceso directo o aleatorio ...316
7.2 Operaciones básicas con ficheros ...317
7.2.1 El manejador de un fichero ...317
7.2.2 El indicador de posición de un fichero...318
7.2.3 Apertura de ficheros ...318
7.2.4 Cierre de ficheros ...320
7.2.5 Lectura y escritura en archivos de texto...322
7.2.5.1 Lectura y escritura de caracteres ...322
7.2.5.2 Lectura y escritura de cadenas de caracteres ...324
7.2.5.3 Lectura y escritura de datos, con formato...327
7.2.6 Detección del final del fichero ...329
7.2.8 Lectura y escritura en ficheros binarios ...332
7.2.9 Funciones para trabajar con ficheros de acceso directo ...335
7.3 Gestión de ficheros de texto secuenciales, estructurados en registros ...337
7.3.1 Definiciones, declaraciones y función principal ...338
7.3.2 Lectura y escritura de un registro, en un fichero de texto ...340
7.3.3 Lectura por teclado y escritura en pantalla de un registro ...341
7.3.4 Crear o inicializar un fichero ...342
7.3.5 Adición de un nuevo registro al final del fichero (alta) ...342
7.3.6 Búsqueda y visualización de un registro (consulta) ...343
7.3.7 Borrado de un registro (baja) ...343
7.3.8 Modificación de un registro (modificación)...345
7.3.9 Listado del fichero (listado) ...346
7.4 Gestión de ficheros binarios secuenciales, estructurados en registros ...346
7.5 Ejercicios resueltos ...347
7.5.1 Número de líneas de un fichero ...347
7.5.2 Copia de un fichero ...348
7.5.3 Escritura de los valores de un array en un fichero de texto ...349
7.5.4 Escritura de los valores de un array en un fichero binario ...349
7.5.5 Parejas de números ...350
7.5.6 Palabras y veces que aparecen ...352
7.5.7 Mezcla de ficheros ordenados ...354
7.5.8 Formula 1 ...356 7.6 Cuestiones resueltas ...362 7.7 Ejercicios propuestos ...364 7.7.1 Nivel fácil ...364 7.7.2 Nivel intermedio ...365 7.7.3 Nivel avanzado ...367 Capítulo 8: Recursividad ...373 8.1 Concepto de recursividad...373
8.2 Diseño y verificación de algoritmos recursivos ...376
8.2.1 Caso base múltiple ...377
8.2.2 Recursividad directa e indirecta ...378
8.3 Funcionamiento interno de los algoritmos recursivos ...380
8.3.2 Asignación dinámica de memoria ...381
8.3.3 La recursividad y la pila ...382
8.4 Iteración frente a recursión ...386
8.5 Ejemplos de algoritmos recursivos ...389
8.5.1 Búsqueda secuencial ...389
8.5.2 Búsqueda binaria ...390
8.5.3 El algoritmo de ordenación Quick Sort...391
8.5.4 Las Torres de Hanoi ...393
8.6 Cuestiones resueltas ...396
8.7 Ejercicios propuestos ...399
8.7.1 Nivel fácil...399
8.7.2 Nivel intermedio...400
8.7.3 Nivel avanzado...402
Capítulo 9 Gestión Dinámica de Memoria ...405
9.1 Tipos de datos estáticos y dinámicos. ...405
9.1.1 Tipos de datos estáticos...405
9.1.2 Tipos de datos dinámicos ...406
9.2 Gestión dinámica de memoria...406
9.2.1 Asignar y liberar bloques de memoria: las funciones malloc() y free()...406
9.2.2 La función calloc()...412
9.2.3 La función realloc()...414
9.3 Listas enlazadas diámicas ...416
9.3.1 Clasificación de las listas enlazadas...417
9.3.2 Operaciones...418
9.3.2.1 Declaración de los tipos de datos...418
9.3.2.2 Creación de la lista...419
9.3.2.3 Creación de un nodo ...419
9.3.2.4 Insertar un elemento en la lista ...420
9.3.2.5 Eliminar un elemento de la lista ...424
9.3.2.6 Número de elementos de la lista ...428
9.3.2.7 Buscar un elemento en la lista ...428
9.3.2.8 Imprimir los elementos de una lista...429
9.4 Ejercicios resueltos ...430
9.4.1 Agenda de contactos ...430
9.4.2 Numero de elementos de una lista (recursivamente)...432
9.4.3 Ordenar los elementos de una lista enlazada...432
9.4.4 Concatenar dos listas enlazadas ...433
9.4.5 Simplificación de las listas enlazadas (uso de typedef y paso por referencia de C++) ...435
9.5 Cuestiones resueltas ...437
9.6 Ejercicios propuestos ...438
9.6.1 Nivel fácil...438
9.6.2 Nivel intermedio...439
9.6.3 Nivel avanzado...441
Capítulo 10: Otros Conceptos ...445
10.1 Operadores a nivel de bits...445
10.2 Uniones ...447
10.3 Campos de bits ...449
10.4 Tipos de almacenamiento de variables ...450
10.5 Definición de macros con #define...451
10.6 Tipos enumerados: enum...453
10.7 Definición de tipos: typedef...454
10.8 Algunas características de C99 ...455
10.8.1 Ficheros de encabezamiento estándares ...456
10.8.2 Nuevos tipos de datos...456
10.8.3 Funciones inline...458
10.8.4 Arrays de longitud variable ...459
10.9 Simulación de números aleatorios ...460
10.10 Ejercicios resueltos ...461
10.10.1 Adivina un número aleatorio sin repetir...461
10.11 Cuestiones resueltas ...463
10.12 Ejercicios propuestos ...465
10.12.1 Nivel fácil...465
10.12.2 Nivel intermedio...467
Apéndice A: Normas de Estilo en C...471
A.1 Identificadores significativos. ...472
A.2 Constantes y macros...472
A.3 Comentarios. ...473
A.4 Estructura del programa. ...474
A.5 Indentación o sangrado. ...476
A.6 Presentación. ...477
Apéndice B: Soluciones a las Cuestiones de cada Capítulo ...481
B.1 Soluciones del Capítulo 1...481
B.2 Soluciones del Capítulo 2...482
B.3 Soluciones del Capítulo 3...483
B.4 Soluciones del Capítulo 4...484
B.5 Soluciones del Capítulo 5...485
B.6 Soluciones del Capítulo 6...487
B.7 Soluciones del Capítulo 7...488
B.8 Soluciones del Capítulo 8...489
B.9 Soluciones del Capítulo 9...490
B.10 Soluciones del Capítulo 10...491
Apéndice C: Tabla de Códigos ASCII ...493