Sunteți pe pagina 1din 208

FACULTAD DE INGENIERA. DIVISIN DE INGENIERA ELCTRICA.

DEPARTAMENTO DE INGENIERA EN COMPUTACIN, UNIVERSIDAD NACIONAL AUTNOMA DE MXICO

Ingeniera y Ciencias de la Computacin Vol I


Introduccin novel a los fundamentos del software: un enfoque algortmico Programacin Estructurada con el lenguaje de programacin C
Hugo Rangel

Ingeniera y Ciencia de la Computacin

Hugo Rangel

INICIATIVA ACADMICA DEL LABORATORIO DE INGENIERA TELEMTICA

Pgina 2 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Universidad Nacional Autonoma de Mxico Facultad de Ingeniera

Ingeniera y Ciencias de la Computacin Vol I


Introduccin novel a los fundamentos del software: un enfoque algortmico Programacin Estructurada con el lenguaje de programacin C

Hugo Rangel

Pgina 3 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Divisin de Ingeniera Elctrica Departamento de Ingeniera en Computacin


INICIATIVA ACADMICA INGENIERA TELEMTICA DEL LABORATORIO DE

RANGEL GUTIRREZ, Raymundo Hugo, autor Ingenieros y Ciencias de la Computacin Vol. I Introduccin novel a los fundamentos del software: Un enfoque algoritmico. Mxico, Universidad Nacional Autnoma de Mxico Facultad de Ingeniera 2010, XXX pgs.

Ingeniera y Ciencias de la Computacin Vol I Introduccin Novel a los fundamentos del software: Un enfoque algortmico. Programacin Estructurada con el lenguaje de programacin C Prohibida la reproduccin y trasmisin total o parcial de esta obra de texto por cualquier medio o sistema electrnico o mecnico (incluyendo el fotocopiado, la grabacin o cualquier sistema de recuperacin y almacenamiento de informacin), sin consentimiento por escrito del editor. Derechos reservados 2010, Facultad de Ingeniera, Universidad Nacional Autnoma de Mxico Ciudad Universitaria, 04510, Mxico, D. F. ISBN XXXXXXXXX Primera edicin, diciembre 2010 Impreso y hecho en Mxico, D. F.

Pgina 4 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Dedicatoria
A Dios misericordioso, quien siempre me a abierto todas las puertas, y a mis siempre bien amados padres Mercedes y Jos, quienes dieron a sus hijos una buena educacin.

Portada
Por ser la ms fotognica de la familia, Pimienta tuvo el privilegio de aparecer en la portada del texto.

Agradecimientos
A la Universidad Nacional Autnoma de Mxico A la Facultad de Ingeniera Gracias cumplidas al Dr. Francisco Javier Ugalde, al Ingeniero Rolando Guervassi q.p.d. por el apoyo recibido. Gracias tambin a la Mtra. Mara Cuairn Ruidaz, Jefa de la Unidad de Apoyo Editorial de la Facultad de Ingeniera de la UNAM, por su apoyo para la revisin y registro de la presente obra de texto. Agradezco a Angelina Torres Rojas de la Unidad de Apoyo Editorial de la Facultad de Ingeniera, por su valiosa y dedicada revisin del estilo y observaciones del presente texto. Gracias cumplidas tambin a la Mtra. Lucila Patricia Mendoza Arellano y a la Mtra. Luciralia Hernndez Hernndez, colegiadas del Laboratorio de Telemtica, por la minuciosa revisin tcnica y juiciosa revisin pedaggica de la misma. A la Mtra Laura Sandoval Montao por su gran inters en revisar tcnica y pedaggicamente la obra y porque se publique.

Pgina 5 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Al PAPIME (proyecto PAPIME #PE100806) por su apoyo para que esta obra fuese una realidad. Raymundo Hugo Rangel Gutirrez Buzn e: orca@servidor.unam.mx rhgorg@fi-b.unam.mx Facultad de Ingeniera, UNAM Agosto del 2012

Pgina 6 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Prologo
El desarrollo de un libro de texto es una labor larga y pesada, es, sin embargo, tambin una actividad muy gratificante. Al modelar el contenido de una asignatura, as como el contenido del texto correspondiente, para un lenguaje de programacin especifico, deben tenerse en cuenta los siguientes tres aspectos esenciales: 1. El paradigma, es decir, el modelo de programacin que se adopta para el curso, en nuestro caso se trata de la Programacin Estructurada (PE). 2. El lenguaje de eleccin que intenta capturar en su sintaxis al paradigma, en otras palabras, el lenguaje de eleccin es afn al paradigma. En nuestro caso se trata del lenguaje de programacin C. y 3. La didctica asociada tanto al paradigma como a el lenguaje de eleccin. Hoy da se reconoce poco la necesidad de una didctica especifica en la enseanza de los lenguajes de programacin. Es de importancia capital tomar en cuenta estos tres aspectos en la modelacin del contenido de una asignatura en la que los alumnos de una carrera como la de Ingeniero en Computacin se inician en la programacin y de la obra de texto correspondiente que le da soporte a la misma.

Los motivos
La presente obra de texto, para la asignatura de Computacin para Ingenieros, tiene su origen en las experiencias del autor en el aula, pero totalmente compatibles con los requerimientos de la asignatura mencionada. No es un texto ms en la enseanza del lenguaje de programacin C. Mi larga experiencia en la enseanza de los lenguajes de programacin se refleja a lo largo y ancho del contenido del texto, en particular en los tpicos de rboles sistmicos (rboles s por brevedad) y de la notacin Mx, aportaciones propias que se originan en el contexto de una metodologa de enseanza aprendizaje denominada programtica educacional o didctica de los sistemas de software. Este proceso metodolgico concibe al docente como un diseador de entornos de enseanza que facilita el aprendizaje de uno o ms tpicos.
Pgina 7 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Las metas
Se ha escrito esta obra con las siguientes metas en mente: Elevar el nivel del juego (lenguaje C) El diseo de programas es una disciplina que exige la aplicacin, con rigor, de un conjunto de reglas que gobiernan la secuencia de un comportamiento determinado en los programadores. Un juego impone ciertas condiciones a los jugadores, y representa una prueba de las habilidades intelectuales (y/o fsicas como en el ftbol soccer) individuales o de conjunto de estos al resolver un problema y alcanzar con ello un objetivo determinado. Si el jugador viola una de las reglas comete una falta y es sancionado. Considrese el ftbol soccer, los jugadores del equipo A ponen en juego todas sus habilidades fsicas e intelectuales, individuales y de conjunto, para colocar un gol en la portera del equipo B y al mismo tiempo evitar que este les coloque uno en su portera. En un juego del ajedrez ambos oponentes tambin ponen en juego todas sus habilidades intelectuales para darle jaque mate al rey de su oponente. En ambos juegos el objetivo de los jugadores es demostrar habilidades superiores. Desde hace muchos aos, en los cursos de programacin, no tiene sentido ensear solo la sintaxis del lenguaje de programacin de eleccin. Hoy da los compiladores contienen una vastedad de recursos para ayudarle al aprendiente a resolver los problemas de sintaxis. Por lo que la perspectiva actual en la enseanza de un lenguaje de programacin es el diseo de programas (sistemas de software). El nivel del juego se ha incrementado. Jugar (programar) con agilidad y menos errores Conforme se juega con mayor agilidad incremento del nivel de aprendizaje - mayor es el dominio que se tiene de la complejidad del juego. En un juego de video el objetivo es dominar, con maestra, todos los niveles del mismo, desde el primer nivel de principiante hasta el ms avanzado. Las expectativas de cualquier juego siempre deben ser altas, en concecuencia se espera que el desempeo de los jugadores sea alto tambin. Un juego es una abstraccin mental que vive su propia realidad cuando se bien. Los jugadores, y aun los espectadores, se apropian del mismo y lo utilizan como un medio para expresarse a si mismos con un gran sentido de realizacin. Si, por el contrario, el juego el desempeo de los jugadores - es mediocre, lo vivido de su propia realidad sufre un gran menoscabo y el sentido de realizacin se pierde irremediablemente. Facilitar el dominio de los niveles superiores del juego (programacin orientada a objetos (POO) con el lenguaje C++) Las dos primeras ,metas ayudan a preparar el terreno para facilitar el dominio (aprendizaje) del juego de sus niveles superiores (programacin

Pgina 8 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

orientada a objetos con el lenguaje C++). Un buen dominio de todos los niveles de un juego es la fuente de una gran satisfaccin as como de un gran sentido de realizacin. Estos son parte de una necesidad - muy humana de expresarse a si mismo y de trascender en la vida.

Metas adicionales
Un texto que refleje los requerimientos esenciales para un primer curso de programacin con el lenguaje C. Especficamente que sea el libro de texto de las materias de la asignatura de Computacin para Ingenieros de la carrera de Ingeniera en Computacin de la Facultad de Ingeniera, UNAM, (proyecto PAPIME #PE100806 del Laboratorio de Ingeniera Telemtica, departamento de Ingeniera en Computacin). Enfocar el texto en una introduccin novel a la ingeniera y ciencias en computacin El eje temtico es el diseo e implementacin (desarrollo) de algoritmos para la solucin de problemas. Enfatizando la estrategia de divide y vencers. Estrategia de uso muy comn en todo diseo e implantacin de un algoritmo. Que el texto pueda usarse como un manual de referencia de prcticas de ingeniera de sistemas de software de uso cotidiano tanto para estudiantes como profesionistas activos en el campo. Que el texto refleje mi experiencia de aos en la enseanza de la programacin. Espero que esa experiencia de aos sea de gran utilidad a los estudiantes de las carreras de Ingeniero en Computacin y otras afines. Tambin espero contribuya a actualizar y completar la formacin de profesionistas en activo en el campo de la ingeniera de la computacin o de la informtica u otras afines. La elaboracin de un libro de texto debe estar al menos basado en la experie3ncia del autor en el aula.

El lenguaje de programacin C
El lenguaje C es el lenguaje que principalmente se elige para el desarrollo de software eficiente y transportable, por lo que es el lenguaje de ms uso y ms recomendado en los planes de estudio de las universidades y de otras instituciones de nivel superior. C pertenece a la categora de lenguajes estructurados, es decir, un lenguaje con el que se puede hacer programacin estructurada, un paradigma ya consolidado. Este paradigma enfatiza confiabilidad, estructura, modificabilidad, simplicidad y facilidad de uso. La intencin con el paradigma es desarrollar programas que se codifiquen con mayor agilidad, libres de errores (en su mayor parte al

Pgina 9 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

menos) y lo que es ms importante que sean legibles (facilidad de lectura). El desarrollo de sistemas de software demanda del programador un excelente juicio de discernimiento, as como la de prestar gran atencin a los detalles y de mucha autodisciplina. El lenguaje C se desarroll en los Laboratorios Bell de la At&T alrededor de 1972 por Dennis Ritchie. Los lenguajes ideados por una sola persona a menudo reflejan el campo de inters del autor, en este caso software de sistemas, es decir, lenguajes de programacin, sistemas operativos, generadores de programas, software de aplicaciones y otros. Aunque C puede ser usado para cualquier aplicacin como cualquier otro lenguaje, en realidad no es un lenguaje de eleccin para toda aplicacin. El lenguaje C utilizado en esta obra es compatible con la versin estndar del American National Standards Institute (ANSI). Los programas en lenguaje C ANSI, que usan funciones de biblioteca, se pueden compilar y correr sin cambios en MS-DOS, UNIX, Windows, OS/2, Linux y en muchos otros entornos. A lo largo de la obra el alumno usar C ANSI y esperamos adquiera la disciplina necesaria y suficiente para obtener una experiencia extensa y profunda al codificar y ejecutar programas con el lenguaje C. Por lo que es mi ms ferviente deseo de que el texto que tienes ahora en tus manos tenga como caracterstica principal el de comunicar e instruir.. El autor espera detectar cualquier deficiencia de la obra con la ayuda de los profesores y alumnos que lo utilicen como texto en los diversos ambientes de clase. Por lo que dar la bienvenida a cualquier sugerencia de profesores y alumnos y otros lectores de la obra que contribuyan a mejorarla.

Organizacin del libro


El texto esta organizado en tres partes; la parte A, la parte B y la parte C. La parte A cubre solucin de problemas, algoritmos, el lenguaje C y programacin estructurada. El captulo 1 introduce a la nociones de solucin de problemas y de algortmica. El captulo 2 trata con funciones de entrada y salida de datos de tipo carcter, cadenas, enteros y reales en el lenguaje C. Estos programas solo incluyen a la categora de figuras de secuencia. Se ilustra ampliamente con programas completos simples El captulo 3 cubre la categora de figuras de iteracin, se incluyen ejemplos simples completos en el lenguaje C, para ilustrar la naturaleza cclica de cada una de ellas y sus variantes correspondientes. Previo a las figuras iterativas se introduce el concepto de arreglo, operadores y expresiones de relacin, operadores de pre y post autoincremento, los operadores de pre y

Pgina 10 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

post autodecremento y la notacin corta para ciertas expresiones aritmticas de uso comn. Se ilustran vectores y matrices de los enunciados modelara, codificara y correr programas que incluyen algoritmos que utilizan El captulo 4 cubre la estrategia de divide y vencers (D&V) y su instrumento esencial: el rbol S(istmico) as como su mapeo en la categora de figuras de decisin. La estrategia de D&V habilita al alumno con una mayor capacidad de abstraccin en la solucin de problemas que incluyan decisiones. Las competencias habilidades - que el alumno adquirir son las de modelar, codificar y correr programas que incluyan algoritmos que utilizan la categora de figuras de decisin, de acuerdo a los requerimientos establecidos resultados - en cada caso por el docente. El captulo 5 cubre la programacin modular, es decir una programacin basada en funciones. Esta programacin consiste en disear e implementar un programa en una funcin (modulo) principal y una o ms funciones de apoyo o soporte. Esta es tambin una estrategia de D&V La capacidad de abstraccin del alumno - en la solucin de problemas se potencia. Las competencias habilidades - que el alumno adquirir son las de modelar, codificar y correr programas que incluyan algoritmos modularizados (con funciones), de acuerdo a los requerimientos establecidos resultados - en cada caso por el docente. El captulo 6 cubre el paradigma de la programacin estructurada y sus conceptos asociados: seudocdigo (Lenguaje de Diseo de Programas LDP), las categoras de las figuras de control, el proceso de refinamiento a pasos (una estrategia de D&V), niveles de abstraccin, mdulos e interfaces. Las competencias habilidades - que el alumno adquirir son las de modelar (usando el proceso de refinamiento a pasos), codificar y correr programas de acuerdo a los requerimientos establecidos resultados - en cada caso por el docente. El captulo 7 cubre los tipos de variables predefinidos: La estructura y la unin. El alumno modelara, codificara y correr programas que incluyen los tipos de variables predefinidos: La enumeracin, la unidad y la estructura El captulo 8 cubre el tipo de variable predefinido: La enumeracin.. El alumno modelara, codificara y correr programas que incluya el tipo de variable predefinido: La enumeracin. El captulo 9 cubre las tres organizaciones bsicas de archivos; secuencial, directa e indexada. El alumno explicara los conceptos asociados con la solucin de problemas y la algortmica. La parte B cubre una serie de tpicos que tradicionalmente se han considerado de gran dificultad en su aprendizaje o avanzados. Los captulos
Pgina 11 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

del 12 al 17 estn en el primer caso; la combinacin de apuntadores con otras estructuras de datos en el lenguaje C. La notacin Mx resuelve esta problemtica (dominio de problema), un MODOS especficamente diseado para este fin. El contenido del captulo 18 tradicionalmente se han considerado de bajo nivel, debido a que sus funciones son iguales a las de algunas instrucciones del lenguaje ensamblador, por lo que rara vez se incluyen en un primer curso de lenguaje C. El contenido del capitulo 19 es tambin un tpico que rara vez se incluye en un primer curso de lenguaje C, sin embargo, se incluye porque sirve como un antecedente introductorio a la asignatura de verificacin y validacin del software, del mdulo de ingeniera del software de la carrera de Ingeniero en Computacin. La verificacin y validacin del software, es un tpico que, en sinergia con la lgica computacional, crecen aceleradamente en la actualidad. Captulo 10 Trata los conceptos de identificadores estticos y dinmicos, sealamiento directo e indirecto. El concepto de apuntador a variables simples: enteros, flotantes, caracteres y otros. Capitulo 11 Cubre la relacin conceptual entre un apuntador constante y el nombre de los arreglos, apuntadores que sealan a un arreglo, arreglos de apuntadores e identificadores en los que intervienen apuntadores, arreglos y variables simples. Capitulo 12 Cubre la relacin conceptual entre un apuntador constante y el nombre de las funciones, apuntadores a funciones, funciones que devuelven apuntadores e identificadores en los que intervienen apuntadores, arreglos, funciones y variables simples. Captulo 13 Cubre la diferencia conceptual entre la notacin de flecha y la notacin de punto, apuntadores a estructuras e identificadores en los que intervienen apuntadores, arreglos, funciones y variables simples. Captulo 14 Cubre el concepto de referencia en el lenguaje C, la diferencia entre un apuntador y una referencia.

Agradecimientos
Esta obra de texto no habra sido escrita sin el apoyo de tantas personas a quienes deseo expresar mi ms profunda gratitud. A las maestras Lucila Patricia Arrellano Mendoza y a Luciralia Hernndez Hernndez, colegiadas del Laboratorio de Telemtica, por la minuciosa revisin tcnica y observaciones. A Mara Cuairn, jefa de la Unidad de Apoyo Editorial de la Facultad de Ingeniera, por proporcionar el soporte necesario, a Angelina Torres Rojas, tambin de la Unidad de Apoyo Editorial, por su colaboracin en la adecuacin pedaggica y su dedicada revisin de estilo. Al Ing. Rolando Gervassi (finado) y al Dr. Francisco Javier Garca Ugalde, Jefe de la

Pgina 12 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Divisin de Ingeniera Elctrica, por el apoyo que brindaron ante el PAPIME. Agradezco tambin al PAPIME su apoyo para la realizacin de esta obra de texto (proyecto PAPIME #PE100806 del Laboratorio de Ingeniera Telemtica, departamento de Ingeniera en Computacin). A l(a)os profesor(a)es que imparten la asignatura de Computacin para Ingenieros y adopten esta obra de texto, como el texto principal del curso. Hugo Rangel, agosto del 2012 Cd. Universitaria, Mxico, D. F.

Pgina 13 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Contenido
Parte A Solucin de Problemas, Algoritmos y Programacin Estructurada

El alumno explicara los conceptos asociados con la solucin de problemas, la algortmica, .el lenguaje de eleccin y los paradigmas 1.- Solucin de Problemas, Algoritmos, el Lenguaje de Eleccin y los Paradigmas de Software 1.1- Introduccin 1.2- Solucin de Problemas 1.2.1- Problemas de Anlisis 1.2.2- Problemas de Sntesis 1.2.3-Identificacin del dominio del problema 1.3- Algoritmos 1.3.1- La estrategia de divide y vencers en el diseo de algoritmos 1.3.2- El principio de separacin de niveles de inters 1.4- El Lenguaje de eleccin 1.4.1- Los conceptos de modelos y sistemas 1.4.2- El lenguaje de programacin de eleccin 1.4.3- La practica de la programacin 1.5- Los paradigmas de software 1.5.1- La programacin Estructurada (PE) 1.5.2- La Programacin Orientada a Objetos 1.4- Resumen 1.5- Conceptos clave 1.6- Ejercicios El alumno modelara, codificara y correr programas que incluyen funciones de entrada y salida de datos de tipo carcter, cadenas, enteros, reales en el lenguaje C. Estos programas solo incluyen a la categora de figuras de secuencia. 2- Elementos del Lenguaje de Programacin C 2.1- Introduccin 2.2- La estructura de un programa en lenguaje C 2.1.1- Exhibicin de una cadena de caracteres
Pgina 14 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

2.1.2- Cadenas muy largas 2.1.3- Uso de varias salidas con la funcin puts() 2.2- Identificadores variables y constantes 2.2.1- El identificador variable de tipo carcter (char) 2.2.2- Diferencias entre el carcter A y la cadena con el carcter A 2.2.3- Lectura de una cadena de caracteres con la funcin gets() 2.2.4- Las funciones de lectura para un carcter 2.2.5- Exhibicin de una cadena con la funcin printf() 2.2.6- Cambio de lnea con la funcin printf() 2.2.7- El formato s (string) para cadenas 2.3- Exhibicin de datos con la funcin printf() 2.4- Lectura de datos con la funcin scanf() El alumno modelara, codificara y correr programas que incluyen algoritmos que utilizan la categora de figuras de iteracin. 3.- Arreglos y la Categora de Figuras de Iteracin 3.1- Introduccin 3.2- Arreglos 3.2.1- Arreglos unidimensionales 3.2.2- Arreglos multidimensionales 3.2.3- Operadores de relacin 3.2.4- Los operadores de pre y post autoincremento 3.2.5- Los operadores de pre y post autodecremento 3.2.6- Notacin corta 3.3.- Ciclos 3.3.1- La instruccin for y sus variantes 3.3.2- La instruccin while y sus variantes 3.3.3- La instruccin while-do y sus variantes 3.4- Diseo de programas con ciclos 3.5- Resumen 3.6- Conceptos clave 3.7- Ejercicios El alumno modelara, codificara y correr diversos programas que incluyen algoritmos que utilizan la categora de figuras de decisin. 4.- Operadores de relacin, lgicos y la Categora de Figuras de Decisin 4.1- Introduccin 4.2- Los operadores lgicos bsicos 4.2.1- Introduccin 4.2.2- La tabla de verdad para el operador lgico OR 4.2.3- La tabla de verdad para el operador lgico AND 4.2.4- La tabla de verdad para el operador lgico NOT 4.3- Diagramas de flujo y el enunciado if-else 4.3.1- Introduccin

Pgina 15 de 208

Ingeniera y Ciencia de la Computacin 4.3.2- Diagramas de flujo 4.3.3- El enunciado if-else 4.4-- Diseo de decisiones con rboles sistmicos, parte I 4.4.1- Introduccin 4.4.2- El rbol bsico 4.4.3- Ejemplos 4.5- Diseo de decisiones con rboles sistmicos, parte II 4.5.1- Introduccin 4.5.2- Ejemplos 4.6- Diseo de decisiones con rboles sistmicos, parte III 4.6.1- Introduccin 4.6.2- Reglas 1 y 2 4.6.3- El proceso cosecuencial 4.7- Diseo de decisiones con rboles sistmicos, parte IV 4.7.1- Introduccin 4.7.2- Los enunciados switch y break 4.7.3- El enunciado continue 4.8- Resumen 4.9- Conceptos clave 4.10- Ejercicios

Hugo Rangel

El alumno modelara, codificara y correr programas modulares basados en las funciones del lenguaje C. 5.- Funciones 5.1.- Introduccin 5.2.- Estructura de una funcin 5.2.1.- El alcance de una funcin 5.2.2.- Identificadores locales y globales 5.3.- Funciones con tipo 5.3.1.- Funciones de tipo entero con o sin argumentos 5.3.2.- Funciones de otros tipos 5.3.3.- Funciones en expresiones 5.4.- Funciones sin tipo (void) 5.4.1.- Funciones con o sin argumentos 5.5.- Argumentos por valor y por direccin 5.6.- Funciones en lnea 5.6.1.- Argumentos por omisin 5.6.2.- Argumentos por omisin mltiple 5.7.- Argumentos de main() 5.8.- Diseo de programas con mdulos (programacin modular) 5.9.- Resumen 5.10- Conceptos clave 5.11.- Ejercicios El alumno explicara los conceptos de refinamiento a pasos, niveles de abstraccin, mdulos, interfaces y seudocdigo.
Pgina 16 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

6.- La Programacin Estructurada y el Lenguaje de Programacin C 6.1.- Introduccin 6.2.- La programacin estructurada 6.2.1.- El paradigma de la programacin estructurada 6.2.2.- Falacias de la programacin estructurada 6.3.- El proceso de refinamiento a pasos 8.3.1- Abstraccin y Espaol estructurado o seudocdigo 6.3.2- Un ejemplo de formulacin de un problema (saber reconocer el dominio inquisitivo o del problema). 6.4.- Resumen 6.5.- Conceptos clave 6.6.- Ejercicios El alumno modelara, codificara y correr programas que incluyen los tipos de variables predefinidos: La unin y la estructura. 7.- Los tipos de variables predefinidas: La unin y la estructura 7.1.- Introduccin 7.2.- La unin 7.2.1.- Representacin fsica (memoria) y lgica (visual) de la unin 7.2.2.- La declaracin de variables de tipo unin 7.3.- La estructura 7.3.1.- Representacin fsica (memoria) y lgica (visual) de una estructura 7.3.2.- La estructura como un tipo de variable y la declaracin de variables de tipo estructura 7.3.3.- Estructuras anidadas 7.3.4.- Arreglos de estructuras y estructuras con arreglos 7.3.5.- Estructuras como argumentos en funciones 7.4.- Resumen 7.5.- Conceptos clave 7.6.- Ejercicios El alumno modelara, codificara y correr programas que incluyen los tipos de variables predefinidos: La enumeracin 8.- El tipo de variable predefinido: La enumeracin 8.1.- Introduccin 8.2.- Las enumeraciones 8.3.- Resumen 8.4.- Conceptos clave 8.5.- Ejercicios El alumno modelara, codificara y correr programas que incluyan las tres organizaciones bsicas de archivos; secuencial, directa e indexada

Pgina 17 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

9.- Archivos 9.1.- Introduccin 9.2.- Representacin fsica (disco) y lgica (visual) del archivo secuencial 9.3.- Representacin fsica (disco) y lgica (visual) del archivo directo 9.4.- Representacin fsica (disco y memoria) y lgica del archivo indexado secuencial 9.5.- Instrucciones para abrir y cerrar archivos: fopen() y fclose() 9.6.- Instrucciones para leer de y escribir a disco caracteres: getc() y putc() 9.7.- Instrucciones para leer de y escribir a disco cadenas: fgets() y fputs() 9.8.- Instrucciones para leer de y escribir a disco: fprintf() y fscanf() 9.9.- Instrucciones para leer de y escribir a disco palabras: getw() y putw() 9.10.- Instrucciones para fin de y error en un archivo: feof() y ferror() 9.11.- Instruccin para bsqueda directa: fseek() 9.12.- Instrucciones para leer de y escribir a disco: fread() y fwrite() 9.13.- Resumen 9.14.- Conceptos clave 9.14.- Ejercicios Parte B Programacin Avanzada con C

El alumno explicara los conceptos de identificadores estticos, dinmicos, sealamiento directo, indirecto. El concepto de apuntador a variables simples. Usara estos conceptos en sus programas. 10.- El Apuntador a Variables Simples 10.1.- Introduccin 10.2.- Representacin fsica (memoria) y lgica (visual) de una referencia 12.2.1.- La referencia y su diferenciacin con un apuntador 12.2.2.- El propsito de las referencias en el lenguaje C 12.2.3.- Referencias de un carcter, un entero, un flotante y de un apuntador 10.3.- Representacin fsica (memoria) y lgica (visual) del apuntador 12.3.1.- El concepto de una variable esttica y de una dinmica 12.3.2.- El apuntador a un carcter 12.3.3.- El apuntador a un entero 12.3.4.- El apuntador a un flotante 12.3.5.- El apuntador a otro apuntador 10.4.- Resumen 10.5.- Conceptos clave 10.6.- Ejercicios El alumno explicara la relacin entre un apuntador constante y el nombre de los arreglos. Usara apuntadores a arreglos, arreglos de apuntadores y usara identificadores en los que intervienen apuntadores, arreglos y otros en sus programas.

Pgina 18 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

11.- Arreglos y apuntadores 11.1- Introduccin 11.2.- Representacin fsica (memoria) y lgica (visual) del arreglo 11.2.1.- El nombre de un arreglo como un apuntador constante 11.2.2.- El identificador apuntador a un arreglo 11.2.3.- Identificadores en los que intervienen apuntadores y arreglos 11.3.- Resumen 11.4.- Conceptos clave 11.5.- Ejercicios El alumno explicara la relacin entre un apuntador constante y el nombre de las funciones. Usara apuntadores a funciones, funciones que devuelven apuntadores y usara identificadores en los que intervienen apuntadores, arreglos, funciones y otros en sus programas. 12.- Funciones y apuntadores 12.1- Introduccin 12.2.- Representacin fsica (memoria) y lgica (visual) de la funcin 12.2.1.- El nombre de una funcin como un apuntador constante 12.2.2.- El identificador apuntador a una funcin 12.2.3.- Identificadores en los que intervienen apuntadores, arreglos y funciones 12.3.- Resumen 12.4.- Conceptos clave 12.5.- Ejercicios El alumno explicara la diferencia entre la notacin de flecha y la notacin de punto. Usara apuntadores a estructuras e identificadores en los que intervienen apuntadores, arreglos, funciones y estructuras en sus programas. 13.- Estructuras y apuntadores 13.1.- Introduccin 13.2.- Representacin fsica (memoria) y lgica (visual) de la estructura 13.2.1.- Apuntadores y estructuras 13.2.2.- Identificadores en los que intervienen apuntadores y estructuras 13.2.3.- Identificadores en los que intervienen apuntadores, estructuras, arreglos y funciones 13.3.- Resumen 13.4.- Conceptos clave 13.5.- Ejercicios El alumno explicara el concepto de referencia en el lenguaje C. Explicara tambin la diferencia entre un apuntador y una referencia. Usara estos conceptos en sus programas. 14.- Referencias y apuntadores
Pgina 19 de 208

Ingeniera y Ciencia de la Computacin 14.1.- Introduccin 14.2.- El propsito de las referencias en el lenguaje C 14.3.- Referencias 14.4.- Excepciones en el uso de referencias 14.5.- Resumen 14.6.- Ejercicios

Hugo Rangel

Pgina 20 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 21 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Captulo 1

Solucin de Problemas y Algoritmos

Pgina 22 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 23 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Introduccin
Las computadoras, dispositivos electrnicos programables universalmente, nacen como una necesidad para resolver problemas que son difciles de tratar manualmente, es decir, que procesan grandes volmenes de datos a gran velocidad. En algunos casos tenemos como entrada y salida grandes volmenes de datos con poco proceso, o a la inversa, poco volumen de entrada y salida de datos y un tiempo considerable de proceso, o bien, una combinacin de ambos casos. Son ejemplos de dispositivos de entrada de datos, el teclado, el ratn, el scanner y son ejemplos de dispositivos de salida el monitor de pantalla y la impresora. A fin de hacer uso de una computadora primero es necesario describir lo que se quiere mediante un enunciado (mnimo de detalles), luego se procede a obtener un alto grado de detalles mediante una serie de abstracciones. El resultado es un programa. El cual se codifica empleando la sintaxis del lenguaje de programacin de eleccin. Existen diversos lenguajes de programacin con un propsito bien definido de aplicacin. La eleccin del lenguaje de programacin es critico ya que esto permite una codificacin ms limpia y fcil si es el adecuado, es decir, si fue desarrollado para la categora de problemas a resolver que tenemos a la mano. Un programa un procedimiento o conjunto de procedimientos - es un modelo que plantea la solucin de un problema, cuando este corre en una computadora A, tenemos un sistema A que resuelve el problema en cuestin, cuando corre en una computadora B, una computadora con otras caractersticas, se dice que tenemos un sistema B que resuelve el problema, en general, no necesariamente obtenemos los mismos resultados con el sistema A y el sistema B, aunque estos deben estar muy prximos uno del otro.

Solucin de Problemas
La obtencin de la solucin de un problema consiste en un proceso de desarrollo de un procedimiento o un conjunto de procedimientos - seguido de uno de aplicacin. En el primer proceso se desarrolla un programa que plantea la solucin del problema, en el segundo se aplica el programa sobre un conjunto de datos. Este conjunto puede ser suministrado por el programador, quien desarrolla el programa, o bien es generado por el procedimiento mismo. Por ejemplo, el enunciado

Pgina 24 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Desarrolle un procedimiento que exhiba los primeros 500 nmeros impares, comenzando con 1. Si utilizamos la expresin algebraica 2*n + 1 y sustituimos en la n el conjunto de valores 0, 1, 2, ..., 499, uno a uno, obtenemos el resultado deseado. Sin embargo, realizar esto a mano es impractico, por lo que recurrimos a un compilador instalado en una computadora. Supongamos que el compilador dispone de las siguientes dos enunciados: Primer enunciado Desde <primer expresin aritmtica> hasta <segunda expresin aritmtica> Enunciado(s) Segundo enunciado Exhibe(una leyenda o un valor) Donde la primera instruccin es un enunciado que expresa, de acuerdo a la primera y la segunda expresin aritmtica, el nmero de veces que se realiza(n) la(s) instruccin(es) con diferentes valores, en nuestro caso 0, 1, ..., 499. La segunda instruccin es un enunciado que expresa la exhibicin, en la pantalla del monitor, de una leyenda o un valor. Con estas dos instrucciones podemos construir un procedimiento computacional bien definido que toma un valor o un conjunto de valores (en nuestro caso dos: 0 y 499) y produce uno o un conjunto de valores como salida, en nuestro caso la secuencia de valores {1, 3, 5, ... , 499} lo que resuelve el problema en cuestin como sigue: Desde n = 0, hasta 499 Exhibe (2*n + 1) Esto funciona como sigue: desde n = 0 tenemos 2*0 + 1 = 1 n = 1 tenemos 2*1 + 1 = 3 n = 2 tenemos 2*2 + 1 = 5 ***** hasta n = 499 tenemos 2*499 + 1 = 999 Podemos distinguir dos categoras bsicas de problemas: de sntesis y de anlisis. +++++++++++++++++++++ Categoras en la solucin de problemas ++++++++++

Pgina 25 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

El de sntesis consiste de un enunciado de un estado inicial y una meta deseada en la que el principal esfuerzo es la seleccin de un proceso de solucin a la meta explicita deseada, pero para al que el proceso como un todo (es decir, el patrn completo de la solucin) es nuevo para nosotros, aunque los pasos individuales no lo son. En tal caso, verificamos la aceptabilidad de la solucin al tratar con diversos procesos para una solucin y eleminemos progresivamente (reduciendo a cero) el ajuste entre la meta deseada y los resultados obtenidos del proceso de ensayo. Este clase de problemas podemos considerarla como un problema de diseo o de sntesis en el que un proceso de solucin completo se sintetiza a partir de pasos ms pequeos. En el de anlisis se enfoca ms en la aplicacin de procesos de transformacin conocidos para llegar a una meta. La meta puede que no sea reconocida como la meta correcta de inmediato, pero puede verificarse por el proceso de tal manera que no exista un ajuste entre las condiciones del problema (estado inicial) y la solucin. Esta clase de problemas puede ser considerada como un problema de anlisis en el que la solucin de una transformacin o cambio en la representacin de la informacin dada para hacer transparente lo oscuro o lo oculto.

Algoritmos y la estratega de divide y vencers


Podemos decir de manera informal, que un procedimiento computacional bien definido, que sigue un nmero finito de pasos bien definidos, que toma uno o ms valores, como entrada, y produce uno o ms valores como salida, tambin se le conoce como un algoritmo. Una estrategia siempre presente en la solucin de problemas y el diseo de algoritmos es la de divide y vencers. Uno puede visualizarla como una estructura de rbol. Podemos imaginar en la raz del rbol el enunciado o planteamiento del problema original y en las subsecuentes ramas problemas ms pequeos derivados al dividir el problema original. Cada uno de estos ltimos a su vez se dividen en problemas ms pequeos. Este proceso continua tanto como sea posible. Si los subproblemas involucrados son procesos a ser ejecutados en paralelo, entonces el problema se resuelve de abajo hacia arriba combinando los resultados obtenidos hasta llegar a la raz. Si este no es el caso, es decir, entonces los nodos contienen expresiones lgicas basadas en comparaciones que utilizan los operadores de relacin y/o lgicos, en consecuencia es la estructura en rbol misma la solucin al problema, ya que esta estructura puede mapearse directamente a condicionales anidados de acuerdo a la sintaxis del lenguaje de eleccin. En trminos generales una estructura de rbol es una herramienta con la propiedad intrnsica de divide y vencers, sin embargo, no todos los rboles pertenecen a una misma categora, en otras palabras, existen diversas categoras de rboles que resuelven diferentes categoras de dominios de problemas y por consiguiente se manipulan con reglas propias cada una de esta categoras.

Pgina 26 de 208

Ingeniera y Ciencia de la Computacin Para comprender mejor esto veamos el siguiente ejemplo:

Hugo Rangel

El Arreglo X se divide en dos arreglos, A y B. Ntese la estructura en rbol donde en cada nodo, al mismo nivel, se realiza un proceso de ordenamiento en paralelo. El propsito de esta estrategia es la de ganar velocidad de proceso. El paso siguiente consiste en intercalar los dos arreglos resultantes, A y B, en uno.

18

10

11

12

15

Ai < Bj

Ai = Bj

Ai > Bj

Xk = Ai

Xk = Ai Xk =Bj

Xk = Bj

10

11

12

15

18

23

El rbol (lneas punteadas) que aparece inscrito en el rectngulo de esquinas redondeadas ya no es un rbol para procesos en paralelo, sino un algoritmo que intercala el o los valores que proceden de los arreglos A y B en el arreglo de abajo. La lnea gruesa es el ciclo que repite una y otra vez la estructura de rbol (algoritmo) bajo su alcance hasta agotar los arreglos.

Una herramienta que hace uso intrnsicamente de esta estrategia es el rbol sistmico, sus diferentes niveles se corresponden con los subproblemas de un problema mayor, es decir, es una herramienta que nos permite dividir un problema complejo en otros de menor complejidad. El problema se plantea como un rbol bsico, uno que solo involucra a los operadores de relacin <, = y >. El rbol puede comprimirse verticalmente (mediante el operador lgico AND) y

Arreglo B

23

Pgina 27 de 208

23 11

15 15 11

12 10 15

11 23 10

10 12 23 12 Arreglo X 7

18 7 2

7 2 4

18

6 4

18 6

Arreglo A

2 6

Ingeniera y Ciencia de la Computacin

Hugo Rangel

horizontalmente (mediante el operador OR). En un rbol sistmico nunca aparecen negaciones (el operador lgico NOR), esto es una gran ventaja, ya que las negaciones en las expresiones lgicas de los rboles se pueden leer y comprender con mayor facilidad (menor complejidad). Un rbol sistmico puede utilizarse tambin como una herramienta para auditar cdigo en el que aparece enunciados condicionales.
Un rbol sistmico conduce a cdigo (enunciados condicionales) que puede ser verificado automticamente

Un modelo es una abstraccin de una porcin de inters de la realidad que intenta capturar sus funciones (elementos) principales y la interrelacin entre esta(o)s.

La practica de la programacin
Desafortunadamente, en la actualidad, todava mucho del enfoque en la programacin es emprica y ad hoc. Cada problema se aborda sin relacin alguna con aquellos ya tratados dentro de la misma categora. La experiencia se asimila como una cmulo de unidades de conocimiento sin conexin alguna. Afortunadamente la programacin ha progresando y convertido en una teora conocida como la programacin estructurada. La cual tiene como fundamento la lgica computacional. El propsito de una teora es la de categorizar los dominios de problema que enfrenta y de explicar la practica existente con lo que se habilita para que se mejore mediante el desarrollo de nuevas tcnicas y de una mayor acuidad. Las experiencias se retroalimentan a la teora para que el proceso de enriquecimiento contine. Esta sinergia dialctica entre teora y practica es esencial para la emergencia de una ingeniera de la programacin robusta y saludable. Aunque la teora de la programacin estructurada ha avanzado mucho, las experiencias en la enseanza de los lenguajes de programacin en el aula muestran que esto no es suficiente. Es necesaria la practica continua para lograr un mejor aprendizaje, por lo que es imprescindible concurrir a laboratorios equipados con el hardware y el software necesarios y suficientes para el logro de un aprendizaje de mayor calidad. Por otra parte los principios de la buena programacin no deben presentarse en el aula como abstracciones conceptuales aisladas, sino en sinergia en el contexto de programas completos que funcionan. Por ejemplo, en el texto no hay captulos sobre eficiencia, ni de diseo de arriba abajo, ni sobre pruebas y depuracin. Sino que, a lo largo del libro, hay observaciones sobre estos tpicos conforme se relacionan con un programa en particular que se desarrolla. Sin embargo si incluimos un captulo sobre la programacin estructurada con la idea de explicar aqu ampliamente dos conceptos que estn ganando terreno hoy da, la de interprete y la de representacin.

Pgina 28 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

En la portada del libro Software tools in Pascal, de Kernighan y Plauger se lee: La buena programacin no se aprende de generalidades, sino del examen de cmo los programas significantes pueden hacerse con limpieza, fciles de leer, fciles de mantener y modificar, diseados para las personas, eficientes y confiables mediante la aplicacin del sentido comn y de las buenas practicas de la programacin. El estudio cuidadoso y la imitacin de los buenos programas conduce a una codificacin mejor. El lenguaje de programacin C Un lenguaje de programacin como C, puede visualizarse como una coleccin de lenguajes integrados en un ambiente comn de desarrollo. Cada sublenguaje proporciona una perspectiva diferente. Podemos distinguir los siguientes sublenguajes en C: Los enunciados de entrada y salida de datos, las funciones que facilitan el manejo de los programas al subdividirlos en pequeos mdulos jerrquicos, el manejo de cadenas de caracteres que se manipulan preferentemente mediante la biblioteca de cabecera string.h, los enunciados de las figuras de control de flujo, las estructuras de datos con sus diferentes variantes y combinaciones, etc. Todos ellos son potenciales dominios de problema que deben de tratarse de manera individual. Esta visin de concebir a un lenguaje de programacin como una coleccin de lenguajes es de suma importancia, ya que esta constituye un primer nivel de abstraccin en la identificacin de dominios de problema potenciales. En un segundo nivel de abstraccin podemos identificar potenciales subdominios de problema. Esta visin pone en perspectiva una solucin para el analfabetismo programtico. Solucin que ya esta en progreso en un proyecto del Laboratorio de Telemtica; Diseo de Entornos para la Enseanza Aprendizaje, DEEA por sus siglas, en el cual se concibe al docente como un diseador de entornos de enseanza que facilitan el aprendizaje de un tpico o tema de difcil asimilacin por parte de los alumnos. Esta investigacin ha conducido a la creacin de los Modelos Didcticos Ontolgicos (MoDOs) que se avocan a la solucin de un dominio de problema especfico. En el texto se incluyen varios de estos, solo por mencionar dos de ellos: rboles sistmicos y la notacin Mx. Estos MoDOs ya sido probados ampliamente en el aula durante varios semestres con bastante aceptacin y xito. Los MoDOs forman parte de una didctica del diseo de los sistemas de software, o por brevedad: Programtica Educativa. Los MoDOs no solo son tiles a nivel pedaggico sino tambin igualmente a nivel profesional. La actividad de la programacin es una demanda diversas habildades del inevitablemente se hace mucho ms significa que no podamos tratar esa actividad complicada, debido a que programador. Por otra parte, compleja, sin embargo, esto no complejidad con claridad y gran
Pgina 29 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

capacidad de discernimiento. A mayor complejidad son necesarias ms y mejores herramientas para tratarla. Un buen ejemplo de ello, es el dominio de problema ya largamente identificado de la psima comprensin del uso de apuntadores, en el lenguaje C, particularmente cuando estos aparecen combinados con otras estructuras de datos, la complejidad es tal que algunos buenos programadores profesionales han renunciado a aprender C. La respuesta para dominar esta complejidad es la notacin Mex, un MoDO, que adems nos permite elevar nuestro nivel de C, usar esta complejidad a nuestro favor, pues podemos disear programas con mayor agilidad y comprender con mayor facilidad la programacin orientada a objetos, segn informan los propios alumnos, a quienes se les a impartido este y otros MoDOs.

Pgina 30 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Brevario
Un estilo simple de solucion de problemas Tomado de [Segr, 1982].
Bethe expreso, como sigue, la impresin que le causo Fermi: Lo que ms me impresion del mtodo de Fermi en fsica terica fue su simplicidad. Era capaz de reducir a lo esencial cualquier problema sin importar que tan complicado pareciera. Lo desnudaba de complicaciones matemticas y formalismos innecesarios. De esta forma poda resolver el problema fsico esencial implicado, a menudo en media hora o incluso menos. Por supuesto que lo que se obtena de esta forma no era todava la solucin matemtica completa; pero al dejar a Fermi despus de una de estas discusiones, quedaba claro como debera elaborarse la solucin matemtica. Este mtodo me pareci particularmente impresionante porque yo vena de la escuela de Sommerfeld, en Munich, y el desarrollaba todo su trabajo mediante soluciones matemticas completas. Como madure en la escuela de Sommerfeld, tena la idea de que el mtodo a seguir consista en establecer las ecuaciones diferenciales pertinentes para el problema (generalmente la ecuacin de Schrdinger), utilizar la destreza matemtica de que se dispusiera para encontrar una solucin tan exacta y elegante como fuera posible y, posteriormente, discutir dicha solucin. Finalmente a travs de la discusin se encontraran las caractersticas cualitativas de la solucin con la cual se entendera la fsica del problema. La forma de proceder de Sommerfeld era buena para muchos de problemas en los cuales la esencia de los mismos ya se comprenda, pero resultaba extremadamente laboriosa. Por lo comn transcurran meses antes de que se pudiera conocer la respuesta, Era tremendamente impresionante comprobar que Fermi no necesitaba hacer todo este trabajo. La naturaleza fsica del problema se aclaraba inmediatamente el anlisis de sus componentes esenciales y unas cuantas ordenes de magnitud. Su modo de proceder era pragmtico (practico, es decir, de sentido comn, aunque se dice que el menos comn de los sentidos es el sentido comn, Observacin del autor). Fermi era un buen matemtico. Era capaz de hacer matemticas de sitio nivel cada vez que se necesitaba, sin embargo, primero se aseguraba que vala la pena hacerlas. Era un maestro en el arte de alcanzar resultados importantes con un mnimo de esfuerzos y de aparato matemtico. Trabajar de esta manera la permita establecer en gran medida los problemas, especialmente para beneficio de la gente joven que no posea sus grandes conocimientos. Por ejemplo, su formulacin de la electrodinmica cuntica es ms simple que la versin original de Heisenberg y Pauli, y se puede entender con suma facilidad. Me intimidaban mucho los artculos de Pauli y Heisenberg y

Pgina 31 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

no poda ver el bosque por causa de los rboles; El planteamiento de Fermi me mostr el bosque. Lo mismo puedo decir respecto al artculo que escribimos juntos, acerca de las diversas formulaciones de la teora relativista de las colisiones. La manera en que Fermi formul la difusin de neutrones, la teora de la edad, ha sido muy til para hacer clculo rpido de difusin de neutrones an en casos complicados. Podra multiplicar esta lista fcilmente, recurriendo solo a mi experiencia personal con Fermi y su trabajo.

Pgina 32 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Captulo 2

Elementos del Lenguaje de Programacin C

Pgina 33 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 34 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Objetivo general El alumno modelara, codificara y correra programas que incluyen funciones de entrada y salida de datos de tipo carcter, cadenas, enteros, reales en el lenguaje C. Estos programas solo incluyen a la categora de figuras de secuencia.

Contenido 2- Elementos del Lenguaje de Programacin C 2.0- Introduccin 2.1- La estructura de un programa en lenguaje C 2.1.1- Exhibicin de una cadena de caracteres 2.1.2- Cadenas muy largas 2.1.3- Uso de varias salidas con la funcin puts() 2.2.- Identificadores variables y constantes 2.2.1- El identificador variable de tipo carcter (char) 2.2.2- Diferencias entre el carcter A y la cadena con el carcter A 2.2.3- Lectura de una cadena de caracteres con la funcin gets() 2.2.4- Las funciones de lectura para un carcter 2.2.5- Exhibicin de una cadena con la funcin printf() 2.2.6- Cambio de lnea con la funcin printf() 2.2.7- El formato s (string) para cadenas 2.3- Exhibicin de datos con la funcin printf() 2.4- Lectura de datos con la funcin scanf()

Objetivos Al terminar ste captulo, el alumno ser capaz de utilizar: 1. 2. 3. 4. Caracteres y cadenas Leer y escribir caracteres y cadenas. Formatos para lectura y exhibicin de datos. Constantes.

Pgina 35 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

2.0- Introduccin El desarrollo de algoritmos (solucin a un problema) pone en juego nuestra capacidad de abstraccin a diferentes niveles y a nuestra capacidad de discernimiento en diferentes contextos. En la actividad de la programacin se implementa la solucin con una especial atencin a los detalles, sintaxis del lenguaje y otros. El desarrollo de algoritmos y la actividad de la programacin deben de ser una practica constante. En este captulo hacemos ms nfasis en la sintaxis del lenguaje C que en estrategias para el desarrollo de algoritmos. 2.1- La estructura de un programa en C Todo programa en C debe incluir al menos a la funcin principal main. La estructura general de un programa en C que incluye al menos a la funcin principal es la siguiente:
#include <stdio.h> void main(void){ /* declaraciones de datos */ } /* instrucciones ejecutables */

La primera lnea contiene a la directiva #include, la que se utiliza para incluir archivos especiales llamados archivos cabecera (header files) que contienen funciones predeclaradas que usted usa en su programa. En este caso se incluye la utilera stdio.h la cual contiene las funciones de lectura y exhibicin de datos. La lnea void main(void) especifica el inicio de la funcin principal, llamada as porque esta se ejecuta primero antes que cualquier otra funcin en el programa. Entre las llaves { y }, que indican el inicio y final respectivamente de la funcin principal en la que se encuentran las declaraciones de datos que intervienen en el programa y las instrucciones ejecutables que los manipulan. 2.1.1- Exhibicin de una cadena de caracteres Nuestro primer programa exhibe una cadena de caracteres en la pantalla. Este programa no incluye declaraciones, slo una instruccin ejecutable (fondo gris).
#include <stdio.h>

Pgina 36 de 208

Ingeniera y Ciencia de la Computacin


void main(void){ } puts("Mi primer programa en C");

Hugo Rangel

Observse que el programa, luego de su ejecucin, exhibe la cadena, esta aparece entre dobles comillas y como un argumento de la funcin puts (put string, es decir, exhibir cadena). 2.1.2- Cadenas muy largas Los siguientes dos programas ilustran el manejo de cadenas muy largas. En el primer caso se utiliza una diagonal invertida " \ " para indicar continuidad de la instruccin en la siguiente lnea.
#include <stdio.h> void main(void){ puts("Mi segundo programa en C"); \

En el siguiente programa se coloca toda la instruccin en una lnea.


#include <stdio.h> void main(void){ } puts("Mi tercer programa en C");

2.1.3- Uso de varias salidas con la funcin cadena)

puts() (exhibe o muestra

El siguiente programa usa la instruccin puts para mostrar un mensaje en la pantalla.


#include <stdio.h> void main(void){ puts("Mi cuarto"); puts("programa en C"); }

2.2- Identificadores variables y constantes Un identificador variable (o variable por brevedad) es un nombre que tiene asociado un valor que puede modificarse asignandole otro valor del mismo tipo, o

Pgina 37 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

uno que no cambia (identificador constante, o constante por brevedad). Los identificadores deben empezar con una letra o un subguin y pueden tener hasta 64 caracteres; letras minsculas y maysculas, dgitos y subguiones. 2.2.1- El Identificador variable de tipo carcter (char) El ejemplo siguiente ilustra el uso de cinco variables que almacenan cada una un carcter, es decir, se trata de variables de tipo carcter que se inician con un valor especifico en su declaracin, tambin se dice que se inician en tiempo de compilacin, lo cual significa que estas variables se inician cuando se compila el programa. Notse que las variables con sus valores aparecen en una lista precedida por la palabra reservada char y separadas por , (comas). Se indica el final de la lista con ; (punto y coma).
include <stdio.h> void main(void){ char ACa = 'H', BCa = 'o', CCa = 'l', DCa = 'a', ECa = '\0'; putchar(ACa); putchar(BCa); putchar(CCa); putchar(DCa); putchar(ECa);

A la variable ACa se hace igual (=) al valor H (entre comillas simples para indicar un caracter) luego viene una , (coma ) y asi sucesivamente hasta que la lista termina con el carcter de control \0, el cual indica fin de cadena de caracteres (Hola). El punto y coma ; indica fin de lista. Este programa tambin ilustra el uso de la funcin putchar, la cual nos permite exhibir un carcter a la vez. El siguiente ejemplo ilustra como iniciar cada variable de manera independiente, es decir, cada variable esta precedida del tipo char, se les asiga su valor correspondiente y termina con ; (punto y coma).
include <stdio.h> void main(void){ char ACa = 'H'; char BCa = 'o'; char CCa = 'l'; char DCa = 'a'; char ECa = '\0'; putchar(ACa); putchar(BCa); putchar(CCa); putchar(DCa); putchar(ECa);

Pgina 38 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Otra forma alternativa del ejemplo, es el siguiente:


include <stdio.h> void main(void){ putchar('H'); putchar('o'); putchar('l'); putchar('a'); putchar('\0'); }

Los valores, no las variables, aparecen explcitamente como argumentos de la funcin putchar, en consecuencia no hay declaraciones. 2.2.2- Diferencias entre el carcter A y la cadena A El carcter A se almacena en una variable de tipo carcter como el carcter A, pero la cadena A se almacena como una A seguida del carcter de control de fin de cadena. caracter A cadena A\0

Considrese las siguientes declaraciones, las cuales inician en tiempo de compilacin a las variables correspondientes.
char char AlfaCa = BetaCd[2] 'A'; = "A";

En el primer caso se almacena el carcter A en la variable Alfa de tipo carcter. Notese que el carcter A esta entre comillas simples y que la cadena A esta entre comillas dobles. El siguiente diagrama ilustra esto.
AlfaCa A

En el segundo caso se declara una cadena de caracteres, es decir, un vector con dos componentes de tipo carcter. El siguiente diagrama ilustra esto.
BetaCd[0]

A BetaCd[1] \0 Obsrvese que en la posicin 0 de la variable BetaCd[0] se almacena el carcter A, y en la posicin 1 de la variable BetaCd[1], el carcter de control ( \0 ) que significa fin de cadena. Considrese las siguientes observaciones:
Pgina 39 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

+ Un carcter aparece entre comillas simples. + Una cadena de caracteres aparece entre comillas dobles, en el ejemplo la + Un carcter se asigna a una variable simple, en este caso Alfa. + Una cadena de caracteres asigna a una variable compuesta de varias posiciones para los caracteres, en este caso dos, una posicin para el carcter A, y otra para el carcter de fin de cadena ('\0'), de ah que la variable BetaCd aparezca antecedida por [2]. + Un vector, arreglo de una dimensin en C, tiene como primer posicin el 0, luego el 1, etc. En el ejemplo, la posicin BetaCd[0] contiene el carcter A y la posicin BetaCd[1] contiene el carcter de control de fin de cadena \0. Este ltimo carcter lo asigna el compilador automticamente, por lo que siempre hay que proporcionar una posicin adicional, adems de las correspondientes a las de la cadena. El siguiente programa inicia a la variable CadenaCd, en tiempo de compilacin con la cadena Hola (entre doble comillas). Se indica que la variable tiene 5 posiciones [5] (5 entre corchetes), cuatro para la cadena y una posicin adicional para el carcter de control que indica fin de cadena. Aunque este ltimo no aparece explicitamente, el compilador se lo asigna automticamente.
#include <stdio.h> void main(void){ char CadenaCd[5] = "Hola"; } puts (CadenaCd);

La cadena Hola se almacena en la variable CadenaCd como sigue:


CadenaCd CadenaCd CadenaCd CadenaCd CadenaCd [0] [1] [2] [3] [4] = = = = = H o l a \0

Un carcter por posicin. Obsrvese que el compilador asigna el carcter de control \0 (fin de cadena) al final de la misma. En el ejemplo que sigue se omite el nmero de posiciones que puede tener como mximo la variable CadenaCd[], esto puede hacerse siempre y cuando la variable se inicie en tiempo de compilacin como sigue:
#include <stdio.h>

Pgina 40 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

void main(void){ char CadenaCd[] = "Hola"; } puts(CadenaCd);

Es un error tratar de hacer la siguiente asignacin (tiempo de ejecucin):


#include <stdio.h> void main(void){ char CadenaCd[5]; CadenaCd = "Hola"; puts(CadenaCd);

Notese que ahora es necesario declarar a la variable CadenaCd de 5 posiciones explicitamnete porque no se inicia en tiempo de compilacin. Es necesario hacer la asignacin carcter por carcter tal como lo ilustra el siguiente ejemplo:
#include <stdio.h> void main(void){ char Cadena[5]; CadenaCd[0] CadenaCd[1] CadenaCd[2] CadenaCd[3] CadenaCd[4] } = = = = = H; o; l; a; \0;

puts(CadenaCd);

o bien haciendo uso de la funcin de utilera strcpy.


#include <stdio.h> #include <string.h> void main(void){ char CadenaCd[5]; strcpy(CadenaCd, "Hola"); puts(CadenaCd);

Obsrvese que se ha incluido el archivo cabecera string.h, ya que la funcin strcpy se encuentra definida en este. La funcin tiene la siguiente forma general:

Pgina 41 de 208

Ingeniera y Ciencia de la Computacin


strcpy(cadena destino, cadena fuente)

Hugo Rangel

la cadena fuente es la cadena que se quiere copiar en la cadena destino. La cadena fuente puede ser una cadena constante, como "Hola", o bien una variable arreglo de tipo char. 2.2.3- Lectura de una cadena de caracteres con la funcin gets() (lee cadena) La instruccin gets (get string) nos permite leer una cadena que digitemos con el teclado.
#include <stdio.h> void main(void){ char CadenaCd[] = "Digite una cadena"; puts (CadenaCd); gets (CadenaCd); puts (CadenaCd);

El ejemplo siguiente exhibe carcter por carcter de la cadena.


#include <stdio.h> void main(void){ char CadenaCd[] = "Hola"; putchar(CadenaCd[0]); putchar(CadenaCd[1]); putchar(CadenaCd[2]); putchar(CadenaCd[3]); putchar(CadenaCd[4]); }

2.2.4- Las funciones de lectura para un carcter C tiene varias funciones para leer un carcter, estas se muestran a continuacin: Funcin getchar() getche() getch() Operacin Lee un carcter de teclado. Espera un RETURN Lee un carcter con eco. No espera un RETURN Lee un carcter sin eco. No espera un RETURN

Todas estas funciones se utilizan para leer un carcter de teclado. 2.2.5- Exhibicin de una cadena con la funcin printf()

Pgina 42 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Notse, en el ejemplo que sigue, que la funcin printf utiliza el formato s de string (cadena) para exhibir el valor de la variable CadenaCd.
#include <stdio.h> void main(void){ char CadenaCd[] = "Digite un cadena"; } printf("%s", CadenaCd);

2.2.6-

Cambio de lnea con la funcin printf()

El siguiente ejemplo es el anterior, solo que ahora incluye el carcter de control \n (cambio de lnea), con lo cual, luego de aparecer en pantalla Digite un cadena el cursor se posiciona al inicio de la siguiente lnea.
#include <stdio.h> void main(void){ char CadenaCd[] = "Digite un cadena"; } printf("%s\n", CadenaCd);

2.2.7- El formato s(string) para cadenas La funcin printf puede incluir formatos que le indican al compilador de qu tipo es el valor de la variable que se va a exhibir. El siguiente programa ilustra esto para cadenas.
#include <stdio.h> void main(void){ char CadenaCd[] = "Digite una cadena"; printf("%s", CadenaCd); }

2.3- Exhibicin de datos con la funcin printf() La forma general para la exhibicin de datos con printf es la siguiente:
printf(cadena de control, arg1, ..., argn);

Donde la cadena de control contiene informacin de formato para arg1,..., argn que representan los datos de salida.

Pgina 43 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

La informacin del formato consiste en caracteres de conversin precedidos por el smbolo %. Hay un carcter de conversin por cada argumento. La tabla siguiente lista estos caracteres de conversin. Caracter de conversi n %c %d %e %f %g %i %o %s %u %x Significado El valor del dato se exhibe como un caracter. El valor del dato se exhibe como un entero con signo. El valor del dato se exhibe como un real con exponente. El valor del dato se exhibe como un real sin exponente. El valor del dato se exhibe como un real usando conversin e o f lo que resulte ms corto. El valor del dato se exhibe como un real con signo. El valor del dato se exhibe como un entero octal. El valor del dato se exhibe como una cadena. El valor del dato se exhibe como un entero sin signo. El valor del dato se exhibe como un entero haxadecimal.

Enseguida se dan ejemplos que ilustran el uso de estos formatos. El primer ejemplo ilustra el uso del formato para variables de tipo entero las cuales se inician en tiempo de compilacin.
#include <stdio.h> void main(void){ int AEn = 5, BEn = 7, CEn; CEn = AEn +BEn; printf("%d + %d = %d", } AEn, BEn, CEn);

El segundo ejemplo ilustra el uso del formato real.


#include <stdio.h> void main(void){ float AEn, BEn, CEn; AEn = 5.2; BEn = 7.4; Cen = AEn + BEn; printf("%f + %f = %f", AEn, BEn, CEn);

2.4- Lectura de datos con la funcin scanf()

Pgina 44 de 208

Ingeniera y Ciencia de la Computacin La forma general para la lectura de datos con scanf es
scanf(cadena de control, arg1, ... , argn);

Hugo Rangel

donde la cadena de control contiene la informacin del formato para los arg1,..., argn, los que representan las variables para los datos de entrada. La cadena de control contiene caracteres de conversin precedidos por el smbolo %. Hay un carcter de conversin por cada argumento. La tabla siguiente lista estos caracteres de conversin. Caracter de conversi n %c %d %e %f %g %h %i %o %s %u %x Significado El valor del dato es un carcter. El valor del dato es un entero con signo. El valor del dato es un real con exponente. El valor del dato es real. El valor del dato es real. El valor del dato es un entero corto. El valor del dato es un entero. El valor del dato es un octal. El valor del dato es una cadena seguida de un carcter nulo (se agrega al final automticamente). El valor del dato es un entero sin signo. El valor del dato es un entero haxadecimal.

El ejemplo siguiente ilustra el uso de formatos con la funcin scanf, observe que las variables estn precedidas por el smbolo &, con la excepcin de las variables de tipo cadenas.
#include <stdio.h> void main(void){ int AEn, BEn, CEn; puts("Digite los valores de AEn y BEn"); scanf("%d %d", &AEn, &BEn); cEn = aEn + bEn; printf("%d + %d = %d", AEn, BEn, CEn); }

He aqu otro ejemplo:


#include <stdio.h> void main(void){ char CadenaCd[] = "El resultado es: "; Pgina 45 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

float ARe, BRe, CRe; puts("Dame los valores de ARe y BRe"); scanf("%f %f", &ARe, &BRe); CRe = ARe + BRe; printf("%s %f", CadenaCd, CRe); }

El ejemplo siguiente ilustra el uso de comentarios y del identificador constante const.


#include <stdio.h> void main(void){ const PIReCn = 3.1416; float RadioReCn = 5, LongitudRe, AreaRe, VolumenRe; /* Clculo de la longitud de la circunferencia: */ LongitudRe = RadioRe*PIReCn; /* Clculo del rea del circulo: */ AreaRe = RadioRe*RadioRe*PIReCn; /* Clculo del volumen de la esfera: */ VolumenRe = (3/4)*PIReCn*RadioRe*RadioRe*RadioRe; /* Exhibicin de los valores calculados: */ printf("Radio = %f\n", RadioRe); printf("Longitud = %f\n", LongitudRe); printf("rea = %f\n", AreaRe); printf("Volumen = %f\n", VolumenRe);

Pgina 46 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Captulo 3

Arreglos y la Categora de Figuras de Iteracin

Pgina 47 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 48 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Objetivo general El alumno modelara, codificara y correr programas que incluyen algoritmos que utilizan la categora de figuras de iteracin.

Contenido 3.- Iteracin 3.0.-Introduccin 3.1.- Arreglos 3.1.1- Arreglos unidimensionales 3.1.2- Arreglos multidimensionales 3.1.3- Operadores de relacin 3.1.4- Los operadores de pre y post autoincremento 3.1.5- Los operadores de pre y post autodecremento 3.1.6- Notacin corta 3.2.- Ciclos 3.2.1- La instruccin for y sus variantes 3.2.2- La instruccin while y sus variantes 3.2.3- La instruccin while-do y sus variantes 3.3.- Diseo de programas con ciclos 3.4.- Resumen 3.5.- Ejercicios

Objetivos particulares Al terminar ste captulo, el alumno ser capaz de utilizar: 1. Arreglos 2. Los operadores de relacin 3. Los operadores de autoincremento 4. Las figuras de iteracin

Pgina 49 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

3.0 Introduccin Los arreglos son estructuras compuestas homogeneas que pueden llegar a almacenar grandes volumenes de datos de un mismo tipo, por ejemplo, o enteros, o caracteres, o flotantes, o apuntadores etc. El lenguaje C, incluye a los arreglos como parte de su sintaxis as como las operaciones que pueden realizarse con ellos. Esto es muy conveniente ya que esto nos permite manipular con ellos estructuras matematicas de gran importancia en la ingeniera como son los vectores, las matrices, etc. y otras estructuras no matemticas (simbolicas) de gran relevancia en la ingeniera y ciencias de la computacin. En el lenguaje C tenemos asociados con los arreglos a los enunciados ciclicos y con estos a las expresiones de relacin, as como a los operadores de pre y post autoincremento y de pre y post autodecremento. 3.1 Arreglos Suponga que codifica un programa que lee 10 valores enteros para calcular su valor promedio y luego mostrar estos valores y su promedio, para ello ud. requiere declarar un total de 11 identificadores variables, 10 para los valores leidos y uno para el promedio. Lo mejor es declarar un arreglo, los cuales son estructuras de datos compuestas homogneas (ms de un valor del mismo tipo) con 10 elementos, uno por cada valor entero del promedio calculado. 3.1.1 Arreglos unidimensionales (vectores) Un vector es una coleccin de valores del mismo tipo, es decir, una coleccin homognea de valores. A cada valor se hace referencia por un nombre comn a todos y un ndice nico para diferenciarlos entre si. El primer valor tiene asociado el ndice 0, y el ltimo el ndice n -1, donde n es el nmero de valores del vector. La forma general para declarar un vector es la siguiente:
tipo nombre_comun[nro de valores];

Ejemplo:
int AVcEn[10]; //
El identificador AVcEn significa A es un Vector Entero.

Pgina 50 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

El vector se declara con un total de 10 entradas, en las que se puede almacenar un entero en cada una de ellas, como se muestra enseguida, en el que se asigna un valor en cada entrada del vector.
AVcEn[0] AVcEn[1] AVcEn]2] AVcEn[3] AVcEn[4] AVcEn[5] AVcEn[6] AVcEn[7] AVcEn[8] AVcEn[9] = = = = = = = = = = 3; 7; 1; 7; 3; 5; 4; 0; 2; 6;

Notese que en el lenguaje C el primer indice de todo vector es 0 y el ltimo es n 1. La Figura X siguiente muestra al vector AVcEn con 10 entradas valores de tipo entero. Notese, en el listado de arriba y la Figura X, que el nombre del vector -AVcEn - designa una coleccin de valores enteros (3, 1, ... ,2, 6) y el indice (0, 1, ..., 8, 9) hace la difrencia de cada elemento, de modo que el primer elemento tiene como nombre identificador variable el de AVcEn[0] y el ltimo el de AVcEn[9]. AVcEn[0] 3 7 1

0 2 AVcEn[n 1] 6 Fig. Arreglo unidimensional vector de nombre AVcEn con 10 elementos homogneos (de tipo entero) almacenados en cada entrada del vector. Que es un vector (arreglo unidimensional) ? Es un identificador variable o constante que almacena un conjunto de datos homogneos, es decir, del mismo tipo. El porque de la importancia de los arreglos ? permite realizar operaciones con grandes volmenes de datos homogneos con gran economia de codigo. Los arreglos son las estructuras de datos bsicas para el computo cientfico.

Pgina 51 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Como son los arreglos ? el nombre del vector -AVcEn - designa una coleccin de valores enteros (3, 1, ... , 2, 6) y el indice (0, 1, ..., 8, 9) hace la difrencia de cada elemento, de modo que el primer elemento tiene como nombre identificador variable el de AVcEn[0] y el ltimo el de AVcEn[9]. 3.1.2 Arreglos multidimensionales 3.1.3- Operadores de relacin La tabla siguiente muestra los operadores de relacin utilizados en C. operador < <= > >= == =! Por ejemplo: A<B A <= B la expresin es verdadera si el valor de A es menor al valor en B, es decir; 5 < 7, en caso contrario es falsa, es decir; 7<5 la expresin es verdadera si el valor de A es menor o igual al valor en B, es decir; 5 <= 7 tambin es verdadera 5 <= 5, en caso contrario es falsa, es decir; 7<=5 la expresin es verdadera si el valor de A es mayor al valor en B, es decir; 9 > 7, en caso contrario es falsa, es decir; 7>9 la expresin es verdadera si el valor de A es mayor o igual al valor en B, es decir; 9 >= 7 tambin es verdadera 9 >= 9, en caso contrario es falsa, es decir; 7 >= 9 la expresin es verdadera si el valor de A es igual al valor en B, es decir; 7 == 7, en caso contrario es falsa, es decir; 7 == 5 la expresin es verdadera si el valor de A es diferente al valor en B, es decir; 5 =! 7 tambien es verdadera 7 =! 5, en caso contrario es falsa, es decir; 7 =! 7 significado menor que menor o igual que mayor mayor o igual que igual que difrente a

A>B A >= B

A == B A =! B

3.1.4 Los operadores de pre y post autoincremento

Pgina 52 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Los operadores de pre y post autoincremento y autodecremento suman o restan uno respectivamente a una variable entera antes o despus de usarse. Para ejemplificar, supongamos que la variable entera BetaEn fue iniciada con el valor de 5 para cada uno de los casos que se muestran enseguida. Los identificadores AlfaEn y BetaEn significan Alfa es un Entero y Beta es un Entero respectivamente. Ejemplo con el operador de post autoincremento
int BetaEn = 5, AlfaEn; AlfaEn = BetaEn++;

post significa que la variable BetaEn est precedida del operador de autoincremento (++). El efecto es el siguiente; primero la variable BetaEn asigna su valor de 5 a la variable AlfaEn y despus se autoincrementa en uno. Es decir, AlfaEn acaba con el valor de 5 y BetaEn con el valor de 6. Ejemplo con el operador de pre autoincremnto
int BetaEn = 5, AlfaEn; AlfaEn = ++BetaEn;

pre significa que la variable BetaEn est precedida por el operador de autoincremento (++). El efecto es el siguiente; primero la variable BetaEn se autoincrementa en uno su valor, de 5 a 6, luego asigna este valor a la varibale AlfaEn. Es decir, AlfaEn y BetaEn acaban con el valor de 6. 3.1.5 Los operadores de pre y post autodecremento Ejemplo con el operador de post autodecremento
int BetaEn = 5, AlfaEn; AlfaEn = BetaEn--;

post significa que la variable BetaEn est precedida del operador de autodecremento (--). El efecto es el siguiente; primero la variable BetaEn asigna su valor de 5 a la variable AlfaEn y despus se autodecrementa en uno. Es decir, AlfaEn acaba con el valor de 5 y BetaEn con el valor de 4. Ejemplo con el operador de pre autodecremento
int BetaEn = 5, AlfaEn; AlfaEn = --BetaEn;

pre significa que la variable BetaEn est precedida por el operador de autodecremento (--). El efecto es el siguiente; primero la variable BetaEn se

Pgina 53 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

autodecrementa en uno su valor, de 5 a 4, luego asigna este valor a la varibale AlfaEn. Es decir, AlfaEn y BetaEn acaban con el valor de 4. 3.1.6 Notacin corta Los operadores anteriores incrementan y decrementan de 1 en 1, con los operadores de suma y resta respectivamente. C permite, adems, simplificar la notacin de algunas expresiones aritmticas que incluyen a los operadores aritmticos de suma, resta, producto y divisin. Considerese la expresin:
i = i + 5;

esta puede simplificarse anteponiendo el smbolo + al simbolo = y suprimiendo la segunda i que aparece en la asignacin.
i += 5;

las mismas reglas pueden aplicarse a la resta, producto y divisin. resta


i = i 5; i -= 5

producto
i = i * 5; i *= 5

divisin
i = i / 5; i /= 5;

3.2 Ciclos Los ciclos son una categora de encunciados de figuras de control que nos permiten realizar un enunciado o una secuencia de estos una o ms veces, es decir, podemos repetir la realizacin de un enunciado o de una secuencia de ellos n veces, donde n esta determinada por una relacin. En esta categoria tenemos tres enunciados iterativos 3.2.1 El enunciado iterativo for El enunciado for es una figura de control iterativa que nos permite la ejecucin repetida de uno o ms enunciados, que se encuentran en su alcance.

Pgina 54 de 208

Ingeniera y Ciencia de la Computacin Su forma general, del enunciado for, es el siguiente:


for(iniciacin; condicin; incremento/decremento) enunciado(s)

Hugo Rangel

El diagrama siguiente ilustra el flujo de control de esta figura iterativa. Primero la variable de control (VarCon) se inicia con un valor inicial (Inicia VarCon), luego se verifica si la Condicin es cierta, si es as el flujo de control pasa a el (los) Enunciado(s), enseguida la variable de control se autoincrementa o autodecrementa y se inicia otro ciclo. Si la condicin es falsa, el flujo de control esta fuera del alcance de la instruccin for.

Condicin Condicin

Inc/Dec VarCon

Considerese el ejemplo siguiente:


// Este programa asigna 10 valores enteros a arreglo // AVcEn, luego los exhibe en el monitor. #include <stdio.h> void main(void){ int AVcEn[10], IndiceEn; /* Se asignan valores, del 0 al 9, al vector AVcEn */ for(IndiceEn = 0; IndiceEn < 10; IndiceEn ++) AVcEn[IndiceEn] = IndiceEn; /* Se exhiben los valores del vector AVcEn */ for(IndiceEn = 0; IndiceEn < 10; IndiceEn ++) printf("%d", AVcEn[IndiceEn]); } VarConEn = 0 los elementos de un

El diagrama siguiente ilustra el flujo de control, o la ejecucin, del primer ciclo.


VarConEn < 10

VarCon Inicia

Falsa

Verdadera Enunciado(s)

AVcEn[VarConEn] = VarConEn

VarConEn++

Pgina 55 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

El siguiente diagrama ilustra el flujo de control o de ejecucin del segundo ciclo.

IndiceEn = 0
IndiceEn

< 10

printf("%d", AVcEn[IndiceEn])

IndiceEn ++

El siguiente programa calcula el promedio de 10 valores enteros. Obsrvese que todos los valores (asignados y calculados) son enteros.
#include <stdio.h> void main(void){ int IndiceEn, PromedioEn, TempEn, AVcEn[10]; /* Se leen los elementos de AVcEn: */ puts("Dame los elementos de A separados por un blanco"); for(IndiceEn = 0; IndiceEn < 10; IndiceEn ++) scanf("%d", &AVcEn[IndiceEn]); /* Se suman los valores de AVcEn en TempEn: */ for(IndiceEn = 0; IndiceEn < 10; IndiceEn ++) TempEn += AVcEn[IndiceEn]; /* Se calcula el valor promedio: */ PromedioEn = TempEn/10; /* Se imprime el valor promedio */ printf("%d", PromedioEn); }

La directiva define

Pgina 56 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Esta directiva usualmente se utiliza para sustituir identificadores crpticos (poco legilbles) por otros ms legibles. El ejemplo siguiente ilustra el uso de la directiva define, en este caso se sustituye al operador de relacin != por la frase ms legible NO_ES y el carcter fin de cadena \0 se sustituye por la frase ms legible FIN_DE_CADENA. Los identificadores NO_ES y FIN_DE_CADENA actan como sustitutos de los identificadores != y \0 respectivamente. Notse que la condicin
cadenaCd[iEn] NO_ES FIN_DE_CADENA

es ms legible que la condicin equivalente (pero ms crptica)


cadenaCd[iEn] != \0 #include <stdio.h> #define NO_ES != #define FIN_DE_CADENA \0 void main(void){ char CadenaCd[] = "Este es un mensaje"; int IndiceEn; for(IndiceEn = 0; CadenaCd[IndiceEn] NO_ES FIN_DE_CADENA; IndiceEn++) printf("%c", CadenaCd[IndiceEn]);

El siguiente ejemplo usa otra directiva define para definir al sustituto BLANCO. Los sustitutos definidos por un define no son variables. Por otra parte este ejemplo ilustra el uso de la instruccin for sin instrucciones a su alcance.
#include <stdio.h> #define BLANCO ' ' #define NO_ES != void main(void){ char CadenaCd[10]; int IndiceEn; puts("Digite una cadena"); gets(CadenaCd); for(IndiceEn = 0; CadenaCd[iEn] NO_ES BLANCO; IndiceEn++); printf("La posicin del primer blanco es: %d ", IndiceEn);

El ejemplo que sigue ilustra el uso de la instruccin for sin la parte de iniciacin.
#include <stdio.h> #define NO_ES != void main(void){ char CaraCa; for(CaraCa = 'X'; NO_ES 'A';)

Pgina 57 de 208

Ingeniera y Ciencia de la Computacin


CaraCa = getche();

Hugo Rangel

El ejemplo que sigue ilustra el uso de la instruccin for sin la parte de iniciacin y de autoincremento/autodecremento.
#include<stdio.h> main() #define NO_ES != void main(void){ char CaraCa = 'X'; for(;CaraCa NO_ES 'A';) CaraCa = getche();

El programa siguiente invierte la cadena ABCDEF a FEDCBA.


#include<stdio.h> void main(void){ char CadenaCd[] = "ABCDEF", TempCa; int IndiceIEn, IndiceJEn = 6; puts(CadenaCd); for(IndiceIEn = 0; IndiceIEn < 3; IndiceIEn++){ TempCa = CadenaCd[IndiceIEn]; CadenaCd[IndiceIEn] = CadenaCd[IndiceJEn]; CadenaCd[IndiceJEn--] = TempCa; } puts(CadenaCd);

El programa siguiente hace lo mismo que el anterior, pero ilustra el hecho de que en la parte de iniciacin pueden iniciarse ms de una variable, y en la parte de autoincremento/autodecremento pueden autoincrementarse/autodecrementarse ms de una variable.
#include<stdio.h> void main(void){ char CadenaCd[] = "ABCDEF", TempCa; int IndiceIEn, IndiceJEn = 6; puts(CadenaCd); for(IndiceIEn = 0; IndiceJEn =6; IndiceIEn < 3; IndiceIEn++, IndiceEn--){ TempCa = CadenaCd[IndiceIEn]; CadenaCd[IndiceIEn] = CadenaCd[IndiceJEn]; CadenaCd[IndiceJEn--] = TempCa; } puts(CadenaCd);

Pgina 58 de 208

Ingeniera y Ciencia de la Computacin El siguiente ejemplo ilustra la lectura y exhibicin de un vector.


#include <stdio.h> #include <conio.h> void main(void){ int AVcEn[5], IndiceEn; clrscr(); for(IndiceEn = 0; IndiceEn < 4; IndiceEn++) scanf("%d", &AVcEn[IndiceEn]); for(IndiceEn = 0; IndiceEn < 4; IndiceEn++) printf("%d", AVcEn[IndiceEn]);

Hugo Rangel

El siguiente ejemplo ilustra la iniciacin de vectores en tiempo de compilacin. En este caso no es necesario especificar explcitamente el nmero de elementos de los vectores que se inician en tiempo de compilacin, ya que el compilador se encarga de hacer esto.
#include <stdio.h> void main(void){ int AVcEn[] = {3, 7, 8, 9, 15, 2}, BVcEn[] = {3, 4, 6, 5, 2, 0}, CVcEn[6] ; int IndiceEn; for(IndiceEn = 0; IndiceEn < 6; IndiceEn IndiceEn++) CVcEn[IndiceEn] = AVcEn[IndiceEn] + BVcEn[IndiceEn]; for(IndiceEn = 0; IndiceEn < 6; IndiceEn++) printf("%d ", CVcEn[IndiceEn]); }

El ejemplo que sigue ilustra la lectura y exhibicin de una matriz.


#include <stdio.h> void main(void){ int AMtEn[3][3], IndiceIEn, IndiceKEn; /* Lectura de la matriz AMtEn */ for(IndiceIEn = 0; IndiceIEn < 3; IndiceIEn++) for(IndiceKEn = 0; IndiceKEn < 3; IndiceKEn++) scanf("%d", &AMtEn[IndiceIEn][ IndiceKEn]); /* Exhibicion de la matriz AmtEn */ for(IndiceIEn = 0; IndiceIEn < 3; IndiceIEn++){ for(IndiceKEn = 0; IndiceKEn < 3; IndiceKEn++) printf("%d", AMtEn[IndiceIEn][ IndiceKEn]); printf("\n"); } }

Pgina 59 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

El ejemplo siguiente suma dos matrices, e ilustra tambin la iniciacin de arreglos de dos dimensiones (matrices), obsrvese que se omite especificar la primera dimensin de las matrices, esto es opcional.
#include <stdio.h> void main(void){ int AMtEn[][3] = {3, 4, 6, 6, 7, 8, 7, 8, 5}, BMtEn[][3] = {0, 3, 5, 6, 7, 4, 11, 10, 5}, CMtEn[3][3]; int IndiceIEn, IndiceKEn; /* Suma de las matrices AMtEn y BMtEn */ for(IndiceIEn = 0; IndiceIEn <3; IndiceEn IndiceIEn++) for(IndiceKEn = 0; IndiceKEn < 3; IndiceKEn++) CMtEn[IndiceIEn][IndiceKEn] = AMtEn[IndiceIEn][IndiceKEn] + BMtEn[IndiceIEn][IndiceKEn]; /* Exhibicin de la matriz resultante: CMtEn */ for(IndiceIEn = 0; IndiceIEn < 3; IndiceIEn++){ for(IndiceKEn = 0; IndiceKEn < 3; IndiceKEn++) printf("%d", CMtEn[IndiceIEn][IndiceKEn]); printf("\n "); }

3.2.2 El enunciado iterativo while El enunciado while es otro enunciado iterativo que nos permite ejecutar uno o ms enunciados, que se encuentran en su alcance, cero o una mas veces. El siguiente diagrama muestra el curso del flujo en la ejecucin de este enunciado. Si la condicion es verdadera se ejecutan los enunciados en su alcance, de lo contrario el curso del flujo pasa al siguiente enunciado al while.

Condicin Verdadera Enunciado(s)

Falsa

Pgina 60 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

La sintaxis de este enunciado es la siguiente:


while (condicin) enunciado(s)

El siguiente ejemplo hace uso de un enunciado while.


#include <stdio.h> void main(void){ char CaraCa = A; while(CaraCa != 'X'); CaraCa = getche() }

El ejemplo que sigue es equivalente al anterior. Notese que el enunciado bajo el alcance del while ahora aparece como parte de la condicin del enunciado while.
#include <stdio.h> void main(void){ char CaraCa; } while((CaraCa = getche()) != 'X');

El enunciado for es completamente equivalente al enunciado while cuando no tiene parte de iniciacin y de autoincremento/autodecremento. Como se ilustra en el siguiente ejemplo:
#include <stdio.h> void main(void){ char CaraCa; for(; (CaraCa = getche()) != 'X' ;); }

Pgina 61 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

3.2.3 El enunciado iterativo do-while El enunciado do-while es tambin otro enunciado iterativo que nos permite ejecutar uno o ms enunciados, que se encuentran en su alcance, una mas veces. El siguiente diagrama muestra el curso del flujo en la ejecucin de este enunciado. Si la condicin es verdadera se ejecutan los enunciados en su alcance, de lo contrario el curso del flujo pasa al siguiente enunciado al del do-while.

Enunciado(s)

Condicin

y la sintaxis del enunciado do-while es la siguiente:


do enunciado(s) while (condicin);

El siguiente ejemplo simple ilustra el uso del enunciado do-while. En el alcance del enunciado del do-while solo se encuentra un enunciado: la lectura de un nmero entero (gris oscuro). La condicin (gris claro) verifica si ese nmero es menor o igual a 10, si es el caso, se vuelve a realizar la lectura, en caso contrario termina la ejecucin del programa.
#include <stdio.h>

Pgina 62 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

void main(void){ int NroEn; do{ } scanf("%d", &NroEn); }while(NroEn <= 10);

El ejemplo que sigue, algo ms elaborado que el anterior, muestra en la pantalla del monitor un men con tres opciones y una salida que indica el fin de la ejecucin del programa. La condicin verifica que la eleccin hecha este entre 1 y 4, en caso contrario vuele a mostrarse el men solicitando una nueva eleccin de parte del usuario
#include <stdlib.h> #include <conio.h> void main(void){ char LeyendasArCa[4][16] = {{"Soy la opcion 1"}, {"Soy la opcion 2"}, {"Soy la opcion 3"}, {"Se acabo ......"}}; int OpcionEn; do{ printf("1. Opcin_1\n"); printf("2. Opcin_2\n"); printf("3. Opcin_3\n"); printf("4. Salida\n"); printf("Seleccione un numero: "); scanf("%d", &OpcionEn); printf("\n"); }while (!((OpcionEn >= 1) && (OpcionEn <= 4))); } printf("%s\n", LeyendasArCa[OpcionEn - 1]);

3.9 Las instrucciones break y continue Estas instrucciones, clasificadas como de salida, son una forma de gotos. El ejemplo siguiente ilustra el uso de estas instrucciones. Se procesa una cadena de texto de la siguiente manera; se lee un carcter de una cadena y se exhibe en pantalla excepto por las tres condiciones siguientes:

1. Si el caracter es un punto " . " se inserta un blanco despus del punto en la


cadena de salida.

2. Si el caracter es una diagonal " / " avanzamos el cursor a la siguiente posicin


del tabulador. 3. Si hay dos diagonales consecutivas, se avanza el cursor al inicio de la siguiente lnea.

Pgina 63 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Ejemplo: #include <stdio.h> #include <conio.h> void main(void){ char sCd[] = " Este/ es/ un// mensaje. Para/ todo/ mundo.// "; int iEn, xEn, yEn; char cxCa; clrscr(); iEn = 0; gotoxy(1, 10); while (1){ cxCa = sCd[iEn++]; if(cxCa == '/'){ printf("\n"); continue; }else{ xEn = wherex(); yEn = wherey(); } } if (cxCa == '.') printf(" "); getche(); }

Pgina 64 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 65 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Captulo 4

Operadores de Relacin, Lgicos y la Categora de Figuras de Decisin

Pgina 66 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Objetivo general El alumno modelara, codificara y correr programas que incluyen algoritmos que requieren enunciados condicionales derivados del uso de rboles sistmicos. Contenido 4.0.- Introduccin 4.1.- Los operadores lgicos bsicos 4.1.1 I ntroduccin 4.1.2 La tabla de verdad para el operador lgico OR 4.1.3 La tabla de verdad para el operador lgico AND 4.1.4 La tabla de verdad para el operador lgico NOT 4.2.- Diagramas de flujo y el enunciado if-else 4.2.1 Introduccin 4.2.2 Diagramas de flujo 4.2.3 El enunciado if_else 4.3.- Diseo de decisiones con rboles sistmicos, parte I 4.3.1 Introduccin 4.3.2 El rbol bsico 4.3.3 Ejemplos 4.4.- Diseo de decisiones con rboles sistmicos, parte II 4.4.1 Introduccin 4.4.2 Ejemplos 4.5.- Diseo de decisiones con rboles sistmicos, parte III 4.5.1 Introduccin 4.5.2 Reglas 1 y 2 4.5.3 El proceso cosecuencial 4.6.- Diseo de decisiones con rboles sistmicos, parte IV 4.5.1 Introduccin 4.5.2 Los enunciados switch y break 4.5.3 El enunciado continue Objetivos especificos Luego de leer y estudiar cuidadosamente el material de esta unidad, usted tendr las habilidades necesarias para:

Pgina 67 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

1. Escribir expresiones lgicas correctas que utilizan operadores de relacin y/o operadores lgicos. 2. Hacer la prueba de escritorio de programas que usen enunciados de decisin 3. Planificar y escribir cdigo correcto utilizando como referencia el rbol sistmico 4. Reconocer la estrategia de divide y venceras en los rboles sistmicos. 5. Reconocer y valorar la utilidad del rbol sistmico en algoritmos que requieren enunciados condicionales.

4.1 Los operadores lgicos bsicos


4.1.1 Introduccin Un identificador lgico o boleano en el lenguaje C/C++ solo puede asumir uno de dos valores, el valor entero 0 (Falso) o el valor entero 1 (Verdadero). El operador lgico || es binario porque tiene dos operandos, uno a cada lado, por ejemplo en la expresin A || B, es decir A o B, los operandos son A y B. La tabla siguiente muestra los operadores lgicos o boleanos en el lenguaje C/C+ +. Operador || && Significado O lgico Y lgico No lgico

4.1.2 La tabla de verdad para el operador lgico OR


A continuacin tenemos la tabla de verdad de la expresin lgica A || B. Las dos primeras columnas muestran todas las combinaciones posibles (horizontalmente, lo sombreado) de valores de verdad para la expresin. La ltima columna es el resultado de evaluar la expresin para cada combinacin correspondiente. Valor lgico Valor lgico Resultado de asignado al asigando al evaluar la expresin operando A operando B lgica A || B
A A A A = = = = 0 0 1 1 B B B B = = = = 0 1 0 1 0 1 1 1

Pgina 68 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Por ejemplo, si consideramos la primera combinacin, es decir; si A = 0 (Falso) y B = 0 (Falso), entonces la expresin A || B, es decir A o B, se evalua como 0 (Falso), Para las siguientes tres combinaciones observse que la expresin se evalua como 1 (Verdadero). Otro ejemplo, si en la expresin lgica
A || (B || C),

tenemos que A = 1, B = 0 y C = 0

por prioridad primero se evalua la subexpresin


(B || C)

Notese que hay coincidencia entre los valores de B y C, y los de la primera combinacin en la tabla del y lgico, por lo que tenemos como resultado 0. Luego se evalua la expresin
A || (0)

Notese que hay coincidencia entre los valores de A y (0), y los de la tercera combinacin en la tabla del o lgico, con lo que tenemos como resultado para toda la expresin el valor de verdad 1 (Verdadero).

4.1.3 La tabla de verdad para el operador lgico AND


A continuacin se muestra la tabla de verdad de la expresin lgica A && B, es decir A y B. Al igual que en la tabla para el operador lgico ||, las dos primeras columnas muestran todas las combinaciones posibles (horizontalmente, lo sombreado) de valores de verdad para la expresin. La ltima columna es el resultado de evaluar la expresin para cada combinacin correspondiente. Valor lgico Valor lgico Resultado de asigando al asigando al evaluar la expresin operando A operando B lgica A && B
A A A A = = = = 0 0 1 1 B B B B = = = = 0 1 0 1 0 0 0 1

Por ejemplo, ahora consideramos la ltima combinacin, es decir; si A = 1 (Verdadero) y B = 1 (Verdadero), entonces la expresin A && B, es decir A y B,

Pgina 69 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

se evalua como 1 (Verdadera), Para las primeras tres combinaciones observese que la expresin se evalua como 0 (Falso). Otro ejemplo, si en la expresin lgica
A && (B || C),

tenemos que A = 1, B = 0 y C = 0

por prioridad primero se evalua la subexpresin


(B || C)

Notese que hay coincidencia entre los valores de B y c, y los de la primera combinacin en la tabla del o lgico, por lo que tenemos como resultado 0. Luego se evalua la expresin
A && (0)

Notese que hay coincidencia entre los valores de A y (0), y los de la tercera combinacin en la tabla del y lgico, con lo que tenemos como resultado para toda la expresin el valor de verdad 0 (Falso).

4.1.4 La tabla de verdad para el operador lgico NOT


Por ltimo, tenemos a la tabla de verdad de la negacin lgica, por ejemplo, en la expresin lgica !A, si el valor entero de A es 0, su negacin lgica da como resultado 1. Si el valor entero de A es 1, su negacin lgica da como resultado 0. Esto se resume en la siguiente tabla. Valor lgico Resultado asigando al evaluar operando A expresin lgica A A = 0 1 A = 1 0
A || (B && C),

de la Consideremos la siguiente expresin lgica para su evaluacin de acuerdo a las tablas de verdad bsicas previas

donde A = 0, B = 0 y C = 1

Primero se evalua, por razones de prioridad, la subexpresin


B

la que de acuerdo a la primera combinacin de la tabla de la negacin lgica el resultado es 1. Luego se evalua la subexpresin

Pgina 70 de 208

Ingeniera y Ciencia de la Computacin


(1 && C)

Hugo Rangel

la que de acuerdo con la cuarta combinacin de la tabla de verdad para el y lgico el resultado es 1. Finalmente se evalua la expresin
A || (1)

la que acuerdo con la segunda combinacin de la tabla de verdad para el o lgico el resultado es 1. Cualquier otra expresin lgica que incluya solo operadores lgicos puede ser evaluada de manera similar.

4.2 Diagramas de flujo y el enunciado if else


4.2.1 Introduccin
Suponga que esta codificando un programa que admite una larga lista de nmeros enteros. El programa debe de contar el nmero de enteros pares (Contador_pares) y el nmero de enteros impares (Contador_nones) que ingresan. Antes de incrementar uno de los contadores debe tomarse una decisin para determinar que contador incrementar cada vez que ingresa un entero. Este es un ejemplo en el que se requiere de un enunciado condicional.

4.2.2 Diagramas de flujo


Es caracterstico de un enunciado condicional ejecutar otro(s) enunciado(s) si se cumple una condicin predeterminada como lo muestra el siguiente diagrama de flujo: si la Condicin es Verdadera se ejecuta(n) los Enunciado(s)_B, en caso contrario se ejecutan los Enunciado(s)_A

Condicin Falsa Enunciado(s)_A Verdadera Enunciado(s)_B


Pgina 71 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Como un ejemplo consideremos el problema enunciado en la introduccin de esta unidad, el cual queda como sigue - en trminos de un diagrama de flujo. Notse que en la condicin - Nro%2 == 0 - se utiliza el operador mdulo (%) para verificar si el valor es par o impar. El operador mdulo es un operador binario por tener dos operandos, uno a la izquierda (en nuestro caso Nro) y otro a la derecha (en nuestro caso 2).

Nro%2 == 0 Falso Contador_Nones++ Verdadero Contador_Pares++

En esta unidad el alumno aprendera a disear decisiones utilizando el rbol sistmico. Esta habilidad ser particularmente de gran importancia en algoritmos en los que intervienen enunciados de decisin. 4.2.3

El enunciado if - else

La instruccin if nos permite tomar una de dos acciones, la forma general de la instruccin if es la siguiente:
if(condicin) instruccin(es)_A Pgina 72 de 208

Ingeniera y Ciencia de la Computacin


else instruccin(es)_B

Hugo Rangel

Esta forma de dos alternancias tiene una forma particular: una alternancia.
if(condicin) instrucci(es)

La primera forma tiene tambin una forma general que aparece con frecuencia en las aplicaciones: la alternancia mltiple, la cual tiene la forma siguiente:
if(condicin_A) instruccin(es)_A else if(condicin_B) instruccin(es)_B else if(condicin_C) - - - - - - - - else if(condicin_Y) instruccin(es)_Y else instruccin(es)_A

El ejemplo siguiente usa una instruccin if de dos alternancias para comparar dos valores enteros. Se imprime el valor menor.
#include <stdio.h> void main(void){ int AEn, BEn; /* Lectura de los valores de AEn y BEn */ scanf("%d %d", &AEn, &BEn); /* Comparacin de los valores de AEn y BEn */ if(AEn <= BEn) printf("%d ", AEn); else /* AEn > BEn */ printf("%d ", BEn); }

El ejemplo siguiente es una generalizacin del anterior, incluye un if con alternancias mltiples, se exhibe el valor de la variable que sea menor los valores de las dos variables si estos son iguales.
#include <stdio.h> void main(void){ int AEn, BEn; /* Lectura de los valores de AEn y BEn */ scanf("%d %d", &AEn, &BEn); /* Comparacin de los valores de AEn y BEn */ if(AEn < BEn) printf("%d ", AEn); else if(AEn == BEn)

Pgina 73 de 208

Ingeniera y Ciencia de la Computacin


printf("%d %d", AEn, BEn); else /* AEn > Ben */ printf("%d ", BEn);

Hugo Rangel

4.3 Diseo de decisiones con rboles S, parte I


4.3.1 Introduccin Los rboles de decisin han sido una de las herramientas de la ingeniera programtica (sistemas de software) de poco uso en la practica. En la literatura el diseo de un rbol de decisin se presenta de manera prcticamente intuitiva, se enfatiza ms su aspecto grfico como una gran ventaja y no su planteamiento sistemtico. En esta unidad y las tres siguientes, hacemos uso de los rboles sistmicos rboles S los cuales son estructuras formales que modelan, la solucin de un problema. Estas estructuras utilizan intrinsicamente la estrategia de divide y vencers. Por lo que son un excelente ejemplo de esta estrategia, la cual es de uso comn en todo diseo e implementacin de cualquier algoritmo, por lo que el dominio de esta estrategia y su herramienta de parte del aprendiente debe de otorgarle una mayor habilidad para el diseo e implementacin de estos. El nombre de rbol sistmico o rbol S - es en realidad el nombre de un modelo didctico ontolgico, derivado con la metodologa de la programtica educacional. Este MODO consta de una definicin, cuatro reglas y por supuesto de la estructura de rbol al cual se aplican la definicn y las reglas. El aprendiente debe estar consciente de que su xito en el diseo de rboles S depende de que sea disciplinado (dedicado y sistemtico) en el uso de ellos, es decir, debe resolver suficientes problemas de esta categora aplicando las reglas rigurosamente en cada caso.

Pgina 74 de 208

Ingeniera y Ciencia de la Computacin 4.3.2 El rbol bsico

Hugo Rangel

Se introducen dos definiciones y tres reglas para la obtencin y sntesis de un rbol S. Definicin 1. Un rbol S bsico es una jerarqua de nodos (puntos de decisin), los que a su vez originan otros nodos u hojas (acciones). Es condicin necesaria y suficiente que en un rbol S bsico solo aparezcan en sus nodos los operadores de relacin <, = y >. La figura siguiente muestra un rbol S simple (un solo nivel de nodos o puntos de descisin). Bajo el alcance (debajo) de cada nodo de descisin se encuentra la hoja o accin que se toma bajo la descisin correspondiente.

opdoA < opdoB

opdoA = opdoB

opdoA > opdoB

accin A

accin B

accin C

Se ilustra ahora, con un ejemplo simple, la definicin dada. 4.3.3 Ejemplos Sean AEn y BEn dos enteros, se exhibe el menor de ellos o ambos si son iguales. Al comparar a AEn y BEn para saber cual es menor o si son iguales, solo caben las tres siguientes posiblidades: AEn < BEn AEn = BEn AEn > BEn

Para el primer caso, AEn resulta ser la variable con el menor valor, por lo que se exhibe este valor. En el segundo caso resulta que los valores de AEn y BEn son iguales por lo que se exhiben ambos, y en el tercer caso, la variable con el menor valor es BEn por lo ser exhibe el valor de esta variable. El rbol S bsico resultante es el siguiente:

AEn < BEn

AEn = BEn

AEn > BEn

Exhibir AEn

Exhibir AEn y BEn

Exhibir CEn

Pgina 75 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Lo sorprendente es que un arbol de decision es la forma grafica de un condicional, para apreciar esto integremos al arbol el condicional correspondiente como sigue:

If(AEn < BEn)

else If(AEn == BEn)

else // (AEn > BEn)

Exhibir AEn

Exhibir AEn y BEn

Exhibir CEn

El codigo correspondiente a este rbol se muestra enseguida if(AEn < BEn) printf(%d, AEn); else if(AEn == BEn) printf(%dn %d, AEn, BEn); else//AEn > BEn printf(%d, BEn); Notse la correspondencia tan directa que existe entre el arbol de decision y el codigo que le corresponde. Observe tambien que el problema es resuelto mediante el rbol y no directamente con el cdigo. Estas cualidades, y otras, son las que hacen tan tiles a los rboles de decisin en el diseo de decisiones. Para mostrar otra de las cualidades de los arboles de decisin, la de subdividir un problema en subproblemas ms simples de resolver, consideremos una generalizacin del problema anterior. Sean AEn, BEn y CEn variables enteras, se exhibe la menor de ellas, o dos de ellas si son iguales y menores a la tercera, o las tres si son iguales. Considerar todas las posibles comparaciones que puedan darse entre las tres variables puede ser problematico, por lo que consideremos primero comparar a las variables AEn y BEn, por el ejemplo anterior nos percatamos que este problema (subproblema) ya lo tenemos resuelto

Pgina 76 de 208
AEn < BEn AEn = BEn AEn > BEn

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Ahora consideremos uno a uno, los tres posibles casos, yendo de izquierda a derecha. Empecemos con AEn < BEn, la comparacin nos dice que AEn tiene un valor menor que BEn, por lo que en el siguiente nivel inferior debemos comparar a AEn con CEn, es decir :

Consideremos ahora a A = B, puesto que ambos son iguales podemos tomar a cualquiera de las dos variables y compararla con C, por ejemplo:
A<C A=C A>C

A<B

A=B

A>B

A<B

A=B

A>B

A<C

A=C

A>C

A<C

A=C

A>C

Consideremos ahora a A > B, la comparacion nos dice que la variable con el menor valor es B, por lo que debemos comparar a B con C en el siguiente nivel, es decir:

A<B

A=B

A>B

A<C

A=C

A>C

A<C

A=C

A>C

B<C

B=C

B>C

Pgina 77 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Notese que el problema original lo hemos subdividido en dos subproblemas mas faciles de tratar, en el primero comparamos solo a A y B, primer nivel del arbol, en el segundo subproblema, comparamos a C con quien resulte menor al comparar a A y B, segundo nivel del arbol. Finalmente consideremos las acciones que se deben de tomar bajo cada una de las rutas de las condiciones, empezando desde la raiz hasta la accion correspondiente. Por ejemplo, la ruta dada por las decisiones A < B y A < C nos dice que la variable A tiene el valor menor, considerando de la misma manera cada ruta tenemos por consiguiente:

A<B

A=B

A>B

A<C

A=C

A>C

A<C

A=C

A>C

B<C

B=C

B>C

ExhibeA

ExhibeA y C

ExhibeC

ExhibeA y BExhibe A,B y C

ExhibeC

ExhibeB

ExhibeB y C

ExhibeC

El siguiente ejemplo es una generalizacin del anterior, incluye 3 if con alternancias mltiples anidadas en otro if con alternancia mltiple, se imprime el valor de la variable que resulte menor, o los valores de dos de ellas si estos son iguales y menores a la tercera, o los valores de las tres si estas son iguales.
#include <stdio.h> void main(void){ int AEn, BEn, CEn; /* Lectura de los valores de AEn, BEn, CEn */ scanf("%d %d %d", &Aen, &BEn, &Cen); /* Comparacin de los valores de AEn, BEn, CEn */ if(AEn < BEn) if(AEn < CEn) printf("%d ", AEn); else if(AEn == CEn) printf("%d %d ", AEn, CEn); else /* Aen > CEn */ printf("%d ", CEn) else if(AEn == BEn) if(Aen < Cen) printf("%d %d ", AEn, BEn); else if(AEn == CEn)

Pgina 78 de 208

Ingeniera y Ciencia de la Computacin


printf("%d %d %d ", AEn, BEn, CEn); else /* AEn > CEn */ printf("%d ", CEn); else /* AEn > BEn */ if (BEn < CEn) printf("%d ", BEn); else if(BEn == CEn) printf("%d %d ", BEn, CEn); else /* BEn > CEn */ printf("%d ", CEn); }

Hugo Rangel

4.4 Diseo de decisiones con rboles S, parte II


4.4.1 Introduccin En los ejemplos anteriores hemos vistyo que los rboles sistmicos son una excelente herramienta para el diseo de desiciones en la programacin estructurada. Por otra parte es una herramienta que incorpora e manera intrinsica la estrategia de divede y vencers. Esta estrategia es de uso muy comn en el diseo de algoritmos. En esta segunda parte continuamos con el diseo de descisiones con rboles S. Se presentan dos ejemplos, el primero es una generalizacin del ltimo ejemplo visto en la parte I y el segundo es una generalizacin del primer ejemplo visto en esta segunda parte. 4.4.2. Ejemplos Se intercalan los valores enteros de dos vectores en un tercer vector. Los elementos enteros de los vectores AVcEn y BVcEn estn ordenados de menor a mayor. Los elementos del vector resultante CVcEn tambin estn ordenados de menor a mayor. Se permiten que aparezcan enteros repetidos en los vectores.

AVcEn < BVcEnj

AVcEni = BVcEnj

AVcEni > BVcEnj

DVcEn [lEn] AVcn [iEn] lEn lEn+1 iEn iEn+1

DVcEn [lEn] AVcEn [iEn] lEn lEn+1 DVcEn [lEn] BVcEn [jEn] iEn iEn+1 jEn jEn+1 IEn iEn+1

DVcEn [lEn] BVcEn [jEn] lEn lEn+1 jEn jEn+1

#include <stdio.h>

Pgina 79 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

void main(void){ int AVcEn[10], BVcEn[10], CVcEn{20]; int IndiceIEn, IndiceJEn, IndiceKEn, LonAVcEn = 5, LonBVcEn = 8; /* Lectura de los valores del vector AVcEn */ for(IndiceIEn = 0; IndiceIEn < LonAVcEn; IndiceEn++) scanf("%d", &AVcEn[IndiceIEn]); /* Lectura de los valores del vector BVcEn */ for(IndiceJEn = 0; IndiceJEn < LonBVcEn; IndiceJEn++) scanf("%d", &BVcEn[IndiceJEn]); IndiceIEn = IndiceJEn = IndiceKEn =0; /* Comparacin de los valores de los vectores AVcEn y BVcEn */ for(;IndiceIEn <= LonAVcEn;) if(AVcEn[IndiceIEn] < BVcEn[IndiceJEn]) CVcEn[IndiceKEn++] = AVcEn[IndiceIEn++]; else if(AVcEn[IndiceIEn] == BVcEn[IndiceJEn]){ CVcEn[IndiceKEn++] = AVcEn[IndiceIEn++]; CVcEn[IndiceKEn++] = BVcEn[IndiceJEn++]; }else /* AVcEn[IndiceIEn] > BVcEn[IndiceJEn] */ CVcEn[IndiceKEn++] = BVcEn[IndiceJEn++]; /* Exhibicin del vector resultante*/ for(IndiceIEn = 0; IndiceIEn < (LonAVcEn + LonBVcEn); IndiceIEn++) printf("%d ", CVcEn[IndiceIEn]); }

Este ejemplo asume la presencia de un centinela al final de los vectores AVcEn y BVcEn. Los centinelas son el valor mas grande que es posible asignar y deben tener el mismo valor. Esto asegura que los dos vectores, independientemente del nmero de elementos que tengan, se agotan al mismo tiempo.

Pgina 80 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

El siguiente ejemplo es una generalizacin del anterior. Tres vectores: AVcEn, BVcEn y CVcEn, con sus valores enteros ordenados ascendentemente, se intercalan sus valores en orden ascendente en un cuarto vector: DVcEn. Tanto en el rbol S como en el cdigo, el sombreado oscuro corresponde a los condicionales externos y el sombreado claro a los condicionales internos (anidados).
AVcEn [iEn] < BVcEn [jEn] AVcEn [iEn] = BVcEn [jEn] AVcEn [iEn] < BVcEn [jEn]

AVcEn [iEn[ < CVcEn [kEn]

AVcEn [iEn] < CVcEn [kEn]

BVcEn [jEn] < CVcEn [kEn]

BVcEn [jEn] < CVcEn [kEn]

AVcEn [iEn] = CVcEn [kEn]

AVcEn [iEn] < CVcEn [kEn]

AVcEn [iEn] < CVcEn [kEn]

BVcEn [jEn] = CVcEn [kEn]

AVcEn [iEn] = CVcEn [kEn] Dl Ai DVcEn [lEn] l l+1 AVcEn [iEn] Dl Ck l l+1 l l+1 I i+1 I i+1 k k+1 Dl Ai l l+1 Dl Ck l l+1 I i+1 k k+1

Dl Ck l l+1 k k+1 Dl Ai l l+1 Dl Ck l l+1 I i+1 k k+1

Dl Ai l l+1 I i+1

Dl Ck l l+1 k k+1

Dl Ai l l+1 I i+1

Dl Ck l l+1 k k+1

Pgina 81 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

#include <stdio.h> /* Tres vectores con valores enteros; AVcEn, BVcEn y CVcEn, ordenados ascendentemente, se intercalan tambin en orden ascendente en un cuarto vector resultante; DVcEn. Se exhibe el vector resultante. */ void main(void){ int AVcEn[10], BVcEn[10], CVcEn[20], DVcEn[10]; int iEn, jEn, kEn, dimAVcEn = 5, dimBVcEn = 8 dimCVcEn = 7, dimDVcEn; // Lectura de los valores del vector AVcEn for(iEn = 0; iEn < dimAVcEn; iEn++) scanf("%d", &AVcEn[iEn]); // Lectura de los valores del vector BVcEn for(jEn = 0; jEn <dimBVcEn; jEn++) scanf("%d", &BVcEn[jEn]); // Lectura de los valores del vector CVcEn for(kEn = 0; kEn < dimCVcEn; kEn++) scanf("%d", &CVcEn[kEn]); // Se inician en ceros las variable enteras: iEn, jEn, kEn, lEn iEn = jEn = kEn = lEn = 0; // Comparacin de los valores de los vectores AVcEn, BVcEn y CVcEn for(;iEn <= dimAVcEn;) if(AVcEn[iEn] < BVcEn[jEn]) if(AVcEn[iEn] < CVcEn[kEn]) DVcEn[lEn++] = AVcEn [iEn++]; else if(AVcEn[iEn] == CVcEn[kEn]){ DVcEn[lEn++] = AVcEn[iEn++]; DVcEn[lEn++] = CVcEn[kEn++];

Pgina 82 de 208

Ingeniera y Ciencia de la Computacin


}else /* AVcEn[iEn] > CVcEn[kEn] */ DVcEn[lEn++] = CVcEn[kEn++]; else if(AVcEn[iEn] == BVcEn[jEn]) if(AVcEn[iEn] < CVcEn[kEn]){ DVcEn[lEn++] = AVcEn[iEn++]; DVcEn[lEn++] = BVcEn[jEn++]; }else if(AVcEn[iEn] == CVcEn[kEn]){ DVcEn[lEn++] = AVcEn[iEn++]; DVcEn[lEn++] = BVcEn[jEn++]; DVcEn[lEn++] = CVcEn[kEn++]; }else /* AVcEn[iEn] > CVcEn[kEn */ DVcEn[lEn++] = CVcEn [kEn++]; else /* AVcEn[iEn] > BVcEn[jEn] */ if(BVcEn[jEn] < CVcEn[kEn]) DVcEn[lEn++] = BVcEn[jEn++]; else if(BVcEn[jEn] == CVcEn[kEn]){ DVcEn[lEn++] = BVcEn[jEn++]; DVcEn[lEn++] = CVcEn[kEn++]; }else /* BVcEn[iEn] > CVcEn[kEn] */ DVcEn[lEn++] = CVcEn[kEn++]; /* Exhibicin del vector resultante*/ dimDVcEn = dimAVcEn + dimBVcEn + dimCVcEn; for(iEn = 0; iEn < dimDVcEn; iEn++) printf("%d ", CVcEn[iEn]);

Hugo Rangel

Pgina 83 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

4.5 Diseo de decisiones con rboles S, parte III


4.5.1 Introduccin En esta parte III introducimos dos reglas de simplificacin, la primera de ellas es intuitiva, la segunda no. Las ilustramos con dos ejemplos, siendo el segundo una generalizacin del primero. 4.5.2 Reglas 1 y 2 Considere la siguiente matriz esparcida (una con la mayora de las entradas iguales a cero). 0 0 0 0 0 0 3 0 0 0 7 0 0 0 2 0 0 0 0 0 0 0 0 Se almacenan las entradas diferentes de cero con su posicin en un vector como sigue: X = 5 0 1 1 3 | 2 0 7 | 2 3 1 | 3 1 2 | 5

A= 1 0

Se ha colocado el vector en forma horizontal, no vertical, por razones de espacio. Ntese que la trada 1 1 3, corresponde a la posicin 1 1 del valor 3, en la matriz A, y as sucesivamente. Ntese tambin que el valor con su posicin

Pgina 84 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

correspondiente se han almacenado en el vector barriendo la matriz por hileras. La trada 5 5 0 es el centinela. El problema consiste en localizar el valor en la posicin h(ilera), c (olumna). i(ndice) es el indice del vector X. Notese que el primer componente de las triadas en el vector es la hilera de la matriz A, la segunda componente es la columna y la tercera es el valor en esa hilera y columna.

XVcEn [iEn] < hEn

XVcEn [iEn] = hEn

XVcEn [iEn] > hEn

XVcEn [iEn+1] < cEn

XVcEn [iEn+1] = cEn

XVcEn [iEn+1] > cEn

iEn iEn+3

iEn iEn+3

ValorEn XVcEn [iEn+2]

ValorEn 0

ValorEn 0

while(1) If(X[i] < h) i = i + 3; else if(X[i] == h) if(X[i+1] < c) i = i + 3; else if(X[i+1] == c){ Valor = X[i+2]; escape; }else{ // X[i+1] >c Valor = 0; escape; }else{ // X[i] < h Valor = 0; escape; }
Figura 4. Ntese que el primer nivel de condicionales resuelve el subproblema de localizar la hilera h, y el segundo nivel resuelve el subproblema de localizar la columna c. El sombreado en los nodos es para aplicarles la Regla 1 la cual se define enseguida.

Regla 1. Un rbol S puede simplificarse (contraerse) verticalmente si sus puntos de decisin a lo largo de una rama se unen mediante la conectiva lgica y.
XVcEn [iEn] < XVcEn Regla 1 al rbol anterior (Figura 4) obtenemos el [iEn] > XVcEn siguiente Despus de aplicar la [iEn] = En y Xi+1 < c y y hEn hEn Xi+1 = c Xi+1 > c rbol S (Figura 5) Xi = h Xi = h

IEn iEn+3

IEn iEn+3

ValorEn XVcEn [iEn+2]

ValorEn 0

ValorEn 0

Figura 5. rbol S resultante despus de aplicar la Regla 1 a los nodos sombreados de la Figura 4. Los nuevos nodos en el rbol son los 2, 3 y 4. En Pgina 85 de 208 esta figura se muestran dos pares de nodos sombreados; dos a la izquierda y dos a la derecha a los cuales se les aplica la Regla 2, la que se define ms adelante.

Ingeniera y Ciencia de la Computacin

Hugo Rangel

La regla siguiente no resulta ser nada intuitiva para la mayora de la gente. Regla 2 . Un rbol S puede simplificarse (contraerse) horizontalmente mediante la conectiva o inclusiva, si dos o ms puntos de decisin provienen de un mismo punto de decisin y sus respectivos subrboles son idnticos. Esta regla se puede aplicarse a las ramas 1 y 2, y a las ramas 4 y 5, del rbol anterior ya que cumplen con esta regla. Como consecuencia de aplicar esta regla tenemos el siguiente rbol equivalente al anterior.

(XVcEn [iEn] < hEn) O (XVcEn[iEn] = hEn y XVcEn [iEn+1] < cEn)

(Xi = h) y (Xi+1 = c)

(Xi > h) O (Xi = h y Xi+1 > c)

i i+3

Valor Xi+2

valor 0

El cdigo correspondiente para esta rbol simplificado es el siguiente: while(1) If((X[i] < h) || ((X[i] == h) && (X[i+1] < c))) i = i + 3; else if((X[i] == h) && (X[i+1] < c)){ valor = X[i+2]; Pgina 86 de 208 escape; }else // (X[i] > h || ((X[i] = h) && (X[i+1] > c))){

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Este cdigo es completamente equivalente al anterior, es decir, realizan la misma tarea. Observese que la definicin de rbol bsico siempre nos permite el diseo de decisiones con condiciones sin negaciones. 4.5.3 El proceso cosecuencial Ahora consideremos tres ejemplos que nos van a llevar a la idea de procesos cosecuenciales, es decir, a una pauta de diseo que parece ser ms comn de lo que se podra pensar. Primero consideremos un generalizacin del ejemplo 2. Tenemos dos vectores, X y Y, con enteros almacenados en orden ascendente, pueden repetirse algunos valores. La idea es intercalar en orden ascendente, en un tercer vector, los valores contenidos en los vectores X Considere como ejemplos particulares los vectores X y Y siguientes. Ntese que al final aparece el centinela, 100, el mismo valor ms grande que se puede colocar al final de ambos vectores. Tambin se muestra el vector resultante W, el cual contiene los valores de X y Y tambin en orden ascendente. X = {2 5 7 12 23 100} Y = {3 5 5 8 16 45 50 100} W = {2 3 5 5 5 7 8 12 16 23 45 50 100 100}

A < Bj

Ai = Bj

Ai > Bj

Ai < Ck

Ai = Ck

Ai > Ck

Ai < Ck

Ai = Ck

Ai > Ck

Bi < Ck

Bi = Ck

Bi > Ck

Dl Ai l l+1 I i+1

Dl Ai l l+1 Dl Ck l l+1 I i+1 k k+1

Dl Ck l l+1 k k+1

Dl Ai l l+1 Dl Bj l l+1 i l+1 j j+1

Dl Ai l l+1 Dl Bj l l+1 Dl Ck l l+1 i l+1 j j+1 k k+1

Dl Ck l l+1 k k+1

Dl Bj l l+1 j j+1

Dl Bj Dl Ck l l+1 j j+1 k j+1

Dl Ck l l+1 k k+1

Fig. X rbol S que muestra la lgica para intercalar los valores de dos vectores en uno tercero, los dos vectores X y Y, y el vector resultante W, estn ordenados ascendentemente

Pgina 87 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Como un segundo ejemplo consideremos una generalizacin del ejemplo XXX. Tenemos dos matrices esparcidas, A y B, representadas en forma vectorial, la idea es sumar las dos matrices, pero usando su forma vectorial, X y Y, para obtener un tercer vector, W, que representa a la matriz resultante C, la suma de las matrices A y B. Consideremos, como un ejemplo particular, a las siguientes matrices A 0 0 0 0 0 0 2 0 7 0 0 0 0 0 0 0 4 0 0 0 0 0 0 1 0 B 0 0 0 0 0 8 0 -7 0 0 0 0 0 0 3 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 C 0 2 8 0 0 0 0 0 0 3 5 4 0 0 0 0 0 0 1 0

Los vectores correspondientes que representan a estas matrices son los siguientes:

112|134|317|341|550 341|423|550

035|218|31-7|423|550

035|112|134|218|

Por razones de espacio los vectores se representan horizontalmente, separando con una lnea vertical (|) cada tres de nmeros; el primero representa la hilera, el Xi Xi = Yk Xi Yk segundo la < Yk columna y el tercero el valor en esa hilera y columna.>Cada trada de nmeros se almaceno barriendo las matrices de izquierda a derecha y de arriba hacia abajo es decir por hileras. La trada 550 es el centinela, representa una hilera y columna ficticias con una entrada igual a cero.
Xi+1 < Yk+1 Xi+1 =Yk+1 Xi+1 > Yk+1

Xi+2 +Yk+2 =0

Xi+2 +Yk+2 <> 0

Wj Xi j j+3 i i+3

Wj Xi k k+3 i i+3

i i+3 k k+3

Wj Xi+2 + yk+2 i I+3 k k+3 j j+3

Wj Yk j j+3 k k+3

Wj Yk j k+3 k k+3

Fig, X rbol S que muestra la lgica de sumar dos matrices esparcidas, A y B, utilizando la representacin vectorial, X y Y, de las matrices A y Pgina 88 de 208 B, para obtener un tercer vector resultante W, que se corresponde con la matriz resultante C.

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Unamos ahora las tres condiciones sombreadas del segundo nivel con la condicin sombreada del primer nivel aplicando la regla 1. Obtenemos el siguiente rbol equivalente

Xi < Yk

(Xi = Yk) y (Xi+1 =Yk+1)

Xi > Yk

(Xi = Yk) y (Xi+1 < Yk+1)

(Xi = Yk) y (Xi+1 > Yk+1)

Xi+2 +Yk+2 =0

Xi+2 +Yk+2 <> 0

Wj Xi j j+3 i i+3

Wj Xi k k+3 i i+3

i i+3 k k+3

Wj Xi+2 + yk+2 i I+3 k k+3 j j+3

Wj Yk j j+3 k k+3

Wj Yk j k+3 k k+3

Si ahora aplicamos la regla 2, a las dos condiciones sombreadas a la izquierda y a las dos sombreadas de la derecha, obtenemos el siguiente rbol simplificado: (Xi = Yk) y (Xi+1 =Yk+1)
(Xi < Yk) o (Xi+1 < Yk+1) (Xi > Yk) o (Xi+1 > Yk+1)

Xi+2 +Yk+2 =0

Xi+2 +Yk+2 <> 0

Wj Xi j j+3 i i+3

i i+3 k k+3

Wj Xi+2 + Yk+2 i I+3 k k+3 j j+3

Wj Yk j k+3 k k+3

Pgina 89 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 90 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

4.6 Diseo de programas con rboles S, parte IV


La siguiente regla la ilustraremos tambin mediante un ejemplo. Considere el caso en el que el cursor debe permanecer dentro de los limites de una ventana, como se ilustra a continuacin.
X0 Y0

Xc Yc

Xf Yf

Los movimientos del cursor permitidos son: arriba, abajo, a la derecha y a la izquierda. Este problema puede dividirse en cinco subproblemas como sigue: El primer subproblema es determinar que tecla de flecha se puls. El rbol S siguiente resuelve el primer subproblema.

Pgina 91 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

TECLA=

TECLA =

TECLA =

TECLA=

SUBPRO A

SUBPRO B

SUBPRO C

SUBPRO D

Notese que no aparecen completas las condiciones de un rbol bsico, faltan las siguientes: (TECLA < (TECLA < (TECLA < (TECLA < , TECLA > ) (TECLA ) , TECLA > ) (TECLA ) , TECLA > (TECLA ) ) , TECLA > ) (TECLA )

El smbolo significa es equivalente a, y el smbolo es diferente a. Todas estas condiciones no nos interesan, es decir, son condiciones que no importan, estas condiciones pueden suprimirse o agregarse al final del rbol como un sola, mediante conectivas o inclusivos, para que sea la condicin que se da por omisin (del condicional ) como sigue: (TECLA ) o (TECLA ) o (TECLA ) o (TECLA ) las acciones bajo estas condiciones pueden ser cualesquiera y se igualan entre si, es decir si las acciones bajo las 8 condiciones son: A, B, C, D, E, F, G y H, entonces A=B=C=D=E=F=G=H = X, donde X es una accin conveniente al problema, por ejemplo en nuestro caso que nos ocupa podra ser el siguiente mensaje al usuario: mensaje(Presione una tecla de flecha)

TECLA =

TECLA =

TECLA =

TECLA =

C.P.O.

Pgina 92 de 208
SUBPRO A SUBPRO B SUBPRO C SUBPRO D

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Donde C.P.O. significa Condicin Por Omisin y el smbolo significa no importa, es decir:
C.O.P. = (TECLA ) o (TECLA ) o (TECLA ) o (TECLA )

= mensaje(Presione una tecla de flecha)

While(Bandera = Escape) switch(TeclaPulsadaN){ case Cero: switch(TeclaPulsada0){ case <-: Subproblema A, mantener el cursor a la derecha de x0; break; case ->: Subproblema B, mantener el cursor a la izquierda de xf break; case |: Subproblema C, mantener el cursor debajo de y0 break; case |: Subproblema D, mantener el cursor arriba de yf break; default: printf(Presione una tecla de While(Bandera = Escape) switch(TeclaPulsadaN){ case Cero: switch(TeclaPulsada0){ case <-: Subproblema A, mantener el cursor a la derecha de x0; break; case ->: Subproblema B, mantener el cursor a la izquierda de xf break; case |: Subproblema C, mantener el cursor debajo de y0 Pgina 93 de 208 break; case |: Subproblema D, mantener el cursor arriba de yf

Ingeniera y Ciencia de la Computacin

Hugo Rangel

default: printf(Presione una tecla de flecha); break;

Consideremos ahora la solucin del subproblema A; mantener el cursor a la derecha de x0, esto significa que la coordenada xc del cursor nunca debe estar sobre x0 (debemos evitarla), o a la izquierda de x0 (esta es una condicin no importa). Para evitar que xc este sobre x0 debemos anticiparlo restndole 1 a xc, ya que el incremento en la coordenada x es hacia la derecha y el cursor avanza en sentido contrario, es decir:

X0 < Xc - 1

X0 = Xc -1

C.P.O. = X0 > Xc - 1

Avanza cursor a la izquierda

Suena campana

= Suena campana

La condicin por omisin es una condicin no importa, por lo que su accin se hace igual a la accin de la izquierda (suena campana) y podemos aplicar la regla 2.

X0 < Xc - 1

X0 >= Xc -1

Avanza cursor a la izquierda

Suena campana

Pgina 94 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Podemos integrar el cdigo correspondiente al de este rbol, al cdigo que resuelve el primer subproblema como sigue:

While(Bandera = Escape) switch(TeclaPulsadaN){ case Cero: switch(TeclaPulsada0){ case <-: Subproblema A, //mantener el cursor a la derecha de x0 if(x0 < xc 1) gotoxy(--xc, yc); else // x0 >= Xc 1 Suena campana break; case ->: Subproblema B, mantener el cursor a la izquierda de xf break; case |: Subproblema C, mantener el cursor debajo de y0 break; De manera similar pueden resolverse los tres subproblemas restantes. Este ejemplo nos permite establecer una tercera regla. Regla 3 Una condicin no importa en un rbol S, puede omitirse o se integra como una condicin por omisin con una accin conveniente al problema o se le aplica la regla 2. 4.6.1 Introduccin 4.6.2 Los enunciados switch y break

Pgina 95 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

La instruccin switch es una alternativa a condicionales anidados. La cual tiene la siguiente forma general:
switch(caso){ case constante_1: enunciado(s)_1 break; case constante_2: enunciado(s)_2 break; - - - - - - - - - - - case constante_N: enunciado(s)_N break; default: enunciado(s)_X }

Este enunciado switch anterior es equivalente al siguiente enunciado de if anidados:


If (caso == constante_1) enunciado(s)_1 else if(caso == constante_2) enunciado(s)_2 _ _ _ _ _ _ _ _ _ else if(caso == constante_N) enunciado(s)_N else // defalut: enunciado(s)_X

A continuacin se presenta un ejemplo donde se ilustra el uso del enunciado y switch.


void main(void){ char OpcionCa, SsNn; int AEn, BEn; while(1){ do{ printf("\n (S)uma de dos numeros enteros "); printf("\n (R)esta de dos numeros enteros "); printf("\n (P)roducto de dos numeros enteros "); printf("\n (D)ivision de dos numeros enteros "); printf("\n (N)o mas "); printf("\n\nSeleccione o S, o R, o P, o D, o N: "); fflush(stdin); scanf("%c", &OpcionCa); printf("\n"); }while (OpcionCa != 'S' && OpcionCa != 'R' && OpcionCa != 'P' && OpcionCa != 'D' && OpcionCa != 'N');

Pgina 96 de 208

Ingeniera y Ciencia de la Computacin


if(OpcionCa == 'N'){ puts("Hasta la vista !\n"); break; }

Hugo Rangel

puts("\nDame el par de valores de AEn y BEn separados por un espacio en blanco\n"); scanf("%d %d", &AEn, &BEn); switch (OpcionCa) { case 'S': printf("%d break; case 'R': printf("%d break; case 'P': printf("%d break; case 'D': printf("%d break; } + %d = %d\n",AEn, BEn, AEn + BEn); - %d = %d\n",AEn, BEn, AEn - BEn); * %d = %d\n",AEn, BEn, AEn * BEn); / %d = %d\n",AEn, BEn, AEn / BEn);

} }

puts("\nOtro Ejemplo ? S o s = Ssi, N o n = Nno: "); fflush(stdin); scanf("%c", &SsNn); if((SsNn == 'N') || (SsNn == 'n')){ puts("\nSe acabo el veinte !"); break; }

4.6.4 El enunciado continue #include <stdlib.h> #include <conio.h> /* void IngresarFn(void){ printf("Estoy en Ingresar\n"); } void SuprimirFn(void){ printf("Estoy en Suprimir\n"); } void RevisarFn(void){ printf("Estoy en Revisar\n"); } void SalirFn(void){ printf("Estoy en Salir\n"); exit(1); }
Pgina 97 de 208

Ingeniera y Ciencia de la Computacin */ int MenuFnEn(void){ int OpcionEn; do{ printf("1. Ingresar\n"); printf("2. Suprimir\n"); printf("3. Revisar\n"); printf("4. Salir\n"); printf("Seleccione un numero: "); scanf("%d", &OpcionEn); printf("\n"); }while (!((OpcionEn >= 1) && (OpcionEn <= 4))); return OpcionEn - 1; }

Hugo Rangel

void main(void){ char LeyendasArCd[4][16] = {{"Soy la opcion 1"}, {"Soy la opcion 2"}, {"Soy la opcion 3"}, {"Soy la salida "}}; //void (*OpcionesArApFn[])(void) = {IngresarFn, SuprimirFn, RevisarFn, SalirFn}; //(*OpcionesArApFn[MenuFnEn()])(); printf("%s\n", LeyendasArCd[MenuFnEn()]); } Pautas de Diseo: Procesos Cosecuenciales Ahora consideremos tres ejemplos que nos van a llevar a la idea de procesos cosecuenciales, es decir, a una pauta de diseo que parece ser ms comn de lo que se podra pensar.

Pgina 98 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Brevario
La estrategia de Divide y Venceras (D&V) La estrategia de D&V no es una capacidad cognitiva exclusiva del Homo Sapiens, tambin la utilizan cotidianamente las especies inferiores. Por ejemplo, los delfines al atacar un cardumen lo dividen para alimentarse de el con el menor de los riesgos. Por supuesto que el cardumen responde con una estrategia que es la contra estrategia de D&V: El cardumen unido jams ser vencido. Los delfines utilizan otras tecnicas ms refinadas de la estrategia de divide y vencers, En algunas latitudes del mundo los delfines cooperan con los pescadores para atrapar peces, Esta es una estrategia de D&V de cooperacin entre dos especies diferentes mucho ms refinada. Las leonas al atacar una manada de bufalos, eligen al bufalo menos capaz de defenderse con el proposito de hacer una caza rpida y con el menor de los riesgos. El bufalo objetivo es separado de la manada. Este usualmente emprende la huida por lo que las leonas lo conducen por un sendero para emboscarlo. Aqu tenemos otra estrategia de divide y venceras refinada. Los primates: gorilas, chimpances, orangutanes, etc., hacen un uso muy amplio de esta estrategia, pero es sin duda, que el Homo Sapiens es quien hace el uso ms refinado de la estrategia de D&V. La estrategia de D&V es una pauta recurrente o generica, ya que esta se presenta con diferentes ropajes en diferentes contextos, Por ejemplo, en rboles de fallas, en rboles de probabilidad, en el principio de separacin de niveles de interes, el proceso de refinamiento a pasos, en la divisin de trabajo, etc. En el diseo de todo algoritmo, siempre esta presente la estrategia de D&V.

Pgina 99 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Captulo 5

Funciones

Pgina 100 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 101 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Objetivo general El alumno modelara, codificara y correr programas que incluyen funciones que segmentan a los programas en jerarquias de modulos para fcilitar su diseo. Contenido 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 La estructura de una funcin El alcance de las funciones Variables locales y globales Funciones sin argumento Pase de argumentos por valor y por referencia Funciones en expresiones Arreglo como argumentos como funciones Iniciacin de arreglos en tiempo de compilacin Los argumentos de main Funciones en lnea Argumentos por omisin Argumentos por omisin mltiples

Objetivos: Al terminar esta unidad, el alumno ser capaz de utilizar: 1.2.3.4.5.6.Funciones con argumentos Funciones sin argumentos Argumentos por valor y referencia Funciones en expresiones Funciones en lnea Argumentos por omisin
Pgina 102 de 208

Ingeniera y Ciencia de la Computacin 7.Argumentos por omisin mltiple

Hugo Rangel

Pgina 103 de 208

Ingeniera y Ciencia de la Computacin 3.1 La estructura de una funcin

Hugo Rangel

Una funcin es un conjunto de instrucciones con un propsito bien definido. Como por ejemplo: Sumar dos matrices. Producto de dos matrices. Producto de dos vectores. . Las funciones tienen la siguiente estructura: tipo nombre_funcin(argumentos){ prototipo declaracin de variables locales instrucciones ejecutables //Encabezado o

//Sumar dos matrices, producto //de dos matrices, producto de //dos vectores, etc.

} Una funcin consta de un encabezado o prototipo y de un cuerpo. El prototipo consta de una lista de variables llamadas ficticias o, argumentos o, parmetros formales, separados por comas. El cuerpo consta de declaraciones de variables locales e instrucciones ejecutables Las funciones evitan la duplicidad de cdigo y contribuyen a modularizar (dividen en partes bien definidas) los programas. 3.2 Formas de declarar las funciones Hay dos formas de declarar una funcin. Se declara el prototipo terminado con punto y coma (;) antes de main, luego se declara el prototipo y el cuerpo de la funcin despus de main, como se ilustra enseguida. #include <stdio.h> void SumaFn( int , int , int); prototipo void main(void){ int AEn = 5, BEn = 4; SumaFn(AEn, BEn); } void SumaFn(int AEn, int BEn){ declarados //Prototipo y cuerpo //Solo se declara el

Pgina 104 de 208

Ingeniera y Ciencia de la Computacin printf("%d", AEn + BEn) ; }

Hugo Rangel

Notse que el nombre de los parmetros formales se pueden omitir en el prototipo. No as en la declaracin completa que aparece despus de main. Los parmetros le indican al compilador de que tipo y cuantos son, sin importar el nombre que tengan, por lo que la variable CEn en suma y main son distintas. En la segunda forma de declarar una funcin, esta se declara por completo antes de main, como se muestra enseguida. #include <stdio.h> void SumaFn(int AEn, int BEn){ printf ("%d", AEn + BEn); }
void main(void){

int AEn = 5, BEn = 4; SumaFn(AEn, BEn); } 3.3 Variables locales y globales

Las variables AEn, y BEn declaradas en la funcin principal main del ejemplo anterior, son locales a esta, es decir solo pueden usarse en main y no en suma. Por otra parte, los parmetros formales en la funcin SumaFn son locales a la funcin. #include <stdio.h> void SumaFn(int, int); void main(void){ int AEn = 5, BEn = 4; SumaFn(AEn, BEn); } void SumaFn(int AEn, int BEn){ printf ("%d", AEn + BEn); } En el ejemplo siguiente, modificacin del anterior, son locales a la funcin main, las variables AEn, mientras que la variable CEn en la funcin suma es
Pgina 105 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

local a sta. Es decir, ambas variables an cuando tienen el mismo nombre son diferentes por estar declaradas en mbitos diferentes. #include <stdio.h> int CEn = 4; //CEn es una variable global a la funcin //SumaFn porque aparece antes de la //declaracin de esta.

void SumaFn(int, int);

void main(void){ int AEn = 5; SumaFn(AEn, CEn); //Aqu se utliza la variable global CEn en //main

} void SumaFn(int AEn, int BEn){ int CEn; //CEn es una variable local a SumaFn. En //mbito no tiene validez la variable global //CEn CEn = AEn + BEn; printf ("%d", CEn); } Ahora tenemos declarada a la variable c antes de main, por lo que ahora es global, es decir, puede ser reconocida por cualquier funcin, sin embargo, tenemos declarada como local en la funcin suma, tambin a una variable de nombre c, para evitar un conflicto, el compilador, en este caso, le d prioridad a la variable local c de la funcin suma durante su ejecucin, es decir invalida la global. #include <stdio.h> void SumaFn(int, int);
void main(void){

int AEn = 5; SumaFn(xEn, cEn); } int cEn; void sumaFn(int aEn, int bEn){

Pgina 106 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

cEn = aEn + bEn; printf ("%d", cEn); } Ahora tenemos declarada a la variable c en main, por lo que es local a main, pero tambin aparece en suma, se dice que esta variable es global a suma por estr declarada antes y fuera del mbito de suma, por lo que puede usarse en suma. Esta variable no es global ni local a main por estar declarada despus de esta. #include <stdio.h> void sumaFn(int, int) void main(void){ suma(5, 4); } int cEn; void sumaFn(int aEn, int bEn){ cEn = aEn + bEn; printf ("%d", cEn); } Este ejemplo ilustra que podemos tener valores constantes como argumentos en las llamadas de las funciones. 3.4 Funciones sin argumentos Las funciones pueden no tener argumentos, como es el caso siguiente. #include <stdio.h> int aEn = 5, bEn = 11, cEn; void sumaFn(void); void main(void){ suma(); } int cEn; void sumaFn(void){ cEn = aEn + bEn;

Pgina 107 de 208

Ingeniera y Ciencia de la Computacin printf ("%d", cEn); } 3.5 Pase de argumentos por valor y por referencia

Hugo Rangel

En el ejemplo siguiente la intencin es intercambiar los valores de A y B, mediante la funcin cambia. #include <stdio.h> void cambiaFn(int xEn, int yEn){
int tempEn;

yEn = tempEn;

tempEn = xEn; xEn = yEn;

} void main(void){ int AEn = 5, BEn = 10; printf("%d %d", AEn, BEn); cambia(AEn, BEn); printf("%d %d", AEn, BEn); } Sin embargo, no sucede as debido a que los argumentos se pasaron por valor, es decir, las dos exhibiciones mostraran 5 y 10. Para lograr que el intercambio requerido, debemos pasar los argumentos por referencia, es decir, hay que anteponerles a los argumentos, en la llamada de la funcin cambia, el smbolo &, y en la declaracin de la misma el smbolo *. #include <stdio.h> void cambiaFn(int *xEn, int *yEn){ int tempEn; tempEn = *xEn; *xEn = *yEn; *yEn = tempEn;

void main(void){ int AEn = 5, BEn = 10; printf("%d %d", AEn, BEn);

Pgina 108 de 208

Ingeniera y Ciencia de la Computacin cambiaFn(&AEn, &BEn); printf(%d %d, AEn, BEn); } 3.6 Funciones en expresiones

Hugo Rangel

Hasta ahora, las funciones que hemos empleado se llaman escribiendo su nombre con sus argumentos, si los hay, esto es debido a que no hemos asociado un valor al nombre de las mismas. Una funcin puede aparecer en una expresin si asociamos un valor a su nombre mediante un return en su mbito. #include <stdio.h> int sumaFnEn(int aEn, int bEn){ return aEn + bEn; } void main(void){ int xEn = 5, yEn = 12, wEn; wEn = 0.5*sumaFnEn(xEn, yEn) printf("%d %d", sumaFnEn(xEn, yEn), wEn); } Si una funcin tiene asociado un valor entero a su nombre, se puede omitir el tipo de la funcin, si no es tipo entero el valor asociado con el nombre, entonces se debe anteponer al nombre de la funcin el tipo, como en el siguiente ejemplo.
#include <stdio.h> float sumaFnRe(float aRe, float bRe){ } return aRe + bRe;

void main (void){ float xRe = 5.0, yRe = 12.0, wRe; } printf ("%f %f", suma(xRe, yRe), wRe);

3.7 Arreglos como argumentos en funciones Los arreglos se pasan por referencia, es decir, no es necesario usar los smbolos & y * con los nombres de los arreglos. #include <stdio.h>

Pgina 109 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

void sumaFn(int xVcEn[10], int yVcEn[10], wVcEn[10]) { int iEn; for(iEn = 0; iEn < 10; iEn++) wVcEn[iEn] = xVcEn[iEn] + yVcEn[iEn] } void leeFn(int xVcEn[10]); void exhibeFn(int xVcEn[10]); void main(void){ int AVcEn[10], BVcEn[10], CVcEn[10]; lee(AVcEn); lee(BVcEn); suma(AVcEn, BVcEn, CVcEn); exhibe(BVcEn); exhibe(CVcEn); } int iEn; void leeFn(int xVcEn[10]){ for(iEn = 0; iEn < 10; iEn++) scanf (%d, &xVcEn[iEn]); } void exhibeFn(int xVcEn[10]){ for(iEn = 0; iEn < 10; iEn++) printf (%d, xVcEn[iEn]); } 3.8 Iniciacin en tiempo de compilacin El ejemplo que sigue ilustra como iniciar arreglos con valores en tiempo de compilacin. #include <stdio.h> void sumaFn(int xVcEn[5][5], int yVcEn[5][5], wVcEn[5][5]) { int iEn, jEn;
for(iEn = 0; iEn < 5; iEn++) for(jEn = 0; jEn < 5; jEn++) wVcEn[iEn][jEn] = xVcEn[iEn][jEn] + yVcEn[iEn][jEn]

Pgina 110 de 208

Ingeniera y Ciencia de la Computacin


void leeFn(int xVcEn[10]); void exhibeFn(int xVcEn[10]);

Hugo Rangel

void main(void){ int AVcEn[][3] ={{l,2,3,4,5}, {l,2,3,4,5}, {l,2,3,4,5}, {l,2,3,4,5}, {l,2,3,4,5}}, BVcEn[][3] ={6,7,8,9,0},
{6,7,8,9,0}, {6, 7,8,9, 0} {6,7,8,9,0}, {6,7,8,9,0}} CVcEn[5][5];

leeFn(AVcEn); leeVcEn(BVcEn); sumaFn(AVcEn, BVcEn, CVcEn) ; exhibeFn(AVcEn); exhibeFn(BVcEn); exhibeFn(CVcEn); } int iEn, jEn; void leeFn(int xVcEn[5][5]){ for(iEn = 0; iEn < 5; jEn++) for(jEn = 0; jEn < 5; iEn++) printf (%d, xVcEn[iEn][jEn]) ; } 3.9 Los argumentos de main La funcin principal main tiene dos argumentos. Estos son argc y argv, los que permiten pasar argumentos en la lnea de comando. Un argumento en la lnea de comando es la informacin que sigue al nombre del programa ejecutable en la indicacin de MS-DOS. argv contiene el nmero de argumentos en la lnea de comando y es un entero. Al menos siempre sra 1 porque se toma en cuenta el nombre del programa. argv es un apuntador a un arreglo de apuntadores a cadenas. Cada elemento de este arreglo seala a un argumento de la lnea de comando. #include <stdio.h> void main(int argc, char *argv[]){
Pgina 111 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

if(argc < 2) printf("Olvido dar su nombre !\n"); else if(argc < 3) printf("No dio su nombre completo !\n"); else printf("Hola %s %s" argv[1], argv[2]); } Suponiendo que est en la indicacin A:>, usted digita:
A: >linecoma Juan Prez

y se muestra el mensaje
Hola Juan Prez

Pero si usted digita


A:>linecoma

se exhibe el mensaje olvida su nombre! o si digita


A:>linecoma Juan

entonces exhibe el mensaje No dio su nombre completo! 3.10 Funciones en lnea Una funcin en lnea se declara igual y define igual que una funcin ordinaria. Su propsito es una alternativa a las funciones ordinarias con pocas lneas de cdigo para reducir el costo de las llamadas. En una funcin en lnea * El prototipo esta precedido por la palabra reservada inline. * Su llamada se reemplaza por su cdigo. #include <stdio.h> inline float sumaFnRe(float aRe, float bRe){

Pgina 112 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

return aRe + bRe;


}

inline void exhibeFn(float aFn){ printf("%f", aRe);


}

void main(void){ int xEn = 5, yEn = 4, WEn; wEn = sumaFnRe(xEn, yEn); exhibeFn(wEn); } 3.11 Argumentos por omisin El uso de argumentos por omisin es til cuando se requiere llamar a una funcin varias veces con el mismo argumento la ms de las veces. El ejemplo siguiente ilustra esto. #include <stdio.h> void exhibemsjeFn(char msjeCd[ ] = "Active la impresora"){ puts(msjeCd); } void main(void){ exhibemsjeFn(); exhibemsjeFn("Presione una tecla para continuar"); exhibemsjeFn("el valor es invalido "); exhibetnsjeFn() } 3.12 Argumentos por omisin mltiple Es posible especificar mas de un argumento por omisin. Como lo muestra el siguiente ejemplo. #include <stdio.h> void fnFn(int kEn = 5, char caraCa = 'X', float xRe = 7.5) { printf("%d\n", kEn); printf("%c\n", caraCa);
Pgina 113 de 208

Ingeniera y Ciencia de la Computacin printf("%f\n", xRe); } void main(void){ fnFn(); fnFn(15);


fnFn(15, 'B');

Hugo Rangel

fnFn(15, 'B', 0.5); } Si solo una parte de los argumentos son por omisin, entonces estos deben aparecer en el extremo derecho. Por ejemplo, no es valido el siguiente prototipo de funcin: void fnFn(int kEn = 5, charCa cara, float xRe = 0.5); sin embargo es valido el siguiente:
void fnFn(char caraCa, int kEn = 5, float xRe = 7.5);

Pgina 114 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 115 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Captulo 6

La Programacin Estructurada y el Lenguaje de Programacin C

Pgina 116 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 117 de 208

Ingeniera y Ciencia de la Computacin Objetivo general

Hugo Rangel

El alumno modelara, codificara y correr programas de acuerdo a los principos de la programcin estructurada.

Contenido 6.1 6.2 6.3. 6.4 6.5 6.6 La Programacin Estructurada. La Praxis Seudocdigo Un Ejemplo de Diseo Usando Espaol Estructurado Diagramas Estructurados La Controversia del GoTo

Objetivos particulares 1. 2. 3. Al terminar ste captulo, el alumno ser capaz de utilizar El proceso de refinamiento a pasos como una herramienta de abstraccin mental en el diseo de programas. El seudocodigo como una herramienta o lenguaje de diseo de programas para concretar en firme el proceso de refinamiento a pasos.

Pgina 118 de 208

Ingeniera y Ciencia de la Computacin 4.1 La Programacin Estructurada

Hugo Rangel

La programacin estructurada es una metodologa para el diseo de programas. Nace como una necesidad para resolver los problemas que se originan durante y despus del desarrollo de los programas. Esta consta de conceptos, metdos y diagramas. Su nfasis esta en la estructura de los programas, es decir, en los bloques bsicos que los constituyen; las figuras de control. Estas representan el flujo o secuencia lgica en que se ejecutan los programas en una computadora. Son una herramienta til, pues nos ayudan a modelar soluciones de problemas que van desde los ms simples hasta los ms complejos. Las figuras de control se clasifican en las siguientes cuatro categoras: Secuencia, Iteracin, Decisin y Salida.

La programacin estructurada clsica considera las tres primeras. Las cuales tienen la caracterstica comn de tener un punto de entrada y uno de salida. La cuarta categora se introdujo posteriormente y modific esta caracterstica comn a la de un punto de entrada y varios de salida. 4.2 La Praxis

En la prctica, nuestra principal herramienta en la programacin estructurada es nuestro propio proceso mental de abstraccin. Mediante este visualizamos un problema como una coleccin de problemas ms pequeos (subprogramas) y por lo tanto menos complicados. Este proceso se aplica reiterativamente hasta llegar a un punto en que ningn subprograma est en trminos de otros. Este proceso genera rpidamente una gran cantidad de detalles que es imposible de retener todos a la vez en nuestra memoria, an tratndose de un problema simple. Por lo que requerimos de una notacin que nos ayude a concretar, sin confusin, los diferentes niveles de abstraccin a medida que estos se derivan. Al proceso que combina el uso de la abstraccin mental para reducir un problema a un conjunto de subproblemas ms tratables y el uso de una notacin que nos permita documentar este proceso y con ello reducir nuestra sobrecarga mental de detalles generados, se le conoce como proceso de refinamiento a pasos, y es central a la programacin estructurada. Diversas herramientas se han propuesto para la concrecin de este proceso de abstraccin iterativo, como son: + + Seudocdigo. Diagramas. De flujo estructurado. De accin y

Pgina 119 de 208

Ingeniera y Ciencia de la Computacin + Otros

Hugo Rangel

Siendo, posiblemente, el seudocodigo y los diagramas de flujo estructurado los ms ampliamente usados hasta hoy da. Al seudocdigo tambin se le llego a conocer como Lenguaje de Diseo de Programas (PDL por sus siglas en Ingls). Cada una de estas herramientas es realmente una alternativa de Lenguaje de Diseo de Programas (LDP por sus siglas en Espaol). Alternativa dictada solamente por la preferencia del programdor. Las figuras de control correspondientes al seudocdigo y a los diagramas deben caer en las cuatro categoras ya mencionadas en la primera parte.
Normas de la programacin estructurada El programa se divide en piezas independientes llamadas mdulos. Un mdulo es una unidad autocontenida cuyo cdigo es fsicamente y lgicamente separado del cdigo de cualquier otro mdulo en el programa. Un mdulo representa una funcin lgica nica en el programa, por ejemplo, SUMA DE MATRICES El tamao de un mdulo no debe de exceder las 100 instrucciones (enunciados) . Un mdulo esta limitado por un punto de entrada y un punto de salida. Durante la ejecucin, el control de programa puede ingresar a un mdulo solo en su punto de entrada y puede salir del mdulo solo de su punto de salida. Los mdulos estn relacionados con otros solo mediante una estructura de control jerrquica. Cada nivel en la estructura de control representa una descripcin ms detallada de lo que el programa hace. Esto tambin dicta la transferencia de programa de mdulo a mdulo durante la ejecucin. Ninguna circularidad se permite en la estructura de control. Esto significa que un mdulo no puede llamarse a si mismo, ni puede este llamar a otro que lo haya llamado. Cada mdulo debe comenzar con un bloque de comentario que explique la funcin que ese mdulo realiza, los valores pasados al mdulo, los valores devueltos, los mdulos que llaman a este mdulo y los mdulos que este mdulo llama. Los comentarios embebidos en el cdigo del mdulo deben separarse de las instrucciones mediante una lnea en blanco. Todod los comentarios deben ser significativos (a saber, no deben repetir informacin que es obvia del cdigo). Evite etiquetas innecesarias; no usa las etiquetas como comentarios. Todas los nombres de las variables y mdulos deben ser significativos. Los nombres de los mdulos deben de sugerir la funcin lgica que realizan (a saber, EDITAR), y y losnombres de las variables deben sugerir su propsito en el programa (a saber, ERROR).

4.3

Seudocdigo

El seudocdigo prosa estructurada, Espaol estructurado como tambin se le conoce, representa o describe de manera informal a los programas, cada parte de

Pgina 120 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

esta descripcin se corresponde con el cdigo fuente. La siguiente tabla, muestra las tres figuras de control bsicas (en seudocdigo). 2 Figura
3 I. Secuencia

Seudocdigo
Instruccin 1 . . . . . . . instruccin n 1. si (condicin) instruccin(es) 1 o_bien instruccin(es) 2 fin 2. si (condicin) instruccin(es) fin 3. si (condicin 1) instruccin(es) 1 o_si (condicin 2) instruccin(es) 2 . . . . . . . . . . . o_si (condicin n) instruccin(es) n o_bien instruccin(es) x fin 4. casar (caso) con caso 1: instruccin(es) 1 caso 2: instruccin(es) 2 . . . . . . . . . . . caso n: instruccin(es) n o_bien: instruccin(es) x fin 1. mientras (condicin) instruccin(es) fin 2. repetir instruccin(es) hasta (condisin) 3. desde (ndice = expart1 a expart 2) instruccin(es) fin

II. Decisin

IIIIII Iterativas

Tabla 1. Las tres figuras de control clsicas. Mientras que la programacin estructurada clsica solo consideraba tres categoras de figuras de control bsicas, la programacin estucturada moderna

Pgina 121 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

considera una cuarta categora de figuras de control; las de Salida, las cuales se muestran en la siguiente tabla.
IV Salida 1. escape repetir instruccin 1 si (condisin escape fin instruccin 2 hasta (condicin iterar repetir instruccin 1 si (condisin iterar fin instruccin 2 hasta (condicin

1)

2)

1)

2)

Tabla 2. La cuarta categora de figuras de control. 4.4 Un Ejemplo de Diseo Usando Espaol Estructurado como LDP

Quizs convenga en este punto ilustrar el proceso de refinamiento a pasos con un ejemplo usando como LDP al Espaol estructurado. Consideremos el siguiente problema: Disee un programa que lea dos matrices y valide si son sumables y multiplicables. En caso de serlo deben hacerse las operaciones correspondientes y exhibir las dos matrices y la matriz resultante, en caso de no ser una o la otra o las dos, que se hagan las operaciones y se exhiban los mensajes correspondientes. Una primera reflexin (abstraccin) nos dice claramente que debemos primero establecer las reglas de cuando las dos matrices son sumables y multiplicables y cuando no. Sumables Dos matrices son sumables cuando sean de las mismas dimensiones, es decir, deben tener igual nmero de columnas y de hileras. Multiplicables Dos matrices son multiplicables cuando el nmero de columnas de la primer matriz coincide con el nmero de hileras de la segunda matriz. Por supuesto esto ya lo sabemos de nuestros cursos de lgebra tomados con anterioridad.

Pgina 122 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Una segunda reflexin nos dice que primero debemos leer las dimensiones de las matrices, luego a las matrices mismas para exhibirlas y luego procedemos a evaluar si son operables en cuanto a suma o multiplicacin. Es decir: Lectura de las dimensiones de las matrices Lectura de las dos matrices Exhibicin de ambas matrices Se procede a evaluar si son operables respecto a la suma y el producto. Una tercera reflexin nos dice que las tres primeras lneas son lo suficientemente claras y estan bien establecidas, no as la tercer lnea, con la cual debemos de tomar la decisin de si primero evaluamos y luego hacemos las operaciones correpondientes que resulten o evaluamos para una operacin y de ser valida la realizamos y exhibimos lo que resulte, de no ser vlida se exhibe el mensaje correspondiente, luego procedemos de la misma manera con la segunda operacin. Nos inclinamos por la segunda opcin, esto puede ser una cuestin de gustos. Lectura de las dimensiones de las matrices Lectura de las dos matrices Exhibicin de ambas matrices Si(la suma de las matrices es valida) entonces Sumaralas y Exhibir la matriz resultante. Obien Mensaje(la suma es invalida) Si(el producto de las matrices es valido) entonces Multlipicarlas y Exhibir la matriz resultante. Obien Mensaje(el producto es invalido) Notese que esta ultima abstraccin es de hecho casi una copia al carbn de lo dicho en el parrafo anterior. Otra reflexin nos dice que debemos afinar ms, acercar ms al lenguaje de programacin en que finalmente vamos a implementar este modelo de programa, las expresiones la suma de las matrices es valida el producto de las matrices es valido Aqu evidentemente que debemos de tomar en cuenta, en primer lugar, las reglas de suma y producto de matrices y en segundo lugar, hacer una eleccin cuidadosa
Pgina 123 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

de los nombres de las funciones que van a realizar las comparaciones correspondientes de las dimensiones de las matrices para validarlas. De modo que: SumaValida(HiA, CoA, HiB, CoB) ProductoValido(CoA, HiB) Donde HiA = Hilera de A, CoA = Columna de A, HiB = Hilera de B y CoB = Columna de B. Sustituyendo estas dos lneas en sus posiciones correspondientes tenemos: Lectura de las dimensiones de las matrices Lectura de las dos matrices Exhibicin de ambas matrices Si(SumaValida(HiA, CoA, HiB, CoB)) entonces Sumaralas y Exhibir la matriz resultante. Obien Mensaje(la suma es invalida) Si(ProductoValido(CoA, HiB)) entonces Multlipicarlas y Exhibir la matriz resultante. Obien Mensaje(el producto es invalido) Consideraciones similares debemos hacer con las lneas: Sumarlas o multiplicarlas y Exhibir la matriz resultante Las omitimos puesto que la consideracin anterior puede servir de referencia para hacerlo, de modo que finalmente tenemos. Lectura de las dimensiones de las matrices Lectura de las dos matrices Exhibicin de ambas matrices Si(SumaValida(HiA, CoA, HiB, CoB)) entonces SeSuma(MatrizA, MatrizB, MatrizC, HiA, CoA) SeExhibe(MatrizC, HiC, CoC) Obien Mensaje(la suma es invalida) Si(ProductoValido(CoA, HiB)) entonces SeMultiplica(MatrizA, MatrizB, MatrizC, HiA, CoA, HiB) SeExhibe(MatrizC, HiC, CoC) Obien
Pgina 124 de 208

Ingeniera y Ciencia de la Computacin Mensaje(el producto es invalido)

Hugo Rangel

Notese que comenzamos con un nivel detalle bajo, alto nivel de abstraccin, y finalizamos con un nivel de detalle alto, bajo nivel de abstraccin. En otras palabras, nuestro modelo de programa esta lo sufcientemente cocinado como para pasarlo directamente al lenguaje de nuestra eleccin, en nuestro caso el lenguaje C.

void main(void){ int HiA, CoA, HiB, CoB; int MatrizA[10][10], MatrizB[10][10], MatrizC[10][10]; //Lectura de las dimensiones de las matrices puts(Dame las dimensiones de la matrizA) scanf(%d %d, &HiA, &CoA); puts(Dame las dimensiones de la matrizB) scanf(%d %d, &HiB, &CoB); //Lectura de las dos matrices SeLee(MatrizA, HiA, CoA); SeLee(MatrizB, HiB, CoB); //Exhibicin de ambas matrices SeExhibe(MatrizA, HiA, CoA); SeExhibe(MatrizB, HiB, CoB); if(SumaValida(HiA, CoA, HiB, CoB)){ SeSuma(MatrizA, MatrizB, MatrizC, HiA, CoA); SeExhibe(MatrizC, HiC, CoC); }else printf(la suma es invalida\n); if(ProductoValido(CoA, HiB)){ SeMultiplica(MatrizA, MatrizB, MatrizC, HiA, CoA, HiB); SeExhibe(MatrizC, HiC, CoC); }else printf(el producto es invalido\n) }

4.5

Diagramas Estructurados

Los diagramas juegan un papel importante en el diseo de sistemas y en particular en el desarrollo de programas. Son una forma de lenguaje que nos ayudan a visualizar e idear procesos que van desde sencillos a complicados, y son una herramienta de comunicacin escencial en un equipo de trabajo. En el captulo 3 trataremos los diagramas estructurados para ilustrar el flujo de control bsico, sin embargo, no usaremos los diagramas estructurados en el

Pgina 125 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

diseo de procesos debido al amplio espacio que se requiere para se uso, en lugar de ellos, utilizaremos el seudocgio o lenguaje de diseo de programas (PDL por sus siglas en Ingls) por ser ms consciso. Que el alumno haga una investigacin para contestar a las siguientes preguntas 1. Prohbe el uso de gotos la P,E. ? 2. Es el seudocdigo (tambin conocido como Espaol Estructurado o Lenguaje de Diseo de Programas: LDP) un lenguaje universal ? 3. Que es central a la P. E. ? 4. Cuales son las categoras de las Figuras de Control en un LDP ? 5. Enuncie, por categoras, las figuras de control del lenguaje C ? 6. Enuncie, por categoras, las figuras de control del LDP ? 7. Que caracteriza a las figuras de control ? 8. Explique el proceso de refinamiento a pasos de la P.E. ? 9. Un programa sin gotos es un programa estructurado ? 10. Mencione otras alternativas al seudocdigo ? 11. Cuales seran las figuras de control bsicas necesarias para construir cualquier programa ? 12. Defina el concepto de P.E. 13. Sustituye la P.O.O. a la P.E. ? Explique. 14. Cuando un lenguaje esta basado en objetos y cuando es orientado a objetos ? Ejemplifique. 15. Que enfatiza la P.E. y que la P.O.O. ? 16. Realmente que es P.O.O. ? 17. Defina el concepto de P.O.O. 18. Defina los conceptos de clase y objeto, herencia simple y compuesta, y polimorfismo en el contexto de la P.O.O.

Pgina 126 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

19. Defina encapsulamiento y cubrimiento de la informacin 20. Que son los mensajes en la P. O. O. ? 4.6 La controversia del Goto

Debido a que inicialmente se vi a los polmicos gotos como la causa principal de todos los males de la programacin y a que la aplicacin del proceso de refinamiento a pasos al diseo de programas produce programas sin gotos. Muchos progamadores hicieron suyas las siguientes reglas falaces: La programacin estructurada prohibe el uso de gotos. Un programa estructurado es un programa sin gotos Estas observaciones establecidas como reglas son incorrectas. Si ya establecimos como un principio que el proceso de refinamiento a pasos es central a la programacin estructurada entonces podemos establecer el siguiente corolario Todo programa estructurado debe de ser el resultado de aplicar el proceso de refinamiento a pasos al diseo de programas. Esta afirmacin no prohibe el uso de gotos, sino que promueve su uso sistemtico (uso de pocas categoras de gotos con un propsito bien definido) y prohibe su uso indiscriminado (innumerables gotos sin un propsito sistemtico insertos en el codigo de los programas). El uso indiscriminado de gotos produce el llamado cdigo espagueti el cual oscurece la lgica de los programas. El cdigo espagueti es ilegible y casi imposible de darle mantenimiento, en consecuencia el costo, el esfuerzo y el tiempo para darle mantenimiento se incrementan considerablemente.

Pgina 127 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Brevario
La crisis del software
A fines de la dcada de los 60, se hizo obvio que los sistemas de software eran sistemas muy complejos, que resultaban difciles de disear, codificar, probar y prcticamente imposibles de entenderlos y de darles mantenimiento. Esto da origen a la llamada crisis del software. Esta condicin fue tan severa que demando con urgencia la creacin de nuevas metodologas para abatirla. Dos grandes disciplinas emergen de esta crisis: La programacin estructurada primero y la ingeniera del software despus. La programacin estructurada nace como consecuencia de esta crisis, que es propiciada en gran medida por el llamado cdigo espagueti, mucho esfuerzo se dedico a eliminarlo y sustituirlo por otro ms estructurado (programacin estructurada). Se culpo en buena medida de esto al uso de los enunciados go tos, por lo que muchos autores propusieron su eliminacin de los lenguajes de programacin. Esta situacin da origen a una controversia de los go tos, si se deben conservar o eliminar. Si bien el uso, mal uso y uso excesivo, de estos enunciados propiciaba en buena medida el cdigo espagueti, esto no justificaba su desaparicin de los lenguajes, sino que por el contrario, haba que propiciar un uso ms sistemtico de ellos, usarlos menos y con un propsito bien definido. La programacin estructurada enfatiza mucho el empleo ms sistemtico de los enunciados de control de flujo, de ah nacen los diagramas de flujo estructurados, los cuales en realidad se usaron poco, debido a que ocupan demasiado espacio al describir la lgica de los programas en comparacin del cdigo que generan. Una alternativa fue el seudocdigo o prosa o Espaol estructurado, que se utiliz como un lenguaje de diseo de programas (LDP). Inicialmente el LDP, en la programacin estructurada clsica, utilizo tres categoras bsicas de figuras de control de flujo: secuencia, condicionales e iteraciones. Posteriormente se integro una cuarta categora, la de escapes. Esta categora no son otra cosa que go tos que se utilizan sistemticamente. El lenguaje C, en particular, siempre las incluyo en su sintaxis. Durante este periodo siempre se considero que nuestra principal herramienta para tratar con la complejidad, era nuestra capacidad de abstraccin, an hoy esta sigue siendo una premisa vlida para cualquier actividad intelectual, sin ella la humanidad jams hubiera salido de las cavernas. Se le llamo procesamiento de refinamiento a pasos a una forma

Pgina 128 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

sistemtica de utilizar esta intrinsica capacidad de abstraccin y se incorporo a la naciente programacin estructurada como central a la misma. El LDP se utiliz como una herramienta para concretar este proceso, durante el proceso de creacin de un programa, por el gran nmero de detalles que haba que cubrir durante el diseo de estos. Muchos programadores llegaron a afirmar que sus programas eran estructurados porque estos no contenan go tos. Esta afirmacin con frecuencia era falsa, ya que sus diseos de programa no eran derivados del proceso de refinamiento a pasos. Sino de un diseo ad hoc (pobremente metodolgico). En realidad para que el diseo de programa fuese considerado estructurado este debi ser el resultado de aplicar el proceso de refinamiento a pasos, lo cual no implicaba no usar go tos, por el contrario, estos podan usarse metodolgicamente. El propsito de la programacin estructurada fue el de resolver la crisis del software mediante el logro de los siguiente objetivos: Mejorar la legibilidad de los programas Hacer la correspondencia entre el programa fuente y los procesos de ejecucin tan trivial como sea posible (Dijkstra [5]). Mejorar la eficiencia de los programas Enfatizar la Minimizar la complejidad de los programas Simplificar el mantenimiento de los programas Incrementar la productividad del programador Proporcionar una disciplina metodolgica de la programacin

La formalizacin de la programacin en la programacin estructurada abri el camino a la ingeniera del software y despus a las herramientas CASE (Computer Aided Systems Engineering = Ingeniera de Sistemas Asistida por Computadora) por sus siglas en Ingls. La ingeniera del software involucra tres fases en el desarrollo de los sistemas de informacin (software); el anlisis estructurado, el diseo estructurado y las tcnicas estructuradas. Las herramientas CASE es un intento de automatizar las fases de la ingeniera del software. Inicialmente esta herramienta es vista como una panacea, ya que se pensaba que esta herramienta iba a generar todo el cdigo de una aplicacin, esto result ser demasiado, ya que en el esquema de: entrada y formateo de datos -> procesos -> salida y exhibicin de datos lo que verdaderamente se automatiz fueron los dos extremos. Los procesos probaron ser difciles de automatizar por lo que siguieron codificndose a mano en gran medida.

Pgina 129 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Captulo 7

Los Tipos de Variables Predefinidos: Uniones y Estructuras

Pgina 130 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 131 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Objetivo general El alumno modelara, codificara y correr programas que incluyen tipos de variables predefinidos por el usuario como son las uniones y las estructuras.

Contenido 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 7.10 Estructuras Como acceder a los elementos de una estructura Lectura y exhibicin de los elementos de una estructura Elementos de estructura como argumentos en funciones Estructuras como argumentos en funciones Simplificacin de la notacin de las estructuras Estructuras en estructuras Arreglos en estructuras Estructuras con campos en bits Uniones

Objetivos Al terminar esta unidad, el alumno ser capaz de utilizar: 1. Estructuras 2. Referenciar los elementos de una estructura 3. Leer y exhibir los elementos de una estructura 4. Elementos de una estructura como argumentos en una funcin 5. Estructuras como argumentos en funciones 6. Estructuras anidadas 7. Arreglos de estructuras 8. Estructuras en campos de bits 9. Uniones

Pgina 132 de 208

Ingeniera y Ciencia de la Computacin 5.1 Estructuras

Hugo Rangel

Una estructura es una coleccin de variables a las que se hace referencia mediante un nombre. Las variables en las estructuras, por regla general, estn relacionadas lgicamente. La declaracin de una estructura nos permite crear variables de estructura. Una estructura tiene la siguiente forma general: struct nomb_estructura{ tipo nomb variablel; - - - - - - - - - - - tipo nomb_variablen; }; El ejemplo siguiente ilustra esto: struct EsEmpdo{
char NombreCd[30];

char DireccionCd[30]; float SueldoRe; int CategoriaEn; }; - - - - - - - - - struct EsEmpdo JuanEsEmpdo, PedroEsEmpdo, JosEsEmpdo; Puede declararse una o ms variables de estructura en la declaracin de una estructura, como se ilustra enseguida. struc EsEmpdo{
char NombreCd[30];

char DireccionCd[30]; float SueldoRe; int CategoriaEn; } JuanEsEmpdo, PedroEsEmpdo, JosEsEmpdo; Si la aplicacin solo requiere el uso de la variable de estructura, no se requiere el nombre de la estructura, por ejemplo. struct{ char NombreCd[30);
char DireccionCd[30];

float SueldoRe; int CategoriaEn; } JuanEsEmpdo; 5.1 Como referenciar los elementos de un estructura

Pgina 133 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Una estructura es til cuando hacemos una referencia explcita a los elementos de la misma.
JuanEsEmpdo.CategoriaEn = 3;

Asigna el valor de 3 a la variable (campo) Categora de la estructura Juan.


JuanEsEmpdo.SueldoRe = 1090.50;

Asigua el valor de 1090.50 al campo Sueldo de la estructura Juan.


JoseEsEmpdo.CategoriaEn = JuanEsEmpdo.CategoriaEn;

Asigna el valor del campo CategoraEn de la estructura JuanEsEmpdo, al campo CategoraEn de la estructura JosEsEmpdo.
PedroEsEmpdo = JosEsEmpdo;

Todos los valores de los campos en la estructura JosEsEmpdo, se asignan a los campos correspondientes en la estructura PedroEsEmpdo. 5.2 Lectura y exhibicin de los elementos de una estructura A los campos de una estructura pueden asignrseles valores mediante una lectura y as mismo exhibirlos. Ejemplos:
scanf(%d %s, JoseEsEmpdo.CategoriaEn, JosEsEmpdo.NombreCd);

Asigna, mediante una lectura, valores a los campos CategoraEn y NombreCd de la estructura JosEsEmpdo.
printf (%s %d, JosEsEmpdo.NombreCd, JoseEsEmpdo.CategoriaEn);

Exhibe los valores de los campos NombreCd y CategoraEn de la estructura JosEsEmpdo.


gets(PedroEsEmpdo.NombreCd);

Asigna, mediante una lectura, un valor al campo. Nombre de la estructura PedroEsEmpdo.


puts(PedroEsEmpdo.NombreCd);

Exhibe el valor del campo Nombre de la estructura PedroEsEmpdo.

Pgina 134 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

puts(PedroEsEmpdo.NombreCd);

Exhibe el valor del campo Nombre de la estructura PedroEsEmpdo. 5.3 Elementos de estructura como argumentos en funciones Los campos de las estructuras pueden aparacer como argumentos en funciones y ser pasados por valor y direccin. Por valor
fnFn(JuanEsEmpdo.NombreCd[0]);

Pasan el valor carcter en la posicin 0, del campo nombre de la estructura Juan. fnFn(JuanEsEmpdo.CategoraEn); Pasan el valor entero del capo CategoraCd de la estructura JuanEsEmpdo. fnFn(juanEsEmpdo.SueldoRe); Pasan el valor real del campo Sueldo de la estructura JuanEsEmpdo. Por direccin
fnFn(JuanEsEmpdo.NombreCd);

Pasan la direccin del campo Nombre de la estructura JuanEsEmpdo.


fnFn(&JuanEsEmpdo.SueldoRe);

Pasan la direccin del campo Sueldo en la estructura JuanEsEmpdo. 5.4 Estructuras como argumentos en funciones Una estructura como argumento puede ser pasada por valor o direccin. Ejemplo: Por valor fnFn(struct Empdo LeticiaEsEmpdo); Por direccin, en la definicin de la funcion
fnFn(struct Empdo *LeticiaEsEmpdo);

Pgina 135 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

en la llamada de la funcion
fnFn(&JuanaEsEmpdo);

5.5 Simplificacin de la notacin de las estructuras La directiva typedef nos permite simplificar la notacin de las estructuras en las declaraciones. Ejemplo:
#typedef struct{

char NombreCd[30]; char Direccion[30]; float SueldoRe; int CategoraEn; } EMPDO; - - - - - - - - - - EMPDO JuanEsEMPDO, PedroEsEMPDO, JosEsEMPDO; 5.6 Estructuras en estructuras Es posible declarar una estructura dentro de otra (estructuras anidadas). #typedef struct{ int DiaEn, MesEn AoEn;
} FECHA;

#typedef struct{ char NombreCd[30]; char DireccionCd[30]; float SueldoRe; int categoraEn; FECHA FechaIngEsFECHA; } EMPDO; - - - - - - - - - - - - EMPDO JuanEsEMPDO; JuanEsEMPDO.fechaIngEsFECHA.DiaEn = 15; JuanEsEMPDO.fechaIngEsFECHA.DiaEn = 07; JuanEsEMPDO.fechaIngEsFECHA.DiaEn = 93; 5.7 Arreglos de estructuras

Pgina 136 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Para definir un arreglo cuyos elementos sean estructuras, primero se define una estructura y luego se declara un arreglo de este tipo. #typedef struct{ char NombreCd[30]; char DireccionCd[30]; float SueldoRe; int CategoraEn; } EMPDO;
- - - - - - - - - - - - - -

EMPDO NominaVcEsEMPDO[10]; NominaVcEsEMPDO[3].SueldoRe = 1325.251; Una estructura puede tener un campo del tipo de un arreglo, hace referencia a los elementos del arreglo en la estructura como lo ilustra el ejemplo siguiente. #typed struct{ int XVcEn[12], ConteoEn; } VECTOR; - - - - - - - VECTOR AlfaEsVECTOR;
- - - - - - - - - - -

for (iEn = 0, iEn < 12; iEn++){ scanf (%d, &AlfaEsVECTOR.XVcEn[iEn]); AlfaEsVECTOR.ConteoEn = --i; } 5.8 Estructuras con campos bits La forma general de un campo de bit en una estructura es la siguiente: Struct nomb_estructura{ tipo nom_campo: longitud; - - - - - - - - - - - - - - }; Un campo de bits puede tener de 1 a 16 bits. Un campo de bits puede ser de tipo int, unsigned o signed. Se el campo es un bit debe declararse como unsigned, debido a que un bit no puede tener signo. 5.9 Uniones La declaracin de una unin es muy similar a la de una estructura, sin embargo, funcionalmente son muy diferentes. La forma general de una unin es como se presenta:

Pgina 137 de 208

Ingeniera y Ciencia de la Computacin union nomb_union{ tipo nomb_variablel; - - - - - - - - - - - tipo nomb_variablen; };

Hugo Rangel

El compilador para una unin, slo reserva rea de memoria para el campo con el mayor nmero de bytes. Esta rea es comn para todos los campos de la unin. Por ejemplo en la declaracin: union Uno{ char caraCa; int EnteroEn;

};

Debido a que un carcter ocupa un byte un entero dos, se reservan dos bytes para la union Uno. La declaracin,
unin Uno BetaUnUno;

nos permite asignar a Beta un entero o un carcter en partes diferentes de un programa. BetaUnUno.CaraCa = A; - - - - - - - - BetaUnUno.EnteroEn = 12;

Pgina 138 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 139 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Captulo 8

Definicin de Nuevos Tipos de Datos: Enumeraciones

Pgina 140 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 141 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Objetivo general El alumno modelara, codificara y correr programas que incluyen tipos de variables predefinidos por el usuario como son las enumeraciones.

Contenido 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 Enumeraciones Como referenciar los elementos de una estructura Lectura y exhibicin de los elementos de una enumeracin Elementos de estructura como argumentos en funciones Estructuras como argumentos en funciones Simplificacin de la notacin de las estructuras Estructuras en estructuras Arreglos en estructuras

Objetivos Al terminar esta unidad, el alumno ser capaz de utilizar: 1. Enumeraciones 2. Referenciar los elementos de una estructura 3. Leer y exhibir los elementos de una estructura 4. Elementos de una estructura como argumentos en una funcin 5. Estructuras como argumentos en funciones 6. Estructuras anidadas 7. Arreglos de estructuras 8. Estructuras en campos de bits 9. Uniones

Pgina 142 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 143 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

5.10 Enumeraciones Introduccin Suponga que al codigo de un programa quiere darle mayor claridad para facilitar su lectura del mismo por otras personas. Digamos que para ello necesita variables de valores de verdad False y True (falso y cierto respectivamente) para obtener el mximo valor de un vector entero con diez elementos. Puesto que C carece de este tipo de variables, ud. tiene que crearlas recurriendo a las enumeraciones. Enumeraciones Una enumeracin es un lista de valores constantes predefinidas por el programador. Una enumeracin tiene la siguiente estructura general:
enum nomb_enumeracin{

valor_constante0; - - - - - - - - - - valor_constanteN; } lista de variables separadas por comas; El compilador asocia un valor entero ordenado y consecutivo a la lista de valores constantes. Por ejemplo, el valor entero 0 lo asocia con valor_constante0, el valor entero 1 a valor_constante1 y as sucesivamente. El ejemplo siguiente declara la enumeracion Bool con False y True como valores constantes.
enum Boo{False, True}; Boo EsMayorFnBo(ValorEn1, ValorEn2){ return Boo(ValorEn1 > ValorEn2); }

void main(void){ int XArEn[] = {2, 7, 3, 9, 45, 95, 23, 76, 12, 90}; int ValorMayorEn = 2;
for(int iEn = 1; iEn <= 9; iEn++)

if(EsMayorFnBo(XArEn[iEn], ValorMayorEn)) ValorMayorEn = XArEn[iEn]; printf(El valor mayor es: %d\n, ValorMayorEn);

Pgina 144 de 208

Ingeniera y Ciencia de la Computacin } A partir de la siguiente declaracin ejemplo

Hugo Rangel

enum dias{lunes, martes, miercoles, jueves, viernes, sabado, domingo}; podemos definir un subrango como sigue:
enum diaslabor lunes ... viernes;

otro subrango que podemos definir a partir de la primera declaracin es la siguiente:


enum fin_semana sabado ... domingo;

El siguiente programa ilustra varios conceptos


enum dias{lunes, martes, miercoles, jueves, viernes, sabado, domingo}; enum diaslabor lunes ... viernes; enum Boo{False, True}; struct Empdo{ char NombreArCa[12]; Boo DiasLaboradosArBoo[5]; }; void main(void){ Empdo NominaEmpdo[3] = {{Pepe, {True, False, True, True, True}}, {Juana, {True, False, True, False, True}}, {Julia, {True, True, True, True, True}}}; diaslabor laboroEm; printf(%s trabajo los das:\n, Juan_Perez.NombreArCa); for(laboroEm = lunes; laboroEm <= viernes; laboroEm++) switch laboroEm { case lunes: (NominaEmpdo.[laboroEm])? printf(lunes\n):; case martes: (Juan_Perez.[laboroEm])? printf(martes\n):; case miercoles: (Juan_Perez.[laboroEm])? printf(miercoles\n):; case jueves: (Juan_Perez.[laboroEm])? printf(jueves\n):; case viernes: (Juan_Perez.[laboroEm])? printf(viernes\n):; } } - - - - - - - - - - -

enum dias semanal, semana2; - - - - - - - - - - semana1 = lunes; semana2 = semanal; - - - - - - - - - - if(semanal == martes)

Pgina 145 de 208

Ingeniera y Ciencia de la Computacin printf(Es martes \n); - - - - - - - - - - - - - - - - - - - - - -

Hugo Rangel

Es posible asignar, en la declaracin, un valor entero especifico para uno o ms de los identificadores que aparecen en una enumeracin. enum dias{ lunes; martes = 10; miercoles = 15; jueves; viernes;
sabado = 100;

domingo = 200; }; Los valores enteros asociados a los identificadores son: lunes martes miercoles jueves viernes sabado domingo 0 10 15 16 17 100 200

Es un error intentar lo siguiente: Semanal = viernes; printf(%s, semanal);

Semana2 = lunes;

Pgina 146 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Captulo 9

Archivos

Pgina 147 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 148 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Objetivo general El alumno modelara, codificara y correr programas que incluyan las operaciones ms bsicas de los archivos como son la apretura, la lectura, la escritura y el cierre.

Contenido Apertura, Escritura y Cierre de un Archivo de Texto Apertura, Lectura y Cierre de un Archivo de Texto 9.3 Apertura, Lectura y Escritura en Archivos Distintos y Cierre de Ambos Archivos de Texto
9.1 9.2

Objetivos Al terminar esta unidad, el alumno ser capaz de: 1. Abrir, escribir en y cerrar un archivo de texto 2. Abrir, leer y cerrar un archivo de texto 3. Abrir, leer, escribir en distintos archivos de texto y cierre de estos

Pgina 149 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Apertura, Escritura y Cierre de un Archivo de Texto Con el conjunto de funciones fopen(), getc(), putc(), y fclose podemos ejemplificar la apertura, lectura, escritura y cierre de un archivo de texto. El siguiente es un ejemplo del uso de de las funciones fopen(), putc() y fclose(), ArchisEs es el nombre del programa que lee caracteres de teclado y los escribe en un archivo en disco hasta que que se digita un signo de pesos. El nombre del archivo se especifica en la lnea de comando. Por ejemplo, si digita ArchisEs Prueba le permite ingresar lineas de texto en un archivo de nombre Prueba.
Include <stdio.h> Main(int argc, char *argv[]){ FILE *fp; Char ch; If(argc != 2){ Printf(Olvido ingresar el nombre del archivo\n); Return 1 } if(fp = fopen(argv[1], w)) == NULL){ printf(No se puede abrir el archivo\n); return 1; } do{ ch = getchr(); putc(ch, fp); }while (ch != $); fclose(fp); return 0; }

Apertura, Lectura y Cierre de un Archivo de Texto El programa complementario ArchisLee lee cualquier archivo de texto y muestra el contenido en la pantalla. Usted debe de especificar el nombre del archivo en la lnea de comando.
Include <stdio.h> Main(int argc, char *argv[]){

Pgina 150 de 208

Ingeniera y Ciencia de la Computacin


FILE *fp; Char ch; If(argc != 2){ Printf(Olvido ingresar el nombre del archivo\n); Return 1 } if(fp = fopen(argv[1], r)) == NULL){ printf(No se puede abrir el archivo\n); return 1; } ch = getc(fp); while(ch != EOF){ putchar(ch); ch = getc(fp); } fclose(fp); return 0; }

Hugo Rangel

Apertura, Lectura y Escritura en Archivos Distintos y Cierre de Ambos Archivos de Texto El siguiente programa copia un archivo de cualquier tipo. Observe que los Archivos estn abiertos en modo binario y que se usa feof() para verificar el fina de archivo.
Include <stdio.h> Main(int argc, char *argv[]){ FILE *in, *out; Char ch; If(argc != 3){ Printf(Olvido ingresar el nombre del archivo\n); Return 1 } if(in = fopen(argv[1], rb)) == NULL){ printf(No se puede abrir el archivo fuente\n); return 1; } if(out = fopen(argv[1], wb)) == NULL){ printf(No se puede abrir el archivo destino\n); return 1; } while(!foef(in)){

Pgina 151 de 208

Ingeniera y Ciencia de la Computacin


ch getc(in); if()!feof(in)) putc(ch, out); } fclose(in); fclose(out); return 0; }

Hugo Rangel

Pgina 152 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Captulo 10

El Apuntador a Variables Simples

Pgina 153 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 154 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Objetivo general El alumno explicara los conceptos de identificadores estticos, dinmicos, sealamiento directo, indirecto. Explicara la diferencia entre un apuntador y una referencia. Usara estos conceptos en sus programas.

Contenido 13.- El apuntador a variables simples 13.1.- Introduccin 13.1.1.- La notacin Mex 13.1.2.- La metodologa 13.2.- Representacin en memoria fsica del un apuntador 13.2.1.- El apuntador a un carcter 13.2.2.- El apuntador a un entero 13.2.3.- El apuntador a un flotante 13.2.4.- El apuntador a otro apuntador 13.2.5.- Variables estticas y dinmicas

Pgina 155 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

13.1

Introduccin

El uso de estructuras de datos complejas, que incluyen apuntadores, siempre ha dado innumerables dolores de cabeza aun a los programadores mas experimentados. Incluso a desalentado a muchos buenos programadores a aprender los lenguajes C y C++. Esta situacin contribuye a acentuar el analfabetismo programtico que parece darse con frecuencia entre los estudiantes de informtica y computacin y aun entre algunos profesionales de dichos campos del conocimiento. Una de las metas que nos hemos propuesto en el Laboratorio de Telemtica es contribuir a abatir este analfabetismo mediante la aplicacin rigurosa de estrategias de enseanza aprendizaje. En el laboratorio hemos diseado el lenguaje de modelos didcticos ontolgicos (LeMoDOs), con el propsito de crear o disear entornos de enseanza que facilitan el aprendizaje de un tpico de inters. Por cierto, esta es la idea central del proyecto DEEA (Diseo de Entornos para Enseanza Aprendizaje). Con el LeMoDOs queremos incidir, primero, en aquellos tpicos que parecen ser de difcil asimilacin por los estudiantes de la carrera de Ingeniero en Computacin, por ejemplo en la prctica de la programacin con el lenguaje C hemos identificado diversos dominios de problemas que hemos resuelto con el LeMoDOs de rboles sistmicos y la notacin Mx, solo por mencionar dos. Esta investigacin nos ha llevado a trabajar en un campo de conocimiento ms amplio que hemos denominado Programtica Educacional, en otras palabras, en una didctica de los sistemas de software. La notacin Mex o notamex por brevedad, junto con los diagramas Mex o diagramex por brevedad, ofrecen las siguientes bondades: Nemnica .- Su valor nemnico es invaluable, ya que nos proporciona informacin explicita del tipo y estructuras de datos involucrados en los identificadores. Un identificador derivado con las reglas de la notacin Mex, consiste de un calificador, este es un nombre antepuesto al constructor, indica el propsito del identificador y conduce a nombres nicos. El constructor, una serie de postfijos al calificador, que indica los tipos de datos involucrados y finalmente el tipo base que indica el tipo del identificador. calificador, constructor, tipo base Alfa, ApArApFnAp, En Beta, ApArApFnAp, En Sugestiva .- La metfora visual que proporcionan los diagramas Mx junto con el valor nemnico de los identificadores, facilitan enormemente la comprensin de los tipos y estructuras de datos asociados con estos ltimos. Esta es una cualidad muy valiosa cuando se trabaja en equipo, todos hablan el mismo idioma y hay menos errores de comunicacin. Eleva el nivel del conocimiento de la codificacin de los programas.

Pgina 156 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Consistente .- La notacin es simple porque se obtiene de manera natural de un enunciado coloquial o de su equivalente, el diagrama Mx. Es general por ser independiente de cualquier lenguaje de programacin y, es sistemtica porque se basa en reglas precisas que cualquiera puede seguir sin dificultad. Estas caractersticas la hacen una notacin robusta y con un gran potencial para extender sus aplicaciones, por ejemplo, en la abstraccin de datos. Facilita el seguimiento de los identificadores a lo largo y ancho de los programas.
Normativa .- La notacin puede establecerse como una de las normas en los ambientes de desarrollo de software, (1) por ser un valioso auxiliar en la depuracin de software, (2) por promover la autodocumentacin de los mismos (3) por facilitar la comunicacin entre los desarrolladores (todos hablan el mismo lenguaje) y (4) por ser una valiosa herramienta de auditora.

Didctica .- El valor didctico de la notacin es incuestionable, de sobra son conocidas las complejidades en C/C++ con los apuntadores, particularmente cuando estos aparecen combinados con otras estructuras de datos, an para los programadores ms experimentados. El uso de la notacin simplifica enormemente esta complejidad. Los alumnos informan que la notacin Mx eleva su nivel del lenguaje C, programan con ms agilidad y les ayuda a comprender mejor la POO. Profesional.- No solo el valor didctico de la notacin es incuestionable, sino que tambin lo es en el campo profesional. Aqu el impacto sera considerable en el ahorro de costos, tiempo y esfuerzo. El uso de la notacin Mx es muy simple, podra decirse que su uso es trivial, sin embargo, la practica es esencial para dominar el uso de la notacin.

La notacin Mx

Pgina 157 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

La notacin Mx es un entorno de enseanza que facilita el aprendizaje de estructuras de datos complejas que incluyen apuntadores en el lenguaje C/C++. La notacin ya ha sido ampliamente probada en el saln de clase donde ha mostrado ser de amplia utilidad en la prctica de la programacin. Los alumnos informan de que la notacin eleva su nivel de C, programan con mayor agilidad y les facilita la comprensin de la POO. En algunos casos, la aplicabilidad de los modelos didcticos, va ms all del mbito de las aulas, tal es el caso de la notacin Mx, la cual es tambin de gran utilidad en la practica profesional de la programacin con los lenguajes C y C++ y an con otros lenguajes como Delphi. Por lo que, y este es el caso, se hace una doble contribucin; tanto en el mbito acadmico como el profesional.
13.1.2

La metodologa (Reglas de Asociacin)

El modelo didctico para la notacin Mex es un mtodo o conjunto de reglas simples, generales y sistemticas. La notacin se origina con un enunciado coloquial acerca de una declaracin inicial (la primer semilla) de una estructura compleja, por ejemplo, considrese el siguiente ejemplo: p es un Apuntador a un Arreglo de dos Apuntadores a Enteros. Yuxtaponiendo las partculas resaltadas tenemos lo que llamamos la primer semilla pApArApEn donde calificador p constructor ApArAp tipo base En

la expresin pApArApEn, es la notacin Mx, tiene la propiedad de representar, de manera nica, a un identificador de un tipo especfico de una variable. Si se requiere de ms de una variable del mismo tipo basta con introducir diferentes calificadores, por ejemplo:
pApArApEn, qApArApEn, xApArApEn, wApArApEn, etc.

Ntese que la primera partcula es el calificador. El siguiente paso consiste en asociar a la notacin Mx con la sintaxis de C, o con la sintaxis de Delphi, o la sintaxis de cualquier otro lenguaje de programacin. Esta flexibilidad hace de la notacin independiente del lenguaje a utilizar en un proyecto.
Pgina 158 de 208

Ingeniera y Ciencia de la Computacin 13.2 Representacin en memoria fsica de un apuntador

Hugo Rangel

La memoria fsica principal de una computadora es una ristra de localidades contiguas y numeradas del 0 al n 1 como muestra el siguiente diagrama

n-1 Notse que la primera localidad tiene asociado el entero 0 y la ultima el entero n 1, por lo que el nmero total de localidades es n. Cada localidad representa un byte, la unidad minima de informacin. Por consicin imaginemos a la memoria como un arreglo de (n/2)x2, es decir: 0 2 1 3

n/2 - 2

n/2 - 1

Un apuntador en memoria fsica lo representamos de la siguiente manera. Notse que este ocupa tres hileras. Para no sobrecargar el diagrama de memoria fsica, omitimos, en las siguientes secciones, la numeracin de la izquierda, esta queda sobreentendida.

Pgina 159 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

0 2 3 4 6

n/2 - 2

6.4

Apuntador a un carcter

Un apuntador seala o apunta a una localidad de memoria donde esta almacenado un valor dado. En el diagrama siguiente localidades de memoria - se muestran dos apuntadores SenalaApCa Senala es un Apuntador a un Carcter y ApuntaApCa - Apunta es un Apuntador a un Carcter que sealan a la localidad de memoria CaraCa Cara es un Carcter - en la cual se encuentra almacenado el carcter A.

SenalaApCa

ApuntaApCa

CaraCa

A A

El cdigo del siguiente programa implementa la situacin del diagrama anterior despus de haber corrido o ejecutado el programa. #include <stdio.h>

Pgina 160 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

void main(void){ char CaraCa = A; // se inicia en tiempo de compilacin char *ApuntaApCa; char *SenalaApCa = &CaraCa; // se inicia en tiempo de compilacin corrida } en la declaracin char CaraCa = A; tenemos una expresin de igualdad que indica al compilador y al programador que el identificador variable a la izquierda CaraCa - es una variable de tipo carcter y el de la derecha A - es un identificador constante de tipo carcter con el que se inicia en tiempo de compilacin a la variable CaraCa. En la segunda declaracin
char *ApuntaApCa;

ApuntaApCa = &CaraCa;

// se inicia en tiempo de

prinft(%c, *SenalaApCa, *ApuntaApCa, CaraCa);

el asterisco antepuesto al identificador variable ApuntaApCa es un operador unario que indica al compilador y al programador, que esta es una variable apuntador, es decir, una variable que va a contener la direccin de una localidad de memoria. La frase coloquial Apunta es un Apuntador a un Carcter.
Se condensa como ApuntaApCa de acuerdo a lo subrayado. Este nombre de variable lo tomamos como un identificador variable porque tiene la propiedad de ser nico. La particula Apunta es el cualificador de la variable que expresa en forma consisa y legible el propsito de esta. La ltima particula Ca nos indica el tipo de la variable. Lo que tenemos ahora es la notacin Mex respecto a apuntadores, a la cual podemos asociar la sintaxis de apuntadores del lenguaje C, con lo que obtenemos la regla del apuntador a un carcter como sigue:

Pgina 161 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Leemos la variable de izquierda a derecha comenzando con la particula Ap y le anteponemos un asterisco y encerramos a toda la expresin con un par de parntesis redondos (*ApuntaApCa) si estos parntesis son los ms externos pueden omitirse, como este es el caso los omitimos *ApuntaApCa continuamos con la particula Ca, la ltima, que es la que expresa el tipo de la variable. Anteponemos a toda la expresin el tipo de acuerdo a la sintaxis de C. int *ApuntaApCa finalmente ponemos el punto y coma al final de toda la expresin. int *ApuntaApCa; Las reglas para un apuntador a un entero y un apuntador a un flotante son muy similares. En la tercera declaracin char *SenalaApCa = &CaraCa; Tenemos una expresin de igualdad con una variable apuntador, a la derecha, que se inicia, en tiempo de compilacin, con la direccin de la localidad de memoria de nombre CaraCa, a la derecha de la expresin, que contiene al carcter A. La variable de tipo carcter CaraCa esta precedida por el operador unario &, el cual indica al compilador y al programador, que obtiene la direccin de CaraCa y la igualdad indica que se asigna al apuntador. En la instruccin ApuntaApCa = &CaraCa; La variable apuntador se inicia, en tiempo de corrida, con la direccin de la localidad de memoria de nombre CaraCa. Notse que las sintaxis de las variables SenalaApCa y ApuntaApCa en sus declaraciones char *ApuntaApCa;

Pgina 162 de 208

Ingeniera y Ciencia de la Computacin char *SenalaApCa = &CaraCa; son muy similares en la instruccin prinft(%c, *SenalaApCa, *ApuntaApCa, CaraCa);

Hugo Rangel

en ambos casos los nombres de las variables estan precedidas por un asterisco, sin embargo, estan en contextos diferentes, en el primer caso en el de las declaraciones y en el segundo en el de las instrucciones. En el contexto de las declaraciones su significado es el que expresa la notacin Mex. En el contexto de las instrucciones significa el valor sealado por, es decir *ApuntaApCa el valor sealado por ApuntaApCa este valor sealado es el carcter A. El smbolo significa es equivalnte a 6.5 Apuntador a un entero

El apuntador a un entero es muy similar al de un carcter, mientras que un carcter ocupa un byte, un entero ocupa dos bytes.

SenalaApEn

ApuntaApEn

ValorEn

A A 10

El cdigo del siguiente programa implementa la situacin del diagrama anterior despus de haber corrido o ejecutado el programa..
#include <stdio.h> void main(void){ int ValorEn = 10; int *ApuntaApEn; int *SenalaApEn = &ValorEn; Pgina 163 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

ApuntaApEn = &ValorEn; prinft(%d, *SenalaApEn, *ApuntaApEn, ValorEn);

6.6

Apuntador a un flotante

El apuntador a un flotante es muy similar al de un entero, mientras que un entero ocupa dos bytes, un flotante ocupa cuatro bytes.

SenalaApRe

ApuntaApRe

ValorRe

A A

1.45

El cdigo del siguiente programa implementa la situacin del diagrama anterior despus de haber corrido o ejecutado el programa.. #include <stdio.h> void main(void){ float ValorRe = 1.45; float *ApuntaApRe; float *SenalaApRe = &ValorRe; ApuntaApRe = &ValorRe; prinft(%f, *SenalaApRe, *ApuntaApRe, ValorRe); } 6.6 Apuntador a un apuntador SenalaApAp Re El diagrama siguiente muestra grficamente, da una idea, de lo que es un apuntador que seala a otro apuntador que, a su vez seala a una variable fotante. ApuntaApRe

ValorRe

15.07 A A

Pgina 164 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

El cdigo del siguiente programa implementa la situacin del diagrama anterior despus de haber corrido o ejecutado el programa.. #include <stdio.h> void main(void){ int ValorRe = 15.07; int *ApuntaApRe = &ValorRe; int *(*SenalaApApRe) = &ApuntaApRe; prinft(%f, *(*SenalaApApRe), *ApuntaApRe, ValorRe); }

Pgina 165 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Captulo 11

Arreglos y Apuntadores

Pgina 166 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 167 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Objetivo general El alumno explicara la relacin entre un apuntador constante y el nombre de los arreglos. Usara apuntadores a arreglos, arreglos de apuntadores y usara identificadores en los que intervienen apuntadores, arreglos y otros en sus programas.

Contenido 14.- Arreglos y apuntadores 14.1- Introduccin 14.1.1- La relacin entre un apuntador variable y el nombre de un arreglo 14.2.- Representacin en memoria fsica del arreglo 14.2.1.- El apuntador variable a un arreglo 14.2.2.- Identificadores en los que intervienen apuntadores y arreglos 14.3.- Resumen 14.4.- Ejercicios

Pgina 168 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

14.0 Introduccin Entre los apuntadores y los arreglos, en el lenguaje C / C++, existe una sinergia que potencia enormemente la flexibilidad de uso de ambos cuando aparecen yuxtapuestos en una expresin de la notacin Mx. La regla a seguir es muy simple, sin embargo, su aplicacin demanda del aprendiente una sostenida actitud de autodisciplina. 14.1 La sinergia entre un apuntador variable y el nombre de un arreglo

El siguiente enunciado expresa la relacin que hay entre un apuntador y el nombre de un arreglo en el lenguaje C / C++: Hacemos hincapi en que el
El nombre de un arreglo es un apuntador constante que seala al primer elemento del mismo y no al arreglo como un todo.

Ahora, para efectos de discernimiento, considere los dos siguientes enunciados y sus semillas correspondientes Senala es un Apuntador a un Entero Senala es un Apuntador a un Arreglo de Enteros SenalaApEn SenalaApArEn

Que enunciado es compatible con el de hincapi ? Obviamente el primero, ya que el segundo indica que el apuntador seala al arreglo como un todo. Esto significa que si el nombre de un arreglo de enteros es; XArEn X es el Arreglo de Enteros y el nombre de un apuntador a un entero es; pApEn - p es un Apuntador a un Entero - entonces los identificadores variables XArEn y pApEn son compatibles. En la siguiente Figura aparecen XArEn y pApEn como apuntadores que sealan al primer elemento del arreglo en memoria.

XArEn

SenalaApEn

15 42

Pgina 169 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

El cdigo del siguiente programa implementa la situacin del diagrama anterior despus de haber corrido o ejecutado el programa. #include <stdio.h> void main(void){ int *SenalaApEn; int XArEn[2] = {15, 42}; // XArEn se inicia en tiempo de compilacin SenalaApEn = XArEn; tiempo de corrida // SenalaApEn se inicia en

printf(%d %d\n, XArEn[0], XArEn[1]); printf(%d %d\n, SenalaApEn[0], SenalaApEn[1]); } Notese que en int XArEn[2] = {15, 42}; el arreglo XArEn se inicia - en tiempo de compilacin - con los valores de 15 y 42, y en SenalaApEn = XArEn; la variable apuntador SenalaApEn se inicia con el valor del nombre del arreglo - en tiempo de corrida - debido a que como ya se seal son compatibles. Por otra parte, notese que en printf(%d %d\n, SenalaApEn[0], SenalaApEn[1]); la variable apuntador SenalaApEn puede asumir el papel del nombre del arreglo, con la diferencia de que este nombre es una variable y no una constante. Las notaciones del arreglo y del apuntador son intercambiales cuando son compatibles, por ejemplo: XArEn[1] *(XArEn + 1) *(SenalaApEn + 1) SenalaApEn[1]

Pgina 170 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

El smbolo significa ... es igual a ... , esta intercambiabilidad se ilustra con el programa anterior y el siguiente. Ambos son idnticos en su codificacin, salvo en los enunciados que muestran los resultados, pero realizan las mismas funciones debido a que son intercambiables. #include <stdio.h> void main(void){ int *SenalaApEn; int XArEn[2] = {15, 42}; // XArEn se inicia en tiempo de compilacin SenalaApEn = XArEn; tiempo de corrida // SenalaApEn se inicia en

printf(%d %d\n, *(XArEn + 0), *(XArEn + 1)); printf(%d %d\n, *(SenalaApEn + 0), *(SenalaApEn + 1)); } 14.2 La regla del arreglo

La regla del arreglo es muy simple, asocia la sintaxis de los arreglos a la semilla. Considere el enunciado: X es un Arreglo de dos Enteros Su semilla correspondiente es:
XArEn

Examinamos la expresin de izquierda a derecha, comenzando con la segunda partcula (Ar), esta nos indica que debemos yuxtaponer a la derecha la sintaxis correspondiente de un arreglo, es decir:
XArEn[2]

La siguiente y ltima partcula es la base, la base siempre se coloca a la izquierda de la expresin siguiendo la sintaxis de C.
int XArEn[2];

Pasemos ahora a resolver tres problemas bsicos en los que intervienen arreglos y apuntadores 14.2.1.- Identificadores en los que intervienen apuntadores y arreglos

Pgina 171 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

En esta seccin se resuelven tres problemas que incluyen apuntadores y arreglos. Cada problema contiene un enunciado, su diagrama Mx correspondiente y la solucin al mismo. Problema 1 Enunciado El enunciado es una declaracin coloquial de cmo diferentes tipos de datos estan asociados, por ejemplo: X es un Arreglo de dos Apuntadores a Enteros. Solamente aparecen parcialmente subrayados los sustantivos correspondientes a los tipos de datos que intervienen en la declaracin. A estas letras subrayadas, las denominamos partculas y nos sirven como una abreviatura para obtener una notacin concisa nica. Diagrama Es una notacin concisa nica consiste de caracteres ASCCI - obtenida a partir del enunciado coloquial XAr[2] -> En Solucin El enunciado se separa con parntesis angulados como sigue: Solo aparece una palabra subrayada en cada separacin, excepto en la primera, la que contiene el verbo ser o estar es. <X es un Arreglo de dos> <Apuntadores a> <Enteros> Ahora, solo considerando las partculas, concatene toda la expresin como sigue:
<XAr><Ap><En>

Aplique la regla del arreglo a la primera partcula como sigue: XAr<Ap><En>[2] Ntese que se ha postconcatenado el elemento [2] al final de la expresin y se han suprimido los parntesis correspondientes de la partcula XAr. Enseguida aplicamos la regla del apuntador a toda la expresin *XArAp<En>[2] Ahora se ha preconcatenado el elemento * a la expresin y se han suprimido los parntesis correspondientes de la partcula Ap. Luego aplicamos la regla del tipo base como sigue: int *XArApEn[2];
Pgina 172 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Obsrvese que hemos antepuesto, separado por un blanco, la palabra reservada int, suprimido los parntesis y finalmente hemos colocado al final de la expresin el punto y coma (;). Hasta aqu hemos obtenido la primera semilla; el arreglo, ahora vamos por la segunda; el apuntador. Ahora iniciamos un proceso de reduccin. Escribiendo el identificador del resultado anterior como sigue: <XarAp><En> int *XArApEn[2]; Ahora lo subrayado se sustituye por un nombre elegido por el programador, por ejemplo; Alfa <AlfaAp><En> // <Alfa es un Apuntador a un> <Entero> int *XArApEn[2]; pero notese que necesitamos dos apuntadores porque el arreglo es de dos apuntadores, entonces <AlfaAp><En> // {Alfa es un Apuntador a un} {Entero} <BetaAp><En> // {Beta es un Apuntador a un} {Entero} int *XArApEn[2]; Ahora aplicamos primero la regla del apuntador y luego la del tipo quitamos lo subrayado y obtenemos int *AlfaApEn; // Alfa es un Apuntador a un Entero int *BetaApEn; // Beta es un Apuntador a un Entero
int *XArApEn[2];

// X es un Arreglo de dos Apuntadores a Enteros

<AlfaApEn> <BetaApEn> int *AlfaApEn; // Alfa es un Apuntador a un Entero int *BetaApEn; // Beta es un Apuntador a un Entero int *XArApEn[2]; // X es un Arreglo de dos Apuntadores a Enteros <AEn> <BEn> int *AlfaApEn; // Alfa es un Apuntador a un Entero int *BetaApEn; // Beta es un Apuntador a un Entero int *XArApEn[2]; // X es un Arreglo de dos Apuntadores a Enteros int *AEn; int *BEn; int *AlfaApEn; // Alfa es un Apuntador a un Entero

Pgina 173 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

int *BetaApEn; // Beta es un Apuntador a un Entero int *XArApEn[2]; // X es un Arreglo de dos Apuntadores a Enteros int *AEn = 5; int *BEn = 10; int *AlfaApEn; // Alfa es un Apuntador a un Entero int *BetaApEn; // Beta es un Apuntador a un Entero int *XArApEn[2]; // X es un Arreglo de dos Apuntadores a Enteros int int int Entero int Entero int *AEn = 5; *BEn = 10; *AlfaApEn = &AEn; *BetaApEn = &BEn; *XArApEn[2];

// Alfa es un Apuntador a un // Beta es un Apuntador a un

// X es un Arreglo de dos Apuntadores // a Enteros

int int int Entero int Entero int

*AEn = 5; *BEn = 10; *AlfaApEn = &AEn; *BetaApEn = &BEn;

// Alfa es un Apuntador a un // Beta es un Apuntador a un

*XArApEn[2] = {AlfaApEn, BetaApEn }; // X es un Arreglo de dos // Apuntadores a Enteros

#include <stdio.h> #include <conio.h> void main(void){ int AEn = 5; int BEn = 10; int *AlfaApEn = &AEn; int *BetaApEn = &Ben; int *XArApEn[2] = {AlfaApEn, BetaApEn}; clrscr(); printf("%d %d", AEn, BEn); printf("%d %d", *AlfaApEn, *BetaApEn); printf("%d %d", *XArApEn[0], *XArApEn[1]); getch();

Pgina 174 de 208

Ingeniera y Ciencia de la Computacin } Problema 2 Enunciado p es un Apuntador a un Arreglo de dos Enteros. Diagrama p -> Ar[2] En Solucin #include <stdio.h> #include <conio.h> void main(void){ int XArEn[2] = {1, 2}; int (*pApArEn)[2] = (int ((*)[2]))XArEn;

Hugo Rangel

clrscr(); printf("%d %d\n", XArEn[0], XArEn[1]); printf("%d %d", (*pApArEn)[0], (*pApArEn)[1]); getch(); } Se propone el siguiente problema del cual se proporciona la solucin. El lector debe aplicar sistematicamente las reglas previamente utilizadas en los dos ejemplos anteriores. Este tercer problema combina a los dos anteriores. Problema 3 Enunciado p es un Apuntador a un Arreglo de dos Apuntadores a Enteros. Diagrama p->Ar[2]->En Solucin // p es un Apuntador a un Arreglo de dos Apuntadores a Enteros // p->Ar[2]->En
Pgina 175 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

#include <stdio.h> #include <conio.h> void main(void){ int AEn = 1; int BEn = 2; int *AlfaApEn = &Aen; int *BetaApEn = &Ben; int *XArApEn[2] = AlfaApEn, BetaApEn}; int *(*pApArApEn)[2] = (int (*(*)[2]))XArApEn; clrscr(); printf("%d printf("%d printf("%d printf("%d getch(); } %d\n", AEn, BEn); %d\n", *AlfaApEn, *BetaApEn); %d\n", *XArApEn[0], *XArApEn[1]); %d", *(*pApArApEn)[0], *(*pApArApEn)[1]);

Pgina 176 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Captulo 12

Funciones y Apuntadores

Pgina 177 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 178 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Objetivo general El alumno explicara la relacin entre un apuntador constante y el nombre de las funciones. Usara apuntadores a funciones, funciones que devuelven apuntadores y usara identificadores en los que intervienen apuntadores, arreglos, funciones y otros en sus programas.

Contenido 16.- Funciones y apuntadores 16.1- Introduccin 16.2.- Representacin fsica (memoria) y lgica (visual) de la funcin 16.2.1.- El nombre de una funcin como un apuntador constante 16.2.2.- El identificador apuntador a una funcin 16.2.3.- Identificadores en los que intervienen apuntadores, arreglos y funciones 16.3.- Resumen 16.4.- Ejercicios

Pgina 179 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

15.0 Introduccin Entre los apuntadores y las funciones, en el lenguaje C / C++, tambin existe una sinergia que potencia enormemente la flexibilidad de uso de ambos cuando aparecen yuxtapuestos en una expresin de la notacin Mx. La regla a seguir tambin es simple, sin embargo, su aplicacin demanda del aprendiente una sostenida actitud de autodisciplina. 14.1 La sinergia entre un apuntador variable y el nombre de una funcin

El siguiente enunciado expresa la relacin que hay entre un apuntador y el nombre de una funcin en el lenguaje C / C++:
El nombre de una funcin es un apuntador constante que seala a la primer instruccin de la funcin.

Considere los dos enunciados siguientes: Alfa es una Funcin(dos argumentos enteros) Entera {devuelve la suma de sus dos argumentos Enteros} P es un Apuntador a una Funcin(dos argumentos Enteros) Entera {devuelve la suma de sus dos argumentos Enteros} Obtenemos
int AlfaFnEn(int AEn, int BEn){ return (AEn + BEn); } void main(void){ int (*PApFnEn)(int, int); PApFnEn = AlfaFnEn; } printf(%d, PApFnEn(5, 5));

La segunda partcula nos indica que debemos yuxtaponer a la derecha de la expresin la sintaxis para una funcin, es decir: AlfaFnEn(...) Colocamos el argumento AlfaFnEn(AEn)

Pgina 180 de 208

Ingeniera y Ciencia de la Computacin Luego la base y el punto y coma. Int AlfaFnEn(AEn); Con lo que hemos obtenido el prototipo de una funcin.

Hugo Rangel

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6.7 La Regla del Apuntador. Esta regla asocia la sintaxis de apuntadores a la notacin. Considere el enunciado: p es un Apuntador a un Entero. Tenemos pApEn la segunda partcula nos indica que debemos yuxtaponer a la derecha de la notacin un asterisco y luego parentizar toda la expresin. (*pApEn) consideremos la base y el punto y coma. int (*pApEn); El parntesis ms externo siempre se omite, este es el caso, luego: Int *pApEn; Expresiones ms complejas. Le sorprender la flexibilidad que se logra con tan solo estas tres reglas simples, para mostrarlo consideremos un ejemplo ms elaborado. q es un Apuntador a un Arreglo de dos Apuntadores a Enteros. La notacin Mex es: qApArApEn Utilizando dos de las tres reglas int *(*qApArApEn)[2]; Otro ejemplo. Considere el siguiente:

Pgina 181 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

p es un Apuntador a un Arreglo de Apuntadores a Funciones Apuntador a dos Enteros. La notacin es: pApArApFnApEn aplicando las tres reglas dadas antes. int *(*(*pApArApFnApEn)[2])(void); Si duda de la veracidad de una de las expresiones obtenidas verifquelas en su compilador C o C++ de su preferencia. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 14.2.2.- Identificadores en los que intervienen apuntadores y funciones En esta seccin se resuelven tres problemas que incluyen apuntadores y funciones. Cada problema contiene un encunciado, su diagrama Mex correspondiente y la solucin al mismo.

Problema 1
/* Enunciado y es una Funcin Apuntador a un Entero. ----------------------------------------------Diagrama y Fn() -> En Solucin */ #include <stdio.h> #include <conio.h> int *yFnApEn(void){ int *AApEn = new int; *AApEn = 8; return AApEn; } void main(void){ clrscr(); printf("%d", *yFnApEn()); getch(); Pgina 182 de 208

Ingeniera y Ciencia de la Computacin } Problema 2


/* Enunciado q es un Apuntador a una Funcin Entera. --------------------------------------------Diagrama q -> Fn() En Solucin */ #include <stdio.h> #include <conio.h> int AFnEn(void){ return 12; } void main(void){ int (*qApFnEn)(void) = AFnEn; clrscr(); printf("%d ", AFnEn()); printf("%d", (*qApFnEn)()); getch(); }

Hugo Rangel

Problema 3

/* Enunciado q es un Apuntador a una Funcin Apuntador a un Entero. -----------------------------------------------------------Diagrama q -> Fn() -> En Solucin */ #include <stdio.h> #include <conio.h> int *wFnApEn(void){ int *AApEn = new int; *AApEn = 8; return AApEn;

void main(void){ int *(*qApFnApEn)(void) = wFnApEn; clrscr(); printf("%d ", *wFnApEn()); printf("%d", *(*qApFnApEn)()); getch(); }

Pgina 183 de 208

Ingeniera y Ciencia de la Computacin Problema 4


/* Enunciado X es un Arreglo de dos Apuntadores a Funciones Enteras. -------------------------------------------------------------

Hugo Rangel

Diagrama
X Ar[2] -> Fn() En Solucin */ #include <stdio.h> #include <conio.h> int AFnEn(void){ return 5; } int BFnEn(void){ return 10;

}
void main(void){ int (*XArApFnEn[2])(void) = {AFnEn, BFnEn}; clrscr(); printf("%d %d\n", AFnEn(), BFnEn()); printf("%d %d", (*XArApFnEn[0])(), (*XArApFnEn[1])()); getch(); }

Problema 5

/* Enunciado X es un Arreglo de dos Apuntadores a Funciones Apuntador a Enteros. ------------------------------------------------------------------------Diagrama X Ar[2] -> Fn() -> En Solucin */ #include <stdio.h> #include <conio.h> int *AFnEn(void){ int *AApEn = new int; *AApEn = 5; return AApEn; } int *BFnEn(void){ int *BApEn = new int; *BApEn = 10; return BApEn; } void main(void){ int *(*XArApFnApEn[2])(void) = {AFnEn, BFnEn};

Pgina 184 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

clrscr(); printf("%d %d\n", *AFnEn(), *BFnEn()); printf("%d %d", *(*XArApFnApEn[0])(), *(*XArApFnApEn[1])()); getch(); }

Problema 6
/* Enunciado

p es un Apuntador a un Arreglo de dos Apuntadores a Funciones Enteras. Diagrama p -> Ar[2] -> Fn() En Solucin */ #include <stdio.h> #include <conio.h> int AFnEn(void){ return 5; } int BFnEn(void){ return 10; } void main(void){ int (*XArApFnEn[2])(void) = {AFnEn, BFnEn}; int (*(*pApArApFnEn)[2])() = (int (*(*)[2])())XArApFnEn; clrscr(); printf("%d %d\n", AFnEn(), BFnEn()); printf("%d %d\n", (*XArApFnEn[0])(), (*XArApFnEn[1])()); printf("%d %d", (*(*pApArApFnEn)[0])(), (*(*pApArApFnEn)[1])()); getch();

Problema 7
/* Enunciado p es un Apuntador a un Arreglo de dos Apuntadores a Funciones Apuntador a Enteros. Diagrama p |-> Ar[2] |-> Fn() |-> En Solucin */ #include <stdio.h> #include <conio.h>

Pgina 185 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

int *AFnApEn(void){ int *AApEn = new int; *AApEn = 5; return AApEn; } int *BFnApEn(void){ int *AApEn = new int; *AApEn = 10; return AApEn; } void main(void){ int *(*XArApFnApEn[2])(void) = {AFnApEn, BFnApEn}; int *(*(*pApArApFnApEn)[2])() = (int *(*(*)[2])())XArApFnApEn; clrscr(); printf("%d %d\n", *AFnApEn(), *BFnApEn()); printf("%d %d\n", *(*XArApFnApEn[0])(), *(*XArApFnApEn[1])()); printf("%d %d", *(*(*pApArApFnApEn)[0])(), *(*(*pApArApFnApEn)[1])()); getch();

Pgina 186 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Captulo 13

Estructuras y Apuntadores

Pgina 187 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 188 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Objetivo general El alumno explicara la diferencia entre la notacin de flecha y la notacin de punto. Usara apuntadores a estructuras e identificadores en los que intervienen apuntadores, arreglos, funciones y estructuras en sus programas.

Contenido 17.- Estructuras y apuntadores 17.1.- Introduccin 17.2.- Representacin fsica (memoria) y lgica (visual) de la estructura 17.2.1.- Apuntadores y estructuras 17.2.2.- Identificadores en los que intervienen apuntadores y estructuras 17.2.3.- Identificadores en los que intervienen apuntadores, estructuras, arreglos y funciones

Pgina 189 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Esta regla asocia la sintaxis de apuntadores a la notacin. Considere el enunciado: p es un Apuntador a X Estructura con: q es un apuntador a un Vector de dos Enteros y r es una Funcin Entera. La notacin Mex es: pApXEs aplicando las reglas vistas con anterioridad tenemos XEs *pApXEs; Ntese que hemos usado XEs como la partcula base. Ahora hay que declarar a la estructura (variable) a la que ha de sealar el apuntador. XEs LaXEs; XEs *pApXEs; Finalmente declaramos a la estructura (tipo de variable) utilizando la palabra reservada struct. int AlfaFnEn(void){ return 10; } struct XEs{ int *qApVcEn[2]; Int rFnEn(void); }; XEs LaXEs; XEs *pApXEs; Ahora iniciamos en tiempo de compilacin a todas las variables correspondientes en las declaraciones. int AlfaFnEn(void){ return 10; } struct XEs{ int *qApVcEn[2]; Int rFnEn(void);
Pgina 190 de 208

Ingeniera y Ciencia de la Computacin }; XEs LaXEs = {&{5, 7}, AlfaFnEn}; XEs *pApXEs = &LaXEs;

Hugo Rangel

Pgina 191 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Problema 1 /*
Enunciado Una Es W con q es un Apuntador a un Carcter y B es un Entero. ++++++++++++++++++++++++++++++++++++++++++++++ Diagrama Es X { q -> Ca B En } Solucin

*/

#include <stdio.h> #include <conio.h> typedef struct{ char *qApCa; int BEn; }EsX; void main(void){ char ACa = 'A'; EsX XEsEsX = {&ACa, 10}; clrscr(); printf("%c %d", *EsX.qApCa, EsEsX.BEn); getch(); }

Problema 2 /*

Enunciado p es un Apuntador a una Es X con A es un Carcter y B es un Entero. ++++++++++++++++++++++++++++++++++++++++++++++ Diagrama p -> Es X { A Ca B En } Solucin */ #include <stdio.h> #include <conio.h> typedef struct { char ACa; int BEn; }EsX;

Pgina 192 de 208

Ingeniera y Ciencia de la Computacin


void main(void){ EsX XEsX = {'A', 10}; EsX *pApEsX = &XEsX; clrscr(); printf("%c %d\n", XEsX.ACa, XEsX.BEn); printf("%c %d", (*pApEsX).ACa, (*pApEsX).BEn); getch(); }

Hugo Rangel

Problema 3

/* Enunciado p es un Apuntador a una Estructura X con: A es un Carcter y q es un Apuntador a un Entero. +++++++++++++++++++++++++++++++++++++++++++++++++++ Diagrama p -> Es X { A Ca q -> En } Solucin */ #include <stdio.h> #include <conio.h> typedef struct { char ACa; int *qApEn; }EsX; void main(void){ int AEn = 5; EsX XEsX = {'A', &AEn}; EsX *pApEsX = &XEsX; clrscr(); printf("%c %d\n", XEsX.ACa, *XEsX.qApEn); printf("%c %d", (*pApEsX).ACa, *(*pApEsX).qApEn); getch();

Problema 4
/* Enunciado p es un Apuntador a una Estructura X con A es un Carcter y X es un Arreglo de dos Enteros. +++++++++++++++++++++++++++++++++++++++++++++++ Diagrama p -> Es X { A Ca X Ar[2] En }

Pgina 193 de 208

Ingeniera y Ciencia de la Computacin


Solucin */ #include <stdio.h> #include <conio.h> typedef struct { char ACa; int XArEn[2]; }EsX; void main(void){ EsX AEsX = {'A', {5, 10}}; EsX *pApEsX = &AEsX;

Hugo Rangel

clrscr(); printf("%c %d %d\n", AEsX.ACa, AEsX.XArEn[0], AEsX.XArEn[1]); printf("%c %d %d", (*pApEsX).ACa, (*pApEsX).XArEn[0], *pApEsX).XArEn[1]); getch();

Problema 5
/* Enunciado p es un Apuntador a una Estructura X con A es un Carcter y X es un Arreglo de dos Apuntadores a Enteros. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Diagrama p -> Es X { A Ca X Ar[2] -> En } Solucin */ #include <stdio.h> #include <conio.h> typedef struct { char ACa; int *XArApEn[2]; }EsX; void main(void){ int AEn = 5, BEn = 10; EsX AEsX = {'A', {&AEn, &BEn}}; EsX *pApEsX = &AEsX; clrscr(); printf("%c %d %d\n", AEsEsX.ACa, *AEsX.XArApEn[0], *AEsX.XArApEn[1]); printf("%c %d %d", (*pApEsX).ACa, *(*pApEsX).XArApEn[0], *(*pApEsX).XArApEn[1]); getch();

Pgina 194 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Problema 6
/* Enunciado p es un Apuntador a una Estructura X con A es un Carcter y q es un Apuntador a un Arreglo de dos Enteros. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Diagrama p -> Es X { A Ca q -> Ar[2] En } Solucin */ #include <stdio.h> #include <conio.h> typedef struct { char ACa; int (*qApArEn)[2]; }EsX; void main(void){ int XArEn[2] = {5, 10}; EsX AEsX = {'A', (int (*)[2])XArEn}; EsX *pApEsX = &AEsX; clrscr(); printf("%c %d %d\n", AEsX.ACa, (*AEsX.qApArEn)[0], (*AEsX.qApArEn)[1]); printf("%c %d %d", (*pApEsX).ACa, (*(*pApX).qApArEn)[0], (*(*pApEsX).qApArEn)[1]); getch(); }

Problema 7

/* Enunciado p es un Apuntador a una Estructura X con A es un Carcter y q es un Apuntador a un Arreglo de dos Apuntadores a Enteros. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Diagrama p -> Es X { A Ca q -> Ar[2] -> En } Solucin */ #include <stdio.h> #include <conio.h> typedef struct { char ACa; int *(*qApArApEn)[2];

Pgina 195 de 208

Ingeniera y Ciencia de la Computacin


}EsX; void main(void){ int AEn = 5, BEn = 10; int *XArApEn[2] = {&AEn, &BEn}; EsX AEsX = {'A', (int *(*)[2])XArApEn}; EsX *pApEsX = &AEsX;

Hugo Rangel

clrscr(); printf("%c %d %d\n", AEsX.ACa, *XArApEn[0], *XArApEn[1]); printf("%c %d %d\n", AEsX.ACa, *(*AEsX.qApArApEn)[0], *(*AEsX.qApArApEn)[1]); printf("%c %d %d", (*pApEsX).ACa, *(*(*pApEsX).qApArApEn)[0], *(*(*pApEsX).qApArApEn)[1]); getch();

Problema 8
/* Enunciado p es un Apuntador a una Estructura X con A es un Carcter y q es un Apuntador a una Funcin. +++++++++++++++++++++++++++++++++++++++++++++++++ Diagrama p -> Es X { A Ca q -> Fn() } Solucin */ #include <stdio.h> #include <conio.h> typedef struct { char ACa; void (*qApFn)(void); }EsX; void AFn(void){ puts("Esta es la funcin A"); } void main(void){ EsX XEsElem = {'A', AFn}; EsX *pApEsX = &XEsX; clrscr(); printf("%c ", XEsX.ACa); (*XEsX.qApFn)(); printf("%c ", (*pApEsX).ACa); (*(*pApEsX).qApFn)(); getch(); }

Problema 9
/* Enunciado

Pgina 196 de 208

Ingeniera y Ciencia de la Computacin


p es un Apuntador a una Estructura X con A es un Carcter y q es un Apuntador a una Funcin Entera. ++++++++++++++++++++++++++++++++++++++++++++++++++ Diagrama p -> Es X { A Ca q -> Fn() En } Solucin */ #include <stdio.h> #include <conio.h> typedef struct X{ char ACa; int (*qApFnEn)(void); }EsX; int AFnEn(void){ return 12; } void main(void){ EsX AlfaEsX = {'A', AFnEn}; EsX *pApEsX = &AlfaEsX;

Hugo Rangel

clrscr(); printf("%c %d\n", AlfaEsX.ACa, (*AlfaEsX.qApFnEn)()); printf("%c %d", (*pApEsElemX).ACa, (*(*pApEsX).qApFnEn)()); getch();

Problema 10
/* Enunciado p es un Apuntador a una Estructura X con A es un Carcter y q es un Apuntador a una Funcin Apuntador a un Entero. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Diagrama p -> Es X { A Ca q -> Fn() -> En } Solucin */ #include <stdio.h> #include <conio.h> typedef struct { char ACa; int *(*qApFnApEn)(void); }EsX; int *AFnApEn(void){

Pgina 197 de 208

Ingeniera y Ciencia de la Computacin


int *AApEn = new int; *AApEn = 12; return AApEn;

Hugo Rangel

void main(void){ EsX XEsX = {'A', AFnApEn}; EsX *pApEsX = &XEsX; clrscr(); printf("%c %d\n", XEsX.ACa, *(*XEsX.qApFnApEn)()); printf("%c %d", (*pApEsX).ACa, *(*(*pApEsX).qApFnApEn)()); getch();

Problema 11

/* Enunciado p es un Apuntador a una Estructura Elem con: A es un Carcter y X es un Arreglo de dos Enteros. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Diagrama p -> Es X { A Ca X Ar[2] En } Solucin */ #include <stdio.h> #include <conio.h> typedef struct { char ACa; int XArEn[2]; }EsX; void main(void){ EsX BetaEsX ={'A', {1, 2}}; EsX *pApEsX = &BetaEsX; clrscr(); printf("%c %d %d\n", BetaEsX.ACa, BetaEsX.XArEn[0], BetaEsElem.XArEn[1]); printf("%c %d %d", *pApEsX).ACa, (*pApEsX).XArEn[0], (*pApEsX).XArEn[1]); getch(); }

Problema 12

/* Enunciado p es un Apuntador a una Estructura X con: A es un Carcter y X es un Arreglo de dos Apuntadores a Enteros. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Pgina 198 de 208

Ingeniera y Ciencia de la Computacin


Diagrama p -> Es X { A Ca X Ar[2] -> En } Solucin */ #include <stdio.h> #include <conio.h> typedef struct { char ACa; int *XArApEn[2]; }EsX; void main(void){ int AEn = 1, BEn = 2; EsX AesX ={'A', {&AEn, &BEn}}; EsX *pApEsX = &AEsX;

Hugo Rangel

clrscr(); printf("%c %d %d\n", AEsX.ACa, *AEsX.XArApEn[0], *XEsX.XArApEn[1]); printf("%c %d %d", (*pApEsX).ACa, *(*pApEsX).XArApEn[0], *(*pApEsX).XArApEn[1]); getch(); }

Problema 13

/* Enunciado p es un Apuntador a una Estructura X con: A es un Carcter y X es un Arreglo de dos Apuntadores a Funciones Enteras. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Diagrama p -> Es X { A Ca X Ar[2] -> Fn() En } Solucin */ #include <stdio.h> #include <conio.h> typedef struct { char ACa; int (*XArApFnEn[2])(); }EsX; int AFnEn(void){ return 5; } int BFnEn(void){ return 10;

Pgina 199 de 208

Ingeniera y Ciencia de la Computacin


} void main(void){ EsX BEsEsX ={'A', {AFnEn, BFnEn}}; EsX *pApEsX = &BEsX;

Hugo Rangel

clrscr(); printf("%c %d %d\n", AEsX.ACa, (*AEsX.XArApFnEn[0])(), (*AEsX.XArApFnEn[1])()); printf("%c %d %d", (*pApEsX).ACa, (*(*pApEsX).XArApFnEn[0])(), (*(*pApEsElem).XArApFnEn[1])()); getch();

Problema 14
/* Enunciado p es un Apuntador a una Estructura X con A es un Carcter y X es un Arreglo de dos Apuntadores a Funciones Apuntador a Enteros. ----------------------------------------------------------------------Diagrama p -> Es X { A Ca X Ar[2] -> Fn() -> En } Solucin */ #include <stdio.h> #include <conio.h> typedef struct { char ACa; int *(*XArApFnApEn[2])(); }EsX; int *AFnEn(void){ int *AApEn = new int; *AApEn = 5; return AApEn; } int *BFnEn(void){ int *AApEn = new int; *AApEn = 10; return AApEn; } void main(void){ EsX XEsX ={'A', {AFnEn, BFnEn}}; EsX *pApEsX = &XEsX; clrscr();

Pgina 200 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

printf("%c %d %d\n", XEsX.ACa, *(*XEsX.XArApFnApEn[0])(), *(*XEsX.XArApFnApEn[1])()); printf("%c %d %d", (*pApEsX).ACa, *(*(*pApEsX).XArApFnApEn[0])(), *(*(*pApEsX).XArApFnApEn[1])()); getch(); }

Problema 15

/* Enunciado p es un Apuntador a una Estructura X con A es un Carcter y q es un Apuntador a un Arreglo de dos Apuntadores a Funciones Enteras. ------------------------------------------------------------------------Diagrama p -> Es X { A Ca q -> Ar[2] -> Fn() En } Solucin */ #include <stdio.h> #include <conio.h> typedef struct { char ACa; int (*(*qApArApFnEn)[2])(); }EsX; int AFnEn(void){ return 5; } int BFnEn(void){ return 10; } void main(void){ int (*XArApFnEn[2])() = {AFnEn, BFnEn}; EsX XEsX ={'A', (int (*(*)[2])())XArApFnEn}; EsX *pApEsX = &XEsX; clrscr(); printf("%c %d %d\n", XEsX.ACa, (*(*XEsX.qApArApFnEn)[0])(), (*(*XEsElem.qApArApFnEn)[1])()); printf("%c %d %d", (*pApEsX).ACa, (*(*(*pApEsX).qApArApFnEn)[0])(), (*(*(*pApEsX).qApArApFnEn)[1])()); getch();

Problema 16
/* Enunciado

Pgina 201 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

p es un Apuntador a una Estructura X con A es un Carcter y q es un Apuntador a un Arreglo de dos Apuntadores a Funciones Apuntador a Enteros. ------------------------------------------------------------------------Diagrama p -> Es X { A Ca q -> Ar[ 2 ] -> Fn() -> En } Solucin */ #include <stdio.h> #include <conio.h> typedef struct { char ACa; int *(*(*qApArApFnApEn)[2])(); }EsX; int *AFnEn(void){ int *AApEn = new int; *AApEn = 5; return AApEn; } int *BFnEn(void){ int *AApEn = new int; *AApEn = 10; return AApEn; } void main(void){ int *(*XArApFnApEn[2])() = {AFnEn, BFnEn}; EsX XEsX ={'A', (int *(*(*)[2])())XArApFnApEn}; EsX *pApEsX= &XEsX; clrscr(); printf("%c %d %d\n", XEsX.ACa, *(*(*XEsX.qApArApFnApEn)[0])(), *(*(*XEsX.qApArApFnApEn)[1])()); printf("%c %d %d", (*pApEsX).ACa, *(*(*(*pApEsX).qApArApFnApEn)[0])(), *(*(*(*pApEsX).qApArApFnApEn)[1])()); getch();

Pgina 202 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Captulo 14

Referencias y Apuntadores

Pgina 203 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Pgina 204 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Objetivo general El alumno explicara el propsito y concepto de la referencia en el lenguaje C. Explicara tambin la diferencia entre un apuntador y una referencia. Usara estos conceptos en sus programas.

Contenido 16.- La Representacin en memoria fsica de una referencia 16.1.- Introduccin 16.2.- El propsito de las referencias en el lenguaje C 16.3.- Referencias 16.4.- Excepciones en el uso de referencias 16.5.- Resumen 16.6.- Ejercicios

Pgina 205 de 208

Ingeniera y Ciencia de la Computacin 16.1 16.2 Introduccin El propsito de las referencias en el lenguaje C

Hugo Rangel

Las referencias se introducen con el lenguaje C++, con el propsito de proporcionar un alias a una variable. Es simple y sencillamente un nombre alterno para una variable, por lo que una referencia no tiene existencia fsica. Con frecuencia los programadores confunden las referencias con apuntadores. En realidad las referencias se introducen en C++ [], porque no se puede sobrecargar un operador sin ellas []. Este punto se tratara con amplitud en el volumen II. 16.3 Referencias

Considrese el siguiente ejemplo:


A es un Entero R es una Referencia de un Entero

Su correspondiente notacin Mx es (identificadores)


AEn AlfaRfEn

La notacin Mex asociada con la sintaxis de cada identificador es:


int AEn; int &AlfaRfEn;

Los identificadores iniciados en tiempo de compilacin son:


int AEn = 5; int &AlfaRfEn = AEn;

La primer lnea asigna el valor de 5 al identificador AEn, y en la segunda el identificador AlfaRfEn es un nombre alterno para AEn. En realidad, la asignacin
int &AlfaRfEn = AEn;

no es una iniciacin normal. Simplemente RRfEn especifica a la variable a la que hace referencia, en este caso a: AEn. Toda referencia debe referenciar a una variable real en tiempo de declaracin (tiempo de compilacin) usando la sintaxis semejante a una asignacin tal como se muestra. La variable y la referencia a ella se tratan idnticamente. La situacin (al menos con respecto a las referencias) es similar a []
union { int AEn; int &AlfaRfEn; }

Pgina 206 de 208

Ingeniera y Ciencia de la Computacin Sin embargo las referencias no son uniones

Hugo Rangel

Es desafortunado que los diseadores del lenguaje hayan utilizado el smbolo & que usualmente significa direccin de, en vez de introducir otro smbolo que signifique referencia a, segn [] el smbolo @ es un buen candidato. Si
RRfEn = 10;

Entonces AEn tambin contiene este valor de 10, y a la inversa, si por ejemplo
AEn = 25;

Ahora la referencia y la variable contienen el valor de 25. Consideremos ahora:


int AEn = 5; int &AlfaRfEn = AEn; int *pApEn = &AEn;

Ntese que en la tercer lnea hemos declarado el apuntador pApEn al entero AEn. Ntese tambin que el smbolo & aparece en la segunda y tercer lnea, pero en los lados opuestos al smbolo de igualdad =. 16.4 Excepciones en el uso de referencias en el lenguaje C.

No existen referencias de referencias: ...RfRf..., ni apuntadores a referencias: ...ApRf..., recurdese que las referencias no tienen existencia fsica, en otras palabras, no podemos tener una referencia a algo que no tiene existencia fsica, ni un apuntador a algo que no tiene existencia fsica. Por ejemplo, si tenemos:
int AEn = 5; int &AlfaRfEn = AEn;

entonces
int &(&BetaRfRfEn) = AlfaRfEn;

no es vlido, y si por otra parte tenemos:


int &(*pApRfEn) = &AlfaRfEn;

Tampoco es vlido. Sin embargo si podemos tener apuntadores referencia a (...ApRf...), por ejemplo:
int *(&pApRfEn) = &AlfaEn;

es vlido.

Pgina 207 de 208

Ingeniera y Ciencia de la Computacin

Hugo Rangel

Bibliografa
[Tharp, 2008] Creativity step by step A conversation with the choreographer Twyla Tharp HBR, April 2008. [Csikszentmihalyi, 1998] Csikszentmihalyi, Mihaly Creatividad: El fluir y la sicologa del descubrimiento y la invencin Paids [Rubinstein, 1995] Rubinstein, Moshe F. & Firstenberg, Iris R. Patterns of problem solving, 2d edition Prentice Hall, 1995 [Dijkstra, 1989] Dijkstra, W. A method of programming Addison-Wesley Publishing Company, 1989 [Chesbrough, 2008] Chesbrough, Henry, Win Vanhaverbeke & West, Joel Open innovation: Researching a new paradigm Oxford University Press, 2008 [Foster, 1986] Foster, Richard Innovation: The attackers advantage Summit books, 1986 [Lpez, 2005] Lpez, Alfredo, Austin El modelo en la ciencia y en la cultura Siglo veintiuno editores y UNAM, 2005 [Rangel, 2008] Rangel, Hugo, Carren, Juan Jos, Granados, Hdz, Luciralia, Hdz., Arellano, Lucila Patricia,| Mendoza. Libros en lnea (eL) y bibliotecas digitales 4to Seminario de Ingeniera Lingstica, Facultad de Ingeniera, UNAM, 2008. [Rangel, 2008] Rangel, Hugo, Carren, Juan Jos, Granados, Hdz, Luciralia, Hdz., Arellano, Lucila Patricia, Mendoza. Los principios del aprendizaje en lnea 4to Seminario de Ingeniera Lingstica, Facultad de Ingeniera, UNAM, 2008. [Segr, 1982] Segre, Emilio Fermi Consejo Nacional de Ciencia y Tecnologa

Pgina 208 de 208

S-ar putea să vă placă și