Está en la página 1de 430
Tony Zhang Cprenviendo” Ze TRADUCCION: ‘Sergio Kourchenko Barrena REVISION TECNICA: Mariela Quintana Lépe: Maestra en. Ciencias Computacionales + ARGENTINA + BRASIL + COLOMBIA + COSTA RICA + CHILE une AA Resumen de contenido Tnmodueciip Parte |_Los fundamentos de C 9 Hora! El primer paso i 2 Su primer programa de C 29 3__La estructura de un programa de C 41 4 Tipos de datos y palabras reservadas 55 5. Manejo de la entrada y salida esténdar 7 rte Il_ Operadores e instrucciones de control de flujo 89 Hora 6 Manejo de datos. 1 1_Ciclos 105 8 Uso de operadores condicionales 121 9 Modificadores de datos y funciones matemdticas MI 10 Control de: flujo del programa 155 Parte Ill Apuntadores y arreglos 173 Hora 11__Apuntadores 195 12_Arreglos 189 1W3_Cademas 0207 14__Allcance y clases de almacenamiento 223 Parte IV Funciones y asignacién dinamica de memoria 241 Hora 15 _Funciomes J 16 Uso de apuntadores 259 17_Asignacidn de memoria 279 18__ Tipos de datos y funciones especiales 295 Parte V_Estructuras, uniones, E/S de archivos y mas 341 22 Funciones de archive especiales 373 23 Compilacién: el preprocesador de C 391 Parte VI Apéndices 437 Apéndice A Archivos de encabezado del esuindar ANSI 439 B__Respuestas a los cuestionarios y ejercicios 441 Indice 0S Material chroniony prawem autorskim ‘Muestra de un sistema configurado para programar en C 17 ‘Uso del compiladar de Microsoft eal Material chroniony prawem autorskim vi Aprendiendo C en 24 horas ‘Declaracién de variables de Bless Parte Il Operadores e instrucciones de control de flujo 89 Hora 6 Manejo de datos ” viii Aprendiendo C en 24 horas La instmiccidn nila eeeeeeennenninsnncecal ld Uso de expresiones complejas en una instrucciOn FF sceccscresmnnnl I Hora 8 Uso de operadores condicionales m1 ‘Como medir et tamatio de los datos... Todo es Wigico El operador Iogico AND (4a) El operador Igico OR (3) El operador I6gico NOT (1) .. Manejo de bits Conversion de un néimero decimal a hexadecimal o binario Uso de operadores a nivel de bits Hora 9 Modificadores de datos y funciones matemiticas 141 ‘Cémo habilitar o inhabilitar el bit de signa .. pssssnesl42 EX moificador 1090 sesnananan as (Césmo agregar h, 1.0 La los especificadores de formato printt y forintt 147 Fanciones matemiticas en C Liamadas a sin(), 6084) y tan() Llamadas a pow() y sert(} Contenido Hora 10 Control de flujo del programa 155 (COme decir siempre “si. La instruccidn 1¢ 1 Parte Ill Apuntadores y arreglos 173 Hora 11 Apuntadores 175 Hora 12_Arreglos 189 Inicializwcidn de arregios EL tamaiio de un arreglo Arregios y apuntadores ‘Cémo desplegar arreglos de caracteres El cardoter nulo (*\8") .. Aneglos multidimensionales x Aprendiendo C en 24 horas Contenido Use de prototipos Ciéep0 hacer Hamadas a las Funciones ‘Apuntadores y funciones Paso de arreglos a funciones Paso de apuntadores a funciones. Paso de areglos multidimensionales como argumentos x} xxii Aprendiendo C en 24 horas Hora 17_Asignacién de memoria 279 Asignacign de memoria en tempo de ejecucién ee MRO Hora 18 Lea fine eB02080) oe 2865 Declarscién de estructuras, Definiciin de variables de estructuras .. Como hacer referencia a miembros de estructuras con el Estructuras y Hamadas a funciones (Cémo hacer referencia a estruceuras mediante apuntadores (Cémo hacer referencia a.un miembro de una estructura mediante -> Arreglos de estructura, ‘Contenido xiii (Céimo hacer flexibles las estructuras... Definiciéin de campos de bits mediante struct Hora 21 Lectura y escritura de archivos 355 ‘Apuntadores de FILE (Cémo abrir archives (Climo cerrar archivos Lectura y escritura de archivos en disco Un candcter a la vez Unis Ine a la vex Un bloque a la vez xiv Aprendiendo C en 24 horas Hora 22. Funciones de archivo especiales 373 Las funciones fseekt) v Ftely) ns ‘Mis ejemplos de E/S de archivos en disco Lectura y eseritura de datos binarios Las funciones fecant(] y fprint#<) . Redirecci de ls flujo estindar mediante Treopen () Las dinectivas Wit, #olit y Helse Compilucién condicional anidada. Testniccionss de control de fino po pmennannnnennnreceth D6 Contenido Parte VI_Apéndices 437 Apéndice A_Archivos de encabezado del estandar ANSI 439 indice 8 Respuestas a los cuestionarios ictos aay Hora 1, “El pri xvi Aprendiendo C en 24 horas Blereicios ue —_ ee Hora 22, “Funciones de archivo especiales” eons 498 Acerca del autor Toxy ZHANG tiene mas de 15 ailos de experiencia en la programacién de computadoras yen el disefio de sistemas de informacién para empresas. En la actualidad trabaja para una de las cinco grandes firmas consultoras enfocadas al disefio, desarrollo ¢ implemen- tacién de infraestructura relacionada con e-business. Poseedor de un titulo de maestria en fisica, ha publicado diversos articulos de investiga- cién sobre lisers y programacién de computadoras. Entre sus principales intereses estén la pintura al dleo y la fotografia, que son las dos actividades que més disfruta. Puede establecer contacto con Tony a través de Sams Publishing, o escribiéndole al correo electrénico tyc24hBhotmail .com, Acerca del autor colaborador JouN SoUTHMAYD €s ingenieto de disefio de software y tiene experiencia en areas que van desde: la programacién de sistemas y controladores de dispositivos, hasta el desarro~ lo de Windows y tecnologias de Internet. Actualmente trabaja como consultor en Excell Data Corporation y vive con su esposa en Kirkland, Washington. Dedicatoria A mi esposa, Ellen, y a mis padres, Zhi-ying y Bing-rong, por su amor e inspiracién. —Tony Zhang Reconocimientos ‘Quisiera agradecer primero a los lectores de Ia primera ediciOn.en inglés de este libro por sus estimulos, paciencia, comentarios y, en especial, por sus criticas, lo cual contribuy6 a que esta segunda cdicién fuera mcjorada para aquellas personas que desean emprender tun viaje a través del mundo de la programacién en C. Es un gran placer para mf trabajar por segunda acasién con la editora Sharon Cox. Asi- mismo, deseo agradecer a los editores Carol Ackerman y Gus Miklos, y al autor colabo- radar John Southmayd por su excelente trabajo que hizo la segunda edicién de este libro més comprensible y en gran medida, si no es que por completo, libre: de errores. Ademis juiero expresar mi aprecio al gran trabajo de los demas miembros del equipo. Toxios ellos hicieron posible esta segunda edicién. Aprecio mucho el amor y el apoyo de mi esposa, Ellen, quien me inspira a ver el mundo de la tecnologia desde una perspectiva diferente. Siempre es un gran placer comentar con ella temas de filosofia y literatura, Mis padres, a quienes munca podré agradecer lo sufi- cieme, na sélo me dieron amar y carifo, sino también la oportunidad de recibir la mejor educacién que pude tener cuando estaba en China. Pearson Educacién Latinoamérica El personal de Pearson Educacién Latinoamérica est comprometido en presentarle lo micjor en material de consulta sobre computacién. Cada libro de Pearson Educacién Latinoamérica es el resultado de meses de trabajo de nuestro personal, que investiga y refina la informacién que se ofrece. ‘Como parte de este compromisa con usted, el lector de Pearson Educacién Latinoamérica Jo invita a dar su opinién, Por favor hdganos saber si disfruta este libro, si tiene alguna dificultad con la informacién y los ejemplos que se presentin, 0 si tiene alguna sugerencia para la préxima edicién, ‘Sin embargo, recuerde que el personal de Pearson Educacién Latinoamérica no puede ‘ctuar como soporte técnico i responder preguntas acerca de problemas relacionados con el software o él hardware. ‘Si usted tiene alguna pregunta o comentario acerca de cualquieer libro de Pearson Educacién Latinoamérica, existen muchas formas de entrar en contacto con nosotros. Responderemos a todos los lectores que podamos. Su nombre, direcci6n y mimero telefénico jamds formarin parte de ninguna lista de correos ni serdin usados para otro fin, més que el de ayudarnos a seguitle Hevanda los mejores libros posibles. Puede escribimnos a la siguiente direccisn: Pearson Educacién Latinoamérica ‘Attn: Editorial Divisién Computacién Calle Cuatro No. 25, 2° Piso, Col. Frace, Alce Blanco Naucalpan de Juirez, Edo. de México CP 53370, Si lo prefiere, puede mandar un fax a Pearson Educacién Latinoamérica al (525) 5387-0811. También puede ponerse en contacto con Pearson Educacién Latinoamérica a través de muestra pagina Web: http: / /wew. pearson. com. me Introduccion Si alguien aprende de otros pero no razona, estard desconcertado. Si alguien razona pero no aprende de otros, estard en peligro. —Confucio iBienvenido a Aprendiendo C en 24 horas! Con base en el éxito de la primera edicién en inglés de este libro y fa retroalimentacién de los lectores, hemos reescrito 0 modificado cada une de los eapitulos de la primera in para hacer esta segunda edicién mis adecuada para principiantes como usted que desean comenzar tan pronto como sea posible con el lenguaje de programacién C, Desde luego, es muy normal dedicar mas de 24 horas a entender cabalmente las conceptos y habilidades de programaciGn que se presentan en el libro. Sin embargo, la buena noticia es que el libro ofrece muchos programas de muestra y ejercicios con explicaciones y respuestas clara, Jo que facilita la comprensién de los conceptos del lenguaje C. De hecho, Aprendiendo Cen 24 horas le ofrece un buen punto de partida en la progra- macién en C, ya que cubre los temas importantes de esta programacidin y establece una base sélida para un principiante serio como usted. Después de leer el libro podri escribir por su cuenta programas sencillos de C . Se beneficiard de la lectura de este libro cuando comience a aplicar programas de Ca problemas reales 0 cuando decida aprender otros lenguajes de programacién como Perl, C++ y Java, éQuiénes deben leer este libro? Si ésta es In primera vez que estudia C, este libro estd escrito para usted. De hecho, al escribir el libro di por hecho que Jos lectores no tendrfan experiencia previa en progra- macién. Por supuesto, siempre es una gran ventaja si usted tiene algin conocimiento acerca de las computadoras. Caracteristicas especiales de este libro Este libro contiene los siguientes elementos especiales que hacen mis claro y sencilla para usted asimilar las caracteristicas y conceptos de C al momento de presentari * Quadros de sintaxis * Notas = Precauciones * Tips LZ. Aprendiendo C en 24 horas Los ewadros de sintaxis explican algunas de las caracteristicas més complicadas de C. co- mo las estructuras de control, Cada cuadro consiste en una definicidn formal de la earac- teristica, seguida de una explicacién, El siguiente es un ejemplo de un cuadro de sintaxis: La sintaxis de la funcign malioc() es include main() int ch; printf (*Eseriba, por favor, un cardeter:\n"); ch = gete(stdin); i@: —printf(‘E1 cardcter que acaba de introducir es: sein", ch); fi: return 5 12: } Después de erear y ejecutar el archivo ejecutable INL@1 .exa, se despliegan los siguientes resultados. El usuario introduce el cardcter # y el programa despliega lo que introdujo el usuario, Escriba, por favor, un caricter: x El cardcter que acaba de introducir es: H En la linea 2 del listado IN. 1, s¢ incluye el archivo de encabezado stdia. h para las dos funciones que se utilizan en el programa; geto() y printf(). Las lineas 4.9 12 proporcionan el nombre y cuerpo de Ia funcién maint} vn En Ia linea 6 se declara una variable entera ch, la cual s¢ asigna posteriormente al valor de retomo de la funcién gete() de la linea 9. La linea 8 imprime un mensaje que pide al usuario que introduzca un carfcter con el teclado. La funcién printf () de la linea 8 uti- liza la salida estiindar predeterminada stdout para desplegar mensajes en Ia pantalla. En la Ifnea 9, la entrada estindar stdin se pasa a la funcién getc(), lo que indica que el flujo de archivo se recibird desde el teclado. Después de que el usuario escribe un caric- ter, la funcién gete() devuelve el valor numérico (es decir, un entero) del carécter. Observe que en la linea 9 se asigna el valor numérico a la variable entera ch Aprendiendo C en 24 horas En la linea 10 se despliega en Ia pantalla, con ayuda de printf (), el cardeter introdu- cido. Observe que dentra de la funcidn printf() de la linea 10 se usa el especificador de formato de cardcter ‘se. Preguntas, respuestas y taller Cada hora (es decir, cada capftulo) termina con una secciGn de preguntas y respuestas que contiene las respuestas a preguntas comunes relacionadas con la leccién del capitulo. Después de esta seccidn hay un taller que consiste en un cuestionario y ejercicios de pro- gramacidn, Las respuesta a estos cuestionatios y las soluciones para los ejercicios se pre- sentan en el apéndice B, “Respuestas a los cuestionarios y ejercicios”, Para ayudarle a consolidar la comprensién de cada leccién, le recomiendo responder las preguntas de los cuestionarins y terminar los ejercicios que se incluyen en el taller. Convenciones utilizadas en este libro Por cuestiones gramaticales, en este libro, los mensajes del eddigo y su respectiva salida incluyen caracteres propios del idioma espaol, como caracteres acentuadas, eiies y signos de interrogacién y exclamacién, Debido a que el lenguaje C fue desarrollado consideran- do el idioma inglés, aun cuando podra compilar y ejecutar los programas sin problemas, tal vez estos caracteres no aparezcan como usted espera. Por Io tanto, le recomendamos que no los utilice al seguir los ejemplos del libro. Posterior mente, conforme avance en su aprendizaje del lenguaje C, encontraré que puede colocar los acentos o algtin otro caréc- ter empleando el cardcter ASCII correspondiente. Este libro emplea tipos especiales de letra para ayudarle a diferenciar entre el cédigo de Cy el lenguaje normal y para identificar conceptos importantes * El cdidigo de C esti tipografiado en una fuente especial nonoespaciada. Verd que esta fuente se utiliza en listados, ejemplos de entrada/salida y en fragmentos de c6- digo. La explicacién de las caracteristicas de C, los comandos, nombres de archivo, instruceiones, variables y todo texto que vea en la pantalla también apareceran con esta fuente. * La entrada de un comando y todo lo que se supone que usted introduciré apareceré en una fuente monoespaciada en negritas. Esto lo verd principalmente en las secciones de entrada/salida de los ejemplos. * Los indicadores de posicién en las descripciones de sintaxis aparecerén en una fuente monaespaciada en cursivas. Reemplace el indicador de posicién por el nombre de archivo real, parimetro 0 por cualquier elemento que represente. * Las cursivas resaltan términos técnicos cuando aparecen por primera vez en el texto y en ocasiones se utilizan para destacar aspectos importantes. Introduccion 5) Lo que aprendera en 24 horas Aprendiendo C en 24 horas consta de cinco partes. En la parte 1, “Las fundamentas de ©", aprenderd los aspectos basioos de este lenguaje. A continuacién le presentaré un resumen de lo que aprender en esta parte: La hora 1, “El primer paso”, le presenta el lenguaje C, el estindar ANSI y los reque- rimientos basicos de software y hardware para la programacién en C. La hora 2, “Su primer programa de C”, muestra todo el procedimienta para escribir, compilar, enlazar y ejecutar un programa de C. La hora 3, “La estructura de un programa de C”, le ensefia varios conceptos importantes, como constantes, variables, expresiones € instrucciones. En esta hora también se presenta la anatoméa de una funcién. La hora 4, “Tipos de datos y palabras reservadas”, lista todas las palabras reser- vadas de C. Se presentan detalladamente cuatro tipos de datos, char, int, float y double, Ademds, se explican las reglas para nombrar una variable, La hora 5, “Manejo de la entrada y salida estindar”, le ensefia a recibir la entrada del teclado y a imprimir la salida en la pantalla con la ayuda de un conjunto de fun- ciones de C, como gete(), getchar(), putc(), putchar() y prantf(). La parte II, “Operadores e instrucciones de control de flujo”, hace énfasis en los opera~ dores ¢ instmeciones de control de flujo de C. A continuacién le presentaré un resumen de lo que aprenderd en esta parte: La hora 6, “Manejo de datas”, le ensefia cémo utilizar los operadores de asignacién aritmética, el operador de negacién o unario menos, los aperadores de: incremento/de- cremento, los operadores relacionales y el operador de conversin explicita. In iteraciéin) con las instrucciones La hora 7, “Ciclos”, presenta los ciclos (es d for, while 0.do-while, La hora 8, “Uso de operadores condicionales”, le habla de otros operadores, como Jos operadores légicos, los operadores de bits, el operador sizeot yy el operador 7:, los cuales se utilizan con frecuencia en C. La hora 9, “Modificadores de datos y funciones matemdticas”, describe cémo- usar modificadores de datos para habilitar o deshabilitar el bit de signo, © para cambiar el tamafio de un tipo de datos. Ademds, se presentan varias funciones matemdticas que proporciona C. La hora 10, “Control de flujo del programa”, presenta todas las instrucciones de control de flujo que se utilizan en C. Estas son: if, if-else, switch, break, continue Y¥ goto. Aprendiendo C en 24 horas. En la parte III, “Apuntadores y arregios”, se exponen los apuntadores y arreglos, A con- tinuacisin le presentaré un resumen de lo que aprender en esta parte: ‘La hora 11, “Apuntadores”, le ensefia cémo relacionar variables con apuntadores. ‘También se presentan conceptos camo valor izquierda y valor derecho, ‘La hora 12, “Arreglos", explicn cémo declarar ¢ inicializar arreglos. También se ‘expone la relaciGn que hay en C entre el arreglo y el apuntador, ‘La hora 13, “Cadenas”, se enfoca en la lectura y escritura de cadenas. También se ‘presentan varias funciones de la biblioteca de C. para manipular las cadenas, como strlen(), strony’), gets(), puts() y seanf (). La hora 14, “Aleance y clases de almacenamiento”, presenta el alcance de bloque, ‘cl alcance de funcién, el aleance de programa y el alcance de archivo, Ademés, se cexplican los especificadores 0 modificadores de clases de almacenamiento, como auto, static, register, extern, const y volatile. La parte IV, “Funciones y asignaciGn dindmica de memoria”, se enfoca en las funeiones y en la asignaciGn de memoria dindmica en C. A continuacién le presentaré un resumen de lo que aprenderd en esta parte: La hora 15, “Funciones”, describe la declaracién y definicién de funciones en C. Se cexplica la ereacién de prototipos de funciones, asi como la especificacién del tipo de retomo de las mismas, La hora 16, “Uso de apuntadores”, le ensefia eémo realizar operaciones aritméticas ‘de apuntadores, emo acceder a Ios elementos en arregles utilizando apuntadores y -cémo pasar apuntadores a funciones. La hora 17, “Asignacién de memoria”, explica el concepto de asignacién de memo- ria de manera dindmica, Se presentan funciones de C utilizadas para la asignacién de memoria dinimica, como malloc(), calloc(), realloc() y treet). La hora 18, “Tipos de datos y funciones especiales”, presenta el tipo de datos enun ye uso de typeder. En esta hora también se ensefian la recursiGn de funciones y los argumentos de linea de comandos para la funcién main(). La parte V, “Estructuras, uniones, E/S de archivos y mis”, expone las estructuras, uniones y la E/S de archivos en disco en C. A continuacién le presentaré un resumen de Jo que aprender en esta parte: La hora 19, “Estructuras de datos”, presenta el tipo de datos structure. Aprenderd, a tener acceso a los miembros de una estructura y a pasar estructuras a funciones con Ja ayuda de apuntadores. En esta hora también se exponen las estructuras anidadas. La hora 20, “Uniones”, describe ¢l tipo de datos union, y la diferencia entre union y structure. Las aplicaciones de uniones se muestran en varios ejemplos. Introduccion La hora 21, “Lectura y escritura de archivos”, explica los conceptos de archivo y flujo en C. En esta primera parte se presentan los aspectos bésicos de la entrada y sa- lida de archivos en disco, También se presentan, junto con varios ejemplos, las si- guientes funciones de C: fopen(), felose(), fgete(), fputc(), tgets(), touted), fread(), fwrite() y feof {). La hora 22, “Funciones de archivo especiales”, es la segunda parte de la B/S de archivos en disco, en la que se presentan las funciones fseek(), ftell() y rewind() Para mostrar cémo pueden ayudarle a tener un acceso aleatorio a archivos en disco. Ademés, se ensefian y se invocan en programas de muestra las funciones fscanf (), ‘tprintt() y freopen(). La hora 23, “Compilacién: el preprocesador de C”, describe el papel que juega el preprocesador de C. A través de los ejemplos mostrados en esta hora, puede aprender directivas de preprocesador como #éef ine, Kunde, #ifdef, Kendif, #ifndef, #if, welis ywelse. La hora 24, #;Qué sigue después?”, resume las caracteristicas y conceptos impor- tantes presentados en este libro. Ademés se explican brevemente el estilo de progra- macién, Ia programacién modular y la depuracién. Para posteriores lecturas, se incluye una lista de libros recomendables de C. Ahora, al pasar el mundo a un nuevo milenio, esta usted listo para iniciar el viaje a través del aprendizaje del lenguaje C. Diviértase leyendo este libro y disfrute al pro- gramar en C. ‘Tony Zhang Downingtown, Pennsylvania Enero, 2000 a" 1 4, wih "y, \ PaRTE | Los fundamentos de C Hora El primer paso Su primer programa de C 1 2 3 La estructura de un programa de C 4 Tipos de datos y palabras reservadas 5 Manejo de la entrada y salida estandar Obraz chroniony prawem autorskim Material chraniony prawem autorskim Hora 1 El primer paso Un viaje de mil kilémetros comienza dando el primer paso. —Proverbio-china Los pensamientos elevados deben tener un lenguaje elevado. —Aristéfianes Bienvenido a Aprendiendo C en 24 horas. En esta primera lecciGn aprenderd lo siguicnte: * QuéesC * Por qué necesita aprender C + Elestindar ANSI » Hardware y software requeridos para ejecutar programas de C 12 Hora 1 Qué es C Ces un lenguaje de programacién que fuc desarrollado en 1972 por Dennis Ritchie en AT&T Bell Labs. Ritchie lo denominé C simplemente porque ya éxistia un lenguaje de programacién B. (En realidad, el lenguaje B condujo al desarrollo de C.) Ces un lenguaje de programacién de alto nivel, De hecho, ¢s uno de los lenguajes de programacién de propésito general mas populares. En el mundo de la computacién, entre més alejado esté un lenguaje de programacién de la arquitectura de la computadora, su nivel seri mds alto. Los lenguajes de nivel mas bajo son los lenguajes de maquina que las computadoras entienden y ejecutan directa- mente, Por otra parte, los lenguajes de programacién de alto nivel se asemejan més al enguaje humano (wea la figura 1.1) Figura 1.1 El espectra del lenguaje. El lenguaja human (or eiompin, Ch lengua do maquina rooo11 11101100, {es-deoi, obcigo anario} (0100111031000 Bajo Los lenguajes de programacién de alto nivel, incluyendo a C, tienen las siguientes ventajas + Legibitidad: Los programas son féciles de leer. + Facilidad de mantenimiento: Es fécil dar mantenimiento a los programas. + Portabilidad: Es fécll portar los programas a través de diferentes plataformas de compute. El primer paso 13) La legibilidad y facilidad de mantenimiento del lenguaje C se deben precisamente a su semejanza con el lenguaje humano, en especial con el inglés. Cada lenguaje de alto nivel necesita de un compilader o un intérprete para traducir las instruceiones eseritas en el lenguaje de programacién de alto nivel a un lenguaje de méquina que la computadora pueda entender y ejecutar, Cadla méquina podria necesitar tun compilador o intérprete distinto para el mismo lenguaje de programaciéin, Por ejemplo, yo utilizo el compilador C de Microsoft para compilar en mi PC los programas de este libro. Si tuviera que ejecutar estos programas en una estacién de trabajo basada en UNIX, tendria que compilarlos usando otro tipo de compilador de C, Por lo tanto, la portabilidad de los programas escritos en C se logra recompilando estos programas con diferentes compiladores para distintas méquinas (vea la figura 1.2). Froura 1.2 mercmrornes zap» ems — ee one (A evrene CEP ones CaF + seas [4 Hora 1 ‘Ademiis, el lenguaje C tiene otras ventajas. Los programas escritos en este lenguaje pueden ser reutilizados, Usted puede guardar partes de sus programas de C en un archivo de biblioteca © invocarlas en su siguiente proyecto de programacién simplemente inclu- yendo dicho archivo, Muchas tareas de programacién comunes y Gtiles ya estén implemen- tadas en bibliotecas que vienen incluidas con los compiladores. Ademés, las bibliotecas le permiten desencadenar con facilidad el poder y la funcionalidad del sistema aperativo que esté empleando. En el resto de este libro trataremos més detalles sobre el uso de funciones de biblioteca de C, Ces un lenguaje de programacién relativamente pequefio, lo que to hace més fécil para. usted. No tiene que memorizar muchas palabras clave © comandos antes de empezar a escribir programas de C que resuelvan problemas reales Para quienes buscan velocidad conservando la conveniencia y la elegancia de un lenguaje de alto nivel, probablemente C sea la mejor eleccidn. De hecho, C le permite tener el control del hardware y de los periféricos de 1a computadora. Es por ello que en ocasiones. ‘este lenguaje se le Hama el lenguaje de programacién de alto nivel mas bajo. han sido desarrollados con base en C. Por ejemplo, Perl es ‘Varios lenguajes de alto un conocido lenguaje de programacién en el disefio. de World Wide Web (WWW) a tra- vvés de Internet. En realidad, Perl tiene muchas caracteristicas de C. Si usted entiende C, aprender Perl le ser muy fécil. Otro ejemplo es el lenguaje C++, el cual es simplemente una versién ampliada de C, aunque C++ facilita la programacién orientada a objetos. I si usted ya conoce C. Incluso aprender Java es mucho mis f pilados y lenguajes interpretados, ‘Antes de poder ejecutar el programa en su méquina, necesita un compilador para traducir un programa escrito en algin lenguaje compilado a un cédiga que la maquina entienda (es deci @-cédigo binario). Una ver hecha la tra- duccién, puede guardar el cédige binario en un archivo de aplicacién. Puede f En general, existen dos tipos de lenguajes de programacién: lenguajes com- El primer paso 15) mantener operando el archivo de-aplicacién sin ei compilador, a menos que el programa (cédigo fuente) sea actualizado y tenga que recompilarie. Al cédigo binario o archivo de aplicacién también se le-conoce como cédigo ejecutable (o archivo eecutable). Por otra parte, usted pede lejecutar in pecigrama excrita en un lenguaje interpretado inmediatamente después de terminar de escribiria, oo que es igual, mientras lo escribe. Pero, en tiempo de ejecueién, dicho programa slempre necesita un intérprete para traducir las instrucciones de alto nivel a instrucciones que entienda la maquina (cédigo binario). No puede ejecutar el programa en una maquina, a menos que tenga el intérprete adecuado. Puede considerar a C como un lenguaje compilado, debido a que la mayoria de los fabricantes de este lenguaje sélo hacen compiladores para manejar programas escritos en C. Sin embargo, no hay nada inherente a un lenguaje compilado que impida que alguien proporcione un intérprete para dicho lenguaje; asimismo, hay quienes. escriben compiladores para lenguajes interpretades. De hecha, escoman mezclar las dos modalidades de lenguajes; un ejemplo de esto es cuando un programador compil cédigo fuente en un pequefio archivo binario, el cual es ejecutado posteriormente por un intérprete en thempo de ejecucién_ El estandar ANSI de C ‘Durante muchos afios, el estindar de facto para C fue él libro El lenguaje de programacin C, escrito por Brian Kernighan y Dennis Ritchie en 1978. Este libro se conoce en In comu- nnidad de programacién simplemente como Ki&eR (en referencia a las iniciales de los autores), y a la fecha tiene tn hugar en tos libreros de muchos programadores. Sin embargo, el libro fue escrito. como una introduccién a C, no como un estindar general u oficial del lenguaje. Debido a que distintos fabricantes ofrectan diversas implementaciones del lenguaje C, las diferencias entre dichas implementaciones comenzaron a apareces. ‘Temiendo que C perdiera su portabilidad, un grupo de fabricantes de compiladores y desarrotladores de software solicité en 1983 al ANSI (Instituto Estadounidense de Estandares Nacionales) que creara un esténdar del lenguaje C. El instituto aprobs la solicitud y forms el Comité Técnico X3J11 para que trabajara en el estindar de C. A finales de 1989, el comité aprobé el esténdar ANSI del lenguaje de programacién C. El estindar ANSI de C mejora el estindar original K&R y define un grupo de funciones de uso comin de C que se conoce come la biblioteca estindar ANSI de C, En la mayorfa de los casos, los compiladores de C incluyen la biblioteca estiindar, junto con otras bibliotecas para proporcionar algunas otras funciones especificas del compilador. Este libro se centra en las funciones de C definidas en el estdndar ANSI, el cual manejan todos los fabricantes de compiladores. Todos los programas de este libro pueden ser 16 Hora 1 compilados por cualquier compilador que se apegue al estiindar ANSI. Si esta interesado en un compilador especifico, puede aprender sus funciones especificas en su respective manual de referencia. Suposiciones acerca del lector No necesita ninguna experiencia previa en programacién para aprender el lenguaje C can este libro, aunque seria mejor si tuviera algdn conocimiento acerca de las computadoras Ademés, depende de usted determinar qué tan réipido quiere recorrer las 24 horas de este libro: podria sentarse con un gran tarre de café y acabarlo en una sola sesién, © podria tomar una hora al dia durante 24 dias Después de terminar este libro, habiendo realizado todos los ejercicios it dos en él, deberd manejar apropiadamente la sintaxis y las caracterfsticas del lenguaje C. Ademés, ya tendrd cierta experiencia en muchas de las tareas que: se encuentran al programar en C. Cuando esté listo para emprender sus propios proyectos de programacién, serd capaz de usar C como una herramienta para escribir programas utiles y poderosos. Conforme vaya avanzando, enconirard que siempre hay mis que aprender, no sélo acerca de C y de ‘c6mo aprovechar su poder, sino también acerca de nuevas tecnologias ¢ ideas de progra macién en general. Con esfuerzo y mucha préctica podré apoyarse ripidamente en las habilidades y teenologfas que aprenda. Configuracién de su sistema Basicamente, todo lo que necesita para compilar y ejecutar sus propios programas en C @ los de este libro, es una computadora y un compilador de C, En las siguientes secciones se describen el hardware y software recomendados. Hardware Cualquier computadora que tenga 0 que pueda acceder a un compilador de C esta bien. El compilador de C debe ser compatible con el ANSI-C, Es muy probable que tenga una PC sobre su escritorio. Una PC 286 con un disco duro de 50 MB y | MB de memoria (RAM) cs quizés ¢l minimo requerido para ejecutar un compilador de C basado en DOS. Para un compilador de C basado.en Windows, su computadora debe tener un disco duro mis grande y mas memoria. Para més detalles sobre requerimientos. de hardware, consulte al fabricante de su compilador. Software Si utiliza una estacién de trabajo basada en UNIX, tal vez ya tenga un compilador de C cargado en su maquina, © por lo menos puede acceder a uno en un servidor. Consulte a su administrador de sistemas para saber cémo acceder a un compilador compatible con el El primer paso 19) La figura 1.4 muestra ¢l IDE con el texto que acaba de escribir. No se preocupe por el significado del texto, En cl siguiente capitulo, “Su primer programa de C”, se lo explicaré, Ficura 1.4 Cédigo escrito enel IDE de Viswal Co 5.0, ‘A continuacién necesita guardar el texto como un archivo. Llamaremos a este archivo MiprimerPrograma.c. También es una buena idea crear un directorio en su disea duro. para almacenar sus proyectos de programacién, y guardar ahf el archivo, Primero haga clic em el botén Save de la barra de herramientas. Haga clic en el bovin New Folder del cuadro de didlogo Save As. Después haga doble clic en esa carpeta para abvirla, escriba, MiPrimerPrograma.c en el cuadro File Name, y haga clic en Save. Observe que se utiliza Ja-extensién .¢ para indicar que el archivo que acaba de guardar es un programa de C. Ahora necesita hacer clic en el mend Build y seleccionar la opcién Compile MiPrimerPrograma.c. Al hacerlo, solicite al compilador que compile el texto que acaba, de escribir y guardar (vea la figura 1.5). En este punto, Visual C++ podrfa pedirle que cree un nuevo espacio de trabajo; sélo haga clic en Yes y éste se creari en forma automitica. No debe haber errores o advertencias en la ventana de resultados después de ejecutar el compilador. Después haga clic de nuevo en el mend Build, y esta vez elija la opeién Build MiPrimer- Programa exe, la cual producird finalmente un archive ejecutable Hamado MiPrinerro- grama.exe. La figura 1.6 muestra que no hay errores © advertencias después de generar MiPrinerPrograma 20 Frouna 1.5. Conpitactén de wn programa de Cen el IDE Ficuna 1.6 Creacién del archivo efecutable de un programa. Ahora est usted listo acaba de compilar, Programa.exe. Al a que dicho archivo peiatd(itia, amiga! Ente we ai priser programe te 6.58): Fran fb} =U erzoe{a). 0 warning (s) EEE Cp ta, ange! fees ae primer propria fw» Oarrarte). 0 warsiegée) correr el archivo ejecutable, WiPrimerPrograna. exe, que hacerlo mediante la siguiente ruta: Build, Execute MiPrimer- el archivo ejecutable le aparecerd una ventana de DOS, debido aplicacién de modo de consola (yea la figura 1.7). El primer paso Ficura 1.7 Ejecucién de un pro- sprama de C. En fa figura 1.7 puede ver que la primera linea de la ventana de DOS es la misma que acaba de escribir: “jHola, amigo! Este es mi primer programa dé C.” En realidad, éste es el resultado de su primer programa (observe que Ia segunda linea de la ventana de DOS es sdlo un aviso del indicador de comandos del DOS). ‘Muy bien. Acabo de mostrarle cémo usar el compilador de Visual C++ para escribir y compilar un programa de C, y c6mo hacerlo ejecutable. Para més detalles, necesita leer libros como Aprendiendo Visual C++ 5 en 2! dias, el cual se enfoca en ensefiarle c6mo usar el compilador de Visual C++. Uso del compilador de Borland En esta seccién vay a mostrarle.cémo usar el compilador de C que viene con el paquete (C++ de Borland. El procedimiento de esta seceién es muy similar al de la anterior. Si necesita aprender mis detalles sobre cémo instalar ef C+-+ de Borland, siga las instrue- ciones que vienen con el compilador. Daré por hecho que ya instalé una copia de Borland C++ 5,02.en su computadora. Para iniciar el compilador, puede hacer clic en el botdn Inicio de su barra de tareas de Windows 95 (o Windows 98, NT 0 2000) y seleccionar Programas, Borland C++ 5.02, Borland C++. O bien, puede simplemente ejecutar el archivo de aplicaeién bew. exe direc- tamente desde el directorio (carpeta) en el que instalé el paquete Borland C++. La figura 1.8 muestra un ejemplo del entomo de desarrollo integrado (IDE) de Borland C++ 5.02. Después puede abrir un archivo nuevo dentro del IDE, y escribir el siguiente texto en el espacio del archivo recién abierto: ‘finclude main() { printf return “THola, andgol Este es mi primer programa de C.\n"); 2 Hora 1 Ficura 1.8 Creacién de un programa en el IDE de Borland C++, La figura 1.9 n significado del texto. Figura 1.9 Cima guardar terto de un programa de C en ef IDE de Borland. se preocupe porel El primer paso ‘Ahora necesita guardar el texto como un archivo. Llamaremos a este archivo MiPriner Prograna.c. Observe que se utiliza la extensiGn © para indicar que el archivo que acaba de guardar es un programa de C. ‘Ahora necesita hacer clic en el mend Project y seleccionar la opcién Compile. Al hacerlo, solicite al compilador que comience a compilar el texto que acaba de escribir y guardar. La figura 1.10 muestra que no hay errores o advertencias después de compilar MiPriner Prograna.c y crear MiPrimerPrograma. exe Frcuna 1.10 Como compiler wn programa de Cen el IDE de Borland, Ahora estd usted listo para correr el archivo ejecutable, MiPrimerFrograma.exe, que acaba de compilar. Puede correrlo haciendo clic en el boton Run de la barra de herra- mientas, o puede ejecutarlo directamente desde el directorio en donde lo cred. Al correr el archivo ejecutable le aparecerd una ventana dé DOS, debido a que dicho archiva es en realidad una aplicacién de DOS (ves ta figuen 1.11). Frcuna 1.11 Ejecucién de un programa de Cen el IDE de Borland. 23) 24 Hora 1 La figura 1.11 exhibe el resultado exactamente como usted acaba de escribirlo: “jHola, amigo! Este es mi primer programa de C.” En realidad, éste es el resultado de su primer programa de C. Si desea aprender mas detalles sobre edmo usar Borland C+-+, lea un libro como Aprendiendo Borland C++ en 21 dias, Resumen En esta primera leccidn aprendié los siguientes elementos bisicos acerca del lenguaje C: + Ces.un lenguaje de programacién de propdsito general, + Ces.un lenguaje de alto nivel que tiene las ventajas de legibitidad, facilidad de ‘mantenimiento y portabilidad. + Ces.un lenguaje muy eficiente: que permite controlar el hardware y los periféricos de la computadora. + Ces un lenguaje pequefio que usted puede aprender en un tiempo relativamente breve, * Los programas escritos en C pueden reutilizarse, « Los programas escritos en C deben compilarse y traducirse a un eddigo legible para Ia méquina antes de que la computadora pueda ejecutarlos. Muchos lenguajes de programacién, como Perl, C++ y Java, han adoptado concep- tos bisicos y caracteristicas tiles del lenguaje C. Una vez que aprenda C, le sera mas sencillo aprender estos otros lenguajes. + Los fabricantes de compiladores de C manejan el estiindar ANSI de C para mantener Ta portabilidad de los programas escritos en este lenguaje. Puede utilizar cualquier compilador compatible con el ANSI C para compilar todos Jos programas de C incluidas en este libro. En Ja siguiente lecci6n aprender a escribir su primer programa de C. El primer paso 25) Preguntas y respuestas P ;Cudl es lenguaje de-nivel mas bajo-en el mundo de la computacién? R El lenguaje de maquina de la computadora, conformado por ceros y unos, es el de més bajo nivel, debido a que es el tinico lenguaje que la computadora puede enten- der en forma directa. 1 Cuailes son las ventajas de los lenguajes de programacién de alto nivel? R La legibilidad, la facilidad de mantenimiento y Ia portabilidad son las principales ventajas de los lenguajes de alto nivel. 2Qué es C, en tiltima instancia? R Ces um lenguaje de programacién de propésito general, y es un lenguaje de alto nivel que tiene ventajas como la legibilidad, facilidad de mantenimienta y portabi- lidad, Ademis, C permite descender al nivel del hardware para incrementar, si es necesario, la velocidad de rendimiento. Se necesita un compilador de C para traducir los programas escritos en C a un cédigo que la maquina entienda. La portabilidad de estos programas se logra recompilindolos con compiladores de C especificas para cada tipo de computadora, {Puedo aprender C en poce tiempo? R Sf. Ces un lenguaje de programacién pequefio. No hay muchas palabras clave 0 comandos que recordar, Ademis, es muy fiicil leer y escribir los programas de C, ya que éste es un lenguaje de programacién de alto nivel muy parecido al lenguaje humano, en especial al inglés. Por lo tanto, usted puede aprender C en un tiempo relativamente corto. ~ ” ” lidar la comprensidin de la lecciéin de esta hora, le recomiendo que responda el ‘cuestionario de este taller antes de pasar a la siguiente leccién, Las respuestas y sugeren- 3: 4: main() Bt 8: printf (*iHola, amigo! Este es mi primer programa de C.\n*); 7: return a: } Este es un programa de C muy sencilllo que esté guardado en un archivo de nombre 82L01.c. Observe que el nombre de un programa de C debe tener la extensiGn .¢. Si instal un compitador de Cy configuré el entomo de desarrollo correspondiente, podré compilar este programa y convertirlo en un archivo ejecutable. Ms adelante en este capitulo le diré cémo hacer un archivo ejecutable, En la hora anterior aprendié esimo escribir un programa en su editor de texto y eémo- guardarlo como un archivo de programa de C. Quizéi haya observado que a diferencia del ejemplo del capitulo anterior, en este ejemplo cada Linea esté numerada, Sélo hago esto para tener una referencia al momento de explicar lo que hace cada linea del programa. A diferencia de otros lenguajes como BASIC, el lenguaje C no emplea mimeros de linea, De hecho, si usted escribe los niimeros de linea en el listado, su programa no funcionard_ Asi que cuando escriba estes programas recuerde no poner los miimeros de linea que se miuestran én el libro. (Das cosas que puede notar al mirar el listado 2.1 son los caracteres de punto ycoma y la sangria en las lineas 6 y 7. A diferencia de otras lenguajes, como BASIC, e! final de una linea no tiene un significado especial en C. Es.comple- tamentte valido (y recomendablle, en muchos casos) dividir una instruccién en varias lineas pare dar claridad. En general, una instruccién individual de € termina con un punta y coma; pero posteriormente veremos mucho mas.al respecto, La sangria sirve para identificar los distintos niveles de un progra- ma en una especie de formato esquemitico, La funcién main() es el nivel Su primer programa de C 23) Principal del programa, de modo que va a la extrema izquierda. Las lineas 6 y 7 son parte de main), asi que tienen una sangria de un nivel hacia la derecha. Por lo regular se emplea la tecla Tab para sangrar un nivel antes de comenzar a escribir, Debemos sefialar que al igual que con los nimeros de linea, el compilador no realiza el sangrado; ni siquiera Ia nota. El progra- mader es libre de usar cortes de linea y sangrado, conacidas como espacias ‘en blanco, para hacer qué el programa lurca legible, Este es un asunte de ‘estilo, pero es buena idea sequir las convenciones aceptadas generalmente a fin de que otros programadores puedan entender sus programas y viceversa. ‘Observe el uso del espacio en blanco al avanzar en este libro y siéntase en libertad de desarroliar su propio estilo. Yo configuré mi entomo de desarrollo de tal manera que todos los programas de este libro se pudieran compilar y convertir en aplicaciones de consola, Por ejemplo, #2L81 exe esl nombre de la aplicacién de consola generada a partir de @2L01..c. Observe que se incluye -exe como la éxtensiGn del nombre de un programa de aplicacién de DOS o Windows (es decir, un archivo ejecutable). Ademés, guardo todos los archivos ejecutables generados a partir de los programas. de este libro en un directorio de mi computadora lamado ¢:\apa. Por Jo tanto, si escribo @2L01 ‘desde el indicador de comandos de DOS y oprimo la tecla Entrar, puedo ejecuiar el archivo ‘ejecutable 02101 .exe y exhibir en la pantalla el mensaje 1Hola, amigo! Este es mi primer programa de C. El siguiente resultado es una copia de la pantalla: Ey iHola, amiga! Este es mi primer programa de C. Comentarios Veamos ahora mds de cerca el programa de C del listado 2.1. La primera linea contiene un comentario: I eat Este es mi primer programa de C */ Puede observar que esta linea comienza con una combinacién de diagonal y asterisco, /*, y termina con */. En C, ala combinacién /* se le denomina marca de apertura de comentario, y ala combinaci6n */, marca de cierre de comentario. El compilador de C ignora todo Io que se encuentra entre las marcas de apertura y de cierre de comentario. Esto significa que el compilador ignora por completo el comentario de la primera linea Usted puede ver que esta Kinea comienza con un signo de numeral. #, seguido por include. En C, #include forma una directiva de preprocesadar que indica al prepracesador de C que busque un archive y cologue el contenido de ese archivo en donde la directiva include indique. El preprocesador es un programa que hace algunos preparativos para el compilador de ames de compilar su eédigo. En la hora 23, “Compilacién: el preprocesador de C, se exponen mais detalles acerca del preprocesador. ‘También puede ver en esta linea que esté después de la directiva Winclude. Podia pensar que él archivo solicitado por la directiva #include es algo Hamado stdio.h. Tiene raz6n. Aqui, la directiva #include solicita al preprocesador de C que busque y coloque el archive stdio.h en el lugar del programa donde se encuentra la directiva. 3 2 Hora 2 El archivo stdio.n significa encabezade de entrada-salida esténdar. Este archivo con- tiene numerosas prototipos y macros para realizar operaciones de entrada o salida (E/S) de programas de C. Veré mas de la E/S de programas en la hora 5, “Manejo de la entrada y salida estndar”, Algunos sistemas operatives distinguen entre letras maydsculas y mindsculas, pero otros no lo hacen. Por elemplo, stdio.hy STDIO.H son nombres kdénti- «0s.en una PC. pera san diferentes en UNIX. Archivos de encabezado Los archivos que se incluyen mediante la directiva #ineiude, como stdio.h, se denomi- nan archivas de encabezade debido a que las directivas #inelude se colocan casi siempre: al inicio, o a la cabeza, de los programas de C, De hecho, la extensidn .h significa “header” (encabezado), y se suele hacer referencia a ellos como archivos punto h. Ademdis de stdio.n, existen mis archivos de encabezado, como stdiib.n, string.h, math.n, etcétera, En el apéndice A, “Archivos de encabezado del estindar ANSI”, se proporciona una lista de todos ellos. Los archivos de encabezado especificos que necesite incluir dependerin de las fanciones especificas de biblioteca que pretenda Ilamar, La docu mentacién de las funciones de biblioteca le diré qué archivo de encabezado se requiere. Paréntesis angulares (< >) y comillas dobles (* “) En la segunda linea del listado 2.1 hay dos paréntesis angulares, < y >, que se usan para ‘encerrar a stdio.n. Tal vez se preguate para qué sirven los paréntesis angulares. En C, Jos parémesis angulares solicitan al preprocesador de C que busque un archivo de vencabezado en un directorio distinto al actual, Por ejemplo, en mi computadora, el directorio actual que contiene el archivo #2101 .¢ se lama ¢:\code. Por Io tanto, los paréntesis angulares que rodean a |e indican al prepracesador de C que busque el archivo stdio.h en un directorio diferente a C: \code. Si desea que el preprocesador busque primero en el directorio actual antes de buscar en otra parte, puede utilizar comillas dobles para encerrar el nombre del archivo de encabe- zado, Por ejemplo, cuando el preprocesador de C ve “stdio.h*, busca primero el archivo de encabezado stdio.h ca el directorio actual, que en mi méquina es G: \cede, antes de buscar en otra parte. Los archivos de encabezado se guardan normalmente en un subdirectorio denominado include. Por ejemplo, yo instalé un compilador de C de Microsoft en el directorio MSVE de mi disco duro, el cual est etiquetada como la unidad ¢. Entonces, la ruta de acceso al archivo de encabezado se convierte en G: \MSVC\ include. Su primer programa de C 33] Por lo regular, el compilador determina, al momento de instalarlo, la ruta de acceso en donde se guardardn los archives de encabezado, A esto se le conoce cominmente como el directorio include o Ia ruta de acceso include de su entomo. No tendré que preocuparse por el directorio include, sino hasta que cree sus propios archivos de encabezado. Por ahora, slo necesita especificar el nombre del archivo de encabezado que desea incluir. La funcién main() En la linea 4 del listado 2.1 se encuentra la siguiente funci6n: main () Esta es una funcidin muy especial en C. Todo programa de C debe tener una (y s6lo una) funcién nain(), En la hora 3, “La estructura de un programa de C”, se proporcionan explicaciones mis genéricas acerca de las funciones, Puede colocar la funcién main() en cualquier lugar de su programa de C. Sin embargo, la ejecueién de su programa siempre comienza con la funcién main(). Si crea otras fun- ciones en su programa, nain() siempre se ejecutard primero, incluso si esti al final de su archivo de programa, En el listado 2.1, el cuerpo de la funci6n ain() inicia en la linea 4 y termina en la linea 8. Debido a que éste es un programa muy sencillo, main() es 1a tinica funcién definida en el programa. Dentro del cuerpo de la funcién main() se lama a una funcién de biblioteca de C, printf(), a fin de imprimir un mensaje de saludo (vea la linea 6). En la hora 5 se abordan mds detalles acerea de print#(). ‘Otra cosa importante respecto a main() 4 que In ejecucién de todo programa de C ter ‘mina con main(). Un programa concluye cuando se han ejecutado todas las instrucciones dde la funcién main(). El cardcter de nueva linea (\n) Algo que vale la pena mencionar acerca de la funcién printf () ¢s el cardcter de nueva linea, \n. Por lo regular agregado como sufijo al final de un mensaje, el caricter de i Ja computadora que mueva el cursor al inicio de la siguiente linea, para que cualquier cosa que se imprima después de! mensaje comience en la siguiente Vinea de la pantalla, ‘En un entomo UNIX, \n pasa a la siguiente linea por sf mismo, pero deja el cursor en la posicién en que estaba en la linea anterior. En este caso, es necesario imprimir \r\n en ‘vez de solamente \n, El cardicter \r es el caricter de retorno de carro. Al ejecutar los programas de muestra de este libro, podri saber de inmediato si el cursor regresa al prin scipio de la nueva linea; si no es asi, simplemente vtilice \r\n siempre que ves \n en los listados de programas. Hora 2 El ejercicio 3 de esta leccidn le da la oportunidad de utilizar el cardcter de nueva linea para dividir en dos lineas wn mensaje de una linea, La instruccién return En C, todas las funciones devuelven valores. Por ejemplo, al crear una funcién para sumar dos ndmeros, usted puede hacer que dicha funcién le devuelva el valor de Ia suma. La funcién main() por si misma devuelve un valor entero. En C, los enteros son mimeros decimales sin fracciones. Por lo tanto, en la linea 7 del listado: 2.1 hay una instruccién, return @;, que indica que la funcién main() devuelve un @ y el programa termina normalmente. Hay casos en los que debe terminar sus programas debido a una condicidn de error. Cuando eso sucede, puede devolver valores distintos a @ para indicar al sistema operativo (o al programa que ‘ejecut6 su programa) que hubo un error, La funcién exit() ‘También existe una funcién de biblioteca de C, exit(), que se puede utilizar para terminar un programa. Debido a que la funcién exit () esta definida en el archivo de encabezado std1ib-h, usted debe incluir el archive de encabezado al principio de su programa para poder usar la funcién. La funcién exit()no devuelve un valor a su programa por sf misma. ‘Observe que return y exit () también se pueden usar en otras funciones. En lo que resta del libro vers més ejemplos de Ia palabra reservada (0 palabra clave, como también se le conoce) return. Compilacién y enlace Ya debe estar ansioso por saber cémo se hace un archivo ejecutable. Veamos cémo se ‘compila un programa de C y cémo se traduce a un archivo ejecutable. Como se muestra en Ia figura 2,1, se necesitan por lo menos tres pasos para crear un archive ejecutable. Primero se hace un archivo de programa escrito en C, denominado eddige fuente, EL nombre del archive de cédige fuente termina con la extensién .¢ Después, un compiladar de C compila el archive de cédigo fuente y crea un nuevo ar- chivo. El nuevo archivo es un archive objeto, En el sistema operative UNIX, el nombre del archivo objeto termina con la extensién 0, En los sistemas operatives DOS y Windows, la extensidn es .obj No es posible ejecutar el archivo objeto debido a que falta cierto cédigo de funciones. Es necesario coneluir el paso siguiente: el enlace. Este se hace invocando a un programa especial Ilamado enlazador, el cual viene normalmente con ¢l paquete del compilador. Su primer programa de C 35) Un enlazador se emplea para vincular el archivo objeto, la biblioteca estindar de C y otras bibliotecas generadas por el usuario para producir un archivo ejecutable: el eédigo binaria, En esta etapa, el cédigo binaria de las funciones de biblioteca que se llaman en el eddigo fuente se combina con el archivo objeto; el resultado se guarda en un nuevo archivo: un archivo ejecutable. Como aprendid en el primer capftulo de este libro, el nombre de un archivo ejecutable de DOS o de Windows termina por lo regular con la extensién .exe (com es otra extensiGn que se usa para un nombre de archivo ¢jecutable de DOS), En UNIX no es necesario incluir dicha extensiGn en el nombre de un archivo ejecutable, Frouna 2.1 Creacién de un peemoaene te active Pree archivo ejecuable ‘sti \ mediante el compi- st. ladory l enlacador o—s N Miés adelante aprenderd que: en muchos casos tal vez tenga que enlazar varios archivos objeto a fin de crear un programa ejecutable. Observe que tanto el archive objeto como el archivo ejecutable son dependientes de la miquina. Usted no puede simplemente pasar un archivo ejecutable de la plataforma de eGmputo actual a otra que sea operada por un sistema operative distinto, aunque el eddigo fuente de ese archivo ejecutable, presumiblemente escrito en ANSI C, podria ser inde- pendiente de la méquina (es decir, portable). 3 6 Hora 2 La portabilidad es un concepte importante en C, ya que fue una de las metas. que #include “stdio.n"? 2. Bs el momento de que escriba tn programa por su cuenta. Tomando como referencia el programa del listado 2.1, escriba un programa de C que imprima el mensaje: Es divertida escribir mi propio programa de C. 3. Actualice el programa del listado 2.1 agregando un cardcter mds de nueva I{nea dentro del mensaje que imprime la funcién printf (). Después de ejecutar el archive ejecutable actualizado, debe ver en la pantalla dos Ifneas del mensaje: 4, ;Qué mensaje de error o advertencia, si lo hay, obtendré al compilar el siguiente programa? Winelude Winclude nain() { printf (*iHola, amigo! Este es mi primer programa de C.\n* exit( » 5. :Qué mensaje de error obtendri del siguiente programa cuando intente compilarlo? void main() t print (‘iHola, amigo! este es ai primer pragrana de C.tn"); return @; 3 9 Material chroniony prawem autorskim oh i Ss = = — = HorA 3 “ La estructura de un programa de C El entero es igual ala suma de sus partes. —Euclides En la hora 2, “Su primer programa de C”, vio y escribi6 algunos programas sencillos en C. También aprendié acerca de la estructura basica de un pro- grama de C. Usted sabe que un programa escrito en C se tiene que compilar antes de que pueda ser ejecutado. En esta leccién aprender mas de lo fun- damental de un programa de C, como por ejemplo: * Constantes y variables + Expresiones: * Instrucciones * Bloques de instrucciones + Tipos y nombres de funciones de C + Argumentos para funciones + El cuerpo de tna funcién + Llamadas a funciones Hora 3 Los elementos basicos de un programa de C Asi como un edificio esti hecho de ladrillos, un programa de C esti hecho de elementos hasicos, como expresiones, instrucciones, bloques de instrucciones y bloques de funcio- nes, Estos elementos se explican en las siguientes secciones. Pero antes necesita aprender dos elementos mas pequefios pero importantes, las constantes y las variables, las cuales conforman las expresiones. Constantes y variables ‘Como su nombre indica, una constante es un. valor que nunca cambia. Por otra parte, una variable se puede usar para presentar diferentes. valores. Puede comparar a una constante con un disco compacto de la miisica almacenada en el disco compacto nunca cambia. Una variable es mas parecida a un casete de audio: usted puede actualizar el contenido del casete simplemente sustituyendo las canciones que tenia por otras nuevas. Puede ver muchos ejemplos en los que hay constantes y variables en la misma instruc- cidn, Considere, por ejemplo, la siguiente; et en donde el sfmbolo 4 ¢s una Constante ya que siempre tiene el mismo valor (1), y al simbolo i s¢ le asigna la constante 1. En otras palabras, i contiene el valor 1 después de ejecutar Ia instruccién. Luego, si hay otra instruccién, 110; después de que se ejecuta esta instruccién, a i se le asigna el valor 18. Debido a que i puede contener diferentes valores, en el lenguaje C se le llama variable. Expresiones ‘Una expresién es una combinacién de constantes, variables y operadores que se emplean para denotar célculos Por ejemplo, la siguiente: (2+) "10 es una expresién. que primero suma 2 y 3, y después multiplica el resultado de la suma por 10. (El resultado final de la expresién es 58.) En forma similar, la expresién 18 * (4 + §) produce 99. La expresién 80/4 da como resultado 20. Aqui tenemos otros ejemplos de expresiones: La estructura de un programa de C Expresion Descripcion 8 Una expresién de una constante. i Una expresién de una variable. eri ‘Una expresién de una constante més una variable. exit(®) ‘Una expresién de llamada a una funcién. Operadores Como ha visto, una expresién puede contener simbolos como +, estos simbolos se denominan operadores aritméticos. La tabla 3 todos los operadores aritméticos y su significado, y 7. Enel lenguaje C, presenta una lista de: Tapia 3.1 Operadores aritméticos de C Simbolo __Significacto . Suma Resta . Multiplicacién ‘ Divisién ’ Residuo (¢ médule) Tal vez ya esté familiarizado con los operadores aritméticos, con excepcién del de resi- duo (*). Este operador se usa para obtener el residue de la divisin del primer operando entre el segundo. Por ejemplo, la expresi ona produce un valor de 2 debido a que 4 cabe una vez en 6 con un residuo de 2. El operador de residuo, *, también se conoce como operador de médulo, Entre los operadores aritméticos, los operadores de multiplicacién, divisidn y residuo tienen una precedencia més alta que los operadores de suma y resta. Por ejemplo, la expresion ator da como resultado 32, no 56, debido a que el operador de multiplicacién tiene mayor precedencia que el de:suma, Primero se calcula 3 * 1@ y después se suma 2 al resultado de ta multiplicacién. 43 Hora 3 Como quiz sepa, puede colocar paréntesis alrededor de una suma (o de una resta) para forsar que la summa (6 resta) sé realice antes de un céleulo de multiplicacién, divisién o mdédulo, Por ejemplo, la expresién (2+ 3)" 10 realiza primero la suma de 2 y 3 antes de multiplicar el resultado por 10. ‘La coma y el punto y coma son. operadores empleados en la sintaxis. En general, cl punto Y coma se utiliza para indicar el final de una instruccién, como veri més adelante. La ‘coma se usa en ciertas instancias én las que una instruccién consta de una lista de expre- siones o declaraciones, Aprenderi més operadores del lenguaje C en la hora 6, “Manejo de dato: hora 8, Uso de operadores condicionales”. Identificadores Junto con los niimeros (como la constante 7) y los operadores (como él simbolo +), las cexpresiones también pueden contener palabras denominadas identificadores. Los nombres de funciones (como exit) y los nombres de variables (como i), asi como las palabras reservadas son identificadores de C. yenla | siguiente es un conjunto de caracteres que usted puede utilizar para formar un ideatifi- 3: 4: main() 5: { 8: printf (*iHola, amigo! Este es mi priner pragrana de C.\n*); 7: return @; El principio y el final de una funcién Como ya se habré dado cuenta, se emplean Ilaves para sefialar el inicio y el final de una funcién. La lave de apertura ({) indica el comienzo del cuerpo de una funcién, mientras qué la Have de cierre (}) marca el fin del cuerpo de ta funcién. Como se mencioné antes, también se utilizan llaves para marcar el inicio y el final de wn blogue de instrucciones. Puede pensar en ello como una extensiGn natural para usar laves con las funciones, ya que una funcién consta de una o varias instrucciones. El cuerpo de la funcién En una funcién, el cuerpo de la misma es el lugar que contiene declaraciones de variables y otras instrucciones de C. La tarea de una funcién se lleva a cabo mediante la ejecucién de las instracciones, una a la vez, que se encuentran dentro. de su cuerpo. Es importante recordar que toda declaracién de variable se debe colocar al principio del cuerpo de la funcién. Es ilegal poner declaraciones de variables en cualquier otra parte que no sea él inicio de un bloque de instrucciones. ‘Si el cuerpo de su funcién contiene declaraciones de variables, debe colocar dichas declaraciones antes que cualquier otra instruccién. El listado 3.1 muestra una funcién que suma dos enteros especificados por sus argumentos, y devuelve el resuliado de la suma, La estructura de un programa de C 49) Lustape 3.1 Una funcién que suma dos enteros vs 3.0 1 Esta funci6n suna gos enteros y devuelve el resultado */ 2: int suma_enteros ( int x, dot y ) af 4 int resultado; 5: resultado = x + ys 6: return resulted; 7 } Como aprendi en la hora 2, la linea 1 del listado 3.1 es un comentario que describe lo que la funcién puede hacer. Observe que en la linea 2 se pone el tipo de datos int como prefijo, antes del nombre de Ja funcién, Aqui, int se utiliza come el tipo de funcién, lo que significa que la funcién devuelve un entero, El nombre de ta funcién que se muestra en la linea 2 es suma_enteros. La lista de argumentos de la misma I{nea contiene dos argumentos, int x © int y, y el tipo de datos int especifica que ambos argumentos son enteros, La linea 3 contiene la lave de apertura ({) que marca el inicio de la funcién, El cuerpo de la funcién comprende Ias Ifneas 4 a 6 del listado 3.1. La linea 4 presenta la declaracién de la variable resultado, la cual est especificada por él tipo de datos int como un entero, La instruccién de Ia linea 5 suma los dos enteros representados por x y ¥» ¥ asigna el resultado del célculo a la variable resultado. La instruccién return dela Ifnea 6 devuelve entonces el resultado del célculo representado por resultado. Por tiltima, pero no por para cerrar la funcién, Jo menos importante, s¢ usa la llave de cierre (}) de la linea 7 ‘trabajo. Si una funcién tiene mucho que hacer, seré muy dificil de escribir y ‘depurar. Si thene un proyecto de programacién complejo, dividalo en piezas pequeftas. Procure asegurarse de que cada funcién realice solamente una ‘area. g Al crear una funcién en su propio programa de C, no le asigne demasiado Cémo hacer Ilamadas a funciones Con base en lo que hasta ahora ha aprendido, puede escribir un programa en C que lame snteros() para calcular una suma e imprimir el resultado en la pan- talla, En el listado 3.2 se muestra un ejemplo de dicho programa. Hora 3 Listapo 3.2. Un programa de C que calcula una suma e imprime el resultado en la pantalla J* @3L02.c: Calcula una Suma @ imprine @1 resultado */ Winclude /* Esta funeién suma dos enteros y devuelve el resultado */ int suna_enteros( int x, int y ) { int resultado; resultada = x + y; return resuitada; ) int main() int suna; ‘Suma = suna_enteros(5, 12); printf(*La Suna de 5 y 12 es Sd.\n", suma); return @; ecdecaererereetene El programa del listado 3.2 se guarda como un archivo fuente Hamado a3Le2.¢. Desputs de compilarlo y enlazarlo, se ctea un archivo ejecutable para e3L02.c. Ea mi maquina, el archivo ejecutable se Hama 03L02.6x6. La siguiente es la salida que se imprime en la pantalla después de ejecutar dicho archivo en mi maquina: La guna de 5 y 12 es 17. La linea 1 del listado 3.2 es un comentario acerca del programa, Como aprendié en la hora 2, la directiva include de la linea 2 incluye el archivo de encabezada staio.n debido a que en el programa se usa la funcidm printf (). Las lineas 3 a9 representan a la funcién suna_enteros() que, como se explicé en la seccidn anterior, suma das enters. La funcidin nain(), con el tipo de datas int como prefijo, inicia en la Kinea 11. Las linens 12y 18 contienen las Hlaves de apertura y cierre de la funcidn main (}, respectivamente, En la linea 13 se declara una variable entera, suma, ‘La instruccién de la Ifnea 15 lama a la funcién suma_enteros() que usted examiné en la seccién amerior. Observe que las dos constantes enteras, 5 y 12, se pasan a la funcién suma_enteros(), y que a la variable suna se le asigna el resultado devuelto por la fun- cidn suma_enteros(). La estructura de un programa de C 51) En la hora 2 vio la funcién print#() de la biblioteca estindar de C. Si piensa que encon- tnd algo nuevo agregado a la funcidn de Ia linea 16, tiene raz6n. Esta vez se le pasaron dos argumentos a la funcidn printf (), Ellos son la cadena *La suma de S y 12 es d\n" y la variable suna, Observe que en el primer argumento se agrega un nuevo simbolo, sa. El segundo argumen- toes la variable entera suma. Debido a que el valor de suna se imprimiré en la pantalla, usted podria pensar que 4d tiene algo que ver con la variable entera suna. Otra vez tiene razén, Sd indica a la computadora el formato en el que debe imprimir a suna en la pantalla. En a hora 4 se abordan mds detalles sobre id. La relacién entre sd y suma se explica en Ia hora 5, “Manejo de la entrada y salida esténdar”. Pero sobre todo, es importante que se concentre en el programa del listado 3.2 y preste atencién a cémo hacer una llamada, ya sea a una funcién generada por el usuario o a una, funcién de la biblioteca estindar de C, desde la funcién main() Resumen En esta leccién aprendié los siguientes conceptos y operadores + En C, una constante es un valor que nunca cambia. Por otra parte, una variable puede presentar diferentes valores, ‘+ Enel lenguaje C, a una combinacién de constantes, variables y operadores se le ama expresién. Una expresin se utiliza para denotar diferentes. cilculos, + Los operadores aritméticos incluyen +, -.*, / y% + Una instruceién consta de una expreskin completa con un punto y coma como sulfij. + El compilador de C trata a un bloque de instrucciones como a una sola instruccién, aunque e| bloque podria contener més de una instruccién, + El tipo de funcién que se especifica en la declaracién de una funciém determina el tipo de valor que devuelve dicha funcién. + Debe seguir ciertas reglas para formar un nombre de funcién valido, + Un argumento contiene informacién que usted desea pasar a una funcién. Una lista de argumentos contiene dos o mis argumentos separados por comas. ‘+ Las llaves de apertura ({) y de cierre (}) se usan para marcar el inicio y cl final de una funcién de C. + El cuerpo de una funciGn contiene declaraciones de variables ¢ instrucciones, Por lo regular, una funcién debe evar a cabo slo una tarea, En Ia siguiente leccidn aprender més acerca de los tipos de datos del lenguaje C. 52 Hora 3 Preguntas y respuestas P ;Cual es la diferencia entre una constante y una variable? R La principal diferencia es que el valor de una constante no se puede modificar, mientras que el de una variable sf, En su programa de C puede asignar diferentes valores a una variable siempre que sea necesario. P {Por qué necesita un bloque de instrucciones? R Muchas palabras reservadas de C sdlo pueden controlar una instruccién. Un bloque de instrucciones proporciona una forma de poner varias instrucciones juntas, y de que una palabra reservada de C controle ¢| bloque de instrucciones. Entonces, el bloque es tratado come una sola instruccién. P {Qué operadores aritméticos tienen una precedencia més alta? R De entre los cinco operadores aritméticos, los operadores de multiplicacién, divisién y residuo tienen una precedencia mds alta que los operadores de suma y resta. _Cudntas partes tiene normalmente una funcién? R_ Normalmente, una funcién tiene seis partes: el tipo de Ia funcién, el nombre de la funcién, los argumentos, la Have de apertura, el cuerpo de la funcién y la lave de cere. a Taller Para consolidar la comprensién de la leceién de esta hora, le recomiendo responder el ‘cuestionario y terminar los ejercicios de este taller antes de pasar a la siguiente n, Las respuestas y sugerencias se presentan en el apéndice B, “Respuestas a los cuestiona- rios y ejercicio: Cuestionario 1, Es 74 una constante en el lenguaje C?, ;qué hay de 71? 2. jEsx = 578 + 1 unaexpresién?, jloesx = 12 + y? 3. jSon vélidos los siguientes nombres de funcién? anétodos algoritmo_a2 +funcién_inicio Espacto_cuerto .Termina_Exe _suma_turbo 4. (Es2+ 5 * 2iguala (2 + 5) * 2? 5. gProduce 7 % 2 el mismo resultado que 4 © 3? La estructura de un programa de C 53) Ejercicios 1. Dadas las dos instrucciones, x = 3; yy = 5 + x;, jo6mo puede generar con ambas un bloque de instrucciones? 2. {Que esté mal en la siguiente funcién? int Ssuna_enteros( int x, iat y, int 2) ( int suna; suma = x + y + 25 return sums; ) 3. {Qué esti mal en la siguiente funciGn’? int suma_enteros( int x, int y, int 2) 4 int suna; sua = x+y +2 return suna; ) 4, Escriba una funcién de C que pueda multiplicar dos enteros y devolver el resultado. 5, Bscriba un programa en C que lame a la funcidin de C que acaba de escribir en el ejercicio 4, para calcular la multiplicacién de 3 por $ e imprimir después en la pan- talla el valor de retomo de la funeién. a 4, Wily HORA 4 Tipos de datos y palabras reservadas Qué es un nombre? Aquello que [amamos rosa oleria dulce con cualquier otro nombre, —W. Shakespeare En Ia hora 3, “La estructura de un programa de C, aprendié ome formar un nombre vélido para una funciGn de C. Ahora aprenderd més acerca de ‘c6mo nombrar una variable y de las palabras reservadas del compilador de C. Ademiés, en esta hora aprender detalladamente los cuatro tipos de datos del lenguaje C: * el tipo de datos char * €l tipo de datos int * el tipo de datos floet * el tipo de datos double 56 Hora 4 Palabras reservadas de C El lenguaje C reserva ciertas palabras que tienen un significado especial para el lenguaje. Estas palabras reservadas también se conocen como palabras clave de C. No debe utilizar en sus programas palabras reservadas de C para nombrar sus propias variables, constantes @ funciones, La tabla 4.1 presenta una lista de: 32 palabras reservadas de C. Tapia 4.1 Palabras reservadas de C Palabra reservada —_Descripcién auto Especificador de clase de almscenamiento break Instruccidin Instroccidn Especifieador de tipo const Modificador de clase de almacenamiento continue Instruecidin defauit Etiquetas @ Instruccisa couple Especificadar de tipo else Instraceida onus Especificadoe de tipo extern [Especificador de clase de almacenamiento float Especificador de tipo tor Tnstrucciéa, goto ‘Instruccidin, at ‘nstruccidn, int Especificadoe de tipo long ‘Especificadar de tipo roaistor ‘Especificador de elase de almacenamiento return Instruccién shart ‘Especificador de tipo signed Especificador de tipo sizeot ‘Operador static Especificador de clase de almacenamiento struct Especificador de tipo ‘switch Instruccién Tipos de datos y palabras reservadas 57) Palabra reservada __Deseripcién tynedet Instruccién wunion Especificador de tipo unsigned Especificador de tipo: vous Espeeificador de tipo: volatile Modlificador de clase de almacenamiente whi Instruce! ‘No se preacupe si no puede recordar a la primera todas las palabras reservadas de C, En el resto del libro se familiarizaré més con ellas y comenzaré a usatlas en los ejemplos y ejercicios. ‘Observe que todas las palabras reservadas de C estén escritas en mintisculas. Como ya ‘mencioné, C es un lenguaje sensible al uso de maydsculas y mimisculas. Por lo tant ‘como se muestra en la lista, int es una palabra reservada de C, pero INT no lo es. El tipo de datos char Un objeto del tipo de datos char representa un solo cardcter de! conjunto de caracteres ‘que utiliza su computadora. Por ejemplo, A es un carécter, y a también lo es, Pero 7 es un nimero. Sin embargo, una computadora s6lo puede almacenar cédigo numérico. Por lo tanto, los caracteres como A, a, B, b, etcétera, tienen un cédigo numérico tinico que utilizan las computadoras para representar los caracteres. Por lo regular, un cardcter ocupa 8 bits (es decir, 1 byte) para almacenar su cédigo numérico. Para muchas computadoras, los cédigos ASCII son los o6digos estindar para representar un conjunto-de caracteres, (Sélo para su informacién, ASCII significa Cédigo Estindar Estadounidense para e| Intercambio de Informacién.) El conjunto de caracteres ASCIL original tiene solamente 128 caracteres debido a que utiliza los 7 bits menos significa- tivos con los que se pueden representar 2° caracteres (es decir, 128). Sin embargo, en las PCs compatibles con IBM, el conjunto de caracteres se amplié para contener un total de 256 caracteres (esto es, 25) Algo que quisiera mencionar aqui es que el estdndar ANSI de C especifica solo el valor del cardcter nulo, el cual siempre es cero (es decir, un byte con ceros en todos los bits). Los demas valores numéricos de los caracteres los determinan los tipos de computadoras, sistemas operatives y compiladores de- C. Le recomiende que explore el conjunto de caracteres de su computadora, Puede hacerlo con el programa del listado 4.1. [58 Hora 4 En el mundo de la computacién, un bit €s la unidad mas pequefa de almace- namiento de datos, y slo puede tener uno de estos dos valores: 0.0 1. Estot valores representan los dos estados de los interruptores electrénicos que se vusan en la memoria y en la CPU de la computadora. Un byte: es una unidad més grande que un bit. De hecho, acho bits equivalen a un byte. Variables de tipo caracter Una variable que puede representar diferentes caracteres se Hama variable de tipo cardcter. Puede asignar el tipo de datos char a una variable mediante el siguiente formato de declaraciin: char nombrevariable; endonde nombrevariable es el nombre que usted proporciona, y en el que se almace- nardn valores de este tipo. Si tiene mas de una variable que declarar, puede utilizar el siguiente formato: char nombrevariablet; char nombrevariabie2; char nombrevariabie3; © bien, este otro: char nombrevariable1, nombrevariable?, nonbrevariables; Por ejemplo, la siguiente instruccién declara miCaracter y le asigna el valor de char MiGaracter = Del mismo modo, las siguientes instrucciones declaran x, y y z como variables de tipo carter y después les asignan valores: enar x, yy 2 =A; ye't pet Observe que la dltima instruecién, z = ‘7’, asigna a z el valor numérico que representa el cardicter '7' en el conjunto de caracteres, no el ntimero 7 real. ‘Mis adelante aprenden més acerca de las variables de tipo cardcter y como usarlas en ‘sus programas de C_ Constantes de caracter Un candcter encerrado entre comillas.sencillas (*) se llama constante de cardcter. Por ejemplo, 'A*, ‘a’, "8° y 'b’, son constantes de caricter que tienen sus valores numéri- Tipos de datos y palabras reservadas 59] cos tinicos en un. conjunto de caracteres dado, Por ejemplo, podria ver los valores numéricos tinicos del conjunto de caracteres ASCII. Es importante recordar que las constantes de cardcter siempre estdn encerradas entre comillas sencillas (*), mientras que una cadena de més de un cardcter utiliza comillas dobles (*). Si esto le parece confuso, slo recuerde que las comillas sencillas van con un solo cardcter. En la hora anterior vio un ejemplo de comillas dobles y cadenas de carac- teres en las Ilamadas a la funcion printf (}. En el conjunto de caracteres ASCH encontrar que los valores numéricos (decimales) tinicos de “A‘, 'a', “B' y ‘b* son 68, 97, 66 y 98, respectivamente. Por Jo tanto, dada x ‘como una variable de tipo carfcter, y dado el conjunto de caracteres ASCII, las siguien- tes instrucciones de asignacién son equivalentes: Pe x = 65; ‘También lo son las dos siguientes: aera; x= 97; ‘Mas adelante, en el listado 4.2, verd un programa que convierte los valores numéricas en Sus caracteres correspondientes. 03 No confunda x = ‘a‘;conx = a:. La primera instruccion le asigna ala variable x el valor numérico del caracter a, esto es, x contendra el valor 97 desputs de la asignacién (el valor ASCII de la letra ‘a’. Sin embargo, Ia ins- truccién + a: le asigna a la variable x cualquier valor contenido en la variable «.Posteriormente aprenderé mis acerca de esta diferencia. El cardcter de escape (\) En realidad, usted vio el cardcter de escape (\) en la hora 2, “Su primer programa de cuando aprendié a usar el caricter de nueva linea (\n) para dividir un mensaje en dos partes. Por lo tanto, en e] conjunto de caracteres ASCII, la diagonal invertida (\) se llama. cardcter de escape, Este caracter se emplea en el lenguaje C para indicar a la compu: tadora que sigue un carécter especial. Por ejemplo, cuando la computadora ve \ en el cardcter de nueva linea \n, sabe que el siguiente cardcter, n, genera una secuencia de retorno de carro y un salto de Ifnea. 60 Hora 4 Ademis de! cardcter de nueva linea, los siguientes son algunos de los caracteres espe- ciales del lenguaje C: Cardeter__Descripeién rs El cardcter de retroceso; mueve el cursor un cardcter hacia la inquierda, \f El cardcter de salto de pagina; pasa a la parte superior de la pagina siguiente \r El canicter de retorno; regresa al principio-de la linea actual At El cardcter tabulador, avanza al siguiente paro de tabulador, Impresién de caracteres Usted ya sabe que la funciGn print#(), definida en el archivo de encabezado stdio.h de C, se puede utilizar para imprimir mensajes en la pantalla (consulte el listado 2.1 de la hora 2). En esta seccién aprender a usar el especificador de formato de cardcter, %c, el cual indica a la funcién printf () que el argumento por imprimir es un cardcter. (Apren- der més acerca del especificador de formato en Ia hora 5, “Manejo de la entrada y salida estindar”. Aquf sélo tendrd una probadita.) Por ahora, lo importante es que sepa que cada especificador de formato que pase a print? () corresponderd a una de las variables que pase a la funcién. Veamos primero el programa del listado 4.1, el cual imprime earac- teres en la pantalla. Bizet Listapo 4.1 impresién de caracteres en la pantalla [* G4L81.c; Impresién de caracteres */ include main() char ct; char ¢2; ers tay ce = ay printf (‘Convierte el valor de ct a cardcter: %c.\n", et); printf (*Convierte el valor de ¢2 a caracter: %c.\n", c2); return 0; Después de crear el archivo ejecutable de 04L01 .¢ del listado 4.1, puede efecutarlo para ver qué se imprimir en la pantalla. En mi méquina, el archivo ejecutable se llama 04101 .exe. El siguiente es el resultado que se imprimié en la pantalla de mi compu- tadora después de ejecutar el programa: pos de datos y palabras reservadas Convierte el valor de ct Convierte el valor de 2 Las Iineas 6 y 7 declaran dos variables de tipo carécter, ¢1 y ¢2, mientras que las lineas 9 y 10 asignan a ct y a c2 las constantes correspondientes a los caracteres 'A' y ‘a’, respectivamente, Observe que en las lineas 11 y 12 se usa el especificador de formato %e en 1a funciéa, printf (), lo cual indica a la computadora que el contenido de ¢1 y ¢2 se debe imprimir como cardcter, Al ejecutar las dos instrucciones de las lineas 1 y 12, se da formato a dos curacteres y se muestran en la pantalla, con base en los valores numéricos conte- nidos por c' y @2, respectivamente, Ahora observe el programa que se muestra en él listado 4.2. Esta vez, se se usa para con vertir los valores numéricos en sus caracteres correspondientes. Lustavo 4.2. Conve J* 94L02.c: Convierte valores numéricos en caracteres */ include in de valores numéricos en caracteres nain() char 1; char c2; et =65; 62 997; printf(*EL cardeter que tiene el valor numérico de 65 #: Printf(*El cardater que tiene él valor numérico de 97 «: return 0; Re.\n", ot); Renin", 02); EI siguiente es el resultado que se imprimié en la pantalla de mi computadora después de ejecutar el archivo 84.02. exe, (Usted podria obtener un resultado diferente en su compu- tadora; depende de Ia implementacién. Esto es, depende del tipo de su computadora, del sistema operativo y del compilador C que ¢sté utilizando): F que tiene el valor numérico de 65 01 F que tiene el valor numérico de 97 e1 Eta E] programa del listado 4.2 es similar al del listado 4.1, con excepcién de las dos instrucciones de las lineas 9 y 10. Observe que thas lineas del listado 4.2, a las variables de tipo cardcter ct y ¢2 se les asignan los valores 68 y 97, respectivamente, EL carie' EL carde' 62 Hora 4 Coma usted sabe, en el conjunto de caracteres ASCIL, 65 es el valor numérico (decimal) del cardeter A; 97 es el valor numérico de a, En las lineas 11 y 12, el especificador de formato %c convierte los valores numéricos, 65 y 97, en Ay a, respectivamente, Entonces, los caracteres 4 y a se imprimen en la pantalla. El tipo de datos int En la hora 3 vio el tipo de datos entero, La palabra reservada int se utiliza para especi- ficar que una variable es de tipo entero. Los niimeros enteros, Hamados simplemente en- teres, no tienen fracciones ni punto decimal. Por lo tanto, el resultado de una divisién centera se trunca, simplemente porque se ignora cualquier parte de fraccién, La longitud de un entero varia dependiendo del sistema operative y del compilador de C que utilice, Por ejemplo, en la mayoria de las estactones de trabajo UNIX, un entero tiene una longitud de 32 bits, lo que significa que el rango de un entero va de 2147489647 (esto es, 21-1) a -2147489648, Para un entero de 16 bits, el rango va de 92767 (esto es, 2!"1) a -32768, Como lo dije anteriormenie, esto puede variar enire sistemas diferentes, de modo que para estar seguro puede revisar los materiales de referencia de su compilador, ‘Algunos compiladores de C, como el Visual C++ 1.5, silo proporcionan enteros de 16 bits, mientras que otros compiladores de C de 32 bits, como el Visual C++ 3.0, soportan enteros de 32 bits. Declaracién de variables enteras ‘También vio la declaracién de un entero en la hora 3. El siguiente es el formate bisico de declaracidn: int nombrevariable; Al igual que en la declaraci6n de las variables de tipo carfecter, si tiene més de una varia- ble que declarar, puede utilizar un formato como éste: int nombrevariablet; int aombrevariabli int aombrevariables; 9 bien, uno.como Este: int nombrevariablet, nombrevariable2, nombrevariable3; Aqui, nonbrevariable1, nombrevariable2 y nombrevardables indican las posiciones en Jas que usted coloca los nombres de variables de tipo int, Por ejemplo, la siguiemte instruccién declara witntero como una variable entera y le asigna un valor: int MiEntere = 2314; Tipos de datos y palabras reservadas 63 Del mismo modo, la siguiente instruccién declara A, a, By b como variables enteras: Més adelante aprender més acerca del tipo de datos entero, ‘Cémo mostrar los valores numéricos de los caracteres ‘Al igual que el especificador de formato de carticter (%c) que se usa para dar formato a un solo cardcter, el especificador de formato entero, ‘a, se usa para dar formato a un entero. Tal vez recuerde que en la Ifnea 16 del listado 3.2, se usd sd para dar formato de entero al segundo argumento de la funcidn print). En esta seccién estudiard el programa que se muestra en el listado 4.3, el cual puede imprimir los valores numéricos de los carscteres utilizando el especificador de formato entero 46 en la funcidn print () J* O4L03.c: Como mostrar el valor numérico de los caracteres */ Finelude main() char ct; char c2; ers tA; 2 = ta’ printf("EL valor numérico de A es: ‘d.in", ct); printf(*El valor numérico de a es: %d.\n", ¢2); return @; ‘Obtuve el siguiente resultado en la pantalla de mi computadora, después de ejecutar el archivo 04L03..exe. (Usted podria obtener una salida diferente, si su méquina no emplea ef conjunto de caracteres ASCIL) El valor numérico de A es: 65. FER es vaiss ctérsce ae a en: or. ‘Tal vez encuentre que el programa del listado 4.3 es muy similar al del listado 4.1. De hecho, simplemente capié el cédigo fuente del listado: 4.1 al listado 4.3 cambios en las Iineas 11 y 12, El principal cambio que realice fue reemplazar el especificador de formato de caricter (¥c) por el especificador de formato entero (a). Hora 4 Ambos especificadores de formato hacen basicumente lo mismo: insertar ciertos datos en Ja cadena que usted pasa a printt(), pero la diferencia est en la forma en que printf() muestra los datos. El especificador vc siempre imprime un cardcter; el especificador ‘i siempre imprime un ndmero. Incluso cuando se refieran exactamente a los mismos datos, ésios se imprimirn en la forma que se indique en el especificador de formato sin impor- tar el tipo de datos real. Las dos instrucciones de las lineas 11 y 12 dan formato a las dos variables de tipo cart ter (ct y c2) utilizando el especificador de formato entero ‘d, y después imprimen dos mensajes que muestran los valores numéricos 66 y 97 que representan, respectivamente, alos caracteres A y a del conjunto de caracteres ASCIL El tipo de datos float El miimero de punto flotante es otvo tipo de datos del lenguaje C. A diferencia de un mi- mero entero, un nimero de punto flotante contiene un punto decimal. Por ejemplo, 7.01 ‘es un niimero de punto flotante, asi como también 5.71 y -3.14. Los ntimeros de punto flotante también se conocen como niimeros reales: En el lenguaje C, la palabra reservada float especifica un mimero de punto flotante. Las ‘constantes de punto flotante pueden tener el sufijo f o F para especificar float. De ma- nera predeterminada, un nimero de punto flotante sin un sufijo es de tipo double. El tipo ‘de datos double se presenta més adelante en esta lecci6n, Al igual que un mimero entero, un mimero de punto flotante tiene un rango limitado, El ‘estndar ANSI requiere que el rango sea de-—1.0 x 10° a 1.0 x 10". En Ia mayoria de los ‘casos, un ntimero dé punto flotante es de 32 bits. Por lo tanto, en C, wn ndimero de punto flotante es de por lo menos seis digitos de precisiGn. Esto es, un ntimero de punto flotante tiene por lo menos seis dfgitos (0 posiciones decimales) después del punto decimal. A diferencia de Ia divisién entera, en la que se trunca ¢l resultado y se descarta la frac- cién, una divisién de punto flotante produce otro ntimero de punto flotante. Una division de punto flotante se leva a caho si el divisor y él dividendo, 0 s6lo uno de ellos, son niimeros de pinto flotante. Por ejemplo, 571.2 / 19. produce otro nmero de punto flotante, 57, 12, Lo mismo sucede con $71.2 / 10 y 5712 / 10.0. Declaracién de variables de punto flotante El siguiente es el formato de declaracién de una variable de punto flotante: fost aosbrevariable; Tipos de datos y palabras reservadas 65) Igual que en la declaracién de una variable de tipo entero o de cardcter, si ticne mis de una variable que declarar, puede emplear un formato como éste: float nombrevariable3; © bien, uno como el siguiente: float nombrevariable’, nonbreverieble2, nombreveriable3; Por ejemplo, la siguiente instruccién declara miFloat como una variable de punto flotante y le asigna un valor: float mifloat = 3.14; Del mismo modo, la siguiente instruccién declara a, by ¢ come variables de tipo float: float 8, by 6; El especificador de formato de punto flotante (%) ‘También puede emplear el especificador de formato de punto flotante (%) para dar for mato a su salida. El listado 4.4 muestra un ejemplo de cémo usar el especificador de formato ‘f en la funcién printf (). Listapo 4.4. Impresién de resultados de divisiones entera y de punto foarte 1; I Q4L04,cr Division entera vs. division de punto flotante */ 2: include int getc(FILe *flujo); Aqui, FILE “flujo declara un flujo de archive (es decir, una variable). La funcién devuelve el valor numérica del candcter lefdo. Si ocurre un error 0 un fin de: a arehivo, la funcién devuelve ene No se preocupe por ahora de Ia estructura de FILE, ya que se presentan més detalles acerca de esto en la hora 21, “Lectura y escritura de archives”, y en la hora 22, “Funciones de archivo especiales”. En esta seccién se usa el flujo de entrada estindar stain como el archivo de flujo especificado por FILE *fluso. EOF es una constante detinida en el archivo de encabezada stdio.h. EOF son las siglas de end-of-file (fin de archivo). Por lo regular, el valor de EOF e3 1 Pero siga usando EOF, en lugar de -1, para indicar el fin de archivo en sus programas. En esa forma, si mas adelante utiliza un compilader 0 un sistema ‘operative que utilice un valor diferente, su programa seguir funcionando. El listado 5.1 muestra un ejemplo que lee un cardcter escrito por el usuario desde el teclado, y después lo despliega en la pantalla, Listapo 5.1 Lectura de un cardcter Jiante una Llanada a gete() "/ roducido por el usuario [* O5L81.c: Lectura da datos m include main() { int chy prantf(*Eseriba, por favor, un cardeter:\n"); sh = getet stdin }; printf("El cardcter que acaba de introducir es: Sen", ch); return @; El siguiente es el resultado desplegado en 1a pantalla de mi computadora después de sejecutar el archivo 05101 .exe, escribir el cardcter H y oprimir la tecla Entrar: Escriba, por favor, un cardcter: " E1 cardcter que acaba de introgucir es: H 4 Hora 5 Puede ver en la kinea 2 del listado $.1 que se incluye el archive de encabezado stdio.n para las funciones geto() y printf () que se utilizan en el programa, Las lineas 4 a 12 presentan el nombre y el cuerpo de Ia funcién main( Er En Ia linea 6 se declara la variable entera en; més adelante, en Ia linea 9, se le asigna el valor de retorno de la funcién getc(). La linea 8 imprime un mensaje que solicita al usuario que eseriba un cardcter desde el teclado, Como mencioné antes en esta leccidén, la amada a la funcién printf () de la linea 8 usa la salida estindar predeterminada stdout para mostrar mensajes en la pantalla, En Ia linea 9 se pasa el flujo de entrada estindar stdin a la funcién getc(), lo cual indica que el flujo de archivo proviene del teclado. Después de que el usuario introduce un cardcter, la funcidén gete() devuelve el valor numérico (esto es, un entero) del cardcter. Observe que en la linea 9 se na ¢l valor numérico a la variable entera ch. Después, en la linea 10, el cardecter que introdujo el usuario se despliega en la pantalla con la ayuda de print?(). Observe que dentro de la Hamada a Ia funcién print#(), en la misma linea, se usa el especificador de formato de cardcter (a). (En el ejercicio 1 de esta leceiGn se le solicita que utilice +d en un programa para imprimir ef valor numérico de un carécter introducido por el usuario.) Uso de la funciédn getchar() El lenguaje C proporciona otra funcién, getchar (), que re gete(). Para ser mis precisos, la funcién getehar() equivale a gete(stdin). La sintaxis de la funcidn getchar() es include int getchar (void) ¥ Aqui, void indica que no es necesario ningtin argumento para llamar a la funcién. La funci6n devuelve el valor numérico del cardcter leido. Si ocurre un error © un fin a de archivo, la funcién devuelve er. El programa del listado 5.2 muestra cémo usar la funci6n getcnar() para leer entradas. del usuario. Misstigy Listapo 5.2 Lectura de un cardcter mediante una llamada a getchar() {* W5L@2.c: Lectura de datos mediante una llamada a gatchar() */ Winclude int pute(int ¢, FILE *fluja); ¥ Aqui, el primer argumento, int ¢, indica que la. es un caracter almacenado en la variable entera ¢; el segundo argumento, FILe «flujo, especifica un flujo de archivo. Si tiene éxito, pute() devuelve el cardcter escrito; en caso contrario, a devuelve eor. En esta lecci6n se especifica Ia salida estindar stdout como el flujo de archivo de salida de pute(). En el listado 5.3 se utiliza la funcién pute) para desplegar el cardcter A en la pantalla. Listano 5.3. Cémo desplegar un cardcter en la pantalla 1: /* @5LB8.¢: Cémo desplegar un carécter con putc{) */ 2: include 3: 4: main() & int oh; ch = 65; /* el valor numérico de A */ printf("El caracter que tiene el valor numérico de 65 @s:\n"); pute(ch, stdout return El siguiente resultado es el que obtuve en mi méquin: El cardcter que tiene @1 valor nunérico de 65 es: Como ya mencioné, en la linea 2 se incluye el archivo de encabezado stdio.n, el cual contiene la declaracién de pute() En la linea 8 se le asigna ¢] valor numérico 65 a la variable entera ch, declarada en la Ifnea 6. En el conjunto de caracteres ASCII, el valor numérico del carécter A es 65. En [a linea 9 se despliega un mensaje para recordar al usuario que se pondréi en la pan- talla el valor numérico del cardcter. Después, en Ia Ifnea 10, la funciéa pute( )coloca el caricter A én la pantalla, Observe que el primer argumento para la funcién putc() es la variable entera (ch) que contiene el valor 65, y que el segundo argumento es el flujo de: archivo de salida estindar, stdout. Manejo de la entrada y salida estandar 7 Otra funcién para la escritura: putchar () ‘Al igual que putc(). también se puede usar putchar() para desplegar un cardcter en la. pantalla. La tinica diferencia entre las dos funciones es que putchar() sdlo necesita un argumento para contener el cariicter, No es necesario especificar el flujo de archive, debi- do a que la salida esténdar (stdout) se asigna como el flujo de archivo para putchar() La sintaxis de Ia funeiin putehar() es include int putchar(int c); Aqui, 1at ¢ es el argumento que contiene el valor numérico de un cardeter. La fun- cidn devuelve oF si ocurre un error; en caso contrario, devuelve el caricter que se a escribis., En el listado 5.4 se muestra un ejemplo del uso de putohar() a Listape 5.4 Cémo mostrar caracteres con putehar() J* @SLO4.c: Gono mostrar caracteres con putenar() */ Minclude putchar (66) ; putchar (10); . obtuve los siguientes resultados: La forma de escribir el programa del listado 5.4 es un poco diferente. No hay ninguna variable declarada en el programa. Mas bien, los enteros se pasan directa- ‘mente a putchar(), como se muestra en las lineas 6 a 11. ‘Como se habré dado cuenta, 65, 66 y 67 son, respectivamente, los valores numéricas de Jos caracteres A, 8 y C en el conjunto de caracteres ASCII, Seguramente se dio cuenta en el ejercicio 5 de la hora 4, “Tipos de datos y palabras reservadas”, que 1@ es el valor numérico del cardcter de nueva linea (\n). 73 Hora 5 Por lo tanto, las lineas 6 y 7, respectivamente, colocan el caricter A en la pantalla y hacen que Ia computadora comience al principio de la siguiente linea. De la misma manera, la linea & despliega el cardcter 8 en la pantalla y la linea 9 inicia una nueva linea. Después, Ja Linea 10 despliega el cardcter C en Ia pantalla y la linea 11 inicia ofra nueva linea, De acuerdo con esto, A, By C, se colocan al principio de tres lineas consecutivas, como se ‘observ6 en Ia seccién que muestra la salida del programa, Nueva visita a la funci6én printf () La funcién printt() es la primera funcién de la biblioteca de C que utilizé usted en este libro para imprimir mensajes en la pantalla. printf() es una funcién muy importante en C, asf que vale la pena dedicarle mis tiempo. La sintaxis de la funeién print#() es. include int printf (const char *cadena-de-formato, . . v Aqui, const char *cadena-de-formato es el primer argumento que contiene elilos) especificadories) de formato; ... indica la seccién de la expresidn que con- tiene la(s) expresiGn(es) a formatear de acuerdo con los especificadores de formato. El niimero de especificadores de formato que hay en el primer argumenio determina el niimero de expresiones, Si tiene éxito, la funcién devuelve el niimero de expre~ ~ siones formateadas. Si ocurre un error, devuelve un valor negativo. const char * se explica mis adelante en esie libro. Por el momento, considere el primer argumento para Ia funcién printf () como una cadena (una serie de caracteres entre co- las dobles) con algunos especificadores de formato dentro de ella. Por ejemplo, puede Pasar como primer argumento a la funcién “La suma de dos enteros Sd + Sd es: Sd. tnt La figura 5.1 muestra la relacién entre la cadena de formato y las expresiones. Observe que los especificadores de formato y las expresiones coinciden en un orden de inquierda, a derecha. Figura 5.1 Le lin | prance ene da cadena de formato > lar erences prine{("Un mimero de punto flotante: %f; Un entera: Sd.” Manejo de la entrada y salida estandar 73) Recuerde que dentro de la cadena de formato debe usar exactamente el mismo néimero de expresiones y de especificadores de formato, Los siguientes son todos los especificadores de formato que se pueden usar en print#(): gee ec tes ssn se 2 El especificador de formato de carfeter. El especificador de formato entero. El especificador de formato entero (equivale a $d), El especificador de formato de punto flotante, El especifieador de formato de notacién cientifica (observe la e miniscula) El especificador de formato de notacién cientifica (observe la E maytiscula), Utiliza +f 0 %e, cualquiera que resulte més corto, Utiliza +f 0 X€, cualquiera que resulte mas corte. El especificador de formato octal sin signo, El especificador de formato de cadena El especificador de formato entero sin signo, El especificador de formato hexadecimal sin signo (observe la x mindiscula), El especificador de formato hexadecimal sin signo (observe la X maytiseula), Despliega el argumento correspondiente que es un apuntador. Registra el nimero de caracteres escritos hasta el momento. Muestra un signo de porcemaje (8). Entre los especificadores de formato de esta lista, ya presentamos ‘2, 8d, 8f, 4 ¥ SE. Mas adelante se explican varios més. La siguiente seccién muestra cémo convertit mimeros decimales a hexadecimales utilizando *% 0 $x. Conversion a ndmeros hexadecimales ‘Ya que en una computadora todas los datos son binarios (una serie de ceros y unos), cualquier dato con el que trabajemos o que imprimamos es s6lo una clase de represen- taciOn, legible para los humanos, de los datos binarios. Como programador, a menudo es necesario tratar directamente con datos binarios, pero consume demasiado tiempo descifrar una cadena de ceros y unos para convertirla en datos numéricos o caracteres que sean si Hora 5 La solucién a este problema es la notacién hexadecimal (o hex), la cual €s una especie de forma abreviada para representar niimeros binarios. La notacién hexadecimal es un ‘érmino medio entre el sistema numérico de base 2 (o binario) legible para la compu- tadora, ¥ nuestro més conocido sistema de base 10 (o decimal). Convertir niimeras de hexadecimal a decimal (o de binario a hexadecimal) y a la inversa, es mucho mas fil (y mas répido) que convertirlos directamente de binario a decimal, o viceversa, La diferencia entre un nimero hexadecimal y uno decimal es que el primero es un sistema de numeracién de base 16, Un mimero hexadecimal se puede representar mediante cuatro bits. (2% es igual a 16, lo que significa que cuatro bits pueden producir 16 mtimeros tinicos.) Los ntimeros hexadecimales del 0 al 9 emplean los mismos sfmbolos numéricos que se encuentran en los niimeros decimales del 0 al 9. Las letras 4, 8 0, D, € y F, en maytisculas, se usan para representar los ntimeros del 10 al 15. (Asimismo, las letras mindsculas a, b, c,d, @y # sé emplean para representar estos nimeros hexadecimales. Las maytisculas y mindsculas hexadecimales son intercambiables y en realidad se trata sélo de una cuestiin de estilo.) El listado 5.5 presenta un ejemplo de la conversién de mimeros decimales a hexadeci- males utilizando %x 0 8 en la funcidn printf(). Listapo 5.5 Conversién a numeros hexadecimales 1: /* OS5LO5.¢: Conversign a ndmeras. nexadecina’ Hinelude st) maint) 1 printf(*Hex(nayisculas) Hex(mindsculas) —Decinal\n* prantt( 8x x Sa\n", 8, 8, 8); printf (‘ax ax Adin" 1,1, 195 printt(*%X = wd\n", 2, 2, 2); printt ("Sx Sx ‘wdin", 3, 3, 3); peantt ("x te Sint, 4) 4, 4; prantt (=8x wx sain’, 5, 5, 5) prantt( "sx « win", 6, 6, 6) prantt (78% tx Sain, 7, 7, 7) prints ("x oa s\n, 8, 8, B) printe ("9x sain", 9, 9, 9) printt (“9x ~ ‘din", 18, 18, 10) printf ("4x Ad wa\n*, 11, 11, 11 printt ("ex 4 Sd\n", 12, 12, 12); prantt( "se we Sain, 13, 13, 13); prantt( x saint, 14, 14, 1405 print? (x 7 Adin", 15, 15, 18); return @; Manejo de la entrada y salida estandar 81) ente es el resultado que obtuve al ejecutar el archivo @5L05.exe en mi computador: Hex(mayusculas) Hex(mindsculas) Decimal ® 8 8 1 1 1 2 2 2 a 3 a 4 4 4 8 5 5 8 6 6 ? 7 7 a 8 a Q 8 a A a 1° 8 b " ¢ c 12 0 d 13 E e ‘4 F t 15 No se alarme si ve demasiadas llamadas a la funci6n printt() en el listado 5.5, De hecho, el programa de este listado es muy sencillo, El cuerpo de la funcién va de las Lineas 5a Ia 23. La funciGn print () de la Iinea 6 imprime un encabezado que contiene tres campos: Hex (mayGsculas), Hex(minisculas) y Decimal, Las lineas 7 a 22 imprimen los ndmeros hexadecimales y decimales del 0 al 15. Para realizar la tarea se hacen 16 tlamadas.a printf (). Cada una de las lamadas a print? () tiene una cadena de formate como primer argumento seguida de tres enteros que denotan tres expresiones. Observe que dentro de la cadena de formato de cada llamada a prantt() se usan los especificadores hexadecimales %X y ‘x, para convertir las expresiones corres- pondientes al formate hexadecimal (tanto en maytisculas como en mimtisculas), En realidad, nadie escribiria un programa como el del listado 5.5. En su lugar se puede utilizar un ciclo para llamar en forma repetida a la funcién printt(). Los ciclos (o itera- ciones) se presentan en la hora 7, “Ciclos”, Especificacién del ancho minimo del campo En un especificador de formato, el lenguaje C le permite agregar un entero entre el signo de porcentaje (4) y la letra. El entero se Hama especificador del ancho minima det cam- po, debido a que especifica dicha caracterfstica y asegura que la salida alcance el ancho minimo, Por ejemplo, en $1@f, 10 es un especificador del ancho minimo del campo que asegura que la salida sea de por lo menos 10 caracteres de amplitud. Esto es muy uti! al imprimir una columna de nimeros, Hora 5 El ejemplo del listado: 5.6 muestra cémo usar el especificador del ancho minimo del campo. Listape 5.6 Especifica J* Q5L06.c: Especificacién del ancho minimo del campo */ Winclude n del ancho minime del po 1 2 ra 4: main() { ant num, numa; numt = 12; ‘nun? = 12345; print? (“ed print? (“d\ print? (*4sd\n" print #(*sa5a\n 2 printf (*s2d\n" 15: return ej EI siguiente es ¢l resultado que obtuve al ¢jecutar el archivo @5L06.e 42 12345. 12 eoer2 12945, En la Linea 6 del listado 5.6 se declaran dos variables enteras, nut y oum, ¥ en las lineas 8 y 9 sc les asignan los valores 12 y 12945, respectivamente. Sin utilizar ningén especificador del ancho minimo del campo, las lineas 10 y 11 imprimen los dos enteros Iamando a la funcién printf(}. Puede ver en la seccién de salida que el resultado de la instruccién de la linen 10 es 12, el cual ocupa el espacio de dos carac- teres, mientras que el resultado 12945 de la linea 1 ocupa el espacio de cinco caracteres. En Ia linea 12 se especifica un ancho minimo del campo de 5, mediante %5d. Por Io tanto, Ja salida de Ia Linea 12 ocupa el espacio de cinco earacteres, ya que son tres espacios en blanca mais los dos caracteres del 12. (Vea la tercera Ifnea de resultados en In seccién de said.) El especificador ssa que esti en Ia funcidn print#() que se muestra en la Kinea 13, indica que el ancho minimo del campo es 8, y el @ indica que se emplean ceros para “rellenar” los espacios. Par lo tanto, puede ver que cl resultado de la ¢jecucién de la instruccién de Ja linea 13 es 00812. Manejo de la entrada y salida estandar 83) El especificador 2a de la linea 14 asigna 2 al ancho minimo del campo, pero usted sigue viendo la salida completa de 12846 en la linea 14. Esto significa que cuando el ancho minimo del campo es més corto que el ancho de la salida, se toma este ditimo y el resul- tado se sigue imprimiendo completo. Alineacion de la salida ‘Como habrii notado en la seccién anterior, toda la salida se alinca # la derecha, En otras palabras, toda [a salida se coloca en él extremo derecho del campo de manera predeter- minada, en tanto que el ancho del campo sea mayor que el de la s Usted puede alinear la salida a la izquierda. Para hacerlo, necesita ponerle un signo de menos (-) como prefijo al especificador del ancho mfnimo del campo. Por ejemplo, *-124 -especifica que el ancho mfnimo del campo es 12, pero alinea la salida a partir del extremo izquierdo del campo. El listado 5.7 proporciona un ejemplo de oémo derecha, incor la salida a la izquierda o a la Ustapo 5.7 Salida alineada a izquierda o derecha (* Q5L07.c: Alineacién de la salida */ include main() 1 dnt numt, num2, num3, nun, nuns; unt una una und = nun = printf (88d %-8d\n*, numt, num print? (*88d %-8d\n", num2, nun2); printf(*sad %-@d\n*, nun3, mun); print#(*8d %-Bd\n", numd, nund) ; print ("88d %-8d\n", nuns, nuns) ; return @; Obtuve los siguientes resultados después de ejecutar el archivo #8L07 .exe: 14 Ty 12 12 123° 123 teat 1234 1294 12045 Hora 5 En el listada 5.7 hay cinco variables enteras, num, nun2, nuns, num y nuns, las cuales se declaran en Ia Iinea 6 y se les asignan valores en las Iineas 8 a 12. Estos valores representados por las cinco variables se imprimen después por medio de las funciones printt () de las Kineas 13 17, Observe que todas las lamadas a print#() tienen el mismo primer argumento: “Nad %-8d\n*. Aqui, el primer especificador de for- mato, ‘6d, alinea la salida al extremo derecho del campo, y el segundo especificador de formato, *-8d, alinea la salida al extremo izquierdo del campo. Despuds de ejecutar las instrucciones de las lineas 13 a 17, se lleva a cabo la alineacién y se ponen los resultados en la pantalla como sigue: 4 w 123123 1294 1284 12545 12345 Uso del especificador de precision Puede colocar un punto (.) y un entero justo después del especificador del ancho minimo del campo. La combinacién del punto y el entero conforma un especificador de precision. Puede usar el especificador de precisién para determinar el ntimero de posiciones decima- les para los nlimeros de punto flotante, o para especificar el ancho maximo (o longitud) del campo para enteros © cadenas. (Las cadenas de C se presentan en la hora 13, “Cadenas™.) Por ejemplo, con $18.3f, la longitud del ancho minimo del campo se especifica de 10 caracteres, y al némero de posiciones decimales se le asigaa el 3. (Recuerde, el nimero predeterminado de posiciones decimales es de 6.) Para los enteros, %3. 80 indica que el ‘ancho minimo del campo es de 3, y el maximo es de 8. Elli tado 5.8 presenta un ejemplo del uso de los especificadores de precisiGn. BSE) Ustavo 5.8 Uso de los especificadores de precision 1: /* @SLOB.c: Uso de los especificadores de precision */ 2 Hinelude : main() fd 6; int int_num; 7: double f1_num; 8: 8: ant_qum = 123; 1 flt_nun © 123.456789; 14; printf (‘Formato de entere predeterminado: — %4\n", int_nun); Manejo de la entrada y salida estandar 85) printf(*Con especificador de precisién: ‘82.8d\n", int_num); printf(*Formato de punto flotante pradeterminado: Sf \n", f1t_num); printf(*Con especificador de precision: S-1@.28\n", fLt_num) ; return 0: ‘Después de ejecutar en mi computadora el archivo @5L@8.exe, obtuve en la pantalla los iguientes resultados: Con especificador de precisisi Formato de punto flotante predeterminad: Con especificador de precisién: EI programa del listado 3.8 declara una variable entera, int_nus, en la linea 6, y en la linea 7 un ndimero de punto flotante, f1t_num. Las lineas 9 y 10 asignan 123 y 123.456789 a int_num y a 1t_num, respectivamente. En la Ifnea 11 se especifica el formato de entero predeterminado para la variable entera int_nun, mientras que la instruccién de la Linea 12 indica el formato de entero con wn ‘especificador de precisién que determina que el ancho miximo del campo es de acho ‘caracteres. Por lo tanto, puede ver que se incluyeron cinco ceras antes del entero 123 de la segunda Ifnea de los resultados, Para la variable de punto flotante, #1t_num, la linea 13 imprime un valor de punto flotante ‘en el formato predeterminado, y la linea 14 reduce: dos las posiciones decimales poniendo cel especificador de precisidn .2 dentro del especificador de formato 4-18.24. Observe ‘que también se especifica la alineacién a la izquierda por medio del signo de menos {-} en el especificador de formato de punte flotante. La instruccién de la linea 14 produce el niimero de punto flotante 123.48 de la cuarta Ifnea de los resultados, por media del especificador de precisién para das posiciones decimales. Por lo tanto, 123..456789 redondeado a dos posiciones decimales se convierte en 123.46, Resumen En esta leccidn aprendid los siguientes conceptos, especificadores y funciones importantes: + El lenguaje C trata a un archive como una serie de bytes. + stdin, stdout y stderr son tres flujos de archive que son pre-abiertos y siempre estin disponibles para que: usted los utilice. + Se pueden utilizar las funciones getc() y getchar( }de la biblioteca de C para leer un cardicter de la entrada estdndar. « Se pueden utilizar las funciones pute() y putchar() de la biblioteca de C para imprimir un caricter en la salida estdndar. Hora 5 + Se puede emplear 4x o 8x para convert niimeros decimales en hexadecimales. + El ancho mfnimo del campo se puede especificar y asegurar agregando un entero cen el especificador de formato. + Es posible alinear una salida ya sea al extremo izquierdo o al derecho del campo de salida. + Se puede utilizar un especificador de precisién para especificar el nimero de posi- ciones decimales de Jos niimeros de punto flotante, o el ancho maximo del campo para enteras 0 cadenas. En la siguiente lecciGn aprendert acerca de algunos operadores importantes de C. Preguntas y respuestas P ,.Qué son stdin, stdout y stderr? R_EnC, un archivo es tratado como una serie de bytes, a Ia cual se le [ama flujo de archivo. stdin, stdout y stderr son flujos de archivo pre-abiertos. stdin es la entrada esténdar de lectura; stdout es la salida estindar de escritura; stderr es el error estndar para escribir mensajes de error. {Qué valor decimal equivale al mimero hexadecimal 32? El hexadecimal, o hex para abreviar, es un sistema numérico de base 16. Por lo tanto, 32 (hex) es igual a 3*161+2* 16", 0 50 en decimal. {Som equivalentes getc (stdin) y getchar()? R_ Debido a que la funcién getchar() lee de manera predeterminada del flujo de archivo stdin, getc (stdin) y getchar() sf son equivalentes. P En [a funcidn printf("E1 entero %d es lo mismo que el hexadecinal %x", 12, 12), jcudl es la relacién entre los especificadores de formato y las expre- siones? mo ” R. Los dos especificadores de formato, %4 y x, especifican los formatos de valores numéricos contenidos en la seccién de expresiones. Asf, el primer valor numérico de 12 se imprimird en un formato entero, mientras que el segundo 12 (el de la seccién de expresiones) se mostrar en el formato hexadecimal, Hablando en forma general, el niimero de especificadores de formato de la seccién de formato debe coincidit con el miimero de expresiones de la correspondiente seccién de expresiones. Taller Para consolidar la comprensién de la leccién de esta hora, le recomiendo responder el cuestionario y terminar los ejercicios de este taller antes de pasar a la siguiente leccién. Manejo de la entrada y salida estandar a7) Las respuestas y sugerencias se presentan en el apéndice B, “Respuestas a los cuestiona- ios y ejercicios”. Cuestionario. R . Es posible alinear los resultados al extremo izquierdo del campo de salida en lugar de al derecho? . Cuil es la diferencia entre pute() y putehar()? 3. {Qué valor devuelve getehar()? Dentro de ¥19.3f, ,qué parte es el especificador del ancho minimo del campo, ¥ qué parte es el especificador de precisién? Ejercicios lL 2 3. Escriba un programa para poner juntos en la pantalla los caracteres 6, y y @. Despliegue los nimeros 123 y 123.456 alineados al extremo izquierdo de! campo, ‘Dados los tres enteros 15, 150 y 1560, escriba un programa que los imprima en la pantalla en formato hexadecimal. . Escriba un programa que use getchar() y putchar() para leer un cardcter intro- ducido por el usuario y escribalo en Ia pantalla. . Si compila el siguiente programa de C, ;qué mensajes de advertencia o error obtendré? main() { ant ch; ch = getcha putchar(ch) return 0; + ~ et = > = = = Parte Il Operadores e instrucciones de control de flujo Hora Manejo de datos Ciclos Uso de operadores condicionales oon Modificadores de datos y funciones matematicas 10 Control de flujo del programa Obraz chroniony prawem autorskim Material chroniony prawem autorskim =—_ ere = —_ =" HorRA 6 | Manejo de datos “La cuestion es", dijo Humpty Dumpty, “saber quién es ef que manda; eso es todo.” —L. Carroll Pucde imaginar a los operadores de C como verbos que le permiten mani- ular datos (los cuales son como sustantivos). De hecho, en la hora 3, “La estructura de un programa de C”, aprendié algunos operadores como + (suma), ~ (resta), * (multipticacién), / (divisién) y % (residuo). El lenguaje C tiene un conjunto completo de operadores. En esta hora apren- derd acerea de otros operadores, come son: * Los operadores de asignacién aritmeética * El operador de negacién * Los operadores de incremento y decremento * Los operadores relacionales * Los operadores de conversion 92 Hora 6 Los operadores de asignacién aritmética Antes de abordar los operadores de asignacién aritmética, veamos primero més de cerca al propio operador de asignacién. El operador de asignacién (=) En el lenguaje C, al operador = se le Hama operador de asignaciéin, mismo que vista y utilizade en varias horas. ed ha . La forma general de la instruccién para usar un operador de asignacién es: operando_de_ia_irquierda = operando_de_ia_derecha; Aqui, Ia instrucci6n hace que el valor del operande_de_la_derects se asigne (o se escriba) en la localidad de memoria del operando_de_1a_izquierda. De esta manera, después de la asignacién, el valor del operando_de_1a_izquierda ser4 igual al del operando_de_1a_derecha, Adicionalmente, toda Ia expresidn de asignacién se evalda al mismo valor que se asigna al operando_de_la_izquierda. Por ejemplo, la instruccin a = 5; escribe el valor det operando de Ia derecha (5) en la localidad de memoria de la variable entera a (la cual, en este caso, es el operando de la izquierda), De In misma manera, Ia instruccién b = a = §; asigna primero el valor § a la variable entera a, y luego a la variable entera b. Después de la ejecucidn de la instrucciGn, tanto a come b contienen el valor de 6, Es importante recordar que el operando de la izquierda del operador de asignacién debe ser una expresién en la cual pueda escribir datos en forma legal. Una expresién como 6 = a, aunque a primera vista podria parecer correcta, en realidad est al revés y no funcionaré, El operador de asignacién siempre funciona de derecha a izquierda; por lo tanto, el valor del lado izquierdo debe ser alguna variable que pueda recibir datos desde la expresi6n de la derecha. No confunda el operador de asignacién (=) con e1 operador relacional, == (llamado operader de iguaidad). El operador == se presenta més adelante en esta hora, Combinacién de operadores aritméticos con = Considere este ejemplo: ;Cémo asignarfa la suma de las variables enteras x y y ala variable entera 2? Manejo de datos 33) Utilizando el operador de asignacién (=) y el operador de suma (+), puede obtener la siguiente instruccién: pexty; Como puede observar, es muy sencillo. Ahora bien, considere el mismo ejemplo, pero en lugar de asignar el resultado a la tercera variable, z, escribiremos el resultado de la suma en la variable entera x: xexty; Recuerde, el operador = siempre funciona de derecha a izquierda, de modo que primero se evaluard la parte derecha, Aqui, en la parte derecha del operador de asignacidn (= realiza la suma de x y y; en la parte izquierda del operador se reemplaza el valor previ de x con el resultado de la. suma de la parte derecha. El lenguaje C le proporciona un nuevo operador, +=, para hacer la suma y Ia asignacién, juntas, Por lo tanto, puede reescribir la instruccién x = x * y; como: xen; La combinacién del operador de asignacién (=) con los operadores aritméticos, +, y%, le offece otro tipo de operadores, los operadores de asignacién aritmética: Operador Descripeién We” CO perador de asignacin de suma cad Operador de asignacién de resta a Operador de asignacién de multiplicacién I= Operadar de asignacidn de divisidin we Operador de asignacién de residuo Accontinuacién se muestran instrucciones equivalentes: x + ysequivaleax =x + ys x -> ypequivaleax = x - yz x ts ypequivaleax = x * yz x y= ypequivaleax = x / y; x Me y; cquivaleax = x % y; Observe que la instruccién zpeatney 4 Hora 6 no equivale a Ia instruccién aay debide a que pteaey multiplica z por toda la parte derecha de la instruccién; por lo tanto, el resultado serfa 2s zt yy El listado 6.1 presenta un ejemplo del uso de algunos operadores de asigmacién arit- mética. Mets 1: 2: 2a: ar 32: 3a: Listapo 6.1 Uso de los operadores de asignacian aritmética (* Q6LO1.c: Uso de los operadores de asignacién aritmética */ include main() { ant x, ¥, 2; xe ty [* imictalize x *y y=} /* inicializa y */ Z= 10; /* inicializa z */ printf(*Dadas x = Sd, y = Sd, y z= Sd,\n", x,y, ZN) xexty; printf(*x =x + y asigna ‘da xp\n", x); x41; [* restablece x */ Key printf(*x += y asigna Sd a x;\n", x); x= 4; /* restablece x */ zezrtxey; peintt("z = 2 * x + y asigna Sd a z;\n", 2); 2 10; /* restablece z */ zez* (key) peintf(*z = 2" (x + yb asigna 8d a zs\nt, 2); 103 xe printf (*z t= x + y asigna Sd a zl 2); J* restablece z */ return O; » Manejo de datos 95) Después de compilar y enlazar este programa se crea un archivo ejecutable. En mi midquina este archivo ejecutable se denomina 96101 .exe. Los resultados obtenidos después de ejecutar dicho archivo son: Dades x= 4, y= 3, y2= 10, wx +y asigna 4a x; ats y asigna 4a x; zertx+y asign 13 a2; z z 2 * (x+y) asigna 4 a 2; “sx + y asigna 40 az La linea 2 del listado 6.1 incluye el archive de encabezado stdio-h mediante la directiva include. Este archivo de encabezado se requiere para las funciones printf) que se emplean en las Iineas 4 a 33, Las lineas 8 a 10 inicializan tres variables enteras, x. y y 2, las cuales estin declaradas en la linea 6, Después, la linea 11 imprime los valores iniciales asignados ax, y yz. La instruccién de ta linea 13 utiliza un operador de suma y un operador de asignacién para sumar los valores contenidas en x y y, y luego asigna el resultado a x. La linea 14 despliega el resultado en la pantalla, Las Iineas 17 y 18 realizan la misma suma y despliegan de nuevo el resultado, después de restablecer el valor de x a 1 en Ia linea 16. En esta ocasiGn se utiliza el operador de asignaci6n aritmética +=. El valor de x se restablece en la linea 20. La linea 21 realiza una multiplicacién y una suma y guarda el resultado en la variable entera z;estoes,z = 2 * x + y;.La llamada a printf () de la linea 22 despliega como resultado el 13 en la pantalla. Una vez més, la instruccién x = 1; de la linea 20 restablece el valor de la variable entera x. Las lineas 24 a 30 muestran los resultados de dos célculos, De hecho, ambos resultados son iguales (es decir, 48) debido a que los dos célculos de las lineas 25 y 29 son equi- valentes. La nica diferencia entre las dos instrucciones de dichas lineas es que en la linea 29 se utiliza el operador de asignaci6n aritmética *= Obtencion de negaciones de valores numéricos Si desea cambiar el signo de un nimero, puede colocar el operador menos (-} justo antes ‘del mimero, Por ejemplo, puede obtener el valor negative del entero 7 cambiando su igno de esta manera; -7. Aqui, - es el operador menos, Al simbolo - utilizado de esta forma se le llama operador de negacién o unario menos. Esto se debe a que el operador toma s6lo un operando: la expresién inmediata a su derecha. El tipo de datos del operande puede ser cualquier niimero entero o de punto flotante. 96 Hora 6 ‘También puede aplicar el operador de negacién a una variable entera o a una de punto flo- tante. Por ejemplo, dada x = 1.234, -x es igual a -1.284.O deda x = -1.294, -x equivale 1.284, ya que la negacién de un valor negativo da como resultado un niimero positivo. at No confunda él operador de negacién, 0 unario menos, con el operador de No conta pn eosin, oma mena oe pme. C% | sss es en realidad la misma que ésta: zen ty 0 que ésta: Aqui, en ambas instrucciones, el primer simbolo = se usa come el operador de resta, mientras que el segundo es un operadar de negacién. Incremento o decremento en una unidad Los operadores de incremento y decremento son muy pricticos cuando usted desea sumar o restar | @ una variable. El simbolo del operador de incremento es ++, El operador de decremento es =» Por ejemplo, puede reescribir la instruccién x = x + 1; como +4x;, 0 reemplazar x= x + 1) COM =x; En realidad existen dos versiones de los operadores de incremento y decremento. En la instraccién ++x;, en donde ++ aparece antes de su operando, el operador de incremento se denomina operador de preincremenio, Esto se refiere al orden en que suceden las cosas; el operador primero suma I ax, y después produce el nuevo valor de x. Asimismo, en la instruccién --x;, el eperador de predecremento primero resta 1 a x y luego pro- duce el nuevo valor de x. Si tiene una expresién como x++, en In que ++ aparece después de su operando, entonces std empleando un operador de posincrementa. Del mismo modo, en x- -, al eperador de decremento se le lama operador de posctecremento. Por ejemplo, en la instrucciGn y = x#+;, primero se Je asigna a y el valor original de x, y después x se incrementa en | El operador de posdecremento tiene una historia parecida. En la instrucci6n y = x--} primero se asigna el valor de x a y, y despugs se decrementa x. El programa del listado 6.2 muestra las diferencias entre las dos versiones de los operadores de incremento y decremento. Manejo de datos 7) Listapo 6.2 Uso de los operadores de pre y posincremento ros J* 06L82.c: operadores de pre © posincrenento/decrenento*/ include main() t int w, x, ¥, 2, resultado; wexryez printf("Dadas w } /* Anietaliza x y y */ Md, kM, ye MM, yr Sdn, wo ry ZI5 resultado = ++; printf(*EL resultado de la evaluacién de tw es 4d y ahora wes Mdin", resultago, w); 13: resultado = x++; 14: printf ("El resultads de le evaluacién de x++ #5 ‘4 y ahora x es ‘d\n", resultado, x); 15: resultado’= --y; 16: printf ("El resultade de 1a evaluacién de --y es % y ahora y es ‘din*, resultado, y); resultado = z--; printf("El resultado de la evaluacién de z. result: Zh return o; es Sd y ahora z es Mdin*, Dadas w= 1, x= 1, ¥= 1,274, El resultado de la ‘evaluacién de t+w es 2 y ahora w as 2 El resultado de la evaluacién de xt+ es | y ahora x #5 2 El resultado de 1a evaluacién de --y es @ y ahora y es 0 El resultado de 1a evaluacién de z-- es 1 y ahora z #8 0 WY Dentro de Ia funcién main¢), la linea 8 del listado 6.2 asigna 1 a cada una de las variables enteras, w, x, y, y z. La Hamada a printt() de la linea 9 despliega los valores contenidos en las cuatro variables enteras. en Despugs se ejecuta la instruccién de la linea 11 y el resultade del preincremento de w se asigna a la variable entera resultado, En la linea 12 se imprime en la pantalla el valor de resultado, el cual es 2, junto con el valor de w después de la instruccién de preincre- mento. Observe que w sigue siendo 2 ya que el incremento tuvo lugar antes de asignar el nuevo valor de w a resultado. Las lineas 13 y 14 obtienen el posincremento de x e imprimen el resultado. Como usted sabe, el resultado se obtiene antes de incrementar el valor de x. Por Io tanto, usted ve el valor de 1 (el valor anterior de x) en el resultado de x++, mientras que el nuevo valor de x e82, ya que se incrementé después de la asignaciGn a resultado de la linea 13. El operador de predecremento de la linea 15 provoca que se reduzca en | el valor de y antes Hora 6 de asignar el nuevo valor a la variable entera resultado. Por lo tanto, usted ve @ en la pantalla como el resultada de --y, el cual refleja el nuevo valor de y, que es también 8. ‘Sin embargo, el operador de posdecremento de la Iinea 17 no tiene efecto sobre la asigna- cién, ya que el valor original de z se da a la variable entera resultado antes de que z disminuya en 1. El posdecremento actiia como si la linea 17 fuera simplemente resultado = 2, disminuyendo z en | después de cjecutar la instruccién. La linea 18 imprime entonces el resultado 1, el cual es por supuesto el valor original de 2, junto con @, que es el valor de z después del posdecremento, Mayor que o menor que Hay seis tipos de relaciones entre dos expresiones: igual a, diferente de, mayor que, menor que, mayor 0 igual a, y menor o igual a, De acuerdo con esto, el lenguaje C proporciona estos seis operadores relacionales: Operador Descripcitin egal I= Diferente de > Mayor que: < Menor que: 3 Mayor o igual a - Menor o igual a ‘Todos los operadores relacionales tienen una precedencia menor que los operadores arit- méticos. Por lo tanto, todas las operaciones aritméticas a ambos lados de un operador relacional se llevan a cabo antes de hacer cualquier comparacién. Debe colocar parénte- sis para encerrar las operaciones de operadores que se deban realizar primero. Entre los seis operadores relacionales, >, <, >= y <= tienen una mayor precedencia que los operadores == y 1= Por ejemplo, la expresién xryszes se interpreta como ry) <3 Otro punto importante es que todas Las expresiones relacionales producen un resultado de 0.0 1. Enotras palabras, una expresidn relacional se evaltia como 1 si se cumple la relacién especificada. En caso contrario, produce 0. Por ejemplo, dadas x = 3yy = 5, la expresién relacional x < y da un resultado de 1 El listado 6.3 muestra més ejemplos del uso de operadores relacionales. Manejo de datos 99 diferentes, los operandos que estan en medio se asocian con las operadcres ‘en un orden determinado. La precedencia de los operadores se refiere al orden en que se agrupan los operadores y los operands. Primera se agrupan ‘con sus operandas los operadores que tienen la mayor precedencia dentro de la expresion, Por ejemplo, en la expresion riety: 3 g ‘Cuando en una expresién aparecen juntos varios operadores relacionales 7 ‘el operador * tiene mayor precedencia que los operadores + y -. Por lo tanto, x" y se evaluard primero, y su resultado se convertira en el operando de la derecha del operador +. Ese resultade se da entonces al operader - como su ‘operando de la izquierda. ‘Si desea anular la precedencia predeterminada de los operadores, puede uti- lizar paréntesis para agrupar los operandos dentro de una expresién. Por ‘ejemplo, si lo que en realidad queria era multiplicar z + x pory - 3, entonces podria reescribir la expresién anterior como (z+ x) * (y - 3) Ademis, siempre puede usar los paréntesis cuando no esté seguro de los ‘efectos de la precedencia de los operadores, o simplemente cuando desee ‘que su cédigo sea més facil de leer. Listapo 6.3 Resultados producidos por expresiones relacionales J+ 6LO3.c: Uso de operadores ri fanclude acionales */ nain() { int x, ¥i double 2; KT y = 25 2 = 24.46; printf (*Oadas x= Sd, y= Md, yz S.2F Int, XY, Zi printf (tx >= y produce: Sa\n*, x prantt(*x <2 dint, x < 2); printf(* Adin", y > 2); printf("x [= y - 18 produce: Adin", x I= y - 18); printt(* + y Is 2 produce: win", x + y 1 Z| return 8; 100 Hora 6 Después de ejecutar el archivo @603.exe, se desplegaron los siguientes resultados en la pantalla de mi computador Dadas x = 7, y = 25, yz = 24.46, dual x >= y produce: 0 Hay dos variables enteras, x y y, ¥ una variable de punto flotante, z, declaradas en las lineas 6 y 7, respectivamente. En las lineas 9 a 11 se inicializan las tres variables. La linea 12 imprime los valores asig- nados a las variables, Debido a que el valor de x es 7 y el valor de y es 25, y es mayor que x. Par Io tanto, la Linea 13 imprime 8, que es el resultado que produce la expresidn relacional = y de la linea 14 produce @, ‘Las lineas 15 y 16 imprimen el resultado de 1, mismo que producen las dos expresiones x main() ie printf("Dadas x = 84, y = NO\n", xX, ¥95 printf("x / y produce: ‘a\n*, x /'y)3 prantf("(floatix / y praduce: ‘fin", (float)x / y); return 0; ‘Obtuve los siguientes resultadas al ejecutar el programa 061 exe en mi computadora: Dadas x + 7, y= 5 x1 y produce: 1 (float) / y produce: En el listado 6.4 hay dos variables enteras, x y y, declaradas en la linea 6, e ini- cializadas en las lineas 8 y 9, respectivamente. La linea 10 despliega los valores contenidos en las variables enteras x y y. [102 Hora 6 La instruccién de la Iinea 11 imprime la divisién entera de x jy. El resultado de dicha divisién es 1, debide a que se trunca la parte de la fraccién. Sin embargo, el operador de conversin (float) de la linea 12 convierte el valor de x a un valor de punto flotante. Por lo tanto, la expresién (float)x /y se convierte en una divisién de punto flotante y devuelve un mimero de punto flotante. Es por ello que usted ve que se muestra en la pantalla el mimero de punto flotante: 1.498000, después de ejecu- tar la instruceién de la nea 12, Resumen En esta leccién aprendié acerca de los siguientes operadores importantes: + El operador de asignacién =, ¢] cual tiene dos operandos (uno a cada lado). El valor del operando de la derecha se asigna al operando de Ia izquierda. E] operando de la izquierda debe ser un tipo de variable que pueda aceptar el nuevo valor, + Los operadores de asignacién aritmética +=, =, "=, /= y %= son combinaciones de los operadores aritméticas con el operador de asignacién. + El operador de negacién o unario menos (-}, ¢l cual obliene la negacién de un valor numérico. * Las dos versiones del operador de incremento, ++. Usted sabe que en ++x, el ope- rador ++ se denomina operador de preincremento, y en x++, ++ es el operador de posincremento, * Las dos versiones del operador de decremento, --. Usted aprendié que, por ejemplo, en --x, €l operador -- es el operador de predecremento, y en x--, --€8 el operador de posdecremento. * Los scis operadores igual a), t= (diferente de), > (mayor que), < (menor que), >= (mayor o igual a) y <= (menor o igual a), * Cémo cambiar el tipo de datos de una expresién anteponiendo un operador de con- versidn explicita a los datos. En la siguiente leccién aprender acerca de los ciclos en el lenguaje C. Preguntas y respuestas P: ;Cudl es la diferencia entre el operador de preincremento y el operador de posincremento? R_El operador de preincremento primero incrementa en | el valor del operando, y luego produce el valor modificado. Por otra parte, el operader de posincremento primera produce el valor original de su operando y después incrementa el Manejo de datos operando, Por ejemplo, dada la expresién x = 1, la expresién ++x produce 2, mientras que la expresiGn x+* se evaliia como 1 antes de modificar a x. P Es lo mismo el operador de negacién, o unario menos, (-) que el operador de resta (+)? R_ No, aunque ambos operadores comparten ¢! mismo simbolo, no son lo mismo, El significado del simbolo lo determina el contexto en el que aparece, El operador de negacién se usa para cambiar el signo de un valor numérico, En otras palabras, el operador de negaciGn produce la negacién del valor. El operador de resta es un operador aritmético que realiza una resta entre dos operandos, {Qué operador tiene una mayor precedencia, un relacional o un aritmético? R. Un operador aritmético tiene mayor precedencia que un operador relacional. Por cjemplo, en la expresién x * y * z > x + y, la precedencia de operadores de mayor a menor vade * a * y por dltimo a >, La expresién completa se interpreta entonces como ((x * y) + z) > (x + y). Qué valor produce una expresién relacional? R. Una expresidin relacional se evaliia como @ o 1. Si en una expresidn Ia relacién que indica un operador relacional es verdadera, la expresién se evala como 1; en caso contrario se evaliia como 8. ~ oy Taller Para consolidar la comprensién de la leccién de esta hora, le recomiendo responder el cuestionario y terminar los ejercicios de este taller antes de pasar a la siguiente leccién. Las respuestas y sugerencias se presentan en el apéndice B, “Respuestas a los cuestionarios y ejercicios” Cuestionario 1, ¢Cuél es la diferencia entre el operador = y el operador =*? 2, En laexpresién x + - y - - 2, ,cudles operadores son de resta y cudles son de negaci6n? 3. Dadas x = 15 yy = 4, qué valores producen, respectivamente, las expresiones xf yy (floatyx J y? 4. 2Eslaexpresion y *» x + S cquivalemte ala expresiny = y * x + 5? Ejercicios 1. Dadas x = 1 yy © 3, eseriba un programa que imprima los resultados de estas expresiones: x #5 y,x 48 -yx = yk -= “yx ey Ae oy 103) 104 Hora 6 2. Dadasx = ay y = 6, ;cudl es el valor de 2 después de ejecutar la instruccidn zexty ss 18)? 3. Escriba un programa que inicialice la variable entera x con 1 y muestre resultados con las siguientes instrucciones: printf ("x++ produce: din", x++); printf ("Ahora x contiene: ‘ai\n*, x); 4, Reescriba el programa del ejercicio 3. Esta vez incluya las siguientes instrucciones: printf("x = x++ produce: Sd\n", x = Ktt); printf ("Ahora x contiene: din", x); {Qué obtiene después de ejecutar el programa’ {Puede explicar el porqué de dicho resultado? 5, Se supone que el siguiente programa debe comparar las variables x y yen cuanto a igualdad. ;Qué esta mal en el programa? (Sugerencia: ejecute el programa para ver qué imprime.) Winclude maint) d int x, yi x= y=; printf("El resultado de la comparacién es: ‘din‘, x = y)i return @; HORA 7 Ciclos Cielo y tiema: Canticos sutra no escuchados Repe —Proverbio Zen En las lecciones anteriores aprendié los aspectos bisicos de un programa en C, diversas funciones de C importantes, la E/S estindar y algunos opera- dores sities, En esta leccién aprender una caracteristica muy importante del lenguaje C; los cicles, Los ciclos, también Hamados iteraciones, se usan en la programacién para realizar una y otra vez. el mismo conjunto de instrucciones hasta satisfacer una determinada condicién. En C hay tres instrucciones disefiadas para los ciclos: * La instruccién while * La instruccitin do-wnile * La instruccién for En las secciones que siguen veremos estas instrucciones. 106, Hora 7 EI ciclo while La finalidad de la palabra reservada while es ejecutar una instruccién una y otra vez mientras que una condicién dada sea cierta. Cuando la condicién del ciclo while ya no es légicamente verdadera, el ciclo termina y la ejecucién del programa continta en la siguiente instraccién después del ciclo. La fonma general de la instruccién while es while (expresién) instrucedon; Aqui, expresin e¢ In condiciGn de la instruccién while. Esta expresion se evala primero. Si la expresién s¢ evaliia como un valor diferente de cero, entonces se ejecuta la insteuecién. Después de esto se evalia una vez mas la expresidn, Entonces, si la expresién se sigue evaluando como un valor diferente de cero, a instruecidn se ejecuta una vez mas, Este proceso se repite una y otra vez hasta que la expresidn se evaltie como cero, 0 falsa Kégico, La idea es que el oGdigo del ciclo (la instruccién;) haga que la expresién sea légica- mente falsa la siguiente ovasiGn que se evalie, terminando asi el ciclo, Por supuesto, a menudo querré utilizar la palabra reservada while, en lugar de otras instrucciones, para controlar un ciclo. Cuando éste sea el caso, utilice un bloque de instrucciones encerrado con Haves { y }. Cada vez que se evalde Ia expresién wni1e, todo el bloque se ejecutard si la expresién se evalda como verdadera. ‘Veamos ahora un ejemplo del uso de la instruccién while, El programa del listado 7.1 utiliza un ciclo while para leer continuamente y desplegar después el cardeter introducido, siempre y cuando éste sea diferente de "x'. Ustapo 7.1 Uso de un ciclo wile J* O7LO1.c: Uso de un ciclo while */ include nain() int ¢; eet printf("Introduzca un eardcter:\n(introduzca x para terminar)\n"); while (6 l= ‘x") { © = geto(stdin); putenar(c); Deintt(*\ill cielo while ha terminago. asta prontt a"); retura Ciclos. 107) Aqui tenemos una copia de los resultados desplegados en la pantalla de mi computadora, (observe que log caracteres qué introduje estén en negritas). Introduzea un carécter: : : ; H ; ; 1 ciclo while ha terminado. iHasta pront ‘Como puede ver en los resultados, el programa imprime cada cardcter que se teclea, y termina después de x La linea 8 asigna a Ia variable ¢ el valor ' ' (un carécter de espacio). A esto se le conoce como inicializar la variable, y s6lo necesitamos inicializarla a un valor distinto de *x" La linea 10 es la instrucci6n white. La condicin que esté entre los paréntesis, ¢ significa que el ciclo continuard ejecuténdose una y otra vez hasta que c sea igual a ‘x! Debido a que acabamos de inicializar ac con el cardcter ' *, larelaciin ¢ 1= x es, desde luego, verdadera. Después de! paréntesis de cierre hay una tlave de apertura, por lo que el ciclo se ejecutand hasta encontrar una Ilave de cierre. Las lineas 11 y 12 leen un cardcter y lo imprimen en la pantalla, y al haceslo asignan el valor del caracter a la variable c. La linea 13 es la lave de cierre, lo que indica que la iteraciOn se realiz6 y Ia ejecuci6n regresa a la Iinea 10, Ia instruccién white. El ciclo continuard si el cardcter que se introdujo fue diferente de "x"; en caso contrario, ¢ |= x sera I6gicamente falsa, y la ejecuciGn pasard a la siguiente instruccién después de la lave de cierre de la linea 13. En este caso, pasa a la llamada a printt() dela linea 14. El ciclo do-while En Ia instruccién wie que acabamos de ver, la expresién condicional se coloca al principio del ciclo. Sin embargo, en esta seccién verd otra instruccién que se emplea para los eiclos, do-wnite, 1a cual pone la expresién al final del ciclo, De esta forma se garan- tiza que las instrucciones del ciclo se ejecuten por lo menos una vez. antes de verificar la expresiGn. Observe que las instrucciones de un ciclo while no se ejecutan si la expresién condicional se evalia como cero la primera vez. 108 Hora 7 La forma general de la instruccién do-while es do { Anstrucesdnt instruccién2; } while (expresisn); ‘Aqui, las instrucciones que estén dentro del bloque se ejecutan una vez, y Iuega se evalia Ia expresidn a fin de determinar si el ciclo continda. El ciclo do-wniie contiméa si la expresiGn se evaliia como un valor diferente de cero; en casa contrario, la ejecucidin sigue en la siguiente instruccién después del ciclo. Observe que la instruccién do-while termina con un punto y coma, lo cual es una difer~ encia importante con respecto a las instrucciones if y while. El programa del listado 7.2 despliega los caracteres desde la A a la @, as{ como sus respectivos valores mimericos, mediante un ciclo do-while que repite la impresidn y el incremento_ iG ida Listapo 7.2 Uso de un ciclo while {* @7L2.c: Uso de un ciclo do-while */ #inelude main() 1 ant 4; print (*Hextnayisculas) Hex(minéscules) Decinal\q"); for (i=; i main() { int i, i; for (0, j=8; i<8; i++, j--) printf(*ed + Ad = Ad\nt, dy jy def); return @; , Obtuve los siguientes resultados después de ejecutar el archivo O7L@4.exe: ey ae 5-6 La linea 6 del listado 7.4 declara dos variables enteras, i y j, las cuales se uti- zan en un ciclo for: En la primera expresién de la instruccién for, en la linea 8, i se inicializa con @ y a j se le asigna el valor de 8. La segunda expresin contiene una condicién, 1 < 8, la cual le indica a la. computadora que continge las iteraciones, siempre y cuando el valor de i sea menor que 6. En cada iteracién, después de que se cjecuta la instruccién de la linea 9 controlada por el for, se evalda la tercera expresién, lo que provoca que se aumente (incremente) i en 1, mientras que j se reduce (decrementa) en 1. Debido a que sélo hay una instruccién den- tro del ciclo for, no se utilizan aves ({ y }) para formar un bloque de instrucciones. Durante el ciclo, Ia instruccién de la linea 9 despliega en la pantalla la suma de i y j, lo cual produce ocho resultados, uno en cada iteraci6n, mediante la suma de los valores de las dos variables, i yj. Agregar varias expresiones dentro de la instruccién for es una forma muy conveniente de manipular mas de una variable en un ciclo. Para aprender mis sobre cmo utilizar varias expresiones en un ciclo for, observe el ejemplo del listado 7.5. Ciclos 15) Listapo 7.5 Otro ejemplo de cémo utilizar varias expresiones ena instruccion for J* B7LO5.c: Otro ejemplo de varias expresiones */ #include main() 4 ant i, 45 for (10, je1; 128; 16+, 444) printf("sd - Sd = Adint, j, 4, 9 - 405 return 0; it Los siguientes resultados se mostraron en la pantalla de mi maquina después de ejecutar el archivo o7L@5.ex Noueenas En la linea 6 del programa del listado 7.5 se declaran dos variables enteras, sys. ‘Observe que en la primera expresion de la instrucciGn for de la linea 8 hay dos expresiones de asignacién, i*0 y j=1. Estas dos expresiones de asignacién inicializan las variables enteras 4 y 4, respectivamente. En el segundo campo hay una expresi6n relacional, i<8, Ia cual es la condici6n que se debe satisfacer antes de poder llevar a cabo el ciclo. Debido a que 1 comienza en 0 y se inerementa en 1 después de cada ciclo, hay un total de & iteraciones que realizard la instruccidn 1 ‘La tercera expresién contiene dos expresiones, i++ y j++, que incrementan en 1 las dos variables enteras después de que se ejecuta la instruccién de la linea 9. La funcién printt() de la linea 9 despliega la resta de las dos variables enteras, j € 4, dentro del ciclo for. Debido a que solamente hay una instruccién en el bloque de instrucciones, las llaves ({ y }) no son. necesarias. 116 Hora 7 Uso de ciclos anidados Con frecuencia necesita crear un ciclo aunque ya esté dentro de uno, Puede colocar un ciclo (un ciclo interno) dentro de otro (un ciclo externo) para formar ciclos anidados. Cuando el programa llegue al ciclo interno, éste se ejecutard como cualquier otra instruccién dentro del ciclo externo. E] listado 7.6 es un ejemplo de cémo funcionan los ciclos anidados. Asta Listapo 7.6 Uso de ciclos anidados [* @7L06.c: Demostracién de ciclos anidados */ include ix=3; i+¢) { 1* ciclo externo */ printf ("Inicio de 1a iteracién Sd del ciclo externo.\n", i}; for (j#1; fea; j++) J* cielo interno */ printf(" Iteracién %d del ciclo interno. \n", 3); printf (*Fin de la iteracién ‘d del ciclo externo.\n", 4}; + return 8; Los siguientes resultados se obtuvieron mediante la ejecucién del archivo @7L06. ex: Inieio de 1a iteracién 1 del ciclo externo, iteracién 1 del ciclo interna, iteracién 2 del ciclo interno, iteracién 3 del ciclo interno Ateracién 4 del ciclo interno. Fin de 1a iteracién 1 del ciclo externo. Inieio de 1a iteracién 2 del ciclo externo. iteracién 1 del ciclo interno, iteracién 2 del ciclo interna Ateraci6n 3 del ciclo interno iteracién 4 del ciclo interna Fin de la iteracién 2 del ciclo externa. Inicio de 1a iteracién 3 del ciclo externo iteracién 1 del ciclo interno Ateracién 2 del ciclo interno. Ateracién 2 del ciclo interna. iteracién 4 del ciclo interna, Fin de 1a iteracién 3 del ciclo externo Ciclos En el listado 7.6 se anidan dos cicles for. El ciclo externo comienza en la linea 8 termina en Ja linea 13, mientras gue el ciclo interno inicia en la linea 10 y ter- mina en la 11. Aw El ciclo interno slo comprende una instruccién que imprime el niimero de jteracidin de acuerdo con el valor numérico de la variable entera |. Como puede ver en la linea 10, j se inicializa con +, y se incrementa en + después de cada ciclo (es decis, de cada iteracién). La ejecucién del ciclo interno se detiene cuando el valor de j es mayor que 4, interior, el cielo externo tiene otras dos instrucciones en las lineas 9 y 12, respectivamente, La funckin print () de la linea 9 despliegs un mensaje que mues- tra el inicio de una iteracién del ciclo externo, En Ia Ifnea 12 se imprime un mensaje para mostrar el final de la iteracién del ciclo extemno. Puede ver en los resultados que el ciclo imtemno termina antes de que ¢l ciclo externo co- mience otra iteracién. Cuando el ciclo extemno inicia otra iteracién, se encuentra con el ciclo interno y Jo ejecuta de nuevo, Los resultados del programa del listado 7.6 muestran cclaramente el orden de ejecucién de los ciclos interno y externo. No confunda los dos operadores relacionales (< y <=) y no los utilice en & forme equivocada en las expresiones de los clos. Por ejemplo, lo siguiente for (, ist 1 blogue ised je instrucciones */ ? significa que si j es menor que 10, el ciclo continda. De esta manera, el ndmere total de iteraciones es 9, Sin embargo, en el siguiente ejemplo, for (ist; j<=10; Jerid J* blaque de instrucciones */ } | ndmero total de iteraciones es 10 debido a que en este caso se evaliia la expresion relacional j<=10. Gbserve que la expresion se evalua come 1 (ver- dadere Iégico) siempre y cuando j sea menor o igual a 10. Por lo tanto, puede ver que la diferencia entre los operadores < y <= hace que el ciclo del primer ejemplo tenga una iteracién menos que el del segundo ejemplo. 117) 118 Hora 7 Resumen En esta leccidn aprendié los siguientes conceptos ¢ instrucciones importantes: * Se pueden utilizar ciclos para realizar una y otra vez la misma instruccién hasta ‘que se satisfagan las condiciones especificadas, * Los ciclos hacen que su programa sea mis conciso. + En C hay tres instrucciones que se utilizan para los ciclos: while, do-while y for. + La instruccién while contiene una expresién, la cual es la expresién condicional que controla el ciclo. * La instruccién while no termina con un punto y coma. * La instruccién da-while coloca su expresién condicional al final del ciclo. + La instruccién do-while termina con un punto y coma. + Hay tres expresiones en Ia instruccién for. La segunda es la expresién condicional. + Li instrucci6n for no termina oa un punto y coma. + En la instruccién for se pueden usar varias expresiones, combinadas mediante comas, * En un ciclo anidado, el ciclo interno termina antes de que el ciclo externo continge su iteracién. En Ia siguiente leccién aprender acerca de més operadores utilizados en el lenguaje C. Preguntas y respuestas P ;Cudl es la diferencia entre las instrucciones while y do-while? R La principal diferencia es que en la instruccidim while se evaliia la expresin condi- cional al inicio del ciclo, mientras que en la instruccién do-while se evalia al final del ciclo. Por lo tanto, se garantiza que las instrucciones que controla la instruccién do-while sc cjecuten por lo menos una vez, mientras que en una instruccién while es posible que no se ejecuten munca. P {Cémo funciona un ciclo for? R En la instruccién for hay tres expresiones. El primer campo contiene un ini- cializador que se evaliia primero y s6lo una vez antes de la iteracién. La segunda cexpresiGn ¢x la expresién condicional, la cual se debe evaluar como diferente de cero (verdadero Iégico) antes de que se ejecuten las instrucciones que controla la instruccién for. Si la expresién condicional se evalia como un valor distinto de cero (verdadera), lo que significa que: se satisface la condicidn, se Heva a cabo una Ciclos 119) iteracién del ciclo for, Después de cada iteracién se evalia la tercera expresién, y luego se evalia de nuevo la segunda. Este proceso con Ia segunda y tercera expre- siones se repite hasta que la expresiéin condicional se evalie como cero (falso Wsgico). {Puede terminar con un punto y coma Ia instruccién while? R Por definicién, 1a instruccién white no termina con un punto y coma. Sin embargo, en Ces vélido poner un punto y coma justo después de Ia instruccién while como éste: while(expresién) ;, lo que significa que hay una instruceién nula controlada por la instruccidn white. Recuerde que el resultado puede ser muy diferente al que espera si coloca aceidentalmente un punto y coma al final de la instruccién while. P Sise anidan juntas dos ciclos, cual debe terminar primero, el interne @ el externo? R_El ciclo interna debe terminar primero. Luego continuard el ciclo externo hasta ¢l final, y después comenzard otra iteracién si atin se cumple la. condicién especificada, Taller Para consolidar la comprensidn de la leccién de esta hora, le recomienda responder el cuestionario y terminar los ejercicios de este taller antes de pasar a la siguiente leccién, Cuestionario 1, {Puede imprimir algo el siguiente ciclo while? int k = 100; white (ke190)4 printf(*se*, KY; key 1 2, {Puede imprimir algo el siguiente ciclo do-wnile? printt("ee*, ki ket YP while ( 4: void Inpen(char ch); 5: int Sumaatos(int *lista, int max); 6: main() md 8: char cadenal] 8 char “aptr_cadena; int lista[S] int *aptr_int; J* asigna la direceién al apuntador */ aptr_cadena = cadena; Inpth (aptr_cadena) ; ‘Impth (cadena) ; J* asigna la direceién al apuntador */ aptr_int = liste: printf ("La Suma Gevuelta por SumaDatos() 5: Sain", SumaDatos(apte_int, 5}); printf ("La suma devuelta por SumaDatos() @ SumaDatos (lista, 5}); return ® swine, } 7* definicién de funcidn */ void Impcn(char *ch) { printf("esin", ch); } /* definicién de funcidn */ int SunaDatas(int ‘lista, int max) { int ij int suma = 0 Uso de apuntadores Después de ejecutar en mi maquina el archivo 16L04. exe, e introducir tres enteros, 20 y 30, obtuve los siguientes resultados: Escriba tres enteros separados por espacios: 10 20 30 La suma de los tres enteras es: €0 WI La finalidad del programa del listado 16.4 es obtener tres enteros introducides por ¢l usuario, y luego pasarlos como un arreglo a una funcién denominada. sunaTres() para realizar una operacién de suma, La linea 4 declara la funcién SunaTres (). Observe que en la expresién del argumento se usa el arreglo sin dimensionar 14sta{ |, lo cual indica que el argumento contiene la direceién de inicio del arreglo Lista. En Ia Iiea 8 se declaran el arregio Lista y la variable entera suna. La llamada a printt() de la linea 10 despliega un mensaje que solicita al usuario que introduzca tres enteros. Luego, Ia linea 11 utiliza scant) para reeuperar los enteros que escribié el usuario y almacenarlos dentro de las tres ubicaciones de memoria de los elementos del arreglo entero al que hacen referencia Alista[#), &lista[1] y Alista[2], res- pectivamente, La instruccién de la linea 12 Hama a la funcién sumatres() con el nombre del arreglo como argumento. En realidad, la expresién Sunatres (Lista) esti pasando la direccién de inicio del arreglo Lista (&1ista{@)) a la funcién SumaTres() La definicidn de ta funciGn sumatres () esta en las ineas 18 a 26; 1a funcién suma los valores de los tres elementos del arreglo y devuelve el resultado de Ia suma, Dicho re sultado se asigna a la variable entera suna en la linea 12 y se imprime en la linea 13, ‘También puede especificar el tamafo de un arraglo que se pasa a una fun= clén. Por ejemplo: funcion(char cagena[ 16); ‘equivale a la instruccién funcion(char cagena[ |); Recuerde que el compilader puede determinar el tamafe del arreglo sin especificacion de tamafo cadenal]. En arregios multidimensionales, siempre se debe usar en la declaracion ef formato de un arreglo sin especificacién de tamafio. (Vea, mas adelante en esta hora, la seccién "Como pasar arreglos multidimensionates como argu: mentos".) 267 266 Hora 16 En la linea 19 se asigna la direcci6n de inicio del arreglo Lista de tipo int al apuntador aptr_int. Antes de hacer algo con el clemento Lista(2] de este arreglo, imprimo su valor, que en este momento es 3 (vea el resultado que produce la linea 20). En la linea 21 se le da ‘otro valor al elemento Lista[2], -3, a través del operador de indirecci6n *(aptr_int + 2) ‘La llamada a print®() de la linea 22 imprime el valor actualizado de 1ista(2]. Apuntadores y funciones Antes de comenzar a hablar acerea de emo pasar apuntadores a funciones, veamos primero edimo pasar arreglos a funciones, Paso de arreglos a funciones En la prictica, por lo regular es dificil pasar més de cinco © seis argumentos a una fun- cién, Una forma de ahorrar el nfimero de argumentos que se pasan a una funcién es uti- lizar arreglos, Puede poner todas las variables del mismo tipo en un arreglo y Inego transferir el arreglo como un solo angumento. El programa del listado 16.4 muestra c6mo pasar un arreglo de enteros a una funcién, Listapo 16.4 Cémo pasar arreglos a funciones I* 16L04.c: Como pasar arreglos a funciones */ Winclude int SunaTres (int Lista[]); main() { int suma, Lista[3); printf(*Escriba tres enteras separados por espacios:1n*); scanf(*sakded", Alista(], Alista(t}, Slista[2}); Suma = SunaTres (Lista); Printf("La suma de los tres enteros es: Sd\n*, suna}; return 9) } int SumaTres(int lista[]) { for (1-0; i<3; i++) resultado += Lista(i}; retura resultado; Uso de apuntadores 265) char cadenat] = "IES una cadenal*; 135 4) 5h; int “aptr_int; i+ acceso al arreglo de tipo char */ aptr = cadena; PRiNET(*ANtes cel cambio, ca printf(*antes del canbio, cadana[4} contiene: ‘ch *(aptr_cadena + 4) = ‘U's printf(*Después del cambio, cadena[4] contiene: ‘cin", cad Printf("Después del cambio, cadena contiene: ¥3\n", cadena: i* acceso al arregie de tipo int */ aptr_int = Lista; printt(‘antes cal canbio, lista[2] contiene: %a\n*, Lista(2]); *(aptr_int + 2) = -3; printf( "Después del cambic, Listal2] contion contiene: ‘s\n, cadena); » cadena[4)); an) d\n", Listal2}); return 0; Después de crear y ejecutar en mi computadora el archivo 16L03. exe, se desplegaron los siguientes resultados: Antes del cambio, cadena contiene: ifs una cadenal WLAN Antes del cambio, cadena[4] contiene: u Después del cambio, cadena[4] contiene: U Después del cambio, cadena contiene: is Una cad Antes del cambio, lista[2] contiene: 3 Después del cambio, lista[2] contiene: La finalidad del programa del listado 16.3 es mostrarle cOmo acceder a un arre- glo de tipo char, cadena, y a un arreglo de tipo int, lista. En las Iineas 6 y 8 se declarah cadena y Lista y se inicializan con una cadena y con un Conjunto de enteros, respectivamente. En las Lineas 7 y 9 se declaran un apuntador de tipo char, aptr_caden: yun apuntador de tipo int, aptr_int, ‘La linea 12 asigna la direccién de inicio del areglo cadena al apuntador aptr_cadena. Las instrucciones de las lineas 13 y 14 muestran el contenido de la cadena guardada en el arre- glo cadena, asi como el canicter contenido por el elemento cadena|4] del arreglo antes ‘de cambiar cadena, La instrucciém de la linea 15 muestra que la constante de caricter ‘u" se asigna al el ‘mento del arreglo cadena al que apunta la expresién *(aptr_cadena + 4). Para verificar que el contenido del elemento cadena se haya actualizado, las lineas 16 y 17 imprimen el elemento y la cadena completa, respectivamente. Los resultados indican ‘que 'U' sustituyé a la constante de carécter original, 'u" 264 Hora 16 La instruccién de la I{nea 11 muestra la diferencia entre los dos apuntadores int, es decir, la resta de aptr_int2 y aptr_int1. El resultado es 5. La linea 12 asigna entonces otra direceiGn de memoria al apuntador aptr_int2, que es a Ja que hace referencia la expresién aptr_inti-S, aptr_int2 apunta ahora a una ubicacién de memoria que esti 10 bytes més abajo que la ubjcacién de memoria a la que apunta aptr_inti (vea el resultado que produce la linea 13). La diferencia entre aptr_int2 ¥ aptr_intt se obtiene mediante la resta de los dos apuntadores, la cual es -5 (ya que en ‘mi maquina un int es de dos bytes) como lo imprimié la instruccién de la linea 14, Apuntadores y arreglos ‘Como se indicé en lecciones anteriores, los apuntadores y los arreglos tienen. una estre- cha relacién. Usted puede acceder a un arregio a través de un apuntador que contenga la direcciGn de inicio del arreglo. La siguiente subseccidn presenta la forma de acceder a elementos de un arregio a través de apuntadores Acceso de arreglos mediante apuntadores Debido a que un nombre de arreglo al que no le sigue un indice se interpreta como un. apuntador al primer elemento del arreglo, usted puede asignar la direccién de inicio de un arregio a un apuntador del mismo tipo de datos; luego puede acceder a cualquier elemento del arreglo sumando el entero apropiado al apuntador. El valor del entero que utiliza es el mismo que el valor del indice de! elemento al que desea acceder, En otras palabras, dado un arreglo, arregle, y un apuntador, aptr_arreglo, si arreglo y aptr_arregie son del mismo tipo de datos, y aptr_arreglo contiene la direccién de icio del arreglo, es decir aptr_arreglo = arreglo; entonces la expresién arreglo[n] equivale a la expresion *(aptr_arregla + n) Aqui, n es el {ndice del arreglo. E] listado 16.3 muestra cémo acceder a arreglos y modificar valores de elementos de arregios utilizando. apuntadores Lastapo 16.3 Cémo acceder a arreglos por medio de apuntadores J* 16L83.c: Cémo acceder a arreglos mediante spuntadores */ ‘include main() { Uso de apuntadores 263 | Resta de apuntadores Usted puede restar el valor de un apuntador de otro para obtener la distancia entre las dos ubicaciones de memoria, Por ejemplo, dadas dos variables de apuntador de tipo char, aptr_cadenat y aptr_cadena2, puede calcular el desplazamiento entre las dos ubicaciones de memoria a las que apuntan ambos apuntadores, de la siguiente manera; aptr_eadena? - aptr_cadenat Para obtener resultados significativos, es mejor restar solamente apuntadores del mismo tipo de datos. El listado 16.2 muestra un ejemplo de cémo realizar una resta en una variable de apunta- dor de tipo int. Mixstagy Listapo 16.2 Cémo realizar una resta en apuntadores 16LO2.c: Resta de apuntadores */ finclude maint) int *aptr_inti, *aptr_ant2; printf (*Posicién de aptr_intt; ‘pla, aptr_intt); aptr_int2 = aptr_int! + 8; printt(*Posicitn de aptr_into = aptr_intt + 6: Spin‘, aptr_int2); printf(*La resta de aptr_int2 - aptr_intl: din", aptr_int2 - aptr_inti); aptr_int2 = aptr_intt - 3; printt(*Posicién de aptr_int2 = aptr_intt - 8: spin, aptr_int2); printf (*La resta de aptr_int2 . aptr_intt: sdin', aptr_int2 » aptr_ant1); Después de ejecutar el archive 16L02.exe en mi méquina, se desplegaron los siguientes resultados en la pantalla: Posicidn de aptr_intt; Ox0128 Posicidn de aptr int? = aptr_int1 + 5: @xo1s2 La resta de aptr_'nt2 - aptr_intt: 5 Posicidn de aptr_int2 = aptr_int! - La resta de aptr_int2 - aptr_inti: -& EI programa del listado 16.2 declara dos variables de apuntador de tipo int, aptr_int! y aptr_int2, en la linea 6. La instruccién de la linea 8 imprime la posicién de memoria que contiene aptr_int1. La linea 9 asigna a aptr_int2 la direccién de memoria. a la que hace referencia aptr_intt+5. Después se imprime el contenido de aptr_intz en la linea 10. 2 @XOTTE [262 Hora 16 significa moverse a la ubicaci6n de memoria que est un byte mas arriba que la ubicacién actual, 0x8008, a la que hace referencia ¢l apuntador aptr_ch. La Ifnea 16 muestra la ubicacién de memoria a la que hace referencia Ia variable de apurta- dor de tipo int, aptr_int, en @x@288, Debido a que en mi sistema el tamafio de int es de 2 bytes, la expresisn aptr_int+1 mueve a aptr_int a la ubicaciGn de memoria que esta ‘2 bytes més arriba que la ubicacién actual a la que apunta aptr_int. Ese es exactamente el resultado que usted ve en la linea 17. De la misma manera, la linea 18 muestra que aptr_int+2 se mueve para hacer referencia a @x028F, que est 4 bytes mas arriba (2*size- of (int)) que @xozes. La expresign aptr_int-1 de la linea 19 hace referencia a la ubicaciin de memoria ¢x@289; y aptr_int-2, de la linea 20, hace referencia a la ubicacidn Ox6287. En mi sistema, el tamatio del tipo de datos double es de 8 bytes de longitud, Por lo tanto, la expresién aptr_db+1 se interpreta como la direccién de memoria # Ia que hace refer- encia aptr_db més 6 bytes, es decir, 6x0128+8, lo cual da @x0139 en formato hexadeci- ‘mal, como puede ver en la linea 23. Las lineas 24 a 26 imprimen las direcciones de memoria a las que hacen referencia aptr_db+2, aptr_db-1 y aptr_db-2, respectivamente, lo cual demuestra que el compi- Jador utiliz6 el mismo tamaiio escalar de double en la aritmética de los apuntadores, g Los apuntadores son muy utiles cuando se usan en forma adecuada, Sin embargo, un apuntador puede meterie en problemas con rapidez si con- tiene un valor equivocado. Por ejemplo, un error comon es asignar un valor derecho 4 un apuntador que en realidad espera un valor izquierdo. ‘fortunadamente, muchos compiladores de C detectaran dichos errores y emiticén un mensaje de advertencia, Existe otre errer comin que el compilador no siempre detecta: utilizar apun- tadores sin inicializar. Por ejemplo, el siguiente ebdiga tiene un problema potencial: int x, *aptr_int; xs saptr_int = x; El problema es que el apuntador aptr_int no esta inicializado; apunta 3 una ubicacién de memoria desconocida. Por lo tanto, asignar un valor, como en este caso 8, a una ubicackin de memoria desconocida, resulta peligroso. Podria sobreescribir algin dato importante que ya esté guardade en esa lubicacién de memoria, lo que causaria un serio problema, La solucidn es ase- gurarse de que un apuntador esté apuntanda a una ubicacién de memoria valida y legal antes de utilizario. Pera evitar el problema potencial, puede escribir el cédigo de arriba de la si- guiente manera: int x, *aptr_int; x= 8; aptr_int = 8x; /* iniedaliza el apuntagor */ Uso de apuntadores printt("Posicién después de aptr_cn + 1: ‘pin, aptr_ch print? (*Posicin después de aptrich © 2: Spin", aptroch print? (*Posicién después de aptr_ch - 1: Spin, aptr_ch print? (*Posicién después de aptr_ch - 2; Spin", aptroch - /* apuntadar de tipo int aptr_int */ printf (“Posicién actual de aptr_int: ‘p\n*, aptr_int); printf(“Posicion después de apt? int + 1: Sp\n*, aptr_int + 1); printf(-Posicion después de aptr_int + 2: spin", aptrint + 2): printf (*Posicién después de aptr_int - 1: Spin‘, aptr_int - 1); print#(“Posicién después de apte_int - 2: Spin", aptrint - 2); J* apuntador de tipo double aptr_db */ printf (*Posicién actual de aptr_db: Sp\n", aptr_db); Brintt ("Posicién despuds do aptt_db + 1: Spin", aptr_aD + 1); printf(‘Posicién después de aptr_db + 2: Spin’, aptr_db + 2 Brintt (‘Posicién después de aptridb - 1: ‘pln, aptr_db - 1); Brintt(*Posicién después de aptr_ob - 2: Spin", aptr_dD - 2); return @; Obtuve los siguientes resultados al ejecutar en mi miquina el archivo 14L01.exe del programa del listado 16.1, Usted podria obtener direcciones diferentes en su compu tadora, asi como diferentes desplazamientos, dependiendo del tamaio de los tipos de datos de su sistema. Posicién actual de aptr_ch: @x0008 Posicién después de aptr_cn + 1: @xeeec Posicién después de aptr_ch Posicién despues de aptr_ch Posieién después de aptr_eh Posicién actual de aptr_int: Posicién después de aptr_int + Posicién después ds Posicién después de aptr_int - Posiesén despuds de aptr_int Posicién actual de aptr_db Posicién después de aptr_db Posicién después de aptr db Posicién después de aptr_dd Posicién despuds de aptr_d> REIT 2 reese ver ene stad 16.1, hay es spuntadores de ieretes ipo, ptr_en, aptr_int y aptr_db, declarados en las lineas 6 a 8, Entre ellos, aptr_ch es un apuntador a un cardcter, aptr_int es un apuntador a un entero, y aptr_db es un apuntador a un tipo doble, Después, la instruceidn de la linea 10 muestra la direccién de memoria, @xae0s, conte- rida por la variable de apuntador de tipo char, aptr_eh. Las lineas 11 y 12 despliegan dos direcciones, @x@0ec y @x@eeD, cuando se le suman 1 y 2a aptr_eh, respectivamente, Asimismo, las lineas 13 y 14 dan @x00@a y @x0009 cuando se mueve aptr_ch a direc cciones mis bajas de memoria, Debido a que el tamafio de char es 1 byte, aptr_chet

También podría gustarte