Programacion en c de byron

670

Click here to load reader

description

este es un muy buen libro para empezar a programar en c

Transcript of Programacion en c de byron

  • 2" EDICiNREVISADA

    APRUEBA TU EXAMEN CON SCHAUM!!

    Byron GottfriedREDUCE TU TIEMPO DE ESTUDIO

    332 EJEMPLOS DETALLADOS, 450 CUESTIONES DE REPASOY 214 PROBLEMAS DE COMPRENSiN

    705 PROBLEMAS PROPUESTOS

    8 APNDICES QUE RESUMEN LA SINTAXIS DEL LENGUAJE

    Utilizado pOI'millones de

    udiantesyomendadoI'ofesol'esde todo el

    mundo

  • ,PROGRAMACION EN CSegunda edicin revisada

  • ,PROGRAMACION EN CSegunda edicin revisada

    BYRON s. GOTTFRIEDProfesor de Ingeniera Industrial

    Universidad de Pittsburgh

    Traduccin:JOS RAFAEL GARCA LZARO

    Dpto. Lenguajes y ComputacinUniversidad de Almera

    Revisin tcnica:ALFONSO BOSCH ARN

    Dpto. Lenguajes y ComputacinUniversidad de Almera

    MADRID. BUENOS AIRES CARACAS GUATEMALA LISBOA. MXICONUEVA YORK PANAM. SAN JUAN SANTAF DE BOGOT SANTIAGO SO PAULO

    AUCKLAND HAMBURGO LONDRES MILN MONTREAL NUEVA DELHIPARIS SAN FRANCISCO SIONEY. SINGAPUR STo LOUIS TOKIO. TORONTO

  • La informacin contenida en este libro procede de la traduccin de la segunda edicin en ingls editada porMcGraw-Hill Companies, Inc. No obstante, McGraw-Hill no garantiza la exactitud o perfeccin de lainformacin publicada. Tampoco asume ningn tipo de garanta sobre los contenidos y las opiniones vertidasen dichos textos.

    Este trabajo se publica con el reconocimiento expreso de que se est proporcionando una informacin, perono tratando de prestar ningn tipo de servicio profesional o tcnico. Los procedimientos y la informacinque se presentan en este libro tienen slo la intencin de servir como gua general.

    McGraw-Hill ha solicitado los permisos oportunos para la realizacin y el desarrollo de esta obra.

    PROGRAMACIN EN C. Segunda edicin revisadaNo est permitida la reproduccin total o parcial de este libro, ni su tratamiento informtico, ni latransmisin de ninguna forma o por cualquier medio, ya sea electrnico, mecnico, por fotocopia, porregistro u otros mtodos, sin el permiso previo y por escrito de los titulares del Copyright.

    McGraw-Hill/lnteramericanade Espaa, S.A.U.

    DERECHOS RESERVADOS 2005, respecto a la segunda edicin en espaol, porMcGRAW-HILLIINTERAMERICANA DE ESPAA, S. A. U.Edificio Valrealty, \.' plantaBasauri, 1728023 Aravaca (Madrid)

    Traducido de la segunda edicin en ingls dePROGRAMMING WITH C

    http://[email protected]

    Copyright MCMXCVI, por McGraw-Hill Companies, Inc.ISBN: 0-07024-035-3

    ISBN: 84-481-9846-80-1Depsito legal: M. 0.000-2005

    Editores: Concepcin Femndez I Carmelo SnchezCompuesto en Puntographic, S. L.

    IMPRESO EN MEXICO - PRINTED IN MEXICO

    Esta obra se term'm deImprimir en Febrero de 2005 en

    Programas Educativos, SA de C.v.Calz. Chabacano No. 65- A

    Col. Asturias, C.P. 06850, Mx. D.F.Empresa Certificada por el Institulo Mexicanode Normalizacin y Cel1ificacinA.C., bajo la

    Norma JSO-9002:1994/NMX-CC-004: 1995 conel nm. de Registro RSC-048 y bajo la NormaISO-14001-1996fNMX-SAA-001: 19981MNC

    con el nm. de Registro RSAA-003

  • Contenido

    Ejemplos completos de programas ix

    Prlogo xi

    1. Conceptos bsicos........................................................................................................... 11.1. Introduccin a las computadoras 11.2. Caractersticas de las computadoras 21.3. Modos de operacin 5lA. Tipos de lenguajes de programacin 81.5. Introduccin al C 91.6. Algunos programas sencillos en C 131.7. Caractersticas deseables de un programa 23

    2. Conceptos bsicos de C ,...................................................... 312.1. El conjunto de caracteres de C 312.2. Identificadores y palabras reservadas 322.3. Tipos de datos 332A. Constantes 352.5. Variables y arrays 432.6. Declaraciones 452.7. Expresiones 492.8. Instrucciones 502.9. Constantes simblicas 51

    3. Operadores y expresiones 593.1. Operadores aritmticos 593.2. Operadores unarios 653.3. Operadores relacionales y lgicos 683A. Operadores de asignacin 713.5. El operador condicional.................................................................................... 753.6. Funciones de biblioteca 77

    4. Entrada y salida de datos 874.1. Introduccin 874.2. Entrada de un carcter - La funcin getchar 884.3. Salida de un carcter - La funcin putchar 894A. Introduccin de datos - La funcin scanf ;........................... 914.5. Ms sobre la funcin scanf 964.6. Escritura de datos - La funcin printf 1014.7. Ms sobre la funcin printf ;........................................... 107

    v

  • vi CONTENIDO

    4.8. Las funciones gets y puts............................................................................. 1144.9. Programacin interactiva (conversacional) 114

    5. Preparacin y ejecucin de un programa en e 1275.1. Planificacin de un programa en C 1275.2. Escritura de un programa en C 1295.3. Introduccin de un programa en la computadora 1315.4. Compilacin y ejecucin de un programa 1335.5. Mensajes de error 1355.6. Tcnicas de depuracin 140

    6. Instrucciones de control................................................................................................ 1536.1. Introduccin....................................................................................................... 1536.2. Ejecucin condicional: La instruccin if - el se 1566.3. Bucles: la instruccin while 1596.4. Ms sobre bucles: la instruccin do - while 1636.5. Ms an sobre bucles: la instruccin for 1666.6. Estructuras de control anidadas 1706.7. La instruccin swi tch 1816.8. La instruccin break 1906.9. La instruccin continue 1936.10. El operador coma 1956.11. La instruccin gota.......................................................................................... 199

    7. Funciones 2177.1. Introduccin 2187.2. Definicin de una funcin 2197.3. Acceso a una funcin........................................................................................ 2237.4. Prototipos de funciones 2267.5. Paso de argumentos a una funcin 2357.6. Recursividad 241

    8. Estructura de un programa 2578.1. Tipos de almacenamiento 2578.2. Variables automticas :..................... 2588.3. Variables externas (globales) 2618.4. Variables estticas 2688.5. Programas de varios archivos 2728.6. Ms sobre funciones de biblioteca ;.... 282

    . 9. Arrays 2999.1. Definicin de un array 3009.2. Procesamiento de un array 3059.3. Paso de arrays a funciones 3089.4. Arrays multidimensionales 3219.5. Arrays y cadenas de caracteres........................................................................ 328

  • CONTENIDO vii

    10. Punteros 34510.1. Conceptos bsicos 34510.2. Declaracin de punteros 34910.3. Paso de punteros a una funcin 35010A. Punteros y arrays unidimensionales. 35810.5. Asignacin dinmica de memoria 36310.6. Operaciones con punteros 36510.7. Punteros y arrays mu1tidimensiona1es 36910.8. Arrays de punteros 37510.9. Paso de funciones a otras funciones 38810.10. Ms sobre declaraciones de punteros 397

    11. Estructuras y uniones 41511.1. Definicin de una estructura 41511.2. Procesamiento de una estructura 42111.3. Tipos de datos definidos por el usuario (typedef) 4331104. Estructuras y punteros 43611.5. Paso de estructuras a una funcin 44111.6. Estructuras autorreferenciadoras 45311.7. Uniones 467

    12. Archivos de datos 48912.1. Apertura y cierre de un archivo 49012.2. Creacin de un archivo 49212.3. Procesamiento de un archivo 4991204. Archivos sin formato 505

    13. Programacin a bajo nivel 51913.1. Variables registro 51913 .2. Operaciones a nivel de bits 52313.3. Campos de bits 535

    14. Caractersticas adicionales de C 55314.1. Enumeraciones 55314.2. Parmetros de la lnea de rdenes 55914.3. Ms sobre funciones de biblioteca 5631404. Macros 56314.5. El preprocesador de C 573

    Apndice A Sistemas de representacin de nmeros 585

    Apndice B Secuencias de escape 587

    Apndice C Resumen de operadores.. 589

    Apndice D Tipos de datos y reglas de conversin de datos 591

  • viii CONTENIDO

    Apndice E El conjunto de caracteres ASCII 593

    Apndice F Resumen de instrucciones de control............. 595

    Apndice G Caracteres de conversin ms usados de scanf y printf 597Caracteres de conversin de scanf 597Caracteres de conversin de printf 598Indicadores 599

    Apndice H Funciones de biblioteca ms usadas 601

    Respuestas a problemas seleccionados 607

    ndice 649

  • Ejemplos completos de programas

    A continuacin se listan los ejemplos de programas segn el orden en que aparecen en el texto.Los ejemplos van desde los ms sencillos a los de complejidad moderada. Se presentan variasversiones de algunos de ellos, en especial de los ms sencillos.

    1. Area de un circulo - Ejemplos 1.6 - 1.132. Conversin de un carcter de minscula a mayscula - Ejemplos 3.31, 7.13. Conversin de texto en minsculas a maysculas - Ejemplos 4.4, 6.9, 6.12, 6.16, 9.24. Lectura y escritura de una lnea de texto - Ejemplos 4.19, 4.315. Calificaciones medias de los estudiantes - Ejemplo 4.326. Clculo del inters compuesto - Ejemplos 5.1 - 5.4, 8.137. Errores sintcticos - Ejemplo 5.58. Errores de ejecucin (Races reales de una ecuacin de segundo grado) - Ejemplo 5.69. Depuracin de un programa - Ejemplo 5.7

    10. Depuracin con un depurador interactivo - Ejemplo 5.811. Generacin de cantidades enteras consecutivas - Ejemplos 6.8, 6.11, 6.14, 6.1512. Media de una lista de nmeros - Ejemplos 6.10, 6.13, 6.17, 6.3113. Repeticin de la media de una lista de nmeros - Ejemplo 6.1814. Conversin de varias lneas de texto a maysculas - Ejemplos 6.19, 6.3415. Codificacin de una cadena de caracteres - Ejemplo 6.2016. Clculos repetidos del inters compuesto con deteccin de error - Ejemplo 6.2117. Solucin de una ecuacin algebraica - Ejemplo 6.2218. Clculo de la depreciacin - Ejemplos 6.26, 7.1319. Bsqueda de palndromos - Ejemplo 6.3220. Mayor de tres cantidades enteras - Ejemplo 7.921. Clculo defactoriales - Ejemplos 7.10, 7.14, 8.222. Simulacin de un juego de azar (

  • X EJEMPLOS COMPLETOS DE PROGRAMA

    36. Actualizacin de registros de clientes - Ejemplos 11.14, 11.2837. Localizacin de registros de clientes - Ejemplo 11.2638. Procesamiento de una lista enlazada - Ejemplo 11.3239. Elevacin de un nmero a una potencia - Ejemplos 11.37, 14.540. Creacin de un archivo de datos (conversin de texto de minsculas a maysculas) - Ejem-

    plo 12.341. Lectura de un archivo de datos - Ejemplos 12.4, 14.942. Creacin de un archivo que contiene registros de clientes - Ejemplo 12.543. Actualizacin de un archivo que contiene registros de clientes - Ejemplo 12.644. Creacin de un archivo de datos sin formato que contiene registros de clientes - Ejem-

    plo 12.745. Actualizacin de un archivo de datos sin formato que contiene registros de clientes - Ejem-

    plo 12.846. Presentacin de patrones de bits - Ejemplo 13 .1647. Compresin de datos (almacenamiento de nombres y fechas de nacimiento) - Ejemplo 13.23

  • Prlogo

    Desde la publicacin de la primera edicin de este libro, la popularidad de C ha seguido aumen-tando. La mayora de los ltimos compiladores aparecidos proporcionan numerosas ampliacionesal estndar ANSI 1989, as como entornos de programacin grficos muy sofisticados que inclu-yen un depurador, un gestor de proyectos y una ayuda en lnea muy detallada. Ms an, el intersde C no ha disminuido por la aparicin de C++, debido a que las caractersticas de este novedosolenguaje de programacin exigen un slido conocimiento de C.

    Esta segunda edicin instruye en el uso del lenguaje C, dentro del contexto del estilo deprogramacin de C contemporneo. Incluye explicaciones completas y comprensibles de las fa-cetas de C de uso ms comn, incluidas las del estndar ANSI actual. Adems, el libro presentaun enfoque moderno de la programacin, insistiendo en la importancia de la claridad, legibili-dad, modularidad y eficiencia en el diseo de los programas. Se le presentan al lector de estaforma los principios de la buena programacin, as como las reglas especficas del C. Aparecenprogramas en C completos por todo el libro, a partir del primer captulo. Se pone especial nfasisen el uso de un estilo de programacin interactivo.

    El libro puede ser usado por una gran variedad de lectores, desde programadores que estninicindose hasta los profesionales expertos. Se adapta bien como libro de texto a un curso deintroduccin a la programacin para estudiantes a nivel universitario, o como un texto comple-mentario, o independientemente, como una eficiente gua.

    Se incluyen mucho ejemplos como parte principal del texto. stos incluyen a su vez numero-sos ejemplos de programacin de complejidad variable, as como ilustrativos problemas tipoejercicio que se adaptan al estndar ANSI C. Muchos de los ejemplos se encuentran resueltos enotros lenguajes de programacin en los libros correspondientes de la serie Schaum, proporcio-nando de esta forma al lector una base para la comparacin de varios lenguaj es populares.

    Al final de cada captulo aparecen conjuntos de cuestiones de repaso y ejercicios. Las cuestio-nes de repaso permiten al lector probar la asimilacin del material presentado en cada captulo.Aportan tambin un eficaz resumen del mismo. Los ejercicios refuerzan los principios presenta-dos en cada captulo. El lector debera resolver el mayor nmero posible de estos problemas. Alfinal del libro aparecen las soluciones a la mayora de los ejercicios.

    Los problemas que requieren la escritura de programas completos escritos en C se presentanal final de cada captulo, a partir del nmero cinco. Se insta al lector a escribir y ejecutar elmayor nmero posible de estos programas. Esto aumentar de forma considerable la confianza ens mismo y estimular su inters por el tema. (Para la programacin se necesita habilidad, igualque para escribir un libro o tocar un instrumento musical. Esta habilidad no se adquiere simple-mente leyendo un libro de texto.)

    La mayora de estos problemas de programacin no requieren conocimientos matemticos otcnicos especiales. Pueden, por tanto, ser resueltos por un amplio espectro de lectores. En casode utilizar este libro en un curso de programacin, es posible que el instructor desee aadir aestos problemas otros que resulten de especial inters en determinadas disciplinas.

    Se han realizado una serie de cambios con respecto a la edicin anterior. Se ha escrito denuevo el Captulo 5, con la utilizacin del entorno de programacin Turbo C++ de Borland

    xi

  • xii PRLOGO

    International para ilustrar el uso del C, y se ha redactado de nuevo y ampliado el materialcorrespondiente a las tcnicas de depuracin. Se han reordenado los tpicos del Captulo 6 demanera que se corresponden con el orden en que se suelen presentar en la mayora de los cursosde introduccin a la programacin, con la bifurcacin antes de los bucles. Se ha eliminado delCaptulo 7 parte del material sobre el uso de las funciones, el cual reflejaba un estilo de progra-macin obsoleto, y se ha aadido al Captulo 10 una seccin sobre asignacin dinmica de memo-ria. En la mayora de los ejemplos de programacin se han realizado cambios de estilo; msconcretamente, los programas que utilizan varias funciones hacen ahora especial nfasis en elprototipado completo de la funcin, tal y como recomienda el estndar ANSI actual.

    Todos los ejemplos de programacin y muchos de los problemas que aparecen al final de loscaptulos se han resuelto y ejecutado en un PC (

  • CAPTULO 1Conceptos bsicos

    Este libro instruye en la programacin de computadoras en un lenguaje popular y estructurado:el lenguaje C. Adems, veremos cmo analizar problemas que son descritos inicialmente entrminos muy generales, cmo esbozados y cmo obtener finalmente programas e bien organi-zados. La multitud de problemas de ejemplo que incluye el texto muestran con detalle estosconceptos.

    1.1. INTRODUCCIN A LAS COMPUTADORASLas computadoras de hoy da se presentan en una amplia variedad de formas. Su rango se ex-tiende desde los mainframes (grandes computadoras) y supercomputadoras masivas y mul-tipropsito hasta las computadoras personales de escritorio. Entre ambos extremos nos encon-tramos con un inmenso conjunto de minicomputadoras y estaciones de trabajo. Las grandesminicomputadoras se aproximan a los mainframes en potencia de clculo, mientras que lasestaciones de trabajo son potentes computadoras personales.

    Los mainframes y las grandes minicomputadoras se utilizan en muchos negocios, univer-sidades, hospitales y agencias gubernamentales para desarrollar sofisticados clculos cientficosy financieros. Estas computadoras son muy caras (las grandes cuestan millones de dlares) yrequieren una plantilla grande de personal para su funcionamiento, as como un entorno especialy cuidadosamente controlado.

    Por otro lado, las computadoras personales son pequeas y baratas. De hecho, en la actuali-dad muchos estudiantes y profesionales que viajan con frecuencia utilizan mucho computadorasporttiles con batera 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 convertidoen elementos de uso domstico. La mayora de los estudiantes utilizan computadoras personalescuando aprenden a programar en C.

    La Figura 1.1 muestra a un estudiante trabajando con una computadora porttil.A pesar de su pequeo tamao y bajo precio, las modernas computadoras personales rivali-

    zan en potencia de computacin con muchas minicomputadoras. Ahora se utilizan para muchasaplicaciones que antes se realizaban en computadoras ms grandes y ms caras. Ms an, supotencia aumenta a la vez que su precio disminuye progresivamente. El diseo de una computa-dora personal permite un alto nivel de interaccin entre el usuario y la computadora. Muchasaplicaciones (por ejemplo procesadores de texto, programas de tratamiento de grficos, hojas declculo y programas de gestin de bases de datos) estn especialmente diseadas para sacar

    1

  • 2 PROGRAMACiN 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 clculos numricos. Las aplicaciones con grficosde alta resolucin son tambin frecuentes.

    Muchas veces se conectan computadoras personales con grandes computadoras o con otrascomputadoras personales, permitiendo su utilizacin bien como dispositivos autnomos o biencomo terminales en una red de computadoras. Son frecuentes tambin las conexiones a travs delneas telefnicas. Dentro de este contexto, podemos ver que las computadoras personales tien-den a complementar ms que a reemplazar a las grandes computadoras.

    1.2. CARACTERSTICAS DE LAS COMPUTADORASTodas las computadoras digitales, independientemente de su tamao, son bsicamente dispositi-vos electrnicos que pueden transmitir, almacenar y manipular informacin (datos). Una com-putadora puede procesar distintos tipos de datos. Esto incluye datos numricos, alfanumricos(nombres, direcciones, etc.), grficos (mapas, dibujos, fotografas, etc.) y sonido (msica, lectu-ra de textos, etc.). Desde el punto de vista del programador recin iniciado, los dos tipos de datosms familiares son los nmeros y los caracteres. Las aplicaciones cientficas y tcnicas involu-cran principalmente datos numricos, .mientras que las aplicaciones empresariales normalmenterequieren procesar tanto datos numricos como alfanumricos.

    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 mquina.

  • CONCEPTOS BSICOS 3

    Un programa almacenado se puede ejecutar en cualquier momento. Su ejecucin supone lossiguientes pasos:

    1. Se introduce en la computadora (desde un teclado, un disquete, etc.) un conjunto deinformacin, los datos de entrada, y se almacena en una parte de la memoria de sta.

    2. Los datos de entrada se procesarn para producir ciertos resultados deseados, los datosde salida.

    3. Los datos de salida, y probablemente algunos de los datos de entrada, se imprimirn enpapel o se presentarn en un monitor (una pantalla diseada especialmente para visuali-zar salida de computadora).

    Este procedimiento de tres pasos se puede repetir tantas veces como se desee, procesando r-pidamente una gran cantidad de datos. En cualquier caso, se debe tener presente que estos pasos,especialmente el 2 y el 3, pueden ser largos y complicados.

    EJEMPLO 1.1. Una computadora ha sido programada para calcular el rea de un circulo utilizandola frmula a = nr, d~ndo el valor numrico del radio como dato de entrada. Es necesario seguir estospasos:

    l. Leer el valor numrico del radio del circulo.2. Calcular el valor del rea utilizando la frmula anterior. Este valor se almacenar, junto con los

    datos de entrada, en la memoria de la computadora.3. Imprimir (presentar en el terminal) los valores del radio y del rea correspondiente.4. Parar.

    Cada uno de estos pasos requiere una instruccin o ms en un programa.

    Lo anteriormente dicho ilustra dos caractersticas importantes de una computadora digital:memoria y capacidad de ser programada. Otras caractersticas importantes son su velocidad yfiabilidad. Hablaremos ms de memoria, velocidad y fiabilidad en los siguientes prrafos. Laprogramabilidad ser discutida ampliamente en el resto del libro.

    MemoriaCada fragmento de informacin almacenado en la memoria de la computadora es codificadocomo una combinacin nica de ceros y unos. Estos ceros y unos se llaman bits (dgitos bina-rios). Un dispositivo electrnico representa cada bit, en cierto sentido, como apagado (cero) oencendido (uno).

    Las computadoras personales tienen la memoria organizada en grupos de 8 bits, denomina-dos bytes, como se muestra en la Figura 1.2. Hay que advertir que cada bit est numerado, empe-zando por O (el bit del extremo derecho) y terminando en 7 (el bit del extremo izquierdo).Normalmente, un carcter (por ejemplo una letra, un solo dgito o un smbolo de puntuacin)ocupar un byte de memoria. Una instruccin puede ocupar 1, 2 o 3 bytes. Una cierta cantidadnumrica puede ocupar de I a 8 bytes, dependiendo de la precisin (el nmero de cifras signifi-cativas) y el tipo (entero, coma flotante, etc.).

  • 4 PROGRAMACiN EN C

    bit nmero: 7 6 5 4 3 2 1 O

    m UIIIJUn byte

    Figura 1.2.

    Normalmente se expresa el tamao de la memoria computadora como algn mltiplo de 210 =1024 by-tes; esto es, lK. Las computadoras personales actuales tienen memorias de tamaoscomprendidos tpicamente entre 256 y 1024 megabytes, siendo 1 megabyte (1M) equivalente a210 210 bytes, o 21K = 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 seutiliza la memoria completa para representar caracteres (lo cual es poco probablel, entonces se podrnalmacenar unos 200 000 nombres y direcciones a la vez, suponiendo unos 80 caracteres por cada nombrey direccin.

    Si se utiliza la memoria para almacenar datos numricos en vez de nombres y direcciones, se podrnalmacenar ms de 4 millones de nmeros a la vez, suponiendo que cada cantidad numrica requiera 4bytes de memoria.

    Las grandes computadoras tienen memorias organizadas en palabras en lugar de bytes. Cadapalabra tendr un nmero relativamente grande de bits, tpicamente 32 o 36. En la Figura 1.3 apa-rece la organizacin a nivel de bits de una palabra de 32 bits. Ntese que los bits estn numerados,comenzando por el O(el bit del extremo derecho) y finalizando en 31 (el bit del extremo izquierdo).bitn.":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 estn numerados de la misma forma que los bits individuales, de O(el byte del extremoderecho) a 3 (el byte del extremo izquierdo).

    El uso de palabras de 32 o 36 bits permite representar una cantidad numrica o un pequeogrupo de caracteres en una sola palabra de memoria. Normalmente las grandes computadorastienen varios millones de palabras (varias megapalabras) de memoria.bitn.": 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 BSICOS 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 numricos (lo cual no es muy probable), entonces se podrn almacenar en la computadora ms de33 mi110nes de nmeros a la vez, suponiendo que cada cantidad numrica requiera una palabra de memoria.

    Si se utiliza la memoria completa para representar caracteres en lugar de datos numricos, se podrnalmacenar ms de 130 mi110nes de caracteres a la vez, suponiendo 4 caracteres por palabra. Esta memoriaes suficiente para almacenar los contenidos de varios libros voluminosos.

    La mayora de las computadoras utilizan tambin dispositivos auxiliares de almacenamiento(por ejemplo cintas magnticas, discos, dispositivos pticos de memoria) adems de la memoriaprincipal. Estos dispositivos pueden almacenar gigabytes (lG = 1024M) de informacin. Ade-ms, permiten que se grabe permanentemente la informacin, pudiendo normalmente ser desco-nectados de la computadora y almacenados cuando no se utilicen. Sin embargo, el tiempo deacceso (el tiempo necesario para almacenar o recuperar informacin) 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 pocosminutos clculos que requeriran muchos das, posiblemente meses o aos, si se hiciesen a mano.Por ejemplo, se pueden procesar las calificaciones de final de semestre de todos los estudiantesde una gran universidad en unos pocos minutos de tiempo de cmputo.

    El tiempo requerido para efectuar tareas de clculo sencillas, como sumar dos nmeros,se expresa habitualmente en microsegundos (1 IJ.seg = 10-6 seg) o nanosegundos (l nseg == 10-3 IJ.seg = 10-9 seg). Por tnto, si una computadora puede sumar dos nmeros en 10 nano-segundos (tpico de una computadora media actual), puede efectuar 100 millones (lO') de sumasen un segundo.

    Esta alta velocidad es acompaada por un nivel equivalente de fiabilidad. Una computadoranunca cometer un error por s misma. Los tan divulgados errores de computadoras, talescomo que a una persona se le cargue un recibo de telfono de varios millones de dlares, son elresultado de errores de programacin o de errores en la introduccin de datos, y no causados porla propia computadora.

    1.3. MODOS DE OPERACINUna gran computadora puede ser compartda 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 almacenaninternamente y luego se procesan secuencialmente. (Una tarea es un programa y sus conjuntosde datos de entrada asociados.) Tras ser procesada la tarea, una impresora de alta velocidadimprime en mltiples hojas de papel la salida junto con el listado del programa. Normalmente el

  • 6 PROGRAMACiN EN C

    usuario recoger la salida impresa tras un cierto tiempo transcurrido desde que la tarea haya sidoprocesada.

    En el procesamiento por lotes clsico (hoy da obsoleto) el programa y los datos eran gra-bados en tarjetas perforadas. Esta informacin se introduca en la computadora mediante unlector mecnico de tarjetas y a continuacin se procesaba. En los albores de la informtica, todaslas tareas se procesaban de esta manera.

    El procesamiento por lotes moderno va unido generalmente a sistemas de tiempo compartido(ver prxima seccin). En estos sistemas el programa y los datos son introducidos en la compu-tadora mediante un terminal o una computadora personal. Se almacena entonces la informacinen la memoria de la computadora y es procesada en un determinado orden. Esta forma de proce-samiento por lotes es preferible a la clsica, ya que elimina la necesidad de utilizar tarjetas per-foradas y permite la edicin de la informacin de entrada (programa y datos) mientras se intro-duce.

    En el procesamiento por lotes pueden circular muy rpidamente grandes cantidades de infor-macin (programas y datos) hacia dentro y fuera de la computadora. Adems, el usuario nonecesita estar presente mientras se procesa la tarea. Este modo de operacin se adeca a tareasque requieren gran cantidad de tiempo de cmputo o que son, en general, muy largas. Por otraparte, el tiempo total requerido para que una tarea sea procesada de esta forma puede variarentre varios minutos y varias horas, aun cuando la tarea pueda slo necesitar uno o dos segundosde tiempo real de cmputo. (Cada tarea debe esperar su turno hasta que es cargada, procesada yescrita su salida.) De esta forma, el procesamiento por lotes puede ser poco deseable cuando esnecesario procesar muchas pequeas tareas y presentar sus resultados lo antes posible (como,por ejemplo, cuando se aprende a programar).

    Sistemas de tiempo compartido

    Un sistema de tiempo compartido permite a diferentes usuarios utilizar una sola computadora ala vez. La computadora anfitriona puede ser un mainframe, una minicomputadora o una grancomputadora de sobremesa. Los usuarios se comunican con la computadora a travs de sus ter-minales individuales. En las redes de tiempo compartido modernas es frecuente utilizar las com-putadoras personales como terminales. La computadora anfitriona puede soportar muchos termi-nales a la vez, ya que trabaja mucho ms rpido que un operador humano en su terminal. De estemodo, cada usuario ser ajeno a la presencia de otros usuarios y creer tener toda la computado-ra anfitriona a su disposicin.

    Cada terminal individual puede estar bien conectado directamente a la computadora central,o bien a travs de las lneas telefnicas, de un circuito de microondas o incluso un satlite espa-cial. El terminal puede, por tanto, estar localizado lejos --quizs cientos de kilmetros- de sucomputadora central. Son particularmente frecuentes los sistemas en que las computadoras per-sonales se conectan a grandes mainframes a travs de lneas telefnicas. Tales sistemas hacenuso de mdems (dispositivos moduladores/demoduladores) para convertir las seales digitalesde la computadora en seales telefnicas analgicas y viceversa. A travs de dicha configura-cin, una persona que trabaja eh casa puede fcilmente acceder con su computadora personal ala computadora remota del colegio o de la oficina.

    Un sistema de tiempo compartido es ms adecuado para el procesamiento de tareas relativa-mente sencillas que no requieran de la transmisin de muchos datos o de grandes cantidades de

  • CONCEPTOS BSICOS 7

    tiempo de cmputo. Muchas aplicaciones de las escuelas y de las oficinas comerciales presentanestas caractersticas. Utilizando el tiempo compartido se pueden procesar tales aplicaciones deuna forma rpida, fcil y barata.

    EJEMPLO 1.4. Una gran universidad dispone de una computadora de tiempo compartido con capaci-dad para 200 terminales y 80 conexiones telefnicas separadas. Los terminales situados en diferentes lu-gares del campus estn conectados directamente a un gran mainframe. Cada terminal es capaz de trans-mitir informacin a o desde la computadora central a una velocidad mxima de 960 caracteres por segundo.

    Las conexiones telefnicas permiten a estudiantes que no se encuentran en el campus conectar suscomputadoras personales a la computadora centra!. Cada computadora personal puede transmitir datos a odesde la computadora central a una velocidad mxima de 240 caracteres por segundo. Asi pues, los 280terminales y computadoras pueden interactuar con la computadora central a la vez, estando cada estudian-te despreocupado de que los dems estn compartiendo al mismo tiempo la computadora.

    Computacin interactiva

    La computacin interactiva es un tipo de entorno de computacin que surgi con los sistemas detiempo compartido comerciales y que ha sido mejorado con el amplio uso de las computadoraspersonales. En un entorno de computacin interactivo, durante la sesin de trabajo existe inter-accin entre el usuario y la computadora. De este modo, el usuario ser consultado peridica-mente para que proporcione cierta informacin, la cual determinar las acciones pertinentes arealizar por la computadora y viceversa.

    EJEMPLO 1.5. Un estudiante desea usar una computadora personal para calcular el radio de un crculocuya rea tiene el valor de 100. Se dispone de un programa que calcula el rea del crculo, dado el radio.(Ntese 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 mtodo de prueba y error. El procedimientoconsistir en adivinar un valor para el radio y luego calcular el rea correspondiente. El procedimiento deprueba y error continuar hasta que el estudiante encuentre un valor del radio para que el rea sea losuficientemente prxima a 100.

    Una vez que comienza la ejecucin del programa, aparece el mensajeRadio ~ ?

    Entonces el estudiante introduce un valor del radio. Supongamos que da un valor de 5. La computado-ra responder presentando:

    Area ~ 78.5398Deseas repetir el clculo?

    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:

    Adis

    y finaliza la ejecucin del programa.

  • 8 PROGRAMACiN EN C

    A continuacin se muestra una copia impresa de la informacin presentada durante una sesin interac-tiva tpica, usando el programa antes descrito. En esta sesin se determina un valor aproximado der = 5. 6 despus de slo tres clculos. Se ha subrayado la informacin aportada por el estudiante.

    Radio = ? .2-Area = 78.5398Deseas repetir el clculo? sRadio = ? QArea = 113.097Deseas repetir el clculo? sRadio = ? 2......QArea = 98.5204Deseas repetir el clculo? noAdis

    Ntese la forma en que parecen conversar la computadora y el estudiante. Observe tambin cmo elestudiante espera hasta que ve el valor del rea calculado antes de decidir si contina o no haciendo clcu-los. Si se inicia otro nuevo clculo, el nuevo valor del radio que proporcione el estudiante depender de losresultados de clculos anteriores.

    A veces los programas diseados 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 grficos y acciones rpidas, aun cuando las respuestas del usuarioson ms de tipo reflejo que numricas o verbales.

    1.4. TIPOS DE LENGUAJES DE PROGRAMACINSe pueden utilizar muchos lenguajes para programar una computadora. El ms bsico es el len-guaje mquina, una coleccin de instrucciones muy detalladas y crpticas que controlan la cir-cuitera interna de la mquina. ste es el dialecto natural de la computadora. Muy pocos progra-mas se escriben actualmente en lenguaje mquina por dos razones importantes: primero, porqueel lenguaje mquina es muy incmodo para trabajar, y segundo, porque la mayora de las mqui-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 modificacionesimportantes.

    Lo ms frecuente es utilizar lenguajes de alto nivel, cuyas instrucciones son ms compatiblescon los lenguajes y la forma de pensar humanos. La mayora son lenguajes de propsito general,como C. (Otros lenguajes de propsto general son Pascal, Fortran y BASrC.) Hay tambin len-guajes de propsito especial que estn diseados especficamente para algn tipo particular deaplicacin. Algunos ejemplos comunes son CSMP y SrMAN, que son lenguajes orientados a lasimulacin, y LISP, un lenguaje orientado al tratamiento de listas que se utiliza ampliamente enaplicaciones de inteligencia artificial.

    Por norma general, una sola instruccin de un lenguaje de alto nivel ser equivalente a variasde lenguaje mquina. Esto simplifica enormemente la tarea de escribir programas completos y

  • CONCEPTOS BSICOS 9

    correctos. Adems, las reglas de programacin en un lenguaje de alto nivel se pueden aplicar atodas las computadoras, de manera que un programa escrito para una computadora se puedeej ecutar normalmente en otras mquinas diferentes con muy pocas modificaciones o directa-mente. Por tanto, el uso de un lenguaje de alto nivel ofrece tres ventajas importantes respecto allenguaje mquina: sencillez, uniformidad y portabilidad (independencia de la mquina).

    En todo caso, un programa escrito en lenguaje de alto nivel ha de ser traducido a lenguajemquina antes de poder ser ejecutado. Esto se conoce como compilacin o interpretacin, de-pendiendo de cmo se lleve a cabo. (Los compiladores traducen el programa completo a lengua-je mquina antes de ejecutar cualquiera de las instrucciones. Los intrpretes, por otro lado, reco-rren el programa tomando instrucciones una a una en pequeos grupos que traducen y ejecutan.)En cualquier caso, la traduccin se lleva a cabo de forma automtica por la computadora. Dehecho, los programadores recin iniciados a veces no se dan cuenta de que este hecho est ocu-rriendo, ya que tpicamente slo ven el programa original en alto nivel, los datos de entrada y losresultados obtenidos. La mayora de las implementaciones de C operan como compiladores.

    Un compilador o intrprete es a su vez un programa. Acepta como datos de entrada un progra-ma en alto nivel (por ejemplo un programa en C) y genera como resultado el correspondienteprograma en lenguaje mquina. El programa original en lenguaje de alto nivel se llama programafuente, y el programa resultante en lenguaje mquina se llama programa objeto. Cada computadoradebe disponer de su propio compilador o intrprete para cada lenguaje de alto nivel particular.

    Es ms conveniente, por norma general, desarrollar un programa nuevo utilizando un intr-prete en vez de un compilador. Una vez que se ha conseguido el programa sin errores, una ver-sin compilada se ejecutar normalmente de forma mucho ms rpida que una interpretada. Lasrazones por las que ocurre esto quedan fuera del mbito de la presente discusin.

    1.5. INTRODUCCIN AL CC es un lenguaje de programacin estructurado de propsito general. Sus instrucciones constande trminos que se parecen a expresiones algebraicas, adems de ciertas palabras clave inglesascomo if, else, for, do y while. En este sentido, C recuerda a otros lenguajes de programa-cin estructurados como Pascal y Fortran. C tiene tambin algunas caractersticas adicionalesque permiten su uso a un nivel ms bajo, cubriendo asi el vacio entre el lenguaje mquina y loslenguajes de alto nivel ms convencionales. Esta flexibilidad permite el uso de C en la progra-macin de sistemas (por ejemplo, para el diseo sistemas operativos) asi como en la programa-cin de aplicaciones (por ejemplo, para redactar un programa que resuelva un complicado siste-ma de ecuaciones matemticas o un programa que escriba las facturas para los clientes).

    C se caracteriza por hacer posible la redaccin de programas fuente muy concisos, debido enparte al gran nmero de operadores que incluye el lenguaje. Tiene un repertorio de instruccionesrelativamente pequeo, aunque las implementaciones actuales incluyen numerosas funciones debiblioteca que mejoran las instrucciones bsicas. Es ms, el lenguaje permite a los usuarios es-cribir funciones de biblioteca adicionales para su propio uso. De esta forma, las caractersticas ycapacidades del lenguaje pueden ser ampliadas fcilmente por el usuario.

    Hay compiladores de C disponibles para computadoras de todos los tamaos, y los intrpre-tes de C se estn haciendo cada vez ms comunes. Los compiladores son frecuentemente com-pactos y generan programas objeto que' son pequeos y muy eficientes en comparacin con los

  • 10 PROGRAMACiN EN C

    programas generados a partir de otros lenguajes de alto nivel. Los intrpretes son menos eficien-tes, aunque resultan de uso ms cmodo en el desarrollo de nuevos programas. Muchos progra-madores comienzan utilizando un intrprete, y una vez que se ha depurado el programa (elimi-nado los errores del mismo) utilizan un compilador.

    Otra caracteristica importante de C es que los programas son muy portables, ms que losescritos en otros lenguajes de alto nivel. La razn de esto es que C deja en manos de las funcio-nes de biblioteca la mayora de las caractersticas dependientes de la computadora. Toda versinde C se acompaa de su propio conjunto de funciones de biblioteca, que estn escritas para lascaractersticas particulares de la computadora en la que se instale. Estas funciones de bibliotecaestn relativamente normalizadas y el acceso a cada funcin de biblioteca es idntico en todaslas versiones de C. De esta forma, la mayora de los programas en C se pueden compilar y ejecu-tar en muchas computadoras diferentes prcticamente sin modificaciones.

    Historia del e

    C fue desarrollado originalmente en los aos setenta por Dennis Ritchie en Bell Telephone Labora-tories, Inc. (ahora una sucursal de AT&T). Es el resultado de dos lenguajes anteriores, el BCPLy el B, que se desarrollaron tambin en los laboratorios Bell. C estuvo confinado al uso en loslaboratorios Bell hasta 1978, cuando Brian Kernighan y Ritchie publicaron una descripcin defini-tiva del lenguaje *. La definicin de Kernighan y Ritchie se denomina frecuentemente K&R C.

    Tras la publicacin de la definicin de K&R, los profesionales de las computadoras, impre-sionados por las muchas caractersticas deseables del C, comenzaron a promover el uso del len-guaje. A mediados de los ochenta la popularidad del C se haba extendido por todas partes. Sehaban escrito numerosos compiladores e intrpretes de C para computadoras de todos los tama-os y se haban desarrollado numerosas aplicaciones comerciales. Es ms, muchas aplicacionesque se haban escrito originalmente en otros lenguajes se reescribieron en C para tomar partidode su eficiencia y portabilidad.

    Las primeras implementaciones comerciales de C diferan en parte de la definicin originalde Kernighan y Ritchie, creando pequeas incompatibilidades entre las diferentes implementa-ciones del lenguaje. Ests diferencias reducan la portabilidad que el lenguaje intentaba propor-cionar. Consecuentemente, el Instituto Nacional Americano de Estndares ** (comit ANSIX3Jll) desarroll una definicin estandarizada del lenguaje C. La mayora de los compiladorese intrpretes comerciales de C actuales adoptan el estndar ANSI. Algunos compiladores tam-bin pueden proporcionar caractersticas adicionales propias.

    En la dcada de los ochenta, Bjarne Stroustrup *** desarroll en los laboratorios Bell otrolenguaje de programacin de alto nivel denominado C++. ste se basa en C, y por tanto todas lascaractersticas estndar de C estn disponibles en C++. Sin embargo, C++ no es una mera exten-sin de C. Incorpora nuevos fundamentos que constituyen una base para la programacin orien-tada a objetos -un nuevo paradigma de la programacin de inters para los programadores

    Brian W. Kernighan y Dermis M. Ritchie, The e Programming Language, Prentice-Hall, 1978. Estndar ANSI X3.159-1989. Instituto Nacional Americano de Estndares, 1430 Broadway, New York, NY,

    10018. (Ver tambin Brian W. Kernighan y Dennis M. Ritchie, The e ProgrammingLanguage, 2.' edicin, Prentice-Hall, 1988.)

    Stroustrup, Bjarne, The e Programming Language, segunda edicin, Addison-Wesley, 1991.

  • CONCEPTOS BSICOS 11

    profesionales-o En este libro no se describe C++, pero s hay que indicar que un slido conoci-miento de C es un buen punto de partida para aprender C++.

    Este libro describe las caractersticas de C incluidas en el estndar ANSI y soportadas por loscompiladores e intrpretes comerciales de C. El lector que asimile todo este material no tendrdificultad en adaptar un programa en C a una versin particular del lenguaje.

    Estructura de un programa en eTodo programa en C consta de uno o ms mdulos llamados funciones. Una de las funciones sellama main. El programa siempre comenzar por la ejecucin de la funcin man, la cual pue-de acceder a las dems funciones. Las definiciones de las funciones adicionales se deben rea-lizar aparte, bien precediendo o siguiendo a man (encontrar ms informacin sobre esto enlos Captulos 7 y 8).

    Cada funcin debe contener:

    1. Una cabecera de la funcin, que consta del nombre de la funcin, seguido de una listaopcional de argumentos encerrados entre parntesis.

    2. Una lista de declaracin de argumentos, si se incluyen stos en la cabecera.3. Una instruccin compuesta, que contiene el resto de la funcin.

    Los argumentos son smbolos que representan informacin que se le pasa a la funcin desdeotra parte del programa. (Tambin se llama parmetros a los argumentos.)

    Cada instruccin compuesta se encierra con un par de llaves, { }. Las llaves pueden contenercombinaciones de instrucciones elementales (denominadas instrucciones de expresin) y otrasinstrucciones compuestas. As las instrucciones compuestas pueden estar anidadas, una dentrode otra. Cada instruccin de expresin debe acabar en punto y coma (;).

    Los comentarios pueden aparecer en cualquier parte del prograIl1a, mientras estn situadosentre los delimitadores /* y */ (por ejemplo: /* esto es un comentario *1). Loscomentarios son tiles para identificar los elementos principales de un programa o para explicarla lgica subyacente de stos.

    Estos componentes del programa se discutirn ms tarde en este libro con mucho ms deta-lle. Por ahora slo se expone una visin general de las caractersticas bsicas que caracterizan lamayora de los programas en C.

    EJEMPLO 1.6. rea de un crculo. He aqu un programa en e elemental que lee el rado de un crculo,calcula su rea y escribe le resultado calculado.

    /*programa para calcularel rea de un crculo*/

    #include

    man (){

    float radio l area

    printf("Radio ~ ? ");scanf("%f", &rado);

    /* TITULO (COMENTARIO) *//* ACCESO A ARCHIVO DE BIBLIOTECA */

    /* CABECERA DE FUNCION */

    /* DECLARACION DE VARIABLES */

    /* INSTRUCCION DE SALIDA *//* INSTRUCCION DE ENTRADA */

  • 14 PROGRAMACiN EN C

    float procesar(float r){

    /* definicin de funcin */

    float a; /* declaracin de variable local * /a = PI * r * r;return(a) ;

    }

    Esta versin utiliza una funcin definida por el programador, la funcin procesar, que se ocupa deefectuar realmente los clculos. Dentro de esta funcin, r es un argumento (o parmetro) que representael valor del radio proporcionado desde main, y a es el resultado calculado que se devuelve a main.Aparece una referencia a la funcin en main, dentro de la instruccin

    area = procesar(radio);

    Una declaracin de funcin precede a la funcin main, que indica que procesar acepta un argu-mento en coma flotante y devuelve tambin un valor en coma flotante. El uso de funciones se discutir condetalle en el Captulo 7.

    Este programa tambin contiene una constante simblica, PI, que representa el valor numrico3 . 14159. sta es una fonna de representacin que existe para conveniencia del programador. Cuando secompila el programa, la constante simblica se reemplaza automticamente por su valor numrico.

    Cuando se ejecuta este programa, se comporta de la misma fonna que el programa del Ejemplo 1.6.

    EJEMPLO 1.8. rea de un crculo con comprobacin de error. Consideremos ahora una variacindel programa dado en el Ejemplo 1.7.

    /* programa para calcular el rea de un crculocon comprobacin de error */

    #include

    #define PI 3.14159

    < O)O;

    float procesar(float radio)main ( ){

    float radio, area

    printf("Radio = ? ");scanf (tl%fU, &radio);if (radio

    area =else

    area = procesar (radio)printf( II Ar-ea = %f ll , area)

    }

    /* prototipo de funcin */

    /* declaracin de variables */

  • float procesar(float r)(

    CONCEPTOS BSICOS 15

    /* definicin de funcin */

    float a', /* declaracin de variable local */

    }

    a = PI * r * r;return(a) ;

    Este programa calcula de nuevo el rea de un Crculo. Incluye la funcin procesar y la constantesimblica PI, como se discuti en el ejemplo anterior. Hemos aadido una sencilla rutina de correcCnde errores, que comprueba si el valor del radio es menor que cero. (Matemticamente, un valor negativodel radio no tiene sentido.) La comprobacin se lleva a cabo dentro de main, utilizando una instruccinif-else (ver seccin 6.6). De esta forma, si radio tiene un valor negativo, se le asigna a area elvalor cero; en cualquier otro caso, se calcula el valor de area en procesar, como vimos anteriormente.

    EJEMPLO 1.9. reas de varios Crculos. Ampliando los anteriores programas hemos redactado ste,en el que se calculan las reas de varios Crculos.

    /* programa para calcular reas de varios crculosusando un bucle for */

    #include

    #define PI 3.14159

    float procesar(float radio); /* prototipo de funcin */main ( )

    {float radio, area;int cont, n;

    /* declaracin de variables *//* declaracin de variables */

    printf ("N"scanf (lI%d",

    de crculos?&n) ;

    " )

    < O)O;

    }

    for (cont = 1; cont

  • 16 PROGRAMACiN EN C

    float procesar(float r){

    /* definicin de funcin */

    float a; /* declaracin de variable local */

    a = PI * r * r;return (a) ;

    }

    En este caso el nmero total de crculos, representado por la variable entera n, se debe introducir antes deque se realice cualquier clculo. Se utiliza entonces la instruccin for para calcular iterativamente lasreas de los n crculos (ver seccin 6.4).

    Observe el uso de la variable cont, que se utiliza corno un contador dentro del bucle for (dentro dela porcin del programa que se repite). El valor de cont se incrementar en 1 en cada pasada por el bu-cle. Ntese tambin la expresin ++cont que aparece en la instruccin foro sta es una notacin abre-viada para incrementar el valor del contador en 1; de hecho es equivalente a cont = cont + 1 (ver sec-cin 3.2).

    Cuando se ejecuta el programa, genera un dilogo interactivo corno el que se muestra a continuacin.Las respuestas del usuario estn, de nuevo, subrayadas.

    NQ de crculos? 1

    Crculo n Q 1: Radio ? 1Area = 28.274309

    Crculo n Q 2: Radio = ? 1.Area = 50.265442

    Crculo n Q 3: Radio = ? .5.Area = 78.539749

    EJEMPLO 1.10. reas de un nmero indeterminado de crculos. El programa anterior se puedemejorar de manera que procese un nmero indeterminado de crculos, haciendo que continen los clculoshasta que se introduzca un valor cero para el radio. Esto evita la necesidad de contar, adems de especifi-car por adelantado el nmero de crculos. Esto es especialmente til cuando hay que procesar una grancantidad de datos.

    ste es el programa completo.

    /* programa para calcular reas de varios crculos, usandoun bucle for; no se especifica el nmero de crculos */

    #include

    #define PI 3.14159

  • CONCEPTOS BSICOS 17

    float procesar(float radio); /* prototipo de funcin */main ( ){

    float radio, area;int cont;

    /* declaracin de variables *//* declaracin de variables */

    }

    printf ("Para PARAR, introducir O en el valor del radio\n");printf ( "\nRadio = ? ");scanf(lI%f", &radio);

    for (cont = 1; radio != O; ++cont) {if (radio < O)

    area = O;else

    are a = procesar(radio);printf ("Area = %f\n", area)printf("\nRadio = ? ");scanf (n %f 11 I &radio) i

    }

    float procesar(float r){

    float a;

    a = PI * r * r ireturn (a) ;

    }

    /* definicin de funcin */

    /* declaracin de variable local */

    Ntese que este programa presentar un mensaje al comienzo de la ejecucin, informando al usuariode cmo finalizar los clculos.

    Abajo se muestra el dilogo resultante de una ejecucin tpica de este programa. Una vez ms, lasrespuestas del usuario estn subrayadas.

    Para PARAR, introducir O en el valor del radio

    Radio = ? .lArea = 28.274309

    Radio = ? 1:Area = 50.265442

    Radio = ? .5-Area = 78.539749

    Radio = ? Q

  • 18 PROGRAMACiN EN C

    EJEMPLO 1.11. reas de un nmero indeterminado de crculos. He aqu una varante del programamostrado en el ejemplo anterior.

    /* programa para calcular reas de varios crculos, usandoun bucle while; no se especifica el nmero de crculos */

    #include

    #define PI 3.14159

    float procesar(float radio);main ( ){

    float radio, area

    /* prototipo de funcin */

    /* declaracin de variables */

    printf("Para PARAR, introducir O en el valor del radio\n");printf(l1\nRadio = ? ")scanf{ll%f ll , &radio)while (radio != O) {

    if (radio < O)area O i

    elsearea = procesar(radio);

    printf("Area = %f\n", area);printf (" \nRadio = ? ");scanf("%f", &radio)

    }

    }

    float procesar(float r)

    {

    float a;

    a = PI * r * r;return(a) ;

    }

    /* definicin de funcin */

    /* declaracin de variable local */

    Este programa realiza la misma funcin que el mostrado en el ejemplo anterior. Sin embargo, hemos usadoahora una instruccin while en vez de una for para llevar a cabo la ejecucin repetida del programa(ver seccin 6.2). La instruccin while seguir ejecutndose mientras se le asigne a radio un valor queno sea cero.

    En general, la instruccin while continuar ejecutndose mientras la expresin contenida en losparntesis se considere verdadera. De esta forma se puede escribir ms brevemente la instruccin whi 1 ecomo:

  • CONCEPTOS BSICOS 19

    while (radio) {

    en lugar de

    while (radio != O) {

    porque cualquier valor de radio no nulo se interpretar corno una condicin verdadera.Algunos problemas se adecan mejor a la utilizacin de la instruccin for, mientras que otros al uso

    de while. La instruccin while es algo ms sencilla en esta aplicacin en particular. Hay una tercerainstruccin para generar bucles, la instruccin do-while, que es similar a la while mostrada anterior-mente. (Ms sobre esto en el Captulo 6).

    Cuando se ejecuta este programa, genera un dilogo interactivo idntico al que se mostr en el Ejem-plo 1.10.

    EJEMPLO 1.12. Clculo y almacenamiento del rea de varios crculos. Algunos problemas requie-ren que se almacene en la computadora una serie de resultados ya calculados, quiz para ser utilizados enclculos posteriores. Los datos de entrada correspondientes se pueden tambin almacenar internamentejunto con los resultados calculados. Esto se puede llevar a cabo mediante el uso de arrays.

    El siguiente programa utiliza dos arrays, llamados radio y area, para almacenar el radio y el reade hasta 100 crculos. Cada array se puede ver como una lista de nmeros. Cada uno de los nmerosindividuales dentro de cada lista es un elemento de array. Los elementos de un array estn numerados,empezando por O. As el radio del primer crculo se almacenar dentro del elemento radio [O] , el radiodel segundo crculo se almacenar en radio [1], y as sucesivamente. De igual forma, las reas corres-pondientes se almacenarn en area [ O], area [1] , etc.

    ste es el programa completo./*programa para calcular reas de varios crculos, usando

    un bucle while; los resultados se almacenan en un array;no se especifica el nmero de crculos */

    #include

    #define PI 3.14159

    f10at procesar (f10at radio); / * prototipo de funcin * /

    main ( )

    {

    int n,f10at

    i ;;;: O;radio [100],area [100];

    /* declaracin de variables */

    /* declaracin de arrays */

    printf("Para PARAR, introducir O en el valor del radio\n\n");printf(IIRadio::::; ? 11);scanf("%f", &radio[i])while (radio [i]) {

    if (radio[i]area[i]

    < O)= O i

  • 20 PROGRAMACiN EN C

    el searea [i] = procesar (radio [i] ) ;

    printf(URadio:;:: ? 11);scanf('%f', &radio[++i])

    }

    n :;:: --i /* El mayor valor de i */

    /* presentar los elementos del array */printf ('\nRelacin de resultados\n\n');for (i = O; i

  • CONCEPTOS BSICOS 21

    Relacin de resultados

    RadioRadio =Radio =

    3.0000004.0000005.000000

    Area = 28.274309Area = 50.265442Area = 78.539749

    Este sencillo programa no hace uso de los valores que se han almacenado en los arrays. Su nicopropsito es mostrar los mecanismos que utilizan los arrays, En un ejemplo ms complicado, podramosquerer determinar el valor medio de las reas, y entonces comparar cada rea individualmente con la me-dia. Para hacer esto tendramos que recurrir a cada uno de los valores de las reas (los elementos del arrayarea [O] , area [1], ,." etc.).

    El uso de arrays se discute brevemente en el Captulo 2 y extensamente en el captulo 9.

    EJEMPLO 1.13. Clculo y almacenamiento de las reas de varios crculos. sta es una aproxima-cin ms detallada al problema descrito en el ejemplo anterior.

    /*programa para calcular reas de varios crculos, usandoun bucle while;los resultados se almacenan en un array;no se especifica el nmero de crculos;se introduce una cadena de caracteres para cada conjuntode datos */

    #include

    #define PI 3.14159

    float procesar(float radio); /* prototipo de funcin */

    main ( ){

    int n, i = O;

    struct {/* declaracin de variables */

    }

    charfloatfloat

    circulo[10] ;

    texto[20];radio;area

    /* declaracin de variable tipoestructura */

    printf ("Para PARAR, introducir FIN en el identificador\n");printf("\nIdentificador: ");scanf ( 11%'8 nI circulo [i] . texto) iwhile (circulo[i] .texto[O] !='F'

    11 circulo [i] . texto [1] ! = 'I'11 circulo[i].texto[2] != 'N') {

    printf("Radio = ? ");scanf ("%f", &circulo [i] .radio);

  • 22 PROGRAMACiN EN C

    if (circulo[i].radio < O)circulo[i] .area = O;

    el secirculo[i] .area = procesar(circulo[il .radio);

    ++iprintf("\nIdentificador: ");

    /* siguiente conjunto de datos */scanf("%s", circulo[i] .texto);

    }

    n --i; /* El mayor valor de i */

    .texto,

    .radio,

    . area) ;

    %f\n",circulo[i]circulo[i]circulo[i]

    Area ::::

    /* presentar los elementos del array */printf("\n\nRelacin de resultados\n\n");for (i = O; i

  • CONCEPTOS BSICOS 23

    Para PARAR, introducir FIN en el identificador

    Identificador: ROJORadio: 2

    Identificador: BLANCORadio: .4.

    Identificador: AZULRadio: .2.

    Identificador: FIN

    Relacin de resultados

    ROJOBLANCOAZUL

    Radio = 3.000000Radio = 4.000000

    Radio = 5.000000

    Area = 28. 2743 O9Area = 50.265442

    Area = 78.539749

    1.7. CARACTERSTICAS DESEABLES DE UN PROGRAMAAntes de concluir este captulo examinemos brevemente algunas caractersticas importantes delos programas bien escritos. Estas caracteristicas se pueden aplicar a programas no slo escritosen e, sino en cualquier lenguaje de programacin. Pueden ap"rtamos una serie de normas gene-rales muy tiles para cuando comencemos a escribir prximamente, en este libro, nuestros pro-pios programas en C.

    1. Integridad. Se refiere a la correccin de los clculos. Est claro que toda posible amplia-cin del programa no tendr sentido si los clculos no se realizan de forma correcta, puesla integridad de los clculos es absolutamente necesaria en cualquier programa de com-putadora.

    2. La claridad hace referencia a la facilidad de lectura del programa en conjunto, con parti-cular nfasis en la lgica subyacente. Si un programa est escrito de forma clara, ser posi-ble para otro programador seguir la lgica del programa sin mucho esfuerzo. Tambin harposible al autor original seguir su propio programa despus de haberlo .dejado durante unperiodo largo de tiempo. Uno de Ips objetivos al disear e fue el desarrollo de programasclaros y de fcil lectura a travs de un enfoque de la programacin ordenado ydiscipli-nado.

    3. Sencillez. La claridad y correcccin de un programa se suelen ver favorecidas con hacerl

  • 24 PROGRAMACiN EN C

    conducen a un compromiso entre estas caractersticas. En tales situaciones es necesariorecurrir a la experiencia y al sentido comn.

    5. Modularidad. Muchos programas se pueden dividir en pequeas subtareas. Es una bue-na prctica de programacin implementar cada una de estas subtareas como un mduloseparado del programa. En C estos mdulos son las funciones. El diseo modular de losprogramas aumenta la correccin y claridad de stos y facilita los posibles cambios futu-ros del programa.

    6. Generalidad. Normalmente queremos que un programa sea lo ms general posible, den-tro de unos lmites razonables. Por ejemplo, podemos hacer un programa que lea losvalores de ciertos parmetros en lugar de dejarlos fijos. Como norma general se puedeconseguir con muy poco esfuerzo adicional un nivel considerable de generalidad.

    1.1. Qu es un mainframe? Dnde se pueden encontrar? Para qu se suelen utilizar nor-malmente?

    1.2. Qu es una computadora personal? En qu se diferencian de los mainframes?1.3. Qu es una supercomputadora? Y una minicomputadora? Y una estacin de trabajo?

    En qu se diferencian unas de otras? En qu difieren de los mainframes y de lascomputadoras personales?

    1.4. Mencionar cuatro tipos de datos distintos.1.5. Qu se entiende por un programa de computadora? Qu ocurre en general cuando se

    ejecuta un programa?1.6. Qu es la memoria de una computadora? Qu clase de informacin se almacena en la

    memoria de una computadora?1.7. Qu es un bit? Qu es un byte? Cul es la diferencia entre un byte y una palabra de

    memoria?1.8. Qu trminos se utilizan para describir la memoria de una computadora? Cules son los

    tamaos tpicos de las memorias?1.9. Mencionar algunos dispositivos auxiliares de almacenamiento. En qu se diferencian estos

    dispositivos de almacenamiento de la memoria principal?1.10. Qu unidad de tiempo se utiliza para expresar la velocidad en la que se realizan las ta-

    reas elementales en una computadora?1.11. Cul es la diferencia entre el procesamiento por lotes y el tiempo compartido? Qu

    ventajas y desventajas presenta cada uno?1.12. Qu significa la computacin interactiva? Para qu tipo de sistemas se adecan mejor

    estos sistemas?1.13. Qu es el lenguaje mquina? En qu se diferencian el lenguaje mquina y los lenguajes

    de alto nivel?1.14. Mencionar algunos lenguajes de alto nivel de uso frecuente. Cules son las ventajas de

    utilizar lenguajes de alto nivel?1.15. Qu se entiende por compilacin? Qu significa interpretacin? En qu se diferencian

    estos dos procesos?

  • CONCEPTOS BSICOS 25

    1.16. Qu es un programa fuente? Y un programa objeto? Por qu son importantes estosconceptos?

    1.17. Cules son las caracteristicas generales de C?1.18. Dnde y por quin fue desarrollado C? Por qu se ha estandarizado este lenguaje?1.19. Qu es C++? Qu relacin hay entre C y C++?1.20. Cules son los componentes principales de un programa en C? Qu significado lleva

    asociado el nombre main?1.21. Describir la composicin de una funcin en C.1.22. Qu son los argumentos? Dnde aparecen los argumentos en un programa en C? Qu

    otro trmino se utiliza a veces en lugar de argumento?1.23. Qu es una instruccin compuesta? Cmo se escriben las instrucciones compuestas?1.24. Qu es una instruccin de expresin? Se puede incluir una instruccin de expresin en

    una instruccin compuesta? Se puede incluir una instruccin compuesta en una instruc-cin de expresin?

    1.25. Cmo se pueden incluir los comentarios en un programa en C? Dnde se pueden ponerlos comentarios?

    1.26. Es necesario escribir los programas en C en minsculas? Se pueden utilizar para algolas maysculas en un programa en C? Explicarlo.

    1.27. Qu es una instruccin de asignacin? Cul es la relacin entre una instruccin de asig-nacin y una instruccin de expresin?

    1.28. Qu signo de puntuacin se pone al final de la mayora de las instrucciones en C? Ter-minan todas las instrucciones de esta forma?

    1.29. Por qu se sangran algunas de las instrucciones de un programa en C? Por qu se inclu-yen normalmente lneas en blanco en un programa en C?

    1.30. Comentar brevemente el significado de cada una de las siguientes caractersticas de losprogramas: integridad, claridad, sencillez, eficiencia, modularidad y generalidad. Por ques importante cada una de estas caractersticas?

    1.31. Determinar, lo mejor que se pueda, el propsito de cada uno de los siguientes programas en C.Identificar todas las variables de cada programa. Identificar todas las instrucciones de entrada ysalida, todas las instrucciones de asignacin y cualquier otra caracteristica importante que se reco-nozca.

    a) main ()

    {

    printf("Bienvenido ala Informtica !In");}

  • 26 PROGRAMACiN EN e

    b) #define MENSAJE "i Bienvenido a la informtica!"main( )

    {

    printf(MENSAJE);

    }

    e) main ()

    {

    float base, altura, areai

    printf(IIBase: ")scanf("%f",&base);printf ("Altura: ");scanf("%f",&altura) ;area = (base * altura) / 2.;printf ("Area: %f", area) ;

    }

    d) main ()

    {

    float bruto, impuesto, neto;

    printf (" Salario bruto: ");scanf (Il%fll I &bruto);impuesto = 0.14 * bruto;neto = bruto - impuesto;printf("Impuestos: %.2f\n", impuesto};printf("Salario neto: %.2f", neto);

    }

    e) int menor(int a, int b);

    main ()

    {

    int al b, mini

    printf (n Introduzca el primer nmero: 11) ,;scanf (n %d", &a) i

  • CONCEPTOS BSICOS 27

    printf (Il Introduzca el segundo nmero: ") iscanf ("%dll/ &b);

    min = menor(a, b);

    printf (" \nEl nmero menor es: %d", min);

    }

    int menor(int a, int b)

    {

    if (a

  • 28 PROGRAMACiN EN C

    g) int menor(int a, int b);

    main ()

    {

    int a, b, mini

    printf ("Para PARAR, introducir O en cada nmero\n");

    printf (11 \nIntroduzca el primer nmero: ") iscanf (Il%dll I &a) iprintf (" Introduzca el segundo nmero: ");scanf ( "%d", &b);

    while (a != O 11 b != O) {

    min = menor (a, b);printf (" \nEl nmero menor es %d\n", min);

    printf (" \nIntroduzca el primer nmero: ");scanf ("%dll, &a);printf ( "Introduzca el segundo nmero: ");scanf("%d", &b);

    }

    }

    int menor(int a, int b){

    if (a

  • CONCEPTOS BSICOS 29

    printf (" Introduzca el segundo nmero: ");scanf("%d", &b[i]);

    while (a[i] 1I b[i]) {

    min [i] menor (a [i], b [i] ) ;

    }

    printf ( "\nIntroduzca el primer nmero: ");scanf(lI%d ll , &a[++i])printf ( n Introduzca el segundo nmero: 11) iscanf("%d", &b[i]);

    n = i,

    printf("\nRelacin de resultados\n\n");for (i = O; i

  • CAPTULO 2Conceptos bsicos de C

    ,

    En este captulo presentaremos los elementos bsicos para la construccin de instrucciones sim-ples de C; entre stos se encuentra el conjunto de caracteres, los identificadores y palabras reser-vadas de C, los tipos de datos, las constantes, variables y arrays, las declaraciones, expresionese instrucciones. Veremos cmo combinar estos elementos para formar componentes ms gran-des de programas.

    Parte de este material se presenta de forma detallada y puede resultar dificil de asimilar,sobre todo para programadores con poca experiencia. Hay que sealar que el propsito de estecaptulo es presentar ciertos conceptos bsicos y algunas definiciones necesarias para los temasque se tratan en los siguientes captulos. Por tanto, cuando lea este captulo por primera vezpuede ser suficiente adquirir una cierta familiaridad con los conceptos que se presentan. Se con-seguir una comprensin ms profunda de estos elementos tras las repetidas referencias a estecaptulo que se encuentran en los siguientes.

    2.1. EL CONJUNTO DE CARACTERES DE CPara formar los elementos bsicos del programa (constantes, variables, operadores, expresiones,etc.), C utiliza como bloques de construccin las letras maysculas de la A a la z, las minsculisde la a a la z, los dgitos del O al 9 y ciertos caracteres especiales. Se presenta a continuacinuna lista de estos caracteres especiales:

    +

    * /"

    = % & #\ I

    ] { }(espacio en blanco)

    La mayora de las versiones del lenguaje tambin permiten que otros caracteres, como@ y $,se incluyan en cadenas de caracteres y comentarios.

    C utiliza ciertas combinaciones de estos caracteres, como \b, \n y \ t,parirepresen-tar elementos especiales como el retroceso de un espacio, nueva lnea y un tabulador, respec-tivamente. Estas combinaciones de caracteres se conocen como secuencias de escape. Trata-remos las secuencias de escape enla seccin 2.4. Por ahora nos limitaremos aidecirquecadasecuencia de escape representa un solo carcter, aun cuando se escriba con dos o ms carac-teres.

    31

  • 32 PROGRAMACiN EN C

    2.2. IDENTIFICADORES Y PALABRAS RESERVADAS

    Los identificadores son nombres que se les da a varios elementos de un programa, como varia-bles, funciones y formaciones. Un identificador est formado por letras y dgitos, en cualquierorden, excepto el primer carcter, que debe ser una letra. Se pueden utilizar maysculas y mi-nsculas, aunque es costumbre utilizar minsculas para la mayora de los identificadores. No sepueden intercambiar maysculas y minsculas (esto es, una letra mayscula no es equivalente ala correspondiente minscula.) El carcter de subrayado L) se puede incluir tambin, y es con-siderado como una letra. Se suele utilizar este carcter en medio de los identificadores. Un iden-tificador tambin puede comenzar con un carcter de subrayado, aunque en la prctica no sesuele hacer.

    EJEMPLO 2.1. Los siguientes nombres son identificadores vlidos.

    x

    nombresy12area

    _temperaturaTABLA

    Los siguientes nombres no son identificadores vlidos por las razones sealadas.

    4num"XII

    orden-noindicador error

    el primer carcter debe ser una letracaracteres ilegales (n)carcter ilegal (-)carcter ilegal (espacio en blanco)

    NO hay lmite para la longitud de los identificadores. Algunas implementaciones de C reco-nocen slo los ocho primeros caracteres, aunque la mayora de ellas reconocen ms (tpicamen-te, 31 caracteres). El resto de los caracteres son utilizados para la comodidad del programador.

    EJEMPLO 2.2. Los identificadores suma~de_valores y suma_de_variaciones son vli-dos gramaticalmente. Sin embargo, algunos compiladores de e pueden no ser capaces de distinguirlos,ya que ambos tienen las mismas ocho primeras letras. De esta forma, en un mismo progratlla slo se podrutilizar uno de estos identificadores.

    Como norma general, un identificador debe tener los suficientes caracteres para que su signi-ficado se reconozca fcilmente; por otra parte, se debe evitar un excesivo nmero de caracteres.

    EJEMPLO 2.3. Se est escribiendo un programa en e para calcular el valor futuro de una inversin.Los identificadores valor yvalor---,futuro son nombres. simblicos apropiados. Sin embargo, v yfv seran demasiado cortos, ya que no queda claro el.significado de estos identificadores. Por otra parte,un identificador como valor_futuro_de_una_inversion no ser adecuado por ser demasiadolargo e inciUodo. .

    Hay ciertas palabras reservadas que tienen en Cun significado predefinido estndar. Laspalabras reservadas slo se pueden utilizar para su propsito ya establecido; no se pueden utili-zar como identificadores definidos por el programador.

  • CONCEPTOS BSICOS DE C 33

    Las palabras reservadas son:

    autobreakcase

    charconstcontinuedefaultdodoubleel seenuro

    externfloatforgotoifintlongregisterreturnshortsigned

    sizeofsta ticstructswitchtypedefunionunsignedvoidvolatilewhile

    Existen compiladores que incluyen todas o algunas de las siguientes palabras reservadas:

    adaasroentry

    farfortranhuge

    near

    pascal

    Algunos compiladores de C pueden reconocer otras palabras reservadas. Para obtener unalista completa de las mismas para un compilador determinado se debe consultar su manual dereferencia.

    Observe que todas las palabras reservadas estn en minsculas. Como los caracteres en mi-nsculas y maysculas no son equivalentes, se puede utilizar una palabra reservada escrita enmaysculas como un identificador. Esto no se suele hacer normalmente, y se considera propiode un estilo de programacin pobre.

    2.3. TIPOS DE DATOSC ofrece distintos tipos de datos, cada uno de los cuales se puede encontrar representado deforma diferente en la memoria de la computadora. A continuacin se presenta una lista de lostipos de datos bsicos. Tambin se dan los requerimientos de memoria tpicos. (El requerimientode memoria para cada tipo de datos numricos determinar el rango permisible de valores paraese tipo de datos. Hay que sealar que las necesidades de memoria para cada tipo de datos pue-den variar de un compilador de C a otro.)Tipo de datos Descripcin

    int Cantidad entera

    char Carcter

    float Nmero en coma flotante(un nmero que incluye puntodecimal y/o exponente)

    Requisito tpico de memoria

    2 bytes o una palabra(vara de un compilador a otro)1 byte

    1 palabra (4 bytes)

  • 34 PROGRAMACiN EN C

    Tipo de datos Descripcin Requisito tpico de memoria

    double Nmero en coma flotante de doble 2 palabras (8 bytes)precisin (ms cifras significativasy mayor valor posible del exponente)

    Los compiladores de C diseados para computadoras personales o minicomputadoras (com-putadoras con longitud de palabra menor que 32 bits) representan generalmente una palabra con4 bytes (32 bits).

    Algunos tipos bsicos de datos se pueden ampliar utilizando los cualificadores de tipos dedatos short (corto), long (largo), signed (con signo) y unsigned (sin signo). Por ejem-plo, se pueden definir cantidades enteras como short int, long int o unsigned int(estos tipos de datos se suelen escribir simplemente short, long o unsigned, y se suponeque son enteros). La interpretacin de un tipo de datos entero con un cualificador delante puedevariar de un compilador de C a otro, aunque existe una relacin de sentido comn. De esta formaun short int requerir menos memoria o la misma que un int ordinario, pero nunca ms. Deigual forma, un long int puede requerir la misma cantidad de memoria o ms que un intordinario, pero nunca una cantidad de memoria menor.

    Si short int e int requieren la misma memoria (por ejemplo 2 bytes), entonces longint, generalmente, ocupar el doble (por ejemplo 4 bytes). O si int y long int ocupan lamisma memoria (por ejemplo 4 bytes), entonces short in t ocupar la mitad de memoria (porejemplo 2 bytes). Recuerde que estas especificaciones pueden variar de un compilador de C aotro.

    Un unsigned int ocupa la misma memoria que un int ordinario. Sin embargo, en elcaso de un int ordinario (o un short int o un long int), el bit del extremo izquierdo sereserva para el signo. En un unsigned int, todos los bits se utilizan para representar el valornumrico. De esta forma, un unsigned int puede llegar a almacenar un valor numricoaproximadamente el doble que un int ordinario (aunque, por supuesto, no puede almacenarvalores negativos). Por ejemplo, si un int ordinario puede variar de -32768 a +32767 (estoes propio de un int de 2 bytes), entonces un unsigned int podr tomar valores comprendi-dos entre O y 65535. El cualificador unsigned se puede aplicar tambin a otros ints yacualificados, por ejemplo unsigned short int o unsigned long int.

    El tipo char se utiliza para representar caracteres individuales. Por tanto, el tipo charrequerir slo un byte de memoria. Cada tipo char tiene una representacin como entero equi-valente,de esta forma un char es realmente una clase espeCial de entero corto (ver seccin2.4). En la mayora de los compiladores, un dato tipo char podr tomar valores de O a 255.Algunos compiladores representan el tipo de datos char con un rango de valores de -128 a+127. Tambin se pueden utilizar datos unsigned char (con valores de O a 255), o datossigned char (con valores de -128 a +127).

    Algunos compiladores permiten la aplicacin del cualificador long a f10at o double,por ejemplo long float o long doub1e. De todos modos, el significado de estos tiposde datos vara de un compilador de C a otro. As long float puede ser equivalente adoub1e. Adems, longcjouble puede ser equivalente adouble, o puede hacer referenciaa un tipo de datos de doble precisin extra largo, que requiera ms de dos palabras de me-mona.

  • CONCEPTOS BSICOS DE C 35

    Posteriormente se introducirn en este libro dos tipos de datos adicionales, void y enum(void es tratado en la seccin 7.2; enum se discute en la seccin 14.1).

    Cada identificador que representa un nmero o un carcter dentro de un programa en C debeestar asociado a uno de los tipos de datos bsicos antes de que el identificador aparezca en unainstruccin ejecutable. Esto se lleva a cabo mediante una declaracin de tipo, como se describeen la seccin 2.6.

    2.4. CONSTANTES

    C tiene cuatro tipos bsicos de constantes: constantes enteras, constantes en coma flotante, cons-tantes de carcter y constantes de cadena de caracteres (hay tambin constantes enumeradas,que se tratan en la seccin 14.1). Es ms, hay distintas ciases de constantes enteras y en comaflotante, como se discute a continuacin.

    Las constantes enteras y en coma flotante representan nmeros. Se las denomina, en general,constantes de tipo numrico. Las siguientes reglas se pueden aplicar a todas las constantes nu-mricas.

    l. No se pueden incluir comas ni espacios en blanco en la constante.2. Si se desea, la constante puede ir precedida de un signo menos (-). (Realmente, el signo

    menos es un operador que cambia el signo de una constante positiva, aunque se puedever como parte de la constante misma.)

    3. El valor de una constante no puede exceder un lmite mximo y un mnimo especifica-dos. Para cada tipo de constante, estos lmites varan de un compilador de C a otro.

    Veamos cada tipo de constante individualmente.

    Constantes enterasUna constante entera es un nmero con un valor entero, consistente en una secuencia de dgitos.Las constantes enteras se pueden escribir en tres sistemas numricos diferentes: decimal (base10), octal (base 8) y hexadecimal (base 16). Normalmente, los programadores que se estn ini-ciando no utilizarn ms que las constantes enteras decimales.

    Una constante entera decimal puede ser cualquier combinacin de dgitos tomados del con-junto de Oa 9. Si la constante tiene dos o ms dgitos, el primero de ellos debe ser distinto de O.

    EJEMPLO 2.4. A continuacin se muestran varias constantes enteras decimales.

    o 1 743 5280 32767 9999

    Las siguientes constantes enteras decimales estn escritas incorrectamente por las razones que seindican.

    12,24536.010 20 30123-45-67890900

    carcter ilegal (. ).carcter ilegal (. ).carcter ilegal(espacio en blanco);carcter ilegal (~).el primer dgito no puede ser cero.

  • 36 PROGRAMACiN EN C

    Una constante entera octal puede estar formada por cualquier combinacin de dgitos toma-dos del conjunto O a 7. El primer dgito debe ser obligatoriamente O, con el fin de identificar laconstante como un nmero octal.

    EJEMPLO 2.5. A continuacin se muestran varias constantes enteras octales.

    o 01 0743 077777

    Las siguientes constantes enteras octales estn escritas de forma incorrecta por las razones que sesealan.

    743052800777.777

    no comienza por Odgito ilegal (8)carcter ilegal (.)

    Una constante entera hexadecimal debe comenzar por Ox o OX. Puede aparecer despus cual-quier combinacin de dgitos tomados del conjunto de O a 9 y de a a f (tanto minsculas comomaysculas). Las letras de la a a la f (o de la A a la F) representan las cantidades (decimales)lOa 15, respectivamente.

    EJEMPLO 2.6. A continuacin se muestran varias constantes enteras hexadecimales.

    Ox OX1 OX7FFF Oxabcd

    Las siguientes constantes enteras hexadecimales estn escritas de forma incorrecta por las razones quese sealan.

    OX12.34OBE38OX.4bffOXDEFG

    carcter ilegal (.)no comienza por Ox o OX.carcter ilegal (.).carcter ilegal (G).

    El valor de una constante entera se ha de encontrar entre cero y algn valor mximo quevara de una computadora a otra (y de un compilador a otro en una misma computadora). Unvalor mximo tpico en la mayora de las computadoras personales y muchas minicomputadorases 327 67 en decimal (equivalente a 77777 en octal o a 7 f f f en hexadecimal), o lo que esigual, 215 - 1. Las grandes computadoras (

  • CONCEPTOS BSICOS DE C 37

    tante entera sin signo se identifica aadindole la letra U, mayscula o minscula (U del inglsunsigned), al final de la constante.

    Las constantes enteras largas pueden tomar valores mximos mayores que las constan-tes enteras ordinarias, pero ocupan ms memoria de la computadora. En algunas computadoras(y/o algunos compiladores) se generar una constante entera larga cuando simplemente se es-pecifique una cantidad que exceda el valor mximo. En cualquier caso, siempre es posible espe-cificar una constante entera larga aadiendo la letra L (mayscula o minscula) al final desta.

    Una constante entera larga sin signo se puede especificar aadiendo las letras UL al final dela constante. Las letras pueden estar en maysculas o minscula. Sin embargo, la U debe ir de-lante de la L.

    EJEMPLO 2.7. A continuacin se muestran varias constantes enteras largas y sin signo.

    Constante

    50000U123456789L123456789UL0123456L0777777UOX50000UOXFFFFFUL

    Sistema de numeracin

    decimal (sin signo)decimal (larga)decimal (larga sin signo)octal (larga)octal (sin signo)hexadecimal (sin signo)hexadecimal (larga sin signo)

    Los valores mximos permitidos de las constantes enteras largas y sin signo varan de unacomputadora (y de un compilador) a otra. En algunas computadoras, el valor mximo permitidode una constante entera larga puede ser el mismo que el de una constante entera ordinaria; otrascomputadoras permiten que el valor de una constante entera larga sea mucho mayor que el deuna ordinaria. Se recomienda de nuevo al lector que determine estos valores en su versin parti-cular de C.

    Constantes en coma flotante

    Una constante en coma flotante es un nmero en base 10 que contiene un punto decimal o unexponente (o ambos).

    EJEMPLO 2.8. A continuain se muestran varias constantes en coma flotante.

    O.50000.2E-8

    l.0.0007430.006e-3

    0.212.31.6667E+8

    827.602315.0066.12121212e12

  • 38 PROGRAMACiN EN C

    Las siguientes no son constantes en coma flotante por las razones indicadas.

    11,000.02E+10.2

    3E 10

    Deben encontrarse presentes un punto decimal o un exponente.Carcter ilegal (,).El exponente debe ser una cantidad entera (no puede contener un puntodecimal).Carcter ilegal (espacio en blanco) en el exponente.

    Si e~dste un exponente, su efecto es el de desplazar la posicin del punto decimal a la dere-cha si el exponente es positivo, o a la izquierda si es negativo. Si no incluye punto decimal en elnmero, se supone que se encuentra a la derecha del ltimo dgito.

    La interpretacin de una constante en coma flotante con exponente es justamente la mismaque en notacin cientfica, excepto que se sustituye la base 10 por la letra E (o e). De estaforma, el nmero 1.2 x 10-3 se debera escribir como 1 .2E-3 01. 2e-3. Esto es equivalente aO.12e-2 o 12e-4, etc.

    EJEMPLO 2.9. La cantidad 3 x lO' se puede representar en C por cualquiera de las siguientes constan-tes en coma flotante:

    300000..3e6

    3eS0.3E6

    3e+S30E4

    3ES30.E+4

    3.0e+S300e3

    De igual forma, la cantidad 5.026 x 10-17 se puede representar con cualquiera de las siguientes cons-tantes en coma flotante:

    S.026E-17 0.S026e-16 SO.26e-18 0.000S026E-13

    Los valores que pueden tener las constantes en coma flotante se encuentran dentro de unrango mucho mayor que el de las constantes enteras. Tpicamente, la magnitud de una constanteen coma flotante puede variar entre un valor mnimo de aproximadamente 3 . 4E- 38 Yun mxi-mo de 3 . 4E+3 8. Algunas versiones del lenguaje permiten constantes en coma flotante quecubren un rango mucho mayor, como de 1 . 7E - 3 O8 al. 7E+ 3 O8. Tambin es una constanteen coma flotante vlida el valor O. O(que es menor an que 3 . 4 E - 3 8 o 1 . 7E - 3 O8). El lectordebe ocuparse de averiguar estos valores para su computadora y su versin particular de C.

    Las constantes en coma flotante se representan en C normalmente como cantidades de dobleprecisin. Por tanto, cada constante en coma flotante ocupar, tpicamente, dos palabras (8 bytes)de memoria. Algunas versiones de C permiten la especificacin de constantes en coma flotantede simple precisin, aadiendo la letra F (mayscula o minscula) al final de la constante (porejemplo 3ESF). De forma anloga, algunas versiones de C permiten la especificacin de unaconstante en coma flotante larga aadiendo la letra 1 (mayscula o minscula) al final de laconstante (por ejemplo O.1234S6789E-33L).

    La precisin de las constantes en coma flotante (el nmero de cifras significativas) puedevariar de una versin de C a otra. De hecho, todas las versiones del lenguaje permiten al menosseis cifras significativas, y algunas versiones proporcionan dieciocho cifras significativas. Denuevo el lector debe ocuparse de determinar ese valor para su versin de C.

  • CONCEPTOS BSICOS DE C 39

    Precisin numrica

    Debe quedar claro que las constantes enteras son cantidades exactas, mientras que las constantesen coma flotante son aproximaciones. Las razones de esto se encuentran fuera del mbito de estadiscusin. En cualquier caso, el lector debe tener preseute que la constante en coma flotante1 . O puede ser representada en la memoria de la computadora como O. 9 9 9 9 9 9 9 9 ... , auncuando aparezca como 1. O cuando se presente por pantalla (debido al redondeo automtico).Por esta razn no se pueden utilizar los valores en coma flotante para ciertas funciones, talescomo conteo, indexacin, etc., en las que son necesarios valores exactos. Discutiremos estasrestricciones segn vayan apareciendo en prximos captulos de este libro.

    Constantes de carcterUna constante de carcter es un solo carcter, encerrado con comillas simples.

    EJEMPLO 2.10. A continuacin se muestran varias constantes de carcter.

    'A' 'X' '3 ' '? f

    Observe que la ltima constante consiste en un espacio en blanco encerrado con comillas simples.

    Las constantes de carcter tienen valores enteros determinados por el conjunto de caracteresparticular de la computadora. Por tanto, el valor de una constante de carcter puede variar deuna computadora a otra. Sin embargo, las constantes en s son independientes del conjunto decaracteres. Este hecho elimina la dependencia de un programa en C de un conjunto de caracteresen particular (ms sobre esto ms adelante).

    La mayora de las computadoras, y prcticamente todas las computadoras personales, utili-zan el conjunto de caracteres Ascn (Cdigo Estndar Americano para el Intercambio de Infor-macin), en el cual cada carcter individual se codifica numricamente con su propia combina-cin nica de 7 bits (existen, pues, un total de 2' = 128 caracteres diferentes). La Tabla 2.1contiene el conjunto de caracteres ASCn, donde aparece tambin el equivalente en decimal delos 7 bits que representan a cada carcter. Oberve que adems de codificados, los caracteresestn ordenados. En particular, los dgitos estn ordenados consecutivamente en su propia se-cuencia numrica (O a 9), y las letras estn dispuestas en orden alfabtico, precediendo las ma-ysculas a las minsculas. Esto permite que las unidades de datos de tipo carcter se puedancomparar entre s, basndose en su orden relativo dentro del conjunto de caracteres.

    EJEMPLO 2.11. A continuacin se muestran varias constantes de carcter y sus correspondientes valo-res en el conjunto de caracteres ASCII.

    Constante ValorlA' 65'x' 120',3' 51'? f 63

    32

  • 40 PROGRAMACiN EN C

    Tabla 2.1. El conjunto de caracteres ASCII

    o NUL 32 espacio en 64 @ 96blanco

    1 SOH 33 65 A 97 a2 STX 34 " 66 B 98 b3 ETX 35 # 67 C 99 c4 EOT 36 $ 68 D 100 d5 ENQ 37 % 69 E 101 e6 ACK 38 & 70 F 102 f7 BEL 39 71 O 103 g8 BS 40 ( 72 H 104 h9 HT 41 ) 73 I 10510 LF 42 * 74 J 106 J11 VT 43 + 75 K 107 k12 FF 44 76 1. 108 113 CR 45 77 M 109 m14 SO 46 78 N 110 n15 SI 47 / 79 O 111 o16 DLE 48 O 80 P 112 P17 DC1 49 1 81 Q 113 q18 DC2 50 2 82 R 114 r19 DC3 51 3 83 S 115 s20 DC4 52 4 84 T 116 t21 NAK 53 5 85 U 117 u22 SYN 54 6 86 V 118 v23 ETB 55 7 87 W 119 w24 CAN 56 8 88 X 1