You are on page 1of 1110
Introducci6n a las computadoras, a Internet y ala World Wide Web Objetivos + Comprender los concepts bisicos acerca de las computadoras. ‘+ Familiacizarse con diferentes tipos de lenguajes de programaci6n, + Familiarizarse con la historia del lenguaje de progtamacién C. + Conocer Ia biblioteca estindar de C, *+ Comprender los elementos de un entorno de desarrotio tipico deC. ‘+ Apreciar por qué es apropiado aprender C como primer curso de programacién. + Apreciar por qué C proporciona los fundamentos para el estudio de otros lenguajes de programacin emt general, y en particular paca C+, Java y CH. + Familiarizarse con la historia de Internet y de Ia World Wide Web, Las cosas siempre son mejores al principio. Blaise Pascal Las grandes ideas requieren un lenguaje grande, Aristofanes Nuestra vida siempre es malgastada por et detalle.. simplificar simplifcar. Henry Thoreau 2. Ineduccién a las computadoras, a Internet y a la World Wide Web Capitulo 1 Plan general 1.1 Introduceién 1.2 {Qué es una computadora? 1.3. Otganizacién de computadoras 1.4 Evolucién de los sistemas operatives 1.5 Computacién personal, distribulda y cliente-servidor 1.6 Lenguajes maquina, lenguajes ensambladores y lenguajes de alto nivel 1.7 FORTRAN, COBOL, Pascal y Ada 1.8 Lahistoria de c 1.9 Labiblioteca estindar de 110 C++ 1.11 Java 1.12 BASIC, Visual Basic, Visual C++, C# y .NET 1.13. Latendencia clave del software: Tecnologia de objetos 1.14 Conceptos bésicos de un ambiente fipico de programacién en C 1.18 Tendencias de hardware 1.16 Historia de internet 1.17 Historia de ta World Wide Web 1.18 Notas generales acerca de C y de este titro Resumen * Terminologta + Error comin de programacién * Buena prictica de programaci6n + Tip de rendimiento + Tips de portabilidad » Observaciones de ingenieria de sofware * Ejericios de awtoevaluacién * Respuestas a los jercicios de autoevaluacion * Ejerccios 1.1 Introduccién sBienvenidos aC, C++ y Java! Hemos trabajado duro pars crear To que creemos serd una experiencia educa: ‘va informativa y entretenida para usted. Este libro es tnico entre otros libros de texto de C porque: Es apropiado para gente con orientacién réeniea que cuente con poca o nada de experiencia en progr smacidn, Es adecuado para programadores experimentados que deseen conacer més profundamente el lenguaje, {.Cémo puede un libro ser atractivo para ambos grupos? La respuesta es que Ia parte central det libro pone Enfasis en la claridad de los programas, a través de las técnicas comprobadas de programacidn estructurada, Los principiantes aprenden a programar bien desde ¢! principio. Hemos intentado escribir de manera clara y directa. El libro contiene ilustraciones en abundancis, Quizé lo més importante sea que ¢! libro contiene cientos «de programas completos, los cuales muestran los resultados que arrojan cuando se jecutan en una computado- ra, Nosotros Yasyamos esto “el método del eédigo activo”. Todos estos programs de ejemplo se encuentran cen el CD-ROM que acompaia a este libro; también puede descargar los originales desde nuestra pagina Web www. deitel .com. Los primeros cuatro capitulos presentan los fundamentos de las computacién, de la programacién de ‘computadoras y del lenguaje de programacién C. Los principiantes que han tomado nuestros cursos nos han di- ‘cho que el material que presentamos en estos capitulos contiene una base sélida para un tratamiento mas pro- fundo de C en los capitulos restantes. Los programadores experimentados por 10 general leen répistamente los ‘cuatro primeros eapitulos, y encuentran que el tratamiento de C en las capstules 5 a 14 es mas riguraso y de- safiante, Ep particular, aprecian el tratamiento profundo de apuntadores, cadenas, archivos y estructuras de da tas de los capftulos restantes, Capfulo 1 Introduccién a las computacioras,a internet y a ja World Wide Web 3 Muchos programadores experimentados aprecian el tratamiento de fa programacién estructurads. A menu eleaitoryse almacena J en-ctco' Biprograme preprocesodor process elcodige Elcomplador rec el codigo objeto yo famacenaen disco Eleniazodor elaciona el céctao ‘bjeto con os Biioleces, ceaa.out yo alacena c snacs —— Merete IE] pace | order ar | Rae Ecagodor esos — eee emote roe en |.__-E | Le CPU torne code instuccion Yiaojecuta. posiblement ‘lmecena nuevas valores (Ge dt mienitos el programe seeecuta Figura 1.1 Ambiante tipico de desarrollo en C. ‘c6mo editar un programa, El programador eseribe un programa en C mediante un editor, hace correcciones si ces necesario, y después almacena el programa en un dispositivo de almacenamiento secundario, como un dis- co. Los nombres de programas en C deben terminar con la extensién .¢. ‘A continuacién, cl programador introduce el comando para compilar el programa. El compilador traduce el programa en C a c6digo en lenguaje miquina (también conocido como cédizo objeto). En un sistema de C, se ¢jecuta de manera automética un programa preprocesador antes de que comience la fase de traduccién del com- pilador. El preprocesador de C obedece ciertos comandos especiales lamados directivas del preprocesador, las custes indican que se deben realizar ciertas manipulaciones en el programa antes de la compilacién, Por lo ge~ neral, estas manipulaciones consisten en inclu otros archivos dentro del archivo para que sean compilados, y en realizar distintos reemplazos de texto. En los primeres capitulos explicatemos las directivas mas comunes del preprocesador, y daremos una explicacién detallada de las caractersticas del preprocesador en el capitulo 13. Capitulo 1 Introcuccién a las computadoras, 0 internet y alla World Wide Web 13 El compilador invoca de manera automitica al preprocesador, antes de que el programa sea convertido a len- guaje méquina. La siguiente fase se denomina enlace. Por lo general, los programas en C contienen referencias a las fun- cones y datos definidos en alguna pare, tales como las bibliotecas esténdar o las bibliotecas privadas de gru- pos de programadores que trabajan en un proyecto en particular Por lo general, el cédigo objeto producido por cl compilador de C contiene “huecos”, debido a estas partes faltantes. Un enlazador enlaza el e6digo objeto ccon el cédigo correspondiente a las funciones faltantes para producir una imagen ejecutable (sin piezas faltan- tes). En un tipico sistema UNIX, el comando para compilar y enlazar un programa es ec. Para compilar y en~ lazar un programa llamado bienvenido.c teclee: ce bienvenido.c nel indicador de UNIX y presione la tecla Bnirar (Intro (0 de retorno).{Nota: Los comandlos de UNIX son sen- sibles a maytiscalas y minisculas, asegtrese de que teciea las cs como mimisculas y de que las letras del nombre de archivo sean maytsculas 0 mintsculas,segtin sea cl caso, Si Ta compilacidn y el enlace del programa ocurten con éxito, se crea un archivo a .out. Esta cs una imagen ejecutable de nuestro programa bienvenido..c. La siguiente fase se denomina carga. Antes de que el programa se pueda cjecutar, ste debe cargarse en memoria. Esto s¢ lleva a cabo mediante el cargador, el cual toma la imagen ejecutable del disco y Ia transfie- re a la memoria. También se cargan los componentes adicionales de la bibliotecas compartidas que soportan cl programa Por sitimo, la computadora, bajo cl control de la CPU, ejecuta el programa, una instrucckin ala vez. Para cargary ejecutar el programa en un sistema UNIX, teclee a -out en el indicador de UNIX y presione Entrar: Los programas no siempre funcionan al primer intento. Cada uno de los procedimientos puede falar debi- 4o a distinis errores, los cuales explicaremos. Por ejemplo, un programs en ejecucién podria intentar hacer ‘una divisin entre cero (una operacién ilegal en las computadoras, asf como en In aritmética). Esto ocasionarfa 4ue la computadora desplegara un mensaje de error. El programador volveria entonces la fase de edicin ha- ra las correcciones necesarias y procederfa con las fases restantes para verificar que correcciones funcionan adecuadamente. Error comiin de programacién 1.1 “Errores coma la divsiGn enve cero ocurven divante la ejecucian del programa, asi que estos errores son denon nnados erraes en tiempo de ejecucidn. En general, fa division entre coro es un error fatal, es decir un errr que ‘ocasiona la terminacisn inmediata del programa sin haber realizado de maneva exitasa su trabajo, Las errores no Jfatales pert al programa la ejecucin completa en su mayorta con resultados incorrectos. [Novas En algunos sistemas, la divisin entre cero no es un error fatal. Revise Ta documentacién de su sistema] ‘La mayoria de los programas en C introducen y/o arrojan datos. Ciertas funciones en C toman su entrada desde stdin (el flujo estindar de entrada) cl cual es, por lo general, el teclado, pero el stdin puede conec- tase a otro dispositivo. En su mayoria, los datos son arrojados hacia stdout (el flujo estandar de salida) el cual, por lo general es el monitor, pero el stdout puede conectarse a otro dispositivo. Cuando decimos que tun programa imprime un resultado, normalmente nos referimos a que el resultado se despliega en el monitor. Los datos pueden ser arrojados hacia otros dispositivos tales como discos e impresoras de alta velocidad. Exis- te también un flujo estdndar de errores denominado stderr. El flujo stderr (por lo general asociado con el monitor) se utiliza para desplegar los mensajes de error. Es comiin para los usuarios destinar los datos de sa lida normales, es decir, cl stdout, hacia un dispositivo distinto al monitor y mantener el stderr asignads al monitor, de manera quel usuario pueda estar informado de los errores de manera inmediata 1.15 Tendencias de hardware La comonidad de programadores se dsarola junta con el flujo continuo deavances dramaticos en el ard ware, el sofware y ls teenalogias de comnicacén. En general, cade ao la gene espera pagar ms por Ia rayora de los servicios y productos. Lo ontario ha sido el caso en los campos de las computador y 8s co- municaciones, especialmente con respect los cosios de anteimiento de estas teenologias, Por muchas Jé- cadas, sin expectaivas de cambio alguno en un futuro préximo, los costs de hardware han dsminuido de manera répda, sino es que precpitada, Este e un fendmeno de la ecnologi, Cada uno o dos fos, Ia capa- 14 Inoduccién a las computadoras,a Internet y a la World Wide Web Capfulo 1 Cckiades de las computadoras tienden 1 duplicarse mientras que los precios de las computadoras siguen cayendo. La disminucién en picada de la relacién costa/rendimiento de los sistemas de cémputo se debe a la ereciente velocidad y capacidad de la memoria en la cual la computadora ejecuta sus programas, al aumento exponen- cial en la cantidad de memoria secundaria (tal como el almacenamicnto en disco) en la que tienen que almacenar Jos programas y los datos durante largo tiempo, y al continuo ineremento en la velocidad de proceso (la velo cidad a la eual se ejecutan los programas en las computadoras, es decir, la Velocidad a la que hacen su trabajo), En las comunicaciones ha ocurrido el mismo crecimiento, y sus costos también han ido en picada, espe- cialmente en afios recientes con Ta enorme demanda por ancho de banda de comunicaciones, la cual arrae una ‘enorme competencia, No conacemos otros campos en los que la teenologfa se mueva tan répidamente y los cos- 10s disminuyan de la misma forma. Cuando en las décadas de los sesenta y setenta hizo explosién el uso de las, computadoras, se hablaba de las grandes mejoras en la productividad humana que las computadoras y las o- ‘municaciones traerfan consigo. Sin embargo, estas mejoras no se materializaron. Las empresas gastaron gran- des sumas de dinero en computadoras, y con certeza las emplearon eficientemente, pero no vieron realizadas ‘sus expectativas en cuanto a la productividad. Fue la invencién de la tecnologia de microprocesadores en chips yy su amplia wilizaci6n a finales de la década de los setenta y en la de los ochenta, Jo que sent6 la base para las ‘mejoras en la productividad actual 1.16 Historia de Internet ‘A finales de 1a década de los sesenta, uno de los autores (HIMD) de este libro era us estudiante egresado del “MIT. Sus investigaciones dentro del proyecto Mae del MIT (ahora el laboratoio d ciencias de la computaciGn, Ja casa del World Wide Web Consortium), eran patrocinadas por ARPA (Advanced Rescarch Projects Agency of the Department of Defense). ARPA patrocin6 una conferencia en la que algunas docenas de estudiantes de proyecto se eunieron en la universidad de Illinois, en Urbana-Champaign, para conocer y compartir sus ideas. Durante esta conferencia, ARPA difundis el anteproyecto de coneciar en red a las principales computadaras de tuna docena de universidades ¢insitutos de investigacin patrocinados por ARPA. Estas se conectarfan mediante lineas de comunicacién que operaban, en ese entonces, a le inretble velocidad de 56 KB (es decir, 56,000 bits por segundo), esto en una época en la que Ia mayorfa dela gente (de los pocos que podian estar) se conectaba mediante las Iineas telefGnicas a las computadoras @ un rango de velocidad de 110 bits por segundo. HMD recuerda hicidament Ia emocién en aquella conierencia. Investigadores de Harvard hablaron acerca de comu- nicar la Univac 1108, “una supercomputadera” dela universidad de Utah, con todo el pals, para manejar los caleulos relacionados con sus investigaciones acerca de grficas por computadors. Se comentaron muchas otras posibilidades inrigantes. La investgacién aeadémica estaba a punto de dar un paso gigantesco hacia delantc Poco después de éta conferencia, ARPA prOcedi con la implantacién de lo que pronto se convirti en ARPA net, 1 abuelo de Ia Internet actual Las cosas resultaron diferentes a lo que se habia planeado originalmente. En lugar de que el principal be- neficio fuera el que los investigadares pudieran compartir sus computadoras, se hizo evidente que el principal beneficio de ARPAnet iba a ser el permitr que Ios investigadores se comunicaran de una manera ripiday fac entze ellos, por medio de lo que se llame correo electrénico (e-mail) Esto es verdad incluso en el Internet ae- tual, en donde el correo clectrénicofacilita la comunicacion de td tipo de personas alrededor del mundo. Usa de las principales metas de ARPA, con respecto a lated, era permitir que miltiples usuarios enviaran y eeibieran informacién al mismo tiempo y sobre las misma rutas de comuniaci6n (al como una Tinea tele- {nica). La red operaba mediante una téenica denominada intercambio de paquetes, en la cual, un dato digital se enviaba en pequefios paguetes. Dichos paquets contentan datos, informaciGn de la dtecciGn, informacign para el coniol de ertoes y a informacién de la secuencia. La informacién sobre la dreccidn se utlizaba para establecer la ruta de los paquetes hacia su destino. La informacién de la Secuencia se ullizaba para ayudar a ‘acomodar los pauetes en su orden original (los cuales, debido alos complejos mecanismos de ruteo, en tea- lidad pueden llegar en desorden), Los paquetes de muchas personas se mezclahan en las mismas Tineas de comunicacién, La wenica de intercambio de paquetesredujo de manera importante os costos de tansiisin, com= parados con los costos de ls leas de comunicacin dedicadas. La ted se disei6 para operar sin un control central. Esto significaba que si una porcin de la red fllaba, Jas porciones restantes podrian ser capaces de enviar paquetes, de los remitentes a los destinatarios, através de rutas alternas. Coptulo 1 Infroduccién a las computadoras, a inlemet yaa World Wide Web 15 Los protocolos para la comunicacién a través de ARPAnet se hicieron conocidos como TCP (Transmission Control Protocol). TCP garantizaba que los mensajes se enrutaran apropiadamente del remitente al destinata- rio, y que los mensajes Hegaran intactos, En paralelo con Ia primera evolucién de Intemet, las empresas de todo e1 mundo estaban instalando sus propias redes de comunicacién, tanto intraempresariales (dentro de la empresa), como interempresariales (en- tue las empresas). En ese entonces aparecié una gran cantidad de hardware y software para redes, Uno de los desafios era lograr la intercomunicaci6n. ARPA lo logr6 mediante cl desarroll6 de IP (Internet Protocol), y con ello creé la verdadera “red de redes”; la arquitectura actual de Internet, A la combinacién de ambos protocolos se le denomina TCPAP. En un principio, el uso de Internet estaba limitado a las universidades y a los institutos de investigacion; después, la milicia se convirtié en un usuario importante. En algin momento, el gobierno permitié el acceso a Internet con fines comerciales. De entrada, hubo recelo por parte de las comunidades militares y de investig: ci6n, pensaban que el tiempo de respuesta se haria deficiente, conforme “la red” se saturara de usuatios. De hecho, ha ocurrido lo contrario, La gente de negocios rpidamente se dio cuenta de que si utlizaban cfectivamente la Internet, podrian afinar sus operaciones y ofrecer nuevos y mejores servicios a sus clientes. Como resultado, los ejecutivos de negocios gastaron grandes cantidades de dinero para desarrollar y mejorar Intemet. Esto generé una feroz competencia entre los proveedores de dispositivos de comunicacién, de hard- ‘ware y software para cubrir la demanda. El resultado es que el ancho de banda (es decir, Ia capacidad de trans isin de informacin de las lineas de comunicacién) sobre Internet ha crecido enormemente y Jos costos ban ido en picada, En la actualidad, los paises alrededor del mundo saben que Internet es erucial para su prosperi- dad econémica y su competitividad. 1.17 Historia de la World Wide Web La World Wide Web permite alos usuarios de computadoras, localizar y ver documentos basadas en multimedia (es decir, documentos con texto, gréficas, animacién, audi y/o video) de casi cualquier tema, Aunque Internet se desarroll6 hace més de tres décadas, la introduccién de World Wide Web es un suceso relativamente recien- te, En 1990, Tin Berners-Lee, miembro de In CERN (European Organization for Nuclear Research) desarroll6 la World Wide Web y los distintos protocolos de comunicacién que forman su esqueleto. Tanto Internet como la World Wide Web estardn en Ia lista de las creaciones mas importantes de la hum dad, En el pasado, Ia mayorfa de las aplicaciones de cémputo se ejecutaban sobre computadoras “indepen- dientes”, es decir, computadoras que no estaban conectadas entre si Las aplicaciones actuales pueden ser escritas para comunicar a cientos de miles de computadoras alrededor del mundo. Internet combina las tecnologias de comunicacién y computacién. Hace mds Fécil nuestro wabajo. Hace que la informacién esté disponible de mane- ‘2 Instantinea y conveniente 2 nivel mundial. Hace posible que los individuos y los pequeéios negocios puedan lexponerse a nivel mundial. Esté modificando la naturaleza de la forma en que se llevan a cabo los negocios. La gente puede buscar los mejores precios y virtualmente cualquier producto o servicio, Las comunidades con inlereses especiales pueden mantenerse en contacto entre si. Los investigadores pueden dar aviso de manera ins- {anténea de los Gltimos avances a nivel mundial. 1.18 Notas generales acerca de C y de este libro Aguas veces los programadores experimentados de C se sienten orgullosos por ser capaces de crear aplicacio- es tara, retoreida ¢intrincadas del lenguaje. sta es una mala préctica de programacign. Hace que los progra- ‘mas sean mis dificiles de ler, con mayor probabilidad de comporiarse de manera extrsfa, mas difiiles de leer y depurar, y ms dificiles de adaptar a modificaciones necesarias. Est libro se orienta hacia los programadores Drincipiantes, por ello motivamos la claridad. La siguiente es nuestra primera “buena préctica de programacién”. Buena practica de programacién 1.1 Escriba sus programas en C de manera clara, directa y simple. Aesto se le Nama algunas veces KIS ("keep tt sim ple”, maniéngalo sinple). No "estire” ef lengua, inientando emplearlo de manera extraia. Probablemente ha escuchado que C es un lenguaje portable, y que los programas escritos en C pueden sje. ccutarse en muchas computadoras diferentes. La portabilidad es una meta escurridiza. El documento C estin- 16 Introduccién a las computadoras, a Internet y a Ia World Wide Web Capitulo 1 dar de ANSI contiene una larga lista de temas acerca de Ia portabilidad, y se han escrito libros completos que la explican, Tip de portabilidad 1.3 “Aungue ex posible escribir programas portables, exisien muchos problemas entre Tos diferenres compladores de ©, yas computadoras pueden hacer que la portbilidad sen diel de canseguix Escrbir programas en C no go rantiza la portabilidad. A menudo, el programador fendrd que enfientarsedivectomente con la variaciones ene os compiladores y las computadoras. Nosotros hicimos una revisién cuidadosa de! documento para cl estindar de C, y comparamos nuestra presentacin contra este documento para que fuera completa y acertada. Sin embargo, C sun lengusje rico. y existen algunas sutlezas en el lenguaje y algunos temas avanzados que no cubrimos. Si usted requiere detalles ‘6enicosadicionaes sobre C, e sugerimos que lea el documento de Cestindar ol libro de Kemighan y Ritchie. Nosotros limitamos nuestra explicacién al C de ANSV/ISO. Muchas de las caracteristicas de esa versi6n fain{ void ) nicia la ejecucién del programa */ print£| "Bienvenido a C!\n" ); return 0; /* indica rama te eal p de la funcién main */ Bienvenido a C| Figura 2.1 Progrome de imoresion de texto Capitulo 2 Inoduccién ala progamacién enc 28 los comentarios y no genera e6digo objeto en lenguaje maquina. El comentario anterior slo describe el nt 1a, el nombre del archivo y el propésito del programa. Los comentarios también ayudan a otras personas a leer y entender un programa, pero demasiados comentarios pueden ocasionar que un programa sea dificil de ler. (Olvidar nalizar un comentario con *7 a Error comin de programacién 2.1 Comensar un comentario con los caracieres */, ofinalizarto eon 7. Error comin de programacién 2.2 Lafinea 3 Winclude ‘es una directiva del preprocesador de C. Las Iineas que comienzan con # son procesadas por el pteprocesa- dor antes de que el programa se compile. Esta linea en particular indica al preprocesador que incluya en el programa el contenido del encabezado estandar de entrada/salida (stAio.n). Este encabezado comtiene informacién que el compilador utiliza cuando compila las Tlamadas a Tas funciones de la biblioteca estindar de entrada/salida, como print£. En el capitulo 5 explicaremos con mas detalle el contenido de los enca- bezados. Lalines 6 int main( ) forma parte de todos los programas en C. Los paréntesis que aparecen después de main indican que main es tun blogue de construccién de programas llamado funcién. Los programas en C contienen una o ma funciones, tuna de las cuales debe ser main. Todo programa en C comienza su ejecucién en la funcién main, Buena practica de programacién 2.1 La ave izquierda, ¢, (nea 7), debe iniciar el cuerpo de cada funci6n, Una Have derecha correspondien- te (linea 12), debe finalizar cada funci6n. Este par de Hlaves y la parte del programa entre ellas se conocen co- ‘mo blogue, El blogue es una unidad importante del programa en C. La linea 8 print€( “Bienvenido a C!\n" )y indica a la computadora que realice una accidn, es decir, que imprima en la pantsla la cadena de caracteres contenida entre las comillas En algunas ocasiones a una cadena se le amma cadena de earacteres, mensaje 0 literal. La linea completa (que incluye print, su argumento entre paréntess,y el purio y coma (2)] se conoce como insiruccién. Tods insirucci6n debe finalizar con un punto y coma (también conocido como terminador de fa instruc). Cuando la instruceién print anterior se ejecuta, ésa imprime en la pantalla ¢] mensaje Bienvenido a C! En general, los caractees se imprimen exactamente como aparecen entre las comillas de Ia instruccién print £. Observe que los caracteres \n no aparecieron en pantalla. La diagonal invertida (\) se conoce como canicter de excape. Este indica que se espera que print haga algo fuera de To ordinaio. ‘Cuando una diagonal invertida se encuentra dentro de una cadena, el compilador ve el siguiente carcter y 10 ‘combina con la diagonal invertéda para formar una secuencia de escape. La secuencia de escape \n significa ‘eva Tinea. Cuando una nueva nea aparece en la sida de lx cadena por medio de print, esta nueva linea ocasiona que el cursor se posicione al comienzo de la siguiente Knead la pantalla. Bn la figura 2.2 aparecen algunas secuencias de escape comunes Las dos titimas secuencias de escepe de la figura 2.2 pueden parecer extraias. Debido a que In diagonal invertida tiene un significado especial en una cadena, es decir, que el compilador la reconoce como un caracter , (Mnea12), indica el final de Ja funcién main, my Buena practica de programacién 2.2 Dijimos que print € ocasiona que la computadora reali alguna accién, Cuando cualquier programa se cjecuta, és realiza diversas acciones y toma decisiones. Al final de este capitulo explicamtas la toma de deci- siones. En el capitulo 3, explicamos a profundidad este modelo de programacién de accidnidecision. Error comin de programacién 2.3 Escrbir en un programa el nombre de la func de salida petnt® como print, Resulta importante observar que las funciones de la biblioteca estindar como print y scanf no for- ‘man parte del lenguaje de programacién C. Por ejemplo, el compilador no puede encontrar ertores de escritura en printf o scanf. Cuando el compilador compila una instruccién print, éste s6le proporciona espacio en cl programa objeto para una “llamada” a la funcién de biblioteca, Sin embargo, €1 compilador no sabe en dén- de estan las funciones de biblioteca; el enlazador sf Io sabe. Cuando se ejecuta el enlazador, éste localiza las funciones de biblioteca e inserta las lamadas apropiadas para dichas funciones en el programa objeto. Ahora, cl programa objeto esté “completo” y listo para ejecutarse. De hecho, al programa enlazado con frecuencia se Je conoce como ejecutable. Si el nombre de la funcién esté mal escrito, es el enlazador quien detectaré el error, ya gue no sera capaz de hacer coincidir el nombre que se encuentra en el programa en C, con el nombre de nin- ‘guna funcién conocida de las bibliotecas. Bs Buena préctica de programacién 2.3 El ittimo cardce re inprima cualquier funcian de inpresin debe ser una neva Tinea {\a). Esto garantiza que 1a fancidn dejard at cursor de la panralla posicionado al principio de wna nueva linea. Las convenciones de esta nnaturaleza facilitan la retlizacion de software, un objetivo clave de fos ambientes de desarrolio de software. Buena practica de programacién 2.4 Capitulo 2 Intioduccién a la programacién en 27 /* Figura 2.3: £1g02_03.¢ Impresién de una linea mediante dos iastrucciones printf */ Hinclude /* la funcién main inicia Ja ejecuciéa del pros int main() printe | *Bienvenide * 1; printf *a.ct\nt ); return 0; /* indica que el programa terminé de con éxito */ 13) /* €in de La funcién main */ Bienvenido a Ct Figura 2.3. Impresién de una tinea mecionte instrucciones print separadas, my Buena praéctica de programacién 2.5 [BRB] Esai me comencon pore ama de eso gee wd pio» plane de wana ane a tonenton deer acl deaulctn pare eral sur proto sod aon een ‘tar Neato econcadanor guile slate butcon de Ide plgade owe cen ner epaco pare omar ior vets dela ser La funcién print puede imprimir de diferentes formas el mensaje Bienvenido a C! Por ejemplo, el pro- ‘grama de la figura 2.3 produce la misma salida que el de la figura 2.1. Esto funciona porque cada printf con- tina con la impresion a partir de donde la funcién print é anterior dejé de imprimir. La primera print £ (Qinea 8) imprime Bienvenido seguido por un espacio, y la segunda print (Iinea 9) comienza a imprimir cen 1a misma linea, inmediatamente después de! espaci Una sola print puede imprimir varias lineas utilizando caracteres de nueva linea, como en la figura 2.4 ‘Cada vez que aparece la secuencia de escape \m (nueva linea), la salida continia al prinipio de la siguiente linea 2.3 Otro programa sencillo en C: Suma de dos enteros [Nuestro siguiente programa utiliza la funcién sean de la biblioteca estindar para obtener dos enteros escri- 10s por el usuatio a través del teclado, para calcular la summa de dichos valores e imprimir el resultado median- /* Figura 2.4: £1g02_04.¢ Impresién de miltiples iineas mediante una sola instruccién printt */ Hinclude int maint) 1 2 3 4 5 /* la funcién main inicia la ejecucién del programa */ 6 7 8 print£( "Bienvenido\na\nc! \nY 1; 9 10 return 0; /* indica que el programa terminé con éxito */ u 12) /* fin de 1a funcién main */ Bienvenido cr Figura 2.4 Impresion en varias ineas con una sola instrucciin print, 28 Inlroduccién a la programacién en C Copitulo 2 ura 2.5: £ig02_05.c Programa de suna */ tinelude int main) ‘ int enterol; /* primer nimero a introducix’ por el usuario” +/: 1 2 3 4 5 /* 1a funcién main inicia 1a ejecucién del programa */ ‘6 7 8 9 int entero2; /* segundo nimero introduci= por el usuario */ 10 int suna; /* variable en la que se almacenaré la suna */ u 12 print£( "Introduzca el primer entero\n" ); /* indicador */ 13 scanfi 8a", sentero1 77 lee un entero’ + 4 15 printf “Introduzca el segundo entero\n* ); /* indicador */ 16 seanE\ "td", ‘gentero? ), 2 dee !un entero Ws 7 18 suna = enterol + entero; /* asigna el resultado a suma */ 9 200 print£(.*La sumaes $d\n", sung); /* impeitie! 1a Suita +7 2 22 return 0; /* indica que el programa terminé con éxito */ 23 24) /* fin de 1a funcién main */ Introduzca el primey entero 45 Introduzea el segundo entero 2 La guna es 17 Figura 2.5. Programa de sumo. te printé. El programa y el resultado del ejemplo aparecen en la figura 2.5. [Observe que en el dislogo de centradalsalida de la figura 2.5 resaltamos los niimeros introducidos por el usuario.) El comentario de las lineas I y 2 establece el propésito del programa. Como dijimos antes, todo programa comienza su ejecucién en main. La llave izquierda, {, de la Iinea 7 marca el comienzo del cuerpo de main, y la lave derecha correspondiente, }, de la linea 24 manca el fin Las lineas 8 10 int enterol; /* primer mimero a introducir por el usuario */ int entero2; /* segundo nimero a introducir por el usuario */ int guna; /* variable en l= que se almacenaré la suma */ son definiciones. Los nombres enterol, entero2, y suma son los nombres de las variables. Una variable sun sitio de la memoria de la computadora en donde se puede almacenar un valor para que lo utilice un pro- grams. Esta definicién especifica que las variables entero, entero2 y suma son de tipo int, lo cual sig nifica que estas variables almacenan valores enteros, es decir, nimeros completos como 7, ~11, 0, 31914, y ‘otros similares. Todas las variables deben declararse mediante un nombre y un tipo de dato inmediatamente ‘después de la Have izquierda que comienza el cuerpo de main, antes de que puedan utiizarse en un programa. En C, existen otros tipas de datos ademas de dint. Observe que hubiéramos podido combinar las definiciones anteriores en una sola iustruccién de declaracién de la siguiente manera Ant enterol, entero?, suma: En C, el nombre de una variable es cualquier identificador vélido. Un identificador es una serie de carac- teres que consta de letras, digitos y guiones bajos (_), y que no comienza con un digito. Un identificador pue~ Capitulo 2 Inlroduccién a la programacin en 29 de tener cualquier longitud, sin embargo, los compiladores de C s6lo requieren reconocer los primeros 31 ca: racteres, de acuerdo con el ANSI C estindar. C es sensible a maytisculas y minisculas, de tal forma que al y ‘Ai son identificadores diferentes. Error comin de programacién 2.4 Titi Tip de portabilidad 2.1 Uuilce dentificadores de 31 caracteres 0 menos. Esto le aywdard a garanizar la portabildad y puede evitar al- unos problemas sutiles de programacin Buena practica de programacién 2.6 legir nombres de variables que tengan significado le ayuda a escribir programas “auiodocumentados”; es decih necesitard menos comentarios una letra mayiscula cuando debe wilizarse wna miniscula (por ejemplo, escribir Main en lugar de Buena préctica de programacién 2.7 Laprimera Tera de un Wdenificador willzado como un nombre de variable sencilla debe er miniscwla. Mas ade lame asignaremos wn significado especial a los identficadores que comienzan con una letra mayscul, y a los ldentifcadores que uilizan todas sus letras en mayisculas Buena practica de programacién 2.8 {Tos nombres de variables con muchas palabras pueden ayudarle a escribir wn programa mds legible. Evite juntar palabras diferentes como comisionestotales: mejor ulice las palabras separadas por un guidn bajo como en comisiones_totales, ¢, si desea juntar las palabras, comience cada una con letras mayiiculas como en Comisionestotales. Este iliimo estilo es preferibe. a fe [oe] 3 La declaracién de variables debe colocarse después de la lave i2quierda de una funcién y antes de cualquier instruccin ejecutable. Por ejemplo, en el programs de la figura 2.5, insertar las declaraciones después del pr ‘mer print£ ocasionarfa un error de sintaxis, Sucede wn error de sintaxis cuando el compilador no puede te ‘conocer una instruccién, El compilador por lo general envia un mensaje de error para ayudar al programador a localizar y a arreglar la instruceién incorrecta. Los errores de sintaxis son violaciones del lenguaje. A estos cervores también se les conoce como errores de compilacidn, o erroresen tiempo de compilacién. Error comin de programacién 2.5 Colocar las declavaciones de variables entre istruccionesejecuiables, ocasiona errores de Sinton Buena practica de programacién 2.9 [BB] Serr tes etree ys racine hcl wa nin maa a eV, rae E>] sardondeterminan ls delaracionesy donde comienzan as inrucclones ejecabes, La linea 12, print£( “Introduzca el priner entero\n” 1 [*indicador */ imprime en la pantalla las palabras tntroduzca el primer entero, y posiciona el cursor a principio de Ia siguiente linea. A este mensaje se le lama indicador porque le indica al usuario que realice una accién espe- cifica La siguiente instruceién scanf( "a", genterol ); /* ise un entero */ utiliza sean para obtener un valor por parte del usuario, La foncién scané toma la informacién de entrada Gesde la entrada esténdar que, por lo general, es el teclado, Esta scang tiene dos argumentos, "a" y &en- ‘terol. El primer argumento, la cadena de contro! de formato, indica el tipo de dato que debe introducir el uusuasio. El especificador de conversién, 4, indica que el dato debe ser un entero (a letra A significa “entero decimal’). En este contexto, sang (y también print, como veremos més adelante) trata al % como un ca: rricter especial que comienza un especificador de conversion. El segundo argumento de scan£ comienza con tun amperson (&), conocido en C como operador de direccién, seguido del nombre de una variable. El amper- son, cuande se combina con el nombre de una variable, le indica a scang la ubieacién en memoria de la va- 30 _Introduccién 04a programacién on C Coptulo2 riable enterol. La computadora después almacena el valor de entezod en esa ubicacién. El uso del am- person (&) con frecuencia es confuso para los programadores principiantes o para la gente que ha programado ¢n otros lenguajes que no requiaren esta notacién. Por el momento, s6lo recuerde que debe colocar un amper- son antes de cada variable en cualquier instruccién scant. En los capftulos 6 y 7 explicamos algunas excepcio- nes a esta regla. El uso del amperson seri claro después de que estudiemos los apuntadores en el capitulo 7 Buena practica de programacién 2.10 ‘Cuando Ia computadora ejecuta la instruccién seané anterior, &ta espera a que el usuario introduzea un valor para la variable entero. E] usuario responde escribiendo un entero y después oprimiendo la recla de retomo (algunas veces Tlamada tecla Entrar}, para enviar el niimero a la computadora. Después, la compu- tadora asigna este nlimero, 0 valor, a fa variable entero’, Cualquier referencia posterior a enterol cn el programa utlizard este mismo valor. Las funciones print y scang facilitan la imeraccién entre el usuario y a computadora. Debido a que esta interaccién parece un didlogo, con frecuencia se le lama computacién con- versacional 0 computaci6n interactiva La linea 15 printf ( “Introduzca el segundo entero\n” ); /*indicador */ > xy es mayor que y < < xy se 6s menor que ¥ = x2 26s mayar 0 igual que ¥ . xs. 2 es meor 0 igual que ¥ Figura 2.12 Operasores de igualdad y de relacién, Error comin de programacién 2.16 (Qcurrird un error de sintaxs si Tos das simbolos de cualquiera de los eperadores parados por wn espacio. Error comin de programacién 2.17 ‘Ocurrird wn error de sintais si se nvierien los simbolos de cualquiera de los operadores . respectivamente, Error comin de programacién 2.18 Confndir el operador de igualdad ‘nel operador de asignacion = Error comtn de programacién 2.19 = 1 /* Figura 2.13: £1g02_13.¢ 2 0 de inetrucciones if, operadores 3 de relacién, y operadores de igualdad */ 4 include 5 6 a efecucién del programa */ 7 8 9 rimer nimero que lee el usuario */ 10 jundo numero que lee el usu u 12 eros, y le dire\n* ) 13 satisfacen: * } 4 Figura 2.13 Uso de los operadores de igualdad y de relacién.(Parte | de 2) Coptuio2 Inoduccién ala programacién en 37 15 scanf( *tdav, snumi, &mum2 }; /* Lectura de los enteros */ 16 Ye Camtasia 18 printé( "td es igual que d\n, numl, mum2 ); 9) /* fin de if */ 20 21 Se ¢ munities 1 ( 22 printf( "dno es igual que t€\n", num, num2 ); 2300) /* Ein de if */ 24 25 if ( iim 2" muD ) ¢ 26 printf( "td es menor que td\n", num, num? 1; 2+) /* fin de it */ 28 29 if ¢ aoa SD 30 printf( ‘td es mayor que td\n", numl, num2-}; 31 ) /* fin de it */ 32. 3300 Gf ( Bumioe="puna ) ¢ 34 printf ( "td es menor o igual que $d\n", uml, num2 ); 3500) /* Ein de if 47 36 37 sf (ain v4 38 printé ( mayor o igual que 8d\n", numl, num? }: 39) /* Fin de it */ 40 41 return 0; /* indica que el programa cerminé con éxito */ 42 43) /* fin de 1a funcién main */ Tntvodusea dos entercs, y le dive las relaciones que satisfacen: 3 7 3 noes igual que 7 3.8 menor que 7 3 es menor o igual que 7 Thtroduzca dos enteros, y de dixe jas relaciones que satisfacen: 22 12 22 no es igual que 12 22 es mayor que 12 22 es mayor 0 igual que 12 Tntroduzca dos enteros, y le dire las relaciones que satisfacen: 7 7 Fes iguaY que 7 7 @@ menor “© igual’ que 7 7 ea mayor o igual que 7 Figura 2.13. Uso de los operadores de igualdded y de relacién. Parte 2 de 2) Observe que el programa de la figura 2.13 utiliza la funci6n seané (linea 15) para introducir dos miimeros. (Cada especificador de conversién tiene un argumento correspondiente, en el que se almacenard un valor. El primer ‘sd convierte un valor que se almacenaré en la variable mumt, y el segundo %4 convierte un valor que se almace- 38 Introduccién a la programacién on C Captuio2 Operadores ‘Aociativided sop os ‘nquierda aderecha = iaquierda a dereena inquierda a derecha iagoierda a derecha derecha aizguierda Figura 2.14 Precedencia y asocistividad de los operadores que hemos expiicade hasta el momento. nard en la variable num2. Colocar sangrias a Jo Jargo del cuerpo de cada instruccién if, y colocar Iineas en blanco arriba y debajo de cada una de ellas mejora la legibilidad del programa. Ademds, observe que cada ins truccién 4 de Ia figura 2.13 tiene una sola instruceién en su cuerpo. En el capitulo 3, mostramos cémo espe- cificar insicucciones ££ con cuerpos formados por multiples instrucciones, y, Buena practica de programacién 2.12 8 | Cotogue sangrias en el cuerpo de wna instruccion 42 Buena préctica de programacién 2.13 Cologue una linea en blanco antes y después de cada tnstruccion 4, para mejorar a legiblidad del programa Buena préctica de programacién 2.14 ad : Error comin de programacién 2.20 Colocar comas (cuando no son necesarias) entre expectficadores de conversin en la cadena de control de forma ‘correspondiente a una instrucién scant. } comentario (lineas 1 a 3) dela figura 2.13 estd separado en tres ineas, En los programas en C, los espa clos blancos come tabuladores, nuevas lineas y espacias, por lo general son ignorados. Por lo tanto, as instruc- cones y comentarios deben extenderse en varias lineas. Sin embargo, no es correcto separar identificadores. Buena préctica de programacién 2.15 [SRS thence pede deen variant, Sana Raacln de wpa To go dear LES far ets enon ten ce dep de na com a spar por comes 8 na truccén se divide en des o mds linens. colaqu songras en todas ls Ie subsignenes. La figura 2.14 lista la precedencia de los operadores que presentamos en est capitulo, Los operadores apa recen de arriba abajo en orden decreciente de precedencia. Observe que el signo de iguadad también es un ope- rador. Todos estos operadores, con excepcidn del de asignacién =, asocian de izquierda a derecha, El operador de asignacign (=) asocia de derecha a izquierda Buena practica de programacién 2.16 Revise la tabla de precedenca dle operadores, cuando escriba expresiones que contengan muchos operadores. Com firme que los operadores dela expesin se apcan en el orden coret, St no esd seguro del orden de evalacin de una expresion compa uliceparéntesis para agrapar expresiones. Asegirese de recordar que algunos de as ‘operadores de C, como el de asignacén (=), asocin de derecha a fequerda,y no d tierda a derecha. ‘Algunas de las palabras que hemos utiizado en los programas en C de este capitulo, en particular int, return e if, son palabras clave 0 palabras reservadas del lenguaje. Las palabras reservadas de C aparecen cen la figura 2.15. Estas palabras tienen un significado especial para el compiladar de C, por lo que el programa: dor debe tener cuidado de no utilizar estas palabras como identificadores, tales como nombres de variables. En este libro, explicaremos todas estas palabras reservadas. Capitulo 2 Infroduccién a la programaciénenC 39 Palabras reservadas auto double int struct break else long switch case enum register typedert char extern return union conet Float short unsignea continue for signed void defauit goto sizeot volatile ao. ae static while Figura 2.18. Palabras reservacis de C. En este capitulo introdujimos muchas caracteristicas importantes del lenguaje de programaci6a C, que in- le indica al compilador que incluya en el programa el encabe- ado estindar de entrada/salida, Este archivo contcne informacion que el compilador utiliza para verficar la precision de Tas Hlamadas a funciones de entrada y salida, como scant y print. ‘Los programas en C consisten en funciones, una de ls cuales debe ser main. Todo programa en C comienza su ejecw- cidn en la funcién main, La funcién print puede ullzarse para imprimir una cadena que se encventra entre comillas,y para imprimir Ios vax lores de expresiones. Cuando se imprime un valor entero, ef primer argumento de fa funci6n prime (la cadena de con- trol de formato) contiene el especificador de conversin MA y cualquier otro carter a imprimir; el segundo argumento ela expresion cuyo valor se imprimita, Si se va a imprimir mas de un entero, la cadena de control de formato contiene ‘un para cada entero y los argumentos separadas por comas que siguen ala cadena de contol de formato contienen las lexpresiones cuyos valores se imprimirén, [a funcién ecant obviene valores que el usuario normalmente introduce por medio del teclado. Su primer argumento es la cadens de control de formato que le indica 1a computadora qué tipo de dato debe intoducirel usuario. El especii- cader de conversion, %, indica que e! dato debe ser un entero. Cada uno de los argumentos restantes corresponden a uno de los especificadores de conversion dela cadena de control de formato, En general, todo nombre de variable es prece ido por un amperson («), llamado operador de direccién, El amperson, cuando se combina con e} nomire de una vars ble, le indica a la computador la posicién de memoria en donde se almacenari cl valor. Después la computadora alma cena el valor en esa posits, + Todas las variables deben declararse antes de que puedan uilizarse en un programa. Un nombre e variable es cualquier identiicador valid. Un identifcador es una serie de caracteres compuestos por e- teas, digits y guiones bajos (_). Los identficadores no deben comenzar con un digito. Los idemificadores pueden tener ‘cualquier longitud, sin embargo, so los primeros 31 digitos son importantes. Ces sensible a maytiseulas y minsculas. ‘La mayorfa de los eleulos se realizan en instrucciones de + Toda va + Siempre que un nuevo valor se cologue en una posicién de memoria, éstereemplaza a! valor anterior de esa pos! bido a que la informacién ancrioe se destuye, al proceso de leer informacién en una posicin de memoria se e conoce como lectura destructiva, ble almacenada en la memoria de la computadora tiene un nombre, un valor y un tip. 49 _Introduccién a la programacién en C tadora asociatividad de operadores. Capttulo 2 Al proceso de lectura desde una posicin de memoria se le conoce como letura no destuctva Las expresionesaritméticas deben esribirseen forma de Kina recta, par faciltar la ntroduccién de programas & la compu El compilador evalia expresiones aritmeticas en una seeuencia precisa, determinada por las reglas de precedeneia y de + La instroecin 4 permite al programador tomar decisiones cuando se cumple cesta condicién, + Si la condicidn es vertutera,entonces se ejecuta Ia instruccién en el cuerpo de 4, Sila condicin es fsa, se sala la instrvccign del everp. + Por lo general las condiciones en instrucciones Lf se orn uilzando operadores de igualdad o de relaciSn. El resul- tado de utilizar estos operadores siempre es la simple absereacion de “verdadero” 0 “falso". Observe que las condicio- nes pueden ser expresiones que generen un valor cero (falso), 0 uno diferente de cero (verdadero) TERMINOLOGIA accidn amperson (6) argumento ‘sociatvidad de derecha a izquinda ssociatividad de izquierda a derecha asocitividad de operadores asteriseo (*) biblioteca Estindar de C blogue cadena cadena de caracteres cadena de control cadena de control de formato cardcter de escape cardcter de escape diagonal invertida (\) cardeter de nueva linea (\n) cardeter espacio en blanco comentario ‘computacién conversacional ‘computaci6a interactiva condicion ceverpo de una funcién secision declaracién sion entera ivisign entre cero lencabezaulo estindar de entrada) sala entero error de compilacién error de sintaxis certoren tempo de compilacién certo fatal erro no fatal specificador de conversion especificador de conversion a falso flujo de convot forma de linea recta foncién funcisn print funcién scant suidn bajo) Identificador indicador instaceiGn de asignacion instuceiGn de control 4€ int Iectura no destroctiva iiteral saves mensaje modelo de scciGn/decisién nombre nombre de variable ‘operader copezador de asignaciéa ‘operador de asignacién signo de igual ‘operador de dteocin ‘operador de muliplicacisn (#) ‘operador médulo () ‘operadores aritméticos ‘operadores binarios ‘operadores de igualéad ‘es igual que" “no es igual que” ‘operadores de relacién ERRORES COMUNES DE PROGRAMACION 21 Olvidar finaizar un comentario con 7. 2.2 Comensar un comentario con las caracreres * /, 0 inalizarlo con /* > "es mayor que” -< "es menor que” “es mayor 0 igual que” “es menor 0 igual qu” ‘operando palabras clave palabras reservadas palabras reservadas de C paréntesis ( paréntesis anidados pposcién, bicacién precedercia preprocesador de C rogramacin estructrade reglas de precedencia de operadores sangria socvencia de escape sensible a mayiscuas y mindsculas signo de porcentaj (¥) para nici un especificador de conversion ataio.k tecla de retorno tecla Entrar terminador de instrueciéa () terminador de instruecién punto y coma (7) tipo de variable toma de decisiones ubiession (0 posicién) de memoria valor valor cero (also) valor de variable valor diferente de cero (verdadero) variable verdadero Capitulo 2 Introduccién a la programacién enc 41 23 24 28 26 27 28 29 2.10 2a 22 243 214 218, 216 247 218 219 Eseribir en un programa el nombre de la funcisn de salida print é como print. Usilizar una letra ma scula cuando debe utlizarse una yaindscuta (por ejemplo, escribir Main en lugar de main), Colocar las declaraciones de variables enreinstruecionesejecutales, ocasiona etrores de sintais Los edlculos en ls instrucciones de asignacin deben estar la derecha del operador =. Colocar Ios edleulos a la iaguierda de un operador de asignacién, es un eror de sintaxis. (Olvidar una 0 ambas comillas alrededor de la cadena de contol de formato en una instruccién Print 0 scant, Olvidar el % en una especiticacion de conversin en Ia cadena de control de formato de una instucciin print £ o scant, CColocar una secuencia de escape como \n fuera de la cadena de control de formato de una instrcci6n print o scant. (Olvidar inctuir las expresiones cuyos valores van a imprimiese en una instruceidn prime € que contiene especiti- adores de conversion. [No proporcionar a una eadena de contol de formato, comrespondiente a una instruccién prime, un especifcador de conversidn, cuando se necesita uno para imprimir el valor de una expresin. CColocar dentro de una cadens de control de formato la coma que se supone debe separa la cadena de control de formato de las expresiones a imprimirse. Olvidar colocar un amperson antes de una v debe ser precedia por uno. ble correspondiente a una instruceién scan£, cuando, de hecho, ‘Colocar un amperson ames de una variable ineluida en una instruccién print, cuando, de hecho, no debe ser precedida por uno. La division entre cero por lo general noes definida en los sistemas de comput, y da come resultado un eof es decir, un error que ocasiona que el programa termine de inmediato, sin que haya finalizado con éxito su traba- jo. Los errores no fatalespermiten alos programas ejeciars totalmente, pero con frecuencia producen resultados curt un errr de sintaxs silos dos sfmbolos de cualquiera de Tos operadores rados por un espacio. (Ocurrir un error de sintaxis si se invierten los simbolos de cualquiera de los operadores 1=, >= y <=, como =!, >, ne, fespectivamente. CConfundir el operador de igualdad == con el operador de pparecen seps- ignacion = CColocar un punto y coma inmediatamente ala derecha del paréntesis derecho después de la condicion de una ins truccisn if, CColocar comas (cuando no son necesaras) entre especificadores de conversin en la cadena de contol de formato correspondiente a una instrccién sean. BUENAS PRACTICAS DE PROGRAMACION 2a 22 23 24 25 26 “Tada funcién debe ser precedida por un comentario que deseriba el propésito dela func, ‘Agreave un comentario a Ia nea que contiene la lave derecha, ), que cierra toda funcién, incluyendo a main, EE limo career que imprima cualquier funcién de impresién debe ser una nueva linea (\n). Esto garantiea que la funcin dejar al cersor de la pantalla posicionado al principio de una nueva linea, Las convenciones de esta na- turalezafacilitan ta reutitzacion de software, un objetivo clave de los ambiente de desarrollo de software. [Bstablezea sangrias en ef cuerpo de cas funciOn, un nivel hacia adentro del lave que define el cuerpo de la fun- ine maint ) ‘ int x, ¥, 2, resultado; /* declara variables *, printf( "Introduzca tres enteros: * ); /* indicader */ scanf( "803684", &x, &y, G2 }7 /* lee tres enteros */ resultado = x * y * 2; /* maltiplica los valores */ DrintE( "El preducte es Sd\n", resultado J; /* despliega el resultado */ return 0; ? a) Enor: anumero, Cosreccisn: elimine el &. Mas adelante explicaremos las excopciones @ eto. b) Ener: mumero2 no tiene wn amperson, Conecci6n: numero debe aparecer como &mumexo2. Mis adelan- te explicaremes las excepciones a esto ©) ror: El punto y coma gue se encuentra después del paréntesis derecho de Ta condicign que se encuentra en la instrceién 4, Comeccion: eliing el punto y coma que se encuentra después del parénesis derecho. (Nota: El resultado de este error es que la instrwesi6n printf se ejecutur, independientemente de qve la condicion de la instruceidn 4¢ sea verdadera. El punto y coma despues del parénesis se considera como una instruccién ‘vaca; es decir, una instruecién que hace nada-] 18) ror: El operador do rlacidn => debe cambiar a >= (mayor o igual qos) EJERCICIOS 27 dentitique y conija los errores de cada uno de los siguientes ejericios (Nota: Puede haber més de un eror en car da ejercicio.) a) scant( "a", valor )1 b) printé( “Bi producto de “dy Md es %A\n, x, ¥ I: ©) primerumero + segundoNuero = eunaDeNuneros 4) 4£ ( numero => masGrande ) Capitulo 2 Inlroducci6n a la programacién en 45 28 29 210 2a 212 213 214 ©) */ programa para deterninar el minero mis grande de tres enteros /* i) Scant( ¥4", unBntero ); 2) printé( “Bl residuo de Sa entre Nd es\n", x, Ye x %¥ 17 bat (xe ys print£( es igual que SA\n", x,y 7 1) printe( "ha suma es 84\n," x + y )7 i) Print£( "BL valor que escribié es: %d\n, tvalor ); ‘Complete los espacios en blanco: 4) Los se utlizan para documentar un programa y para mejorar su legibilidad ') La foncign que se uli para desplegarinfrsucién en Ia pantalla es — }EnC, una istrccin para tomar decsiones es 4) En general las insrucciones son quienes teaizan ts célculos, ¢} La funcién —__ introduce valores desde el teclad. seriba una sola instruccino lines de C que realice lo siguiente: 4) Imprims el mensaje "Becriba dos nineros” ')Asigne el producto de las variables by ¢ ala variable a ©) Indique ave un program realiza un edleulo de némina (es dest tilice texto que ayude a documeatae un pro- gam). {)Escriba tes valores enters desde el eclado ycoloque tos valores en as variables enteas a,b y Indique cuales de las siguientes oraciones son verdaderas y cules son flsas. Si son flsas, expique su respuesta a} Los operadores de C se evalan de iquirda a derecha ) Los siguientes son nombres de variables vidos: sion base u_cuenta total, a,b, ¢, z, 22 ©) Lainstrucci6n print é ("a = 57 2 sun tipico ejemplo de una instrccin de asignacion, ‘Una expesion aritmatica valida que na conteneparéntesis se eval de iaquicrda a derecha ©) Los siguientes son nombres no vidos de variables: 39, 87, 6782, 822, 2h. ‘Complete fs espacios en blanco: 8) {Qué operaciones artmeéticas se encuentran en el mismo nivel de precedencia que In motiplicacion? 926134, ©5, 37, bb) En una expres aritmética cuando los paréntesis est anidados, ;qué conjunto de parémesis se evala pric ©) Una posicién en la memoria do Is computadora que contiene diferentes valores en diferentes momentos, a lo laggo de la ejecucién de un programa se congce como Qué se imprime cuando se ejecuta cada una de ls siguientes nstrueciones? Sino se imprime algo, entonces res- Ponda “nada”. Suponga que x=2 yy = 3 ) prine( ea", x 7 by) peinee( “eae, x 6 x 7 @) printé( eka", x 02 ©) printé( "Sd = Ra", x4, y+ xT Deexey g) scant ( “dva", ex, BY): by /* printe( m+ y = Ra", x ey 2 */ i) prante( *\a") + {Cuil de Ins siguientes instrucciones de C contieven variables involucradas con Ia Lectura destructive? a) scant ( "Saraednata", eb, ke, ed, ke, EE): bpeieders ©) printe( “Lectura destructiva” )+ 4d) printe( “a = 5" ‘Dada la ecuacidn y = ax'47, ,eudl de as siguientes son insrueciones comectas en C para esta ecuacisn? aystatxetxt xed: Dysatxrxt (xe 707 Qys(atxy txt (xe Tr Dyes (ateytxtee ts Oystat(xtxte) 47 Dysatet (xt xed hy 46 Introduccién a la programacién en C Capitulo 2 2.15 Establezca el orden de evaluacién de los operadores en cada una de las siguientes instruc valor dea después de que se realice cada insinucidn, )xeT+3*6/2-4) bee 2e2e202-272 xe Cater Cae (9* 3/630) ) dF 2.16 Escriba un programa que pida al usuario escribir dos nimeros, que abtenga los dos nimeros por parte del usuario, ‘que fmprime la sums, el producto, la diferencia, el cocientey el resid de los dos nimeros. res de C, y muestre et sande os sic 2.17 Eseriba un programa que imprima los ndmeros del 1 al 4 en la isin linea. Escrba el programs util _euientes métodos 48) Mediante una instruccién print f sin especificadores de conversién, ) Mediante una instruccién print con cuatro especificadores de conversién, ©) Mediante cuatro instrucciones printe, 2.18 _Escriba un programa que pds al usuario que introduzca dos enters, que obtenga fos miimeras por parte del usu rio, después que imprima las palabras “ea m&s grande”. Si los nimeros son iguales, que imprima el mensaje “Betos mimeroa gon iguales”. Solamente utile la forma de seleecién simple de la instrucién 4, que aprendli6 en este capital, 2.19 Escriba un programa que introduzca tres diferentes enteros desde l teclado, después que imprima la sum, el promedio, el producto, el ntimero més pequefo y el mas grande de éstos. Solamente uilice la forma de seleccién simple de lainstruccién 4, que aprendié en este capitulo. El dislogo en la pantalla debe aparecer de la siguiente forma: Escriba tres enteros diferentes: 13.27.14 La suma es 54 El pronedio es 18 #1 producto es 4914 1 mimero mas pequefio es 13 BL nimero més grande es 27 2.20 Escriba un programa que lea el radio de un efreulo y que imprima el didmeto, la circunferenciay cl drea de ese cieulo, Utlice el valor constante de 3.14159 para m: Realice cada uno de estos eileulos dentro de instuccin(es) PEAntE, ylilice el especificador de conversién *E. (Nota: En este capitulo slo explicamos constantes y vaia- bles enteras. Ene} capitulo 3 explicaremos los imeros de punto flotante, es decir, valores que pueden tener pun- tos decimales:} 2.21 Esertu un programa que imprima una caja, un 6valo, una fecha y un diamante como los siguientes: 2.22 ,Qué imprime el siguiente c6digo? printé( "#\nt*\nte#\ntete\nte**n\nr ); 2.23 Escriba un programa que lea cinco enters y que después imprima el nimero mis grande y el mas pequefo del gu ‘po. Usilice s6l0técnicas de programacién que hays aprendido en este capitulo, 2.24 Escrba un programa que Tea un entero y que determine e impitma si es par o impat. (Pista: Uilice l operador ‘médulo, Un nimero par es un multiple de dos. Cualquer miiple de 2 aoja un residvo de cero, cuando se divide entre 2] Coptulo 2 Introduccion a la programaciénenC 47 2.25 Imprima sus iniciles en maydsculas de imprenta de manera que apunten hacia a part inferior de la piginas (aco ‘das), Constraya cada mayscula de imprenta con Ia letra que ésta representa, de la siguiente formal PPPPPPPEP oag995 ‘ppppnoppp D D D D DoD oppo 2.26 scriba un programa que leados enters y que determine impriana sie primero es miltiplo del segundo. [Pisa Unllice el operador médulo,) 2.27 esplicgue cl siguiente pated de disefo mediante acho instucciones printf, y después desplieaue el misme pax tu6n con el menor niémero posible de insrucciones prints. 2.28 _Distinga ene los érminos eror fatal y no fatal. {Por qué podtfa usted prefeirexperimentar un eror fatal a un No fatal? 2.29 He squt un avance. En este capitulo aprendis acerea de enters y del tipo int. C también puede representar letras rmayiisculas, windsculas, yuna considerable Variedad de simbolos especiales. C utiliza internamente enteos pegue- Tos para representat cada caricrer. Al conjunto de caracteres que utiliza una compatadoray a las representaciones enteras para esos caractere x les conoce Como conjunto de caracteres dela computador. Por ejemplo, usted puede imprimir el enero equivalentea la Ammaysscula,siejecuta a instreccién printe( ea", /ar )y Escriba un programa en C que imprima los enteros equvalentes a algunas letras mayisculas, mindscula, dgitos ¥ slinbolos especiales. Como minim, determine los enteros equivalentes de las sighientes: ABC abeO12$* + /yelcaricter espacio en blance. 2.30 seria un programa que introdv2ca un niimero de cinco digitos, que separe el nimezo en sus digitos individuals y que despliegue los digitos separados entre sf mediante tes espacios cada uno. [Pista: Uslce combinaciones de la division entera y el operader médulo.) Por ejemplo, si el usuario eseribe 42139, el programa éebe imprimir 48 Infroduccién a la programacién en Capitulo 2 231 Utiice sto las tgenieas que aprendi6 en este capitulo para escribir un progratna que calcule los cuadadosy los cu bos de los némeros 0. 10, y que utlicetabuladores para desplegar la siguiente tabla do valores unero cuadrado— cubo. a 0 ° i 1 1 2 4 8 3 9 27 a 16 64 5 25 125 6 36 216 7 43, 343 8 6a 512 9 ai 729 io 300 1000 Desarrollo de programas estructurados en C Objetivos + Comprender las tonicas bésicas para solucionar problems + Desarrollar algoritmos a través del proceso de mejoramiento arriba abajo, paso a paso. + Utilizar las instrucciones de seleccién 1f e 1f..e1L8e para seleccionar acciones. + Utilizar la instrucci6n de repeticién whi Le para ejecutar repetidamente las instrucciones de un programa, + Comprender la repeticiGn controlada por contador y Ia repeticién controlada por centinela + Comprender Ia programacién estructurada + Usilizar los operadores de incremento, decremento y asignacién, El secreto del éxito es la constancia Benjamin Disraeli ‘Movimonos ws lugar hacia detante Lewis Carroll La rueda ha completado el céreulo. William Shakespeare Elrey Lear _Cudntas manzanas cayeron en la cabeza de Newton antes de que tuviera la idea? Robert Frost (Comentario) 50 Desarrollo de programas estructurados en C Capitulo 3 Plan general 3.1 Introduccién’ 3.2 Algoritmos 32.3 Pseudocddigo 3.4. Estructuras de control 35 3.6 Lainstruccién de seleccion if. .-else 3.7 Lainsttuccién de repeticién while 3.8 Formulacién de algoritmos: Ejemplo prdctico 1 (repeticién controlada por contador) 3.9 Formulacién de algoritmos mediante mejoramiento arriba-abajo, paso a pa! Ejemplo practico 2 (repeticion controlada por centinela) 3.10 _Formulacién de algoritmos mediante mejoramiento arriba-abajo, paso a paso: Ejemplo préctico 3 (estructuras de control anidadas) 3.11 Operadores de asignacin 3.12 Operadores de inctemento y decremento Resunen + Terminologia * Errores comunes de programacién + Tips para presenir ervores + Buenas préciicas de prosramacion + Tips de rendimiento + Observaciones de ingenler(a de softwaw + Ejercicios de autoevaluacién + Respuestas a los ejercicios de auloevaluacion + Ejercicios 3.1 Introduccién Antes de escribir un programa para resolver un problema en particular, es esencial que comprendamos el pro- blema y el método para resolver dicho problema, Los dos capitulos siguientes explican las técnicas que fa- cilitan el desarrollo de programas estructurados de computadora, En la secci6n 4.12, presentamos un resumen sobre programacién estructurada, ef cual une las téenicas que desarrollamos en éste y en el capitulo 4 3.2 Algoritmos La solucién a cualquier problema de cémputo involucra la ejecucién de una serie de acciones en un orden es- pecifico. Ai procedimiento para resolver un problema en términos de: 1, Las acciones a ejecutar. 2. El orden en el cual se evan a cabo dichas acciones, se le llama algoritmo. El siguiente ejemplo demuestra que es importante especificar correctamente el orden en cl que se deben ejecutar las aeciones. Considere el algoritmo “levantarse y arreglarse” que sigue un joven ejecutivo para salir de la cama e ir @ su trabajo: Levantarse de la cama. Quirarse la pijama Baitarse. Vestirse. Desayunar Manejar hacia el trabajo. Esta rutina hace que el ejecutivo vaya al trabgjo bien preparado para tomar decisiones erticas. Sin embar- 20, suponga que sigue los mismos pasos en un orden ligeramente diferente: Captuio 3 Desarrollo de programas estructurados on C51 Levantarse de la cama, Quitarse la pijama, Vestirse. Banarse, Desayunar. ‘Manejar hacia el trabajo. En este caso, nuestro joven ejecutivo llega al trabajo empapado. A la especificaci6n del orden en el cual se ejecutan las instrucciones dentro de un programa de computadora se le lama contro! del programa. En este ca- pitulo y en el siguiente, investigaremos las capacidades de control del programa de C. 3.3 Pseudocédigo El pseudocdédigo es un lenguaje artificial ¢ informal que ayuda a los programadores a desarollar algoritnos. El pseudocédigo es similar al inglés comiin; es conveniente y sencillo, aunque no es un lenguaje de programacién real Los programas en pseudocédigo no se ejecutan en las computadoras, sino que s6lo ayudan al programador a “resolver” un programa antes de intentarescribirio en un lenguaje de programacién como C. En este capitulo, ‘proporcionamos muchos ejemplos respecto a la manera efectiva de utilizar el pseudocédigo para desarrollar pro- ‘gratras estructurados en C. El pseudacédigo s6lo consiste en caracteres, de manera que los programadores pueden introducir los pro- ‘gramas en pseudocddigo a la computadora mediante un programa de edicién. La computadora puede desplegar ‘imprimir una copia reciente del pseudocédigo cuando sea necesario. Un programa en pseudocddigo cuidado- ssamente preparado puede convertirse {écilmente en su correspondiente programa en C. En muchos casos esto se hace mediante un simple reemplazo de las instrucciones en pseudocddigo por sus equivalentes en C. EI pseudocédigo sélo consiste en instrucciones de accién, es decir, aquellas que se ejecutan cuando el pro- _grama se convirtié de pseudocédigo a C y se ejecutan en C. Las declaraciones no son instrucciones ejecutabes. ‘Son mensajes para el compilador. Por ejemplo, Ia definicién int 4; simplemente le indica al compilador el tipo de la variable $, ¢instruye al compilador para que reserve el espa cio en memoria para la variable. Sin embargo, esta definicién no provoca la ejecucién de accién alguna (al co- ‘no una entrada salida, o céleulo) cuando se ejecuta el programa. Algunos programadores eligen mostrar cada variable y mencionar de manera breve el propésito de cada una al principio de! pseudocddigo del programa. De nuevo, el pseudocddigo es una ayuda para el desarrollo de programas, 3.4 Estructuras de control Por general, las instrucciones dentro de un programa se ejecutan una a una en el orden en que estin escitas A.esto se le tama ejecucién secuencial. Varias instrucciones de C, que explicaremos més adelante, permiten al Programador especificar que la siguiente instruccién a ejecutarse debe ser otra y no la siguiente en la secuen- cia, A esto ve le lama transferencia de control. Durante la década de los sesentas, se hizo claro que el uso indisriminedo de transferencias de contol era cl origen de un gran nimero de dificultades que experimentaban los grupos de desarrollo de software. El dedo 4de la culpa apunto hacia la instruceién goto, que permite al programador especificar una transferencia de con- trol a un amplio margen de destinos posibles dentro de un programa, La idea de la programacién estructurada se convitté casi en un sin6nimo de la “eliminacién del goto” Las investigaciones de Bohm y Jacopini' demostraron que los programas se pueden escribir sin instruc- ‘eign goto alguna. El reto para los programadores de la €poca era modificar sus esos hacia una “progra- ‘maci6n con menos instrucciones goto”. No fue sino hasta la década de los setenta que los profesionales de la 1. Bohm, C. y G. Jacopin, “Flow diagrams, Turing Machines, and Languages with Only Two Formotion Roles", Communica- tions ofthe ACM, Vo 9, No. 5, mayo de 1996, pp. 336 2371 52 Desarrotio de programas estructurados en C Capfulo 3 eee sume cafficacion etotal) tetal = total + caliticacion; uma 1 @ contador contador = contador + 17 $ Figura 3.1 Diograrma de fujo de Io estructura secuencial de C. programacién comenzaron a tomar en serio a la programacién estructurada. Los resultados fueron impresionan- fas, os grupos de desarrollo de software reportaron una reduccién en los tiempos de desarrollo la entega mas ‘oportuna de los sistemas y el apego ms frecuente al presupuesto de ls proyectos de software, La clave de es- te éxito fue simplemente que los programas producidos mediante téenicas estructuradas eran mas claros, mis fciles de mantener y depurar, y tenfan mas probabilidades de estar libres de errores desde el principio. El trabajo de Bohm y Jacopini demostr6 que todos los programas se podian eserbic en términos de Slo tres estracturas de contol, 2 saber, la estructura secuencial, a estructura de selecién,y la estructura de repe- ticidn. La estructura de secuencia se encuentra esencialmente dentro de C. A menos que se Ie indique lo con- ttario, la computadoraejecuta de manera automatica las instrucciones en C, una aun, en el orden en que estin escrtss. El segmento de diagrama de flujo de la figura 3.1 muestra I estructura secuencial de C. Un diagrama de flujo es una representacin grifica de un algritmo o de una porcién de un algortmo. Los diagramas de flujo se dipujan mediante simbolos de propésito especial tales como recténgulos, rombos, 6¥a- ls, y pequefos ctculos: estos simbolos se conectan mediante flechas llamadas lineas de flujo. Como el pseudocédigo, los diagramas de flujo sn tiles para desarollary representaralgoritmos, aunque la mayoria de los programadorespreieren el pseudoeddigo. Los diagramas de flujo muestranclaramente la ma- nera en que operan las estructuras de contol: esto es 1 nico para fo que los utilizaremos en est libro Considere el diagrama de flujo para Ie estructura secuencial de la figura 3.1. Utilizamos el simbolo rectén- ‘gulo, también lamado simbolo de accién, para indicar cualquier tipo de accién, incluyendo una operacién de caeulo 0 de entrada/stida, Las lineas de flujo de la figura indican el orden en el que se realizan las acciones (primero, se suma cali ficacion a total y posteriormente se suma 1 a contador. C nos permite tener en una estructura secuenciattantas acciones como deseemos. Como veremos més adelante, en cualquier lugar en donde coloquemos tna accisn, también podemos colocar muchas acciones en secuencia. Cuando dibujamos un diagrama de flujo que representa un algoritmo completo el primer simbolo que se utiliza es un dralo que contiene la palabra “Inicio”; y el tltimo simbolo que se utiliza es un dvato que conti ne la palabra “Fin”. Cuando dibujamos s6lo una porciGn de un algortmo, como en la figura 3.1, se omiten los simolos de 6valo y Se emplean pequefios cfrculos también lamados simbolos conectores. Quiza el simbolo més importante dentro de un diagrama de flujo es el rombo, también llamado simbolo de = 60 ) peinte( "aprobado\n" ); Observe que el eédigo en C se parece mucho al pseudocdsigo. Esta es una de las propiedades del pseudo- digo que lo hacen una herramienta de desaralio tan iti & Buena practica de programacién 3.2 ‘Armenudo, el pseudocédigo se uiliza para “plantear” wn programa durante el proceso de disefio. Posterionmente ‘el programa en pseudocddigo se comviere a C- El diagrama de flujo de la figura 3.2 muestra la instruccién de seleccién simple 4. Este diagrama de flujo contin Io que quizé es el simbolo mas importante de los diagramas de flujo, el rombo, también llamado sim- bolo de decisién, el cual indica que se va.a tomar una decisi6n, El simbolo de decision contiene una expresin, tal como una condici6n, que indica la decision que se debe tomar, El simbolo de decisin contiene dos Kineas de flujo que emergen de él. Uno indica la direccién que se debe tomar cuando la expresién dentro del simbolo cs verdadera; Ja otra indica la diteccién que se debe tomar cuando le expresin es fasa. En el capitulo 2 apren- ‘dimos que las decisiones se pueden basar en condiciones que contienen operadores de relacién o de igualdad. De hecho, una decisin se puede basar en cualquier expresidn; si la expresién es igual a cero, se trata como {alsa, y sila expresiOn es diferente de cero, se trata como verdadera. 54 Desarrollo de programas estructurados en C Capitulo 3 ° — "210% re foto) 3 Figura 3.2. Diograma de fujo de Ia insttuccion de seleccion simple if Observe que la instrucci6n 4 tambign es una estractra de entrada simple/satia simple, Prono aprende remos que los diagramas de flujo para les estrocturas de control restntes también pueden contner(ademis de pequofos circulos y linea de flujo) solamente recténgulos para indica ls acciones que se deben realizar, y rombos para indica las devisiones que se deben tomar. Este ese] modelo de programacion acci/decisi que hemos estado enfatizando, Podeme vsuslizar siete contenedores, cada uno con diagrams de uo de uno de os set tpose instru: ciones de control. Estos segrentos de diagramas de flujo estn vacios, nada esti escrito dentro de los retin alos ni dentro de los rombos. Entonces, stare del programador es lade ensamblar un programs, partiendo de tantas nstrucciones de contro de cada tipo como lo requiem et algoritmo, combinar dics instrciones de control de sélo dos maneras posibls (pila o anidado), y entonces lena les acciones y ss decisiones de ma neta apropiada para el algorimo, Explicaremos la variedad de formas en las cuales podermos escribir ls aciones Y las decisiones. 3.6 La instruccién de seleccién if..else La instruccién de seleccidn 4£ realiza una accién indicada, sélo cuando la condicién es verdadera; de lo con- trario, se ignora dicha accién. La instruccién de seleccidn if..e1.8e permite al programador especificar que se realizardn acciones diferentes cuando la condicién sea verdadera y cuando la condicién sea Taisa. Por ejem- plo, Ia instruccién en pseudocédigo ifealificacién del estudiante es mayor o igual que 60 Imprime “Aprobado" else Imprime “Reprobado" imprime Aprobado si la calificacién del estudiante es mayor 0 igual que 60, ¢ imprime Reprobado sila califica- ‘cin del estudiante es menor que 60. En cualquiera de los casos, después de que ocurre la impresién, se ejecuta la siguiente instruceién del pseudocédigo. Observe que también el cuerpo del else esta sangrado. Independien- temente de la convencién de sengrado que utilice, debe utilizarla con cuidado a lo largo de sus programas. Es » 60) print£( “Aprobado\n"" ); else print{( “Reprobado\n" ); Captulo 3 Desarrollo de programas estructurados enc $5 < verdedero Caiiteacion >= 60) é Figura 3.3 Diagrame de fujo de [a insttuccion de seleccién doble if..e1se. El diagrama de flujo de la figura 3.3 ilustra de manera clara el flujo de control de la instruccién if..e18e Una vez més, observe que (ademas de los pequefios circulos y las flechas) los tnicos simbolos en el diagrama de flujo son recténgulos (para las acciones) y un rombo (para la decisién). Continuaremos haciendo énfasis en este modelo de cémputo accién/decisién. De nuevo, imagine un contenedor profundo con tantas instrucciones, de seleccién doble (representadas por segmentos de diagramas de flujo) como fueran necesarias para construir cualquier programa en C. Otra vez, el trabajo del programador es ensamblar estas instrucciones de selecci6n (apilando y anidando) con otras instrucciones de control requeridas por el algoritmo, y llenar fos rectingulos y Jos rombos vacfos con acciones y decisiones apropiadas para el algoritmo que va a implementa. C proporciona el operador condicional (2), el cual esté {ntimamente relacionado con la instrucci6n Lf..e1se. El operador condicional es el nico operador ternario de C, es decit, requiere tres operandos. Los ‘operandos junto con el operador condicional forman una expresién condicional. El primer operando es una con- icin. E1 segundo operando es el valor para toda la expresiGn condicional, si la expresidn es verdadera, y el tercer operand es el valor para toda la expresisn condicional, si la condicién es falsa, Por ejemplo, a instruc~ cién printé printf( "s\n", calificacion >= 60 ? “Aprobado” : “Reprobado” ); ccontiene una expresi6n condicional que evalda la cadena literal “Aprobado”, sila condicién calificacion 60 es verdadera, y evalda la cadena literal "Reprobado”, si la condicién es falsa. La cadena de control de formato de print £ contiene la especificacién de conversi6n Ss para imprimir los caracteres de la cadena. Por lo tanto, la instruccién print anterior se ejecuta esencialmente de la misma forma que la instrucciéa if.elee. Los valores de una expresién condicional también pueden ser acciones a ejecutar. Por ejemplo, la expre- sign condicional calificacion >= 60 ? printf( “Aprobado\n” ) : printf ( “Reprobado\n" ); se lee “Si la calificacién es mayor o igual que 60, entonces print ("aprobado\n”), de lo contrario print ("Reprobado\n")”. También esto se puede comparar con la instrucci6n 4£..e1.se anterior. Vere- 'mos que los operadores condicionales pueden utilizarse en algunas situaciones en donde los 4£..e18e no. Las instrucciones 1£..e18e anidadas evaliian miltiples casos al colocar instrucciones 4£..e18e dentro de otras instrucciones 1£..e18e. Por ejemplo, la instruccién siguiente en pseudocddigo imprime una A para Jas calificaciones mayores o igusles que 90, B para las calficaciones mayores o iguales que 80, € para las cali- ficaciones mayores o iguales que 70, D para las calificaciones mayores o iguales que 60, y F para todas las demas calificaciones, if ealificacién del estudiante es mayor o igual que 90 Imprime “A” else ‘fcalificacién del estudiante es mayor o igual que 80 Imprime “B” 56 Desarrollo de programas estructurados en © Capitulo 3 se ‘if califcacién del estudiante es mayor o igual que 70 Inprime °C" else ‘fcalificacion del estudiante es mayor 0 igual gue 60 Inprime “D else Inprime “F Este pseudocédigo se puede escribir en C como: Af ( calificacion >= 90 ) printf ( “A\n" )7 elee Af ( calificacion >= 60) printé( "B\n" ); else Af ( calificacion >= 70) printé( *c\n” ease Lf ( calfficacion »= 60 ) printé( “D\n" elee printé( "Pye" }; Si la variable cali ficacion es mayor o igusl que 90, las primeras cuatro condiciones serdn verdaderas, pero slo se ejecutara la instruccién prints después de la primera condicién, Después de la ejecucién del print se ignora la parte else del 1£..e1.se “extemno”. Muchos programadores en C prefieren escribir la instruccién 4£ anterior como if ( calificacion >= 90 ) printé( “A\n" ); else if ( calificacion >= 80) peinté( *B\n" ); else if ( calificacion >= 70) pinté( “C\n" )7 elee 1f ( calificacion >= 60) printe( “D\n" )7 elee printe( “P\n" )y En lo que respecta al compllador de C, ambas formas son equivalentes. La iltima forma es popular debido a {que evita un sangrado protundo de cédigo hacia la derecha. Dicho sangrado a menudo deja poco espacio en la linea, lo que provoca que las lineas se dividan y provoquen una menor claridad del programa, La instruceién de seleccién 4 € permite sélo una instruccién dentro del cuerpo. Para ineluir Varias instruc ciones dentro del cuerpo de un 4£, encierre las instrucciones dentro de llaves ({ y }), A un conjunto de ins: tmucciones costenidas dentro de un par de laves se le llama instruccién compuesta 0 blogue. de software 3.1 Observacion de ingenieri Ey Ta instrccin compuesa puede clocarse en cualquier pare den prograna ex donde pueda cOloeaa6 a is treet sencila El ejemplo siguiente incluye una instruccién compuesta en la parte ese de una instruccin 4..e1se. if ( calificacion >= 60) printf ( “Aprobado. \n" else { printf ( “Reprobado.\n" ); Drint£( “Usted deberé tomar muevanente el curso.\n” )7 Captulo 3 Desarrollo de programas estructurados en 87 En este caso, si cali ficacion es menor que 60, el programa ejecuta las dos instrucciones print en el cuerpo del ese e imprime Reprobado. Uated deberd tomar nuevanente el cures. Observe Tas Haves que envuelven a las dos instrucciones de la eldusula else, Estas llaves son importantes, Sin Tas Tlaves, la instruccion printf( “Usted deberé tomar nuevamente €1 curso.\n" }; cstaria afuera del cuerpo de la parte eLse del if, y se ejecutarfa sin importar si la calificaci6n fuera o no me- nor que 60. _-.. Ertor comin de programacién 3.1 (Olvidar uno Tas das Haves que delinitan una instrucciin compuesta ‘Un error de sintais se detect mediante el compilador. Un error de légica tiene efecto en tiempo de ejecucién. Un error fatal de Wigica provoca que el programa falle y termine de manera prematura. Un error no fatal de légica permite al programa continuar la ejecucin, pero produce resultados incorectos Error comiin de programacién 3.2 [SPRY Cotocar wm punto coma despues dela condicign de una Instruccdn LE provoca un eror de igica dentro de las insirucciones if de seleccin simple yun errr de sintasisenlasinsiruciones ££ de selecion dole. Tip para prevenit errores 3.1 ® bir las laves nly inal de msrucloes compues, nts de rab Tat nstrcconesndivauaes que van dentro de ells, ayia a evitar 1a nisin de una 0 aanbas Haves, a prevenir errores de sintaxis y a prevenir cervores de ligica (en donde se requieren ambos lave. Tal como wna instrccién compuesta puede colocarse en cualquier parte en donde puede colocarse wia instruc cid sencilla, tambien es posible no tener instruccion alguna, es decir ener una insiruocién vacta, La instrecién ‘acta se representa colocande un pusto ¥ coma () en donde por lo general va la instruocién Observacién de ingenieria de software 3.2 3.7 La instrucci6n de repeticién while Una instruccién de repeticién permite al programador especificar que una accién se va a repetir mientras una ccondicién sea verdadera. La instruccién en pseadocddigo While existan mds elementos en mi lista de cempras Compra el siguiente elemento y mércalo en mi lista describe la repeticién que ocurre durante un proceso de compras. La condicién “existan més elementos en mi lista de compras” puede ser falsa 0 verdadera. Si es verdadera, entonces se realiza la accién “Compra el siguiente elemento y marcalo en mi lista”. Esta accién se llevard a cabo de manera repetida mientras la condici6n sea verdadera, La(s)instruccién(es) contenida(s) dentro de la instruccién de repeticin while constituyen el cuerpo de la instruccién, El cuerpo de la instruccién while puede ser una sola instruccién o una instruccién compuesta, En algiin momento, la condicién seré falsa (cuando el timo elemento se compre y se marque en Ia lista). Eneste punto, termina la repeticin, y se ejecuta la siguiente instreccién en pseudocédigo después dela estruc- tua de repeticign. Error comin de programacién 3.3 (a io proporcionar na accin dentro del cuerpo de una istroccifn wie due pernia dus ta haa fla, Oo sionard que dicha estructura de repetcidn no termine nunca: a esto se leconoce como “cielo infinto Error comin de programacién 3.4 Eseribir la palabra reservada while con wna letra mayviscula, como en Wade (recuerde que C es un lenguaje sensible a mayisculas y minésculas}. Todas las palabras eservadas de C tales eomo while, 1£y elge conte then s6lo letras miniscuas. 58 Desarrollo de programas estructurades en C Capitulo 3 Como ejemplo de un while real, considere un segmento de programa disefiado para encontrar la prime- 1a potencia de 2 que sea mayor que 1000. Suponga que la variable entera producto s¢ inicializa en 2, Cuan- do finaliza la ejecucién de a siguiente instruccién de repeticidn while, producto contendré la respuesta deseada: producto while ( producto <= 1000 ) producto = 2 * producto; El diagrama de flujo de la figura 3.4 muestra de manera clara el flujo de control de la instruceién de repe- ticién whi Le, Una vez mis, observe que (ademas de los pequefios circulos y las flechas) el diagrama de flujo contiene solamente un rectdngulo y un rombo. EI diagrama de flujo muestra de manera clara la epeticién, La linea de flujo que surge del rectingulo se dirige hacia atrds; hacia Ia decisin que se evalia una y otra vez en el ciclo, hasta que la decisién se hace falsa. En este punto, se abandona la instruccién whi.1e y se pasa el con- twol a la siguiente instruccién del programa ‘Al entrar en Ia instruccién while por primera ve7, el valor de producto ¢s 2. La variable producto: se multiplica de manera repetida por 2, tomando los valores 4, 8, 16, 32, 64, 128, 256, 512 y 1024 de manera exitosa. Cuando producto toma el valor 1024, la condicién producto <= 1000 de la instruccién de sepe- ticién while se torna falsa. Esto termina la repeticién, y él valor final de producto es 1024. La ejecuciéa dl programa continda con la siguiemte instruccién después del whe. 3.8 Formulacién de algoritmos: Ejemplo practico 1 (repeticion controlada por contador) Para mostrar cémo se desarrollan los algoritmos, resolveremos distintas variantes del problema del promedio 4e calificaciones de una clase. Considere el siguiente enunciado del problema: Un grupo de diez estudiantes realizé un examen. Usted tiene su dsposiciOn las calificaciones (enteros en el ran ‘20 de 0a 100) de este examen, Determine el promedio de las calificaciones del grupo en este examen. E] promedio del grupo es igual a 1a suma de las calificaciones, dividida entre el nimero de estudiantes. El al- goritmo para resolver este problema en una computadora debe introducir cada una de las calificaciones, real zar el célculo del promedio e imprimir el resultado. Utilicemos pseudocédigo, listemos las acciones que vamos a llevar a cabo, y especifiquemos el orden en 1 que se deben ejecutar dichas acciones. Utilizamos el término repericién controlada por contador para intro- . | Sesaucte = a © producto San io Figura 3.4 Diograma de fujo de Io instruccion de repeticion while Captulo 3 Desarrollo de programas estructurados en 59 Establece total en cero Establece contador de calificaciones en uno While contador de calificaciones sea menor o igual que diez Introduce ta siguiente califieacion Summa la calificacién a toral Suma uno a contador de calificaciones Extablece el promedio del grupo dividide entre diez en total Imprime el promedio del grupo Figura 3.5 Algoriimo en pseudocédigo que ulilza una repeticiin controlada por contador para resolver @1 problema del promedio de califcaciones de un grupo. y* Pigura 3.6: fig03_08.¢ prograna para obtener el promedic de calificaciones de un grupo mediante una repeticién controlada, por contador */ 3. finclude 4 5 /* la funcién main inicia la ejecucién del prograna */ 6 int maint) 74 8 int contador; 1 norigro de 1a calificacién siguiente */ 9 int calificacion; /* valor de 1 calificacién */ 10 int total: (* guna de las calificaciones introducidas por el usuario */ 11 int promedio; J* promedic de las calificaciones */ 2 13 /* fase de inicializacion +/ 4 total /* iniciatiza total */ 18 contador s 1y /* inicializa el contador del ciclo */ 16 17 /* fase Ge procesemiento */ 18 while ( contador <= 10} { 1 repite 10 veces */ ” printf( "Introduzca 1a calificacion: * }; /* indicador para la entrada */ 20 scanfi "8d", scalificacion ); /* lee 1a calificacién del usuario */ 21 total = total + calificacion: /* suma la calificacién al total */ 2 contador = contador + 1; /* incrementa el contador */ 23+) /* fin de while */ 24 28 /* fase de terminacién */ 26 promedio = total / 10; /* divisién entera */ 2 28 print £{ "El promedio del grupo es 8d\n", promedio ); /* deapliega el resultado */ 2 30 return 0; /* indica que el programa terminé con éxito */ 31 32) /* fin de 1a funcién main */ Figura 3.6 Programa en C y elemplo de Ia ejecucién para el problema del promedio de Ia case mediante un contador controlade por repaticion.(Parte 1 de 2.) 60 Desarrollo de programas estructurades en C Capitulo 3 Introduzca 1a calificacion: 98 L Introduzea la cali ficacio: Introduzea la calificacion: Introduzca la calificacion: oduzca la caligicacion: 76 Tntrodueca la calificacion: Introduzea la calificacio: Introduzca 1a calificacion: Introduzca la califica ntroduzea la calisicacion: 34 El promedio del grupo es é1 Figura 3.6 Programa en Cy elemplo de Ic ejecucién para e! problema del promadio del grupo mediante una repeticién contiolade por contador. (Parte 2 de 2) Observe en el algoritmo, las referencias a un totaly a un contador. Un toral es una varigble que se utiliza para acumular la suma de una serie de valores. Un contador es una variable que se utiliza para conta, en este caso, para contas el nimero de calificaciones introducidas. Por Io general, las variables que se utilizan para al- rmacenar totales se deben inicializar en cero antes de emplearlas dentro del programa; de lo contraro, la suma incluiré el valor previo slmacenado en la direccién de memoria reservada para el total. Por lo general, las va- riables contadoras se iniializan en cero 0 uno, dependiendo de su uso (presentaremos ejemplos que muestran cada uno de estos usos). Una variable que no se inicializa comtiene valores “basura”; es decir, el sltimo valor almacenado en la ubjeacién de memoria reservada para dicha variable, __.. Error comin de programacién 3.5, (| Sno incalin un contador oun ttl probablonent Tor alias de programa srtnIncorectan. Eas tin ejemplo de wn errr de ligica Tip para prevenir errores 3.2 ® Inillice ls contadorery los tales Observe que el célculo del promedio dentro del programa produce un resultado igual a 81. En realidad, 1a ‘suma de las calificaciones en este ejemplo es igual a 817 el cua, al dividirse entre 10 debe arrojar 81.7, es de- cir, un mimero con un punto decimal. En Ta siguiente seccién veremos cémo manejar dichos tipos de niémeros. (lamados niimeros de punto flotante). 3.9 Formulacién de algoritmos mediante mejoramiento arriba-abajo, paso & paso: Ejemplo practico 2 (repeticién controlada por centinela) Generalicemos ¢1 problema del promedio del grupo. Considere el siguiente problema: Desarrolle un programs de promedios dle wr grupo que procese un mimera arbitrario de calificaciones cada vet ‘qe se ejecue el prograna. En el primer ejemplo del promedio del grupo, ya conocfamos previamente el nero de calificaciones (10). En este ejemplo, no se indica cudntos datos se van a insoducir. El programa debe procesar un mimero arbitrario de calificaciones, ;Cémo puede el programa determinar cusndo detener la introducci6n de los datos? ;C6mo saber cudindo caleular ¢ imprimir el promedio del grupo? ‘Una manera de resolver este problema es utilizar un valor especial Nemnado valor centinela (también co- nocido como valor de sefal, valor falso, o valor de bandera) para indicar el “finde la entrada de datos". El usuario introduce las calificaciones mientras sean valores legitimos. Entonces, el usuario introduce el valor cen: tinela para indicat que ya se introdujo el tltimo valor. A menudo, a la repeticién controlada por centinela se le ama repeticién fndefinida, debido a que no se conoce el niimero de repeticiones antes de que comience ls eje- ccucién del cielo, Capitulo 3 Desarrollo de programas estructurados en 61 De manera clara, se debe elegir un valor que no se confunda con un valor de entrada legitimo. Dado que ppor lo general las calificaciones de un examen son nimeros enteros no negativos, ~1 es un valor centinela ‘aceptable para este problema. Por lo tanto, la ejecucidn del programa del promedio del grupo puede procesar un flujo de entradas como 95, 96, 75, 74 y 89 y —1. Entonces, el programa calcularfa e imprimirfa el prome= dio del grupo con las calificaciones 95, 96, 75, 74 y 89 (—1 es el valor centinela, de manera que no debe en- tsar en el calculo del promedio). Error comin de programacién 3.6 ‘Elegir un valor centinela que también sea wn valor legitimo, Resolvimos el programa del promedio de Ia clase mediante una téenica llamada mejoramienta arriba-aba- ‘jo, paso a paso, una técnica que es esencial para desarrollar buenos programas estructurados, Comencemos con ‘una representacién en pseudocédigo de la cima: Determinar el promedio del grupo en un examen LL cima, ¢s una instrucci6n simple que describe la funcién general del programa, Como tal, es una representa ccién completa del programa. Desafortunadamente, la cima rara vez describe con suficiente detalle al problema ppara poder escribirlo en C. Ahora, comencemos el proceso de mejoramiento, Dividamos la cima en una serie de tareas mis pequeiias, las cuales mostraremos en el orden en el que requieren ejecutarse. Esto da como re- sullado el primer mejoramiento: Inicializa las variables Introduce suma, y cuenta tas calificaciones del examen Calcula ¢ imprime el! promedio del grupo Agu s6lo hemos utilizado Ta estructura secuencial; los pasos mostrados se ejecutan en orden, uno después del otro, Observacién de ingenieria de software 3.3 (Wee mejorar, camo la cia ism, es na expeocacton complete del lgorinos solamente varie vel de dette Para proseguir con el siguiente nivel de mejoramiento, es decir, el segundo mejoramiento, nos concentra- ‘mos en variables especfficas. Necesitamos el total de los ntimeros, la cuenta de cudntos mimeros se procesaron, tuna variable que reciba un valor para cada calificacién tal como se introduce y una variable que almacene el promedio calculado, La instruccién en pseudocddigo Inicializa tas variables ‘Se puede mejorar de Ia siguiente manera: Inicializa toral en cero Inicializa comtador en cero Observe que s6lo necesitamos inicializar total y contador; las variables promedio y calificacién (para el promedio calculado y para la entrada de usuario, respectivamente) no lo requieren debido a que sus valores se sobrescribirn mediante el proceso de lectura destructiva que explicamos en el capitulo 2, La instruceién en pseudocddigo Introduce, suma y cuenta las calificaciones del examen requiere de una estructura de repeticién (es decir, un ciclo) que introduzea de manera exitosa cada calificacién. Dado que no sabemos de antemano cudntas calificaciones van a procesarse, utilizaremos una repeticién contro- Jada por centinela, El usuario introducirs calificaciones legitimas, una a la vez. Después de introducir la htima calificacién legitima, el usuario introduciré el valor centinela. El programa evaluaré este valor después de que se introduzca cada calificacién y terminars el ciclo cuando se introduzca el valor centinela, Entonces, el mejo- ramiento de la instruccidn en pseudocddigo anteriores: 62 Desarrollo de programas estructurados en C Capitulo 3 Introduce ta primera calificacién While el usuario no introduzea el centinela Suma esta calificacién al total Suma uno al contador de calificaciones Introduce la siguiente calificacién (posiblemente el centinela) Observe que en pseudocédigo no necesitamos utilizar llaves alrededor de un conjunto de instrsciones que for rman el cuerpo de una instruccién while, Simplemente colocamos una sangria en toda las instruciones bajo while para indicar que pertenecen a while, De nuevo, e!pseudocddigo es solamente una herramienta parades srollar programas. La instruccién en pseudocddigo Catcula ¢ imprime el promedio del grupo se puede definir de la siguiente manera: ‘fel contador no es igual que cero Esrablece el promedio con el total dividido entre el contador Imprime el promedio else Inprime “No se introdujeron calificaciones” ‘Observe que estamos siendo cuidadosos al considerar la posibilidad de una divisién entre cero, un error fatal «gue si no se detecta podria ocasionar que el programa fallaa (a ste, a menudo se le llama “estallamiento" 0 “estellamiento"). En la figura 3.7 mostramos el segundo mejoramiento. ; Eror comin de programacién 3.7 Tntentar wna divisin entre cero ocasiona wh €rF fatal ‘Cuando realice dvisiones con expresiones cuyo denoriinador pueda ser cero, haga wna prucba explicita de exe caso y manéjela de manera apropiada dentro de su programa (tal como la impresin de un mensaje de error, en lugar de permitr que ocurra a error fatal sl Buena préctica de programacin 3.5 En las figuras 3.5 y 3.6, dentro del pseudocédigo incluimos algunas lineas en blanco para mayor claridad. En realidad, las ineas en blanco separan al programa en sus distintas fases, Inicializa total en cero Inicializa contador en cero Introduce ta primera ealifcacién While el usuario no introduzca el centinela Suma esta calificacién al toral Suma uno al contador de calificaciones Introduce ta siguiente calificacién (posiblemente el centinela) if el contador no es igual que cero Establece el promedio con el total dividido entre el contador Imprime el promedio else Imprime “No se introdujeron calificaciones” Figura 3.7 Algoritmo en pseudocécigo que utliza una repeticion controlada por centinele para resolver el problema dal promedio de un grupo. Capiuio 3 Desarrollo de programas estructurados en 63 Observacién de ingenieria de software 3.4 Muchos programas pueden diviirse de manera ldgica en tres fases: una fase de inicializacion que especifca el valor inicial de las variables del programa; na fase de procesamiento que iniraduce los valores de los dauos y ajusta las variables del programa de acuerdo con ello; y wna fase de terminacién que calcula e imprime los resul- tados finales. El algoritmo en pseudocédigo de la figura 3.7 resuelve el problema mas general del promedio de un gru po. Este algoritmo se desarrollé después de s6lo dos pasos de mejoramiento. Algunas veces se requieren mis niveles. Observacién de ingenietia de software 3.5 Elprogramador termina el proceso de mejoraniento arriba-abajo, paso a paso cuando el algoviono en pseudoc digo se especifica con el deallesufciente para que pueda convertir el pseudocddigo a C. Por lo general, ta im- plementacién del programa en C es directa En la figura 3.8 mostramos cl programa en C y una ejecucién de ejemplo. Aunque s6lo se introduzcan nii- -meros enter0s, es muy probable que el eélculo del promedio produzca un niimero con un punto decimal. El tipo ‘int no puede representar dicho nimero. El programa introduce el tipo de dato £1oat para manipular nimeros con puntos decimales (Ilamados nimeros de punto flotante),« introduce un operador especial llamado operador de conversién de tipo para manipular el céleulo del promedio. Explicaremos estas caracteristicas con detalle, después de presentar el programa. y* Figura 3.8: £ig03_08.¢ Programa para obtener el promedio de calificaciones de un grupo mediante una repeticién controlada por centinela */ Hinclude 3 4 § /* la funcién main inicia 1a ejecucién del programa */ $ int main() 7 ¢ 8 int contador: J* mimero de calificaciones introducidas */ 9 int calificacion; /* valor de 1a calificacién */ 0 int totals /* guna de las calificaciones */ u 12 Soak promeaio} | /* nlimero con punto decimal para el promedio */ 13 14 /* fase de inicializacién */ 18 total 0; /* inicializa el total */ 16 contadev = 0; /* inicializa el contador del ciclo */ "7 18 /* fase de procesamiento */ 19 /* obtiene la primera calificacién del usuario */ 2 —printé( “Introduzca la calificacion, -1 para terminar: * ); /* indicador para la entrada */ 21 scanf{ "td", &calificacion ); /* lee 1a calificacién del usuario */ 22 23 /* repite el ciclo mientras no se introduzca el valor centinela */ 24 while ( célificacion tes] ) { 25 total = total + calificacion; /* suma calificacién a total */ 26 contador = contador + 1; y* incrementa el contador */ 27 28 J+ obtiene 1a siguiente calificacién del usuario */ 29 printf( *Tatroduzca 1a calificacion, -1 para terminar? "V+ J+ indicador para 1a entrada */ 30 sean ("8d", goal ifieacion) : /* loo la siguiente calificacién */ a ) /* fin de while */ Figura 3.8 Programa en C y elecucion de ejemplo del problema corespondiente ol promedio dal grupo mediante una repeticién controlada por centinela, Parte 1 de 2)

You might also like