




























































































Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Asignatura: Sistemas Operativos, Profesor: , Carrera: Ingeniería Informática + Administración y Dirección de Empresas, Universidad: URJC
Tipo: Apuntes
1 / 670
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!





























































































2" EDICiÓN REVISADA
Y 214 PROBLEMAS DE COMPRENSiÓN
,
La información contenida en este libro procede de la traducción de la segunda edición en inglés editada por McGraw-Hill Companies, Inc. No obstante, McGraw-Hill no garantiza la exactitud o perfección de la información publicada. Tampoco asume ningún tipo de garantía sobre los contenidos y las opiniones vertidas en dichos textos. Este trabajo se publica con el reconocimiento expreso de que se está proporcionando una información, pero no tratando de prestar ningún tipo de servicio profesional o técnico. Los procedimientos y la información que se presentan en este libro tienen sólo la intención de servir como guía general. McGraw-Hill ha solicitado los permisos oportunos para la realización y el desarrollo de esta obra.
PROGRAMACIÓN EN C. Segunda edición revisada No está permitida la reproducción total o parcial de este libro, ni su tratamiento informático, ni la transmisión de ninguna forma o por cualquier medio, ya sea electrónico, mecánico, por fotocopia, por registro u otros métodos, sin el permiso previo y por escrito de los titulares del Copyright.
McGraw-Hill/lnteramericana de España, S.A.U.
DERECHOS RESERVADOS © 2005, respecto a la segunda edición en español, por McGRAW-HILLIINTERAMERICANA DE ESPAÑA, S. A. U. Edificio Valrealty, .' planta Basauri, 17 28023 Aravaca (Madrid)
Traducido de la segunda edición en inglés de PROGRAMMING WITH C
http://www.mcgraw-hill.es [email protected]
Copyright © MCMXCVI, por McGraw-Hill Companies, Inc. ISBN: 0-07024-035-
ISBN: 84-481-9846-80- Depósito legal: M. 0.000-
Editores: Concepción Femández I Carmelo Sánchez Compuesto en Puntographic, S. L.
IMPRESO EN MEXICO - PRINTED IN MEXICO
Esta obra se term'mó de Imprimir en Febrero de 2005 en Programas Educativos, SA de C.v. Calz. Chabacano No. 65- A Col. Asturias, C.P. 06850, Méx. D.F. Empresa Certificada por el Institulo Mexicano de Normalización y Cel1ificaciónA.C., bajo la Norma JSO-9002:1994/NMX-CC-004: 1995 con el núm. de Registro RSC-048 y bajo la Norma ISO-14001-1996fNMX-SAA-001: 19981MNC con el núm. de Registro RSAA-
Ejemplos completos de programas ix
X EJEMPLOS COMPLETOS DE PROGRAMA
36. Actualización de registros de clientes - Ejemplos 11.14, 11. 37. Localización de registros de clientes - Ejemplo 11. 38. Procesamiento de una lista enlazada - Ejemplo 11. 39. Elevación de un número a una potencia - Ejemplos 11.37, 14. 40. Creación de un archivo de datos (conversión de texto de minúsculas a mayúsculas) - Ejem- plo 12. 41. Lectura de un archivo de datos - Ejemplos 12.4, 14. 42. Creación de un archivo que contiene registros de clientes - Ejemplo 12. 43. Actualización de un archivo que contiene registros de clientes - Ejemplo 12. 44. Creación de un archivo de datos sin formato que contiene registros de clientes - Ejem- plo 12. 45. Actualización de un archivo de datos sin formato que contiene registros de clientes - Ejem- plo 12. 46. Presentación de patrones de bits - Ejemplo 13. 47. Compresión de datos (almacenamiento de nombres y fechas de nacimiento) - Ejemplo 13.
Prólogo
Desde la publicación de la primera edición de este libro, la popularidad de C ha seguido aumen- tando. La mayoría de los últimos compiladores aparecidos proporcionan numerosas ampliaciones al estándar ANSI 1989, así como entornos de programación gráficos muy sofisticados que inclu- yen un depurador, un gestor de proyectos y una ayuda en línea muy detallada. Más aún, el interés de C no ha disminuido por la aparición de C++, debido a que las características de este novedoso lenguaje de programación exigen un sólido conocimiento de C. Esta segunda edición instruye en el uso del lenguaje C, dentro del contexto del estilo de programación de C contemporáneo. Incluye explicaciones completas y comprensibles de las fa- cetas de C de uso más común, incluidas las del estándar ANSI actual. Además, el libro presenta un enfoque moderno de la programación, insistiendo en la importancia de la claridad, legibili- dad, modularidad y eficiencia en el diseño de los programas. Se le presentan al lector de esta forma los principios de la buena programación, así como las reglas específicas del C. Aparecen programas en C completos por todo el libro, a partir del primer capítulo. Se pone especial énfasis en el uso de un estilo de programación interactivo. El libro puede ser usado por una gran variedad de lectores, desde programadores que estén iniciándose hasta los profesionales expertos. Se adapta bien como libro de texto a un curso de introducción a la programación para estudiantes a nivel universitario, o como un texto comple- mentario, o independientemente, como una eficiente guía. Se incluyen mucho ejemplos como parte principal del texto. Éstos incluyen a su vez numero- sos ejemplos de programación de complejidad variable, así como ilustrativos problemas tipo ejercicio que se adaptan al estándar ANSI C. Muchos de los ejemplos se encuentran resueltos en otros lenguajes de programación en los libros correspondientes de la serie Schaum, proporcio- nando de esta forma al lector una base para la comparación de varios lenguaj es populares. Al final de cada capítulo aparecen conjuntos de cuestiones de repaso y ejercicios. Las cuestio- nes de repaso permiten al lector probar la asimilación del material presentado en cada capítulo. Aportan también un eficaz resumen del mismo. Los ejercicios refuerzan los principios presenta- dos en cada capítulo. El lector debería resolver el mayor número posible de estos problemas. Al final del libro aparecen las soluciones a la mayoría de los ejercicios. Los problemas que requieren la escritura de programas completos escritos en C se presentan al final de cada capítulo, a partir del número cinco. Se insta al lector a escribir y ejecutar el mayor número posible de estos programas. Esto aumentará de forma considerable la confianza en sí mismo y estimulará su interés por el tema. (Para la programación se necesita habilidad, igual que para escribir un libro o tocar un instrumento musical. Esta habilidad no se adquiere simple- mente leyendo un libro de texto.) La mayoría de estos problemas de programación no requieren conocimientos matemáticos o técnicos especiales. Pueden, por tanto, ser resueltos por un amplio espectro de lectores. En caso de utilizar este libro en un curso de programación, es posible que el instructor desee añadir a estos problemas otros que resulten de especial interés en determinadas disciplinas. Se han realizado una serie de cambios con respecto a la edición anterior. Se ha escrito de nuevo el Capítulo 5, con la utilización del entorno de programación Turbo C++ de Borland
xi
Conceptos básicos
Este libro instruye en la programación de computadoras en un lenguaje popular y estructurado: el lenguaje C. Además, veremos cómo analizar problemas que son descritos inicialmente en términos muy generales, cómo esbozados y cómo obtener finalmente programas e bien organi- zados. La multitud de problemas de ejemplo que incluye el texto muestran con detalle estos conceptos.
Las computadoras de hoy día se presentan en una amplia variedad de formas. Su rango se ex- tiende desde los «mainframes» (grandes computadoras) y supercomputadoras masivas y mul- tipropósito hasta las computadoras personales de escritorio. Entre ambos extremos nos encon- tramos con un inmenso conjunto de minicomputadoras y estaciones de trabajo. Las grandes minicomputadoras se aproximan a los «mainframes» en potencia de cálculo, mientras que las estaciones de trabaj o son potentes computadoras personales. Los «mainframes» y las grandes minicomputadoras se utilizan en muchos negocios, univer- sidades, hospitales y agencias gubernamentales para desarrollar sofisticados cálculos científicos y financieros. Estas computadoras son muy caras (las grandes cuestan millones (^) de dólares) y requieren una plantilla grande de personal para su funcionamiento, así como un entorno especial y cuidadosamente controlado. Por otro lado, las computadoras personales son pequeñas y baratas. De hecho, en la actuali- dad muchos estudiantes y profesionales que viajan con frecuencia utilizan mucho computadoras «portátiles» con batería incorporada y con un peso inferior a 2 o 3 kilogramos. En muchas es- cuelas y empresas se utilizan ampliamente las computadoras personales, que se han convertido en elementos de uso doméstico. La mayoría de los estudiantes utilizan computadoras personales cuando aprenden a programar en C. La Figura 1.1 muestra a un estudiante trabajando con una computadora portátil. A pesar de su pequeño tamaño y bajo precio, las modernas computadoras personales rivali- zan en potencia de computación con muchas minicomputadoras. Ahora se utilizan para muchas aplicaciones que antes se realizaban en computadoras más grandes y más caras. Más aún, su potencia aumenta a la vez que su precio disminuye progresivamente. El diseño de una computa- dora personal permite un alto nivel de interacción entre el usuario y la computadora. Muchas aplicaciones (por ejemplo procesadores de texto, programas de tratamiento de gráficos, hojas de cálculo y programas de gestión de bases de datos) están especialmente diseñadas para sacar
1
2 PROGRAMACiÓN EN C
Figura 1.1.
partido de este entorno, proporcionando al usuario entrenado una amplia variedad de herramien- tas creativas para escribir, dibujar o realizar cálculos numéricos. Las aplicaciones con gráficos de alta resolución son también frecuentes. Muchas veces se conectan computadoras personales con grandes computadoras o con otras computadoras personales, permitiendo su utilización bien como dispositivos autónomos o bien como terminales en una red de computadoras. Son frecuentes también las conexiones a través de líneas telefónicas. Dentro de este contexto, podemos ver que las computadoras personales tien- den a complementar más que a reemplazar a las grandes computadoras.
Todas las computadoras digitales, independientemente de su tamaño, son básicamente dispositi- vos electrónicos que pueden transmitir, almacenar y manipular información (datos). Una com- putadora puede procesar distintos tipos de datos. Esto incluye datos numéricos, alfanuméricos (nombres, direcciones, etc.), gráficos (mapas, dibujos, fotografías, etc.) y sonido (música, lectu- ra de textos, etc.). Desde el punto de vista del programador recién iniciado, los dos tipos de datos más familiares son los números y los caracteres. Las aplicaciones científicas y técnicas involu- cran principalmente datos numéricos, .mientras que las aplicaciones empresariales normalmente requieren procesar tanto datos numéricos como alfanuméricos. Para que la computadora procese un conjunto particular de datos es necesario darle un con- junto apropiado de instrucciones llamado programa. Estas instrucciones se introducen en la com- putadora y se almacenan en una parte de la memoria de la máquina.
4 PROGRAMACiÓN EN C
bit número: 7 6 5 4 3 2 1 O
m UIIIJ Un byte
Figura 1.2.
Normalmente se expresa el tamaño de la memoria computadora como algún múltiplo de 2 10 = 1024 by-tes; esto es, lK. Las computadoras personales actuales tienen memorias de tamaños comprendidos típicamente entre 256 y 1024 megabytes, siendo 1 megabyte (1M) equivalente a 2 10 • 2 10 bytes, o 2 1 °K = 1024 Kbytes.
EJEMPLO 1.2. La memoria de una computadora personal tiene una capacidad de 16Mbytes. Asi pues, se pueden almacenar en su memoria 16. 1024. 1024 = 16 777 216 caracteres y/o instrucciones. Si se utiliza la memoria completa para representar caracteres (lo cual es poco probablel, entonces se podrán almacenar unos 200 000 nombres y direcciones a la vez, suponiendo unos 80 caracteres por cada nombre y dirección. Si se utiliza la memoria para almacenar datos numéricos en vez de nombres y direcciones, se podrán almacenar más de 4 millones de números a la vez, suponiendo que cada cantidad numérica requiera 4 bytes de memoria.
Las grandes computadoras tienen memorias organizadas en palabras en lugar de bytes. Cada palabra tendrá un número relativamente grande de bits, típicamente 32 o 36. En la Figura 1.3 apa- rece la organización a nivel de bits de una palabra de 32 bits. Nótese que los bits están numerados, comenzando por el O(el bit del extremo derecho) y finalizando en 31 (el bit del extremo izquierdo).
bit n.":31302928272625242322212019181716151413121110 9876543210
Una palabra de 32 bits
Figura 1.3.
La Figura lA muestra la misma palabra de 32 bits organizada en cuatro bytes consecutivos. Los bytes están numerados de la misma forma que los bits individuales, de O(el byte del extremo derecho) a 3 (el byte del extremo izquierdo). El uso de palabras de 32 o 36 bits permite representar una cantidad numérica o un pequeño grupo de caracteres en una sola palabra de memoria. Normalmente las grandes computadoras tienen varios millones de palabras (varias megapalabras) de memoria.
bit n.": 31 302928 27262524232221 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 O
Una palabra de 4 bytes (32 bits)
Figura 1.4.
CONCEPTOS BÁSICOS 5
EJEMPLO 1.3. La memoria de una gran computadora tiene una capacidad de 32M (32 768K) palabras, lo que es equivalente a 32. 1024. 1024 = 33 554 432 palabras. Si se usa la memoria entera para represen- tar datos numéricos (lo cual no es muy probable), entonces se podrán almacenar en la computadora más de 33 mi110nes de números a la vez, suponiendo que cada cantidad numérica requiera una palabra de memoria. Si se utiliza la memoria completa para representar caracteres en lugar de datos numéricos, se podrán almacenar más de 130 mi110nes de caracteres a la vez, suponiendo 4 caracteres por palabra. Esta memoria es suficiente para almacenar los contenidos de varios libros voluminosos.
La mayoría de las computadoras utilizan también dispositivos auxiliares de almacenamiento (por ejemplo cintas magnéticas, discos, dispositivos ópticos de memoria) además de la memoria principal. Estos dispositivos pueden almacenar gigabytes (lG = 1024M) de información. Ade- más, permiten que se grabe permanentemente la información, pudiendo normalmente ser desco- nectados de la computadora y almacenados cuando no se utilicen. Sin embargo, el tiempo de acceso (el tiempo necesario para almacenar o recuperar información) de estos dispositivos auxi- liares suele ser considerablemente mayor que el de la memoria principal de la computadora.
Velocidad y fiabilidad
Gracias a su velocidad extremadamente alta, una computadora puede efectuar en unos pocos minutos cálculos que requerirían muchos días, posiblemente meses o años, si se hiciesen a mano. Por ejemplo, se pueden procesar las calificaciones de final de semestre de todos los estudiantes de una gran universidad en unos pocos minutos de tiempo de cómputo. El tiempo requerido para efectuar tareas de cálculo sencillas, como sumar dos números, se expresa habitualmente en microsegundos (1 IJ.seg = 10-^6 seg) o nanosegundos (l nseg = = 10-^3 IJ.seg = 10-^9 seg). Por tánto, si una computadora puede sumar dos números en 10 nano- segundos (típico de una computadora media actual), puede efectuar 100 millones (lO') de sumas en un segundo. Esta alta velocidad es acompañada por un nivel equivalente de fiabilidad. Una computadora nunca cometerá un error por sí misma. Los tan divulgados «errores de computadoras», tales como que a una persona se le cargue un recibo de teléfono de varios millones de dólares, son el resultado de errores de programación o de errores en la introducción de datos, y no causados por la propia computadora.
Una gran computadora puede ser compartída por muchos usuarios de dos formas diferentes. Éstas son el modo de procesamiento por lotes y el modo interactivo. Cada modo tiene sus pro- pias ventajas para ciertos tipos de problemas.
Procesamiento por lotes
En el procesamiento por lotes se cargan una serie de tareas en la computadora, se almacenan internamente y luego se procesan secuencialmente. (Una tarea es un programa y sus conjuntos de datos de entrada asociados.) Tras ser procesada la tarea, una impresora de alta velocidad imprime en múltiples hojas de papel la salida junto con el listado del programa. Normalmente el
CONCEPTOS BÁSICOS 7
tiempo de cómputo. Muchas aplicaciones de las escuelas y de las oficinas comerciales presentan estas características. Utilizando el tiempo compartido se pueden procesar tales aplicaciones de una forma rápida, fácil y barata.
EJEMPLO 1.4. Una gran universidad dispone de una computadora de tiempo compartido con capaci- dad para 200 terminales y 80 conexiones telefónicas separadas. Los terminales situados en diferentes lu- gares del campus están conectados directamente a un gran «mainframe». Cada terminal es capaz de trans- mitir información a o desde la computadora central a una velocidad máxima de 960 caracteres por segundo. Las conexiones telefónicas permiten a estudiantes que no se encuentran en el campus conectar sus computadoras personales a la computadora centra!. Cada computadora personal puede transmitir datos a o desde la computadora central a una velocidad máxima de 240 caracteres por segundo. Asi pues, los 280 terminales y computadoras pueden interactuar con la computadora central a la vez, estando cada estudian- te despreocupado de que los demás están compartiendo al mismo tiempo la computadora.
Computación interactiva
La computación interactiva es un tipo de entorno de computación que surgió con los sistemas de tiempo compartido comerciales y que ha sido mejorado con el amplio uso de las computadoras personales. En un entorno de computación interactivo, durante la sesión de trabajo existe inter- acción entre el usuario y la computadora. De este modo, el usuario será consultado periódica- mente para que proporcione cierta información, la cual determinará las acciones pertinentes a realizar por la computadora y viceversa.
EJEMPLO 1.5. Un estudiante desea usar una computadora personal para calcular el radio de un círculo cuya área tiene el valor de 100. Se dispone de un programa que calcula el área del círculo, dado el radio. (Nótese que esto es justo lo contrario de lo que el estudiante desea hacer.) Este programa no es exactamen- te lo que necesita, pero permite al estudiante proceder por el método de prueba y error. El procedimiento consistirá en adivinar un valor para el radio y luego calcular el área correspondiente. El procedimiento de prueba y error continuará hasta que el estudiante encuentre un valor del radio para que el área sea lo suficientemente próxima a 100. Una vez que comienza la ejecución del programa, aparece el mensaje
Radio ~?
Entonces el estudiante introduce un valor del radio. Supongamos que da un valor de 5. La computado- ra responderá presentando:
Area ~ 78. ¿Deseas repetir el cálculo?
El estudiante responde sí o no. Si el estudiante dice sí, entonces aparece de nuevo el mensaje:
Radio ~?
y se repetirá de .nuevo el proceso. Si el estudiante dice no, entonces se presenta en la pantalla:
Adiós
y finaliza la ejecución del programa.
8 PROGRAMACiÓN EN C
A continuación se muestra una copia impresa de la información presentada durante una sesión interac- tiva típica, usando el programa antes descrito. En esta sesión se determina un valor aproximado de r = 5. 6 después de sólo tres cálculos. Se ha subrayado la información aportada por el estudiante.
Area = 78. ¿Deseas repetir el cálculo? sí
Area = 113. ¿Deseas repetir el cálculo? sí
Area = 98. ¿Deseas repetir el cálculo? no Adiós
Nótese la forma en que parecen conversar la computadora y el estudiante. Observe también cómo el estudiante espera hasta que ve el valor del área calculado antes de decidir si continúa o no haciendo cálcu- los. Si se inicia otro nuevo cálculo, el nuevo valor del radio que proporcione el estudiante dependerá de los resultados de cálculos anteriores.
A veces los programas diseñados para aplicaciones de tipo interactivo se denominan conver- sacionales. Los juegos de computadoras son excelentes ejemplos de aplicaciones de este tipo. En ellos aparecen elaborados gráficos y acciones rápidas, aun cuando las respuestas del usuario son más de tipo reflejo que numéricas o verbales.
Se pueden utilizar muchos lenguajes para programar una computadora. El más básico es el len- guaje máquina, una colección de instrucciones muy detalladas y crípticas que controlan la cir- cuitería interna de la máquina. Éste es el dialecto natural de la computadora. Muy pocos progra- mas se escriben actualmente en lenguaje máquina por dos razones importantes: primero, porque el lenguaje máquina es muy incómodo para trabajar, y segundo, porque la mayoría de las máqui- nas tienen sus repertorios de instrucciones propios. Así, un programa escrito en lenguaje má- quina para una computadora no puede ser ejecutado en otra de distinto tipo sin modificaciones importantes. Lo más frecuente es utilizar lenguajes de alto nivel, cuyas instrucciones son más compatibles con los lenguajes y la forma de pensar humanos. La mayoría son lenguajes de propósito general, como C. (Otros lenguajes de propósíto general son Pascal, Fortran y BASrC.) Hay también len- guajes de propósito especial que están diseñados específicamente para algún tipo particular de aplicación. Algunos ejemplos comunes son CSMP y SrMAN, que son lenguajes orientados a la simulación, y LISP, un lenguaje orientado al tratamiento de listas que se utiliza ampliamente en aplicaciones de inteligencia artificial. Por norma general, una sola instrucción de un lenguaje de alto nivel será equivalente a varias de lenguaje máquina. Esto simplifica enormemente la tarea de escribir programas completos y