sábado, 27 de abril de 2019

Referencias de las celdas en Excel - Ссылки на ячейки в Excel - References of cells in Excel


Ссылки на ячейки в Excel
References of cells in Excel
https://exceltotal.com/referencias-en-excel/

Referencias de las celdas en Excel

Las referencias en Excel son parte fundamental de la hoja de cálculo ya que a través de ellas podemos identificar cada una de las celdas de un libro de trabajo y de esa manera acceder al valor contenido en cualquiera de ellas.
El objetivo de este artículo es aclarar la mayor cantidad de dudas sobre el tema de referencias en Excel y será útil para aquellas personas que comienzan a utilizar la herramienta pero también para aquellos que ya tienen un poco de tiempo utilizando la hoja de cálculo y no han escuchado sobre temas como las referencias 3D o el estilo de referencia F1C1.
Ya que todos los valores de una hoja de cálculo están almacenados en las celdas, es de suma importancia para los usuarios de Excel conocer la manera en que deberán acceder a dichos valores utilizando las referencias. Sin más preámbulo, comenzaremos con este estudio de las referencias en Excel.

¿Qué son las referencias en Excel?

Todo usuario de Excel debe saber que todas las hojas están divididas en columnas y filas. Esta división se hace evidente en la interfaz gráfica de Excel de la siguiente manera:
  • Por debajo de la barra de fórmulas se encuentran los encabezados de columna identificados por una letra.
  • En el extremo izquierdo están los encabezados de fila que muestran un número.
  • En el área de trabajo tenemos una cuadrícula que delimita el área de cada celda de la hoja y donde se puede observar que cada una de ellas pertenece a una determinada columna y fila.
Referencias en Excel
En la imagen anterior, la celda seleccionada (celda activa)es la celda que se encuentra bajo la columna B y en la línea 3 y por lo tanto su dirección dentro de la hoja será B3. La referencia de una celda siempre constará de dos partes: la primera parte indicará la letra (o letras) de la columna a la que pertenece y la segunda parte indicará su número de fila.
Excel siempre nos ayudará a conocer fácilmente la referencia de la celda activa. En primer lugar, el encabezado de la columna y fila de la celda seleccionada estarán resaltados en un color diferente al resto de los encabezados. Además el Cuadro de nombres siempre mostrará la referencia de la celda activa tal como lo puedes observar en la siguiente imagen:
Ejemplos de referencias en Excel
En conclusión, la referencia de una celda nos indica su ubicación dentro de una hoja, es decir, nos ayuda a conocer rápidamente la columna y fila a las que pertenece.

Tipos de referencias en Excel

Una referencia siempre será la dirección de una celda dentro de una hoja y siempre estará formada por la columna y fila en donde se ubica la celda. Así que, cuando hablamos de tipos de referencias en Excel estamos hablando sobre los diferentes tipos de comportamiento que pueden tener las referencias al momento de ser copiadas a otras celdas.
Es muy fácil copiar fórmulas en Excel, pero ¿qué sucede con las referencias de dicha fórmula al momento de hacer la copia? Es ahí en donde su comportamiento dependerá del tipo de referencia que se haya utilizado y analizaremos las alternativas que tenemos en las próximas tres secciones.

Referencias relativas en Excel

De manera predeterminada, las referencias en Excel son relativas. El término relativo significa que al momento de copiar una fórmula, Excel modificará las referencias en relación a la nueva posición donde se está haciendo la copia de la fórmula. Por ejemplo, supongamos que en la celda C1 tenemos la fórmula =A1+B1. En la siguiente imagen puedes observar el resultado de esta operación si tenemos los valores 5 y 3 en dichas celdas:
Referencias en Excel 2010
Si ahora copio (Ctrl+C) la fórmula de la celda C1 y la pego (Ctrl+V) en la celda C3, obtendré el siguiente resultado:
Tipos de referencias en Excel
La fórmula que ha sido copiada a la celda C3 nos devolverá como resultado el valor cero. Al revisar la fórmula de dicha celda nos daremos cuenta que eso se debe a que Excel ha modificado automáticamente las referencias de la fórmula. En lugar de la celda A1 ahora tenemos la celda A3, y en lugar de la celda C1 que teníamos originalmente, ahora tenemos la celda C3.
En este ejemplo hemos copiado la fórmula hacia una celda de la misma columna, pero dos filas por debajo y eso es lo que indicará a Excel el ajuste a realizar en las referencias. Ya que no hubo cambio en la columna, ésta permanecerá igual en la nueva fórmula, pero ya que copiamos una celda que está dos filas hacia abajo, Excel realizará dicho ajuste sumando la misma cantidad de filas a las referencias. Ahora observa lo que sucede si vuelvo a copiar la fórmula de la celda C1 y la pego en la celda F2.
Referencias relativas en Excel
En esta ocasión la nueva celda se encuentra una fila hacia abajo y tres columnas a la derecha de la celda original y por lo tanto las referencias se adecúan a tal movimiento añadiendo tres columnas y una fila a cada referencia de la fórmula copiada.
Las referencias relativas son muy útiles cuando necesitamos aplicar una misma fórmula sobre un rango de datos. Por ejemplo, en la siguiente imagen puedes ver una hoja donde las columnas A y B tienen valores numéricos y ahora necesito colocar la multiplicación de ambos valores en la columna C. Para hacerlo rápidamente, coloco la fórmula =A1*B1 en la celda C1 y posteriormente copio dicha fórmula hacia debajo:
Para qué sirven las referencias en Excel
De esta manera obtendremos automáticamente el resultado correcto para cada fila ya que Excel modifica las referencias en cada fórmula mientras es copiada hacia abajo.

Referencias absolutas en Excel

Hay ocasiones en las que necesitamos “fijar” la referencia a una celda de manera que permanezca igual aún después de ser copiada. Si queremos impedir que Excel modifique las referencias de una celda al momento de copiar la fórmula, entonces debemos convertir una referencia relativa en absoluta y eso lo podemos hacer anteponiendo el símbolo “$” a la letra de la columna y al número de la fila de la siguiente manera:
Referencias absolutas en Excel
Si tomamos el primer ejemplo de la sección anterior y utilizamos la fórmula =$A$1+$B$1 en la celda C1 y posteriormente copiamos dicha fórmula a la celda C3, obtendremos el siguiente resultado:
Referencias a celdas y rangos en Excel
En este caso la celda C3 devolverá el mismo resultado que la celda C1 porque ambas fórmulas hacen referencia a las mismas celdas aún después de haberla copiado. Tendremos el mismo efecto al copiar la fórmula de la celda C1 hacia la derecha:
Referencias relativas y absolutas en Excel
Al convertir las referencias en absolutas, no importa a donde copiemos la fórmula, dichas referencias permanecerán siempre fijas. Para dejar en claro el uso de las referencias absolutas, supondremos una tabla de datos como la siguiente:
¿Qué es una referencia en Excel?
La celda C2 hace el cálculo del área para el primer círculo tomando en cuenta el valor de Pi que está almacenado en la celda F1. En este momento la referencia a la celda F1 es relativa y si copio la formula hacia abajo obtendré el siguiente resultado:
Referencias absolutas y relativas en Excel
Al copiar la fórmula hacia abajo, Excel modifica la referencia a la celda F1 y le agrega una fila más para convertirla en una referencia a la celda F2 que es el comportamiento natural de las referencias relativas. Para hacer que nuestras fórmulas hagan siempre referencia a la celda F1 debemos transformar dicha referencia en absoluta:
Cómo crear fórmulas con referencias absolutas en Excel
Observa con detenimiento que la única referencia que he convertido en absoluta es la de la celda $F$1. La otra referencia a la celda B2 la he dejado como relativa porque necesito que sea modificada por Excel para tomar el valor del radio de cada círculo conforme se copie la fórmula hacia abajo. El resultado después de copiar la fórmula será el siguiente:
Ejemplo de referencias absolutas en Excel
Todas las fórmulas harán referencia a la celda F1 porque está establecida como absoluta, pero Excel modificará correctamente las referencias a las celdas de la columna B para obtener el resultado correcto.
Con esto hemos cubierto los dos tipos de referencias en Excel más utilizados. Si quieres ver algunos ejemplos adicionales sobre estos dos tipos de referencias te recomiendo consultar el siguiente video tutorial: Referencias relativas y absolutas en Excel.

Referencias mixtas en Excel

En los ejemplos anteriores sobre referencias absolutas utilizamos el símbolo “$” para fijar tanto la columna como la fila. Sin embargo, es posible fijar solo la columna o fijar solo la fila y a estas variaciones se les conoce como referencias mixtas.
Si queremos fijar solamente la columna, anteponemos el símbolo “$” a la letra de la columna y dejamos la fila sin dicho símbolo. Si por el contrario deseamos fijar solamente la fila, entonces anteponemos el símbolo “$”al número de la fila. En la siguiente imagen podrás ver un resumen de los tipos de referencias que hemos revisado hasta ahora:
Referencias mixtas en Excel
Si colocas la fórmula =$A1 dentro de la celda B1 y copias la fórmula hacia la derecha verás que la fórmula se mantiene igual en todas las columnas porque hemos indicado que deseamos tener la columna $A fija. Por el contrario, si copias la fórmula hacia abajo, Excel modificará el número de fila:
Referencias en fórmulas de Excel
Sin embargo, si cambiamos el tipo de referencia mixta de la celda B1 por la fórmula =A$1 y copiamos hacia la derecha y hacia abajo, obtendremos un resultado diferente al anterior ya que habremos fijado solamente la fila:
Referencias relativas, absolutas y mixtas en Excel
Estos son los cuatro tipos de referencias de los cuales puedes elegir al momento de construir tus fórmulas. Recuerda que esta clasificación se basa en el comportamiento de la referencia al copiar una fórmula.

Cómo cambiar entre tipos de referencia

Un consejo muy útil para hacer más eficiente el tiempo invertido al ingresar cualquier referencia en una fórmula es el uso de la tecla F4 cuando nos encontramos en el modo de edición. Cuando el cursor de edición se encuentra sobre una referencia y pulsamos la tecla F4, Excel cambiará el tipo de referencia sin la necesidad de que ingresemos manualmente el símbolo “$”. Hagamos el siguiente ejemplo para conocer el funcionamiento de este atajo de teclado:
  1. Selecciona la celda B1 e ingresa la fórmula =A1 pero no pulses la tecla Entrar.
  2. El cursor de edición se encontrará parpadeando al final de la referencia y si pulsas la tecla F4 una vez, la referencia se transformará automáticamente en absoluta =$A$1.
  3. Si vuelves a pulsar la tecla F4 tendrás una referencia mixta como =A$1.
  4. Y si pulsas una cuarta vez la tecla F4, la referencia será cambiada por la otra opción de referencia mixta =$A1.
  5. Al pulsar una quinta vez la tecla F4 volverás a la referencia relativa original.
La tecla F4 solamente cambiará la referencia que está sobre el cursor de edición así que, si quieres aplicar este cambio en varias referencias de una misma fórmula, entonces deberás colocar el cursor sobre cada referencia que será cambiada y pulsar F4 cada vez.

Referencias a rangos de celdas

Hasta ahora hemos visto cómo hacer referencia a una sola celda, pero Excel nos permite hacer referencia a un conjunto de celdas adyacentes utilizando el operador de rango que está representado por los dos puntos (:) y que deberá colocarse entre dos referencias de celdas. Sin embargo, esas dos referencias de celdas no son al azar, sino que deben ser el extremo superior izquierdo y el extremo inferior derecho de las celdas adyacentes a las que deseamos referirnos.
Considera el siguiente grupo de celdas adyacentes donde cada una de ellas tiene un valor numérico. La referencia para este rango de celdas será B2:D4 y puedes ver que dicho rango es reconocido por Excel al momento de hacer la suma.
Definición de una referencia de celda en Excel
Esto definitivamente es una gran ventaja ya que de lo contrario tendríamos que indicar todas las referencias a las nueve celdas, pero con este método podemos referirnos fácilmente a todo el rango de celdas. Solo debes recordar que la primera referencia corresponde a la celda del extremo superior izquierdo y la segunda referencia a la celda inferior derecha.
Crear o modificar una referencia de celda en Excel
En este ejemplo ambas referencias son relativas, pero nada impide que utilicemos referencias absolutas al crear una referencia a un rango, por ejemplo: $B$2:$D$4. Todas las reglas que explique anteriormente para las referencias relativas, absolutas y mixtas también aplicarán para las referencias a rangos de celdas.

Referencias a celdas en otra hoja

En todos los ejemplos mostrados hasta este punto he utilizado referencias dentro de la misma hoja pero en más de una ocasión nos veremos en la necesidad de hacer referencia a una celda que se encuentra en una hoja diferente.
La única regla que debemos seguir es utilizar el nombre de la hoja donde se encuentra la celda de nuestro interés e inmediatamente colocar el signo de exclamación (¡) seguido de la referencia a la celda. De esta manera, si queremos referirnos a la celda C5 de la Hoja2, debemos hacerlo de la siguiente manera:
Cómo utilizar referencias en Excel
Una práctica que es altamente recomendable en las referencias a celdas de otra hoja, es rodear el nombre de la hoja con comillas simples (‘) ya que eso evitará cualquier error en caso de que el nombre de la hoja tenga un espacio en blanco, por ejemplo:
Cómo crear referencias a otras hojas de Excel
Para saber más sobre este tipo de referencias te recomiendo consultar el artículo Hacer referencia a celdas de otras hojas en Excel.

Referencias a celdas en otro libro

Si la celda que necesitas acceder se encuentra en otro libro, entonces deberás indicar el nombre del libro encerrado entre corchetes [] antes del nombre de la hoja de la siguiente manera:
Cuántos tipos de referencias hay en Excel
Este tipo de referencia funcionará solamente si el libro especificado está abierto y además está guardado en la misma ubicación que el libro actual. En caso contrario será necesario indicar la ruta completa donde se encuentra dicho libro:
Qué es una referencia absoluta en Excel
Observa que en este último ejemplo el nombre del libro y la hoja, así como la ruta, están encerrados entre comillas sencillas lo cual es ampliamente recomendable en caso de tener espacios en blanco en los nombres de las carpetas de la ruta, o en el nombre del libro u hoja.
Referencias a otros libros en Excel

Referencias 3D

Las referencias 3D son útiles cuando necesitamos hacer operaciones con las mismas celdas en diferentes hojas. Por ejemplo, si vamos a sumar la celda A1 de la Hoja1, Hoja2 y Hoja3, normalmente utilizaríamos la siguiente fórmula:
=SUMA(Hoja1!A1, Hoja2!A1, Hoja3!A1)
A diferencia de esta nomenclatura, las referencias 3D nos permiten indicar las mismas referencias de una manera abreviada:
=SUMA(Hoja1:Hoja3!A1)
Es muy importante mencionar que no es posible utilizar este tipo de referencias con cualquier función de Excel. Las funciones matemáticas y estadísticas son las que permitirán su uso pero no podrás utilizar este tipo de referencias en funciones de búsqueda como BUSCARV o COINCIDIR.
Referencias 3D en Excel
Además de acceder una sola celda en varias hojas utilizando las Referencias 3D, también puedes crear una referencia a un rango de celdas de la siguiente manera:
=SUMA(Hoja1:Hoja3!A1:C25)

El estilo de referencia F1C1

Los ejemplos de este artículo han utilizado el estilo de referencia A1 que es el predeterminado en Excel y que indica que las columnas serán identificadas por una letra, o combinación de letras, y que las filas serán identificadas por un número. Existe otro estilo de referencia en Excel, que no es tan común, pero que es necesario que lo conozcas por si llegas a encontrar algún equipo donde Excel utiliza el estilo de referencia F1C1 el cual identifica a las columnas y a las filas por su número. Así que en lugar de utilizar letras para las columnas, este estilo de referencia utiliza números para todas ellas.
Ya que sería difícil distinguir el número de la columna del número de la fila en una misma referencia, se antepone la letra “F” al número de la fila y la letra “C” al número de la columna. Algunos ejemplos de equivalencias en ambos estilos de referencia son los siguientes:
Estilo de referencia F1C1 en Excel
Para que Excel utilice este tipo de referencia debes ir a Archivo > Opciones > Fórmulas > Trabajando con fórmulas > Estilo de referencia F1C1.
Diferencias entre los tipos de referencias en Excel
Al seleccionar esta opción y aceptar los cambios, notarás de inmediato un cambio en los encabezados de columna ya que dejarán de ser letras y se mostrarán como números. Además podrás observar el estilo de referencia F1C1 en el Cuadro de nombres y ya no estará permitido utilizar el estilo de referencia anterior.
Tutorial de referencias en Excel
SI tu libro tenía fórmulas previamente ingresadas entonces Excel se encargará de mostrar automáticamente las referencias con el nuevo estilo y no será necesaria tu intervención en el cambio. Si quieres regresar al estilo de referencia A1 será suficiente con desmarcar la opción Estilo de referencia F1C1 del cuadro de diálogo Opciones de Excel.
La verdad es poco probable que alguna vez te veas forzado a utilizar el estilo de referencia F1C1, pero el concepto de utilizar valores numéricos para referirse a las columnas y filas es muy utilizado al programar en VBA ya que es mucho más fácil referirse programáticamente a las columnas por su número que por su letra.

Conclusión

Es importante que conozcas todos los aspectos de las referencias en Excel ya que juegan un papel fundamental en el uso de la hoja de cálculo y las fórmulas. Si comprendes correctamente su funcionamiento podrás evitar una gran cantidad de errores, y resultados incorrectos, que se generan en Excel por el uso incorrecto de las referencias.

martes, 23 de abril de 2019

Libro Diseno De Algoritmos Y Su Codificacion En Lenguaje C




Skip to main content



aLgoRiTmos 



María Adrjana Corona Nakamura 

María de los Ángeles Ancón» Valdez 








Diseño de algoritmos y 
su codificación en lenguaje C 



Diseño de algoritmos y 
su codificación en lenguaje C 



María Adriana Corona Nakamura 

Universidad de Guadalajara 



María de los Ángeles Ancona Valdez 

Universidad de Guadalajara 



Revisión técnica 
Miguel Orozco Malo 

Instituto Tecnológico y de Estudios Superiores de Monterrey, 
Campus Ciudad de México 



Carlos Villegas Quezada 

Universidad Iberoamericana, 
Ciudad de México 



i^n 



Sraw 






MÉXICO • BOGOTÁ • BUENOS AIRES • CARACAS • GUATEMALA 
LISBOA • MADRID • NUEVA YORK • SAN JUAN • SANTIAGO • AUCKLAND 
LONDRES • MILÁN • MONTREAL • NUEVA DELHI • SAN FRANCISCO 
SÁO PAULO • SINGAPUR • ST. LOUIS • SIDNEY • TORONTO 




Director Higher Education: Miguel Ángel Toledo Castellanos 
Editor sponsor: Pablo E. Roig Vázquez 
Coordinadora editorial: Marcela I. Rocha Martínez 
Editora de desarrollo: Ana L. Delgado Rodríguez 
Supervisor de producción: Zeferino García García 



DISEÑO DE ALGORITMOS Y SU CODIFICACIÓN EN LENGUAJE C 



Prohibida la reproducción total o parcial de esta obra, 
por cualquier medio, sin la autorización escrita del editor. 




Educación 



DERECHOS RESERVADOS © 2011, respecto a la primera edición por 
McGRAW-HILL/INTERAMERICANA EDITORES, S.A. DE C.V. 

A Subsidiary of The McGraw-Hill Companies, Inc. 

Edificio Punta Santa Fe 

Prolongación Paseo de la Reforma 1015, Torre A 
Piso 17, Colonia Desarrollo Santa Fe, 

Delegación Alvaro Obregón 
C.P. 01376, México, D.F. 

Miembro de la Cámara Nacional de la Industria Editorial Mexicana, Reg. Núm. 736 



ISBN: 978-607-15-0571-2 



1234567890 



1098765432101 



Impreso en México 



Printed in México 



The McGraW'Hill Companies 






Contenido 




Prefacio xi 

Capítulo 1. Conceptos básicos 1 

1.1 Definición de lenguaje de programación 2 

1.2 Definición de algoritmo 2 

1.3 Definición de programa de computadora 3 

1.4 Etapas o pasos en la creación de un programa 4 

1.4.1 Definición del problema 4 

1.4.2 Análisis del problema 4 

1.4.3 Diseño y técnicas para la formulación de un algoritmo 4 

1.4.4 Codificación 5 

1.4.5 Prueba y depuración 6 

1.4.6 Documentación 6 

1.4.7 Mantenimiento 6 

Capítulo 2. Los datos y las operaciones básicas 7 

2.1 Identificador 8 

2.2 Tipos de datos 8 

2.2.1 Datos numéricos 9 

2.2.2 Datos lógicos o booleanos 9 

2.2.3 Caracteres 10 

2.2.4 Tipovoid 10 





vi Contenido 



2.3 Variables 10 

2.3.1 Declaración de variables 10 

2.3.2 Reserva de memoria 11 

2.4 Constantes 11 

2.4.1 Uso de #define: creación de macros 12 

2.4.2 Usodeconst 12 

2.5 Operadores 13 

2.5.1 Operadores aritméticos 13 

2.5.2 Incremento y decremento 14 

2.5.3 Operadores relaciónales 15 

2.5.4 Operadores lógicos 15 

2.5.5 Operadores de asignación 16 

2.5.6 Operador condicional (?:) 17 

2.6 Prioridad de los operadores 18 

2.6.1 Prioridad de operadores aritméticos 1 8 

2.6.2 Regla asociativa 18 

2.7 Expresiones 19 

2.8 Palabras reservadas 20 

2.9 Comentarios 21 

2.10 Conversión de tipos 21 

2.10.1 Conversión forzada de tipos de datos 22 

2.10.2 El operador sizeof 22 

Capítulo 3. Programación estructurada 27 

3.1 Definición 28 

3.2 Estructuras de control y su clasificación 28 

3.3 Estructura de un algoritmo y de un programa 29 

3.3.1 Comentarios 29 

3.3.2 Declaración archivos de cabecera o encabezado (librerías o bibliotecas) 29 

3.3.3 Prototipos de funciones 30 

3.3.4 Declaración de variables globales y constantes 30 

3.3.5 El programa principal o función principal main() 30 

3.3.6 Declaración de funciones 30 

3.4 Estructura de control secuencial 32 

3.4.1 Ejercicios resueltos de la estructura de control secuencial 32 

3.5 Estructura de control selectiva o alternativa 49 

3.5.1 Estructura de control selectiva simple si (if) 50 

3.5.2 Estructura de control selectiva doble si/si-no (if/else) 51 



Contenido vii 



3.5.3 Anidamiento o escalonamiento si-si no-si (if-else-if) 52 

3.5.4 Ejercicios resueltos de la estructura de control selectiva 

simple si (if) y doble si/si-no (if/else) 53 

3.5.5 Estructura de control selectiva múltiple segun_sea (switch) 67 

3.5.6 Estructura de control selectiva segun_sea (switch) anidada 68 

3.5.7 Ejercicios resueltos de la estructura de control selectiva 

múltiple segun_sea (switch) 68 

3.6 Estructura de control repetitiva o de iteración condicional 79 

3.6.1 Contadores, acumuladores, centinelas y banderas 79 

3.6.2 Estructura de control repetitiva mientras (while) 81 

3.6.3 Ejercicios resueltos de la estructura de control repetitiva mientras (while) 82 

3.6.4 Estructura de control repetitiva hacer_mientras (do while) 94 

3.6.5 Ejercicios resueltos de la estructura de control repetitiva 

hacer_mientras (do_wh¡le) 94 

3.6.6 Estructura de control repetitiva desde (for) 1 07 

3.6.7 Ejercicios resueltos de la estructura de control repetitiva desde (for) 1 09 

3.6.8 Casos especiales del for 118 

3.6.9 Ejercicios resueltos de la estructura de control repetitiva en 

casos especiales desde (for) 119 

3.6.10 Ciclos anidados 126 

3.6.11 Ejercicios resueltos utilizando ciclos anidados 127 

Capítulo 4. Arreglos 135 

4.1 Definición 136 

4.2 Arreglos unidimensionales (vectores o listas) 137 

4.2.1 Inicialización de arreglos unidimensionales 138 

4.2.2 Lectura e impresión de un arreglo unidimensional 1 39 

4.2.3 Modificación de un elemento del arreglo unidimensional 141 

4.2.4 Arreglos de caracteres 141 

4.2.5 Ejercicios resueltos de arreglos unidimensionales 142 

4.3 Arreglos bidimensionales (matrices o tablas) 155 

4.3.1 Inicialización de arreglos bidimensionales 156 

4.3.2 Lectura e impresión de unos arreglos bidimensionales 1 56 

4.3.3 Modificación de un elemento de una matriz 1 57 

4.3.4 Ejercicios resueltos de arreglos bidimensionales 157 

Capítulo 5. Programación modular 171 

5.1 Definición 172 

5.2 Programa principal y funciones 173 

5.2.1 Programa principal o función ma¡n() 173 

5.2.2 Función 173 

5.2.3 Ámbito de las variables 173 



Contenido 



viii 



5.2.4 Llamada o invocación de una función 173 

5.2.5 Cómo se ejecuta un programa que contiene funciones 173 

5.2.6 Ubicación de una función en un programa 173 

5.3 Prototipo de una función 1 74 

5.4 Funciones sin paso de parámetros 174 

5.5 Ejercicios resueltos de funciones sin paso de parámetros 1 76 

5.6 Funciones con paso de parámetros 1 89 

5.6.1 Parámetros de una función 189 

5.6.2 Paso de parámetros en una función 189 

5.6.3 Paso de parámetros en funciones con vectores y matrices 193 

5.7 Ejercicios resueltos de funciones con paso de parámetros 1 93 

5.8 Recursividad 213 

5.9 Funciones predefinidas de lenguaje C 223 

5.1 0 Ejercicios resueltos de funciones predefinidas de lenguaje C 223 

5.10.1 Funciones para manejo de caracteres y cadenas 224 

5.10.2 Funciones de pantalla 231 

5.11 Creación de librerías en lenguaje C 237 

Capítulo 6. Registros o estructuras 239 

6.1 Definición de una estructura 240 

6.2 Tipos de datos definidos por el usuario typedef 242 

6.3 Asignación de valores a los campos de una estructura 243 

6.4 Acceso a los campos de un registro o estructura (struct) 244 

6.5 Arreglos de estructuras 246 

6.6 Estructuras anidadas 247 

6.7 Ejercicios resueltos de registros o estructuras (struct) 248 

Capítulo 7. Algoritmos de ordenamiento y búsqueda. Apuntadores 265 

7.1 Ordenación 266 

7.1.1 Ordenación interna 266 

7.2 Búsquedas 274 

7.2.1 Búsqueda secuencial 274 

7.2.2 Búsqueda binaria 276 

7.3 Apuntadores 278 

7.3.1 Dirección de una variable 278 

7.3.2 Declaración de apuntadores 278 



Contenido 



7.3.3 Asignación de apuntadores 278 

7.3.4 El operador -> 279 

7.3.5 Errores usuales 280 

7.3.6 Apuntadores a apuntadores 280 

7.3.7 Apuntadores para paso de parámetros por referencia 280 

Anexo A. Entrada y salida (e/s) en lenguaje C 285 

A.1 Entrada y salida formateada 286 

A.1.1 Entrada de datos: función scanf() 286 

A.1. 2 Salida de datos: función printff) 288 

A.2 Entrada y salida sin formato 290 

Anexo B. Diferencias entre Turbo C, Dev-Cpp y Code::Blocks 292 

Anexo C. Aplicaciones 295 

Anexo D. Código ASCII 309 

Anexo E. Glosario 311 

Glosario de funciones en lenguaje C 315 

Entrada y salida formateada (vea el anexo A) 316 

Entrada y salida sin formato (vea el anexo A) 316 

Funciones matemáticas (librería math.h) 31 7 

Funciones para manejo de caracteres y cadenas 31 7 

Operaciones con cadenas de caracteres, string.h y stdlib.h 318 

Funciones para la conversión de tipos, librería stdlib.h 318 

Manejo de consola, librerías conio.h y conio2.h (Dev-C+ + y Code::Blocks) 31 8 

Bibliografía y recursos de programación 320 

índice analítico 323 



Prefacio 




Es sabido que la interacción que tenemos con la computadora se da por medio de programas. La finalidad de 
este texto es que el lector sea capaz de elaborar programas a la medida de cualquier problema que enfrente, 
sin importar el área de aplicación. Lo anterior puede parecer complicado, sobre todo para los alumnos de las 
carreras que no son afines, incluso hay quienes llegan a considerar la materia como poco importante para su 
formación. Por ello, en este libro queremos demostrar que: 

♦ Programar es una tarea fácil. 

♦ La práctica fortalece la habilidad de programar. 

♦ La programación es útil para todas las áreas del conocimiento. 

El razonamiento de las computadoras es diferente al de los seres humanos, es por ello que a quienes comien- 
zan a programar les resulta una tarea difícil. El primer paso es no desesperarse, después se debe entender 
cómo razonan los humanos y posteriormente analizar cómo lo haría una computadora. Es importante hacer 
hincapié en que la parte más compleja de este proceso es el desarrollo de un algoritmo (diagrama de flujo 
o pseudocódigo), ya que constituye la parte lógica. Codificar, independientemente del lenguaje, es simple- 
mente trascribir un algoritmo al lenguaje respectivo. El concepto de algoritmo lo utilizamos, en general, 
todas las disciplinas basadas en las matemáticas y la física, por ende en la programación, y es la etapa previa 
a la codificación. 

Para llevar a cabo un programa necesitamos de un lenguaje de programación. Existen diferentes tipos, y 
en este libro nos enfocaremos específicamente en el lenguaje C estándar. También hay una gran variedad de 
compiladores, aquí utilizaremos tres de ellos: Turbo C, DEV-C + + y CodeBlocks; que son los más utilizados 
actualmente. Cabe destacar que todos los ejercicios presentados en el texto fueron probados en los compi- 
ladores antes citados. 

En este trabajo se pensó en manejar de manera paralela el diagrama de flujo, el pseudocódigo y el len- 
guaje C, debido a la dificultad que existe entre los alumnos para realizar la conversión de la parte algorítmica 
al código (lenguaje C en nuestro caso). 

Diseño de algoritmos y su codificación en lenguaje C introduce los conceptos fundamentales de la pro- 
gramación, especialmente en el diseño de algoritmos, la programación estructurada y la codificación en 
lenguaje C. Con esta obra el lector recibe una orientación básica y fundamental en dicha área. 

El texto sigue las reglas clásicas de construcción de diseño de programas estructurados. Enfatiza par- 
ticularmente el diseño de algoritmos, mostrándolos en sus múltiples expresiones: lenguaje natural, pseu- 





xii Prefacio 



docódigo, diagramas de flujo y lenguaje de programación. Asimismo, aborda la estructura de datos e inclu- 
ye gran cantidad de ejemplos explicados y ejercicios, con el objetivo de que el lector pueda comprobar su 
progreso de aprendizaje. 

El libro está estructurado en siete capítulos y un apartado de anexos. Los capítulos tienen una organi- 
zación similar. Inician con una definición de conceptos teóricos y culminan con un conjunto de ejemplos y 
ejercicios prácticos que el lector debe realizar para afianzar sus conocimientos. El alumno puede transitar 
fácilmente en el texto gracias a la incorporación de elementos de apoyo para entender y aprender los diferen- 
tes términos que se manejan. 

En el sentido conceptual, el primer capítulo presenta una amplia explicación de los algoritmos como 
técnica para describir los pasos ordenados y finitos que permiten resolver un problema o tarea específica, así 
como la diferencia entre algoritmos computacionales y algoritmos no computacionales. De igual manera, se 
definen y explican de forma sencilla otros conceptos básicos de la programación, entre los que destacan los 
lenguajes de programación y las etapas o pasos necesarios para la creación de programas de computadora. 

El principal insumo para un programa de computadora son los datos, puesto que a partir del procesa- 
miento de los mismos se obtienen diferentes tipos de información, que es básicamente el objetivo final de 
dichos programas. En este sentido, el segundo capítulo se centra en el análisis de los diferentes tipos de datos 
que existen y la forma de trabajar con ellos, de acuerdo con su naturaleza en el desarrollo de los programas. 
Con ejemplos muy claros y concisos se explican los tipos de datos, cómo se deben declarar las variables, el 
uso de las constantes, así como el papel tan importante que tienen los operadores y el buen manejo de estos 
al relacionar los datos dentro de las expresiones. 

El tercer capítulo está dedicado a la explicación exhaustiva de la programación estructurada como 
técnica de desarrollo de programas, con énfasis en sus bondades; es fácil escribir, verificar, leer y dar 
mantenimiento a los programas. De igual forma, este capítulo señala los puntos principales relacionados 
con la programación estructurada, tales como la estructura de datos, el diseño descendente, la programa- 
ción modular y, particularmente, en tres estructuras de control (secuencial, selectiva y repetitiva). 

En el cuarto capítulo se plantea la importancia de hacer un uso eficiente de los recursos mediante el ma- 
nejo de arreglos que permitan el ordenamiento y estructura de datos con la definición exacta de la memoria 
requerida. Dichos arreglos se clasifican, de acuerdo con las necesidades y requerimientos del programa, en 
dos tipos: unidimensionales y multidimensionales. 

El capítulo cinco refiere a la programación modular como un método para mejorar la productividad de 
los programas. Siendo ésta una solución para resolver problemas complejos, la cual tiene como propósito 
dividir el problema en partes más pequeñas, de tal manera que se conforman módulos que son más sencillos 
de resolver por separado. Este método, entre otras ventajas, ofrece la facilidad de mantenimiento de los pro- 
gramas, la detección de errores y la reutilización de código. Inicialmente analizamos las funciones definidas 
por el usuario y al final las funciones predefinidas por el lenguaje C. 

En el capítulo seis manejamos el tema de registros o estructuras; los cuales, a diferencia de un arreglo, 
nos permiten almacenar datos de diferente tipo en una sola variable. Comenzamos con la definición de un 
registro, después remarcamos las ventajas de definir nuestros propios tipos de datos, para accesar a las es- 
tructuras; por último los arreglos de estructuras y las estructuras anidadas. 

En el capítulo siete vemos cómo los métodos de ordenamiento nos permiten clasificar datos y con los 
métodos de búsqueda encontramos un elemento en un arreglo; para terminar con los apuntadores. La me- 
moria de una computadora puede verse como un vector de valores, donde cada una de sus posiciones es 
referenciada por un número hexadecimal llamado dirección. Los apuntadores o punteros son variables 
cuyo contenido es una dirección de memoria. 

En el anexo A nos damos cuenta que Lenguaje C no tiene palabras reservadas para la entrada/salida 
estándar del sistema (teclado y pantalla). Estas operaciones se realizan mediante funciones de biblioteca 
que encontramos en el archivo de cabecera stdio.h. La E/S con formato se realiza por medio de las funcio- 
nes scanf() y printf. Las / de scanf() y de printf() significan “con formato’’. En el caso de E/S de caracteres y 
cadenas vemos la conveniencia de utilizar la E/S sin formato. 

Actualmente existen varios compiladores del lenguaje, entre los más utilizados encontramos Turbo 
C, DEV-C++ y Code::Blocks. El turbo C surgió en el sistema DOS como un compilado idóneo para los 
alumnos que iniciaban a programar por la gran ayuda que contenía, posteriormente surgió la versión 4.5 
para Windows, pero lamentablemente tanto la versión libre como la que existía bajo licencia salieron del 



Prefacio 



xiii 



mercado. Existen el DEV-C++ y el Code::Blocks, ambos son software libre y se utilizan en la plataforma 
Windows; la desventaja del primero es que la última versión fue la 4.9. 9.2 (febrero de 2005); la ventaja de 
CodeBlocks es que también es compatible con Linux y la última versión fue la 10.05 (mayo de 2010). Las 
diferencias más importantes las encontramos en el anexo B. 

Las aplicaciones ponen de manifiesto lo aprendido en el presente libro; la programación se puede aplicar 
en las diferentes áreas de la ingeniería y ciencias exactas; es por ello que elegimos aplicaciones en las áreas de 
la química, la ingeniería en comunicaciones y electrónica; la ingeniería mecánica, la ingeniería civil y topo- 
grafía. En el anexo C apreciamos la codificación de las mencionadas aplicaciones. 

En el anexo D podemos consultar el código ASCII, el cual resulta ser muy útil, sobre todo cuando tene- 
mos problemas con la configuración del teclado. 

Un glosario de términos y de funciones de lenguaje C es bastante útil cuando comenzamos a programar; 
por ello incluimos uno en el anexo E. 

Asimismo, la obra se apoya en un CD, el cual contiene los siguientes recursos: 

1. Aplicaciones. 

Los métodos numéricos son bastante utilizados en las diferentes ingenierías y áreas afines, por lo que 
desarrollamos los programas de métodos que consideramos más importantes. 

Al final del curso a los alumnos se les pide un proyecto donde apliquen lo aprendido durante el ciclo 
respectivo, seleccionamos por lo menos uno de cada área. 

2. Los compiladores DEV-C+ + y Code::Blocks; así como la instalación de la librería conio2 para DEV-C+ 4- 
y Codeblocks. 

Se incluyen los Compiladores DEV-C+ + y Code::Blocks, ya que son software libre. 

Adicionalmente describimos la instalación de la librería conio2, ya que el conio normal de ambos no 
incluye las funciones de Borland C, como son: clrscr(), gotoxy(), textcolo(), etc. 

3. Ejercicios complementarios. 

En los ejercicios por completar el alumno será capaz de entender el algoritmo respectivo con base en el 
enunciado. En las pruebas a mano o de escritorio el alumno comprenderá cómo trabaja internamente la 
computadora. En el caso de los ejercicios abiertos de lenguaje C las versiones presentadas no son únicas, 
sólo le darán al alumno una idea de cómo puede crear su propia versión. 

4. Salida de los ejercicios resueltos. 

Dichas salidas se presentan para que el alumno aprecie las posibles salidas que puede obtener después 
de compilar los respectivos programas. 

La solución de todos los ejercicios incluidos en el CD está protegida ya que el propósito es que el alumno los 
capture, analice el algoritmo, vea la salida y posteriormente diseñe su propia versión. 

Como hemos visto el CD es de gran utilidad para reforzar los conocimientos adquiridos en cada uno de 
los temas presentados en el libro. 

Sobra decir que el texto es un valioso material de apoyo, sobre todo en los modelos educativos que fa- 
vorecen el autoaprendizaje, puesto que lleva al lector paso a paso de los conceptos más básicos a procesos 
complejos, con el apoyo de ejemplos que refuerzan su comprensión y con ejercicios que propician la práctica 
y aplicación progresiva del conocimiento adquirido. Su publicación es bienvenida porque contribuye a llenar 
uno de los vacíos que existen en la enseñanza de esta disciplina. 

Agradecemos de manera especial a Suhey Ayala Ramírez por su colaboración en esta edición. 

María Adriana Corona Nakamura 
María de los Ángeles Ancona Valdez 



Capítulo 




Conceptos básicos 




(§> 



Al término de este capítulo, 
el alumno será capaz de 



Contenido 



Identificar, describir y diferenciar conceptos 
básicos de la programación; así como com- 
prender la importancia de las etapas para 
la elaboración de programas. 



1 . 1 Definición de lenguaje de programación 

1 .2 Definición de algoritmo 

1 .3 Definición de programa de computadora 

1 .4 Etapas o pasos en la creación de un pro- 
grama 



1 




2 Capítulo 1 Conceptos básicos 



1 .1 Definición de lenguaje de programación 

El lenguaje de programación es la combinación de símbolos y reglas que permiten la elaboración de progra- 
mas con los cuales la computadora puede realizar tareas o resolver problemas de manera eficiente. 

Los lenguajes de programación se clasifican en: 

1. Lenguaje máquina. Las instrucciones son directamente entendióles por la computadora y no necesitan 
traductor para que la CPU (unidad de procesamiento central) pueda entender y ejecutar el programa. 
Utiliza un código binario (0 y 1), se basa en bits (abreviatura inglesa de dígitos binarios). 

2. Lenguaje de bajo nivel (ensamblador). Las instrucciones se escriben en códigos alfabéticos conocidos 
como mnemotécnicos. 

3. Lenguaje de alto nivel. Es semejante al lenguaje humano (en general en inglés), lo que facilita la elabora- 
ción y comprensión del programa. Por ejemplo Basic, Pascal, Cobol, Fortran, C, etcétera. 



1 .2 Definición de algoritmo 



Se denomina algoritmo al conjunto de pasos ordenados y finitos que permiten resolver un problema o tarea 
específica. Los algoritmos son independientes del lenguaje de programación y de la computadora que se vaya 
a emplear para ejecutarlo. 

Todo algoritmo debe ser: 

1. Finito en tamaño o número de instrucciones (tiene un primer paso y un último paso) y tiempo de ejecu- 
ción (debe terminar en algún momento). Por lo tanto, debe tener un punto particular de inicio y fin. 

2. Preciso. Debe tener un orden entre los pasos. 

3. Definido. No debe ser ambiguo (dobles interpretaciones); si se ejecuta el mismo algoritmo el resultado 
siempre será el mismo, sin importar las entradas proporcionadas. 

4. General. Debe tolerar cambios que se puedan presentar en la definición del problema. 

Toda actividad que realizamos la podemos expresar en forma de algoritmo. Existen dos tipos de algoritmos, 
los que se desarrollan para ser ejecutados por una computadora, llamados algoritmos computacionales, y los 
que realiza el ser humano, es decir, algoritmos no computacionales-, como ejemplos de éstos tenemos: 

1. Cambiar un neumático (llanta) de un automóvil. 

2. Preparar unos “huevos a la mexicana”. 

3. Calcular el área de un triángulo. 



Ejemplo 

© 



Un algoritmo para cambiar el neumático desinflado de un automóvil 

1. Inicio'. 

2. Bajar la herramienta y el neumático (llanta) de repuesto del automóvil. 

3. Aflojar los birlos del neumático pinchado. 

4. Acomodar el gato. 

5. Levantar el automóvil. 

6. Quitar los birlos del neumático desinflado. 

7. Quitar el neumático desinflado. 

8. Colocar el neumático de repuesto. 

9. Fijar los birlos del neumático de repuesto. 

10. Bajar el automóvil. 

1 1 . Apretar en forma definitiva los birlos del neumático de repuesto. 



( continúa ) 



Existen autores que en este tipo de algoritmos (no computacionales) no utilizan el Inicio y el Fin, ambos son opcionales. 



1 .3 Definición de programa de computadora 3 



( continuación ) 

12. Quitar el gato. 

1 3. Guardar el neumático desinflado y la herramienta. 

14. Fin. 

Si revisamos, este algoritmo es finito (tiene 12 pasos 2 ) y tiene un orden. 

Un algoritmo para preparar unos "huevos a la mexicana" 

1 . Poner la sartén en la estufa. 

2. Poner aceite en la sartén. 

3. Encender la estufa. 

4. Cortar cebolla, tomate y chile en pedazos pequeños. 

5. Poner la cebolla, el tomate y el chile en la sartén. 

6. Abrir los huevos y verterlos en un recipiente. 

7. Batir los huevos. 

8. Poner los huevos batidos en la sartén. 

9. Revolver la cebolla, tomate y el chile con los huevos hasta que queden estos últimos cocidos. 

10. Vaciarlos en un plato. 

Este algoritmo también es finito (tiene 10 pasos) y algunos pasos pueden estar en otro orden, por ejemplo 
los cuatro primeros puntos pudieron estar en un orden diferente y seguiríamos teniendo el mismo resultado. 

Un algoritmo para calcular el área de un triángulo 

1. Inicio. 

2. Solicitar (leer) los datos (la base y la altura). 

3. Multiplicar la base por la altura y el resultado dividirlo entre dos, y guardarlo en una variable. 

4. Mostrar (imprimir) el resultado almacenado en la variable. 

5. Fin. 

Al igual que en los dos ejemplos anteriores, se cumplen todas las características, solamente que este último 
algoritmo no es una situación cotidiana de la vida sino un cálculo específico el cual tiene un resultado exac- 
to, o sea un valor. 

1 .3 Definición de programa de computadora 

Existen diferentes conceptos; sólo mencionaremos tres: 

1. Es un algoritmo desarrollado en un determinado lenguaje de programación, para ser utilizado por la 
computadora; es decir, es una serie de pasos o instrucciones ordenadas y finitas que pueden ser proce- 
sadas por una computadora, a fin de permitirnos resolver un problema o tarea específica. 

2. Secuencia de instrucciones mediante las cuales se ejecutan diferentes acciones de acuerdo con los datos 
que se desee procesar en la computadora. 

3. Expresión de un algoritmo en un lenguaje preciso que puede llegar a entender una computadora. 



Ejemplo 



Ejemplo 



2 Sin considerar inicio y fin. 



Capítulo 1 Conceptos básicos 



Como se comentó en la sección anterior, no todo algoritmo puede llegar a ser programa de computadora, 
debido a que existen algunos algoritmos que requieren ser realizados físicamente. Los programas que puede 
ejecutar una computadora son más de carácter de proceso lógico, por ejemplo el tercer algoritmo en el cual 
se realizan cálculos respectivos. 



1 .4 Etapas o pasos en la creación de un programa 

Las fases para la creación de un programa son siete, aunque para algunos autores pueden describirse en sólo 
seis, pues omiten la primera porque es una etapa algo obvia. Las etapas se describen a continuación. 

1 .4.1 Definición del problema 

Esta fase la proporciona el enunciado del problema, el cual requiere una definición clara y precisa (no debe 
ser ambiguo). Es importante que se entienda perfectamente lo que pretendemos que haga la computadora 
para poder continuar con la siguiente etapa. 

1.4.2 Análisis del problema 

Una vez que se ha comprendido lo que se desea que la computadora haga, la etapa de análisis es muy impor- 
tante ya que en ésta se identifican tres factores indispensables: 

1. Qué información se necesita para obtener el resultado deseado (datos de entrada). 

2. Qué información se desea producir (datos de salida). 

3. Los métodos y fórmulas que se necesitan para procesar los datos y producir esa salida. 

1 .4.3 Diseño y técnicas para la formulación de un algoritmo 

La etapa de diseño se centra en desarrollar el algoritmo basándonos en las especificaciones de la etapa del 
análisis; podemos representar un algoritmo mediante el diagrama de flujo o el pseudocódígo. 

Diagrama de flujo 

Un diagrama de flujo es la representación gráfica de un algoritmo; dicha representación gráfica se lleva acabo 
cuando varios símbolos (que indican diferentes procesos en la computadora) se relacionan entre sí mediante 
líneas que indican el orden en que se deben ejecutar las instrucciones para obtener los resultados deseados. 
Los símbolos utilizados han sido reglamentados por el Instituto Nacional de Normalización Estadounidense 
(ANSI, American National Standards Institute) y los apreciamos en la tabla 1.1. 

Características de los diagramas de flujo: 

• Todo diagrama debe tener un inicio y un fin. 

• No se especifica la declaración de variables. 

• Se deben usar solamente líneas de flujo horizontales y/o verticales. 

• Se debe evitar el cruce de líneas utilizando los conectores. 

• Se deben usar conectores sólo cuando sea necesario. 

• No deben quedar líneas de flujo sin conectar. 

• Se deben trazar los símbolos de manera que se puedan leer de arriba hacia abajo y de izquierda a derecha. 

• Se debe evitar la terminología de un lenguaje de programación o máquina. 

• Los comentarios se deben utilizar ya sea al margen o mediante el símbolo gráfico comentarios para que 
éstos sean entendibles por cualquier persona que lo consulte. 

• Si el diagrama abarca más de una hoja es conveniente enumerarlo e identificar de dónde viene y a dónde 
se dirige. 

• Sólo los símbolos de decisión pueden y deben tener más de una línea de flujo de salida. 



1 .4 Etapas o pasos en la creación de un programa 5 



Tabla 1 .1 Símbolos gráficos más utilizados para dibujar diagramas de flujo de algoritmos 




Pseudocódigo 

El pseudocódigo es la combinación del lenguaje natural (español, inglés o cualquier otro idioma), símbolos 
y términos utilizados dentro de la programación. Se puede definir como un lenguaje de especificaciones de 
algoritmos. 

El pseudocódigo se creó para superar las dos principales desventajas del diagrama de flujo: es lento de 
crear y difícil de modificar sin un nuevo redibujo. Por otra parte, el pseudocódigo es más fácil de utilizar ya 
que es similar al lenguaje natural. Al contrario de los lenguajes de programación de alto nivel no tiene nor- 
mas que definan con precisión lo que es y lo que no es pseudocódigo, por lo tanto varía de un programador 
a otro. 

En este documento todo pseudocódigo lo iniciaremos con la palabra reservada principal para especificar 
la función denominada ( main ) en lenguaje C. Todo programa, al igual que toda función, debe contener las 
palabras reservadas de inicio ({) y fin (}) delimitando las instrucciones. 

1.4.4 Codificación 

En la etapa de codificación se transcribe el algoritmo definido en la etapa de diseño en un código reconoci- 
do por la computadora; es decir, en un lenguaje de programación; a éste se le conoce como código fuente. 
Por ejemplo el lenguaje “C” es un lenguaje de programación y es el que utilizaremos en el presente curso. 



3 Algunos autores utilizan el símbolo para salida de impresora; nosotros lo utilizaremos para salida de datos, a fin de diferenciarla de la 
entrada, ya que es válido en ambos casos. 




Capítulo 1 Conceptos básicos 



1.4.5 Prueba y depuración 

La prueba consiste en capturar datos hasta que el programa funcione correctamente. A la actividad de loca- 
lizar errores se le llama depuración. Existen dos tipos de pruebas: de sintaxis y de lógica. 

Las pruebas de sintaxis se ejecutan primero, son las más sencillas y las realiza el compilador del progra- 
ma cada vez que se ejecuta el programa hasta que el código no presente errores, es decir que la sintaxis que 
requiere el lenguaje sea la correcta, de lo contrario el propio compilador va mostrando los errores encon- 
trados para que se modifiquen y se pueda ejecutar el código; estos errores pueden ser falta de paréntesis, o 
puntos y comas o palabras reservadas mal escritas. 

Las pruebas de lógica son las más complicadas ya que éstas las realiza el programador; consisten en la 
captura de diferentes valores y revisar que el resultado sea el deseado, es decir el programador tendría que 
modificar el código hasta que el programa funcione correctamente. 

1.4.6 Documentación 

Es la guía o comunicación escrita que permite al programador o al usuario conocer la funcionalidad del 
programa. 

La documentación sirve para que el código fuente sea más comprensible para el programador o para 
otros programadores que tengan que utilizarlo, así como para facilitar futuras modificaciones (manteni- 
miento). 

Hay dos tipos de documentación: 

♦ Interna. Se generan en el mismo código y generalmente es mediante comentarios. 

♦ Externa. Son los manuales y es independiente al programa. También puede ser la ayuda en el mismo 
software. 

1.4.7 Mantenimiento 

Se dice que un programa no se termina al 100%, ya que es necesario hacer algún cambio, ajuste o comple- 
mentación para que siga funcionando correctamente; para llevarlo a cabo se requiere que el programa esté 
bien documentado. 

Todos los programas tienen actualizaciones, por lo que surgen versiones diferentes. Por ejemplo: Win- 
dows 3.11, 95, 98, 2000, Millennium, Xp, Vista y 7. 



Capítulo 



Los datos y las 
operaciones básicas 




Al término de este capítulo, 

el alumno será capaz de 
<§) ^ 

Identificar y utilizar los diferentes elementos 
que integran un programa: identificadores, 
constantes, variables, tipos de datos, ope- 
radores, expresiones, comentarios, palabras 
reservadas. 



Contenido 

« 

2.1 Identificador 

2.2 Tipos de datos 

2.3 Variables 

2.4 Constantes 

2.5 Operadores 

2.6 Prioridad de los operadores 

2.7 Expresiones 

2.8 Palabras reservadas 

2.9 Comentarios 

2.10 Conversión de tipos 



7 




8 Capítulo 2 Los datos y las operaciones básicas 



2.1 Identificador 

i 

Un identificador es una secuencia de caracteres alfabéticos, numéricos y el guión bajo. Con ellos podemos 
dar nombre a variables, constantes, tipos de dato, nombres de funciones o procedimientos, etcétera. 

Cada lenguaje de programación tiene sus propias características del tamaño del identificador; el están- 
dar de lenguaje C no especifica un límite de tamaño para un identificador, pero para ciertas implementacio- 
nes de C + + sólo los primeros 31 caracteres son significativos (ANSI C). El programador tiene libertad para 
darle cualquier nombre a un identificador, siguiendo estas reglas: 

1. Debe comenzar con una letra (A a Z) mayúscula o minúscula y no puede contener espacios en blanco. 
En lenguaje C, el carácter (guión bajo) es considerado como letra, por lo que se puede utilizar como 
primer carácter. 

2. El lenguaje C distingue mayúsculas de minúsculas porque tienen diferente código ASCII. 

3. Letras, dígitos y el carácter guión bajo están permitidos después del primer carácter. 

4. No pueden existir dos identificadores iguales, es decir, dos elementos de un programa no pueden nom- 
brarse de la misma forma. Sin embargo, un identificador puede aparecer más de una vez en un programa. 

5. No se puede utilizar una palabra reservada como identificador, sin embargo, los identificadores estándar 
se pueden redefinir. 

6. En lenguaje C existen identificadores que podrían tener uno o varios puntos, tales como: persona. apelli- 
doPaterno 

El punto indica el acceso a un campo de una estructura. 

Sugerencias-. 

1. El identificador debe tener un nombre que sea significativo, es decir, que dé una idea de la información 
que almacena. 

2. No utilizar nombres muy largos, es mejor utilizar abreviaturas estándar para que éstos tengan una lon- 
gitud razonable. 

3. En lenguaje C es usual escribir variables en minúscula, dejando las mayúsculas para las constantes. En 
los casos de nombres compuestos se suele poner la inicial de la segunda palabra en mayúscula. 



Ejemplo 



totalAlumnos, areaCirculo, numeroPositivo. 

Identificadores válidos: numero, year2008, Base_1 , función, división 
Identificadores no válidos: número, ?prec¡o, año, 2007, 4semestre. 



En los tres primeros ejemplos se utilizan caracteres especiales y en los dos últimos el primer carácter no 
es letra. Hay que recordar que la ñ en el código ASCII, NO aparece con las demás letras. 



2.2 Tipos de datos 

Los diferentes objetos de información con los que un algoritmo o programa trabaja se conocen colectivamen- 
te como datos. Todos los datos tienen un tipo asociado con ellos; el tipo de un dato es el conjunto (rango) 
de valores que puede tomar durante el programa. Por ejemplo el tipo de un dato determina la naturaleza 
del conjunto de valores que puede tomar una variable. En la tabla 2.1 apreciamos que cada tipo de dato en 
lenguaje C está delimitado por un rango de valores. Como veremos en los ejemplos resueltos, si utilizamos 
valores fuera del rango correspondiente, el compilador no sabrá qué hacer con dicho dato e imprimirá en 
pantalla resultados erróneos. El tipo de dato asociado a una variable limita el conjunto de datos que puede 
almacenar, así como las operaciones aplicables sobre esa variable. Por lo tanto, una variable que pertenece a 
un tipo de dato int no podrá almacenar datos de tipo char, tampoco se podrán calcular operaciones propias 
de otros tipos de datos. 

Las computadoras pueden trabajar con varios tipos de datos; los algoritmos y programas operan sobre 
éstos. 



2.2 Tipos de datos 9 



La asignación de tipos a los datos tiene dos objetivos principales: 

1. Detectar errores de operaciones en programas. 

2. Determinar cómo ejecutar las operaciones. 

Los datos que utilizan los algoritmos y programas los podemos clasificar en simples o compuestos. Un 
dato simple es indivisible, no se puede descomponer. Un dato compuesto está integrado por varios datos. En 
este capítulo nos enfocaremos en los primeros. 

Los tipos de datos simples son: numéricos (enteros y reales), lógicos (booleanos) y caracteres. 

Tabla 2.1 Tipos básicos predefinidos 



Tipo 


Tamaño (bytes) 


Rango 


int (entero) 


2 


-32,768 a 32,767 


float (flotante) 


4 


3.4 E— 38 a 3.4 E + 38 


double (flotante de doble precisión) 


8 


1 .7 E— 308 a 1 .7 E+308 


char (carácter) 


1 


-128a 127 


void 


0 


sin valor 



Los tipos de datos predefinidos son: numéricos, lógicos, caracteres y cadenas. 

De ellos, tan sólo el tipo cadena es compuesto. Los demás son los tipos de datos simples considerados 
estándares. Esto quiere decir que la mayoría de los lenguajes de programación permiten trabajar con ellos. 
Por ejemplo, en lenguaje C es posible utilizar datos de tipo entero, real y carácter; sin embargo, los datos de 
tipo lógico sólo algunos compiladores los utilizan (por ejemplo, DEV-CPP). 

El tamaño y el rango de algunos tipos de datos pueden variar, dependiendo del compilador utilizado. 
Algunas arquitecturas implementan tipos de datos de tamaño como lo podemos observar en la tabla 2.1; sin 
embargo en DEV-CPP el tipo int y float tienen 32 bits, el char 8 bits, y el double usualmente es de 64 bits; 
bool se implementa con 8 bits. En lenguaje C se puede utilizar el operador sizeof para determinar el tamaño 
de algunos tipos de datos en bytes (lo veremos más adelante, cuando veamos el tema de operadores). 

Hay cinco datos básicos del lenguaje C: entero, coma flotante, coma flotante con doble precisión, carác- 
ter y sin valor. 

2.2.1 Datos numéricos 

Este tipo de datos se divide en enteros y reales. 

Tipos enteros. Son aquellos números que no tienen fracciones o decimales. Pueden ser negativos o posi- 
tivos y el rango es de —32,768 a 32,767, aunque este rango puede variar de un compilador a otro (por ejemplo 
DEV-CPP). Se almacenan internamente en 2 o 4 bytes de memoria y pueden ser: unsigned int, short int, int, 
unsigned long o long (cada uno de estos datos puede almacenar un rango diferente de valores). Cuando el 
rango de los tipos básicos no es suficientemente grande para sus necesidades, se consideran tipos enteros 
largos. Ambos tipos long requieren 4 bytes de memoria (32 bits) de almacenamiento. 

Tipos reales o de coma flotante (float/double). Los tipos de datos flotantes contienen una coma (un 
punto) decimal, tal como 3.1416, pueden ser positivos y negativos formando el subconjunto de los números 
reales. Para representar números muy pequeños o muy grandes se emplea la notación de punto flotante, que 
es una generalización de la notación científica. En esta notación se considera al número real como mantisa 
y al exponente la potencia de 10 a la que se eleva este número, por ejemplo 340 = 3.4 X 10 2 . C soporta tres 
formatos de coma flotante; el tipo float requiere 4 bytes de memoria, double 8 bytes, y long double 10 bytes. 

2.2.2 Datos lógicos o booleanos 

Hay lenguajes que sólo pueden tomar uno de dos valores: verdadero ( true ) o falso ( false ). En lenguaje C no 
existe el tipo lógico pero se puede implementar con un número entero, 0 es falso y cualquier número diferen- 
te de cero es verdadero. Algunos compiladores, como por ejemplo el DEV-C+ + utilizan el bool. 



10 



Capítulo 2 Los datos y las operaciones básicas 



2.2.3 Caracteres 

El almacenamiento de caracteres en el interior de la computadora se hace en “palabras” de 8 bits (1 byte). Es- 
te tipo representa valores enteros en el rango —128 a +127. El lenguaje C proporciona el tipo unsigned char 
para representar valores de 0 a 255 y así representar todos los caracteres ASCII 

Una característica de la parte estándar del conjunto de caracteres (los 128 primeros) es que contiene las 
letras mayúsculas, las minúsculas y los dígitos, y que cada uno de estos tres subconjuntos está ordenado en su 
forma natural, por lo que podemos manejar rangos de caracteres bien definidos. Así, la siguiente expresión 
booleana decide si el carácter contenido en la variable c es una letra minúscula (‘ a<=c && c<—z). Los ca- 
racteres se almacenan internamente como números y por lo tanto se pueden realizar operaciones aritméticas 
con datos tipo char. 

Existe también el dato tipo cadena (compuesto), que es una sucesión de caracteres que se encuentran 
delimitados por comillas; la longitud de una cadena es el número de caracteres comprendidos entre los de- 
limitadores “[long_cad]”. 



Ejemplo 



Pseudocódigo 


Lenguaje C 




carácter letra ' b' , cadena [25] 


char letra = ’ 


l b' , cadena [25] ; 


carácter car<— letra - 32 


char car = 


letra — 32 ; 



El valor de la variable car es B, ya que el código ASCII de b es 98 y al restarle 32 es igual a 66 (código 
ASCII de B). 

2.2.4 Tipovoid 

Son datos vacíos o sin valor. Por ejemplo la función main no regresa valor alguno (nada): void main() o void 
main(void) porque tampoco tiene parámetros. Debemos tener cuidado, ya que esta característica es propia 
de algunos compiladores, pero por ejemplo en DEV-C+ + el main tiene que regresar un entero {int), por el 
return 0 , es decir int main (void) o int main(); pero las demás funciones predefinidas sí pueden utilizar el tipo 
void\ esto lo analizaremos en detalle en el capítulo de funciones. 



2.3 Variables 

/ 

Una variable es un dato cuyo valor puede cambiar durante el desarrollo del algoritmo o ejecución del progra- 
ma. Es decir, representará un valor almacenado en memoria que se puede modificar en cualquier momento 
o conservar para ser usado tantas veces como se desee. 

Hay diferentes tipos de variables: enteras, reales, caracteres y cadenas. Una variable que es de cierto 
tipo sólo puede tomar valores que correspondan a ese tipo. Si se intenta asignar un valor de tipo diferente se 
producirá un error. 

El programador de lenguaje C es libre de denominar a sus variables con el nombre que considere más 
adecuado, siempre que se respeten las normas que mencionamos en la sección respectiva para nombrar un 
identificador. El lenguaje C acepta letras mayúsculas y minúsculas, sin embargo, son distintos los nombres en 
mayúsculas y minúsculas, es decir los nombres lado y Lado se refieren a variables diferentes. 

Como se mencionó anteriormente, el uso de nombres largos no es recomendable ya que resultan más 
difíciles de teclear y además se utiliza más memoria para almacenar el nombre. 

Los nombres de las variables nos deben indicar qué dato almacenan, de manera que resulte más fácil leer 
el programa. Así, la variable nomAlumno indica que almacena el nombre de un alumno. 

2.3.1 Declaración de variables 

Todas las variables deben ser declaradas antes de ser usadas. Cada variable por lo tanto tiene asociado un tipo, 
un nombre (identificador) y un valor. No se admiten como identificadores palabras reservadas del lenguaje 
de programación que se esté utilizando. Los nombres de variables que se elijan para el algoritmo o programa 



2.4 Constantes 



deben ser significativos y tener relación con el objeto que representa. En lenguaje C la sintaxis para definir 
o declarar una variable es: 



Pseudocódigo 


Lenguaje C 


tlpo_dato ident_variable(s) 


tipo dato ident variable(s); 



Pseudocódigo 


Lenguaje C 




entero ¡,j, k 


int i , 


j, k; 


real si 


f loat 


si ; 


carácter s, nom[25] 


char s , 


nom [25] ; 



Ejemplo 

® 



Las variables del mismo tipo pueden definirse con una definición múltiple, separándolas mediante “ , “ : 
int x, y, z; 

Una variable puede declararse en cuatro lugares diferentes del algoritmo o programa: 

• Fuera de todos los subprogramas o funciones (global). 

• Dentro de un subprograma o función (local a la función). 

• Dentro de un bloque enmarcado por llaves { } (local al bloque). 

• Dentro de una instrucción, por ejemplo: for (inti=0; i< = 10; i++). 

• Como parámetro formal (local a la función). 

2.3.2 Reserva de memoria 

Cuando declaramos una variable le estamos diciendo al compilador que debe reservar espacio en memoria, 
que a cada espacio en memoria le asigne un nombre y un número determinado de bytes, dependiendo del 
tipo de dato asignado; también se le dice qué tipos de datos puede almacenar. En C una variable es una po- 
sición de memoria de la computadora con nombre (identificador), donde se almacena un valor con cierto 
tipo de dato. Una variable es un lugar donde se puede almacenar temporalmente un dato; las variables nos 
permiten guardar información. 

Inicialización de variables 

Las variables pueden también ser inicializadas (es decir, tomar un valor de inicio) en el momento de decía- 
rarse: 



Pseudocódigo 


Lenguaje C 


tipo_dato variable <— valor 


tipo dato variable = valor; 



Pseudocódigo 


Lenguaje C 


entero i <— 0 


int i = 0; 


real sal <— 30.5 


float sal = 30.5; 



Ejemplo 



2.4 Constantes 

Una constante es un dato que permanece sin cambio durante el desarrollo del algoritmo o durante la eje- 
cución del programa, es decir valores fijos que no pueden ser alterados por el usuario. La mayoría de los 
lenguajes de programación permiten el manejo de diferentes tipos de constantes; éstas pueden ser enteras, 
reales, caracteres y cadenas. 

En la tabla 2.2 vemos que además de tener un valor, una constante también tiene un tipo de dato in- 
herente (entero, real, carácter o cadena); el compilador C las evaluará en el momento de la compilación, en 
lugar de hacerlo en la ejecución. 



12 



Capítulo 2 Los datos y las operaciones básicas 



Tabla 2.2 Tipos de constantes 

Tipo de constante Descripción y ejemplos 

Enteras Son una sucesión de dígitos precedidos o no por el signo + o — dentro de un rango 

determinado. Ejemplos: 234, -456, etcétera. 

Reales Son una sucesión de dígitos con punto adelante, al final o en medio y seguidos opcio- 

nalmente de un exponente. Ejemplos: 82.347, 0.63, 32.4e-05, 7.4e03 

Carácter Una constante carácter ( char ) es un carácter del código ascii encerrado entre apóstro- 

fos. Ejemplos: 'a', 'b', 'c' 

Cadena Una constante cadena es una secuencia de caracteres encerrados entre dobles comi- 

llas. Ejemplos: "1 23", "26 de noviembre de 1 974", "Esto es una cadena" 



En lenguaje C una constante se define por medio de la instrucción #¡ define (directiva del procesador) o 
de la palabra const. 



Pseudocódigo 


Lenguaje C 




constante iden_const <— valor 


#define iden const 


valor O 




const tipo iden const 


= valor; 



2.4.1 Uso de #define: creación de macros 

El compilador C tiene un preprocesador incorporado. Si las líneas 

#define limite 100 

#define pi 3.14159 

se encuentran en un archivo que se está compilando, el preprocesador cambia primero todos los identifica- 
dores limite por 100 y todos los pi por 3.14159, excepto los que estén en cadenas entre comillas. Una línea 
#define puede estar en cualquier lugar del programa, pero debe empezar en la columna 1 y sólo tendrá efecto 
en las líneas de archivo que le siguen. El preprocesador sólo cambiará los identificadores que se escriben con 
mayúsculas. 

En una macro con argumentos, los argumentos se sustituyen en el texto de reemplazo: 

//Ejemplo macros 
#include<conio . h> 

#include<stdio . h> 

#define suma(nl,n2) nl+n2 
#define multiplica (ni , n2 ) nl*n2 
main ( ) 

{ 

int x; 

x=suma (4,6) ; 
printf("Suma = %d\n",x); 
printf ( "Multiplicación = %d\n" , multiplica (5 , 6 )) ; 
getch ( ) ; return 0 ; 

} 

2.4.2 Uso de const 

El cualificador const permite dar nombres simbólicos a constantes. Su valor no puede ser modificado por el 
usuario. 



Salida en pantalla, después de ejecutar el programa: 
Suma = 10 
Multiplicación = 30 



2.5 Operadores 13 



Pseudocódigo 








Lenguaje C 


Ejemplo 


constante max <— 100 


#def ine 


MAX 100 


const 


int max = 100; 


© 


constante car <— 'a' 


#def ine 


CAR ' a ' 


const 


char car = 'a' ; 




constante car <— "a" 


#def ine 


CAR "a" 


const 


char car [4] = "a"; 




constante pi <— 3.1416 


#def ine 


PI 3.1416 


const 


float pi = 3.1416; 




constante nom <— "Marco" 


#def ine 


nom "Marco" 


const 


char nom [10] = "Marco"; 





Nota: "a" es diferente de 'a'. 

La representación de a ’ como carácter y “a” como cadena en la memoria sería: 

carácter cadena 

a a\0 

Las constantes se presentan en expresiones como: 



Pseudocódigo 


Lenguaje C 


area <— pi * radio * radio 


area = pi * radio * radio; 


pi es una constante que ya tiene un valor igual a 3.1 41 6. 



2.5 Operadores 

Un operador es un símbolo que permite relacionar dos datos en una expresión y evaluar el resultado de la 
operación. 

Los programas de las computadoras se apoyan esencialmente en la realización de numerosas operacio- 
nes aritméticas y matemáticas de diferente complejidad. Los operadores fundamentales son: 

• Aritméticos. 

• Relaciónales. 

• Lógicos. 

• Asignación. 

2.5.1 Operadores aritméticos 

Los operadores aritméticos de la tabla 2.3 (+, — , *, /) pueden ser utilizados con tipos enteros o reales y 
sirven para realizar operaciones aritméticas básicas. Por ejemplo si a = 15 y b = 3, vemos los resultados con 
los diferentes operadores aritméticos. 



Tabla 2.3 Operadores aritméticos 





Operador 






Ejemplo 






Pseudo- 

código 


Lenguaje C 


Significado 


Pseudo- 

código 


Lenguaje C 


Operación 


Resultado 


+ 


+ 


Suma 


a + b 


a + b 


Suma de a y b 


18 


- 


- 


Resta 


a — b 


a — b 


Diferencia de a y b 


12 


* 


* 


Multiplicación 


a * b 


a * b 


Producto de a por b 


45 


/ 


/ 


División 


a/ b 


a/b 


Cociente de a entre b 


5 


mod 


% 


Residuo 


a mod b 


a % b 


Residuo de a entre b 


0 


A ** 


pow 


Potencia 


a a b 


pow(a, b) 


a elevado a la b 


3375 



El operador % en lenguaje C, como se mencionó, calcula el residuo que queda al dividir dos números 
enteros; el siguiente programa muestra lo que realiza ese operador: 



14 



Capítulo 2 Los datos y las operaciones básicas 



//Ejemplo % 

#include <stdio.h> 

#include <conio.h> 
main ( ) 

{ 

int x= — 7 , y=2 ; 

printf ( "%d" , x%y) ; 
getch ( ) ; 
return 0 ; 

} 

En la pantalla aparecerá: 

-1 

Ya que la división de —7/2 es 3 y el residuo es —1, debido a que el signo que se toma en cuenta es el negativo del 
numerador. Si x=7, y=2 el resultado hubiera sido +1. 



2.5.2 Incremento y decremento 

Estos operadores son propios de lenguaje C. En la tabla 2.4 podemos ver cómo funcionan. 



Tabla 2.4 Operadores increméntales y decrementales 



+ + ++ i 

+ + i + + 



Se incrementa / en 1 y a continuación se utiliza el nuevo valor de / en la expresión en la cual 
esté i. 

Utiliza el valor actual de / en la expresión en la cual esté i, y después se incrementa a en 1 
(úsela y luego increméntela). 

Se decrementa i en 1 y a continuación se utiliza el nuevo valor de i en la expresión en la cual 
esté i. 

Se utiliza el valor actual de i en la expresión en la cual esté i, y después se decrementa a / en 1 
(úsela y luego decreméntela). 



Tanto + + como — pueden aplicarse a variables, pero no a constantes o a expresiones. Por ejemplo: 
+ +i, i+ + ambas son equivalentes a i=i+l. Veamos un ejemplo con este operador. 

//Ejemplo incremento 
#include <stdio.h> 

#include <conio.h> 
main ( ) 

{ 

int a=7, b; 

b = ++a+3; //a se incrementa en 1 , le sumamos 3 y b recibe 11 

b = b+a + + + 5; //b recibe 11 + 8 + 5 y la a se incrementa 

printf ( "%d, %d" , a, b) ; 

getch ( ) ; 

return 0 ; 

} 

En la pantalla aparecerá: 

9,24 

En el ejercicio anterior la variable a comienza con 7yb=+ + a+3, nos indica que primero incrementemos 
la variable fl en 1 y luego la utilicemos, sumándole 3; por lo tanto b recibe 11. En la línea b=b+a+ + + 5; la 
variable b recibe el valor de la b anterior + y el valor de a + 5 = 1 1 + 8 + 5 = 24; en este caso primero utilizamos 
la variable a y luego la incrementamos en 1. Por último imprimimos el valor de a=9 y el de b=24. 



2.5 Operadores 



15 



2.5.3 Operadores relaciónales 



Describen una relación entre dos valores; por lo tanto, se usan para expresar condiciones y comparar dos 
valores. El resultado de una expresión relacional es un valor tipo lógico o booleano, sólo puede ser verdadero 
o falso. El lenguaje C representa como verdadero el valor 1 y como falso el valor 0. En la tabla 2.5 se muestran 
los operadores relaciónales y en la tabla 2.6 ejemplos de los mismos. 

Tabla 2.5 Operadores relaciónales 




Operador 




Significado 


Pseudocódigo 


Lenguaje C 






> 


> 




Mayor que 


< 


< 




Menor que 


= 


= = 




Igual que 


> = 


> = 




Mayor o igual que 


< = 


< = 




Menor o igual que 


< > 


! = 




Distinto a 


Tabla 2.6 Ejemplos de operadores relaciónales 


Expresiones relaciónales 


Resultado 


Valor binario 


Pseudocódigo 


Lenguaje C 






'A' <'B' 


'A' < 'B' 


V 


1 


'A'= 'a' 


'A' == 'a' 


F 


0 


8 O 8.0 


8 != 8.0 


F 


0 


-124.2 <0.003 


-124.2 < 0.003 


V 


1 


6.73 > 6.75 


6.73 > 6.75 


F 


0 


'A' < 'a' 


'A' < 'a' 


V 


1 



En el último ejemplo el código ASCII de la A mayúscula es menor a la minúscula, ya que la primera tiene 
código 65 y la segunda 97. 

Otro ejemplo: x+y<=3*z compara el valor de la suma de x y y con el triple del valor de z; si la suma es 
menor o igual que el triple de z entonces el resultado de la expresión es 1, y en el caso contrario es 0. 

2.5.4 Operadores lógicos 

Las expresiones lógicas pueden combinarse para formar expresiones más complejas utilizando los opera- 
dores lógicos. En la tabla 2.7 se muestran dichos operadores y en la tabla 2.8 ejemplos de los mismos. Estos 
operadores trabajan con operandos que son expresiones lógicas. 



Tabla 2.7 Operadores lógicos 



Pseudocódigo 


Lenguaje C 


y 


&& 


0 


II 


no 


| 



16 



Capítulo 2 Los datos y las operaciones básicas 



Tabla 2.8 Ejemplos de operadores lógicos 



Expresiones lógicas o booleanas 


Resultado 


Valor binarlo 


Pseudocódigo 


Lenguaje C 






(5 >3) 


(5 > 3) 


V 


1 


(8 < 4) 


(8 < 4) 


F 


0 


(5 >3) y (8 < 4) 


(5 >3 && 8 < 4) 


F 


0 


(5 >3) y (8 >4) 


( 5 > 3 && 8 > 4 ) 


V 


1 


(5 > 3) o (8 < 4) 


(5 > 3 || 8 < 4) 


V 


1 


(2 >3) o (6 < 9) 


(2 > 3 || 6 < 9) 


V 


1 


no (4 > 2) 


! (4 > 2) 


F 


0 


no (7 < 5) 


! (7 < 5) 


V 


1 



Como se muestra en la tabla anterior, se pueden evaluar una o más condiciones en una expresión, y 
siempre el resultado es un único valor lógico o booleano. 

Para la evaluación de expresiones lógicas es importante conocer la tabla de verdad. En la tabla 2.9 hace- 
mos referencia a los operadores lógicos de lenguaje C. 

Tabla 2.9 Tabla de verdad 



p 


Q 


;q 


P &&Q 


P 1 IQ 


verdad 


verdad 


falso 


verdad 


verdad 


verdad 


falso 


verdad 


falso 


verdad 


falso 


verdad 


falso 


falso 


verdad 


falso 


falso 


verdad 


falso 


falso 



Otros ejemplos en lenguaje C: 

La expresión: a=!(4>l) almacena 0 en la variable a, debido a que la expresión 4>1 es verdadera y el 
operador / niega la expresión haciéndola falsa o igual a cero. 

2.5.5 Operadores de asignación 

El operador de asignación permite evaluar una expresión y asignar el resultado en una variable. Su sintaxis es: 



Pseudocódigo 


Lenguaje C 


Identificador <— expresión 


Identificador = expresión; 



Con la asignación anterior le estaremos indicando a la computadora que evalúe la expresión y la alma- 
cene en la variable que define el identificador. Estos operadores permiten transferir el dato de una variable a 
otra. Así, la expresión x=a en lenguaje C transfiere el valor de a a la variable x. En la tabla 2.10 se muestran 
ejemplos de operadores de asignación. 

Nunca debe escribirse la expresión a la izquierda del operador de asignación: 



Pseudocódigo 


Lenguaje C 


(cali + cal2) <— promedio 


(cali + cal2) = promedio; 



Lo correcto es: 



Pseudocódigo 


Lenguaje C 


promedio <— (cali + cal2) 


promedio = (cali + cal2) ; 



2.5 Operadores 



Tabla 2.1 0 Ejemplos de operadores de asignación 



Pseudocódigo 


Lenguaje C 


Significado 


c <-c + 21 


C = C + 21; 


Incrementa 21 a la variable c 


x < — d — 12 


X = d — 12 ; 


Almacena en x la diferencia de d menos 1 2 


j <— e * 5 


j = e * 5 ; 


Almacena en j el producto de e por 5 


f < — f / 3 


f = f/3; 


Divide el valor de f entre 3 y lo almacena en la 
variable f 


g <— g mod 1 5 


g = g % 15; 


Divide el valor de g entre 1 5 y almacena el resi- 
duo en la variable g 



Otros operadores de asignación en C 

En la tabla 2.11 vemos otros operadores de asignación propios de lenguaje C: + =, *=, =, /= y %=, donde la 
sintaxis cuando se quiere utilizar uno de esos operadores es: 

Identificador operador_asignación expresión; 

Tabla 2.1 1 Otros operadores de asignación en C 



Operador 


Ejemplo 


Equivalencia 


+ = 


s += 10 


s = s + 10 


- = 


r — = 3 


r = r — 3 


* — 


m* = 4 


m = m* 4 


/= 


d/ = 2 


d = d / 2 


%= 


x % = 33 


x = x % 33 


- = 


x -= y*1 7 


x = x — (y*1 7) 



2.5.6 Operador condicional (?:) 

Sustituye la sentencia if... else. El formato es: 

<expresión booleana> ? <instrucción_sí> : <instrucción_no> 

Por ejemplo: a = (b<2) ? 5 : 10; 
es equivalente a: if (b<2) a =5; 

else a=10; 

la variable a toma el valor 5 cuando b<2, y el 10 en caso contrario. 

Veamos otro ejemplo del operador condicional en el siguiente programa: 

//Ejemplo Operador condicional 
#include<stdio . h> 

#include<conio . h> 
main ( ) 

{ 

int a=5, b=10, c; 

b<a ? printf("%d es el mayor", a) : printf("%d es el mayor ", b) ; 
getch ( ) ; return 0 ; 

} 



Capítulo 2 Los datos y las operaciones básicas 



En la pantalla aparecerá: 

10 es el mayor 

La expresión booleana b<a es falsa por lo tanto se imprime 10 es el mayor. 

2.6 Prioridad de los operadores 

Al orden en que la computadora realiza las diferentes operaciones le llamamos orden de prioridad. 

2.6.1 Prioridad de operadores aritméticos 

1. Paréntesis ( ). Todas las expresiones entre paréntesis se evalúan primero. Las expresiones con paréntesis 
anidados se evalúan de dentro hacia afuera. 

2. Dentro de una misma expresión o subexpresión, se evalúan en el siguiente orden: 

Potencia ( A o **) 

* ,/,mod 

+, - 

2.6.2 Regla asociativa 

Los operadores en una misma expresión con igual nivel de prioridad se evalúan de acuerdo con la tabla 2.12, 
en ella apreciamos la prioridad de todos los operadores en lenguaje C. 



Tabla 2.12 Prioridad de los operadores en C 



Categoría del operador 


Operadores 


Asociativa 


Agrupación 


(),[] 


Izquierda a derecha 


Operadores monarios 


,!, sizeof(tipo) 


Derecha a izquierda 


Multiplicación, división y residuo 


V,% 


Izquierda a derecha 


Suma y sustracción aritmética 


+, - 


Izquierda a derecha 


Operadores de relación 


<, <=, >,> = 


Izquierda a derecha 


Operadores de igualdad 


= =.! = 


Izquierda a derecha 


y 


&& 


Izquierda a derecha 


o 


II 


Izquierda a derecha 


Operador condicional 


? : 


Derecha a izquierda 


Operadores de asignación 


= ,+=,“=,*=, =/=,% = 


Derecha a izquierda 



Los operadores de asignación tienen menor prioridad que todos los otros operadores. Por tanto las ope- 
raciones monarios, aritméticos, de relación, de igualdad y lógicos se realizan antes que las de asignación. El 
orden de las operaciones en pseudocódigo es: 



m+ (w - k * x) + t / 2 




Otro ejemplo en C: 





2.7 Expresiones 19 




2.7 Expresiones 



Una expresión es el resultado de unir operandos mediante operadores. Los operandos pueden ser variables, 
constantes u otras expresiones; y los operadores, aritméticos, lógicos o relaciónales. El resultado de una ex- 
presión es un dato numérico o un valor lógico. Para agrupar las expresiones utilizamos los paréntesis. 

Según el tipo de datos que manipulan, se clasifican en: 

♦ Aritméticas. 

• Lógicas o booleanas. 

Las expresiones lógicas o booleanas son expresiones relacionadas entre sí mediante operadores relaciónales 
o lógicos. Una expresión lógica es una expresión que sólo puede tomar dos valores: verdadero o falso. 



Pseudocódigo 


Lenguaje C 


(num> = 100) 


( num> = 10 0) 


(num> = 100) y (sexo = M') 


(num> = 100 && sexo = 'M' ) 



Ejemplos 



Escritura de fórmulas matemáticas 

Las fórmulas matemáticas se deben escribir en formato lineal. Esto obliga al uso frecuente de paréntesis que 
indiquen el orden de evaluación correcto de los operadores. 



Álgebra 


Pseudocódigo 


Lenguaje C 


(x + y + z) 
w = 


w <- ( x + y + z)/2 


w = ( x + y + z ) /2 ; 


2 






5-3 

X = 


x <— (5 — 3)/(2* *4) 


X = (5 — 3 ) / (2*4) 


2*4 







Ejemplos 

® 










Capítulo 2 Los datos y las operaciones básicas 



2.8 Palabras reservadas 

Son palabras propias del lenguaje, ya que el creador del mismo les dio un uso específico. No se pueden utili- 
zar como identificadores. Las más utilizadas en pseudocódigo y lenguaje C las vemos en la tabla 2.13. En la 
tabla 2.14 aparecen todas las palabras reservadas de lenguaje C. 



Tabla 2.13 Palabras reservadas en pseudocódigo y lenguaje C 



Pseudocódigo 


Lenguaje C 


Función que realiza 


abs() 


abs ( ) 


Calcula el valor absoluto 


carácter 


char 


Tipo de dato carácter 


caso 


case 


Si se cumple un caso 


caso contrario 


def ault 


Ninguna opción de la selectiva múltiple 


define_tipo 


typedef 


Crea un nuevo nombre de tipo para un tipo de dato ya definido 


desde 


f or 


Estructura repetitiva (o de ciclo) 


entero 


int 


Tipo de dato entero 


fin 


} 


Fin del programa o de un bloque 


hacer 


do 


Estructura repetitiva 


imprimir 


printf 


Imprime en pantalla 


imprimircad 


puts 


Imprime una cadena 


inicio 


{ 


Inicio del programa o de un bloque 


leer 


scanf 


Lee una variable 


leercad 


gets 


Lee una cadena de caracteres 


limpiar_pantalla 


clrscr 


Borra el contenido de la pantalla 


mientras 


while 


Estructura repetitiva 


nada o ninguno 


void 


Valor nulo 


principal 


main 


Programa principal 


raizcuad 


sqrt 


Calcula raíz cuadrada 


real 


f loat 


Tipo de dato real 


registro 


struct 


Registro o estructura 


regresa 


return 


Regresa valor a otra función 


salir o interrumpir 


break 


Terminar el caso 


segun_sea 


switch 


Estructura selectiva múltiple 


si 


if 


Estructura selectiva 


sino 


else 


La parte falsa de la selectiva 



Toda palabra reservada en lenguaje C se escribe en minúscula, aunque algunas implementaciones como 
DEV-C+ +, puede tener excepciones (por ejemplo la función Sleep). 

Tabla 2.14 Palabras reservadas de ANSI C 



auto 


break 


case 


char 


const 


continué 


default 


do 


double 


else 


enum 


extern 


float 


for 


goto 


if 


int 


long 


register 


return 


short 


signed 


tamof 


static 


struct 


switch 


typedef 


unión 


unsigned 


void 


volatile 


while 



2.10 Conversión de tipos 21 



2.9 Comentarios 

® ' 

Los comentarios son útiles para identificar los elementos principales de un programa o explicar la lógica 
derivada de éstos. Deben ser breves y se deben evitar ambigüedades. 

Los comentarios en cualquier lenguaje de programación sirven para que el código fuente sea más en- 
tendióle, aumentan la claridad de un programa, ayudan a la documentación y bien utilizados nos pueden 
ahorrar mucho tiempo. 

Se deben utilizar comentarios sólo cuando sean necesarios, por ejemplo: 

• Al principio del programa: nombre del programa, autor o autores, fecha de elaboración, etcétera. 

• En la declaración de variables y constantes cuyo identificador no sea suficiente para comprender su uso. 

• En los cierres de bloques con '}', para indicar a qué sentencias de control de flujo pertenecen, princi- 
palmente cuando existe mucho anidamiento de sentencias y/o los bloques contienen muchas líneas de 
código. 

Los comentarios los reconocerá la persona que elaboró el programa o cualquier otro programador, in- 
clusive después de un tiempo. Para el compilador, los comentarios son inexistentes, por lo que no generan 
líneas de código, lo que permite abundar en ellos tanto como se desee, aunque con medida. 

En el lenguaje C se toma como comentario todo carácter interno a los símbolos: /* */ o iniciándolos con 
//. Los comentarios pueden ocupar uno o más renglones. 



/* Este es un Comentario */ 
// Este es un Comentario 



C estándar 

C+ + 



2.10 Conversión de tipos 

Cuando se evalúa una expresión aritmética que contiene diferentes tipos de datos, el compilador convierte 
todos ellos a un tipo único. Estas conversiones pueden aumentar o disminuir la precisión del tipo al que se 
convierten los elementos de la expresión. La conversión se hace operación a operación y se lleva a cabo según 
el tipo que esté más a la derecha de la siguiente relación: 

char — > int — » unsigned int — » long — > unsigned long — > float — » double -» long double 



charc; 
int i; 
long I; 
float f; 
double d; 
x = ( i * c 



>1) - (d/f) + f; 



Tomando en cuenta el orden de prioridad, primero evaluamos el contenido de los paréntesis, por lo 
tanto en los primeros paréntesis evaluamos los tipos de izquierda a derecha: 

i * c es un int, ya que el tipo int está a la derecha del tipo char en nuestra relación, 
i % 1 es un long, el tipo long está a la derecha del tipo int en nuestra relación, 
d/f es un double, ya que el tipo double está a la derecha del tipo float. 

Evaluamos de nuevo de izquierda a derecha y queda de la siguiente forma: 
long — double + float = double + float = double 
Para comprender lo anterior ejecute el siguiente programa: 
stdio.h > 



#include 
main ( ) { 



(i continúa ) 



Ejemplo 

© 



Ejemplo 

© 



22 Capítulo 2 Los datos y las operaciones básicas 



( continuación ) 

printf ( "división entera: 5/2 es % 7d\n" , 5/2); 
printf ( "división flotante: 5./2. es %7.2f\n", 5./2.); 
printf ( "división mixta: 5-/2 es %7.2f\n", 5./2); 



El resultado de la primera división es 2, ya que los dos valores son enteros; en las dos últimas divisiones 
se obtendrá 2.50 ya que es suficiente que un valor sea real (numerador o numerador). 

2.1 0.1 Conversión forzada de tipos de datos 

Además de la conversión automática, el lenguaje C ofrece la posibilidad de forzar la conversión de un tipo de 
datos en otro tipo diferente. Esta conversión forzada es conocida como “casts”: 

(tipo) expresión 

int a = B, b = 2; 
float c, d; 

c = a / b; //el tipo de c es ¡nt, ya que a y b son tipo int; el resultado es 1 
d = (float)a / b; // el valor de d es 1 .5 

2.10.2 El operador sizeof 

sizeof proporciona la cantidad de memoria ocupada por los elementos de datos, sizeof indica el número de 
bytes utilizado por cualquier variable particular en un determinado compilador. 

# inelude <stdio.h> 

# inelude <conio.h> 
main() { 

printf ("Tipo char: %d bytes\n", sizeof (char) ) ; 
printf ("Tipo short : %d bytes\n" , sizeof (short) ) ; 
printf ("Tipo int: %d bytes\n" , sizeof (int) ) ; 
printf ("Tipo long: %d bytes\n", sizeof (long) ) ; 
printf ("Tipo float: %d bytes\n" , sizeof (float) ) ; 

printf ("Tipo double : %d bytes\n" , sizeof (double) ) ; getch(); return 0; 

} 



Ejemplo 




Ejercicios complementarios de los datos y operaciones básicas en 

pseudocódigo 



Ejercicio 1 . Realice un algoritmo para indicar las actividades que efectúa el día martes. 

1 . 

2 . 

3. 

4. 

5. 



Ejercicios complementarios de los datos y operaciones básicas en pseudocódigo 



6 . 

7. 



9. 

Ejercicio 2. Escriba válido o inválido en cada identificador para el pseudocódigo y responda ¿por qué? 

Identificador Válido o inválido ¿Porqué? 

a rea 
área 
dato 1 
dato_1 
1 radio 
radiol 



Ejercicio 3. Añada válido o inválido a cada declaración de variable en pseudocódigo. 



Declaración de variable 


Válido o inválido 


entero a 




entero _a 




real x 




real xl 




real 1x 




carácter %s 





Ejercicio 4. Escriba válido o inválido a cada declaración de constante en pseudocódigo. Si la constante 
es válida, especifique el tipo respectivo. 

Declaración de constante Válido o inválido Tipo de constante 

constante MAX <— 20 
constante X <— 7.8E+0.3 
constante C <— 'x' 
constante <— 3.1415 
constante N <— "Marco" 
constante CAR c 
constante G <— 9.8 
constante NOM <— Lucy 
constante X <— 9.3e-2 



constante W <— 'abe' 




Capítulo 2 Los datos y las operaciones básicas 



Ejercicio 5. Calcule las siguientes expresiones en pseudocódigo y escriba el resultado respectivo. 

1. 9+3*16/ 2**3 -5/2 = 

2. 15/3+4*3 A 2-5*6 = 

3. (6*3+8 — 9/3 +2 A 4)/2 = 

Ejercicio 6. Complete la columna de resultado y de valor binario según la expresión. 

Expresiones lógicas Resultado Valor binario 

(2 >3) 

(8 < 1 5 ) 

(7 > 5) y (4 < 9) 

(12 > 6) y (13 < 9) 

(12 > 6) o (13 < 9) 
no (2 > 4) 
no (5 < 8) 



Ejercicios complementarios de los datos y operaciones básicas en 

“ — lenguaje C 

a) Responda las siguientes preguntas: 

1. ¿Qué es un identificador? 

2. ¿Cuáles son las reglas para nombrar un identificador? 

3. ¿Qué es un tipo de dato? Mencione tres tipos de datos en el lenguaje C y sus características. 

4. ¿Qué es una variable? 



5. ¿Qué es una constante? 



Ejercicios complementarios de los datos y operaciones básicas en lenguaje C 25 



6. ¿Qué es una expresión? 

7. ¿Qué es un operador? 

8. Mencione tres tipos de operadores de lenguaje C. 

9. ¿Qué es el orden de prioridad? 

10. ¿Cuál es el orden de prioridad de los operadores aritméticos? 

11. ¿Cuándo se deben utilizar los paréntesis en una expresión? Mencione un ejemplo. 

12. ¿Qué diferencia existe entre los operadores = y = = en lenguaje C? 

13. ¿Qué es una palabra reservada? 

14. ¿Qué es un comentario y cómo se representa en lenguaje C? 

b) Investigue: 

1. Una breve reseña histórica del lenguaje C. 

2. Cómo obtener los rangos de valores de cada tipo, auxíliese de las librerías: limits.h, para los de tipo 
entero y float.h para los de tipo real. 

Ejercicio 1. Tache los ¡dentificadores que no son válidos para lenguaje C. 

1. _numero 4. home 7. 2variables 10. end 

2. número 5. dinero$ 8. el punto 

3. año 6. base_l 9. scanf 

Ejercicio 2. Escriba las siguientes expresiones matemáticas como expresiones de C. 




3 ' ’^zf +4:X ~'l 7 ~ y = 




^ 2 xy + 5 y 4x — xy 



x — 3 %j7-y/(4 + x) 



Ejercicio 3. Calcule las siguientes expresiones en lenguaje C y escriba el resultado respectivo. 



1. 3 + 2* (k = 7/2) = 

2. 9 + pow (3, 2) / (9-11) = 

3. -3*7/2 + pow(2,3)/ 4-2 = 

4. 6+2* (5 — (4+2)) - 3* (7.2 + 9.0 * 6) 



26 Capítulo 2 Los datos y las operaciones básicas 



5. 8 + 7% 5% 3 * 2 = 

6. —7% — 5*9/4 = 

7. !(17> = pow(6, 2)| |(13— 7*3%2!=4*5%2)) = 

8. 7-((21>=4*pow(2,3) && 9 > 8 && 22 > 5)||!(5*2 < 3 + 16*32-pow(3,2)))*3 = 

9. 2+7*(6*(l — (7+2)/9)) = 

10. 6>5||16= = 15 && !(9>7) = 

11. 4*((!(7/4>2)||9>9) && (3> =7/3 1 1 1 +4> = 9/2)) +5 = 



Ejercicio 4. Considerando las variables: int i=7, j=4, k; float f; char c, realice la corrida a mano de las 
siguientes expresiones, escribiendo a la derecha los valores (siga el orden establecido). 



1. i+=j + + ; 


i = 


) = 


2. j + = + +i+7; 


j = 


i = 


3. k = (j + + <i) ? i— 2 : j*2; 


k = 


) = 


4. j * = i+k; 


j = 




5. j / = i— 3; 


) = 




6. j = i 4 — 1 — 5; 


i = 


i = 


7. j += i%(k— 1); 


) = 




8. f = (float) i/3; 


f = 




9. k = j— ’7’+2; 


k = 




10. c = 2* j + 1/2; 


c = 




11. k = 3! = 7; 


k = 




12. k = j = 5; 


k = 


j = 


13. i + j = k; 


k = 





Ca p ítul ° ^3} 

Programación 

estructurada 




Al término de este capítulo, 

el alumno será capaz de 

<§) M 

Identificar y utilizar técnicas para la formu- 
lación de algoritmos (pseudocódigo y dia- 
gramas de flujo), y su codificación en un 
lenguaje de alto nivel, utilizando las diferentes 
estructuras de control en un programa. 



Contenido 

« 

3.1 Definición 

3.2 Estructuras de control y su clasificación 

3.3 Estructura de un algoritmo y de un pro- 
grama 

3.4 Estructura de control secuencial 

3.5 Estructura de control selectiva o alternativa 

3.6 Estructura de control repetitiva o de itera- 
ción condicional 




Capítulo 3 Programación estructurada 



3.1 Definición 

La programación estructurada es un paradigma o forma de programar. Es un conjunto de técnicas que nos 
permiten desarrollar programas fáciles de escribir, verificar, leer y mantener e incluyen: 

1. Diseño descendente ( top-down ). 

2. Estructuras de datos. 

3. Estructuras de control. 

4. Programación modular. 

En este capítulo nos enfocaremos en el tercer punto. 

Diseño descendente ( top-down ) 

En la programación estructurada las instrucciones están ordenadas u organizadas de arriba a abajo, lo que 
facilita el diseño del algoritmo, el entendimiento del código y por consiguiente el mantenimiento del mismo. 

Estructuras de datos 

Son un conjunto de datos donde podemos almacenar y acceder a elementos individuales de datos, por lo que 
pueden separarse en los elementos que la forman. 

Programación modular 

Otra característica que tiene la programación estructurada es que el problema se puede dividir en secciones 
o partes (módulos). Este tipo de programación permite resolverlo de manera más sencilla y en forma paralela 
si es necesario, es decir por un equipo de personas. 






3.2 Estructuras de control y su clasificación 



Estas estructuras controlan cómo se ejecutan los programas, es decir el orden de las instrucciones, ya que 
tienen un solo punto de entrada y un punto de salida. En la programación estructurada se mezclan las estruc- 
turas de control y las podemos clasificar en: 



Estructuras de control 



Secuencial. 

Selectiva. 

Repetitiva o de iteración condicionada. 



Estructura de control secuencial 

Las instrucciones se ejecutan en orden, una por una desde la primera hasta la última, es decir el programa 
ejecuta todas las instrucciones del programa en el orden establecido sin saltarse ninguna de ellas. 

Estructura de control selectiva o alternativa 

De acuerdo con una condición que puede ser verdadera o falsa se elige una opción, la cual realiza una acción 
(una o varias instrucciones). La condición puede ser simple o compuesta (una o varias). 

Estructura de control repetitiva o de iteración condicionada 

Una acción se repite una cantidad definida o indefinida de veces mientras una condición sea verdadera. 

La lógica de programación se centra sobre todo en el cuerpo del programa, utilizando las estructuras 
de datos y las de control, además de la programación modular. Para diseñar los programas de computadora, 



3.3 Estructura de un algoritmo y de un programa 29 



comúnmente se utilizan diferentes estructuras de control a fin de poder llegar a la solución de un problema, 
cuáles y cuántas dependerán del problema mismo. 

Para facilitar la comprensión de la lógica de programación, primero realizaremos el diagrama de flujo, el 
pseudocódigo y lenguaje C de algunos ejercicios y después solamente el pseudocódigo y lenguaje C. 



3.3 Estructura de un algoritmo y de un programa 

En la programación estructurada se recomienda tener un orden, tanto en los algoritmos, como en los pro- 
gramas; por ejemplo, la estructura de un algoritmo en pseudocódigo y de un programa lenguaje C es la si- 
guiente: 



Pseudocódigo 



Prototipo de las funciones 

Declaración de variables globales y constantes 

Programa principal () 

inicio 

Declaración de constantes (locales) 
Declaración de variables (locales) 

Cuerpo del programa (estructuras de control) 
fin 

Declaración de funciones 

inicio 

fin 



Lenguaje C 

Comentarios 

Declaración de archivos de cabecera (librerías) 
Prototipo de la funciones 

Declaración de variables globales y constantes 
main() // Programa principal 
{ 

Declaración de constantes (locales) 
Declaración de variables (locales) 

Cuerpo del programa (estructuras de control) 

} 

Declaración de funciones 

{ 

} 



Programa principal (j 1 en pseudocódigo es el equivalente en lenguaje C a la función main(). 

A continuación explicaremos cada parte de la estructura de un programa en lenguaje C. 

3.3.1 Comentarios 

La primera línea de un programa en C suele ser una línea de comentario, en la cual se escribe el nombre del 
programa, lo que realiza, los datos del autor, la fecha y la versión. Las líneas de comentario en C estándar se 
encierran entre los caracteres /* y */. En C + + los comentarios se inician con //. 

3.3.2 Declaración archivos de cabecera o encabezado 
(librerías o bibliotecas) 

Indican al compilador que en esta posición se incluyan las líneas de sentencias que están dentro del archivo 
que se declara; son archivos estándar proporcionados por el fabricante del compilador, y se suelen declarar 
funciones, variables y constantes que van a ser utilizadas por las sentencias que el programador va a mane- 
jar en las siguientes líneas del programa. 

Para llamar un archivo de inclusión o cabecera es necesario hacer uso de la directiva #include, la cual 
tiene la siguiente sintaxis-. 

#include nombre_archivo_cabecera 



De aquí en adelante sólo utilizaremos la palabra reservada principal. 



30 Capítulo 3 Programación estructurada 



Ejemplos 



Ejemplos 



Donde nombre_archivo_cabecera es el nombre de un archivo que contiene las declaraciones y definicio- 
nes para un propósito específico. Este archivo debe tener la extensión .h. 

#¡nclude"stdio.h" 

#include <std¡o.h> 



Las comillas le dicen a C que busque primero en el directorio de trabajo actual el archivo de inclusión; si 
no lo encuentra, busca entonces en el directorio especificado en la línea de órdenes, y finalmente si aún no lo 
ha encontrado entonces busca en el directorio estándar que se haya definido durante la instalación. 

Si el archivo de inclusión se encierra entre signos menor y mayor que, el compilador busca primero en 
el directorio especificado en la línea de órdenes; si no lo encuentra busca entonces en el directorio estándar. 
Jamás busca en el directorio de trabajo. 

Si en la inclusión se especifica nombre de ruta o camino, entonces busca en dicho directorio. 

#¡nclude "c:\cabecera\stdio.h" 

#include <c:\include\ctype.h> 

Bibliotecas o librerías de cabecera más utilizadas en C 

stdio.h contiene declaraciones de rutinas de entrada/salida. 
math.h contiene declaraciones de funciones matemáticas. 
string.h contiene funciones con cadenas. 
conio.h consola y puertos de E/S. 
ctype.h clasificador de caracteres. 

3.3.3 Prototipos defunciones 

Un prototipo es la declaración de una función que sólo contiene la cabecera; a diferencia de la declaración 
completa, al final lleva punto y coma. El prototipo le avisa al compilador que existe una función que va a 
regresar un determinado tipo de dato y qué parámetros utilizará. 

3.3.4 Declaración de variables globales 
y constantes 

Las constantes y variables son elementos que tienen el objetivo de identificar los datos que se utilizan en las 
operaciones y cálculos que realiza el programa y que se almacenan en la memoria de la computadora. Si las va- 
riables globales son declaradas en esta parte, pueden ser utilizadas en todo el programa. 

3.3.5 El programa principal o función 
principal main() 

El programa principal contiene el flujo del programa llamando a las funciones necesarias para su funcio- 
namiento. La función mainQ indica dónde empieza el programa, cuyo cuerpo principal es un conjunto de 
instrucciones delimitadas por dos llaves, una inmediatamente después de la declaración mainQ, “ { “, y otra 
que finaliza el listado, “ } “. Todos los programas C arrancan del mismo punto: la primera instrucción dentro 
de dicha función. 

3.3.6 Declaración defunciones 

Se declaran las funciones que utiliza el programa y que no están definidas en las librerías. Las funciones son 
un conjunto de sentencias que realizan una tarea concreta y que retornan un dato como resultado de las 
operaciones que han realizado. Es importante recordar que lo mínimo que debe contener un programa en 
lenguaje C es un archivo de cabecera y el mainQ. Por ejemplo: 



3.3 Estructura de un algoritmo y de un programa 31 



#include <stdio.h> 
main ( ) 



Ejemplos 

® 



printf ( "Bienvenido al Lenguaje 



C" ) ; 



Ejemplo de estructura de un programa típico en lenguaje C 

Comentario del inicio del programa 

/* Programa que muestra la estructura de un programa en C*/ 

Declaración de archivos de cabecera (librerías) 

#¡nclude <stdio.h> 

#¡nclude <conio.h> 

Prototipo de las funciones: 
void bienvenida (char nombre); 

Declaración de variables globales y constantes: 
char nombre[30]; 

Programa principal: 
main() 

1 

printf("¿Cuál es tu nombre:?\n"); 
scanf("%s",&nombre); 

bienvenida(nombre); //Llamada a función 
getchO; return 0; 

1 

Declaración de funciones: 
void bienvenida (char nomb[]) 

1 

printf("\nhola %s Bienvenido(a) al Lenguaje C", nomb); 
getchO; 

1 

El programa completo queda de la siguiente manera: 

#include <stdio.h> 

#include <conio.h> 
void bienvenida (char nomb[] ) ; 
char nombre [30] ; 
main ( ) 

{ 

printf ( "¿Cuál es tu nombre : ?\n" ) ; 
scanf ("%s" , knombre) ; 
bienvenida (nombre) ; 

} 

void bienvenida (char nomb [] ) 

{ 

printf ( "\nhola %s Bienvenido (a) al Lenguaje C" , nomb); 
getch ( ) ; 

} 



Ejemplos 



32 Capítulo 3 Programación estructurada 



3.4 Estructura de control secuencial 

® ' 

Es la estructura más sencilla ya que el programador identifica los datos de entrada, los procesa y muestra o 
imprime los datos de salida. 

La estructura secuencial se puede representar de la siguiente forma: 



Diagrama de flujo 



^ inicio ^ 







inst 1 






inst 2 






inst n 







GG> 



Pseudocódigo 

principal () 
inicio 

inst 1 
inst 2 

inst n 
fin 



Lenguaje C 

main ( ) 

{ 

inst 1 ; 
inst 2 ; 

inst n; 



A continuación presentamos los ejercicios resueltos; para tal efecto debemos retomar lo aprendido en sec- 
ciones anteriores respecto a la asignación. Además debemos distinguir la entrada y la salida de datos: 



Significado 


Diagrama de flujo 


Pseudocódigo 


Lenguaje C 


Entrada 




/ / leer 


scanf 






¿ f leercad 


gets 


Salida 






imprimir 


printf 






imprimircad 


puts 



3.4.1 Ejercicios resueltos de la estructura de control secuencial 

Ejercicio 1 . Sume dos números enteros. 









3.4 Estructura de control secuenclal 



33 



Para la parte lógica de la programación nos centraremos en las tres primeras etapas del desarrollo de un 
programa. 

1. Entender el problema. 

En este caso sumar dos números; el término suma es claro y conocido. 

2. Análisis del problema. 

Al realizar un análisis nos arroja los siguientes datos: 

Datos de entrada : ni, n2 

Datos de salida : suma 

Fórmula : suma = ni + n2 

3. Diseño del algoritmo. 

Se desarrollaron el pseudocódigo y el diagrama de flujo arriba descritos. 

Explicación del diseño: 

Como se aprecia en la tabla 3.1, el nombre de las variables las elige usted; se recomienda que hagan 
referencia a lo solicitado o calculado. 

Tabla 3.1 Nombre y descripción de las variables 

Nombre de la variable Descripción 

ni Primer número o número 1 a introducir 

n2 Segundo número o número 2 a introducir 

suma Suma de los dos números introducidos 



Para este programa se declaran tres variables de tipo entero, dos variables que son los datos de en- 
trada que no se conocen y se necesitan leer o pedir al usuario {ni y n2 ) y una variable (dato de salida) en 
la cual se va a guardar el resultado {suma). Cabe hacer notar que en el diagrama de flujo no se acostum- 
bra declarar ni las variables ni las constantes. 

La instrucción imprimir muestra en pantalla todo lo que se encuentra entre las comillas, y en la parte 
que no tiene comillas se muestra el valor de la variable respectiva. Por lo tanto, los letreros los distingui- 
mos de las variables por las comillas y los separamos con comas, si se requiere imprimir o mostrar el 
valor de varias variables. Cabe hacer notar que en un diagrama de flujo los letreros previos a la lectura 
de un dato o impresión de una variable son opcionales, en el presente ejercicio no aparecen. 

La instrucción leer solicita los datos al usuario, guardando éstos en las variables ni y n2. La expre- 
sión suma <r- ni + n2 primero realiza la suma de los valores almacenados a las variables ni y n2 y el 
resultado lo guarda en la variable suma, la cual se muestra en pantalla en la última instrucción. 



si ni = 6yn2 = 9se mostrará: La suma es: 1 5. 



Ejemplos 

<§> 



Nota 1 : Solamente se muestra el valor de la variable suma, mas no el nombre de la variable. 

Nota 2: Todo programa solicita los datos que desconoce o que necesita saber, los almacena en variable(s) y luego utiliza 
el valor de la variable para realizar los cálculos necesarios según sea el resultado que desea obtener, almacenando este 
resultado en alguna variable y luego mostrando el valor de la variable o imprimiendo directamente el resultado, como 
en el ejercicio siguiente. 

De acuerdo con lo que acabamos de ver en el ejercicio, a continuación describimos un algoritmo en 
pseudocódigo siempre que tengamos fórmulas: 

1. principalQ 

2. inicio 

3. Declaración de variables de entrada y salida. 

4. Leer datos de entrada, los encontramos a la derecha del operador de asignación. 



34 



Capítulo 3 Programación estructurada 



5. Procesar fórmula. 

6. Imprimir datos de salida, los encontramos a la izquierda del operador de asignación; por lo tanto por 
cada fórmula sólo abra un dato de salida. 

7. fin. 

El algoritmo presentado es para una fórmula, pero también se puede implementar para varias fórmu- 
las, respetando los pasos 1, 2 y 7. Se pueden repetir los pasos 4, 5 y 6 en secuencia para cada fórmula o 
aplicando cada paso para todas las fórmulas, por ejemplo si se tienen tres fórmulas en el paso 6 se im- 
primirían los 3 resultados. 

4. Código en lenguaje C 

Ahora veamos el significado de cada una de las líneas del programa. 




Ejercicio 1 . Sume dos números enteros. 

Es un comentario. El compilador de Turbo C ignora todo lo que está entre los símbolos de comienzo (/*) y fin 
(*/) de un comentario. Los comentarios delimitados por estos símbolos pueden ocupar varias líneas. Cuando 
se utilice el símbolo //, se tendrá que escribir al principio de cada renglón, por lo que es más conveniente el 
símbolo anterior para varias líneas. 

#include <stdio.h> 

Le dice a Turbo C que en el proceso de compilación incluya un archivo denominado stdio.h. La sen- 
tencia #include no es una instrucción C. El símbolo # la identifica como una directiva, es decir, una orden 
para el preprocesador de C, responsable de realizar ciertas tareas previas a la compilación. Los archivos *.h 
se denominan archivos de cabecera. Todos los programas C requieren la inclusión de uno o varios archivos 
de este tipo, por lo que normalmente es necesario utilizar varias líneas #include. El archivo stdio.h contiene 
las declaraciones de las funciones de entrada/salida, así como definiciones de constantes simbólicas y algu- 
nas otras definiciones de utilidad. 

#include <conio.h> 

Este archivo contiene funciones como son clrscr() 2 y getch(). 

main () 



2 La instrucción clrscr() no viene incluida en librería conio.h de dev-c+ + , para poderla utilizar se necesita instalar el conio2.h, o en 
su defecto no usarla. 



3.4 Estructura de control secuendal 



35 



Es el nombre de una función. Un programa C se compone de una o más funciones, pero al menos una 
de ellas debe llamarse mainQ ( principal ), pues los programas C empiezan a ejecutarse por esta función. La 
palabra void es opcional; indica que la función mainQ no tiene valor de retorno ni argumentos. Podríamos 
haber escrito void 3 main() y no hubiéramos necesitado la instrucción return 0. 

Los paréntesis identifican a mainQ como una función. Generalmente, dentro de ellos se incluye informa- 
ción que se envía a la función. En este caso no hay traspaso de información, por lo que no hay nada escrito 
en su interior. Aun así son obligatorios. El cuerpo de una función (conjunto de sentencias que la componen) 
va enmarcado entre llaves { y }. Ése es el significado de las llaves que aparecen en el ejemplo ( inicio y fin en 
pseudocódigo). 

int ni, n2, suma; 

Es una sentencia declarativa; indica que se van a utilizar tres variable ni, «2, suma que son de tipo 
entero. La instrucción int es una palabra clave de C que identifica uno de los tipos básicos de datos. En C 
es obligatorio declarar todas las variables antes de ser utilizadas. El identifica la línea como una sen- 
tencia C. 



clrscr(); 

Esta función permite borrar pantalla (clear screen) y pertenece a la librería <conio.h>. 

printf(“Dame el primer Número”); 

La función printfQ pertenece a la biblioteca estándar de C y se encuentra en el archivo stdio.h, de ahí que 
sea necesaria la sentencia #include <stdio.h>. Esta función es el equivalente de imprimir en pseudocódigo. 

scanf(“%d”;&nl); 

La sentencia consta de dos partes: 

• El nombre de la función: scanfQ. 

♦ Los argumentos. Son los valores que aparecen entre los paréntesis separados por una coma, en este caso 

hay dos: 

- “%d”. 

- &nl. 

scanfQ es una función de la biblioteca estándar de C (como printfQ), que permite leer datos del teclado 
y almacenarlos en una variable. En el ejemplo, el primer argumento siempre va dentro de las comillas: %d, 
le dice a scanfQ que tome del teclado un número entero. El segundo argumento, &nl, indica en qué variable 
se almacenará el dato leído. El símbolo & antes del nombre de la variable es necesario para scanfQ ya que nos 
indica la dirección de la memoria en donde ubicaremos la variable en cuestión. Esta función es el equivalente 
de leer en pseudocódigo. 

printf(“Dame el segundo Número”); scanf(‘‘%d”;&n2); 

Es igual al proceso que utilizamos para leer ni en las líneas anteriores. 

suma = ni + n2; 

Se almacena en la variable suma el resultado de sumar la variable ni más n2. 

printf(“La suma es : \n %d“,suma); 

Como vemos a diferencia del imprimir en pseudocódigo la variable necesita el formato respectivo. El 
primer argumento es una cadena de formato. En esta cadena el texto aparecerá idéntico en pantalla. En la 
cadena de formato pueden aparecer códigos de formato y caracteres de escape. 

Un código de formato comienza por el símbolo % e indica la posición dentro de la cadena en donde se 
imprimirá el segundo argumento, en este caso, la variable suma. En este ejemplo, %d indica que en su lugar 
se visualizará un número entero decimal. 



3 En dev-c++ no es permitido utilizar void main(), sólo acepta int mainQ o simplemente mainQ. 



36 



Capítulo 3 Programación estructurada 



Ejemplos 



Un carácter de escape comienza por el símbolo V La secuencia \n es el carácter nueva línea y equivale a 
la secuencia lf + cr (salto de línea + retorno de cursor). 

getch(); 

Esta función hace una pausa, pues espera a que oprima cualquier tecla y con ello puede ver el resultado 
antes de que regrese al editor del compilador. Pertenece a la librería <conio.h>. 

return 0; 

Cualquier función en C debe regresar algún valor, exceptuando las funciones que regresan un tipo void 
(nada); en nuestro ejemplo sólo utilizamos la función mainQ y por lo tanto por default al no aparecer un tipo 
de retorno el tipo es entero (int), y por lo tanto como la función mainQ no regresa algún valor le indicamos 
que regrese o retorne 0 (cero), que es nada. También es permitido escribir return (0). 

Ejercicio 2. Área de un cuadrado. 




Este programa declara solamente una variable lado, la cual nos sirve para guardar el valor del lado de un 
cuadrado, pero como verán no existe ninguna variable para almacenar el resultado (área), así que el cálculo 
lo haremos directamente al momento de imprimir el resultado; primero se hace el producto del lado * lado, 
y el resultado se imprimirá después de la etiqueta o mensaje. 

Si lado es igual a 5 el programa imprimirá: El área del cuadrado es igual a: 25. 




La diferencia entre el pseudocódigo y el código en C, es que agregamos una variable cadena para las uni- 
dades. La variable unid es de tipo char [12] (cadena de 12 caracteres), por lo tanto el formato para leer e 
imprimir dicha variable es %s. 




3.4 Estructura de control secuencial 



37 



Nota: Algunos compiladores de lenguaje C no aceptan para cadenas el formato %s, por lo que se debe utilizar la función 
gets(), la cual veremos posteriormente. 

En el último printf imprimimos dos valores: una expresión (lado*lado) y una cadena. 

Qué sucede si la longitud de un lado del cuadrado es: 200. 

Dame las unidades: metros. 

Escribe la longitud de un lado del cuadrado: 200. 

El área del cuadrado es igual a: —25536 metros. 

¿Por qué se imprime este resultado? 

Recuerde que el tipo de dato inte n algunos compiladores maneja rangos de valores comprendidos entre 
—32,768 y 32,767, por lo que si deseamos calcular el área con un lado de 200 tendremos que utilizar el tipo 
long, ya que el rango de valores está entre — 2,147’483,648 y 2,147’483,647 y queda el programa: 



main ( ) 

{ 

long lado; 
char unid [12] ; 

printf ("Dame las unidades: ") ; 

scanf ("%s" , &unid) ; 
printf ( "Escribe la longitud de 
scanf ( "%li" , &lado) ; 
printf ("El área del cuadrado es 
getch ( ) ; 
return 0 ; 

} 

Qué sucede si la longitud de un lado del cuadrado es: 123456789. El área del cuadrado es igual a: 
— 1757895751. Este valor es inválido porque no alcanza en 2 bytes de memoria que ocupa un dato de tipo 
int (entero) por lo cual tendríamos que utilizar el tipo float (real) cuyos valores están comprendidos entre 
-3.4 X1CT 38 y 3.4X10 +38 . 

En el siguiente ejercicio utilizaremos el tipo float. 

Ejercicio 3. Área del circulo y el volumen de una esfera con el mismo radio. 



Una posible salida en pantalla, después de ejecutar el programa sería: 

El formato para un entero largo tanto en scanf como en printf es II. 

Dame las unidades: metros 

Escribe la longitud de un lado del cuadrado: 200 

El área del cuadrado es Igual a: 40 000 metros 

un lado del cuadrado: ") ; 

igual a: %li %s" , lado*lado, unid); 



Diagrama de flujo 

CZZD 



radio 



area<— pi * radio * radio 





are 


a 




volumen <— 4/3 * PI 


* radio * radio *radio 




volur 


nen 







Pseudocódigo 
constante Pl<— 3.14159 
principal ( ) 
inicio 

real radio, area, volumen 

Imprimir "Area y el volumen de una esfera en cm..." 

Imprimir "Cuánto mide el radio " 
leer radio 

area <— pi * radio * radio 
imprimir "El área del círculo es: ", area 

volumen <— 4 / 3 * PI * radio * radio * radio 

imprimir" El volumen de la esfera es: ", volumen, "cm 
cúbicos. " 



c ) 



fin 







38 Capítulo 3 Programación estructurada 



Aquí añadimos un nuevo concepto, el de constante, definido anteriormente; el valor de pi será igual a 
3.14159 durante todo el programa. Se declaran tres variables de tipo real, radio es la única variable de entrada 
que se necesita para obtener el área y el volumen; ésta es la que se pide en la instrucción leer radio, el valor 
se guarda en la variable radio y luego se utiliza el radio para calcular el área; cuando en la expresión apare- 
ce pi éste es sustituido por el valor asignado en la declaración de constantes, así que se multiplica 3.14159 
por el valor del radio al cuadrado y éste se guarda en la variable area-, este valor se muestra en pantalla con 
la instrucción imprimir, luego se realiza el cálculo para el volumen utilizando el mismo valor que se tiene 
almacenado en la variable radio y en pi y se guarda en la variable volumen, que luego se imprime en la última 
instrucción. 



Ejemplos 



Si radio = 5 imprimirá: El área del círculo es: 78.53 y El volumen de la esfera es: 523.59. 



La instrucción imprimir, imprimirá todo aquello que aparezca entre comillas dobles (“), se refiere a la 
etiqueta que desea mostrar, más el resultado esperado, es decir la variable(s), pero cuando se ejecuta el pro- 
grama sólo se mostrarán los valores de estas variables y no el nombre que les asignamos a éstas. 

La variable area no debe acentuarse, recuerde que un identificador no permite caracteres especiales. 



Lenguaje C 

#include <stdio.h> 

#include <conio.h> 

#define pi 3.14159 
main ( ) 

{ 

float radio, area, volumen ; 

printf ("Este programa calcula el área y el volumen de una esfera (en cm) . . . \n" ) ; 

printf ( "¿Cuánto mide el radio?\n"); 

scanf ( "%f " , &radio) ; 

area = PI * radio * radio, - 

printf ("El área del círculo es: %.2f cms . \n" , area) ; 

volumen = ( 4 . / 3 ) * PI * (radio * radio * radio); 

printf ("El volumen de la esfera es: %.2f cm cúbicos .", volumen) ; 

getch ( ) ; 
return 0 ; 

} 



#definep/ 3.14159 

Definimos la constante pi con el valor de 3.14159. 

float radio, area, volumen; 

Es una sentencia declarativa que indica que se van a utilizar las variables llamadas radio, area, y volu- 
men, las cuales son tipo float. Este tipo de dato se utiliza para declarar variables numéricas que pueden tener 
decimales. 

En la fórmula para el volumen es importante que el numerador o el denominador tengan el punto deci- 
mal, ya que en caso contrario el resultado será: 84.82 (ver conversión de tipos). 



printf(“El área del círculo es: %.2f cms. \n”, area); 



3.4 Estructura de control secuencial 



39 



El código %f se usa para representar variables del tipo float. El valor de la variable area se imprimirá con 
dos decimales %.2f. 

Ejercicio 4. Hipotenusa de un triángulo rectángulo. 




En el ejercicio anterior se declaran dos variables de entrada enteras (a, b) y una de salida (c) que es real ya que 
la fórmula calcula la raíz cuadrada. 

Se solicitan el cateto adyacente y el opuesto y se almacenan en a y b, respectivamente. En la instrucción 
donde se realiza el cálculo, primero se realiza la expresión que se encuentra dentro de los paréntesis y por el 
orden de prioridad de los operadores se calculan los productos y luego la suma, y a este resultado se le calcula 
la raíz cuadrada con la función raizcuad() que ya está programada para muchos lenguajes y el resultado se 
almacena en C. Este resultado se imprime en pantalla con la última instrucción. 

Las variables son de tipo float debido a que el resultado de la raíz será una cantidad real, ya que en ca- 
so de ser tipo entero nos imprimirá cero. Como podemos ver, se pueden escribir varias instrucciones en 
una sola línea, pero no es conveniente que sean demasiadas, ni tampoco salimos del recuadro del editor 
de lenguaje C. Incluimos la librería math.h ya que aquí encontramos todas las funciones matemáticas, entre 
ellas sqrt. 



Una posible salida en pantalla, después de ejecutar el programa sería: 

Cateto adyacente al ángulo: 3 
Cateto opuesto al ángulo: 4 
La hipotenusa mide: 5.00 



Se declaran las dos variables (cm es tipo real, pulg es tipo entero) y se solicita el valor de las pulgadas y se 
guarda en la variable pulg, se realiza el cálculo y se almacena en la variable cm, para luego imprimir el re- 
sultado. 



SI pulg = 8 se imprimirá en pantalla 8 pulgadas = 20.320 centímetros. 



Ejemplos 




40 Capítulo 3 Programación estructurada 



Ejercicio 5. Conversión de pulgadas a centímetros. 




Ahora en el código en C analicemos la línea: 

printf (“%d pulgadas equivalen a %7.3f centímetros “,pulg,cm); 

printfO tiene tres argumentos. El primero es la cadena de control, con dos códigos de formato: %d y %f. printfQ 
necesita dos argumentos adicionales, los cuales se acoplan en orden, de izquierda a derecha, con los códigos 
de formato. Se usa %d para la variable pulgy %f para la variable cm, y esta última variable se imprimirá en un 
ancho de siete espacios y con tres decimales. 



printf {"%d pulgadas equivalen a %7.3f centímetros\n" pulg, cm); 


t : 


i | i 


i 



Ejercicio 6. Una tienda vende libros a $100, cuadernos a $15.50 y plumas a $2.35. Calcule el monto 
total de una venta según el número de artículos vendidos. 



Pseudocódigo 

constante plib <— 100 
constante pcuad t— 1 5.5 
constante pplum <— 2.35 
principal () 
inicio 

entero libros, cuadernos, plumas 
real venta 

imprimir "¿Cuántos libros vendió?" 
leer libros 

imprimir "¿Cuántos cuadernos vendió?" 
leer cuadernos 

imprimir "¿Cuántas plumas vendió?" 
leer plumas 

venta <— libros * plib + cuadernos * pcuad + plumas * pplum 
imprimir "La venta de libros fue de:", libros * plib 
imprimir "La venta de cuadernos fue de:" cuadernos * pcuad 
imprimir "La venta de plumas fue: ", plumas * pplum 
imprimir "La venta total del día fue de:" venta 
fin 



3.4 Estructura de control secuencia I 41 



En este ejercicio se utilizan tres constantes ( plib , pcuad, pplum ) para guardar el precio de los libros, cua- 
dernos y plumas, respectivamente, de tal manera que si el precio de éstos cambiara sólo lo tendremos 
que modificar en la declaración de las constantes y de esta manera el algoritmo no varía pero el resulta- 
do adquiere el nuevo valor. 

Se declaran tres variables de entrada enteras (libros, cuadernos y plumas) que almacenarán la cantidad 
de cada producto que desea comprar. Son enteras, ya que no es posible comprar uno y medio libros, por 
ejemplo. 

En la siguiente instrucción se realiza el cálculo que se almacena en la variable venta, que es real ya que 
algunos precios son reales y al hacer el producto y la suma el resultado será real. En el momento de hacer la 
instrucción ( libros * plib + cuadernos * pcuad + plumas * pplum) los valores de las constantes son sus- 
tituidos por los declarados al inicio y la instrucción se calcula ( libros * 100 + cuadernos * 15.5 + plumas * 
2.35 ) solicitando primero al usuario la cantidad de libros, cuadernos y plumas. 



Si son libros = 2, cuadernos = 4 y plumas = 3 se sustituyen los valores en la fórmula y se almacena el resultado en 
venta = 2 * 1 00 + 4 * 1 5.5 + 3 * 2.35, si se realizan primero los productos quedan venta = 200 + 62 + 7.05, y luego 
la suma donde el resultado venta = 269.05 y se imprimirá: La venta total del día fue de: 269.05. 



Ejemplos 

© 




En el ejercicio 7 se declaran dos variables de entrada, base y alt, y tres variables de salida, area, peri y diag. 
Se solicitan los datos de entrada con la instrucción imprimir “Dame la base y la altura”, almacenando estos 
dos valores en base y alt. Posteriormente se realizan los cálculos para el área, perímetro y diagonal, alma- 
cenándose en area, peri, diag. Es importante recalcar que las dos variables de entrada, base y alt se utilizan 
en las tres fórmulas, ya que son las medidas para el mismo rectángulo. Después se imprimen los tres resul- 
tados. 



Si la base = 4 y la alt = 3, se utilizan los valores en la fórmula y se almacena en area = 4 * 3, en peri =2* 
4 + 2 * 3, y por último diag = raizcuad (4*4 + 3* 3), se imprime: El área es: 12, El perímetro es: 14, La diago- 
nal es: 5. 



Ejemplos 



42 Capítulo 3 Programación estructurada 



Ejercicio 7. Área, perímetro y diagonal de un rectángulo. 




En lenguaje C existe la función predefinida sqrt para calcular la raíz cuadrada de un valor (vea el capítulo 
de programación modular), dicha función la encontramos en la librería math.h; por ello tuvimos que anexar 
dicha librería al principio del código en C. 



Ejercicios complementarios de la estructura de control secuencial en 

pseudocódigo y diagrama de flujo 



Ejercicio 1. Complete el siguiente algoritmo que calcula el área del trapecio e identifique las variables de 
entrada y salida. 

principal () 
inicio 

real , basemenor, altura, area 

imprimir"Escribe la longitud de la Base mayor en cm:" 

basemayor 

imprimir"Escribe la longitud de la Base menor en cm:" 

leer 

"Escribe la altura" 




Ejercicios complementarios de la estructura de control secuencial en pseudocódigo y diagrama de flujo 43 



leer altura 

<— (basemayor + basemenor) * altura / 2 

imprimir"EI área del trapecio es: cm" area 
fin 

Identifique las variables de: 

Entrada 

Salida 

Ejercicio 2. Complete el siguiente algoritmo que calcula el área y el perímetro de un triángulo isósceles e 
identifique las variables de entrada y salida. 

principal () 
inicio 

base, altura, lado, area, perímetro 

¡mprim¡r"Cuánto mide la base del triángulo isósceles" 

leer 

imprimir"Cuánto mide la altura del triángulo" 
leer altura 

area <— 

<— raizcuad ((base/2)*(base/2)+altura*altura) 

perímetro <— 

"El área del triángulo es: "area 

imprimir "y el perímetro es:", 

fin 

Identifica las variables de: 

Entrada 

Salida 

Ejercicio 3. ¿Qué realiza el siguiente pseudocódigo? 

principal () 
inicio 

real x, y, z 

imprimir"Escriba dos números" 
leer x, y 

z< — x*x + 2*x*y + y*y 
imprimir"EI Resultado es, "z 
fin 

Explicación: 

Identifique las variables de: 

Entrada 

Salida 



Capítulo 3 Programación estructurada 



Ejercicio 4. ¿Qué realiza el siguiente pseudocódigo? 

principal () 
inicio 

real x, y, z, r 

imprimir"Escriba tres números" 
leerx, y, z 

r<— (x + y + z)/3 
¡mprimir"EI resultado es", r 
fin 

Explicación: 



Identifique las variables de: 

Entrada 

Salida 

Ejercicio 5. Utilizando los algoritmos 3 y 4 realice las siguientes pruebas de escritorio. ¿Qué valor final 
almacena la variable z y la variable r? 



Para el ejercicio 3 



Para el ejercicio 4 



x 



= 5 y = 3 z = 



x = 8 y = 1 2 z = 7 r = 



Ejercicio 6. Complete el siguiente pseudocódigo y diagrama de flujo para convertir centímetros a metros. 



principal () 



inicio 




real cm, m 

¡mprimir"Dame los centímetros" 




m <— cm/100 



imprimir"La conversión en metros es:" 



m <- cm/100 



Ejercicios complementarios de la estructura de control secuencial en pseudocódigo y diagrama de flujo 45 



Ejercicio 7. Complete el siguiente pseudocódigo y diagrama de flujo para convertir pesos a dólares y 
euros, utilizando dos constantes, euro = 1 8.6 y dólares = 1 2.9. 

constante ce <— 18.6 
constante cd<— 12.9 
principal () 
inicio 

real pesos, total_eur, total _dol 
imprimir"Cuántos pesos quieres cambiar" 
leer pesos 



imprimir"EI total de euros es:", total_eur 
imprimir"EI total de dólares es:" total_dol 



fin 



(ZD 



totaLeur, 

total_dol 




Ejercicio 8. Complete el siguiente pseudocódigo y diagrama de flujo para encontrar el área y perímetro 
de un triángulo equilátero. 



principal () 
inicio 

real base, alt, area, peri 
imprimir"dame la base y la altura" 



area <— base* alt/ 2 



¡mprimir"EI área del triángulo es:" 

¡mprim¡r"EI perímetro del triángulo es:" 




fin 



Capítulo 3 Programación estructurada 



Ejercicio 9. Complete el siguiente pseudocódigo y diagrama de flujo para imprimir sus datos personales: 
nombre, domicilio y edad. 



principal () 
inicio 

carácter [30], tel 

edad 

imprimir"dame tu nombre " 
leer nombre 

imprimir"dame tu teléfono" 




leer edad 

¡mprimir"nombre = ", nombre 
imprimir"teléfono = "tel 
¡mprimir"edad = ", 




Ejercicios complementarios de la estructura de control secuencial en 

- — - lenguaje C 



Parte I. Completar los espacios faltantes en los siguientes programas 

Ejercicio 1. Calcule la suma, la resta, la multiplicación y la división de dos números reales. 

#include <conio.h> 

#include <stdio.h> 
main ( ) 

{ 



printf("Dame el primer número "); 

scanf ( " " , &nl) ; 

printf("Dame el segundo número "); 

scanf ( "%f " , ) ; 

printf ("La suma = %f\n",nl + n2); 



Ejercicios complementarios de la estructura de control secuencial en lenguaje C 47 



printf ("La resta = %f\n" , ); 

printf ("La multiplicación = %f\n",nl * n2 ) ; 
printf ("La división = %f\n'',nl / n2); 



} 



Si ya completó las líneas faltantes, cuál será la salida si: 

Dame el primer número 4. 

Dame el segundo número 2. 



Ejercicio 2. Leer una cantidad de pesos (número entero) y calcular a cuántos billetes de 1 000, 500, 200, 
100, 50, 20 y monedas de 10, 5, 1 peso equivale. 



#include <stdio.h> 

#include <conio.h> 
main ( ) 

{ 

int Pesos; 

printf ("Introduce los pesos: "); scanf ( "%d" , & 

printf ("%d billete(s) de 1000\n", Pesos / 1000); 
Pesos = Pesos % 1000; 

printf ("%d billete (s) de 500\n", Pesos / 500); 
Pesos = 

printf ("%d billete (s) de 200\n", Pesos / 200); 
Pesos = Pesos % 200; 

printf ("%d billete (s) de 100\n", Pesos / 100); 
Pesos = Pesos % 100; 

printf ("%d billete (s) de 50\n", Pesos / 50); 

Pesos = Pesos % 50; 

printf ("%d billete(s) de 20\n", ); 

Pesos = Pesos % 20; 

printf ("%d moneda(s) de 10\n", Pesos / 10); 

Pesos = Pesos % 10; 

printf (" ", Pesos / 5) ; 

Pesos = Pesos % 5; 

printf ("%d moneda(s) de 1", Pesos / 1) ; 

Pesos = Pesos % 1; getch ( ) ; return 0; 



Si ya completó las líneas faltantes, cuál será la salida si: 

Introduce los pesos: 1245. 



48 Capítulo 3 Programación estructurada 



Ejercicio 3. Realice tres conversiones de unidades de longitud del sistema inglés al decimal. 

#include <conio.h> 

#include <stdio.h> 
main ( ) 

{ 

float in,c,y,m,ft, ; 

printf("Dame las pulgadas = ") ; 

c = 2.54 * in; 

printf("%f pulgadas = %f centímetros\n" , in, c) ; 
printf("Dame las yardas = "); scanf ( "%f " , &y) ; 
m = 0.9144 * y; 

printff" yardas = %f metros\n",y, 

printf("Dame los pies = ") ; scanf ( "%f" , &ft) ; 
cm = 30.48 * ft; 

printf("%f pies = centímetros", 

getch ( ) ; return 0 ; 

} 

Parte II. Elaborar la codificación en Lenguaje C de los siguientes programas (realizando el cálculo e 
impresión respectiva): 

1. La ecuación del movimiento uniformemente acelerado para mostrar el efecto del desplazamiento 
inicial es la siguiente: s = s o + vt + Vi at 2 

Donde s = desplazamiento en el tiempo (m) s o = desplazamiento inicial (m) 

v o = velocidad inicial (m/s) a = aceleración (m/s 2 ) 

t = tiempo (s) 

2. Leer un sistema de ecuaciones lineales, e imprimir su solución sabiendo que: 

ax + by = c x _ ce-bf _ af-cd 

dx + ey =f ae-bd ae-bd 

3. El volumen de la Tierra considerando que es un esferoide: V = 4/3 = 7 ra 2 b 
Donde: a = Radio ecuatorial = 6378.137 km, b = Radio polar = 6356.752 km 

4. Áreas y volúmenes de las siguientes figuras: 



Donde: Área = A, Volumen 


= V, Radio = r, Altura 


= h, Lado = /, Diámetro = D 


Cubo 


A = 6I 2 


V=l 3 


Paralelepípedo recto rectangular 


A = 2IJ 2 +2 IJ 3 + 2 / 2 ' 3 


V= 'A' 3 


Cilindro recto circular 


A = 2 77f 2 +2 tt rh 


V = 7 Tr 2 h 


Cono recto circular 


A = irr 2 + Trr! 


V = Yí m 2 h 


Tronco de cono 




1/=% ti - h(R 2 +r 2 +Rr) 


Barril 




t/=‘/i 2 nh(2D 2 +d 2 ) 


Cilindro hueco 




V= % Trh[D 2 -d 2 ) 



) ; 



, cm) ; 



3.5 Estructura de control selectiva o alternativa 49 



5. Conversión de grados a radianes y viceversa. 

6. Conversión de temperatura expresada en grados Celsius a Fahrenheit: f = (9 /5)c + 32 y viceversa. 

7. Tres funciones matemáticas (vea el capítulo de programación modular). 

8. Tres conversiones de tiempo. 

Convertir horas a días. 

9. Número de segundos que hay en días (d), horas (h), minutos (m) y segundos (s). 

10. Leer un número real e imprimirlo varias veces con distintas precisiones. 

4.0127: 

4 

4.0 

4.01 

4.013 

4.0127 



Ejemplos 



Ejemplos 

© 



11. Multiplicación de dos números reales con tres cifras decimales. Imprimir el resultado en el siguiente 
formato: 

0023.72* 

0145.14 = 



3443.08 

12. Calificación final de un alumno en el curso de Introducción a la programación. Dicha evaluación tiene 
los siguientes porcentajes: 

40%, 2 exámenes departamentales 

30%, 2 exámenes parciales 

20%, tareas, trabajos y participación en clase 

10%, proyecto 

13. El área de un triángulo dadas las coordenadas de tres puntos (xl,yl), (x2,y2) y (x3,y3). 

14. Leer el peso en gramos (máximo 5000) y determinar el menor número de pesas que hay que poner 
en una balanza (con pesos: 1 g, 2 g, 5 g, 10 g, 50 g, 100 g, 200 g, 500 g, 1000 g) para equilibrar un de- 
terminado peso en gramos, introducida por teclado. 

15. Leer el lado de un triángulo equilátero. Calcular el perímetro, la altura, y el área de dicho triángulo. 



3.5 Estructura de control selectiva o alternativa 



Es una estructura con una sola entrada y una sola salida en la cual se realiza una acción (una o varias ins- 
trucciones) de entre varias, según una condición; o se realiza una acción según el cumplimiento o no de una 
determinada condición. La condición puede ser simple o compuesta. 

Los programas, para un mejor funcionamiento y para poder realizar un número mayor de tareas, deben 
permitir emplear acciones alternativas a fin de poder elegir una de ellas cuando la situación lo requiera. Por lo 
tanto, la ejecución de una línea o grupos de líneas del programa depende de si cumplen o no una condición. 



Toma de decisiones 



La instrucción si (if) nos permite tomar decisiones, podemos hacer una pregunta y la contestación sólo pue- 
de ser verdadera o falsa, es decir, sí o no. 



50 Capítulo 3 Programación estructurada 



Ejemplos 



Si llueve, llevar el paraguas. 



La expresión condicional 



La condición es una expresión booleana. Si el resultado de la expresión: 

♦ es cero, se considera una condición falsa. 

♦ no es cero, se considera una condición cierta. 



Ejemplos 



x = 9; if (x) //La condición es verdadera. 

if (5>7) //La condición es falsa, comparamos dos valores. 



El último ejemplo es el más utilizado durante este curso. 

Existen tres tipos de estructuras de control selectivas; éstas se basan en una condición o en una opción: 
a) Simple if. b ) Doble if-else. c) Múltiple switch-break. 

Bloque de sentencias o instrucción compuesta 

Se denomina bloque de sentencias a un conjunto de instrucciones delimitadas, por ejemplo en lenguaje C, 
C+ +, Java se utilizan llaves que abren y cierran { }. 

En lenguajes como Pascal, Modula, Delphi, Ada, se utiliza Begin y End. 

Estas instrucciones se toman como una sola sentencia en las estructuras de control. 



Ejemplos 



Pseudocódigo 




Lenguaje C 




inicio 




{ 






¡nst 1 


inst 


1 




¡nst 2 


inst 


2 




¡nst 3 


inst 


3 


fin 


inst n 


inst 

} 


n 



3.5.1 Estructura de control selectiva simple si (if) 

Estructura de control que dirige a la computadora para ejecutar una o más instrucciones solamente si la 
condición es verdadera. Si la condición es falsa no realiza ninguna acción. 

El término condición lo utilizaremos a lo largo de este libro para referirnos a una o más condiciones. 
Existen dos formas de representarlo, dependiendo del número de instrucciones que se desean realizar 
si la condición se cumple: 

1. Si se requiere ejecutar una sola instrucción, cuando se cumpla la condición se representa de la siguiente 
forma: 





3.5 Estructura de control selectiva o alternativa 



51 



Si la condición se cumple se realiza la instrucción 1. 

Una posibilidad en el código sería: if( i) 

printf(‘‘%d”, i/2); 

2. Si se requiere ejecutar un bloque de instrucciones, cuando se cumpla la condición se representa de la 
siguiente forma: 



Diagrama de flujo Pseudocódigo Lenguaje C 




sí (condición) 


if (condición) 


inicio 


{ 


inst 1 


inst 1 


inst2 


inst 2 


inst 3 


inst 3 


fin 


} 



Nota: Si existe más de una instrucción para realizar, es necesario utilizar inicio y fin para agrupar las instrucciones, 
es su alcance sintáctico, si no se usa el inicio y fin sólo se ejecuta la primera instrucción, mientras que las siguientes 
instrucciones se realizarán siempre. En la tabla 3.2 vemos unos ejemplos de las distintas formas que puede adoptar la 
"expresión" dentro de un if. 



Tabla 3.2 Formas de utilizar la Instrucción if 
Ejemplos Observaciones 

if (x > y) Las dos expresiones son válidas y equivalentes. Es más frecuente la primera; una condi- 

if((x > y) ! = 0 ) ción es verdadera si es diferente de cero. 



if (x) Las dos expresiones son correctas e iguales. Es más usual la segunda expresión en este 

if (x ! = 0) curso. 



if (!x) Las dos expresiones son permitidas y semejantes. Es más común la segunda expresión; 

if (x = = 0 ) una condición es falsa si es igual a cero. 



if ( x = y ) 



La expresión es incorrecta; recuerde que el operador relacional en lenguaje C es "= =", 
por lo que debe ser if (x = = y). Un solo igual es asignación. 



3.5.2 Estructura de control selectiva doble si/si-no (if/else) 

Estructura de control que dirige a la computadora para ejecutar una acción si la condición es verdadera, y 
otra acción en caso de que sea falsa. Cabe mencionar que las instrucciones deberán ser diferentes en cada 
caso, ya que si fueran iguales no se requeriría una estructura selectiva, con la estructura secuencial se resol- 
vería el problema. 

Existen dos formas de representarlo, dependiendo del número de instrucciones que se desean realizar si 
la condición se cumple o no: 





52 



Capítulo 3 Programación estructurada 



Diagrama de flujo 




Pseudocódigo 



s/ (condición) 
inst 1 

sino 

inst 2 



Lenguaje C 



if (condición) 
inst 1 

else 

inst 2 



Si la condición se cumple se realiza la instrucción 1, pero si la condición no se cumple se realiza la instruc- 
ción 2. 



Diagrama de flujo Pseudocódigo Lenguaje C 




Si la condición se cumple se realizan las instrucciones 1 y 2, pero si no se cumple se realizarán las instruc- 
ciones 3 y 4. 



3.5.3 Anidamiento o escalonamiento si-si no-si (if-else-if) 

El concepto de anidamiento es muy utilizado en la programación y consiste en insertar (anidar) una estruc- 
tura dentro de otra. 

La expresión "si anidados” se refiere a que podemos utilizar una sentencia si (if) dentro de otra sentencia 
si (if). Esto se emplea cuando se tienen que cumplir varias condiciones para poder ejecutar una acción. 

Uno de los aspectos más confusos de las sentencias si (if) en el lenguaje de programación es el si (if) 
anidado. Un si (if) anidado es una sentencia si (if) que es el objeto de otro si (if) o si no (else). La razón por la 
que los si (if) anidados son tan problemáticos es que resulta confuso saber qué else se asocia con qué si (if). 







3.5 Estructura de control selectiva o alternativa 



Sintaxis: 




La computadora evalúa la expresión condicional de arriba abajo. Tan pronto como la computadora encuen- 
tra una condición verdadera, ejecuta la instrucción(es) y salta el resto de la escalera. Si no es verdad ninguna 
condición, la computadora ejecutará el else final. Éste actúa frecuentemente como condición por defecto; es 
decir si fallan todas las pruebas anteriores, la computadora realiza la última instrucción(es) else. Si no hay else 
final y son falsas las condiciones, no se hace nada. 



3.5.4 Ejercicios resueltos de la estructura de control selectiva 
simple si (if) y doble si/si-no (if/else) 

Ejercicio 1 . Según una calificación, imprimir si ésta es aprobada. 



Diagrama de flujo 




Pseudocódigo 


Lenguaje C 




#include <stdio.h> 




#include <conio.h> 


principal () 


raain ( ) 


¡nido 


{ 


real cal 


float cal; 


imprimir "Dame la calificación:" 


printf("Dame la calificación: 


leer cal 


scanf ( "%f " , &cal) ; 


si (cal >= 60) 


if (cal >= 60) 


imprlmlr"Aprobada" 


printf ("Aprobada"); 




getch ( ) ; 




return 0 ; 


fin 


} 



En el ejercicio 1 se utiliza la estructura selectiva simple. La condición de este ejemplo y la mayoría que ve- 
remos en el presente curso consisten en comparar dos valores (la variable cal y 60), y si dicha condición es 




54 Capítulo 3 Programación estructurada 



verdadera se realiza una determinada acción. Se revisa la calificación (cal), si es mayor o igual que 60, se 
imprime aprobada, de lo contrario no imprime nada el programa, es decir sólo pasa por parte del programa 
dependiendo de una condición. Ejemplo: si cal = 85 el programa imprime “Aprobada”, pero si cal = 59, el 
programa no imprime nada. 

Ejercicio 2. Según una calificación, imprimir si es aprobada o reprobada. 




Ejemplos 



A diferencia del ejercicio 1, el ejercicio 2 utiliza la selectiva doble, ya que revisa la condición; si ésta se cum- 
ple (es verdadera) imprimirá “Aprobada”, pero, si la condición no se cumple imprimirá “Reprobada”, es decir 
el programa pasa por una u otra instrucción pero no por ambas. Ejemplo: si cal = 85 el programa imprime 
“Aprobada”, pero si cal = 59, el programa imprime “Reprobada”. La alternativa doble es más rápida; en este 
ejemplo sólo evalúa una condición, a diferencia de la simple, que evaluaría dos. 

Para calcular un promedio primero se deberán sumar las n calificaciones y luego dividir el resultado 
entre n; en este caso específico son tres calificaciones, así que primero se le piden al usuario cali, cal2, cal3. 
Se suman las calificaciones y el resultado se divide entre tres, guardando el resultado en la variable promedio, 
tomando en cuenta la necesidad de los O en la expresión para indicarle al compilador que primero se hace 
la suma y luego la división. Luego se revisa la condición; si promedió > 95 se modificará el valor de prome- 
dio asignándole el valor de 100, pero si la calificación fuera menor o igual al 95 el valor de la variable pro- 
medio no se modifica, es decir queda almacenado el mismo resultado. La última instrucción muestra el 
resultado del promedio. 

cali = 80, cal2 = 90, cal3 = 100. El programa Imprimirá El promedio es: 90,0 pero si cali = 98, cal2 = 90, 
cal3 = 100 el programa imprimirá El promedio es: 100 ya que el promedio de las tres calificaciones 
anteriores es de 96.0 y al ser mayor que 95 modifica el valor del promedio a 100 y es el valor que se 
muestra. 



Nota: La última instrucción ( imprimir ) se realiza se cumpla o no la condición, ya que se encuentra fuera de la estructura 
de control. 




3.5 Estructura de control selectiva o alternativa 



Ejercicio 3. Calcule el promedio de un alumno que cursó tres materias el semestre anterior. Si su prome- 
dio es mayor que 95 se le va a asignar una calificación de 1 00. Imprimir cuál fue la calificación promedio 
del alumno 



Diagrama de flujo 



cal1,cal2,cal3 






Pseudocódigo 

principal () 
inicio 

entero cali, cal2, cal3 
real promedio 

imprimir "Digite las calificaciones:" 
leer cal1,cal2,cal3 

promedio <— (cali + cal2 + cal3)/3 
si (promedio > 95) 
promedio <— 100 

imprimir"EI promedio es:", promedio 
fin 



Lenguaje C 



#include <stdio.h> 
#include <conio.h> 
main ( ) 

{ 



Una posible salida en pantalla, después de 
ejecutar el programa sería: 

Digite las calificaciones del alumno: 

95 96 95 

El promedio del alumno es: 1 00.00 



int cali , cal2 , cal3 ; float promedio; 

printf ( "Digite las calificaciones del alumno ; \n" ) ; 

scanf("%d %d %d" , &call , &cal2 , &cal3 ) ; 

promedio = ( cali + cal2 + cal3 ) /3 . ; //El 3. es necesario por la conversión de tipos 
if ( promedio > 95 ) 
promedio = 100; 

printf("El promedio del alumno es: %. 2f" , promedio) ; 

getch(); return 0; 







56 



Capítulo 3 Programación estructurada 



Ejemplos 

@ 



A diferencia de los programas anteriores, leemos las tres calificaciones en una sola función scanf (cali para 
la primera calificación, cal2 para la segunda calificación, y cal3 para la tercera calificación). Cuando el com- 
pilador llega a la línea del scanf debemos dar las tres calificaciones separadas con un espacio (ya que si las 
pegamos el compilador tomaría un solo número), o dar cada calificación y oprimir la tecla Enter. Como ob- 
servamos, la sintaxis de la función scanf se sigue conservando. El formato %d para cada variable y el & antes 
de cada variable a leer. 

Ejercicio 4. Imprimir si un número es par o impar. 



Pseudocódigo 



principal () 
inicio 

entero num 

imprimir"lntroducir un número": 
leer num 

si (num mod 2 = 0) 

imprimir num "es par” 

si no 

imprimir num "es impar" 



fin 



Lenguaje C 

#include <stdio.h> 

#include <conio.h> 
main ( ) 

{ 

int num; 

printf ( "Introducir un número : \n" ) ; 

scanf ( "%d" , &num) ; 

if ( num % 2 == 0 ) 

printf ("%d es par. ", num) ; 

else 

printf ("%d es impar num) ; 
getch ( ) ; 
return 0 ; 

} 



Este ejercicio incorpora un nuevo concepto, mod, que sirve para ver si un número es múltiplo de otro; en este 
caso si la expresión num mod 2 es igual a cero, imprimirá “el número es par”, pero si el mod es uno imprimirá 
“el número es impar”. No es necesario especificar las dos condiciones, ya que si no es par por consiguiente 
es impar. En este caso la estructura de control selectiva doble es la adecuada, ya que sólo existen dos opciones 
posibles (par o impar). 

Si num = 8 se imprimirá en pantalla 8 es par, pero si num = 5 se imprimirá en pantalla 5 es impar. 

Ejercicio 5. Calcule el monto del pago de una persona al inscribirse en la alberca olímpica, dependiendo 
de si es alumno de la Universidad o no. Si es alumno se le hará un 50% de descuento tanto en la inscrip- 
ción como en la mensualidad. Las cuotas sin descuento son: inscripción: 100, mensualidad: 150. 





3.5 Estructura de control selectiva o alternativa 57 



Otra de las aplicaciones de las estructuras selectivas son los menús, aunque en este ejercicio sólo existen dos 
opciones. Se puede seleccionar si es o no alumno de la Universidad; en el caso de que sea alumno se elegirá 
la opción 1 y este valor se guardará en la variable tipo o 2 si no lo es. Con base en lo que tenga la variable tipo 
se hacen los cálculos con o sin descuento, es decir entra a la parte verdadera (tipo = 1) y le haría el 50% de 
descuento a la inscripción y 50% a la mensualidad, pero si eligió la opción dos en el momento de revisar la 
condición y no cumplirse entra a la parte del si no y pagará por consiguiente el total de la inscripción y de 
la mensualidad. 



Si elige la opción 1 se Imprimirá El pago del alumno debe ser de 125, pero si elige la opción 2 u otra se 
imprimirá El pago si no es alumno debe ser de 250. 



Ejemplos 




Ejercicio 6. Dados los tres lados de un triángulo, imprimir si éstos pertenecen al mismo triángulo. 



Pseudocódigo 



principal () 
inicio 

entero a, b, c 

imprimir"lntroduzca los tres lados del triángulo:" 
leerá, b,c 

si (a + b >c)y(a + c>b)y(b+c >a) 
imprimir"Si pertenecen al mismo triángulo" 
si no 

¡mprimir"No pertenecen al mismo triángulo" 



Lenguaje C 

#include <stdio.h> 

#include <conio.h> 
main ( ) 

{ 

int a , b , c ; 

printf ( "Introduzca los tres lados del 
triángulo : " ) ; 

scanf ( "%d%d%d" , &a, &b, &c) ; 
if (a+b > c && a + c >b && b + c >a) 

printf ("Si pertenecen al mismo triángulo"); 

else 

printf ("No pertenecen al mismo triángulo" ); 



fin 



} 



getch ( ) ; 
return 0 ; 



58 Capítulo 3 Programación estructurada 



Antes de querer hacer el algoritmo hay que tratar de entender el problema. Sabemos que en un triángulo 
siempre la suma de dos de sus lados debe ser mayor al tercer lado. Así que en una sola instrucción se revisan 
tres condiciones simples y en este ejercicio se incorpora el operador lógico (y), que nos sirve para revisar más 
de una condición al mismo tiempo. Se piden los dos lados del triángulo y se revisan las condiciones (a+b >c) 
y (a+c > b) y (b+c > a), si las tres condiciones se cumplen se imprimirá “Sí pertenecen al mismo triángulo’’, 
pero si se cumplen dos, una o ninguna, se imprimirá “No pertenecen al mismo triángulo”. 

Ejemplos 



a = 3, b = 5 y c = 4, sustituyendo en las condiciones (3 + 5 > 4) verdadero, (3 + 4 > 5) verdadero 
y (5 + 4 > 3) verdadero; en este caso imprimirá Sí pertenecen al mismo triángulo; en otro caso si 
a = 2, b = 4 y c = 9 sustituyendo en las condiciones (2 + 4 > 9) falso, (2+9 >4) verdadero y 
(4 + 9 > 2) verdadero; en este caso imprimirá No pertenecen al mismo triángulo, ya que una de las 
condiciones resultó falsa. Cabe mencionar que en el orden de prioridad de las condiciones primero 
se efectúan los operadores aritméticos (+, — , *, /), luego los relaciónales (>, <, =, O, >=, < = ) y 
por último los lógicos (y, o, not). 



Ejercicio 7. Imprimir si un estudiante es admitido en la universidad o no con base en los promedios que 
tenga de la preparatoria y del examen de admisión. El promedio mínimo es de 85. 



Pseudocódigo 



principal () 
inicio 

real cal_p, cal_e, promedio 
impr¡m¡r"Promedio de la Preparatoria?:" 
leer cal_p 

imprimir"Calificación del Examen de admisión?:" 
leer cal_e 

promedio*— (cal_p + cal_e)/2 
imprimir"EI promedio es:", promedio 
imprimir"Por lo tanto:" 
si (promedio>=85) 

imprimir" El estudiante es admitido." 
si no 

¡mprimir"EI estudiante no es admitido" 



Lenguaje C 

ffinclude <stdio.h> 
#include <conio.h> 
main ( ) 

{ 



float cal_p, cal_e, promedio; 

printf ("Promedio de la Preparatoria?:"); 

scanf ( "%f" , &cal_p) ; 

printf ("Calificación del Examen de admisión?:"); 

scanf ( "%f" , &cal_e) ; 

promedio = (cal_p + cal_e)/2; 

printf ("El promedio es: %f ", promedio) ; 

printf ("Por lo tanto:"); 

if (promedio > = 85) 

printf ("El estudiante es admitido."); 
else 

printf ("El estudiante no es admitido"); 
getch ( ) ; 
return 0 ; 



fin 



} 



En el ejercicio 7 se trabaja con la estructura secuencial (ocho primeras instrucciones) y las siguientes corres- 
ponden a la estructura selectiva. En este caso se solicitan las dos calificaciones cal_p, cal_e se suman y se 
dividen entre dos, calculando así el promedio y luego se revisa la condición si promedio>=85 entonces serán 
admitidos en la universidad. 

si cal_e = 90y cal_p = 93 se imprimirá "El estudiante es admitido". 



Ejemplos 



3.5 Estructura de control selectiva o alternativa 59 



Ejercicio 8. Oprimir una tecla e imprimir qué tipo de tecla es (letra mayúscula, letra minúscula, dígito o 
carácter especial). 




En el ejercicio 8 se utilizan tres estructuras selectivas dobles anidadas para representar las cuatro opciones 
posibles. El código ASCII de los dígitos está entre 48 y 57 (el cero ‘0’= 48, ‘1’ = 49, ‘9’ = 57), las letras ma- 
yúsculas están entre el 65 y el 90 (A = 65, B = 66, Z = 90), las letras minúsculas entre el 97 y el 122 (a = 97, 
b = 98 y z = 122) y los caracteres especiales están entre varios rangos: del 0 al 47, 58 al 64, 91 al 96, el últi- 
mo rango del 123 al 255. La primera condición revisa si la variable dato es un dígito; si es, imprime Es un 
dígito; si no es entonces revisa si es una letra mayúscula; si es imprime Es una letra mayúscula-, si no es ma- 
yúscula, entonces revisa si es minúscula; si es, imprime Es una letra minúscula, y por consiguiente si no fue 
dígito, mayúscula o minúscula entonces imprime Es un carácter especial. 



Si dato = ñ, el programa revisa la primera condición y si no se cumple revisa la segunda condición, y si no se 
cumple revisa la tercera y si tampoco se cumple, entonces imprime Es un carácter especial, ya que es la última 
posibilidad. 



Ejemplos 

@ 



Nota 1: El ejercicio anterior no se pudo resolver con la estructura selectiva múltiple ya que los posibles datos son rangos 
de valores y la selectiva múltiple únicamente acepta un solo valor. 

Nota 2: El concepto de anidadas se refiera a que una estructura se encuentra dentro de otra del mismo tipo; considerando 
la primera estructura selectiva doble el si(dato>= 48ydato<= 57), la segunda si (dato >= 65 y dato <= 90) y la tercera 
si (dato >= 97 y dato <= 122). El anldamiento o la anidación se utiliza en varios casos, más adelante veremos los ciclos 
anidados, los cuales son la base de los arreglos bidimensionales o matrices. 



60 Capítulo 3 Programación estructurada 



Ejercicio 9. Resuelva la ecuación cuadrática. 



Pseudocódigo 



principal () 
inicio 

real a, b, c, xl, x2, d 

imprimir"Dame los valores de a, b, y c" 
leerá, b, c 
si (a< >0) 
inicio 

d<-b*b-4*a*c 
si (d > 0) 
inicio 

xl <— ( - b + raizcuad (d)) / (2 * a) 
x2 <— ( — b — raizcuad (d)) / (2 * a) 
imprimidas raíces son:", xl, x2 
fin 
si no 

si (d = 0 ) 
inicio 

xl < — — b / ( 2 * a) 
imprimir"Raíces repetidas =",x1 
fin 
si no 

inicio 

xl <- - b/(2*a) 
x2 <— raizcuad(fabs(d))/(2*a) 
imprimir"Raíces complejas", x1,"+— ", x2 
fin 
fin 

si no imprimir "No es ecuación cuadrática" 



Fin 



Lenguaje C 

#include <stdio.h> 

#include <conio.h> 

#include <math.h> 
main ( ) 

{ 

float a, b, c, xl , x2 , d; 

printf ("Dame los valores de a, b y c : ") ; 
scanf ( "%f %f %f " , &a, &b, &c) ; 
if ( a != 0 ) 

{ 

d = b*b — 4*a*c; 
if ( d > 0 ) 

{ 

xl = ( — b + sqrt ( d ) ) / ( 2 * a ) ; 
x2 = ( — b — sqrt ( d ) ) / ( 2 * a ) ; 
printf ("Las Raíces son : %f , %f ", xl,x2) ; 

} 

else 

if ( d == 0 ) 

{ 

xl = — b/ (2 * a) ; 

printf ("Raíces repetidas = %f ", xl) ; 

} 

else 

{ 

xl = — b/ (2 * a) ; 

x2 =sqrt(fabs( d ))/ ( 2 * a ); 

printf ( "Raíces complejas : %f +— %f " , xl , x2 ) 

} 

} 

else printf ("No es ecuación cuadrática "); 
getch ( ) ; 
return 0 ; 

} 



ax 2 + bx+ c 


(a, b, c) 


- b ±yjb 2 — 4 






2 a 


x 2 + 5x+ 2 = 0 


(1,5,2) 


(— 5±Vl 7)/2 


x 2 + 2x+ 1 = 0 


(1,2,1) 


-1, -1 


x 2 - 2x + 2 = 0 


(1,-2, 2) 


1 ± i 



I 



11 d > 0 Raíces reales diferentes 
-o 

a <>0^< 

F d = 0 Raíces reales iguales 




Raíces complejas 
No es ecuación cuadrática 



3.5 Estructura de control selectiva o alternativa 61 



El algoritmo será el siguiente: 

1. Declaramos las variables a, b, c, xl, x2, d como reales. 

2. Introducimos los valores de a, b y c. 

3. Si a es diferente de cero significa que la ecuación es cuadrática y que la podemos resolver como tal. Como 

tendrá más de una instrucción, necesitamos inicio ( { ) y fin ( } ): 

a) Calculamos la discriminante d = b*b — 4*a.*c. 

b) Si d > 0 entonces las raíces son reales diferentes; calculamos - b ±\lb 2 -4ac no podemos calcular ± 

2 a 

simultáneamente por lo tanto xl calculará con + yx2 con— , posteriormente imprimimos el resultado 
de ambas variables. Como esta condición tendrá más de una instrucción, utilizamos inicio y fin. 

c ) Si no se cumple la condición anterior, d = 0 entonces las raíces son reales iguales o repetidas y bastará 
calcular xl = —b /( T'a ); posteriormente imprimimos el resultado de xl. Como esta condición tendrá 
más de una instrucción, utilizamos inicio y fin. 

d) Si no se cumple que d > 0 ni tampoco que d = 0, entonces d < 0 y las raíces son complejas. La 
parte real será xl = —b/(2*a) y la imaginaria será x2= sqrt(abs(<V)) /(2*a), imprimimos la parte real 
(xl) ± la parte imaginaria (x2) multiplicada por i. Recuerde que las raíces complejas se dan en pares 
conjugados. Como este último camino tendrá más de una instrucción, utilizamos inicio y fin. Si a no 
es diferente de cero (si es igual a cero) no es ecuación cuadrática. 

En este programa encontramos un if(d > 0) dentro de otro if(a != 0) cuando una estructura selectiva 
está dentro de otra le llamamos if anidado. 

Si resolvemos los últimos tres ejemplos tendremos: 



Ejem. a b c a>0 

1 1 5 2 V 

2 1 2 1 V 

3 1 -2 2 V 



d=b*b-4a*c d 

5*5— 4*1*2 >0 

=25-8=17 

(2*2) -4*1*1 =0 =0 

(—2*— 2) —4*1*2 = — 4 <0 



xl 

(-5 + Vi 7)/2= -2.5+2.061 55 
= -0.4384471 

x1 = -b/(2*a) = — 2/(2*1 ) 

— b/(2*a) = — 2/(2*1 ) = 1 



x2 

(—5— Vi 7)/2 =-2.5- 
2.06155 =-4.561553 

xl = — b/(2*a) = — 2/(2*1) 
sqrt(abs(-4))/(2*1 ) = 1 i 



En el ejercicio 10 se declaran tres variables h, m, s, todas de tipo entero; primero se solicita el número de 
segundos, luego se revisa con la condición si (s<0); si la condición es verdadera imprime “error de datos” 
y termina el programa ya que no existen horas, minutos y segundos; si es falsa entonces revisa otra condición 
si( s >3600) ya que una hora tiene 3,600 segundos; si es verdadera realiza una división entre el total de segun- 
dos y 3,600 h=s 13600 el resultado lo almacena en h y lo imprime, luego realiza una resta del total de 
segundos que capturó menos 3,600 por las horas h que fueron impresas s=s~3600*h, almacenándose en 
s solamente los segundos que quedaron fuera de las horas; posteriormente se realiza lo mismo para iden- 
tificar a cuántos minutos equivalen según los restantes con la condición si (s>60), ya que un minuto tiene 
60 segundos; si es verdadera se realiza una división entre el total de segundos y 60 m=s/60, el resultado 
se almacena en m y lo imprime, luego realiza la resta del total de segundos menos 60 por los minutos m 
que fueron impresos s=s — m*60, almacenándose en s solamente los segundos que quedaron fuera de los 
minutos. Por último se revisa la condición si ( s>0 ), imprime los segundos que no quedaron incluidos en 
las horas ni en los minutos. Por ejemplo, sis= 8,267, h= 8,267/3,600 h= 2. s = 8, 267— 7,200 s=1067, luego 
w = 1067 / 60 m= 17, s= 1067 — 1020 s= 47, se imprime 2, 17, 47. 



Ejemplos 

@ 



Capítulo 3 Programación estructurada 



Ejercicio 10 . Introducir los segundos e imprimir a cuántas horas, minutos y segundos equivale. 



Pseudocódigo 


Lenguaje C 




#include <stdio.h> 
#include <conio.h> 


principalO 


main ( ) 


inicio 


{ 


entero h,m,s 


int h,m,s; 


¡mprimir"dame el número de segundos" 


printf("dame el número de segundos") 


leer s 


scanf ( "%i" , &s) ; 


imprimir "Son:" 


printf ("Son: ") ; 


si ( s<0 ) imprimir"error de datos" 


if (s<0) printf ( "error de datos\a"); 


si no 


else 


inicio 


{ 


si ( s >3600) 


if (s>3600) 


inicio 


{ 


h<— s/3600; imprimir h,"" 


h=s/3600; printf ("%i, ",h); 


s<— s— 3600*h 


s=s— 3600*h; 


fin 


} 


si (s>60) 


if (s>60) 


inicio 


{ 


m<— s/60; imprimir m,"," 


m=s/60; printf ( " % i , ",m); 


s<— s— m*60 


s = s— m*60 ; 


fin 


} 


si (s>0) 


if (s>0) 


imprimir s 


printf ( "%i" , s) ; 


fin 


} getch ( ) ; return 0 ; 


fin 


} 


Ejercicio 1 1. Rea ¡ce a prueba de escritorio o 


corrida a mano de siguiente programa. 


Pseudocódigo 


Lenguaje C 




#include<conio . h> 
#include<stdio.h> 


principal () 


main ( ) 


inicio 


{ 


entero a<— 3,b<— 5,c<— 7 


int a=3,b=5,c=7; 


si (a + b mod 3*2>5— c/b mod a) 


if (a+b%3*2>5— c/b%a) 


inicio 


{ 


a<— 2+3*c; b<— a— c mod 4+10 


a = 2 + 3*C; b = a — C%4 + 10; 


c<— b+c; imprimir a, b,c 


c=b+c ; printf ( "%d%d%d\n" , a, b, c) 


fin 


} 


si no 


else 


inicio 


{ 


a<— 7— c mod 3; b<— a*b mod 4 


a=7— c%3; b=a*b%4; 


imprimir a,b,c 


printf ( "%d— %d— %d\n" , a, b, c) ; 


fin 


} 


si (aobyboc) 


if (a!=b&&b!=c) 


imprimir a*b*c 


printf ( "%d\n" , a*b*c) ; 


si no 


else 


imprimira+b+c 


printf ( "%d\n" , a+b+c) ; 




getch(); return 0; 


fin 


} 



Ejercicios complementarios de la estructura de control selectiva simple y doble en psudocódigo y diagrama de flujo 63 



En la tabla 3.3 vemos los resultados de la prueba de escritorio del programa anterior. 
Tabla 3.2 Corrida a mano o prueba de escritorio 



a 



b 



c 



a+b mod 3*2>5-c/b mod a aObybOc a*b*c a+b+c 



3 



5 



7 



3 + 5 mod 3*2>5— 7/5 mod 
3 = 3+2*2>5 — 1 mod 3 = 
7>5— 1 = V 



2+3*7 = 23 23-7 mod 4+10= 30+7=37 

23-3 + 10=30 



23O30 y 23*30*37 = 



30037 25530 

V y V 
V 



0=2 + 3*7 = 23, 

fc>=23 — 7 mod 4+10=23-3 + 10 = 30 
C=30+7=37 

El programa contiene dos si (if) dobles; en el primero la condición a+b mod 3*2>5—c/b mod a es verdadera, 
por lo tanto calcula el primer bloque marcado con inicio y fin e imprime los valores a=23, b=30 y c=37. 
Cuando termina con el primer si (if), continúa con el segundo, donde la condición a<>b y bOc es también 
verdadera, imprimiendo a*b*c=25530. 



Ejercicio 1 . Identifique qué realiza el siguiente pseudocódigo y explíquelo a continuación. Además com- 
plete el diagrama de flujo respectivo. 



Ejercicios complementarios de la estructura de control selectiva 





d 



CZI3 



si(c>ayc>b) imprimir c, "es el mayor' 
fin 

Respuesta: 



principal () 
inicio 



entero a, b, c 
imprimir"Dame 3 números" 
leer a, b, c 



si(a>bya>c) imprimir a, "es el mayor" 
si (b > a y b > c) imprimir b, "es el mayor 




Capítulo 3 Programación estructurada 



Ejercicio 2. Complete los espacios vacíos para el siguiente problema. Según la edad de una persona 
imprimir si es niño (0-1 2), adolescente (13-17) o adulto (mayor o igual a 1 8). 



principal () 
inicio 

entero e 

imprimir"Dame tu edad" 
leer 

si ( ) imprimir "eres un niño" 

si no 

si ( ) imprimir "eres un adolescente" 

si no imprimir "eres un adulto" 
fin 




Ejercicio 3. Complete los espacios vacíos para el siguiente problema. Según los tres lados de un triángulo, 
imprimir si es equilátero (tres lados ¡guales), isósceles (dos lados ¡guales) o escaleno (lados diferentes). 

principal () 
inicio 

real 11,12,13 

imprimir "¿Cuánto miden los tres lados?; " 
leer 11,12,13 

si ( y ) imprimir"EI triángulo es Equilátero, lados iguales." 

si no 

si ( o o ) 

imprimir"EI triángulo es Isósceles, 2 lados iguales." 
si no imprimir"EI triángulo es Escaleno, ningún lado igual." 
fin 

Ejercicio 4. Complete el siguiente pseudocódigo que calcula la paga de un trabajador según sean las 
horas trabajadas y el precio que se le pagan las horas con las siguientes condiciones: 

a) Si trabaja entre 30 y 40 horas se le paga la tarifa por hora normal. 

b) Si trabaja más de 40 horas cada hora extra se le pagará 20% más la tarifa por hora normal. 

c) Si trabaja menos de 30 horas se le descuenta 12% de su paga. 



Ejercicios complementarios de la estructura de control selectiva simple y doble en psudocódigo y diagrama de flujo 



65 



principal () 
inicio 

entero horas, horas_ext 

precio_hora, paga 

imprimir"lntroduce el número de horas trabajadas" 
leer 

imprimir" " < 

leer preciojtora 
si (horas > 40) 
inicio 

horas_ext <— 

paga <— < 

fin 
si no 

si 

paga <— horas * precio_hora 
si no 

<— horas * precio_hora * 0.88 

imprimir paga 
fin 

Ejercicio 5. Complete el siguiente pseudocódigo que utiliza la estructura selectiva doble anidada, para 
imprimir si la persona es niño, adolescente, adulto o anciano, según el rango de edades siguiente: 

a) 0 a 12 es niño. 

b ) 13 a 17 es adolescente. 

c) 18 a 80 es adulto. 

d) Mayor que 80 es anciano. 

principal () 
inicio 

entero edad 

imprimir "¿Cuál es la edad?" 

leer 

si (edad < = ) 

imprimir"Es niño" 
si no 

( edad <= 17 ) 

imprimiros adolescente" 

si no 

si 

imprimir"es adulto" 

si no 



fin 



Capítulo 3 Programación estructurada 



Ejercicios complementarios 
selectiva simple y doble en 



de la estructura de control 

lenguaje C 



Elaborar la codificación en Lenguaje C de los siguientes programas (realizando el cálculo e impresión 

respectiva): 

1. Leer una fecha (día, mes, año) y diga si es correcta o no. 

2. Leer un año e imprimir si es bisiesto o no. 

3. Un millonario tenía tres hijos: Juan, Luis y Rosa. Al morir dejó el siguiente legado: A Luis le dejó 4/3 de 
lo que le dejó a Juan. A Juan le dejó 1/3 de su fortuna. A Rosa le dejó la mitad de lo que le dejó a Luis. 
Además el licenciado les cobrará por sus servicios un porcentaje de lo que reciban cada uno de herencia: 
si el monto es menor a la tercera parte de la herencia cobrará 3%, en caso contrario 5%. Imprimir cuánto 
recibirán cada heredero y el abogado. 

4. El domingo de Pascua es el primer domingo después de la primera luna llena posterior al equinoccio de 
primavera y se determina mediante el siguiente cálculo: 

a = año % 19 b = año % 4 c = año % 7 d = (19 * a + 24) % 30 

e = (2*b+4*c + 6*d + 5)%7 n = (22 + d + e) 

Donde n indica el número del día del mes de marzo (si n es igual o menor que 31), en caso contrario el 
mes de abril se obtiene como (d+e— 9). Imprimir la fecha del domingo de Pascua a partir de un año dado. 

5. Leer un número entero (entre 0 y 32 700) e imprimir el número de cifras de dicho número. 

6. Leer la hora de un día (0 a 23 horas y minutos, por ejemplo para las 18:30 deberá leer 18 y 30), e imprimir 
la misma hora pero en formato de 12 horas mostrando las horas, los minutos y el indicador de meridiano. 
No es posible especificar PM cuando la hora es 0. Cuando se especifica AM también representa las horas 
antes del mediodía. Si se especifica PM representa las horas después del mediodía. Si se especifica AM, 
representa la medianoche. Si se especifica PM, representa el mediodía. 12:01 es 1 minuto después del 
mediodía, como 12:01 PM, mientras que 12:01 AM es 1 minuto después de medianoche. Especificar 
12:01 AM es lo mismo que 00:01 o 00:01 AM. Para las 18:30 deberá imprimir 6:30 PM. 

7. Leer un número entero e imprimir si es: a) Cero, positivo o negativo; b) Par o impar (cuando sea positi- 
vo); c ) Múltiplo de 7 o no múltiplo de 7 (cuando sea impar). Para el número 35, imprimirá: Es un número 
positivo, es impar y es múltiplo de 7. 

8. Leer 5 números e imprimir el menor y el mayor de ellos. 

9. Conversión de temperatura expresada en grados Celsius a Fahrenheit : f = (9/5)c+32 y viceversa 
(Fahrenheit a Celsius). Permita elegir entre estas dos opciones. 

10. Dados dos de los ángulos de un triángulo, calcular el tercer ángulo y determinar si el triángulo es rectángulo 
(un ángulo igual a 90 grados), acutángulo (sus tres ángulos menores a 90 grados) u obtusángulo (un 
ángulo mayor a 90 grados). 

11. Leer las horas trabajadas y la paga por hora para calcular el sueldo semanal de un empleado. Cuando 
las horas de trabajo exceden de 40 se consideran horas extra; las primeras 8 se pagan al doble; si las horas 
extra exceden de 8 se pagan las primeras 8 al doble de lo que se pagan las horas normales y el resto al triple. 

12. En un estacionamiento se cobra de la siguiente manera: los primeros 10 minutos son gratis, los siguientes 
15 minutos subsecuentes cuestan $3, la primera hora $10 y cada hora subsecuente $5. A partir de la 
primera hora se cobran horas completas. Si es domingo se hace un descuento de 10% sobre el monto 
total. Leer los minutos y horas e imprimir cuánto se pagará. 

13. Ordenar dos números con un solo if. 

14. Leer 4 números. Imprimir el mayor, el menor y la suma de ambos. 

15. Leer 3 números y ordenarlos de manera ascendente. 



Ejercicios complementarios de la estructura de control selectiva y doble en lenguaje C 67 



16. Existen cuatro cuadrantes dependiendo del signo de x y y. Lee las coordenadas x y y de un punto e 
imprime si está en los ejes de coordenadas, en el origen o bien en qué cuadrante se encuentra localizado. 

Y 



Segundo 


Primer 


cuadrante 


cuadrante 


(0, 0) 


Origen 


Tercer 


Cuarto 


cuadrante 


cuadrante 



17. Leer el número de días transcurridos del año e imprimir a qué mes pertenece. Por ejemplo si se captura 
32 se imprimirá el mes es febrero. 

18. Leer la fecha de nacimiento (día, mes y año) de una persona y la fecha actual (día, mes y año), para 
posteriormente imprimir la edad al día de hoy. Por ejemplo usted tiene 19 años 7 meses y 14 días. 

19. Resolver el ejercicio 8 resuelto con una versión diferente, por ejemplo los valores de la condición pueden 
ir entre apóstrofos. 

20. Leer el nombre de un determinado mes e imprimir cuántos días tiene dicho mes. Utilizar la función 
strcmp (vea el capítulo de programación modular). 

21. Calcular alguna de las cuatro operaciones básicas, con el nombre respectivo. Por ejemplo suma. Utilizar 
la función strcmp (vea el capítulo de programación modular). 



3.5.5 Estructura de control selectiva múltiple segun_sea (switch) 

Esta estructura selecciona entre varias posibilidades, dependiendo del valor de la expresión. Cuando en la 
estructura si (if) todas las condiciones utilizan la igualdad de una variable determinada con constantes pre- 
definidas, se puede utilizar la instrucción segun_sea (switch), en dicha instrucción existen más de dos op- 
ciones. La estructura segun_sea (switch) evalúa una expresión que puede tomar n valores distintos; según 
con cuál de estos valores coincida, se ejecutarán ciertas acciones, es decir, el programa o algoritmo seguirá 
un determinado camino entre los n posibles. Dicha expresión sólo acepta valores enteros o caracteres pa- 
ra entrar a la opción y el operador de relación es el igual. 



Diagrama de flujo Pseudocódigo 




fin 



Lenguaje C 

switch (expresión) 

{ 

case exp_const_l : instl; 

break; 

case exp_const_2 : inst2 
inst3 
break; 



case exp_const_n : inst n 
break; 

default: inst 10 

} 



Se compara la “expresión” (puede ser una sola variable) con cada una de las opciones "const” y en el mo- 
mento de encontrar una constante idéntica se ejecutan la(s) instrucción(es) correspondiente(s) a ese caso. Al 






68 



Capítulo 3 Programación estructurada 



terminar de realizar las instrucciones del caso, se debe usar la palabra reservada salir (break) para que vaya 
al final de la estructura. 

Si ninguno de los casos cumple con la expresión, se puede definir un caso por omisión, que también pue- 
de tener instrucciones; la computadora ejecutará la sentencia caso contrario (default). El default es opcional, 
si no está presente no se hace nada. 

Hay tres puntos que debemos considerar en la sentencia segun_sea (switch): 

1. Se diferencia del si (if) en que el primero sólo puede comprobar por igualdad, mientras que la expresión 
condicionada del si (if) puede ser de cualquier tipo. 

2. No puede tener dos constantes en los casos con idénticos valores en el mismo segun_sea (switch). 

3. La sentencia segun_sea (switch) es más eficiente que el si anidado si-si no-si (if-else-if ). 

Notas: 



• Si cada caso tiene varias instrucciones no es necesario agruparlas con llaves, ya que el salir (break) termina el caso. 

• Se utilizará segun_sea (switch) para manejar un menú. Un menú nos muestra en pantalla todas las opciones que podemos 
realizar con nuestro algoritmo o programa. 

3.5.6 Estructura de control selectiva segun_sea (switch) anidada 

Se puede tener un segun_sea (switch) que es parte de una secuencia de instrucciones de otro segun_sea 
(switch). Incluso si las constantes del caso (case) interior contienen valores comunes, no se tendrán conflic- 
tos. Se pueden anidar sentencias segun_sea (switch) con el fin de implementar rutinas donde las opciones 
tienen subdivisiones como en el caso de los submenús. 

3.5.7 Ejercicios resueltos de la estructura de control 
selectiva múltiple segun_sea (switch) 

Ejercicio 1 . Imprimir a qué dia de la semana corresponde en número. 



Diagrama de flujo 




3.5 Estructura de control selectiva o alternativa 69 



Pseudocodigo Lenguaje C 

#include <stdio.h> 
#include <conio.h> 

principal () main() 



¡nido { 

entero día 

imprimir"Escriba el número del día:" 
leer día 

segun_sea (día) 
inicio 

caso 1: imprimir"EI día ",dia,"es Lunes" 
salir 

caso 2: imprimir"EI día "dia,"es Martes" 
salir 

caso 3: imprimir"EI día "dia,"es Miércoles" 
salir 

caso 4: imprimir"EI día "dia," es Jueves" 
salir 

caso 5: imprimir"EI día "dia,"es Viernes" 
salir 

caso 6: imprimir"EI día "dia," es Sábado" 
salir 

caso 7: imprimir"EI día "dia"es Domingo" 
salir 

caso contrario: imprimir "El día no existe" 
fin 

fin } 



int dia; 

printf ( "Escriba el número de día: \n"); 

scanf ( "%d" , &dia) ; 
switch (dia) 

{ 

case 1: printf ("El día %d es Lunes", dia); 
break; 

case 2: printf ("El día %d es Martes" , dia) ; 
break; 

case 3: printf ("El día %d es Miércoles" , dia) 
break ; 

case 4: printf ("El día %d es Jueves" , dia) ; 
break; 

case 5: printf ("El día %d es Viernes" , dia) 
break; 

case 6: printf ("El día %d es Sábado" , dia) ; 
break; 

case 7: printf ("El día %d es Domingo" , dia) ; 
break; 

default: printf ("El día no existe"); 

} 

getch ( ) ; 
return 0 ; 



Este tipo de selectiva múltiple nos sirve para elegir una entre varias opciones. En el ejercicio anterior el 
usuario introduce un número del 1 al 7 y se almacena en la variable dia, posteriormente revisa si el día cap- 
turado pertenece a alguno de los siete casos e imprimirá a qué día de la semana pertenece; la instrucción 
salir (break) que se escribe a un lado, le indica al programa que si ya entró en algún caso, no continúe con lo 
siguiente, es decir que se salga de la estructura segun_sea (switch), y el programa pasará el control a la si- 
guiente instrucción que se encuentre después del fin del segun_sea (switch). Si el usuario introduce un valor 
menor alo mayor que 7 no entra a ninguno de los casos, sino que entrará a la parte caso contrario (default) 
e imprimirá “El día no existe”. 

Si dia= 3 el programa Imprimirá "El día 3 es Miércoles" si dia = 9 el programa imprimirá "El día no existe". El 
formato para imprimir el día dentro de la expresión, depende del lenguaje. 

Si omitimos la instrucción salir (break) recorrerá todos los casos siguientes al capturado; 

si la variable dia fue 2, pasará por los casos 3, 4, 5, 6 y 7. Observamos que cada caso no necesita inicio ni fin 
debido a que el break es el fin de cada uno de ellos. 



Ejemplos 

® 

Ejemplos 



70 Capítulo 3 Programación estructurada 



Es importante recordar que la variable que utiliza el segun_sea (switch) sólo puede ser algún tipo entero o 
carácter (char); en nuestro ejemplo la variable día es tipo ínt. Si hubiéramos elegido un tipo real. 



Ejemplos 

© 



floatdia en lugar de intdia, el compilador nos enviaría el siguiente mensaje: "Error Línea 10: Switch selection 
expression must be of integral type". 



Ejemplos 

© 



Dos posibles salidas si ejecutamos el programa son: 
Escriba el número de día: 

2 

El 2 corresponde a martes. 

Escriba el número de día: 

21 

El día no existe. 



Ejercicio 2. Proporcione el precio de un auto, seleccionando la opción de entre cinco diferentes. 



Diagrama de flujo 




Pseudocódigo 


constante 


A 


85,000 


constante 


B 


1 1 0,000 


constante 


C 


152,000 


constante 


D 


180,000 


constante 


E 


1 70,000 


principal () 







( continúa ) 



3.5 Estructura de control selectiva o alternativa 71 



(continuación) 




En el ejercicio anterior, similar al número 1, incluye el concepto de constante para que se imprima según sea 
el caso el precio del carro que haya seleccionado. La variable opcion almacena un número del 1 al 5 y mos- 
trará el precio correspondiente. Por ejemplo, si opcion = 4 el programa imprimirá El Dodge, Stratus cuesta: 
$180000; si no se hubiera puesto el salir después del caso 4, el programa también imprimiría Dodge, Neón 
cuesta: $ 170000; en este caso sólo imprime la primera leyenda. Otro ejemplo: si opcion = —l el programa 
imprimirá No existe la opcion —1 



Lenguaje C 



#include 
#include 
#define A 
#define B 
#define C 
#define D 
#define E 
main ( ) 



<stdio.h> 

<conio.h> 

85000 

110000 

152000 

180000 

170000 



{ 



Una posible salida en pantalla, después de ejecutar el programa sería: 
Digite una opción para darle el precio del auto que desea 
1: Nissan, Tsuru. 

2: VW, Golf. 

3: VW, Jetta. 

4: Dodge, Stratus. 

5: Dodge, Neón. 

-9 

No existe la opción —9 



int opcion; 

printf ( "Eli j a la marca del auto para darle el precio\n"); 
printf("l: Nissan, Tsuru. \n 2: VW, Golf.\n"); 
printf ("3: VW, Jetta. \n 4: Dodge, Stratus . \n" ) ; 
printf ("5: Dodge, Neón.\n"); 
scanf ( "%d" , &opcion) ; 
switch (opcion) 



{ 



case 1: printf ("El Nissan, Tsuru cuesta:$ %li\n" , A) ;break; 

case 2: printf ("El VW, Golf cuesta:? %li\n" , B) ;break; 

case 3: printf ("El VW, Jetta cuesta:? %li\n" , C) ;break; 

case 4: printf ("El costo del Dodge, Stratus es:? %li\n" , D) ;break; 

case 5: printf ("El Dodge, Neón cuesta:? %li\n" , E) ;break; 

default: printf ("No existe la opción %i", opcion); 



getch ( ) ; return 0 ; 



72 Capítulo 3 Programación estructurada 



Recuerde que el formato del printf para cada caso es Id o li, debido a que el precio de cada vehículo está 
contemplado dentro del entero largo. En el default la variable opcion no es un entero largo, por lo tanto no 
requiere de la / en su formato de impresión. No es conveniente que los costos lleven ya que se omitirán los 
últimos tres ceros. 



Ejemplos 



Si #define A 85,000 se imprimirá sólo $85. 



Ejercicio 3. Calcule el área de un triángulo, un círculo, o de un cuadrado utilizando un menú. 



Diagrama de flujo 




Pseudocódigo 
constante Pl 3.14159 
principal () 
inicio 

carácter opcion; entero x, y; real area 

imprimir "Este programa calcula las siguientes áreas en cm2." 

imprimir "Elige una opción" 

imprimir "A) Área de un triángulo" 

imprimir "B) Área de un círculo" 

imprimir "C) Área de un cuadrado"; leer opcion 

segun_sea (opcion) 

inicio 

caso'A': caso'a': imprimir"D¡gite la basey la altura:"; leer x,y 
area <— x*y/2; salir 

caso 'B': caso 'b': imprimir "¿Cuál es el radio del círculo?"; leer x 
area <— Pl * cuad (x , 2); salir 

caso'C': caso'c': ¡mprimir"¿Cuánto mide un lado del cuadrado?"; leer x 
areat— x*x; salir 

caso contrario: imprimir"La opción que dígito no existe." 
fin 

imprimir"EI Área es:" area,"cm 2 " 



3.5 Estructura de control selectiva o alternativa 73 



Lenguaje C 

#include <stdio.h> 

#include <conio.h> 

#include <math.h> 
ttdefine PI 3.14159 
main ( ) 

{ 

char opcion; int x,y; float area; 

printf("Este programa calcula las siguientes áreas en cm2 : \n" ) ; 

printf ( "Eli j a una opción :\n"); 

printf("A) Área de un triángulo . \n" ) ; 

printf ("B) Área de un círculo . \n" ) ; 

printf ("C) Área de un cuadrado . \n" ) ; 

switch (opcion=getchar ( ) ) 

{ 

case 'A': case 'a': printf ( "Digite la base y la altura: \n" ) ; scanf ( "%d%d" , &x, &y) ; 
area= (x*y) /2 ; break; 

case 'B': case 'b' : printf ( "¿Cuál es el radio del círculo?\n" ) ; scanf ( "%d" , &x) ; 
area=PI*pow (x, 2 ) ; break; 

case 'C': case 'c': printf ( "¿Cuánto mide un lado del cuadrado?\n" ) ; scanf ("%d",&x); 
area=x * x; break; 

default :printf ( "La opción que digito no existe . \n" ) ; 

} 

printf ("El Área es: %.2f cm2",area); 

getch ( ) ; return 0 ; 

} 



El ejercicio anterior incluye otra característica de la estructura selectiva múltiple: la de hacer menús, ya que 
sirve para elegir una opción entre varias. Este ejercicio utiliza caracteres en lugar de números enteros para 
elegir la opción, muestra también que el carácter puede ser en mayúscula o minúscula, ya que cada uno de 
éstos tiene diferente códigos ascii (A = 65, a = 97). El carácter va entre apóstrofos. Se declaran las variables 
x, y de tipo entero y se utilizarán para calcular alguna de las tres áreas, teniendo en cuenta que la estructura 
segun_sea realiza solamente una de ellas y no todas. El usuario elige la opción que es una variable de tipo 
carácter ya que almacenará una letra y dependiendo de la letra que elija se realizará el área del menú; cabe 
mencionar que los tres cálculos de áreas se almacenarán en la variable area, para que cuando se termine la 
estructura segun_sea se imprima el valor en lugar de imprimirlo dentro de cada una de las opciones. Tam- 
bién se incorpora la función cuad (x,2) que eleva el valor de x al cuadrado, pero también sirve para elevar 
cualquier número a cualquier potencia. 

Ejemplos 



si opcion = Bel programa entrará a calcular el área del círculo, s/x = 3, la variable area = 3. 14159*9 almacena 
este valor para luego Imprimir El Área es: 28.27. Si la opcion =ael programa entra al caso A, y solicita la base y 
la altura, que las almacena en las variables x = 4yy = 6; se realiza el cálculo y la variable almacenará area = 12, 
para luego imprimir El Área es: 12. 



En lenguaje C utilizamos la función getchar(): switch (opcion=getchar()) donde la variable opcion alma- 
cenará la tecla que oprimamos. Se incorpora la función pow(x,2) que eleva el valor de x al cuadrado, pero 
también sirve para elevar cualquier número a cualquier potencia; por lo tanto necesitamos incluir la librería 
math.h, ya que pow es una función matemática. 




74 



Capítulo 3 Programación estructurada 



Ejercicio 4. Imprimir qué tipo de alumno es según su calificación, considerando que si el alumno tiene 1 00 
se imprima Excelente. Si tiene entre: 

a) 90 y 99 se imprima Muy Bueno 

b) 80 y 89 se imprima Bueno 

c) 70 y 79 se imprima Regular 

d) 60 y 69 se imprima Malo 

e) 0 y 59 se imprima Reprobado 




Una desventaja que tiene el segun_sea para el lenguaje C es que no permite utilizar rangos, así que trabaja- 
remos con la estructura selectiva doble anidada para almacenar en la variable cal una nueva calificación que 
permita luego utilizar la estructura selectiva múltiple e imprimir qué tipo de alumno es; aunque en este ejer- 
cicio en particular se pudo haber impreso qué tipo de alumno es desde la selectiva doble según la calificación 
del alumno, pero en otros ejercicios puede ser útil este proceso. En este programa utilizamos varios si (if) 
anidados donde la calificación dentro de un rango se redondea a múltiplos de 10, en el siguiente ejemplo el 
68 se redondea a 60 y en el caso 60 imprime Malo. 



Ejemplos 



si cal = 76 entrará al cuarto si anidado, en el cual la nueva calificación será cal = 70; de esta manera al entrar 
a la estructura segun_sea, imprimirá Regular. 



Lenguaje C 




#include <stdio.h> 

#include <conio.h> 
main ( ) 

{ 

int cal; 

printf ( "¿cuál es la calif icación?\n" ) 


; scanf ( "%d" , &cal) ; 



[continúa) 



Ejercicios complementarios de la estructura de control selectiva múltiple en pseudocódigo 75 



( continuación ) 



Lenguaje C 

if (cal!=100) 

if (cal>=90) cal=90; 
else 

if (cal>=80) cal=80; 
else 

if (cal>=70) cal=70; 
else 

if (cal>=60) cal=60; 
else cal=50; 

switch (cal) 

{ 

case 100: printf ( "Excelente !") ;break; 

case 90: printf ("Muy bueno" ); break ; 

case 80: printf ( "Bueno" ); break; 

case 70: printf ( "Regular" ) ;break; 

case 60: printf ( "Malo" ); break; 

case 50: printf ( "Reprobado" ); break; 

default: printf ( "Calificación no válida"); 

} getch ( ) ; return 0 ; 



Ejercicios complementarios de la estructura de control 
selectiva múltiple en 

pseudocódigo 



Ejercicio 1. Complete el siguiente pseudocódigo que calcula la paga de un trabajador según sean las 
horas trabajadas y el precio por hora para el trabajo que realice, entre las siguientes opciones: 

a ) Intendencia: $35 tí) Asistente: $50 c) Administrativo: $80 

d) Directivo: $120 é) Gerente: $150 

principal () 
inicio 

carácter puesto; horas, paga_total 

impr¡mir"lntroduce el número de horas trabajadas"; leer 

impr¡mir"a) intendencia b) asistente c) administrativo" 
imprimir "d) directivo e) gerente" 

"elige el puesto"; leer 

(puesto) 

inicio 

caso 'a': paga_total <— horas * 35; salir 

caso'b': <— horas * 50; salir 

caso ' ': paga _total <— horas * 80; salir 

caso'd': paga_total <— *120; salir 

caso'e': paga_total <— ; salir 

caso contrario: imprimir "no existe ese puesto" 




( continúa ) 



76 Capítulo 3 Programación estructurada 



( continuación ) 

fin 

¡mprimir"La paga es , 

fin 

Ejercicio 2. Complete el siguiente pseudocódigo que nos dice, dependiendo el día y el mes, qué signo 
del zodiaco es. 



principal () 
inicio 

entero día, mes 

imprimir"Escribe tu día de nacimiento en dígitos del (1-31)" 
leer día 

imprimir "Escribe tu mes de nacimiento en dígito del (1-12)' 
leer mes 

segun_sea 

inicio 

casol: si (dia < 22) imprimir"Capr¡cornio" 
si no imprimir"Acuario" 
salir 

caso 2: si (dia < 22) imprimir" 

si no imprimir"Piscis" 
salir 

caso 3: si (dia < 22) imprimir"Piscis" 

si no imprimir" 

salir 

caso 4: si (dia < 22) imprimir "Aries" 

si no imprimir" 

salir 

caso 5: si (dia < 22) imprimir" 

si no imprimir"Géminis" 
salir 

caso 6: si (dia < 22) imprimir" 

si no imprimir "Cáncer" 
salir 

caso 7: si (dia < 22) imprimir "Cáncer" 

si no imprimir " 

salir 

si (dia < 22) imprimir "Leo" 

si no imprimir "Virgo” 
salir 

caso 9: si (dia < 22) imprimir " 

si no imprimir " 

salir 



caso 10: imprimir"Libra " 

si no imprimir "escorpión" 
salir 

caso 1 1: si (dia < 22) imprimir "escorpión" 

imprimir"sagitario" 



salir 

caso 1 2: si (dia < 22) imprimir 
si no imprimir " 
salir 



imprimir"No existe ese mes" 



fin 



fin 



Ejercicios complementarios de la estructura de control selectiva múltiple en lenguaje C 77 



Ejercicio 3. Explique qué realiza el siguiente pseudocódigo y qué imprime con los siguientes datos: 

constante Pl 3.14159 

principal () 

inicio 

carácter opcion; real x, peri 

imprimir "Este programa calcula los siguientes perímetros en cm." 

imprimir "A Perímetro de un triángulo equilátero" 

imprimir "B Perímetro de un círculo" 

imprimir "C Perímetro de un cuadrado" 

imprimir "Elige una opción"; leer opcion 

segun_sea (opcion) 

inicio 

caso 'A': caso 'a': imprimir"Digite la base:"; leer x 
peri <— x * 3; salir 

caso 'B': caso 'b': ¡mprimir"¿Cuál es el radio del círculo?"; leer x 
peri <— x * 2 * Pl; salir 

caso'C': caso'c': imprimir"¿Cuánto mide un lado del cuadrado?"; leer x 
peri <— x*4; salir 

caso contrario: imprimir "La opción que dígito no existe." 
fin 

imprimir"EI Perímetro es:", peri 



Respuesta: 

Si opción = B, x = 5, qué imprime 



Ejercicios complementarios de la estructura de control selectiva múltiple en 

lenguaje C 



Parte I. Elaborar la codificación en lenguaje C de los siguientes programas (realizando el cálculo e 
impresión respectiva): 

1. Leer un número entero obtenido al lanzar un dado de seis caras e imprimir el número en letras de la cara 
opuesta. En las caras opuestas de un dado de seis caras están los números: 1-6, 2-5 y 3-4. Si el número del 
dado capturado es menor que 1 o mayor que 6, se mostrará: “Un DADO no tiene ese número”. 

2. Capturar una letra minúscula o mayúscula e imprimir la posición respectiva por ejemplo: a=l y la 
Z=27. 

3. En un supermercado, se realizan descuentos por las compras a partir de unas bolitas de colores: Verde 
20%, amarilla 25%, negra del 30%; la blanca no aplica ningún descuento. Leer el importe de la compra y 
el color de la bolita e imprimir lo que debe pagar dicho cliente. 

4. El importe anual del seguro de un coche depende del modelo del coche, del color, de la edad del conductor 
y tiempo que tiene conduciendo. Son tres modelos de coche (A, B y C) y los precios del seguro según el 
color: 



Capítulo 3 Programación estructurada 



Modelo 


Color 


Precio 


Modelo 


Color 


Precio 


Modelo 


Color 


Precio 


A 


Claro 


3800 


B 


Claro 


4930 


C 


Claro 


7570 




Oscuro 


4340 




Oscuro 


5600 




Oscuro 


8250 



Si el conductor tiene menos de 20 años, el precio se incrementa 25%; si tiene entre 20 y 30 años se 
incrementa 10%; si tiene entre 31 y 65 años el precio no se modifica; si tiene más de 65 años el precio 
se incrementará 15%. Además, en todos los casos si el conductor tiene menos de 2 años conduciendo 
con permiso, el precio se incrementará 25% adicional. Calcular el precio del seguro para un determina- 
do modelo y un determinado conductor. 

5. Leer una letra mayúscula e imprimir la letra y si ésta es recta (A,E,F,H,I,K,L,M,N,T,V,W,X,Y,Z), es curva 
(C,0,S,U,Q) o curva y recta (B,D,G,J,P,R). 

6. Leer un carácter y dos números enteros. Si el carácter leído es un operador aritmético calcular la 
operación correspondiente, si es cualquier otro carácter imprimir error. 

7. Elaborar un menú que calcule tres conversiones de tiempo. 

8. Elaborar un menú que calcule tres conversiones del sistema inglés al decimal (unidades de longitud). 

9. Elaborar un menú que calcule conversión de divisas, pesos a dólares, pesos a euros, pesos a libras, libras 
a pesos, dólares a pesos, etcétera. 

10. Imprimir la descripción correspondiente a una cantidad de hasta cuatro dígitos dada. 

11. Investigar el horóscopo chino y hacer el cálculo respectivo, conociendo el mes y el año. 

12. Leer metros o centímetros y posteriormente seleccionar la opción de conversión de longitud al sistema 
inglés: yardas, pulgadas o pies. Al final imprimir el resultado. 

Parte II. Realizar la prueba de escritorio o corrida a mano los siguientes programas: 



Ejercicio 1 


Ejercicio 2 


ma¡n() 


main() 


1 


{ int a = 5,b=15,c=21,d,e; 


float A=3,B= 1 ,C=4,D; 


d=a + b; e=a*2; 


B=A*B/2; 


a=3*b/2— e; b=c-a; 


C=B+4; 


printf("%d,%d,%d,%d,%d\n",a,b,c,d,i 


printf("%f,%f,%f\n",A,B,C); 


switch (e— (b%4*3>2)) 


if (A/B-3*C<25— C*B) 


1 


1 


case 1: if (c>19){ 


A=2 + 3*C; 


b=c/3; 


C=A+3*C/2; 


e=c%2; 


D=A+C; 


1 


1 


else 


else if (A> 1 0&&B! =C) 


a=e+2; 


1 


break; 


A=2+4*C; 


case 3: if (b< 1 8) 


n 

II 

> 

1 

S 


a = c%2; 


D=A+C— 2; 


else { 


1 


a=e*3; 


else 


b=a%4; 


1 


c=b+5; 


A=7 — C/4; 


1 


< 

1 

u 

II 

Cü 


break; 


D=A+B; 


default: a = d*2; 



c=c/3; 



1 



( continúa ) 



3.6 Estructura de control repetitiva o de iteración condicional 79 



( continuación ) 

printf("%f,%f,%f,%f\n",A,B,C,D); 
if (D<50) printf("%f,%f\n"A,C*2); 

else printf("%f,%f\n",B,D/2); 
getchO; 
return 0; 



b=b%2; 

} 

printf("%d,%d,%d,%d,%d\n"e,d*2,b,a+4,c); 
getch 0; return 0; 

} 






3.6 Estructura de control repetitiva o de iteración condicional 

Las computadoras están diseñadas primordialmente para aquellas apli- 
caciones en las cuales una operación o conjunto de ellas deben repetirse 
más de una vez. 

La repetición de una acción (una o varias instrucciones) se lleva a 
cabo mientras se cumpla cierta condición; para que la acción termine, la 
acción misma debe modificar la(s) variable(s) de control que interviene(n) 
en la condición. Dicha condición puede estar predefinida como en el ci- 
clo desde (for); o no predeterminada, como en los bucles mientras (while) 
y hacer-mientras (do_while). 

Bucles, ciclo o iteración. Es un segmento de un algoritmo o programa, cuya(s) instrucción(es) se repite(n) 
un número conocido o indefinido de veces mientras se cumpla una determinada condición. En cada vuelta 
del ciclo comprueba si la condición es verdadera, rompiéndose el ciclo cuando es falsa. La condición en algún 
momento tiene que ser falsa ya que en caso contrario el bucle se hará infinito. 




3.6.1 Contadores, acumuladores, centinelas y banderas 

Contadores y acumuladores 

Estas dos palabras se usan mucho en programación para referirse a variables que van incrementando o 
decrementando su valor a lo largo de la ejecución del algoritmo o programa. Normalmente serán de tipo 
numérico, 



Pseudocódigo 


Lenguaje C 


cont<— cont + 1 


cont = cont + 1 ; 


total <— total + y 


total = total + y; 


m <— m * 3 


m = m * 3 ; 



Ejemplos 



Características de la variable contador o acumulador: 

1. Se debe inicializar antes de entrar al ciclo. 

2. Dentro del ciclo debe aparecer a ambos lados de la asignación. 

Debemos inicializarlas de forma correcta, para: 

♦ Sumar o restar en cero antes de entrar al ciclo; recordar que el cero es el elemento neutro de la suma 
y resta. 

• Multiplicar 1, porque si valen cero todo lo que multipliquemos por ella seguirá valiendo cero; recordar 
que el 1 es el elemento neutro de la multiplicación. 



80 Capítulo 3 Programación estructurada 



Contador 

Un contador es una forma de controlar a un bucle. Es una variable cuyo valor se incrementa o decrementa en 
una cantidad constante cada vez que se produce un determinado suceso o acción en cada repetición; dicha 
variable controla o determina la cantidad de veces que se repite un proceso o dato. Sintaxis: 



Ejemplos 



Pseudocódigo 


Lenguaje C 


nom_contador <— nom_contador + val_const 


nom contador = nom contador + val const ; 



Si en vez de incremento es decremento se coloca un menos en lugar del más. 

Se debe realizar una operación de inicialización y posteriormente las sucesivas de incremento o decre- 
mento del mismo. La inicialización consiste en asignarle al contador un valor de inicio. Se situará antes y 
fuera del bucle. 



Ejemplos 



Pseudocódigo 


Lenguaje C 


entero contador <— 1 
contador <— contadorT 1 


int contador = 1; //variable con valor inicial de 1 
contador+ + ; o + + contador; o contador+ = l; 



Acumulador o totalizador 

Un acumulador realiza la misma función que un contador con la diferencia de que el incremento o decre- 
mento es variable en lugar de constante. Es una variable que acumula sobre sí misma un conjunto de valores, 
para de esta manera tener la acumulación de todos ellos en una sola variable. Es una variable que almacena 
cantidades resultantes de operaciones sucesivas. 

Sintaxis: 



Ejemplos 

® 



Pseudocódigo 


Lenguaje C 


nom_acumula <— nom_acumula + valor_var 


nom acumula = nom acumula + valor var; 



Pseudocódigo 


Lenguaje C 


entero acumulador <— 0 
acumulador <— acumulador + valor 


int acumulador = 0 ; 

acumulador = acumulador + valor; o 
acumulador += valor; 



Centinela 

El centinela es una variable que inicia con un valor, luego dentro de un bucle este valor cambia, haciendo falsa 
la condición del ciclo y por lo tanto indicará el fin del ciclo (el usuario puede determinar cuándo hacerlo). La 
repetición controlada por centinela se considera como una repetición indefinida (se desconoce el número 
de repeticiones). 



Ejemplos 

© 



Un usuario puede introducir S o N para indicar si desea continuar o no. El bucle terminará cuando la 
respuesta del usuario sea "n" o "N". También se podrían manejar números. 



Bandera 

Una bandera (flag, interruptor o marca), es una variable que puede tomar sólo dos valores opuestos, 
generalmente: 1 (verdadero) o 0 (falso), a lo largo de la ejecución del algoritmo o programa. Es muy utilizado 
en búsquedas, veremos un ejemplo en un arreglo unidimensional en el siguiente capítulo. 



3.6 Estructura de control repetitiva o de iteración condicional 81 



Pseudocódigo 


Lenguaje C 


int band <— 0 


int band = 0 ; 


bandera <— 1 


bandera = 1 ; 



Ejemplos 



Existen tres estructuras repetitivas: mientras (while) 

hacer_míentras (do_whíle) 
desde (for) 

Ahora describiremos cada una de ellas. 



3.6.2 Estructura de control repetitiva mientras (while) 

Al ejecutarse la instrucción mientras (while), se evaluará la expresión booleana suministrada en los paréntesis 
(condición), y si su valor es verdadero (distinto de cero) se realizará el ciclo o bucle (una o varias instruccio- 
nes). Después, la condición es reevaluada y se procede de la misma manera. Cuando la condición se vuelve 
falsa (es decir, cero), en la siguiente evaluación se dará por terminado el ciclo mientras (while). 

Si la condición nunca se vuelve cero, el ciclo nunca terminará y, dependiendo de las instrucciones inclui- 
das en el bucle, se generaría un error de ejecución que detendría el programa, o podría ser que el programa 
itere indefinidamente hasta ser detenido en forma manual. 

En esta estructura no se conoce necesariamente el número de veces que entrará al ciclo, ya que esto 
dependerá de la condición definida. 



Diagrama de flujo 



Pseudocódigo 



Lenguaje C 




Con una instrucción 
mientras (condición) 
Inst 1 

Con varias instrucciones 
mientras (condición) 
inicio 
Inst 1 
Inst 2 

Inst n 
fin 



Con una instrucción 
while (condición) 

Inst 1 

Con varias instrucciones 
while (condición) 

{ 

Inst 1 
Inst 2 

Inst n 

} 



donde condición es cualquier expresión numérica, relacional o lógica. 

Características: 

1. La condición (expresión lógica) se evalúa antes del ciclo. Si la condición es verdadera se ejecuta el bucle, 
y si es falsa se sale y el control pasa a la instrucción siguiente al ciclo. 

2. Si la condición es falsa cuando se revisa por primera vez el bucle no se ejecuta nunca, es decir no entra 
ninguna vez. 

3. Mientras la condición sea verdadera el bloque de instrucciones se ejecutará indefinidamente a menos 
que exista por lo menos una instrucción que modifique el valor de un elemento de la condición. 




82 



Capítulo 3 Programación estructurada 



4. Si existe más de una instrucción se necesitan las palabras reservadas inicio - fin ( {—}) para delimitar el 
bloque de instrucciones. 

Nota: Existen algunos algoritmos y programas que se pueden efectuar con los tres ciclos: desde, mientras y hacer_ 
mientras ; aunque cada una tiene sus características específicas. 

3.6.3 Ejercicios resueltos de la estructura de control 
repetitiva mientras (while) 

Ejercicio 1 . Mostrar los 10 primeros números enteros positivos. 




El ejercicio 1 declara la variable i de tipo entero, luego se inicializa con el valor de 1 ya que es el primer núme- 
ro entero positivo; se revisa la condición del mientras (1 < 11); como la condición se cumple entra al ciclo y 
se ejecutan las dos instrucciones que están delimitadas en el bloque entre inicio-fin ({—}). Así que imprime el 
i y luego ¿<—¿+7 lo podemos interpretar como la nueva i recibe el valor de la i anterior más 1, incrementando 
en 1 a la variable i, de tal forma que i = 2, revisa la condición del mientras otra vez (2 < 11), como la condi- 
ción sigue siendo verdadera vuelve a entrar al ciclo, y así sucesivamente hasta que el valor de i sea mayor o 
igual a 11; esto hará que se salga del ciclo y termine el programa. Si vemos la instrucción i <— i + 1, se realiza 
cada vez que entra al ciclo, esto hace que se cumpla la característica número tres de la estructura repetitiva 
mientras, para que en un momento dado i tome un valor mayor que 10 y se salga del ciclo. 

El programa imprimirá 123456789 10. El último valor que toma i es 11, hace que no se cumpla la 
condición y por lo tanto se sale del ciclo mientras. 

Nota: Como se verá más adelante, este ejercicio es igual al ejercicio 1 de la estructura repetitiva "desde"; la ventaja 
principal es que el ciclo desde el incremento de su contador / lo hace de manera automática, y en la estructura "mientras'' 
se debe realizar en una instrucción dentro del ciclo. 





3.6 Estructura de control repetitiva o de iteración condicional 83 



Como hemos visto, en lenguaje C después de la condición del while no debe escribirse el punto y coma, 
ya que de hacerlo no se realizará el ciclo; no marca error, pero no aparecerá nada en la pantalla, ya que no 
entra al ciclo. También podemos apreciar que el equivalente a i<—i + 1 es i++; aunque también podíamos 
haber utilizado + +i. 



Ejercicio 2. Mostrar los múltiplos de siete que se encuentren de 0 a 1 50. 



Diagrama de flujo 



Pseudocódigo 




principal () 
inicio 

entero m 
m <— 7 

mientras (m < 150) 
inicio 

imprimir m 
m <— m + 7 
fin 



fin 



Lenguaje C 

#include <stdio.h> 
#include <conio.h> 
int main() 

{ 

int m; 
m = 7; 

while (m <15 0) 

{ 

printf ( "%d\n" , m) ; 
ra = m + 7 ; 

} 

getch(); return 0; 



Una posible 
salida en 
pantalla, 
después de 
ejecutar el 
programa 
sería: 



7 

14 

21 

28 

35 

42 

49 

56 

63 

70 

77 

84 

91 

98 

105 

112 

119 

126 

133 

140 

147 



En el ejercicio 2 se declara la variable m de tipo entero, se inicializa con el valor de 7 ya que es el primer 
múltiplo de 7 entre 0 y 150; se revisa la condición del mientras (7 < 150), como la condición se cumple entra 
al ciclo y se ejecutan las dos instrucciones que están delimitadas en el bloque entre inicio-fin ({—}), así que 
imprime el 7; se le incrementa 7 a la variable m, de tal forma que m = 14; revisa la condición del mientras otra 
vez (14 < 150); como la condición sigue siendo verdadera vuelve a entrar al ciclo; así sucesivamente hasta que 
el valor de m sea mayor o igual a 150, esto hará que se salga del ciclo y termine el programa. 

Si vemos la instrucción m <— m + 7, se realiza cada vez que entra al ciclo, esto hace que se cumpla la 
característica 3, para que en un momento dado m tome un valor mayor o igual a 150 y se salga del ciclo. 

El programa imprimirá 714 21 28 35 42 49 56 63 70 77 84 91 98 105 112 119 126 133 140 147. 
El último valor que toma m es 154, el cual es mayor a 150 y hace que no se cumpla la condición y se salga del 
ciclo “mientras". 

Nota: Cabe mencionar que para cualquier ejercicio donde se maneje más de una instrucción, es importante agrupar el 
bloque con inicio-fin ({ — }); en caso contrario sólo se realizaría la primera instrucción que se encuentra después del ciclo 
mientras (while): 



Pseudocódigo 


Lenguaje C 


Resultado 


m <— 7 

mientras ( m < 1 50 ) 
imprimir m 
m <— m + 7 


m = 7 

while ( m < 150 ) 
printf ("%d" , m) ; 
m = m + 7 ; 


Se imprimiría indefinidamente el valor de 7 
ya que al revisar la condición ( 7 < 1 50 ) ésta 
siempre será verdadera y volverá a revisarse 
la misma condición todas las vueltas, ya que 
nunca se realizaría el incremento m <— m + 7 





84 



Capítulo 3 Programación estructurada 



Como se muestra en este ejercicio, es necesario delimitar la o las instrucciones que queremos que se realicen 
si la condición es verdadera, ya que el resultado cambia si se le agrega o no el { y }, ya que se realizarán una 
o varias instrucciones. 

Ejercicio 3. Imprimir la palabra programación seis veces. 



Pseudocódigo 


Lenguaje C 




Opción A 


Opción A 

#include <stdio.h> 
#include <conio.h> 




principal () 


main ( ) 




inicio 


{ 




entero cont 


int cont ; 




cont <— 1 


cont =1; 




mientras ( cont < = 6 ) 


while ( cont < = 


6 ) 


inicio 


{ 




imprimir "programación" 


printf ( "prograraación\n" ) ; 


cont <— cont + 1 


cont = cont + 


1; 


fin 


} 






getch ( ) ; 


Una posible salida en 




pantalla, después de 


fin 


} 


ejecutar el programa 
sería: 


Opción B 


Opción B 


programación 




#include <stdio.h> 


programación 




#include <conio.h> 


programación 


principal () 


main ( ) 


programación 


inicio 


{ 


programación 


entero cont 


int cont ; 


programación 


cont <— 1 


cont =1; 




mientras ( cont < 7 ) 


while ( cont <7 


) 


inicio 


{ 




imprimir "programación" 


printf ( "programación\n" ) ; 


cont <— cont + 1 


cont + + ; 




fin 


} getch ( ) ; return 


0; 


fin 


} 





El ejercicio 3 está desarrollado de dos formas diferentes, aunque ambas realizan exactamente lo mismo, es 
decir imprimir seis veces la palabra programación. En lo que difieren es: En la opción A la variable cont se ini- 
cializa en 1 y la condición del mientras compara (cont <= 6); al sustituir el valor que compara es 
(1 <= 6) y como la condición se cumple, imprime la palabra programación e incrementa el contador en 1, 
es decir cont = 2 y revisa otra vez la condición del mientras (2 <= 6); como ésta es verdadera, imprime de 
nuevo la palabra programación, y así sucesivamente. Los valores que toma la variable cont son 1, 2, 3, 4, 5, 6 
para que la condición del mientras se cumpla y se realice el bloque de instrucciones, pero cuando cont = 7 
la condición ya no se cumple y se sale del ciclo. En la opción B la variable cont se inicializa con 1 y la con- 
dición del mientras compara (cont < 7)\ al sustituir el valor que compara es (1 < 7); como la condición se 
cumple imprime la palabra programación, y así sucesivamente. Los valores que toma la variable cont son 
1, 2, 3, 4, 5, 6 para que la condición del mientras se cumpla y se realice el bloque de instrucciones, pero cuando 
cont =7 la condición ya no se cumple y se sale del ciclo. En conclusión la programación puede tener diferen- 
tes códigos y obtener el mismo resultado. En ambos casos imprime seis veces la palabra programación. Si no 
se delimita el resultado el bloque será: 




3.6 Estructura de control repetitiva o de iteración condicional 85 



Pseudocódigo 


Lenguaje C 


Resultado 


cont <— 1 


cont = 1 ; 


Se imprimiría indefinidamente la pala- 


mientras ( cont < 7 ) 


while ( cont < 7 ) 


bra programación, ya que al revisar la 
condición (1 < 7) esta siempre será ver- 


imprimir "programación" 


printf ( "programación" ) 


' dadera y nunca se realizaría el incre- 


cont <— cont + 1 


cont = cont + 1; 


mento de cont <— cont + 1 



Ejercicio 4. Sume un conjunto de números enteros hasta que la suma sea mayor que 1 00. Al final imprimir 
el resultado de la acumulación. 



Diagrama de flujo 




Pseudocódigo 

principal () 
inicio 

entero n, sum 
sum <— 0 

mientras ( sum <= 100 ) 
inicio 

impr¡mir"Dame un número entero" 
leer n 

sum <— sum +n 
fin 

imprimir"La suma es: ", sum 



Lenguaje C 

#include <stdio.h> 

#include <conio.h> 
main ( ) 

{ 

int n, sum; 
sum =0; 

while ( sum <= 100 ) 

{ 

printf("Dame un número entero\n” ) ; 
scanf ( "%d" , &n) ; 
sum = sum + n ; 

} 

printf("La suma es: %d\n" , sum) ; 

getch ( ) ; return 0 ; 

} 



Una posible salida en pantalla, después 
de ejecutar el programa sería: 

Dame un número entero 
5 

Dame un número entero 
30 

Dame un número entero 
45 

Dame un número entero 
10 

Dame un número entero 
15 

La suma es: 105 





8ó 



Capítulo 3 Programación estructurada 



El ejercicio 4 difiere respecto a los anteriores, ya que dentro del ciclo mientras se va leyendo un número n, 
no se sabe cuántos son, esto dependerá del valor de los números que capture el usuario; si captura números 
grandes, con algunos la suma llegará a una cantidad mayor que 100, pero si captura números pequeños se 
necesitará de muchos valores para que la suma llegue a ser mayor que 100. Se declaran dos variables de ti- 
po entero n que almacenará los diferentes números y sum que irá acumulando la suma de los números que 
el usuario capture. Se inicializa la variable suma con 0. Se revisa la condición del mientras y la primera se 
cumple (sum < = 100) ya que (0 < = 100), así que pregunta por un número y lo almacena en n, este número 
se le suma a la variable sum y regresa a revisar la condición del mientras-, si la suma (sum) todavía es me- 
nor que 100, vuelve a preguntar por otro número y lo acumula o suma a la variable sum, así sucesivamente 
hasta que la variable sum sea mayor que 100. 

Ejemplos 



En sum = 0, se lee el primer número 45, y se almacena en n, sum = 0 + 45, sum = 45, regresa y revisa; la 
condición es (45 < 100), como ésta se cumple, vuelve a entrar al ciclo mientras y lee otro número n = 30, 
sum = 45 + 30, sum = 75, regresa y revisa, la condición es (75 < 100), como también se cumple, vuelve a 
entrar al ciclo mientras y lee otro número n = 50, sum = 75 + 50, sum = 125, regresa y revisa la condición, es 
(125 < 100), como no se cumple, se sale del ciclo y se realiza la siguiente instrucción fuera del ciclo e imprime: 
La suma es: 125. Si no se delimita el resultado el bloque con inicio y fin en pseudocódigo o con {} en lenguaje 
C quedaría: 



Pseudocódigo 

sum <— 0 

mientras ( sum < = 1 00 ) 
imprimir "Dame un número" 
leer n 

sum <— sum + n 



Lenguaje C 

sum = 0 

while (sum <= 100) 
printf ("Dame un número"); 
scanf ( "%d" , &n) ; 
sum = sum + n; 



Resultado 

Si la variable sum = 0, se revisa la 
condición (0 <= 100), esta es ver- 
dadera y la única instrucción que 
se realizará será imprimir"Dame un 
número". Si otra vez revisa la con- 
dición, siempre será verdadera ya 
que la variable sum nunca cambia 
y por lo tanto se hace cíclica o in- 
definida. 



Ejercicio 5. Calcule el producto (multiplicación) entre un conjunto de números reales hasta que el número 
introducido sea cero. 






3.6 Estructura de control repetitiva o de iteración condicional 87 



En el ejercicio 4 introdujimos el concepto sumar o acumular varios números en una sola variable; en este 
ejercicio se introduce el concepto del producto de varios números. La condición revisa que el número que 
capturó el usuario sea diferente de 0 ya que si es cero el producto que tengamos se haría 0. Se declaran dos 
variables reales num para almacenar los diferentes números que capture el usuario, y prod para que se vayan 
multiplicando estos números; se inicializa la variable prod con 1 para que el primer número que capture se 
multiplique por la unidad, esta variable se quede con ese valor y a partir de ahí continúe realizando el pro- 
ducto. Se captura un número y se almacena en num = 8, se revisa la condición como (8 0 0) y entra al ciclo 
prod = prod * num, es decir prod = 1*8, prod = 8; se lee otro número y se almacena en num = 12, se revisa 
la condición como (12 <> 0) y entra al ciclo prod = prod * num, es decir prod = 8 * 12, prod = 96; se lee 
otro número y se almacena en num = 2, se revisa la condición como (2 0 0), entra al ciclo prod = prod * 
num, es decir prod = 96 * 2, prod = 192 ; se lee otro número y se almacena en num. Si el num = O, se revisa 
la condición como (O O 0), se sale del ciclo y se pasa a la siguiente instrucción que está después del fin del 
bloque de instrucciones del ciclo “mientras", e imprimirá El producto es: 192. 

Nota: Cabe mencionar que si cualquier ejercicio de los que se han visto no tuviera inicio-fin ({-}) sólo se realizaría la 

primera instrucción que se encuentra después del ciclo mientras ( while ); por ejemplo: 



Pseudocodigo 


Lenguaje C 


Resultado 


leer num 


scanf ( "%f " , &num) ; 


Si el primer número que se capturó 


mientras ( num <> 0 ) 


while ( num != 0 ) 


fue diferente de 0, por ejemplo 8; 
prod = 1 * 8 = 8, y vuelve a revisar 


prod <— prod * num 


prod = prod * num; 


la condición del mientras; como el 


imprimir"Dame otro número" 


printf ("dame otro número\n" ) 


; número no cambia y siempre es 8, 


leer num 


scanf ( "%f " , &num) ; 


la condición siempre se cumplirá 
ya que es 8 <>0 y se hace un ciclo 
indefinido. 



Ejercicio 6. Sumar los números pares y multiplicar los números impares hasta que la suma sea mayor que 
50 o el producto mayor que 150. 



Pseudocodigo Lenguaje C 

#include <stdio.h> 
#include <conio.h> 

principal () main() 



inicio { 

entero num, suma, prod 
suma <— O 
prod <— 1 

mientras (suma < = 50 y prod < = 150) 
inicio 

imprimir "Dame un número entero" 

leer num 

si ( num mod 2 = 0) 

suma <— suma + num 
si no 

prod <— prod * num 
fin 

imprimir "La suma es: ", suma 
imprimir "El producto es: ", prod 

} 



int num, suma, prod ; 
suma = O ; 
prod = 1 ; 

while (suma <= 50 && prod <= 150) 

{ 

printf ("Dame un número entero \n" ) ; 
scanf ( "%d" , &num) ; 
if ( num % 2 = = 0 ) 

suma = suma + num; 

else 

prod = prod * num; 

} 

printf ("La suma es: %d\n" , suma); 
printf ("El producto es: %d" , prod); 
getch ( ) ; return 0 ; 



fin 



88 Capítulo 3 Programación estructurada 



En el ejercicio 6 se revisa si el número es par o impar y, dependiendo de este resultado, lo suma o lo 
multiplica. Fíjese que las condiciones simples del mientras incluyen el operador lógico “y”, que servirá para 
que cuando una de las dos condiciones ya no se cumpla, se salga del ciclo mientras y esto satisfaga el obje- 
tivo del programa que es cuando alguna de las dos se cumpla y se salga del ciclo. Se inicializan las variables 
suma=0 y prod=l. Revisa (suma <= 50 y prod <= 150), siendo verdaderas ambas condiciones se entra 
al ciclo. 



Ejemplos 



Ejercicio 7. Sumar los números pares y multiplicar los números impares hasta que la suma sea mayor que 
50 y el producto mayor que 1 50. 




Se lee el primer número num = 16, como es par, se suma = 0 + 16, quedando un valor suma = 16, regresa y se 
revisa la condición compuesta (suma <= 50 y prod <= 150), como las dos condiciones se cumplen vuelve a 
entrar al ciclo y se lee otro número num = 45, como es impar se multiplica prod = 1*45, prod = 45, regresa y 
se revisan la condición compuesta (suma <= 50y prod <= 150)] como se cumplen las dos condiciones vuelve 
a entrar al ciclo y se lee otro número num = 20, como es par se suma y queda suma = 16 + 20, suma = 36, 
regresa y se revisa la condición; como se cumplen las dos condiciones vuelve a entrar al ciclo y se lee otro 
número num = 5, como éste es impar se multiplica prod = 45*5, prod = 225, regresa y se revisa la condición 
compuesta (suma<= 50yprod <= 150)] como se cumple sólo la primera condición, se sale del ciclo mientras 
e imprime: La suma es: 36 El producto es: 225. 



Este ejercicio es similar al ejercicio 6. Fíjese que las condiciones simples del mientras incluyen el operador 
lógico “o”, que servirá para mientras una de las dos condiciones se cumpla vuelva a entrar al ciclo, cuando 
ninguna de las dos condiciones se cumpla se salga del ciclo mientras y esto satisfaga el objetivo del programa, 
pues ambas condiciones se deben cumplir para salirse del ciclo. 



Ejercicios complementarios de la estructura de control repetitiva mientras en pseudocódigo 89 



Se lee el primer número num = 36, como es par, se suma = 0 +36, y queda un valor suma = 36, regresa 
y se revisa la condición compuesta; como se cumplen las dos condiciones vuelve a entrar al ciclo y se 
lee otro número num = 45, como es impar se multiplica prod = 1*45, prod = 45, regresa y se revisa la 
condición compuesta, como se cumplen las dos condiciones vuelve a entrar al ciclo y se lee otro número 
num = 20, como es par se suma y queda suma = 36 + 20, suma = 56, regresa y se revisa la condición 
compuesta, como se cumple la segunda condición aunque la otra no, vuelve a entrar al ciclo y se lee otro 
número num = 5; como es impar se multiplica prod = 45* 5, prod = 225, regresa y se revisa la condición 
compuesta, como no se cumplen ninguna de las dos condiciones se sale del ciclo mientras e imprime: La 
suma es: 56 El producto es: 225, y cumple de esta manera las especificaciones del programa que la suma sea 
mayor a 50 y el producto mayor a 1 50. 



Ejemplos 

@ 



Una posible salida en pantalla, después de ejecutar el programa sería: dame un número entero 
50 

dame un número entero 
35 

dame un número entero 
12 

dame un número entero 
21 

la suma es: 62 
el producto es: 735 



Ejercicios complementarios de la estructura de control 
repetitiva mientras en 

pseudocódigo 



Pseudocódigos 
Ejercicio 1 

principal () 
inicio 

entero cont 
cont <— 5 

mientras ( cont < 20) 
inicio 

¡mprimir"prueba" 
cont <— cont + 2 
fin 



Contestar las preguntas de cada ejercicio 



a) ¿Cuántas veces se imprime la palabra prueba? 



b) Si no estuvieran las palabras reservadas inicio y fin, ¿cuántas 
veces imprime la palabra prueba? 



c ) Si el cont se incrementa en tres, es decir cont<— cont+3, 
¿cuántas veces se imprime la palabra prueba? 



fin 



90 Capítulo 3 Programación estructurada 



Ejercicio 2 




principal () 


Si realiza una corrida de escritorio con el ejercicio 2. 
¿Con qué valores se quedan las variables a, b, c? 






entero a, b, c 


a) 


a <— 3 


b) 


b<-8 




c <— 4 


c) 


mientras ( a < 65 ) 





inicio 



a t— a * c 




b <— b + a 




c < — c + 1 




fin 




imprimir a,b,c 




fin 





Ejercicio 3 



principal () 


a) ¿Qué realiza el pseudocódigo del ejercicio 3? 


inicio 




entero m 




m <— 3 




mientras ( m < 90 ) 




inicio 


b) ¿Con qué valor se queda la variable m? ¿Por qué? 


imprimir m 




m <— m + 3 




fin 




fin 




Ejercicio 4 




principal () 


a) ¿Qué realiza el pseudocódigo del ejercicio 4? 


inicio 




entero i <— 1 




mientras ( i < 25 ) 




inicio 


b) ¿Con qué valor se queda la variable i? ¿Por qué? 


imprimir i 




i <— i + 1 




fin 




fin 





Ejercicios complementarios de la estructura de control repetitiva mientras en pseudocódigo 



Ejercicio 5. Complete el pseudocódigo y el diagrama de flujo para imprimir todos los múltiplos de 6, entre 
el 20 y el 200 (incluidos). 



principal () 
inicio 

x 

x <— 

mientras ( ) 

inicio 

imprimir 

x<— 

fin 

fin 







Ejercicio 6. Complete el pseudocódigo y el diagrama de flujo para sumar los 50 primeros números enteros 
positivos (1-50). Imprima el resultado. 



principal () 
inicio 

entero , suma <— 0 

¡<-1 

mientras ( ) 

inicio 

suma <— 

i <— ¡ + 1 
fin 

imprimir 

fin 




Capítulo 3 Programación estructurada 



Ejercicio 7. Complete el pseudocódigo y el diagrama de flujo que calcule el producto (multiplicación) de 
los múltiplos de 5, entre 0 y 100 (incluidos). Imprima los múltiplos de 5 y el resultado del producto. 



principal () 
inicio 

entero i <— 5, prod <— 1 

mientras ( i < 

inicio 

imprimir i 
prod<— 



fin 

imprimir 




Ejercicios complementarios de la estructura repetitiva while en 

lenguaje C 



Parte I. Completar el siguiente programa, el cual lee una lista de números y al final imprimir la suma 
acumulada de los primeros 1 0 números pares 

main ( ) 

{ 

int c=l, acum=0, numero ; 

while ( ) 

{ 

printf ( "Escriba un número entero\n” ) ; 



if ( ) 

{ 

acum=acum+numero ; c + + ; 

} 

} 

printf ( "Acumulado de los primeros 10 números pares: %d" , acum) ; 

getch ( ) ; return 0 ; 



Parte II. Elaborar la codificación en lenguaje C de los siguientes programas utilizando la instrucción 
while (realizando el cálculo e impresión respectivos): 

1. Leer una lista de números y calcular el producto acumulado de los primeros 7 múltiplos de 5. Al final 
imprimir la citada acumulación. 



Ejercidos complementarios de la estructura repetitiva whilee n lenguaje C 93 



2. Leer una lista de calificaciones y calcular el promedio, el número de aprobados y reprobados; el programa 
terminará cuando se introduzca un número negativo. 

3. El máximo y el mínimo de una lista de números positivos introducidos por teclado, sabiendo que un 
número negativo termina el ciclo. El negativo no cuenta. 

4. Los términos de la serie de Fibonacci hasta que rebase un valor n (entero y positivo) leído por el teclado. 
En esta serie los dos primeros números son 1, y el resto se obtiene sumando los dos anteriores: 1, 1, 2, 
3,5,8, 13,21... 

5. Conjetura de ULAM: Empiece con cualquier número entero positivo. Si es par divídalo entre 2 y si es 
impar multiplique por 3 y aumente en 1. Calcular e imprimir los números enteros positivos repitiendo el 
proceso hasta llegar a 1. Por ejemplo si empezamos en 5 la serie sería: 5, 16, 8, 4, 2, 1. 

6. Calcular las siguientes series: 

a) 1/1 + 1/2 + 1/3 + 1/4 4-... Un 

b) Pi = 4 - 4/3 + 4/5 - 4/7 + 4/9 - 4/11... 

c) 1-1/2 + 1/4 - 1/6 + 1/8 - 1/10 + 1/12... 

El programa debe parar cuando el último término sumado o restado sea menor de 0.01. 

7. Leer un número entero e imprimir su equivalente en binario, octal o hexadecimal, según elija el usuario. 

8. Conversión de un número arábigo a su respectivo romano. Posteriormente conteste las siguientes 
preguntas: ¿Qué números romanos aparecen una sola vez? ¿Qué números romanos aparecen varias 
veces? ¿Qué diferencia existe entre el if y el while? 

9. Calcular el factorial de un número entero. 

10. Elevar un número real a una potencia entera e imprimir el resultado respectivo. 

11. Calcular la media de un conjunto de n número reales. 

12. Imprimir de forma inversa los números del 100 al 1, con decremento de uno. 

13. Leer un número entero e imprimir si éste es número primo o no. 

14. Leer un número ( n ) mayor que 2 e imprimir los números de la secuencia. 



si n=5: 0+1=1+1=2 + 1=342 = 5. 



Ejemplos 

© 



Parte III. Realizar la prueba de escritorio o corrida a mano de los siguientes programas 



Ejercicio 1 

main ( ) 

{ 

float y=2 , x=2,z=3; 
while (z<25||x<10) 

{ 

if (z<7) z = z+y; 
else { 

y=2*y— 2 ; 
z=z+y ; 
x=y+z ; 

} 

y=z/2 ; 

printf("%f %f %f \n" , x, y , z) ; 

} 

getch ( ) ; return 0 ; 



Ejercicio 2 

main ( ) 

{ 

float a=l, b=2,c=3; 
while (b> = 0) 

{ 

switch (a<c) 

{ 

case 0: a=a— b; 

break; 
case 1: b=c + a; 

c=b/2 ; 
a=a+c ; 
break; 

default: a=c+b*15; 

} 

printf ( " %f , %f \n" , a, c) ; 
} getch ( ) ; return 0 ; 



94 



Capítulo 3 Programación estructurada 



3.6.4 Estructura de control repetitiva 
hacer_mientras (do while) 

Esta estructura le permite al programador especificar que se repita una acción en tanto cierta condición sea 
verdadera; cuando ésta es falsa se sale del ciclo. La condición la revisa después del ciclo o bucle. 

Existen algoritmos y programas que requieren que por lo menos se ejecute el ciclo una vez y al final se 
revise la condición; en este caso utilizamos la estructura hacer_mientras. Es muy semejante al ciclo mientras, 
con la diferencia de que la condición se evalúa después de ejecutar el cuerpo del bucle. Tanto el ciclo mien- 
tras como el hacer_mientras pueden utilizarse cuando no se conoce de antemano el número de veces que se 
repetirá el ciclo. 



Diagrama de flujo 




Pseudocódigo 

Con una instrucción 
hacer 

Inst 1 

mientras (condición) 

Con varias instrucciones 
hacer 
inicio 
Inst 1 
Inst 2 

Inst n 



fin 

mientras (condición) 



Lenguaje C 

Con una instrucción 
do 

Inst 1 

while (condición) 

Con varias instrucciones 
do 



Inst 1 
Inst 2 

Inst n 

} 

while (condición);* 



A diferencia del while, al final del do_while sí lleva punto y coma después de la instrucción while (condición). 

Donde condición es cualquier expresión numérica, relacional o lógica. 

Nota: No es usual que la estructura hacer_mientras (do_while) tenga una sola instrucción, generalmente tiene por lo 
menos dos. 

Características: 

1. Siempre entra por lo menos una vez al ciclo, ya que la condición está después del ciclo. 

2. Si la condición es verdadera entra de nuevo al ciclo y regresa a revisar la condición, hasta que ésta sea 
falsa se sale del bucle. 

3. Debe existir una instrucción dentro del ciclo que modifique la condición, de lo contrario se hace 
infinita. 

4. Si tiene más de una instrucción, necesita obligadamente del inicio-fin ({-}). 

3.6.5 Ejercicios resueltos de la estructura 

de control repetitiva hacer_mientras (do_wh¡le) 

Ejercicio 1 . Imprimir los 10 primeros números enteros positivos. 




3.6 Estructura de control repetitiva o de iteración condicional 



95 



Diagrama de flujo 



Pseudocódigo 




principal () 
inicio 

entero i <— 1 

hacer 

inicio 

imprimir i 
¡<-i + 1 
fin 

mientras ( i < 1 1 ) 



fin 



Lenguaje C 

#include <stdio.h> 
#include <conio.h> 
main ( ) 

{ 

int i = 1; 
do 
{ 

printf ( "%d\n" , i ) ; 
i + +; 

} 

while ( i < 11 ) ; 
getch ( ) ; return 0 ; 



El ejercicio anterior realiza la misma operación que el ejercicio 1 de la estructura mientras, pero ahora utili- 
zando la estructura repetitiva hacer_mientras. Se declara la variable i de tipo entero, se inicializa con el valor 
de 1 ya que es el primer número entero positivo, se entra al ciclo hacer_mientras y se imprime el valor de 
la variable i = 1, se incrementa la variable i en 1, es decir i = 2 y se revisa la condición del hacer_mientras 
(2 < 11). Como la condición se cumple entra al ciclo y se ejecutan las dos instrucciones que están delimita- 
das en el bloque entre inicio-fin ({-}), se imprime el valor de la variable i = 2, se incrementa la variable i en 
1, es decir i = 3, se revisa la condición del hacer_mientras (3 < 11). Como la condición se cumple entra al 
ciclo y se ejecutan las dos instrucciones que están delimitadas en el bloque entre inicio-fin ({-}), se imprime 
el valor de la variable i = 3, se incrementa la variable i en 1, es decir i = 4 y se revisa la condición del ha- 
cer_mientras (4 < 11). Como la condición se cumple entra al ciclo y se ejecutan las dos instrucciones que 
están delimitadas en el bloque entre inicio-fin ({-}) y así sucesivamente hasta que i = 11. Cuando se revisa la 
condición, como ésta no se cumple se sale del ciclo hacer_mientras y termina el programa; esto hace que se 
cumpla la característica 3 de la estructura repetitiva hacer_mientras, para que en un momento dado i tome 
un valor mayor a 10 y se salga del ciclo. El programa imprimirá 123456789 10. El último valor que to- 
ma i es 11 y por lo tanto no se cumple la condición y se sale del ciclo. 

En el ejercicio 2 se inicializa la variable i en 2, ya que es el primer número par, y la variable s en 0 para 
guardar la sumatoria. Entra a la estructura hacer_mientras y se imprime el 2, se suma el 2 a la variable s y que- 
da ésta con un valor de 2, se incrementa i en 2 y queda con 4. Se revisa la condición (4<=50) y es verdadera, 
así que regresa a realizar el bloque de instrucciones pero con el valor de i = 4, imprime 4, sumando 4 a s; ésta 
queda con 6 y se incrementa nuevamente i en 2, que queda con un valor de 6. Realiza repetidamente estas 
tres instrucciones hasta que i sea igual a 50, revisa la condición, es (50<=50), como es verdadera entra por 
última vez al ciclo repetitivo, imprime 50, sumando 50 al valor que tiene en ese momento s, e incrementa i 
en dos. Queda con un valor de 52, se revisa la condición, que es (52<=50), al ser falsa se sale del ciclo ha- 
cer_mientras e imprime el valor final de la suma almacenado en s. 

El programa imprime 2, 4, 6, 8, 10, 12, 14 50, y la suma s igual a 650. 

Nota: En el programa primero entra al ciclo y después revisa si la condición es verdadera, hasta que ésta se hace falsa se 

sale del ciclo e imprime el valor de la suma S. 





Capítulo 3 Programación estructurada 



Ejercicio 2. Imprimir y sumar los números pares entre 1 y el 50, imprimir el resultado de la sumatoria. 



Diagrama de flujo 



Pseudocódigo 



CZD 

principal () 

i <— 2 

s <— 0 inicio 

entero i <— 2, s <— 0 
v hacer 




inicio 

imprimir i 
s <— s + i 
i<-¡ + 2 
fin 

mientras ( i < = 50 ) 
imprimir s 



Lenguaje C 

#include <stdio.h> 
#include <conio.h> 
main ( ) 

{ 

int i = 2, s = 0 ; 
do 
{ 

printf ( "%d\n" , i) ; 
s= s + i; 
i = i + 2 ; 

} 

while ( i <= 50 ) ; 

printf ( "%d\n" , s) ; 
getch ( ) ; return 0 ; 



La corrida a mano o prueba de escritorio sería (en cursivas negritas aparecen los valores que se im- 
primen): 



/ 


¡<=50 


s = s + i 


i 


¡<=50 


s= s + i 


2 




0+2 


28 


V 


182 + 28 = 210 


4 


V 


2+4=6 


30 


V 


210+30=240 


6 


V 


6+6=12 


32 


V 


240+32 = 272 


8 


V 


12+8=20 


34 


V 


272 + 34=306 


10 


V 


20+10=30 


36 


V 


306+36=342 


12 


V 


30+12=42 


38 


V 


342 + 38 =380 


14 


V 


42+14=56 


40 


V 


380+40=420 


16 


V 


56+16=72 


42 


V 


420+42=462 


18 


V 


72+18 = 90 


44 


V 


462+44=506 


20 


V 


90+20 = 110 


46 


V 


506+46=552 


22 


V 


110+22=132 


48 


V 


552+48=600 


24 


V 


132+24=156 


50 


V 


600+50=650 


26 


V 


156+26=182 


52 


F 





Ejercicio 3. Calcule la sumatoria de un conjunto de números, mientras el número que se capture en cada 
ciclo sea diferente de 0. Al final imprimir el resultado respectivo. 





3.6 Estructura de control repetitiva o de iteración condicional 



97 



Pseudocódigo 

principal () 
inicio 

entero num, acum 
acum <— 0 
hacer 
inicio 

imprimir"Dame un Número Entero: " 
leer num 

acum <— acum + num 
fin 

mientras (num <> 0) 
¡mprim¡r"Acumulación = ", acum 



acum <— acum + num 







Lenguaje C 

#include <stdio.h> 

#include <conio.h> 
main ( ) 

{ 

int num, acum; 
acum = 0 ; 
do 
{ 

printf("Dame un Número Entero: "); 

scanf ( "%d" , &num) ; 
acum = acum + num; 

} 

whi 1 e ( num ! = 0 ) ; 

printf ( "Acumulación = %d" , acum) ; 

getch(); return 0; 

} 



Una posible salida en pantalla, 
después de ejecutar el programa 
sería: 

Dame un Número Entero: 5 
Dame un Número Entero: 6 
Dame un Número Entero: 4 
Dame un Número Entero: 2 
Dame un Número Entero: 0 
Acumulación = 17 



Diagrama de flujo 



acum<— 0 




En el ejercicio 3 la variable acum es un acumulador, el cual cumple con las dos características antes mencio- 
nadas: se inicializó con 0 (acum <— 0 ) antes del entrar al ciclo hacer_mientras y la variable aparece a los dos la- 
dos de la asignación dentro del ciclo (acum <— acum + num). En cada vuelta del ciclo se lee un número (num) 
y se va acumulando, por lo tanto se realiza la sumatoria de los números capturados hasta que se capture el 





98 Capítulo 3 Programación estructurada 



número cero, ya que la condición se hará falsa y se rompe el ciclo. En el ejemplo del recuadro capturamos 
diferentes valores para num comenzando con 5, dicho número se suma al 0, como el 5 es diferente de 0, la 
condición es verdadera y da otra vuelta y así sucesivamente repetirá el proceso con los demás números hasta 
que se capture el 0 y obtenga la acumulación final, y por lo tanto imprime: Acumulación = 17. 

Ejercicio 4. Introducir un número entero y contar cuántos dígitos tiene. 

En el ejercicio 4 la variable contador c se inicializa con 0, leemos un número entero num, el cual asignamos 
a la variable numl; para no perder el valor de num, dicha variable en cada vuelta es dividida entre 10 tantas 
veces hasta que desaparece, esto debido a que la numeración que utilizamos es base 10. 




En el ejemplo capturamos el número 1234, en la primera vuelta el número se divide entre 10 y num=123 
ya que sólo almacena la parte entera; el contador c = 1, la condición (num>=l) es decir (123>=1) es ver- 
dadera; en la siguiente vuelta dividimos 123 entre 10 y num=12y c = 2-, la condición (12>=1) es verdadera. 
Seguirá dando vueltas hasta que num se hace 0, en ese momento la condición (num>=l) es falsa y por lo 
tanto se rompe el ciclo. Imprime: El Número Tiene 4 Dígitos. La corrida a mano o prueba de escritorio es: 



c = 0 


num <— 1234 




Número de ciclo 


num<—num/10 


c < — C + 7 


1 


1234/10 = 123 


0 + 1=1 


2 


123/10 = 12 


1+1=2 


3 


12/10 = 1 


2+1=3 


4 


1/10 = 0 


3+1=4 



3.6 Estructura de control repetitiva o de iteración condicional 



99 



Ejercicio 5. Adivinar en un máximo de cinco oportunidades un número entero comprendido entre 1 y 1 00. 
En cada ciclo la computadora dirá si el número que capturó el usuario es mayor o menor que el número 

de la computadora. Al final si adivinó el número, imprimir: "Felicidades lo lograste en intentos", y si 

no imprimir "Lástima, suerte para la próxima". 




En el ejercicio 5 se utiliza la constante nmaq, que sirve para que el programador pueda capturar un número 
y éste pueda ser adivinado por el usuario; la variable c servirá de contador para las cinco oportunidades y la 
variable nusuario para almacenar los números que el usuario vaya introduciendo para adivinar el correcto; 
la variable c se inicializa con 0. Por ejemplo, si el primer número que el usuario captura es nusuario= 10 se 
compara con el valor de la constante nmaq, como éste es menor se imprime Tu número es Menor al Mío, 
se incrementa la variable c en 1, quedando con valor 1, y se revisa la condición mientras (10017 y 1<5); 
como ambas condiciones se cumplen se repiten las instrucciones del ciclo, si el segundo número que el usua- 
rio captura es nusuario=18 se compara con el valor de la constante nmaq, como éste es mayor se imprime 
Tu número es Mayor al Mío, se incrementa la variable c en 1 y queda con valor 2, se revisa la condición com- 
puesta mientras (18017 y 2<5), como ambas condiciones se cumplen se repiten las instrucciones del ciclo; 
si el tercer número que el usuario captura es nusuario=17 se compara con el valor de la constante nmaq, 
como el número no es menor ni tampoco mayor, no imprime nada pero sí se incrementa la variable c en 1 y 
queda con valor 3, se revisa la condición compuesta mientras (17017 y 3<5); la primera condición no se 
cumple ya que son iguales pero la segunda condición sí; por lo tanto la condición compuesta es falsa (ya que 
están utilizando el operador lógico y donde ambas se tienen que cumplir para que sea verdadero), se sale del 
ciclo hacer_mientras e imprime Felicidades lo lograste en 3 Intentos. Si después de cinco intentos no logra 
adivinar el valor, el valor de la variable c = 6 y la condición compuesta será: (4017 y 6<5), donde se cumple 
la primera condición pero no la segunda; la condición compuesta es falsa y se sale del ciclo hacer_mientras. 

si nusuario=4, revisa la condición (nusuario = nmaq), donde (4= 17), la cual es falsa, el programa imprime 

Lástima, suerte para la próxima. 



Ejemplos 



100 Capítulo 3 Programación estructurada 



Nota: Es recomendable utilizar letras mayúsculas como identificadores de constantes y minúsculas como 
identificadores de las variables. 

A diferencia del pseudocódigo, en lenguaje C utilizamos las funciones srand() y rand() para generar 
números aleatorios. 




Nota: Vea el ejemplo anterior en turbo C, en el capítulo de programación modular. 



La función rand() 

En C, para generar números aleatorios utilizamos la función rand(); cada vez que la llamamos nos devuelve 
un número entero aleatorio entre 0 y el rand_max. La constante RAND_MAX está definida en la librería 
stdlib.h. Veamos un ejemplo: 



Ejemplos 



#include <stdlib.h> 



numero = rand ( ) % 26; //número aleatorio entre 0 y 25 
numero = rand ( ) % (N + 1); //número aleatorio entre 0 y N 



3.6 Estructura de control repetitiva o de iteración condicional 



101 



La operación módulo (%) nos da el resto de dividir rand() entre 26. Este resto puede ir de 0 a 25. De la misma 
forma, el módulo de rand() entre N+l va de 0 a N. 

De manera general si el rango está entre 25 y 100 (donde D es mayor que I). Primero generamos un 
número entre 0 y 75 y le sumamos 25 (un número entre 0 y D— 1 y le sumamos 1: 

numero = rand () % 76 + 25; // Valores entre 25 y 75 
numero = rand () % (D — I +1) + I; // Este está entre I y D 



La función srandO 

Si ejecutamos varias veces nuestro programa, la secuencia de números aleatorios se repite. Para evitar este 
problema tenemos la función srand(), a la que se le pasa de parámetro un número que se utilizará como nú- 
mero inicial. En nuestro ejemplo utilizamos el reloj de la computadora con la función time(). Sólo debemos 
llamarla una vez en nuestro programa. 

Ejercicio 6. Inidalizcir un contador con 25, imprimir el letrero programación hasta que dicho contador sea 
menor que 1 2; el contador se irá decrementando de tres en tres. 



Pseudocódigo 



principal () 
inicio 

entero c <— 25 

hacer 

inicio 

imprimir "programación" 
c <— c - 3 
fin 

mientras (c > 12) 



fin 



Lenguaje C 

#include <stdio.h> 
#include <conio.h> 
main ( ) 

{ 

int c = 25; 
do 



printf ( "programación\ii" ) ; 
C = C — 3 ; 

} 

while (c > 12) ; 
getch ( ) ; return 0 ; 



El ejercicio 6 utiliza una variable c, la cual se inicializa en 25, entra al ciclo hacer_mientras e imprime la pa- 
labra programación, se decrementa en tres a la variable y queda c= 22, se revisa la condición del mientras 
(c>12), es decir (22>12). Como la condición se cumple se repite el bloque de instrucciones que se encuen- 
tran delimitadas entre el inicio y fin del hacer_mientras, entra al ciclo hacer_mientras e imprime la palabra 
programación, se decrementa en tres a la variable y queda c= 19, revisa la condición del mientras (c>12), 
es decir (19>12). Como la condición se cumple se repite el bloque de instrucciones que se encuentran deli- 
mitadas entre el inicio y fin del hacer_mientras, entra al ciclo hacer_mientras e imprime la palabra progra- 
mación, decrementa en tres a la variable y queda c=16, revisa la condición del mientras (c>12), es decir 
(16>12). Como la condición se cumple se repite el bloque de instrucciones que se encuentran delimitadas 
entre el inicio y fin del hacer_mientras, entra al ciclo hacer_mientras e imprime la palabra programación, 
decrementa en tres a la variable y queda c=13, revisa la condición del mientras (c>12), es decir (13>12). 
Como la condición se cumple se repite el bloque de instrucciones que se encuentran delimitadas entre el 
inicio y fin del hacer_mientras, entra al ciclo hacer_mientras e imprime la palabra programación, se de- 
crementa en tres a la variable quedando c= 10, se revisa la condición del mientras (c>12), es decir (10>12). 
Como la condición no se cumple se sale del ciclo hacer_mientras y termina el programa, es decir, imprime 
cinco veces la palabra programación. 



102 Capítulo 3 Programación estructurada 



Ejemplos 



Ejercicio 7. Sumar los números pares y multiplicar los números impares hasta que la suma sea mayor que 
50 o el producto mayor que 1 50. 




Este ejercicio es igual que el ejercicio 6 de la estructura mientras, sólo que en este ejercicio del hacer_mien- 
tras se revisa si el número es par o impar y, dependiendo de este resultado, lo suma o lo multiplica; fíjese que 
la condición compuesta del mientras incluye el operador lógico “y”, que servirá para que cuando una de las 
dos condiciones ya no se cumpla se salga del ciclo mientras y esto satisfaga el objetivo del programa que es 
cuando alguna de las dos se cumpla y se salga del ciclo. 

Se lee el primer número num = 16, como es par, se suma = 0+16, queda un valor suma = 16, y se revisa 
la condición compuesta (16 <=50 y 1<= 150). Como se cumplen las dos condiciones vuelve a entrar al ciclo 
y se lee otro número num = 45, como es impar se multiplica prod = 1*45, prod=45 y se revisa la condición 
compuesta, como se cumplen las dos condiciones de (16<=50 y 45<= 150), vuelve a entrar al ciclo y se lee 
otro número num = 20, como es par se suma y queda suma = 16 + 20, suma = 36, se revisa la condición 
compuesta (36<=50 y 45<=150). Como se cumplen las dos condiciones vuelve a entrar al ciclo y se lee 
otro número num = 5, como es impar se multiplica prod = 45*5, prod=225, se revisa la condición compuesta 
(36<= 50 y 225<= 150), como se cumple una condición (36<=50) y otra no (225< = 150) se sale del ciclo 
hacer_m¡entras e imprime: La suma es: 36 El producto es: 225. 



Ejercicios complementarios de la estructura de control repetitiva hacer_m¡entras e n pseudocódigo 103 



Ejercicios complementarios de la estructura de control 
repetitiva hacer_mientras en 

pseudocódigo 



Pseudocódigos 
Ejercicio 1 

principal () 
inicio 

entero cont <— 3 

hacer 

inicio 

imprimir"Examen" 
cont <— cont + 4 
fin 

mientras ( cont < 25 ) 
fin 



Contestar las preguntas de cada ejercicio 

a ) ¿Cuántas veces se imprime la palabra Examen? 



b) Si no estuvieran las palabras reservadas inicio y fin ¿cuántas 
veces imprime la palabra Examen? 



c ) Si fuera cont=cont +3 ¿cuántas veces imprime la palabra 
Examen? 



Ejercicio 2 a) Completar el programa para que se impriman todos los 

múltiplos de 8, entre el 10 y el 250 

principal () 
inicio 

m <- b) ¿Con qué valor se queda al final la variable m? ¿Por qué? 

hacer 

inicio 

imprimir 

m <— 

fin 

mientras! ) 



Ejercicio 3 Si realizas una corrida de escritorio con el ejercicio 3, ¿con qué 

valores se quedan las variables a, b? 

principal () 

el 

inicio 

entero a <— 3, b <— 7 b 

hacer 

inicio 

a <— a * b 
b <— b + a 
fin 

mientras ( a < 70 ) 
imprimir a, b 



fin 



104 Capítulo 3 Programación estructurada 



Ejercicio 4 a) ¿Qué realiza el pseudocódigo del ejercicio 4? 

principal () 

inicio 

entero m 
m <— 5 

hacer b) ¿Con qué valor se queda la variable m? ¿Por qué? 

inicio 

imprimir m 
m <— m + 5 
fin 

mientras ( m < 100 ) 



Ejercicio 5. Complete el pseudocódigo y el diagrama de flujo para imprimir y multiplicar los 50 primeros 
números pares. Imprimir el producto final. 



principal () 
inicio 

hacer 

inicio 

imprimir 

pro<— 

n <— 

fin 

mientras ( 



. n<— 2 , pro <— 1 



imprimir"producto =" pro 




F pro 



CD 



fin 



Ejercicios complementarios de la estructura de control repetitiva hacer_m¡entras en pseudocódigo 



Ejercicio 6. Complete el pseudocódigo y el diagrama de flujo que calcule la suma de los múltiplos de 5 , 
entre 0 y 100. Imprimir en pantalla los múltiplos de 5 y el resultado de la suma. 



principal () 
inicio 

x<— 5, suma ^0 

hacer 

inicio 

imprimir 

suma <— 

x <— 

fin 

mientras ( ) 

imprimir 

fin 




CZD 



Ejercicio 7. Complete el pseudocódigo y el diagrama de flujo que imprima 1 5 veces la palabra "Adiós". 



principal () 
inicio 

i<-1 

hacer 

inicio 

imprimir 

i <— 

fin 

mientras ( ) 



CD 



¡<- 1 




i <— 



fin 



Capítulo 3 Programación estructurada 



Ejercicios complementarios de la estructura de control 
repetitiva do-while en 

lenguaje C 



Parte I. Realizar la prueba de escritorio o corrida a mano de los siguientes programas 

Ejercicio 1 Ejercicio 2 



main ( ) main() 

{ { 

int x = 0; int a=l, b=2, c=2; 



do 



do 



X = X + 1 ; 

X = X * X ; 

printf ( "%d\n" , x) ; 

} 

while (x <= 55) ; 
getch ( ) ; return 0 ; 

} 



if(b%3!=0)c = c*2; 
else{ 

a=b+c ; 
c = a* (c— b) ; 

} 

b=b+a; 

printf ( "%d, %d\n" ,b, c) ; 
}while (c<50 II b<20) ; 
getch ( ) ; 

} 



Ejercicio 3 

main ( ) 

{ 

int i = 2, j=l, k=10; 
printf ( "%d, %d\n" , i, k/2+i*2); 

do 

{ 

if (k< = 10 ) 

{ 

j=50-i*2; Í + =2; 

} 

k + — i ; i + = 10; 

printf ("%d, %d\n",i, k/2+i*2); 

} 

while (i<20 &&j>45); getch(); return 0; 



Ejercicio 4 

main ( ) 

{ 

int a = 10 , b = 10 , c = 4 ; 

do 

{ 

if (a>5) 

{ 

a/=2; b— C+2 ; 

} 

else a=c*2; 
c=b+a%5 ; 

printf ( "%d, %d\n" , a, c) ; 

} 

while (a<30&&;C<100) ; getch(); return 0 ; 



} 



} 



Ejercicios complementarios de la estructura de control repetitiva do-while en pseudocódigo 107 



Parte II. Elaborar la codificación en lenguaje C de los siguientes programas utilizando la instrucción 
do_while (realizando el cálculo e impresión respectiva): 



1. Imprimir los cuadrados de los 25 primeros números enteros divisibles entre 7. 

2. Leer un número entero de 3 dígitos (validar la captura respectiva, sólo valores entre 1 y 999) y separarlo 
en unidades, decenas y centenas. 

3. Simular una ruleta (números aleatorios entre 0 y 38). Dejará de girar cuando se genere el cero. En cada 
vuelta contará por separado pares y nones. Al final imprimir los resultados. 

4. Las potencias de 2 son: 1, 2, 4, 8, 16,... Para obtener la siguiente potencia se multiplica la anterior por 2. 
Imprimir la primera potencia de 2 que pasa de 700. 

5. Leer dos números enteros y calcular su producto con el algoritmo ruso. Para calcular el producto de 45 
y 15 se obtendrá: 22-30, 2-240, Producto = 675. 

6. De acuerdo con un principio aritmético un número es múltiplo de 3 cuando la suma de sus cifras da un 
múltiplo de 3. Con base en este principio imprimir si un número es múltiplo de 3. 

7. Leer un número e imprimir cuántos dígitos son impares y cuántos son pares. 



Si N= 26455, imprimirá: el número tiene 3 dígitos pares y 2 impares. 



Ejemplos 

© 



8. Calcular el M.C.D y el M.C.M. de dos números leídos. 

9. Generar dos números aleatorios entre 0 y 99, imprimir dichos números en forma de resta (por ejemplo: 
25 — 10 = ), y leer el resultado respectivo. En caso de ser correcto imprimir “Felicidades, tu resultado es 

correcto”, en caso contrario imprimir “Lo siento, el resultado era: ”. El proceso se llevará a cabo hasta 

que el alumno conteste correctamente. 

10. Calcular el factorial de un número entero. 

11. Elevar un número real a una potencia entera. 

12. Calcular la media de un conjunto de n número reales. 

13. Imprimir de forma inversa los números del 100 al 1, con decremento de uno. 

14. Leer un número entero e imprimir si éste es número primo o no. 



3.6.6 Estructura de control repetitiva desde (for) 

El desde (for) es la estructura repetitiva más utilizada y simple de manejar, ya que repite un conjunto de ins- 
trucciones un número determinado de veces. Una de sus aplicaciones principales son los arreglos. 



Diagrama de flujo 




Pseudocódigo 

Con una instrucción 
desde (expr_¡ni(s),cond,inc(s)) 
Inst 1 

Con varias instrucciones 
desde (exprJni(s),cond,inc(s)) 
inicio 

Inst 1 
Inst 2 

Inst n 
fin 



Lenguaje C 

Con una instrucción 
for (expr_ini (s) ; cond; inc (s) ) 
Inst 1 

Con varias instrucciones 
for (expr_ini (s) ; cond; inc (s) ) 
{ 

Inst 1 
Inst 2 

Inst n 

} 



108 



Capítulo 3 Programación estructurada 



donde: 

expr_ini(s): expresión(es) de asignación que se utilizan para iniciar la(s) variable(s) de control del bucle. 
cond: es una expresión relacional o lógica (booleana) que determina cuándo finalizará el ciclo o bucle. La 
condición puede ser simple o compuesta (una o varias). 
inc(s): define cómo cambiará(n) la(s) variable(s) de control cada vez que se repite el bucle o ciclo. 

Las tres componentes pueden tener una o varias instrucciones, las cuales deben ir separadas por comas. La 
cond nos lleva al valor final. 

Omisión de expresiones 

Cualquiera de los componentes en los paréntesis se puede omitir, incluso los tres, pero los separadores coma 
(punto y coma) deben aparecer siempre. 

Las tres expresiones del bucle desde (for) se pueden omitir, con el siguiente resultado: 



Se omite 


Resultado 


Expresiónjnicial 

Condición 

Incremento o expresión_de_paso 


No se hace nada antes del bucle 
La condición es siempre cierta (1 ) 
No se hace nada tras cada iteración 



Ejemplos 

@ 



Pseudocódigo 


Lenguaje C 


desde(,resultado<>-1 ,) 


for 1 


[ ; resultado! = — 1 ; ) 


inicio 


{ 




fin 


} 




desde (,,) 


for 


( ; ; ) 


inicio 


{ 




/* Bucle infinito */ 




/* Bucle infinito */ 


fin 


} 





En la instrucción desde (for), primero se ejecutará la(s) inicialización(es), posteriormente se evaluará la con- 
dición y, en caso de ser verdadera (no cero), se ejecutará(n) la(s) instrucción(es) que compone(n) el ciclo. 
Después, se realizará el incremento(s) y se volverá a verificar la condición. Cuando la condición se vuelve 
falsa, en la siguiente evaluación se terminará el desde (for). Si la condición nunca se vuelve cero, la estructura 
nunca terminará y el ciclo se repetirá indefinidamente hasta que se detenga en forma manual. 

Características: 

1. Se debe conocer por anticipado el valor de la variable inicial y final antes de entrar al ciclo. 

2. La condición se evalúa antes del bloque de instrucciones. Si la condición es verdadera se ejecuta el 
bloque, y si es falsa se sale y pasa el control a la instrucción siguiente al bloque. 

3. No se debe cambiar el valor de la(s) variable(s) de control, del valor inicial ni del valor final dentro 
del ciclo. 

4. Se puede incrementar o decrementar la variable de control según se requiera. 

5. El incremento o decremento de la variable de control es automático. 

6. Sólo si existe más de una instrucción dentro del ciclo desde se necesita el inicio-fin ({-}). 

7. Puede tener una o varias expresiones de inicialización, de condición y de incremento; estas expresiones 
se separan mediante comas en pseudocódigo y con puntos y comas en lenguaje C. 

8. Puede tener alguna o todas las expresiones vacías: desde („)-for ( ; ; ). 

9. Si la condición está vacía, tenemos un bucle infinito. 



3.6 Estructura de control repetitiva o de iteración condicional 



109 



3.6.7 Ejercicios resueltos de la estructura de control 
repetitiva desde (for) 

Ejercicio 1. Imprimir en pantalla los primeros 10 números enteros positivos. 




En el ejercicio 1 antes de entrar al ciclo desde, se declara la variable i, ésta inicia con el valor de 1, se evalúa 
la condición (i<=10), es decir (1<=10), como es verdadera, entra al ciclo e imprime el 1, en seguida la i se 
incrementa en 1 (i<^-i+l) convirtiéndose en 2; en la segunda vuelta se evalúala condición (2< = 10), como es 
verdadera entra al ciclo e imprime el 2, en seguida la i se incrementa en 1 y se convierte en 3; de la tercera a 
la décima vuelta todas las condiciones son verdaderas (3<= 10, 4<=10, 5< = 10, 6< = 10, 7< = 10, 8<=10, 
9<=10, 10<=10) y se imprime 3 4 5 6 7 8 9 y 10; en la décima vuelta después de imprimir el 10, cuando la 
i se incrementa en 1 y vale 11, la condición (11<=10) será falsa y por lo tanto se rompe el ciclo (deja de dar 
vueltas). 

principal () 
inicio 

entero i 

desde (i<- 1 ,¡ < 1 1 ,¡ < — i + 1) 
imprimir i 
fin 



El programa anterior realiza exactamente lo mismo, la diferencia es que las condiciones que revisa son: 
(KU), (2<11), (3<11), (4<11), (5<11), (6<11), (7<11), (8<11), (9<11), (10<11), todas ellas son verda- 
deras y se imprime: 123456789 ylO; en la décima vuelta después de imprimir el 10, cuando la i se incre- 
menta en 1 y vale 11, la condición (11<11) será falsa y por lo tanto se rompe el ciclo (deja de dar vueltas). 
En este programa la variable contador del ciclo es i. Las tres partes del for son: 

La expresión de inicialización es i=l, la condición es (í<=10), dicha condición nos lleva al valor final 
10, y el incremento es i+ +, es decir que a la i en cada vuelta se le suma 1. 

Nota: La instrucción for no debe llevar punto y coma al final del paréntesis: for (i = 1;¡< = 10;¡++) ya que no respetará la 
impresión de i dentro del ciclo, imprimirá el valor de i que rompió el ciclo, en este caso 1 1 . 

Ejercicio 2. Calcule la sumatoria de todos los números entre 1 y el 1 5, e imprima el resultado. 





110 



Capítulo 3 Programación estructurada 



Diagrama de flujo 




Pseudocódigo 

principal () 
inicio 

entero i, suma 
suma <— 0 

desde ( i < — 1, i <= 1 5, i < — i + 1 ) 



suma <— suma + i 



imprimir " La suma es", suma 



fin 



En el ejercicio 2, antes de entrar al ciclo desde se declaran las variables que se van a utilizar, se le indicará al 
ciclo cuántas veces pasar o entrar (15 veces) y se realizará la instrucción suma = suma + i. Ésta es la única 
instrucción que se repetirá 15 veces ya que el ciclo desde no tiene inicio-fin ({-}), la variable i sirve como 
contador y lleva un control de cuántas veces entra al ciclo desde. 



Ejemplos 

© 



/'empieza en 1,es decir/' = 1, se revisa la condición (¡<=n), como 1 es menor que 15, entra al ciclo y se realiza 
la instrucción suma = suma + i, es decir suma = 0 + 7, y queda en la variable suma = 1, se incrementa /'en uno, 
es decir se queda con el valor de/' = 2. Se revisa la condición (¡<=15), como 2 es menor que 15 entra al ciclo y 
se realiza la instrucción suma = suma + i, es decir suma = 1 +2, queda en la variable suma = 3, se incrementa 
/' en uno, es decir se queda con el valor de 7=3, así sucesivamente hasta que /' = 15. Se revisa la condición 
(i <= 15), como 15 es menor o igual a 15, entra al ciclo y se realiza la instrucción suma = suma + i, es decir 
suma= 105 + 15, queda en la variable suma = 120, se incrementa /' en uno, es decir se queda con el valor de 
/' = 16. Se revisa la condición (7<= 16), como 16 no es menor ni igual a 15, se sale imprimiendo del ciclo desde 
e imprime La suma es 120. 



Ejercicio 2 






3.6 Estructura de control repetitiva o de iteración condicional 111 



En este programa la i es una variable contador ya que en cada vuelta se incrementa de uno en uno (de ma- 
nera constante) y la suma es un acumulador ya que en cada ciclo se incrementa en cantidades variables (los 
valores de i van cambiando). 

Ejercicio 2a 




Existen programas donde nos va a interesar conocer las acumulaciones parciales; a diferencia del ejer- 
cicio 2, en el 2a se imprimen los valores de la sumatoria parcialmente, ya que la impresión está dentro del 
ciclo. 

Ejercicio 3. Calcule la sumatoria de todos los números entre 1 y un número leído por el usuario (n) e impri- 
ma el resultado. 



Pseudocódigo 



principal () 
inicio 

entero I, suma, n 
suma t— 0 

imprimir "Dame un número entero 
leer n 

desde ( i <— 1, i <= n, i <— i + 1) 
suma <— suma + i 
imprimir" La suma es", suma 
fin 



Lenguaje C 

#include <stdio.h> 

Una posible salida en 
ttinclude <conio.h> pantalla, después de 
main ( ) ejecutar el programa 

sería: Dame un número 
{ entero 9 La suma es 45 

int i , suma = 0 , n ; 
printf("Dame un número entero "); 
scanf ( "%d" , &n) ; 
for ( i = 1 ; i<=n; i + + ) 
suma +=i; 

printf("La suma es %d" , suma) ; 
getch ( ) ; return 0 ; 




112 Capítulo 3 Programación estructurada 



Este ejercicio 3 es similar al ejercicio 2, la diferencia es que antes de entrar al ciclo desde se lee un número y 
se guarda en la variable n, esto le indicará al ciclo cuántas veces pasar o entrar y realizar la instrucción suma 
= suma + i. Ésta es la única instrucción que se repetirá n veces ya que el ciclo desde no tiene inicio-fin ({-}), 
la variable i sirve como contador y para llevar un control de cuántas veces entra al ciclo desde. 



Ejemplos 



Si n = 6, i empieza en 1, es decir i = 1, se revisa la condición (i<=n), como 1 es menor que 6, entra al 
ciclo y se realiza la instrucción suma = suma + i, es decir suma = 0 + 7, y queda en la variable suma = 1, 
se incrementa i en uno, es decir se queda con el valor de i = 2. Se revisa la condición (¡<=n), como 2 es 
menor que 6, entra al ciclo y se realiza la instrucción suma = suma + i, es decir suma =1+2, quedando 
en la variable suma = 3; se incrementa / en uno, es decir se queda con el valor de i = 3 y así sucesivamente 
hasta que i = 6. Se revisa la condición (¡<=n), como 6 es menor o igual a 6, entra al ciclo y se realiza la 
instrucción suma = suma + i, es decir suma =15 + 6 y queda en la variable suma =21; se incrementa i en 
uno, es decir se queda con el valor de i = 7; se revisa la condición (i <=n), como 7 no es menor ni igual a 6, 
se sale imprimiendo La suma es 21. 



Ejercicio 4. Imprimir todas las letras del alfabeto en mayúsculas. 




En el ejercicio 4 la variable contador, en este caso letra, también puede ser un carácter; en este ejemplo en 
la primera vuelta la variable letra inicia con el valor de A, se evalúa la condición (letra< = 'Z). Observe que 
el valor del carácter letra se escribe entre apóstrofos: A’, es decir (A’ < ‘Z), como es verdadera entra al ciclo 
e imprime la A, en seguida la letra se incrementa en 1 (letra <— letra 4-1) y se convierte en B. En la segunda 
vuelta se evalúa la condición (‘B’< = ’Z’), como es verdadera entra al ciclo e imprime la B, en seguida la letra 
se incrementa en 1 (letrat— letra+1) y se convierte en Z; continúa con el mismo proceso, e imprime: ABC 
DEF G H1J K LMNOPQRSTUVWXYZ, en la última vuelta después de imprimir Z, cuando la letra 
se incrementa en 1 y vale ' [', aunque se nos haga raro el siguiente carácter es ' [', debido a que seguimos la 
secuencia del código ascii; la condición ('[ '<='Z') será falsa ya que el equivalente sería (91<=90) y por lo 
tanto se rompe el ciclo. El código ascii de la 'A' es 65, de la 'Z' es 90, el siguiente es el carácter especial ' [' 
del cual su código ascii es el 91. 

Nota: No aparece la Ñ debido a que el código ascii es 1 65 y el alfabeto está comprendido entre los códigos 65 y 90, por 

lo que queda fuera de ese rango. 



En lenguaje C es una secuencia de escape que mueve el cursor a la posición siguiente del tabulador ho- 
rizontal (vea anexo A). 




3.6 Estructura de control repetitiva o de iteración condicional 



Ejercicio 5. Imprimir todas las letras mayúsculas del alfabeto de manera invertida (Z,Y,X....A). 



Diagrama de flujo 




Pseudocódigo 



principal () 
inicio 

carácter letra 

¡mprimir"Estas son las letras del alfabeto: " 
desde (letra*— 'Z', letra >= 'A', letra *— letra — 1) 
imprimir letra 



fin 



Lenguaje C 

#include <stdio.h> 

#include <conio.h> 
main ( ) 

{ 

char letra; 

printf ( "Estas son las letras del alf abeto : \n" ) ; 

for ( letra = ' Z ' ; letra >= ' A' ; letra ) 

printf ( "%c\t" , letra) ; 
getch ( ) ; 
return 0 ; 

} 



En este ejercicio, al igual que en el anterior la variable contador es un carácter; en este ejemplo en la primera 
vuelta la variable letra inicia con el valor de Z, se evalúa la condición (letra>='A), es decir 'Z’ > A como 
es verdadera entra al ciclo e imprime la Z, en seguida la variable letra se decrementa en 1 (letra*— letra — 1) 
y se convierte en Y; en la segunda vuelta: se evalúa la condición (Y>= "A), como es verdadera entra al ciclo 
e imprime la Y, en seguida la letra se decrementa en 1 (letra*— letra — 1) y se convierte en Z; continúa con 
el mismo proceso e imprime: ZYXWVUTSRQPONMLKJIHGFEDCB A; en la última vuelta 
después de imprimir A, cuando la letra se decrementa en 1 y vale aunque se nos haga raro el siguiente 
carácter es debido a que seguimos la secuencia del código ascii, la condición (’@’ >='A') será falsa ya 
que (64>=65) y por lo tanto se rompe el ciclo. 



114 Capítulo 3 Programación estructurada 



Ejercicio 6. Imprimir en pantalla la tabla de multiplicar de cualquier número entero (n). 




En este ejercicio primero se pregunta el número de tabla que se desea imprimir y se guarda en la variable 
n, entra al ciclo desde, en el cual por cada valor que toma i lo usa y lo multiplica por el número que capturó 
el usuario y se almacenó en n, nótese que el resultado no se guarda en una variable, sólo se manda a imprimir 
n *i. 



Ejemplos 



La diferencia entre el ejercicio 6 y el 6a es que en lenguaje C no sólo imprimimos el resultado de la expresión 
n*i, sino toda la tabla con: printf(“%d*%d=%d\n”,i,n,n*i); 

Ejercicio 7. Elevar un número X a una potencia Y e imprimir el resultado. 



Si n = 5 entra al ciclo desde y la variable / se ¡niciallza en 1, como se cumple la condición de (1 <=10), 
entra al ciclo e imprime n * i, es decir 5*1, sólo que primero realiza la multiplicación y muestra solamente 
el valor 5, incrementa i en 1 y queda 2. Como se cumple la condición de (2 <=10), entra al ciclo e 
imprime n * i, es decir 5*2, el valor impreso será el 10 y así sucesivamente hasta que la variable i tome el 
valor de 10; es la última vez que se cumple la condición de (10<=10), entra al ciclo e imprime n* i, es decir 
5*10, el último valor que imprima será el 50. Así se imprimirán en pantalla los valores 5 10 15 20 25 30 35 
40 45 50. 



Pseudocódigo 

principal () 
inicio 

entero cont,x,y,res<— 1 

imprimir"Escriba el número que se elevará a una potencia: "; leer x 
imprimir"¿A qué potencia elevará el número?"; leery 
desde (cont<— 1, cont<=y, cont<— cont+1) 
res<— res * x 

imprimir "El "x,' 'elevado a la potencia ",y," es: "res 
fin 



En este ejercicio se declaran las variables x, que equivale a la base, y la potencia a la cual se desea elevar la 
base, cont para llevar el control del ciclo desde y res, que estará almacenando los valores parciales en cada 
vuelta del ciclo y cuando termine y se salga del ciclo el valor final de la operación, es decir la potencia res se 



3.6 Estructura de control repetitiva o de iteración condicional 115 



inicializa con 1 ya que se realiza en cada vuelta del ciclo un producto o multiplicación; si no se inicializara en 
1 (uno) el valor sería 0 (cero) y la instrucción res<— res * x sería siempre 0 (cero), res<— 0 *1 = 0, por esta razón 
se inicializan siempre las variables que almacenarán productos en 1. Se le pregunta al usuario el valor de la 
base, se almacena en x el valor de la potencia y se almacena en y, el cont se inicializa en 1, en el ciclo desde, 
teniendo en cuenta que el último valor que tomará el cont será igual al de la potencia, para entrar al ciclo. En 
este programa escribimos dos instrucciones en una sola línea, por lo que las separamos con punto y coma. 



Si x = 2 y y = 4, se inicia el ciclo desde (contal, cont <=4, cont<—cont + 1), es decir se multiplicará el 
valor de x cuatro veces y cada resultado parcial se estará almacenando en la variable res. En la primera 
vuelta se compara la condición (cont <=y), es decir (1 <=4). Como la condición se cumple entra al 
ciclo desde y se realiza la operación restares * x, sustituyendo valores res<—l *2=2, se incrementa 
el conten 1 , así que toma el valor de cont= 2, se revisa la condición (cont<=y), es decir (2<=4). Como 
la condición se cumple entra al ciclo desde y se realiza la operación res<— res * x, sustituyendo valores 
res<— 2 *2 = 4, se incrementa el cont en 1, así que toma el valor de cont = 3, se revisa la condición 
(cont <=y), es decir (3<=4). Como la condición se cumple entra al ciclo desde y se realiza la opera- 
ción res<— res * x, sustituyendo valores res<— 4 *2=8, se incrementa el cont en 1, así que toma el valor 
de cont = 4, se revisa la condición (cont <=y), es decir 4 <=4. Como la condición se cumple entra al 
ciclo desde y se realiza la operación restares * x, sustituyendo valores res<— 8 *2 = 16, se incrementa 
el conten 1, así que toma el valor de cont= 5, se revisa la condición (cont<=y), es decir (5 <=4). Como 
la condición no se cumple se sale del ciclo desde y se imprime: El 2 elevado a la potencia 4 es: 16. 



Ejemplos 



Lenguaje C 

#include <stdio.h> 

#include <conio.h> 
main ( ) 

{ 

int cont, x, y, res=l; 

printf ( "Escriba el número que se elevará a una potencia: "); 

scanf ( "%d" , &x) ; 

printf ("¿A qué potencia elevará el número %d ? ",x); scanf ( "%d" , &y) ; 
for (cont = l ; cont<=y; cont++) 
res=res*x; 

printf ("El %d elevado a la potencia %d es: %d\n'',x, y, res); getch(); 
return 0 ; 

} 



Ejercicio 8. Calcular el factorial de un número entero e imprimir el resultado. 




116 Capítulo 3 Programación estructurada 



El factorial de un número es el producto del mismo número y de todos los valores menores a él hasta llegar 
a la unidad, es decir si se desea el factorial de 4!= 4 * 3 * 2 *1 teniendo como resultado 24; el último valor, el 
1. En este ejercicio las variables i, x son de tipo entero pero la variable fact deberá ser entero largo ya que 
el factorial de 8 es 40320 y no se puede almacenar en un número entero que alcanza hasta el valor 32637. 
Primero se pregunta a qué número se le quiere calcular el factorial y se guarda en la variable x, se entra al 
ciclo desde y la variable i se inicializa con el mismo valor de x, es decir toma el valor del número al que se le 
quiere calcular el factorial. 



Ejemplos 

@ 



Six = 4,/se inicializa con ese valor, /= 4, se revisa la condición del ciclo, que es (i>1), es decir (4>1), como 
se cumple se realiza la instrucción fact = fact *i, al sustituir los valores fact =1*4 y queda en la variable 
fact = 4, se decrementa i en 1 y queda i = 3, luego se revisa la condición del ciclo, que es (¡>1), es decir 
(3>1), como se cumple, se realiza la instrucción fact = fact *¡ al sustituir los valores fact = 4* 3 y queda 
en la variable fact = 12, se decrementa / en 1 y, queda i = 2. Se revisa la condición del ciclo, que es (i > 1), 
es decir (2>1), como se cumple, se realiza la instrucción fact = fact*i sustituyendo los valores fact = 12* 
2, y queda en la variable fact = 24, se decrementa /'en 1, queda i = 1, se revisa la condición del ciclo, que 
es (i >1), es decir (1 >1), como no se cumple, se sale del ciclo y se imprime la siguiente instrucción 
que se encuentra después del ciclo desde: El factorial de 4 = 24. 




Ejercicio 9. En un salón de clases seleccione a los alumnos que se integrarán al equipo de basquetbol; 
las características para la selección son: para el equipo varonil que su altura sea mayor a 1 .75 y para el 
femenil que su altura sea mayor que 1 .65. Imprimir del grupo de clases cuántos fueron los seleccionados. 




3.6 Estructura de control repetitiva o de iteración condicional 



117 



En este ejercicio las variables eqvar y eqfem se inicializan con 0, ya que servirán como contadores. Se utiliza 
el ciclo repetitivo desde para hacer la encuesta entre los alumnos de una clase, preguntando primero el total 
de alumnos y almacenándolo en la variable alum; entra al ciclo desde y a cada alumno se le pregunta su altura 
y su sexo guardándolo respectivamente en las variables alt y sexo; la variable alt es real ya que la mayoría de 
los alumnos miden entre 1.50 y 1.95; y la variable sexo es de tipo carácter, ya que almacenaremos “M” si el 
alumno es masculino y “F” si es femenino. Primero revisamos el sexo; si es masculino entra a la parte verda- 
dera de la estructura selectiva y evalúa la otra condición, para verificar la altura (alt>1.75). Si esta condición 
se cumple se incrementa el contador del equipo varonil en uno, eqvar eqvar +1; si el sexo no es masculino 
“M” se entenderá que es femenino “F" y se pasará a la parte falsa de la primera condición, es decir al si no y se 
evaluará la condición (alt >1.65), si esta condición se cumple se incrementa el contador del equipo femenil 
en uno, eqfem eqfem+1; todo esto se realizará por cada uno de los alumnos ya que al terminar de revisar 
la condición se incrementa i en uno i=2 y se regresa al ciclo desde y le pide los datos al segundo alumno, así 
sucesivamente hasta terminar con el último alumno. 



"Dame el número de alumnos del salón de clases?", 5, la variable alum= 5. Al primer alumno se le 
pregunta "Dame la altura y el sexo del alumno", alt 1.80 y sexo= "M" se cumple la primera condición del 
sexo y también la condición de la altura, así que el eqvar=0+ 1 = 1; e I segundo alumno captura alt 1.60 
y sexo = "F", como no se cumple la primera condición del sexo pasa al si no, y no se cumple la condición 
de la altura así que el eqfem = 0 ; el tercer alumno captura alt 1 .68 y sexo= “F", no se cumple la primera 
condición del sexo así que pasa al si no y se cumple la condición de la altura, así que el eqfem=0+ 1 = 1; 
el cuarto alumno captura alt 1.67 y sexo= “M", se cumple la primera condición del sexo pero no la 
condición de la altura así que el eqvar se queda Igual con eqvar=1; el quinto alumno captura alt 1.72 y 
(sexo = “F"), no se cumple la primera condición del sexo así que pasa al si no pero se cumple la condición 
de la altura, así que el eqfem= 1 + 1 =2, si vemos la variable i = 6, cuando revisa la condición del desde no 
se cumple y se sale del ciclo e imprime El total de alumnos seleccionado para el equipo varonil es 1 . El 
total de alumnos seleccionado para el equipo femenil es 2. 



Ejemplos 



Lenguaje C 

#include <stdio.h> 
#include <conio.h> 
main ( ) 



int i, alum, eqvar, eqfem; 

float alt; 

char sexo; 

eqvar = eqfem = 0; 

printf ( "¿Dame el número de alumnos del salón de clases?"); 

scanf ( "%d" , íialum) ; 

for (i = 1; i <= alum; i + + ) 

{ 

printf ("Dame la altura del alumno %d: ",i); 

scanf ( "%f " , &alt) ; 

printf ("Dame su sexo : "); 

f f lush (stdin) ; sexo=getchar ( ) ; 

if ( sexo = = 'M' | | sexo= = 'm') 



{ 


if 


(alt > 1.75) eqvar = eqvar +1; } 










else 

} 

printf ( ’ 


if 


(alt 


> 1.65 ) eqfem = eqfem +1; 










"El 


total 


de alumnos seleccionado para 


el 


equipo 


varonil es: 


%d\n" , eqvar) 


printf ( ' 


“El 


total 


de alumnos seleccionado para 


el 


equipo 


femenil es: 


%d " , eqfem) 


getch ( ) , 


; return 


0; 











118 Capítulo 3 Programación estructurada 



En lenguaje C se pueden inicializar varias variables con el mismo valor: eqvar = eqfem = 0, se le llama so- 
brecarga de operadores. Como hemos visto, el lenguaje C en ocasiones tiene problemas con el formato %c 
para las cadenas, por lo que hubo necesidad de utilizar las funciones fflush (stdin) y getchar(). Las llaves son 
necesarias para indicar que el else es de la condición del sexo. 

3.6.8 Casos especiales del for 

Esta sección se verá sólo en lenguaje C, ya que los casos especiales son propios de dicho lenguaje. 

Recuerde la sintaxis: for (expr_ini(s); cond ;inc(s)) 

Como se comentó anteriormente en el for pueden faltar alguna o todas las expresiones, pero deben per- 
manecer los signos de punto y coma. Los siguientes dos ejemplos son equivalentes: 



Ejemplos 



Ejemplo 1 

#include <conio.h> 

#include <stdio.h> 
main ( ) 

{ 

int i=l, suma=0; 
for ( ; i < — 1 0 ; + + i) suma + = 
printf ( "%d\n" , suma) ; 
getch(); return 0; 

} 



Ejemplo 2 

#include <conio.h> 

#include <stdio.h> 
main ( ) 

{ 

int i=l, suma=0; 

for (; i< = 10 ;) suma += i + +; 

printf ( "%d\n" , suma) ; 

getch ( ) ; return 0 ; 

} 



Recuerde que i+ + equivale a decir: úsala y luego increméntala (vea el capítulo 2). 

Cuando falta la expresión cond, se le supone valor verdadero siempre y se forma un ciclo infinito, como 
lo apreciamos en el ejemplo 3a); en el ejemplo 3b) vemos la versión corregida: 



Ejemplos 



Ejemplo 3a) 

#include <conio.h> 

#include <stdio.h> 
main ( ) 

{ 

int i=l, suma=0; 
for ( ; ; ) 

{ suma += i + + ; 

printf ( "%d\n" , suma); 

} 

getch(); return 0; 

} 



Ejemplo 36) 

#include <conio.h> 

#include <stdio.h> 
main ( ) 

{ 

int i=l, suma=0; 
for ( ; i < — 1 0 ; ) 

{ suma += i + +; 

printf ( "%d\n" , suma) ; 

} 

getch (); return 0; 

} 



for (i = 1; i <= 100; i + +); //provoca un retardo de 100 ciclos. 

El operador coma"," 

Es un operador binario para expresiones : expresionl, expresion2, ... y se utiliza tanto en expr_ini(s), cond, 
como en inc(s): 

Se evalúa primero “expresionl”, después “expresion2” y así sucesivamente, 
en expr_ini(s) podemos tener: suma = 0, i = 1 



Ejemplos 





3.6 Estructura de control repetitiva o de iteración condicional 119 



Se suele usar en las sentencias “ for “ porque permite hacer asignación múltiple de valores iniciales y proce- 
samiento múltiple de incrementos. 

Los ejemplos 1 y 2 los podemos escribir de la siguiente forma: 

Ejemplo la) Ejemplo 2a) 

for (suma = 0, i = l; i< = 10; + + i) for ( suma=0 , i = l ; i< = 10 ; suma += i, ++i) 

suma += i; printf ( "%d\n" , suma) ; 

printf ( "%d\n" , suma) ; 

3.6.9 Ejercidos resueltos de la estructura de control 
repetitiva en casos especiales desde (for) 

Ejercicio 1. Imprimir la suma de los primeros 3 enteros pares y la de los primeros 3 enteros impares: 

#include <stdio.h> 

#include <conio.h> 
main ( ) 

{ int par=0, impar=0; 

for (int c = l, p = 2, i = l; c< = 3; C + +, p + = 2, i + = 2) 

{ 

par+=p; 
impar + = i ; 

} 

printf ("%d, %d\n" , par, impar) ; 
getch ( ) ; return 0 ; 

} 



En el ejercicio 1 inicializamos los acumuladores par e impar con cero, ya que acumularemos sumandos. 
Declaramos e inicializamos las variables c, p e i dentro del for. La variable c es un contador que comienza 
en 1 y termina en 3 (total de pares e impares que se imprimirán). La variable p representa los valores pares 
comenzando con 2 y la variable i representa los valores impares comenzando con 1. Como la c inicia con 1 la 
condición (1<=3) es verdadera entra al ciclo, calculando los valores de par=0+2=2 e ímpar=0+l=l. Se 
incrementa en 1 la variable c, como la condición (2< =3) es verdadera entra al ciclo, calculando los valores de 
par=2+4=6 e impar=l+3=4. Se incrementa de nuevo en 1 la variable c, la condición (3<=3) es verdadera 
entra al ciclo, calculando los valores de par=6+6=12 e impar=4+5=9. Se incrementa de nuevo en 1 la 
variable c, la condición (4<=3) es falsa por lo que se rompe el ciclo y se imprimirá 12, 9. 

Ejercicio 2. Imprimir el alfabeto alternando mayúsculas y minúsculas: Aa, Bb, Ce, Dd, Ee, Ff, Gg, Hh, li, 
J¡, Kk, LI, Mm, Nn, Oo, Pp, Qq, Rr, Ss, Tt, Uu, Vv, Ww, Xx, Yy, Zz. 

Lenguaje C 

#include <stdio.h> 

#include <conio.h> 
main ( ) 

{ 

char carácter, c; 

for (caracter= 'a' , c= ' A' ; caracter<= ' z ' ; caracter+ + , c + + ) 

{ 

printf ( "%c" , c) ; 
printf ( "%c , " , carácter) ; 

} 

getch (); return 0; 



Ejemplos 



120 



Capítulo 3 Programación estructurada 



En este ejercicio inicializamos la variable carácter con la a minúscula y la variable c con la A mayúscula. 
Como la letra a es menor que la letra z en el código ascii, la condición es verdadera por lo que entra al ciclo 
imprimiendo Aa. Se incrementan en uno las variables carácter y c, tomando los valores de b y B, respectiva- 
mente; como la letra b es menor que la letra z en el código ascii, la condición es verdadera por lo que entra 
al ciclo imprimiendo Bb. Se repetirá el proceso con todas las letras hasta que llegue a la letra z minúscula 
imprimiendo Zz. Cuando se incrementan de nuevo la variable carácter toma el valor de (siguiente carác- 
ter en el código después de la z minúscula). Dicho carácter es mayor a la z, por lo que se rompe el ciclo y el 
programa termina. 




Ejercicios complementarios de la estructura de 
control repetitiva desde en 

pseudocódigo 



Ejercicio 1 . Completar el ejercicio para calcular la serie armónica e imprimir el resultado. 



S=1 + Vi+V3+V« + .... +1/d 

principal () 

inicio 

entero i, d 

serie 

serie <— 0 

imprimir" Dame el número del denominador" 
leer 

desde (te- 1, i <— i +1) 

serie <— 

imprimir "La serie armónica es", 




Si d = 5 con qué valores se quedan las variables i y serie, 



Ejercidos complementarios de la estructura de control repetitiva desde un pseudocódigo 



Ejercicio 2. Complete el siguiente pseudocódigo y el diagrama de flujo para que se impriman en pantalla 
los números pares entre 1 y 300 y los vaya acumulando (sumando) en una variable. Que se imprima en 
pantalla el resultado de la suma. 



principal () 
inicio 

entero i, suma<— 0 

desde ( i <— 2, i < = , i <— i + ) 

inicio 

imprimir 

suma <— + i 

imprimir” La suma es", suma 
fin 
fin 




Ejercicio 3. Complete el siguiente pseudocódigo y el diagrama de flujo para encontrar el número mayor 
entre un conjunto de 10 números enteros positivos. Que se imprima en pantalla el número mayor. 



principal () 
inicio 

entero i, , may <— 0 

desde (i<— , i <=10, i <— i + 1) 

inicio 

imprimir" Dame el número? " 
leer n 

sil ) 

may <— 



fin 

imprimir" El número mayores", may 



fin 




122 Capítulo 3 Programación estructurada 



Ejercicio 4. Complete el siguiente pseudocódigo y realice el diagrama de flujo para calcular e imprimir las 
10 primeras potencias de un número n. 

principal () 
inicio 

entero cont, , 

pote— 1 

imprim¡r"Escriba el número que se elevará a una potencia:" 
leerx 

desde (cont<— 1 , cont < = , cont<— cont + 1 ) 

inicio 

pote- * x 

imprimir"EI",x, "elevado a la potencia", ,"es:", 

fin 

fin 

Ejercicio 5. Complete el siguiente pseudocódigo y realice el diagrama de flujo para calcular el promedio 
entre un conjunto de m materias. 

principal () 
inicio 

entero m, 

real cal, sum, 

sum <— 0 

imprimir"Dame el número de materias cursadas" 
leer m 

desde ( ) 

inicio 

imprimir"Dame la calificación de la materia" , i 
leer 

sume- sum + 

fin 

prom e- 

imprimir" El promedio es ", 



fin 



Ejercicios complementarios de la estructura de control repetitiva /bren lenguaje C 123 



Ejercicios complementarios de la estructura de control repetitiva /oren 

lenguaje C 



Parte I. Detectar y marcar los errores del siguiente programa, el cual suma los 100 primeros números 
enteros positivos 

float main() 

{ 

int contador , suma=l ; 

f or (contador= = l ; contador< =100 ; Contador+ — ) ; 

suma = suma+contador ; 
printf("La suma es : %d",suma); 
getch ( ) ; 

} 

Parte II. Completar el siguiente programa, el cual imprime las 10 primeras potencias de un número x 



main ( ) 

{ 

float base, ; 

int contador; 

printf ( "Introduzca el número para imprimir sus 10 primeras potencias\n" ) ; 
scanf ( "%f " , &base) ; 

for (contador=l ; ;contador+ + ) 

{ 



printf ("El resultado es: %. 2f\n" , resultado) ; 

} 

getch (); return 0; 

} 

Parte III. Elaborar la codificación en lenguaje C de los siguientes programas utilizando la instrucción 
for (realizando el cálculo e impresión respectiva): 

1. Leer n números e imprimir cuántos son positivos, cuántos negativos y cuántos fueron cero. 

2. Imprimir los números del uno al cien excepto los múltiplos de 7, es decir: 1 2 3 4 5 6 8 9 10 11 12 13 15 
16 17 1819 20 22... 

3. Leer n números enteros y calcular la suma, promedio, producto, el mayor y el menor. 

4. Leer n números e imprimir el mayor de los múltiplos de 5 leídos y el menor de los múltiplos de 3 leídos. 

5. Calcular el promedio de los números múltiplos de 9 que hay de 45 a 194. 

6. Imprimir la tabla del código ascii, valor decimal, carácter, hexadecimal y octal (vea el anexo D). 

7. Imprimir un marco de asteriscos alrededor de la pantalla, dichos asteriscos aparecerán de diferente 
color, de manera lenta y en el sentido de las manecillas del reloj. 



124 Capítulo 3 Programación estructurada 



Ejemplos 



8. Leer el número (n) de asteriscos de una línea e imprimir en el centro de la pantalla una línea horizontal. 

9. Leer 2 coordenadas (validarlas), la primera es la esquina superior izquierda y la segunda la inferior 
derecha. Dibujar un marco de asteriscos con los datos proporcionados. 

10. Generar los primeros treinta números de la serie de Fibonacci. 

11. Generar aleatoriamente 5 operaciones aritméticas consecutivas; los números (aleatorios) sobre los que 
se realizan las operaciones deben estar comprendidos entre 1 y 10 y las operaciones aritméticas (también 
aleatorias) permitidas serán suma, resta, multiplicación y división (en el caso de la división se realizará 
siempre una división entera y el primer número tendrá que ser mayor al segundo). Al final imprimir el 
número de aciertos y la calificación correspondiente. 

5 x 9 = 45 
1 6 + 4 = 23 
6*3=18 
36 - 7 = 4 
6/3 = 2 



Tuviste 3 aciertos, tu calificación es 60. 

12. Calcular los cuadrados, los cubos y las raíces cuadradas de los números del 1 al 9 y que utilice tabuladores 
para imprimir la siguiente tabla de valores: 



Número 


Cuadrado 


Cubo 


Raíz cuadrada 


1 


1 


1 


1 


2 


4 


8 


1.414 


3 


9 


27 


1.732 


9 


81 


729 


3 



13. Introducir el número de alumnos de un grupo y contabilizar por separado en qué sector de Guadalajara 
viven o si en su defecto viven en otro municipio; para tal efecto se desplegará un menú con las siguientes 
opciones : 

R) Reforma 
H) Hidalgo 
L) Libertad 
J) Juárez 
O) Otro municipio 
¿Dónde vives? 



Ejercicios complementarios de la estructura de control repetitiva /bren lenguaje C 125 



14. Suponer que se tiene un conjunto de notas finales de un grupo de 40 alumnos. Calcular e imprimir el 
promedio de las notas, la calificación final más alta y más baja de todo el grupo. 

15. Imprimir una tabla de dos columnas para la conversión entre las temperaturas en grados Fahrenheit 
—comprendidas entre 10 °F y 200 °F, según incrementos de 15 °F— y su equivalente en grados Celsius. 
La conversión para grados Celsius es: 



V _ 5*(°F— 32) 
9 



16. Calcular el promedio de los cuadrados de los números comprendidos entre 1 y un número n dado 
(inclusive). Es decir: 



promedio 



1 2 +2 2 H hn 2 

n 



17. Para n términos, calcular las siguientes series (donde sea necesario leer el valor de x): 

a) 1/2 + 3/4 + 7/8 + 15/16... 

b) 5/6 + 11/12 + 23/24,... 

c) (x - l) 2 + (x - 3) 4 + (x - 5) 2 + (x - 7) 4 + 

d) ... 

2 3 4 

18. Leer dos números enteros (el primer número tendrá que ser mayor que el segundo) y calcular su 
producto mediante sumas sucesivas. 

19. Leer un número entero positivo y averiguar si es perfecto. Un número es perfecto cuando es igual a la 
suma de sus divisores excepto él mismo. 28 es perfecto, porque 28 = 1 + 2 + 4 + 7 +14. 



1 40 = 1 *2*2*5*7, MFP = 7; 1 3860 = 2*2*3*3*5*7*1 1 , MFP = 1 1 . 



Ejemplos 



20. Leer una secuencia de n números y posteriormente determinar: 

a) El mayor de los que son múltiplos de 5 y el menor de los que son múltiplos de 3 

b) La suma de los pares y el producto de los que son múltiplo de 7 

21. Leer la fecha de nacimiento de una persona (día, mes, año) e imprimir el número de días vividos por esa 
persona hasta la fecha actual. También calcular cuántos años bisiestos han pasado. El cálculo se hará sólo 
para personas que nacieron después del año 0, y antes del 2100. 

Parte IV. Realizar la prueba de escritorio o corrida a mano de los siguientes programas: 

Ejercicio 1 Ejercicio 2 

main() main() 

{ { 



( continúa ) 



126 Capítulo 3 Programación estructurada 



{' continuación ) 

int i , j , x; 

i= j=i; 

for (x— 2 ; x< = 15;x=x+3) 

{ 

j+= i; 

i= j+x/2; 

printf ("%d, %d\n" , i, j); 

} 

getch ( ) ; 
return 0 ; 

} 



Ejercicio 3 

main ( ) 

{ 

int i,j=l,k=l; 

for (i=10; i>l; i=i— 2) 

{ 

if ( j +k<10) j=j*2 + i; 
else j/=2; 
k=i%j; 

printf ( "%d, %d\n" , j , k) ; 

} 

getch ( ) ; 
return 0 ; 

} 



int a=l, b=l, c; 
for (c = 2 ; C< = 10 ; C+ = 2 ) 

{ 

if (a<10) { 

a+ = c ; 
b=c+b%2 ; 

} 

else b=c+a*2; 
a — — 2 ; 

printf ( "%d, %d\n" , a, b) ; 

} 

getch ( ) ; return 0 ; 

} 

Ejercicio 4 

main () 

{ 

int x, y=3, z=3 ; 

for (x=3; x<13; x=x+2) 

{ 

if (y>7) 

{ 

y=Z%X*2; Z + =4; 

} 

else { 

z=3*x+y; y+=2; 

} 

printf ( "%d, %d\n" , y, z); 

} getch ( ) ; return 0 ; 

} 



3.6.10 Ciclos anidados 

En esta sección nos dedicaremos a los ciclos anidados, ya que anteriormente vimos los anidamientos con el 
si (if) y el segun_sea (switch). 

En un algoritmo puede haber varios bucles. Éstos pueden ser anidados o independientes. 

Dentro de las instrucciones que se pueden incluir en un ciclo se encuentran, a su vez, otros ciclos, es 
decir, instrucciones mientras (while), hacer -mientras (do-while),y desde (for). Este tipo de construcciones, en 
las que se incluye una instrucción de repetición dentro del cuerpo de otra, se conoce como iteración anidada. 



3.6 Estructura de control repetitiva o de iteración condicional 127 



En una iteración anidada, en cada iteración del ciclo exterior se completa un grupo de iteraciones del 
ciclo interior. Considere, por ejemplo, el siguiente fragmento de código: 

for(i=l; i<=2; i++) 
for(j=l;j<=3;j++) 
printf(“%d %d\n”, i, j); 

El ciclo exterior se ejecutará dos veces, haciendo variar la variable i por los valores 1, 2. En cada una de estas 
iteraciones se ejecutará un ciclo de tres iteraciones (el desde (for) interior), en el que se variará la variable j por 
los valores 1, 2, 3. De esta forma, por cada valor que toma la variable i, la variable j tomará todos sus valores. 
Así, la instrucción printf se ejecutará seis veces (2X3); de la misma manera lo hicimos en el ejemplo 10. 

Es posible anidar cualquier cantidad de instrucciones de iteración, prácticamente hasta que la imple- 
mentación del compilador lo soporte. Sin embargo, demasiados niveles de anidamiento pueden volver el 
programa difícil de leer. 

3.6.1 1 Ejercicios resueltos utilizando ciclos anidados 

Ejercicio 1 . Elevar un número X a una potencia Y, preguntándole al usuario si desea realizar el cálculo de 
otra potencia. 




El ejercicio 1 utiliza dos estructuras de control repetitivas: el mientras para saber si desea realizar otra po- 
tencia, y el desde para elevar un número a una potencia. La lógica para elevar un número X a una potencia 
y se explica en el ejercicio 7, así que nos centraremos en la explicación de la estructura repetitiva mientras. 
Se incorpora una variable centinela llamada resp, la cual se declara de tipo carácter ya que almacenará una S 
si desea realizar otra potencia y una N si desea terminar el programa. Se inicializa la variable resp = ‘S’ para 
que entre por lo menos una vez a realizar el cálculo de la potencia; al terminar el ciclo desde se sale de éste y 
se imprime el resultado del primer cálculo. 



128 Capítulo 3 Programación estructurada 



Ejemplos 



Si x = 2 y y = 4, imprime La potencia es: 16, y se le pregunta al usuario si desea realizar otra vez el programa 
con la instrucción imprimir "desea realizar otra potencia S / N" y se espera la respuesta del usuario, la cual se 
almacena en la variable resp con la instrucción ieerresp; la siguiente instrucción es el fin del ciclo mientras, la 
cual regresa a revisar la condición del mientras (resp = 'S'), si el usuario eligió S, vuelve a solicitarse datos de 
la base y la potencia y se realiza otra vez el cálculo de la potencia, pero si eligió N, se sale del ciclo mientras 
y se termina el algoritmo y programa. Cabe mencionar que se inicia nuevamente la variable rest— J, ya que 
de lo contrario se queda la variable res con el valor que se haya tomado de la corrida anterior, en este caso 
almacena el res = 16y el resultado sería incorrecto. 



Una posible salida en pantalla, después de ejecutar el programa sería: 

Escriba el número que se elevará a una potencia: 3. 

A qué potencia elevará el número: 3. 

El 3 elevado a la potencia 3 es: 27. 
desea realizar otra potencia S / N S. 

Escriba el número que se elevará a una potencia: 2. 

A qué potencia elevará el número: 4. 

La potencia es: 16. 

desea realizar otra potencia S / N N. 

Ejercicio 2. Calcular el factorial de un número entero y preguntar al usuario si desea realizar otra vez el 
cálculo de un factorial. 



Pseudocódigo 



principal () 
inicio 

entero i, x 
enterolargo fact 
carácter resp 
hacer 
inicio 

fact <— 1 

imprimir" Dame un número" 
leer x 

desde (i<— x, i > 1 , i < — i - 1 ) 
fact<— fact * i 

imprimir " El factorial de", x ," = " fact 
imprimir"Deseas realizar otro cálculo S/N" 
leer resp 
fin 

mientras (resp = 'S') 



Lenguaje C 

#include <stdio.h> 
#include <conio.h> 
int main() 

{ 

int i, x; 
long fact; 
char resp; 
do 



} 



fact =1; 

printf("Dame un número: ") ; 

scanf ( "%d" , &x) ; 

for (i= x; i > 1; i ) 

fact=fact * i; 

printf("El factorial de %d = 
printf ( "Deseas realizar otro 
scanf ( "%s" , &resp) ; 



%ld\n" , x, fact) ; 
cálculo S/N “) ; 



while (resp =='S'); 
getch ( ) ; 
return 0 ; 



fin 



} 



3.6 Estructura de control repetitiva o de iteración condicional 



129 



El ejercicio 2 utiliza dos estructuras de control repetitivas el hacer_mientras para saber si desea realizar otro 
factorial, y el desde para realizar el cálculo del factorial. La lógica para calcular el factorial se explica en el 
ejercicio 8 de la estructura desde, así que nos centraremos en la explicación de la estructura repetitiva hacer_ 
mientras. Se incorpora una variable resp, la cual se declara de tipo carácter ya que almacenará una S si desea 
realizar otro factorial y una N si quiere terminar el programa. Se inicia el programa y se pregunta el número 
para calcular su factorial?, se realiza el cálculo, se sale del ciclo desde y se imprime El factorial de 5 es 120, 
se le pregunta al usuario si desea realizar otra vez el programa con la instrucción imprimir “Desea realizar 
otro cálculo del factorial S /N” y se espera la respuesta del usuario, la cual se almacena en la variable resp con 
la instrucción leer resp. La siguiente instrucción es el fin del ciclo hacer_mientras y la siguiente instrucción 
mientras (resp = 'S'), si el usuario eligió S, vuelven a solicitarse datos para calcular el factorial y se realiza otra 
vez el cálculo, pero si escogió N, se sale del ciclo mientras y se termina el programa. Cabe mencionar que si 
eligió S se inicia nuevamente la variable fact<r-l, ya que de lo contrario se queda la variable fact con el valor 
que se haya tomado de la corrida anterior, es decir fact= 120 y el resultado sería incorrecto. 

Ejercicio 3. Realizar las tablas de multiplicar del 1 al 1 0 hasta el múltiplo 1 5. 



Pseudocódigo 


Lenguaje C 






ftinclude 


<stdio . h> 




ftinclude 


cconio . h> 


principal () 


main ( ) 




inicio 


{ 




entero i, j 


int i , 


j ; 


desde ( i<— 1 , i < = 1 0, i <— i + 1 ) 


for ( 


i — 1 ; i < = 1 0 ; i + + ) 


inicio 


{ 




imprimir" La tabla del número", i es:" 


printf("La tabla del número %d es:\n",i); 


desde (j <— 1,j <= 1 5, j <— j + 1) 


for 


(j = 1; j <= 15; j+ + ) 


imprimir i," j =", i * j 


printf("%d * %d = %d\n" , i , j , i* j ) ; 




getch ( ) ; return 0 ; 


fin 


} 




fin 


} 





Para poder imprimir las 10 tablas de multiplicar se necesitan dos ciclos desde anidados, el primer ciclo desde 
(i<— 1, i <= 10, i i — i + 1) para cada tabla, ya que a la variable i se le asigna 1 para que se imprima la tabla 
del 1, i tomará el valor de 2 para imprimir la tabla del 2 y así sucesivamente hasta que i tome el valor de 10 
e imprima la última tabla. El segundo desde sirve para imprimir los 15 múltiplos de cada tabla. Dentro del 
primer ciclo desde, la primera instrucción es imprimir “la tabla del número", i, “es:”, para que nos muestre en 
pantalla “la tabla del número 1 es:”, y la siguiente instrucción es desde (j 1, j < = 15, j *—j + 1), éste utiliza 
un contador j para cada múltiplo e inicializa con 1, para multiplicar e imprimir el resultado de 1 * 1 = 1, se 
incrementa j en 1, para multiplicar e imprimir el resultado de 1 * 2 = 2, se incrementa j en 1, para multiplicar 
e imprimir el resultado de 1 * 3 = 3, así sucesivamente hasta que j tome el valor de 15 imprima el resultado de 
1*15 = 15; como la variable j ya llegó a su valor final j < = 15, se sale del ciclo desde interno y regresa al ciclo 
desde afuera, donde i toma el valor de 2, y se repite todo el ciclo de adentro para i = 2 “la tabla del número 
2 es:”; la siguiente instrucción es desde (j <— 1, j <= 15, j <— / + 1), donde j inicializa otra vez en uno, para 
multiplicar e imprimir el resultado de 2 * 1 = 2, se incrementa j en 1 para multiplicar e imprimir el resulta- 
do de 2 * 2 = 4, se incrementa j en 1 para multiplicar e imprimir el resultado de 2 * 3 = 6, así sucesivamente 
hasta que j tome el valor de 15 e imprima el resultado de 2 * 15 = 30; como la variable j ya llegó a su valor 
final j < = 15, se sale del ciclo desde interno, y regresa al desde externo. Estas operaciones las hará hasta haber 
impreso las 10 tablas de multiplicar, es decir que se imprima la tabla del 10 hasta el múltiplo 15. 

Las instrucciones del desde i necesitaron inicio y fin, ya que como vimos ejecuta dos instrucciones: el 
imprimir y el desde. El segundo desde (anidado) no necesita inicio y fin ya que sólo ejecuta una instrucción. 



130 Capítulo 3 Programación estructurada 



Ejercicio 4. Imprimir un triángulo de asteriscos n filas. 




En el ejercicio 4, tenemos dos ciclos anidados desde (for). Declaramos tres viables enteras: i, j, nfila; en se- 
guida se pide el número de filas (en nuestro ejemplo capturamos 4). Para entender el proceso en los ciclos 
anidados haremos la corrida a mano: 



1 

1 

2 

2 

2 

3 

3 

3 

3 

4 
4 
4 
4 
4 



j 

1 

2 

1 

2 

3 

1 

2 

3 

4 
1 
2 

3 

4 

5 



imprimir"*" 
printf ("*"); 

* 

Se rompe 

* 

* * 

Se rompe 

* 

* * 

* * * 

Se rompe 

* 

* * 

* * * 

* * * * 

Se rompe 



saltojinea 
printf ("\n"); 

No 

Sí 

No 

No 

Sí 

No 

No 

No 

Sí 

No 

No 

No 

No 

Sí 



Como podemos apreciar la variable i inicia con 1 hasta llegar a total de filas {nfila), ya que controla los ren- 
glones. La variable j inicia con 1 hasta llegar el valor de la variable i, ya que controla las columnas. Cada vez 
que se rompe el ciclo j salta renglón imprimiendo los asteriscos en el siguiente renglón. 

En este ejemplo es necesario que el ciclo para la variable i lleve inicio-fin ({-}), debido a que tiene dos 
instrucciones: el for para la variable j y el salto de línea. 



Ejercicios complementarios utilizando ciclos anidados 



131 




Ejercicios complementarios utilizando 



ciclos anidados 



Elaborar la codificación en lenguaje C de los siguientes programas utilizando los ciclos anidados 
(realizando el cálculo e impresión respectiva): 

1. Simular el comportamiento de un reloj digital, escribiendo la hora, minutos y segundos de un día desde 
las 0:00:00 horas hasta las 23:59:59 horas 

2. Calcular los primeros 20 números primos. 

3. Imprimir todos los números primos entre 2 números ingresados por el teclado. Ejemplo: Los números 
primos entre 5 y 15 son 5, 7, 11, 13. 

4. Generar los 4 primeros números perfectos. 

5. Generar de los primeros 40 números (del 1 al 40) sus factores primos. 

6. Imprimir el abecedario en forma inversa es decir de la z a la a y luego vaya eliminando de una letra en 
una empezando por la z hasta que quede la a: 

zywvtsrqponmlkjihgfedcba 
ywvtsrqp onmlkj ihgfedcba 
wvtsrqponmlkjihgfedcba 

rqponmlkjihgfedcba 

qponmlkjihgfedcba 

ponmlkjihgfedcba 

edcba 

deba 

cba 

ba 

a 

7. Leer un carácter y dependiendo del carácter leído obtener una pirámide con el alfabeto 

si el carácter fue 'c', se imprimirá: 

A 
Bb 
Ccc 

8. Leer un nombre y con él llene toda la pantalla, luego, solicite las coordenadas filal, columnal (F1,C1) y 
fila2, columna2 (F2,C2), en ese rectángulo que se forma con las coordenadas, se debe limpiar sólo esa 
parte de la pantalla. 



Ejemplos 

@ 



132 Capítulo 3 Programación estructurada 



Ejemplos 

® 



Ejemplos 



Ejemplos 

® 



9. Leer un número e imprimir un triángulo de asteriscos. 

Si N = 5, imprimirá: 

* 

* * * 

***** 

******* 



10. Leer un número e imprimir los triángulos de asteriscos de la anchura que especifica el número. 
Si n es 5, los triángulos serían: 



* 

* * 

* * * 

* * * * 

* * * * * 



* * * * * 
* * * * 
* * * 
* * 
* 



* * * * * 
* * * * 

* * * 

* * 



* * 
* * * 
* * * * 
* * * * * 



11 . 



Leer el ancho (número impar) de un rombo e imprimirlo con asteriscos. Si el ancho = 7. 



* 



12. Leer un número e imprimir una pirámide con los números consecutivos. 

Si n = 16: 

1 

2 3 

4 5 6 

7 8 9 10 

11 12 13 14 15 
16 

13. Leer un número e imprimir una pirámide de dígitos. 



Si N = 5, imprimirá: 
1 

1 2 1 
1 23 2 1 
1234321 
123454231 



Ejemplos 



Ejercicios complementarios utilizando ciclos anidados 133 



14. Leer un número e imprimir una pirámide de dígitos. 



Si N = 5, imprimirá: 

1 

232 

34543 

4567654 

567898765 

15. Leer un número e imprimir los rombos de la anchura que especifica el número. 
Si n = 4, los rombos serían: 



1 

1 2 
1 2 3 

12 3 4 

1 2 3 

1 2 
1 



Ejemplos 



Ejemplos 



16. Leer un número mayor que 0 y menor que 10 e imprimir en pantalla triángulos de base igual al número 
introducido y dispuestos como se muestran en las siguientes figuras. 



Introduzca un número entre 0 y 1 0: 4. 
1 

2 2 2 

3 3 3 3 3 

4 4 4 4 4 4 4 

3 3 3 3 3 

2 2 2 

1 



4 4 4 4 4 4 4 

3 3 3 3 3 

2 2 2 

1 

2 2 2 

3 3 3 3 3 

4 4 4 4 4 4 4 



Ejemplos 

® 



17. Imprimir en una pantalla las 10 tablas de multiplicar. 

18. Leer 10 números e imprimir la suma de los que sean primos. 

19. Leer un número positivo e imprimir las sumas de números enteros positivos consecutivos que den el 
número introducido. 50 = 8 + 9 + 10 + 11 + 12; 50 = 11 + 12 + 13 + 14. 

20. Leer un número y calcular su factorización. Al final imprimir el máximo factor primo (MFP) obtenido. 
Se entiende por factorización de un número, el conjunto de números primos por el que es divisible, 
incluyendo aquellos que se repiten. 



Capítulo 




Arreglos 




Al término de este capítulo, 

el alumno será capaz de 
<§) ^ 

Manejar variables que almacenan más de un 
valor e identificará en qué casos utilizar los 
arreglos unidimensionales y bidimensionales 
para la resolución de problemas. 



Contenido 

« 

4.1 Definición 

4.2 Arreglos unidimensionales (vectores o lis 
tas) 

4.3 Arreqlos bidimensionales (matrices o ta 
blas) 




136 Capítulo 4 Arreglos 



4.1 Definición 

i 

Un arreglo es un tipo de dato estructurado que almacena en una sola variable un conjunto limitado de datos 
o elementos del mismo tipo. Asimismo, es un conjunto de localidades de memoria contiguas donde la di- 
rección más baja corresponde al primer elemento y la dirección más alta al último. Por sí mismo, el nombre 
del arreglo apunta a la dirección del primer elemento del arreglo. Los datos se llaman elementos del arreglo 
y su posición se numera consecutivamente: 1, 2, 3 ...n. Un arreglo en lenguaje C inicia en la posición cero, 
por lo tanto el i-ésímo elemento está en la posición ¿-1, es decir si el arreglo llamado a tiene n elementos, sus 
nombres son a[0], a[l], a[n-l]. El tipo de elementos almacenados en el arreglo puede ser cualquier tipo 
de dato. 

Para acceder a un elemento específico de un arreglo se usa un índice o subíndice. 

Un arreglo se caracteriza por: 

1. Ser una lista de un número finito de n elementos del mismo tipo. 

2. Almacenar los elementos del arreglo en memoria contigua. 

3. Tener un único nombre de variable que representa a todos los elementos y éstos se diferencian por un 
índice o subíndice. 

4. Acceder de manera directa o aleatoria a los elementos individuales del arreglo, por el nombre del arreglo 
y el índice o subíndice. 

La importancia de declarar arreglos de tamaño adecuado 

Al igual que cualquier variable, los arreglos ocupan espacio en memoria. El programador especifica el tipo 
de dato y el total de elementos requerido por el arreglo de tal forma que la computadora pueda reservar la 
cantidad apropiada de memoria. Si el programador declara un arreglo de 100 elementos de tipo entero y sólo 
utiliza 10 espacios, desperdicia 90 en memoria para datos de tipo entero. Por lo contrario, si se declara un 
arreglo de 50 elementos y se quieren manejar 100, faltarán 50 espacios; sin embargo, no se presentará men- 
saje de error en el tiempo de compilación o ejecución, sino hasta que el sistema operativo se dé cuenta y por 
lo tanto surja la falla en el programa. 

Se pueden declarar varios arreglos en una sola instrucción y de esta forma reservar la memoria necesa- 
ria. Para reservar 100 elementos para el arreglo a y 50 elementos para el arreglo x, ambos de tipo entero, se 
puede utilizar la siguiente declaración: 



Pseudocódigo 


Lenguaje C 


entero a[1 00], x[50] 


int a [10 0] , x [50] ; 



Los arreglos se clasifican en: 

Unidimensionales (\ 

Bidimensionales (t 

Multidimensionales (i 



(vectores o listas) 

(tablas o matrices) 

(más de dos dimensiones) 



Los más utilizados son los unidimensionales y los bidimensionales-, a continuación se describirá cada uno de 
ellos. 



Ejemplos 



De un vector y una matriz: 





Ejemplos 


Tipo de arreglo 


Espacios en memoria 


Pseudocódigo 


Lengua j e C 






entero lista [4] 


int lista [4] ; 


vector 


4 


real matriz [4] [4] 


real matriz [4] [4] ; 


tabla 


16 




4.2 Arreglos unidimensionales (vectores o listas) 



137 



4.2 Arreglos unidimensionales (vectores o listas) 



Un arreglo unidimensional es un conjunto de n elementos del mismo tipo almacenados en memoria continua 
en un vector o lista. Para acceder a cada elemento del arreglo se requiere de un solo índice o subíndice, el cual 
representa la posición en la que se encuentra. 



Formato para declarar un arreglo unidimensional 



Pseudocódigo 


Lenguaje C 


tipo_dato identif_arreglo[tam_arreglo] 


tipo dato identif arreglo [tam arreglo] ; 



Donde: 



tipo_dato se refiere al tipo de dato de cada elemento del arreglo; puede ser entero, real, carácter, etcétera. 
identif_arreglo es el nombre que representa a todo el arreglo 
tam_arreglo es la cantidad de elementos que contiene el arreglo. 

Si tomamos la declaración del arreglo lista del ejemplo anterior, así se representaría en memoria entero 
lista [4]: 



Posición de la memoria 


1000 


1001 


1002 


1003 


1004 


1005 


1006 


1007 


lista 


0 


1 


2 


3 



Los enteros requieren de dos bytes para almacenarse en memoria; como se muestra, por cada posición se 
requiere de dos localidades de memoria, por ejemplo el 0 ocupa la posición 1000 y 1001. 

La cantidad de arreglos que se pueden declarar dependerá de la memoria libre, que comúnmente es de 
64 Kbytes; esta cantidad puede variar e incluso se puede utilizar más memoria disponible siempre y cuando 
la computadora cuente con ella. 

A continuación se muestra un arreglo de números reales cuyo identificador es x: 



Pseudocódigo 


Lenguaje C 


real x[8] 


f loat x [8] ; 





x[0] 


x[1] 


x[2] 


x[3] 


x[4] 


x[5] 


x[6] 


x[7] 


elementos > 


4.2 


12.0 


3.45 


4.32 


0.31 


51.9 


2.65 


13.0 



posiciones 



Este arreglo contiene ocho elementos almacenados entre la posición (0-7). Para referirnos a un elemento en 
particular dentro del arreglo, especificamos el nombre del arreglo y el número de posición donde se encuen- 
tra ubicado. La posición del arreglo va entre paréntesis cuadrados o corchetes (“[ ]”) para el lenguaje C; según 
el lenguaje de programación será la sintaxis requerida. 

El primer elemento en un arreglo es almacenado en la posición cero para el lenguaje C y en la posición 
uno para el lenguaje Pascal. En este caso trabajaremos el pseudocódigo en C. Por lo tanto el primer elemento 
de un arreglo x se encuentra en la posición cero y se conoce como x [0], el segundo como x [1], el séptimo 
como x [6] y en general, el elemento de orden i del arreglo x será x [í-1], ya que se encuentra en la posición 
¿-1, donde i es un subíndice que sirve para hacer referencia a la posición en el arreglo. Es decir, si alma- 
cenamos en un arreglo las edades de los alumnos de un salón de clases (40), la edad del primer alumno estará 
almacenada en la posición 0, la del segundo en la posición 1 y así sucesivamente hasta la del cuadragési- 
mo alumno en la posición 39. Los identificadores de los arreglos deben tener las características de los iden- 
tificadores del lenguaje. 



138 



Capítulo 4 Arreglos 



Ejemplos 



Si la instrucción en pseudocódigo fuera imprimir x[4] se mostrará el valor de 0.31. 

Si se requiere guardar en una posición específica del arreglo se debe escribir el identificador del arreglo y 
su posición, por ejemplo: leer #[0], Para llenar un arreglo completo se utiliza generalmente el ciclo desde (for) 
facilitando con la variable de control el incremento de la i, donde la i representa el subíndice. 

Para imprimir la suma de los valores contenidos en los primeros tres elementos del arreglo x, escribi- 
ríamos: 



Pseudocódigo 


Lenguaje C 


a <— x[0] + x[1] + x[2] 


a = x[0] +x [1] +x[2]; 


imprimir a 


printf ( "%f " , a) ; 



Donde la variable a es de tipo real, ya que los elementos del arreglo x son de ese tipo. 

Para dividir el valor del séptimo elemento del arreglo x entre 2 y asignar el resultado a la variable c es- 
cribiríamos: 



Pseudocódigo 


Lenguaje C 


ct— x[6] / 2 


C = x[6]/2; 



Nota: Trabajar con arreglos es similar a trabajar con variables; la diferencia es que se necesita escribir el nombre o 
identificador de la variable que representa todo el arreglo, para este caso x y además el subíndice /. Por ejemplo, si se 
quiere imprimir el valor del quinto elemento, éste se encuentra ubicado en la posición 4; la instrucción en pseudocódigo 
es imprimir x[i] y scanf ("%d",&xffl) en lenguaje C, donde x es el arreglo ei la posición, que en este caso es 4. 

Un subíndice debe ser un entero o una expresión cuyo resultado sea entero, por ejemplo a[2.5] no es 
válido. Si un programa utiliza una expresión como subíndice, entonces la expresión se evalúa para determi- 
nar el subíndice. 

Si i = 2 y ¡ = 4, entonces el enunciado: 

Pseudocódigo Lenguaje C 

C [ i + j ] <—10 C [i + j] = 10; 

almacena el valor de 10 en el arreglo c en la posición [6]. Nótese que el nombre de arreglo con subíndice i se 
utiliza al lado izquierdo de la asignación, como si c[i + j] fuera una variable. 

Examinaremos el arreglo x. Sus ocho elementos se conocen como x[0], x[l], x[2], x[7]. El valor de x[0] 
es 4.2, el valor de x[2] es 3.45, y así sucesivamente hasta el valor de x[7], que es 13.0. 

Se pueden asignar valores a los elementos del arreglo antes de utilizarlos tal como se asignan valores a 
variables. Una manera es inicializando el arreglo y la otra leyendo cada elemento del mismo. Comenzaremos 
con la primera posibilidad. 



4.2.1 Inicialización de arreglos unidimensionales 

En el momento de declarar el arreglo, se especifican los valores. 
Sintaxis: 



Pseudocódigo 


Lenguaje C 


tipo_dato identif [tam_arreglo]<— {valores} 
entero lista [5] < — { 1 0,1 7, 8, 4, 9 } 


tipo dato identif [tam arreglo] = {valores } ; 
int lista [5] = {10,17,8,4,9}; 



La asignación de los valores se realiza al declarar el arreglo mediante el operador de asignación (<—/=) y 
los valores contenidos dentro de las llaves { } a cada posición del arreglo; los valores dentro de las llaves se 



4.2 Arreglos unidimensionales (vectores o listas) 



139 



deben separar por una coma (,) y no es necesario asignarle un valor a cada posición ya que el compilador del 
lenguaje C se encargará de hacerlo según el lugar donde se haya declarado el arreglo, comenzando por la po- 
sición cero. Este modo de asignación no es válido si lo hacemos después de declarar el arreglo. Si el número 
de valores es menor al tamaño del arreglo a las posiciones faltantes les asigna cero. 



4.2.2 Lectura e impresión de un arreglo unidimensional 

La declaración de arreglos se hace al mismo tiempo que la declaración de variables normales, como se men- 
cionó anteriormente: 




Es fácil procesar los elementos de un arreglo mediante ciclos repetitivos porque facilitan la lectura, impre- 
sión, consulta y modificación de todos los elementos del arreglo, reduciendo el trabajo a unas cuantas líneas 
bien empleadas. Cuando la computadora ejecuta un ciclo y la instrucción leer (scanf) el programa almacena 
los valores en la variable arreglo. Para utilizar ciclos repetitivos es necesario el uso de variables de apoyo; el 
siguiente ejemplo muestra la forma de pedirle 10 números al usuario e imprimirlos después, utilizando ciclos 
repetitivos for. Veamos cómo podemos leer e imprimir el arreglo anterior: 




El programa utiliza la estructura de repetición desde (for) y leer (scanf) para capturar los elementos del arre- 
glo llamado lista, e imprime el arreglo mediante otro desde (for) y el imprimir (printf), donde el desde recorre 
todas las posiciones del arreglo. Es importante señalar que se debe respetar el tipo de dato del arreglo y ade- 
más especificar la posición del arreglo en la que se quiere guardar el valor. 

La manera de declarar el tamaño del arreglo varía en cada compilador. Por ejemplo en Turbo C de Borland, 
el tamaño debe ser constante como en el ejemplo presentado, donde el máximo tamaño posible es de 30 ele- 
mentos y el que realmente ocuparemos es n. 



140 Capítulo 4 Arreglos 



El programa podría quedar abierto si manejamos un tamaño de arreglo n: 




En el caso de compiladores como dev-cpp y CodecBlocks tenemos la ventaja de manejar un tamaño 
variable, ya que primero leemos n y posteriormente declaramos el arreglo respectivo. En Turbo C de Borland 
nos marcaría el error: Constant expressíon required. 



Ejemplos 



DEV-CPP y Code::Blocks 

#include <stdio.h> 
#include <conio.h> 
raain () 



int i,n; 

printf ("Dame el tamaño del arreglo: "); 

scanf ( "%d" , &n) ; 

int lista [n] ; 

for ( i — 0 ; i<n;i + + ) 

{ 

printf ("Dame el elemento %d ",i ); 
scanf ( "%d" , Sclista [i] ) ; 

} 

printf ( "Elementos de la lista\n"); 
for ( i — 0 ; i<n;i + + ) 



printf ( "%d\n" , lista [i] ); 
getch ( ) ; 
return 0 ; 

} 



4.2 Arreglos unidimensionales (vectores o listas) 



141 



4.2.3 Modificación de un elemento del arreglo unidimensional 

Podemos modificar los elementos de un vector en cualquier momento, sólo es necesario especificar el nom- 
bre del arreglo unidimensional, la posición y el nuevo valor. Enseguida se muestra la sintaxis a seguir: 



Pseudocódigo 


Lenguaje C 


tipo_dato ident_arr [pos] <— valor 
entero b[3] <— 18 


tipo dato ident arr [pos] =valor ; 
int b [3] =18; 



Donde valor es un dato, el resultado de una llamada a función o de alguna operación lógica o aritmética, 
etc. En este ejemplo se le asigna el valor 18 al cuarto elemento del arreglo que se encuentra en la posición 3. 

4.2.4 Arreglos de caracteres 

Los arreglos son necesarios para la implementación de cadenas de caracteres. Una cadena de texto es un 
conjunto de caracteres. Hay que recordar que en el lenguaje C no existe el tipo de dato cadena (string) como 
en otros lenguajes de programación, por lo que se utiliza un arreglo de caracteres, para poder almacenar una 
cadena: 



Pseudocódigo 


Lenguaje C 


carácter cad[] <— "Lenguaje" 


char cad[ ] ="Lenguaj e"; 



Ejemplos 



Una cadena de caracteres es un arreglo de caracteres que contiene al final el carácter nulo (\0); por esta razón 
es necesario que al declarar los arreglos éstos sean de un carácter más que la cadena más grande. El compi- 
lador inserta automáticamente un carácter nulo al final de la cadena, de modo que la secuencia real sería: 



Pseudocódigo 


Lenguaje C 


carácter cad[9] <— "Lenguaje" 


char cad [ 9 ] = "Lengua j e" ; 



La cadena quedaría almacenada como sigue: 



Posición memoria 


1315 


1316 


1317 


1318 


1319 


1320 


1321 


1322 


1323 


Contenido 


L 


e 


n 


g 


u 


a 


i 


e 


\0 


Elemento del arreglo 


cad[0] 


cad[1] 


cad[2] 


cad[3] 


cad [4] 


cad [5] 


cad [6] 


cad[7] 


cad [8] 



Una opción para almacenar una cadena de caracteres es el uso de la palabra reservada scanf (variable) pero, 
si queremos almacenar una cadena con espacios en blanco no lo podemos hacer con ella, sino que debemos 
utilizar la palabra reservada gets, que se encuentra dentro de la librería string.h; gets sólo se utiliza para leer 
cadenas de caracteres y scanf para leer cualquier tipo de variable, de preferencia de tipo numérico (vea deta- 
lles en el capítulo de programación modular y anexo A). 

gets 

Introduce una cadena de caracteres del teclado hasta que se encuentra un carácter ‘\n” (nueva línea), dicho 
carácter no se añade a la cadena. Se agrega al final del arreglo un carácter de terminación null. 

Sintaxis: gets(variable_cadena); 



142 Capítulo 4 Arreglos 



scanf 

Lee una cadena. El argumento correspondiente es un apuntador a un arreglo del tipo char, que es lo suficien- 
te extenso para contener la cadena y un carácter de terminación null. 

Sintaxis: scanf (“%s”, &variable_cadena); 

Cuando inicializamos una cadena de caracteres no es necesario definir el tamaño, el compilador siempre 
añade un carácter nulo al final. 



Ejemplos 



charcadena[] = "Programación" //cadena de 13 caracteres 



4.2.5 Ejercicios resueltos de arreglos unidimensionales 

Ejercicio 1 . Inicialice un arreglo de 10 elementos, realice e imprima la sumatoria. 




En el ejercicio 1, en el momento de declarar la variable x, que es de tipo arreglo, se inicializa el arreglo co- 
locando los valores entre llaves: {6, 7, 9, 2, 4, 7, 4, 3, 2, 9}, y son de tipo entero; no hay que olvidar que la posición 
inicial es cero, por lo tanto: 




0123456789 



■< — 


- elementos 


< 


- posición 



x[0] =6, x[l] =7, x[2] =9, x[9] = 9, donde x[10] no existe. La variable i se utiliza dentro del ciclo desde 

(for) y es la manera más sencilla de almacenar o imprimir datos en un arreglo, por la facilidad de incrementar 
o decrementar la variable i, y de esta manera se vaya recorriendo el arreglo. Dentro del ciclo desde (for), la 
variable s va a ir acumulando la suma de todos los elementos del arreglo hasta llegar al décimo elemento, 
que se encuentra situado en la posición nueve y en este momento se sale del ciclo desde (for) para imprimir 
el resultado de la suma. 

Recuerde que la expresión s+=x[i] en lenguaje C es equivalente a s=s+x[i]; hay que tener cuidado 
de dejar un espacio después de s+ (s+ = x[ij), ya que se producirá un error durante la compilación. La va- 
riable s acumularía: 6 + 7 + 9 + 2 + 44-7 + 44-3 + 2 + 9 = 53. 

En el ejercicio 2 la variable de tipo arreglo alumn almacenará la edad de un máximo de 45 alumnos y los 
datos serán de tipo entero, ya que en la declaración se reserva este espacio en memoria. Luego se pregunta 
el Total de alumnos de ese salón de clases y se guarda en la variable total_a, que le sirve al ciclo desde (for) 



4.2 Arreglos unidimensionales (vectores o listas) 



143 



para saber cuántas veces entrará; si el total_a es igual a 20 solamente entrará y se almacenarán 20 edades de 
la posición [0 a la 19], la etiqueta que se encuentra dentro del ciclo desde (for) “Escriba la edad del alumno: 
“,i+l imprimirá el valor de i + i ya que la variable i inicia en la posición 0 y si queremos preguntar por la 
edad del primer alumno tenemos que incrementarle 1 a la variable i para que pueda imprimir Escriba la edad 
del alumno: 1 y así sucesivamente. Ya almacenadas las edades se le pregunta al usuario de qué alumno desea 
ver su edad y se almacena en la variable i, para luego mostrar el valor almacenado en esa posición menos uno, 
ya que si se desea ver la edad del alumno 5 estará almacenada en la posición 4. 

Ejercicio 2. Almacene la edad de todos los alumnos de un salón de clases y posteriormente preguntar e 
imprimir la edad de alguno de ellos. 




En totolea = 6 la variable i inicializa en 0 y las edades se irán almacenando en alumn[0]=20, alumn[l] = 18, 
alumn[2] =22, alumn[3] = 19, alumn[4] =21, alumn[5 ] =20: nótese que el cambio del índice alumn[i] se debe 
al cambio de la variable i dentro del ciclo desde (for). Cuando se pregunta ¿De qué alumno deseas ver su edad?, 
si se elige i =4, el programa imprimirá La edad del alumno 4 es: 19, que realmente se encuentra ubicado en 
la posición 3, ya que la edad correcta la encontramos en alumn[i-1]. 



Ejemplos 



En el ejercicio 3 se utiliza el arreglo cal, que es de tamaño 10 y los datos que se almacenan son de tipo reales 
ya que las calificaciones pueden ser enteras o reales y cuando mucho el alumno pudo cursar 9 materias en 
un mismo semestre. La última posición se deja para almacenar el promedio. Se pregunta ¿Cuántas materias 
llevas (max 9)? y el dato se almacena en la variable mat, luego entrará al ciclo desde (for), donde la variable 
i empezará en 0 y llegará a uno menos de mat por el signo “<” y por cada vez que entre al ciclo desde (for) 
se irá almacenando en cal[i] y sumando la calificación en prom-, para luego cuando se salga del ciclo desde 
(for) llegue al número de materias cursadas; se puede almacenar en la siguiente posición el promedio que se 
calcula de la suma de todas las calificaciones prom dividido entre el total de materias cursadas mat. La posi- 
ción siempre será mat ya que si el alumno cursó seis materias y sus calificaciones estarán almacenadas de la 
posición 0 a la 5 y queda disponible la posición 6 para guardar el promedio. 



144 Capítulo 4 Arreglos 



Ejercicio 3. Calcule el promedio de las calificaciones de las materias del semestre anterior, utilizando un 
arreglo para almacenar todas las calificaciones y el promedio guárdelo en la siguiente posición después 
de la última calificación: 




Ejemplos 



SI mat=4, se guardarán en el arreglo cuatro calificaciones, cal[0]=85, cal[1]=75, cal[2]=80, cal[3]=60, la 
variable prom almacenará la suma que se va a ¡r acumulando en cada vuelta del ciclo desde (for), prom=300, 
luego cal[4]=300/4, para imprimir El promedio es 75.00, que se almacena en la variable cal[4], es decir en la 
quinta posición ya que son 4 materias. 



Ejercicio 4. Almacene en un arreglo, n elementos de tipo entero, calcule el cuadrado de cada uno de los 
elementos y almacénelo en un segundo arreglo. Imprima ambos vectores. 



Pseudocódigo 



principal () 
inicio 

entero x[1 0], y[10], i, n 



¡mprimir"Dame el tamaño del arreglo: 
leer n 

desde (i<— 0,¡<n, i<— i + 1) 

¡nido 

imprim¡r"Dame un número: " 
leer x[¡] 

y[i]< — cuadrado x[i] 
fin 

Imprimir" Los cuadrados son:" 
desde (i < — 0, i < n, i<— i + 1) 
imprimir x[i], y[i] 



Lenguaje C 

#include <stdio.h> 

#include <conio.h> 

#include <math.h> 
main ( ) 

{ 

int x [10] , i , n; 
f loat y [10] ; 

printf("Darae el tamaño del arreglo:"); 

scanf ( "%d" , &n) ; 

for (i = 0; i<n; i + + ) 

{ 

printf("Dame un número: "); 
scanf ( "%d" , &x [i] ) ; 
y [i] = pow ( x [ i ] ,2) ; 

} 

printf ( "Los cuadrados son : \n" ) ; 
for(i = 0; i<n; i + + ) 

printf ( "%d, %. Of \n",x[i], y[i]); 
getch(); return 0; 



fin 



4.2 Arreglos unidimensionales (vectores o listas) 145 



En este ejercicio se declaran dos arreglos unidimensionales x y y de tamaño 10 y de tipo entero; n para el 
número de elementos que se desea almacenar e i, que sirve como subíndice del arreglo. Primero se solicita 
el número de elementos que se van a almacenar y se guarda en la variable n, luego con una estructura repeti- 
tiva desde (for) se inicializa i en cero y el último valor de i será n-1, ya que el arreglo, si es de ocho elementos, 
éstos estarán almacenados en x[0] hasta x[7]; dentro del ciclo desde (for) se van almacenando los valores en 
el arreglo x y luego se calcula el cuadrado de cada elemento y se almacena en el arreglo y. Cuando ya se hayan 
capturado los n elementos del arreglo x, de manera automática se habrán almacenado los n elementos del 
arreglo y. Para finalizar se imprimen los dos arreglos al mismo tiempo. Comenzando con el primer elemento 
del arreglo x y el primer elemento de arreglo y, después con el segundo y así sucesivamente hasta llegar al 
último elemento. 

Si n=5, x[0]=7 almacenará en y[0]=49, x[ 1 ]=3 almacenará en y[ 1 7=9, x[2]=8 almacenará en y[2]=64, x[3]=6 

almacenará en y[3]=36, x[4]=2 almacenará en y[4]=4 e imprimirá 7, 49, 3, 9, 8, 64, 6, 36, 2, 4. 



Nota: En lenguaje C la sintaxis de la función pow es: pow(b,e) donde b es la base y e el exponente; dicha función regresa 
un valor real, por lo tanto el arreglo y tuvo que ser declarado float. Como los resultados de y son enteros cuando 
Imprimimos su resultado utilizamos el formato %.0f (ya que no hay decimales). 



Ejercicio 5. Calcule la desviación estándar S de cinco números. 




La fórmula a resolver es la siguiente: 



S= 



i=4 

X 



i=o (m-num) 



Por lo tanto para calcular la desviación estándar primero debemos calcular la media y luego hacer el cuadra- 
do de la diferencia de la media y de cada número para luego dividirla entre 5. 



Ejemplos 

<§> 



146 Capítulo 4 Arreglos 



En este ejercicio num es la variable de tipo arreglo que almacena los cinco números. Las variables s 
y m se inicializan con cero porque son acumuladores y son de tipo real (float) porque calcularán fracciones. 
En el primer ciclo desde (for) se van almacenando los cinco valores del arreglo con ayuda de la instruc- 
ción leer (scanf), en seguida se van acumulando los valores respectivos para cuando se salga del ciclo desde 
(for). La media se calcula dividiendo los valores acumulados entre cinco. Luego entra a otro ciclo desde (for) 
en el cual se va haciendo la diferencia de la media m con cada número del arreglo num y el resultado lo eleva 
al cuadrado y lo va acumulando en la variable s. No debemos olvidar que la sumatoria X es el equivalente a 
acumular sumandos, por lo tanto acumularemos los valores de (m-num. ) 2 con el ciclo desde (for), donde 
la i comienza con 0 hasta que llegue a 4, con incrementos de uno en uno. Posteriormente cuando salga del 
ciclo desde (for) calcula la desviación estándar dividiendo la variable s entre 5 y por último calcula la raíz 
cuadrada. 



Ejemplos 



Si los números son x={8,6,9,5,7}e I resultado de la media m=7 y la desviación estándar s= 1.41. 



Utilizamos la librería math.h ya que utilizamos la función matemática pow. 



La salida en pantalla, después de ejecutar el programa sería: 
introduce los 5 números 

1 2 3 4 5 

la media es: 3.00 y la desviación estándar es 1 .41 . 



Ejercicio 6. Almacene en un vector, n elementos (máximo 30) e inserte un elemento ni en la posición pos, 
recorriendo los siguientes elementos una posición a la derecha. 



Pseudocódigo 


Lenguaje C 




constante p<— printf 


#include <stdio.h> 
#include <conio.h> 
#define p printf 




constante s<— scanf 


#define s scanf 




constante MAX<— 30 


#define MAX 30 




principalO 


main ( ) 




inicio 


{ 




entero lista[MAX],i,ni,n,pos 


int lista [MAX] , i , ni , n, pos ; 




imprim¡r"Dame elTamaño del Arreglo" 


p("Dame el Tamaño del Arreglo ") ; 




leer n 


s ( "%i* , &n) ; 




imprimir"Dame el No. a Insertar" 


p ("Dame el No. a Insertar "); 




leer ni 


s ( "%i" , &ni) ; 




imprimir"Dame la Posición" 


p("Dame la Posición "); 




leer pos 


s ( "%i" , &pos) ; 




desde (i<— 0,i<n,¡<— i + 1) 


for ( i = 0 ; i<n; i + + ) 




inicio 


{ 




imprimir "Dame el valor cuya posición es", i 


p ("Dame el valor cuya posición es %d ' 


\ i) ; 


leer lista[i] 


scanf ( "%d" , alista [i] ) ; 




fin 


} 




for (i< — n,i>pos,i< — i — 1 ) 


for (i=n;i>pos;i ) 




lista[i]< — lista[i — 1 ] 


lista [i] =lista [i — 1] ; 




lista[pos]<— ni 


lista [pos] =ni ; 




desde (i< — 0,¡< = n,i< — i + 1 ) 


for ( i = 0 ; i<=n; i + + ) 




imprimir lista[i] 


p ( "%d " , lista [i] ) ; 




fin 


getch ( ) ; 

} 





4.2 Arreglos unidimensionales (vectores o listas) 147 



En este ejercicio se declaran cinco variables de tipo entero: lista es un arreglo con un máximo de 30 ele- 
mentos, i es un contador que enumera las posiciones del arreglo, ni es el número que se desea insertar, n 
es el tamaño del arreglo y pos es la posición donde se va a insertar el número. Se leen las variables n, ni 
y pos. Al conocer el valor de n, con un desde (for j se recorren las posiciones (0 a n— 1), leyendo los valores 
respectivos del arreglo lista. Con otro desde (for) se va sustituyendo el valor de una casilla con el valor de la 
siguiente casilla, comenzando con la posición n hasta llegar a la posición deseada; por lo tanto el recorrido va 
de atrás hacia adelante. Al final se imprime la lista modificada, por lo tanto el tamaño del arreglo será n+1 
y la condición del desde (for) será: (i< = n). Si n=3, ni=10y pos=l, en la instrucción lista[pos] < — ni la posi- 
ción 1 toma el valor de 10; el valor de la posición 0 se conserva: lista[0] =5; cabe recordar que las posiciones 
son las internas de la máquina ya que muchas veces el usuario visualiza desde la posición 1. Una posible 
corrida a mano será: 



Primer desde (for) 

1 lista [i] 

0 5 

1 2 

2 7 

3 Se rompe 



Segundo desde (for) 

1 lista [i]<^lista [i-1] 

3 lista [3]< — 7 

2 lista [2]< — 2 

1 Se rompe 



Tercer desde (for) 

1 lista [i] 

0 5 

1 10 

2 2 

3 7 

4 Se rompe 



Ejercicio 7. Almacene en un arreglo a, un conjunto n de elementos de tipo entero (max 1 5), almacene en 
el arreglo b los elementos del arreglo a de forma invertida. 

Arreglo a = 2, 4, 6, 8, 1 0 almacena el usuario 
Arreglo b = 1 0, 8, 6, 4, 2 lo realiza el programa 



Pseudocódigo 

principal () 
inicio 

enteroa[15],b[15],n, i,j 
imprimir "Total de números" 
leer n 

desde ( i<— 0, i<n, i<— i + 1) 
leer a[ i ] 

desde (¡< — 0, j< — n — 1 ; i<n , j>=0 ; i<— i + 1, j< — j — 1) 
b[ i ] < — a[ j ] 

desde ( i<— 0, i<n, i<— i + 1) 

Imprimir a[ i ] 
desde ( i<— 0, i<n, i<— i + 1) 

Imprimir b[ i ] 



Lenguaje C 

#include <stdio.h> 

#include <conio.h> 
main ( ) 

{ 

int a[15],b[15],n, i,j; 
printf ( "Total de números"); 
scanf ( "%d" , &n ) ; 
for ( i — 0 ; i<n; i + + ) 
scanf ( "%d" , &a [i] ) ; 

for (i = 0, j=n— 1; i<n, j> = 0; i + + , j ) 

b [i] =a [j] ; 

for ( i — 0 ; i<n ; i + + ) 

printf ("%d \n" , a [ i ] ) ; 
for ( i — 0 ; i<n ; i + + ) 

printf ("%d \n",b[ i ] ); 
getch ( ) ; 
return 0 ; 

} 



Ejemplos 



En este ejercicio se solicita el total de elementos y se almacena en la variable n, luego con la ayuda de un ciclo 
desde se llena el arreglo a, posteriormente, utilizando un ciclo desde con dos variables de control i para llevar 
la posición del arreglo byj para llevar la posición del arreglo a, se van almacenando en la posición b[ 0 ], lo 



Capítulo 4 Arreglos 



que tiene el arreglo a [n- 1], posteriormente se incrementa i y se decrementa j, para almacenar en la posición 
b[ 1], lo que tiene el arreglo a [n-2], así sucesivamente hasta almacenar en la posición ¿[«-1], lo que tiene el 
arreglo a [0]. 



Ejercicios complementarios de arreglos unidimensionales en 

pseudocódigo 



Ejercicio 1. Complete el siguiente ejercicio que almacena en un arreglo unidimensional ocho números 
enteros y lo imprime de manera inversa. 

principal () 



desde (I <— 0 , , i<— i + 1 ) 

inicio 

imprimir" Introduce un numero" 

leer 

fin 

imprimir" El arreglo de manera inversa es" 

desde ( , i<— i— 1) 

imprimir 

fin 



Ejercicio 2. Realice el pseudocódigo que sume dos vectores (max 1 0) elementos de tipo entero y el resul- 
tado lo almacene en un tercer vector. Imprima el vector resultante (c). 

constante TAM 

principal () 
inicio 

real a[TAM], b[ ], c[ ] 

i,n 

¡mprimir"Número de elementos" 
leer n 

¡mprimir"Dame los valores del vector a" 

desde (i <— 0, , i <— i + 1 ) 

inicio 

imprimir" Introduce el valor de", i + 1 

leer 

fin 

imprimir"Dame los valores del vector b" 

( i <-0, i < n, i < — i + 1 ) 



( continúa ) 



Ejercicios complementarios de arreglos unidimensionales en pseudocódigo 149 



(i continuación ) 
inicio 

imprimir" Introduce el valor de", i + 1; 

leer 

fin 

desde (i <— 0, i < n, i <— i + 1 ) 
inicio 

< — a[¡] + b[i] 

imprimir c[i] 
fin 
fin 

Ejercicio 3. Revise el siguiente pseudocódigo y conteste las siguientes preguntas. 

principal () 
inicio 

real sal[30], salmayt— 0 
entero i , trab, sm 
¡mprimir'Total de trabajadores" 
leer trab 

desde (i < — 0, i < trab, i <— i + 1) 
inicio 

imprimir"dame el salario del trabajador",i + 1 
leer sal [ i ] 

si (sal [i ] salmay) 
inicio 

sm <— ¡ + 1 
salmay <— sal [i ] 
fin 
fin 

imprimir "El salario mayores", salmay, "y pertenece al trabajador", sm 
fin 



1. ¿Qué realiza el programa? 



2. Total máximo de trabajadores que se pueden almacenar 



3. ¿Qué almacena la variable sm? 



150 Capítulo 4 Arreglos 



4. Si hay dos salarios iguales ¿con cuál trabajador se queda la variable sm? 



5. ¿Qué almacena la variable salmay ? 



Ejercicio 4. Complete el siguiente ejercicio que almacena en un arreglo las temperaturas de las 24 horas 
del día (0-23) e imprima la temperatura más alta del día 

principal () 
inicio 

real x [ ], i, maye— 0 

desde (i <— 0 , , ¡<— i + 1 ) 

Inicio 

imprimir" Introduce la temperatura" 

leer 

si 

may <— x [ ¡ ] 
fin 

imprimir" La temperatura mayor fue" 

fin 

Ejercicio 5. Complete el siguiente pseudocódigo que realiza una búsqueda de un número real, si lo en- 
cuentra regresa la posición en la que se encontró y si no lo localizó, como posición se tiene el último va- 
lor de /. 

principal () 
inicio 

real 

entero , x 

desde (i < — 0, i < 20, i < — i + 1) 
inicio 

imprimir"dame el número", i + 1 

num [ i ] 

fin 

imprimir"Qué número deseas buscar" 
leerx 
i <— 0 

mientras (i < 20 y x O num [i ]) 



imprimir"La posición del número es", 



fin 



Ejercicios complementarios de arreglos unidimensionales en lenguaje C 151 



Ejercicios complementarios de arreglos unidimensionales en 

lenguaje C 



Parte I. Complete los siguientes programas 

Ejercicio 1. Leer una lista con un máximo de 30 elementos, buscar e imprimir la(s) posición(es) en la que se 
encuentra un valor x, dentro del arreglo. Si no se halla que imprima el letrero respectivo. 

#include <conio.h> 

#include <stdio.h> 

#define MAX 30 
main ( ) 

{ 

int [MAX], i, , ban= 0 , x ; 

printf("Dame el número de valores a ingresar \n" ) ; 
scanf ( "%d" , &n) ; 
f or ( i = 0 ; i<n; i + + ) 

{ 

printf("Dame el valor a ingresar %d",i+l); 
scanf ( "%d" , &vector [i] ) ; 

} 

printf("Dame el número a buscar ") ; 



f or ( i= 0 ; i<n ; i + + ) 

if ( ) 

{ 

printf("Lo encontré en la posición %d\n",i+l); 
ban=l ; 

} 

if ( ) printf ("No lo encontré"); 

getch ( ) ; 
return 0 ; 



} 



Capítulo 4 Arreglos 



Ejercicio 2. Leer una lista con un máximo de 30 elementos, crear dos vectores, el vector par contendrá los 
números pares del vector original y el non los impares. Al final imprima los tres vectores. 

#include <conio.h> 

#include <stdio.h> 

#define MAX 30 
main ( ) 

{ 

int lista [MAX] , non [MAX] , par [MAX] , i , num, p = 0 , n=0 ; 
printf("dame un número de 1-30: ") ; 
scanf ( "%d" , &num) ; 
for ( i = 0 ; i<num; i + + ) 

{ 

printf("dame el número cuya posición o casillero es %d: ",i); 
scanf ("%d", & lista [i]); 
if (lista [i] %2 = = 0) 

{ 

par [p] =lista [i] ; 



} 

else 

{ 

n++; 



} 

} 

printf ( "lista original\n" ) ; 
for ( i = 0 ; i<num; i + + ) 



printf ( "\npares\n" ) ; 
for ( i = 0 ; i<p; i + + ) 



printf ( "\nnones\n" ) ; 
for ( i = 0 ; i<n; i + + ) 

printf ("%d ",non[i]>; 
getch ( ) ; 



return 0 ; 



Ejercicios complementarios de arreglos unidimensionales en lenguaje C 153 



Ejercicio 3. Imprimir la siguiente serie 





Lenguaje C 


8 




1 X 8 + 1 = 9 


#include <stdio.h> 


12 X 8+2 = 98 


#include <conio.h> 


123 X 8 + 3 = 987 


#include <math.h> 


1234 X 8+4 = 9876 


main ( ) 


12345 X 8 + 5 = 98765 


{ 


123456 X 8+6 = 987654 


int i , i , k, , c ; 


1234567 X 8 + 7 = 9876543 


double ; 


12345678 X 8+8 = 98765432 


printf ("\t 8\n" ) ; 


123456789 X 8 + 9 = 987654321 


for ( i = l ; i< = 9 ; i + + ) 

{ 

ac = 0 ; 

for ( j =1 ; j <=9 — i ; j + + ) 
printf (" ") ; 

for (c = 0 , j =1 ; j < = i ; j ++ , C + + ) 
{ 

printf ( "%d" , j ) ; 
num [c] = j ; 




; 

for (c = 0 , j =i— 1 ; j>=0 ; j , C + + ) 

ac = ac+num [ j ] *pow ( 10 , c) ; 
printf (" X 8 + %d=% . Of \n" , i , ac*8 + i ) ,- 

} 

getch ( ) ; return 0 ; 

} 



Parte II. Realice la prueba de escritorio o corrida a mano del siguiente programa 

#include <conio.h> 

#include <stdio.h> 
main ( ) 

{ 



int ac = 0, i , primero [15] = {21 , 


,12,23,14,25,16,27,7,1,21,24,11}; 


for (i = ll ; i>l ; i = i — 2 ) 




{ 




ac = ac+primero [i — 1] —i; 





printf ( "%d, %d\n" , primero [i+2] , ac) 

} 

getch ( ) ; return 0 ; 



} 



154 Capítulo 4 Arreglos 



Parte III. Elabore la codificación en lenguaje C de los siguientes programas (realizando el cálculo e 
impresión respectiva): 

1. Almacene en un arreglo las temperaturas de un día (0-23 horas). Calcule su media e imprimir la 
temperatura más alta y la más baja; asimismo imprimir la hora respectiva. Por ejemplo la temperatura 
media fue de 21.5 grados Celsius, la más alta de 29 grados Celsius a las 14 horas y la más baja de 9.4 
grados Celsius a las 3 horas. 

2. Almacene en un vector la temperatura de cada día de una determinada semana y que realice lo siguiente: 

a) La temperatura promedio. 

b) Un vector que contenga las diferencias de cada temperatura con respecto al promedio. 

c) La menor temperatura y el número de día en que ocurrió. 

d ) La mayor temperatura y el número de día en que ocurrió. 

3. Almacene en un arreglo, 20 elementos de tipo entero e imprimir: 

a) La suma de los elementos que ocupan posiciones pares. 

b) El mayor de los elementos que ocupan posiciones impares. 

c) La posición del mayor número par. 

4. Almacene en un arreglo, n elementos (máximo 30) e imprimir la suma: 

a) de números pares. 

b) de números impares. 

c) total de los elementos del arreglo. 

5. Almacene en una lista 15 números e imprimir cuántos son ceros, cuántos son negativos y cuántos 
positivos. Imprimir además la suma de los negativos y la suma de los positivos. 

6. Inicialice un vector con 10 valores. Genere un vector a con los números negativos y otro vector b con 
los positivos o iguales a cero. 

7. Almacene en un vector n elementos de tipo real (máximo 25) e imprima los siguientes valores: 

a) Máximo. 

b) Mínimo. 

c) La media de los que estén en posiciones pares. 

d ) Lavarianza. 

8. Genere aleatoriamente un vector de tamaño 20 con números entre 0 y 150 y genere otras tres listas con 
los siguientes criterios: 

a) Si los números están comprendidos entre 0 y 50 irán en la lista 1. 

b ) Si los números están comprendidos entre 51 y 100 irán en la lista 2. 

c) Si los números son mayores a 101 irán en la lista 3. 

Al final imprimir las cuatro listas. 

9. Almacene en un vector 10 números y cambie algún número por otro del mismo arreglo, realice el cambio 
y muestre el arreglo modificado. 

10. Genere aleatoriamente un vector de tamaño 20 con números comprendidos entre 1 y 20 e imprimir: 

a) Suma de los elementos. 

b) Promedio de los elementos. 

c) Varianza y desviación estándar de los valores. 

d ) Elemento que más se repite (moda). 



Ejercicios complementarios de arreglos unidimensionales en lenguaje C 155 



11 . 

12 . 

13. 

14. 



15. 



16. 



17. 



18. 

19. 

20 . 

21 . 



22 . 



Almacene en un vector de tamaño 10 números reales. Calcule el promedio e indique cuántos elementos 
del vector son mayores que el promedio y genere otro arreglo con los menores o iguales. 

Almacene en un arreglo de n números enteros (máximo 30) y determine cuántos números terminan en 
dígito primo. 

Convierta un número entero decimal a su equivalente en representación binaria. 

Almacene en un arreglo n números enteros y determine ¿cuántas veces se repite cada uno de ellos? 

Si n=6 y los elementos del arreglo son: 3,4, 6, 6, 4, 6, se imprimirá: 

3 = 1 
4=2 
6=3 



Guarde una cadena y genere otro vector con las veces que se repite cada letra. 

En la cadena CASAS generará el arreglo con los valores: 1,2, 2, 2, 2. 

Almacene en un vector n números (máximo 10), valide si el tamaño es par e invertir los elementos a la 
mitad del arreglo. Imprimir el vector original y el invertido. 

Si n=6, v=[1][2][3][4][5][6] v(invertido) = [3][2][1 ][6] [5] [4], 



Almacene en dos vectores números reales a y b de 10 elementos cada uno, a partir de ellos genere un 
tercer vector con el siguiente criterio: sumar el primer elemento de a más el último elemento de b y 
luego el segundo elemento de a con el noveno elemento de b y así sucesivamente hasta llegar al décimo 
elemento de a más el primer elemento de b. Imprimir las sumas almacenadas en el vector c. 

Genere aleatoriamente un arreglo unidimensional de n enteros comprendidos entre 1 y 100 e imprima 
otro vector pero sin los elementos repetidos. 

Almacene un vector de longitud n ordenado en forma ascendente y un elemento * del mismo tipo que 
los elementos del vector, intercalar * en el vector v de manera que siga ordenado. 

Almacene 2 vectores ay b de longitudes n y m, el primero ordenado en forma ascendente y el segundo 
ordenado de manera descendente, crear un nuevo vector c de n + m elementos intercalando los 
elementos de a y b de modo que c quede ordenado en forma ascendente. 

Imprimir las siguientes series: 



1 X 9+2 =11 
12 X 9+3 =111 
123 X 9+4 =1111 
1234 X 9+5 =11111 
12345 X 9+6 =111111 
123456 X 9+7 =1111111 
1234567 X 9+8 =11111111 
12345678 X 9+9 =111111111 
123456789 X 9 + 10 = 1111111111 



1 

1 X 1 = 1 



11 X 11 = 121 
111 X 111 = 12321 
lili X 1111 = 1234321 
11111 X 11111=123454321 
lililí X 111111=12345654321 
1111111 X 1111111=1234567654321 
11111111 X 11111111=123456787654321 
111111111 X 111111111=12345678987654321 



Leer un número entero positivo e imprimirlo separado dígito por dígito. 



Ejemplos 

® 



Ejemplos 

Ejemplos 

@ 



Si N= 123456, imprimirá 1 2345 6. 



Ejemplos 



156 Capítulo 4 Arreglos 



4.3 Arreglos bidimensionales (matrices o tablas) 

Un arreglo bidimensional es un conjunto de n elementos del mismo tipo almacenados en memoria contigua 
en una matriz o tabla. A diferencia de los arreglos unidimensionales que sólo requieren de un subíndice, los 
arreglos bidimensionales para acceder a cada elemento del arreglo requieren de dos índices o subíndices 
declarados en dos pares de corchetes, donde el primer corchete se refiere al tamaño de filas y el segundo al 
tamaño de columnas. 



Ejemplos Para declarar una tabla de 3 filas y 5 columnas, lo haremos de la siguiente forma: 



Pseudocódigo Lenguaje C 

tipo_dato ¡dent_arr [tam_fila][tam_col] tipo_dato ident_arr [tam_fila] [tam_col] ; 

entero b[3][5] int b [3 ] [5] ; 

donde: 

tipo_dato es el tipo de dato de todo el arreglo. 
ident_arres el nombre del arreglo. 
tam_fila es el total de filas. 
tam_col es el total de columnas. 



Nota: El número de elementos de una matriz será tam_f¡la X tam_col. En el ejemplo anterior son 3X5 = 15 celdas de 
tipo entero. Los elementos del arreglo b están ordenados de la manera siguiente: 



b 


ColO 


Col 1 


Col 2 


Col 3 


Col 4 


FilaO 


b[0][0] 


b[0][1] 


b[0][2] 


b[0][3] 


b [0] [4] 


Fila 1 


binioi 


b[1][1] 


b[1][2] 


b[1][3] 


b[1][4] 


Fila 2 


b[2][0] 


b[2][1] 


b[2][2] 


b[2][3] 


b[2][4] 



4.3.1 Inicialización de arreglos bidimensionales 

En el momento de declarar el arreglo, se especifican los valores. 
Sintaxis: 



Pseudocódigo 


Lenguaje C 










t_dato identif [fil][col] <— {valores} 


t dato identif [fil] [col] = {valores } ; 


a 


0 


1 


2 


entero a[3][3]<— {1,23,4,5,6,7,8,9} 


int a [3] [3] = {1,2,3, 4, 5, 6, 7, 8, 9); 


0 


1 


2 


3 






1 


4 


5 


6 






2 


7 


8 


9 



4.3.2 Lectura e impresión de unos arreglos bidimensionales 

Para la lectura la computadora requiere de dos ciclos anidados (para ubicar la fila y la columna), y la instruc- 
ción leer ( scanf) o leercad (gets), almacenando con ello los valores en cada celda de la tabla o matriz. 

El siguiente segmento de programa muestra cómo se pueden almacenar datos en una matriz mat de 3 
filas y 4 columnas, se utiliza la instrucción leer (scanf) para guardar o leer los datos: 



4.3 Arreglos tridimensionales (matrices o tablas) 



157 



Pseudocódigo 


Lenguaje C 


Qué realiza 


desde (i<— 0, i < 3, i<— 1 + 1 ) 


for (i=0 ; i<3 ; i + + ) 


Recorre cada fila (i), 


desde (j<— 0, j< 4, j< — j + 1) 


for ( j = 0 ; j<4 ; j + + ) 


Recorre cada columna (j) 


leer mat[i][j] 


scanf ( "%d" , &mat [i] [ j ] ) 


Almacena en la fila i 
y columna j corres- 
pondiente 



Nota: Cuando existen dos ciclos anidados primero se inicializa el ciclo de fuera, posteriormente realiza el que se 
encuentra dentro y hasta que termine con él regresa al ciclo de fuera; en este caso, primero inicializa el ciclo / y hasta 
que termina con todas las columnas (j) de la primera fila (0) y continúa con la segunda fila (1), iniciando otra vez con 
la columna (j=0). 



El siguiente segmento de programa muestra cómo se pueden imprimir los datos almacenados en una 
matriz mat de 3 filas y 4 columnas. Se utiliza la instrucción imprimir (printf) para escribir o mostrar el re- 
sultado: 



Pseudocódigo 


Lenguaje C 


Qué realiza 


desde (i< — 0, i < 3, ¡<— i + 1) 


for ( i = 0 ; i<3 ; i + + ) 


Recorre cada fila (i), 


desde (j<— 0, j< 4, j< — j + 1) 


for ( j =0 ; j <4 ; j + + ) 


Recorre cada columna (j) 


imprimir mat[i][j] 


printf ("%d", mat [i] [ j ] ) 


Imprime el valor alma- 
cenado en la fila i y 
columna j correspon- 
diente 



4.3.3 Modificación de un elemento de una matriz 

Los elementos de una matriz se pueden modificar en cualquier momento, sólo es necesario especificar el 
nombre del arreglo bidimensional, la posición tanto de la fila como de la columna y el nuevo valor. En seguida 
se muestra la sintaxis a seguir: 




Donde valor es un dato o el resultado de una llamada a función o de alguna operación lógica o aritmética, etc. 
En este ejemplo se le asigna directamente el valor 18 a la matriz b en la cuarta fila y sexta columna. 

Muchas manipulaciones con arreglos utilizan la estructura de control repetitiva desde (for). Por ejemplo, 
el siguiente ejemplo define todos los elementos en el tercer renglón o fila del arreglo a (la fila 2 almacena 
los elementos de la tercera fila); el único subíndice que se modifica es j, que sirve para cambiar el subíndice 
de las columnas: 



Pseudocódigo 


Lenguaje C 


entero a [4] [4] 


int a [4] [4] ; 


desde (j <— 0,j<4,j<—j + 1) 


for (j=0; j < 4; j++) 


a[2][¡] <— 5 


a [2] [j] =5; 



El ciclo desde (for) anterior es equivalente a los enunciados de asignación siguientes: a[2][0] = 5, a[2][l] = 5, 
a[2] [2] = 5, a[2] [3] = 5; es decir, se le asigna a toda la tercera fila, el valor de 5. 



Capítulo 4 Arreglos 



4.3.4 Ejercicios resueltos de arreglos bidimensionales 

El ejercicio 1 incorpora el concepto de cadena de caracteres; nótese que el arreglo x que se declara es de tipo 
carácter ya que en cada celda o posición almacenará un carácter y para ello se requieren dos valores: [50] que 
se refiere al número de alumnos, y [20] para almacenar el nombre de cada uno de los alumnos (recuerde que \0 
ocupa un lugar) este tipo de arreglo se denomina bidimensional. Se solicita el total de alumnos indicando el 
máximo de 50, y se almacena en la variable alum; dentro del ciclo desde (for) se va solicitando el nombre de 
cada alumno, para esto utilizamos una función de cadenas del lenguaje C, leercad (gets) equivalente al leer 
ya utilizada, solamente que éste es especial para cadenas (cuando se tienen problemas con el formato %s, es 
conveniente cambiar scanf("%s”,&x[i]); por gets(x[i])) además la función getsQ requiere de la función fflush 
(vea anexo A). 

Ejercicio 1. Guardar los nombres de los alumnos de un salón de clases en un arreglo y posteriormente 
imprimirlos. 




Note que el arreglo x sólo tiene un índice i, esto quiere decir que se está almacenando en uno de los 50 
posibles lugares y en los 20 posibles sitios que tiene para cada carácter. 

El segundo desde (for) sirve para imprimir en pantalla la lista de nombres. 

Ejercicio 2. Almacenar en una matriz denXm (máximo 10 X 1 0) números reales. Imprimir los elementos 
de la diagonal principal de la matriz e imprimir la suma dichos elementos. 

Pseudocódigo 

principal () 
inicio 

real a[10][10], acum<— 0 
entero ¡,j,n,m 

impr¡mir"Número de filas" 
leer n 

impr¡mir"Número de columnas" 
leer m 

desde (i<— 0, ¡ < n, i < — i + 1) 
inicio 



( continúa ) 




4.3 Arreglos tridimensionales (matrices o tablas) 



159 



( continuación ) 




En este ejercicio se incorporan los arreglos bidimensionales de tipo numérico; almacenaremos una matriz 
a, de [10] [10], reservando en memoria 100 espacios de tipo real, aunque el usuario puede elegir cuántas filas 
n y cuántas columnas m-, al igual que en los arreglos unidimensionales, la manera más sencilla de llenar un 
arreglo es usando un ciclo desde (for); para llenar una matriz o tabla se tendrán que utilizar dos ciclos desde 
(for) anidados, el primero para las filas y el segundo para las columnas, es decir cuando la variable i = 0 entra 
al segundo ciclo desde (for) j= 0 y almacenará el valor en a [0][0], luego j= 1 y almacenará el valor a[0][l] y así 
sucesivamente hasta llegar a la m columna a[0][m-l ]. Al terminarse el segundo ciclo desde (for) se regresa al 
primer ciclo desde (for) y se incrementa i en uno para tomar i = 1 y entra otra vez al segundo ciclo desde (for), 
iniciando el valor de j = 0 , para almacenar el valor a[l ] [0], luego en a[l ] [1 ], hasta llegar a la última columna 
m. Así ocurre sucesivamente hasta llegar a la última fila y por consiguiente a la última columna. Una vez 
llena la matriz a, se irán acumulando los valores de la diagonal principal en la variable acum, para esto sólo 
se necesita un ciclo desde (for), ya que con un solo índice podemos ubicarnos en a[0][0], a[l ] [1 ], hasta a [n-1 ] 
[n-1], para al final imprimir el valor de la variable acum. 



Si la matriz es de 4 X 2, es decir n= 4 y m= 2, en esta matriz se llenó primero la fila 0, luego la fila 1 y así sucesivamente 
hasta la fila 3, y por cada fila sus dos columnas, es decir se fueron llenando a[0][0] = 7, a[0][1]=4, a[1][0]=3, a[1][1] = 9, 
a [2] [0] = 1 , a[2][1]=8, a[3][0] = 5, a[3][1]=2, para luego acumular solamente la diagonal principal a[0][0]=7, a[1][1]=9 
y al final la suma de esta diagonal acum = 16. 



Lenguaje C 

#include <stdio.h> 

#include <conio.h> 
main ( ) 

{ 

float a [10] [10], acum=0; 
int i , j , k, n, m; 
printf ( "Número de filas ") ; 
scanf ( "%d" , &n) ; 

printf ( "Número de columnas ") ; 
scanf ( "%d" , &m) ; 
for (i= 0 ; i< n; i + + ) 

{ 



a 0 
0 7 


1 

4 


7 3 


9 


2 1 


8 


3 5 


2 



Una posible salida en pantalla, después de 
ejecutar el programa sería: 

Número de filas 2 
Número de columnas 2 
Lectura de la fila 1 de la matriz a: 
a(1, 1)=5 
a(1, 2)=2 

Lectura de fila 2 de la matriz a: 
a(2, 1 ) = 3 
a(2,2) = 7 

Acumulación de la diagonal principal es 12.00 



Ejemplos 



( continúa ) 



160 Capítulo 4 Arreglos 



[continuación) 



Lenguaje C 



printf ( "Lectura de la fila %d de la matriz a :\n",i+l); 
for (j=0; j<m; j+ + ) 

{ 

printf ( "a (%d, %d) = " , i + 1 , j +1) ; scanf ( "%f " , &a [i] [ j ] ) ; 

} 



for (i =0; i<n;i + + ) 
acum=acum+a [i] [i] ; 

printf ( "Acumulación de la diagonal principal es: %6 . 2f " , acum) ; 
getch ( ) ; return 0 ; 



Ejercicio 3. Realice el programa para almacenar en una matriz de f X c (máximo 20 X 20) un conjunto de 
elementos de tipo real y almacenar en una segunda matriz la raíz cuadrada de cada elemento. Imprimir 
la matriz original y posteriormente la matriz que almacenó las raíces cuadradas. 



Pseudocódigo 



Lenguaje C 



principal () 
inicio 

real x[20][20], y[20][20]; entero i, j, f, c 
imprimir "Número de filas"; leerf 
imprimir"Número de columnas"; leer c 
¡mprimir"Dame los valores de la matriz a: 
desde (i <— 0, i < f, i <— i + 1 ) 
desde (j <— 0, j < c, j <— j + 1 ) 
inicio 

i m p r i m i r "a (", i," ,",j,") = " 
leer x[i][j] 

y[i][j] <- raizcuad(x[i][j]) 
fin 

imprimir"Matriz Original" 
desde (i <— 0, i < f,i <— i +1) 
inicio 

desde ( j < — 0, j < c, j < — j + 1 ) 
imprimir x[i][j] 
saltojinea 
fin 

imprimir" Matriz Raíz cuadrada" 
desde (i < — 0, i < f, i < — i + 1 ) 
inicio 

desde ( j <— 0, j < c, j <— j + 1 ) 
imprimir y[i][j] 
saltojinea 
fin 



fin 



#include <stdio.h> 
#include <conio.h> 
#include <math.h> 
main ( ) 



f loat x[20] [20] , y[20] [20] ; int i , j , f , c ; 
printf ( "Número de filas "); scanf ( "%d" , &f) ; 
printf ( "Número de columnas "); scanf ( "%d" , &c) ; 
printf ("Dame los valores de la matriz a:\n "); 
for ( i = 0 ; i< f ; i + + ) 



for ( j =0 ; j<c ; j + + ) 

{ 

printf ( "a ( %d, %d) = ",i,j); 
scanf ( "%f " , &x [i] [ j ] ) ; 
y [i] [ j ] =sqrt (x[i] [ j ] ) ; 

} 

printf ("Matriz Original\n") ; 
for ( i = 0 ; i<f ; i + + ) 

{ 

for ( j =0 ; j <c ; j + + ) 

printf ( "%5 . 2f ", x [i] [ j ] ) 
printf ( "\n" ) ; 

} 

printf ( "Matriz Raíz cuadrada\n" ) ; 
for ( i = 0 ; i< f ; i + + ) 

{ 

for ( j =0 ; j <c ; j + + } 



printf ( “ % 5 . 2 f ", y [ i ] [ j ] ) ; 
printf ( "\n" ) ; 

} 

getch ( ) ; return 0 ; 

} 




4.3 Arreglos tridimensionales (matrices o tablas) 



El ejercicio 3 tiene similitud con el ejercicio resuelto 4 de arreglos unidimensionales, la diferencia es que en 
éste se almacenan los valores en la matriz x; además en lugar de manejar el cuadrado del vector x, se calcula la 
raíz cuadrada de cada elemento de la matriz x; y por último se almacena en la misma posición de la matriz y. 

Si f = 3 y c = 2: 



X 


0 


1 


y 


0 


1 


0 


7.5 


5.4 


0 


2.74 


2.32 


1 


3.6 


7.9 


i 


1.90 


2.81 


2 


1.8 


10.5 


2 


1.34 


3.24 



Cuando se almacena en x [0] [0] = 7.5, se realiza el cálculo y se almacena en y [0] [0] = 2.74. Así sucesivamen- 
te hasta terminar con el elemento en la posición x [2] [1] = 10.5 almacenando en y [2] [1] =3.24. Se imprime 
primero la matriz x, y posteriormente la matriz y. 

Ejercicio 4. Realice el programa para sumar dos matrices y almacenar el resultado en una tercera matriz. 
Imprimir al final el resultado. 



Pseudocódigo 



principal () 
inicio 

real a[1 0][1 0], b[1 0][1 0], c[1 0][1 0] 
entero i , ), n, m 

¡mprimir"Número de filas"; leer n 
¡mprimir"Número de columnas"; leer m 
¡mprimir"Dame los valores de la matriz a" 
desde (i <— 0, i < n, i <— i + 1 ) 
desde (j <— 0,j< m,j <— j + 1) 
inicio 

imprimir"a(",i," =" 
leer a[i][j] 
fin 

¡mprimir"Dame los valores de la matriz b" 
desde (i <— 0, i < n, i <— i + 1 ) 
desde ( j < — 0, j < m, j <— j + 1 ) 
inicio 

imprimir "b(",i ( ", ",j,")=" 
leer b[i][j] 
fin 

desde (i <— 0, i < n, i <— i + 1 ) 
desde (j <— 0, j < m, j <— j + 1 ) 
c[i][j]=a[i][j]+b[i][j] 
imprimir"IVIatriz Suma:" 
desde (i <— 0, i < n, i <— i + 1 ) 
desde (j <— 0, j <m, j <— j + 1 ) 
imprimir c[i][j] 



Lenguaje C 

#include <stdio.h> 

#include <conio.h> 
main () 

{ 

float a [10] [10] , b [10] [10] , c [10] [10] ; 
int i, j ,n,m; 

printf ( "Número de filas ") ; scanf ( "%d" , &n) ; 
printf ( "Número de columnas "); scanf ( "%d" , &m) ; 
printf ( "Dame los valores de la matriz a\n" ) ; 
for (i =0; i <n; i + + ) 

for (j =0; j <m; j + + ) 

{ 

printf ( "a ( %d, %d) = " , i , j ) ; 
scanf ( "%f " , &a [i] [ j ] ) ; 

} 

printf ("Dame los valores de la matriz b\n" ) ; 
for (i = 0; i < n; i + + ) 
for ( j =0; j<m; j+ + ) 

{ 

printf ( "b ( %d, %d) = " , i, j ) ; 
scanf ( "%f " , &b [i] [ j ] ) ; 

} 

for (i =0; i < n; i + + ) 

for (j = 0; j < m; j+ + ) 

c [i] [ j ] =a [i] [ j ] +b [i] [j] ; 
printf ( "Matriz Suma : \n" ) ; 
for (i =0; i < n; i + + ) 
for (j=0; j <m; j + + ) 

printf ( "%f\n" , c [i] [ j ] ) ; getch(); return 0; 



fin 




162 Capítulo 4 Arreglos 



En este ejercicio 4 necesitamos primero almacenar los valores de las matrices a, y b, para luego hacer la suma 
y almacenarla en la matriz c; se declaran tres matrices a,byc, del mismo tamaño. Luego se pregunta el total 
de filas y se guarda en n y el total de columnas y se guarda en m. Se capturaron los datos de las dos matrices 
por separado, pero se pudieron haber pedido en el primer ciclo anidado donde se almacenaron los datos de 
la matriz a. Por lo tanto, encontramos dos ciclos desde (for) anidados para guardar los valores de la matriz 
a. Debemos recordar que internamente se inicia con el elemento cuyas coordenadas son [0] [0] aunque se 
visualiza como [1] [1], para aprovechar al máximo la memoria. Tenemos otros dos ciclos desde (for) anidados 
para guardar los valores de la matriz b, y los últimos dos ciclos desde (for) anidados para sumar los valores de 
ay b y guardar los valores de la matriz c; nótese que para almacenar los valores de la matriz c[i] [j] se toman 
los valores de a[i][j] y b[i][j], es decir si se hace la suma el valor de c [0] [0] = a[0][0] + b [0] [0] , c[0][l] = a[0] 
[1]+ b [0] [1] y así sucesivamente. Los dos últimos ciclos desde (for) anidados sirven para imprimir el resul- 
tado de la matriz c. 



Ejemplos 



Si la matriz es de 3 X 2, es decir n = 3 y m = 2, en la matriz a se llenó primero la fila 0, luego la fila 1 y así 
sucesivamente hasta la fila 2, y por cada fila sus dos columnas, es decir se fueron llenando a[0][0]=8, a[0] 
[1] =4, a[1][0]=2, a[1][1] = 7, a[2][0]=5, a[2][1] = 3; luego se llena la matriz b, b[0][0] = 7, b[0][1]=6, b[1][0]=3, 
b[1][1]=9, b[2][0] = 1, b[2][1] = 8, para realizar la suma y almacenarlos en la matriz c, como se muestra c[0] 
[0]= 8 + 7 =15, y así sucesivamente para que al final se impriman los valores de la matriz c. Veamos las 
matrices: 

b 0 1 

0 7 6 

7 2 7 7 3 9 7 5 16 

253 218 26 11 



a 0 1 

0 8 4 



c 0 1 

0 15 10 



Ejercicio 5 Almacene en una matriz las calificaciones de los exámenes (máximo 10) presentados durante 
un curso por un grupo de estudiantes (máximo 50); calcular el promedio individual, imprimir en pantalla el 
número de cada alumno, sus calificaciones y el promedio del grupo. 



Pseudocódigo Lenguaje C 

#include <stdio.h> 
#include <conio.h> 
#def ine MAX_ALUM 50 
#def ine MAX MAT 10 



constante MAX_ALUM <— 50 
constante MAXJV1AT <— 10 
principal () 
inicio 

real calif [MAX_ALUM][ MAXJVIAT], acum 
entero i, j, t_alum, t_exa 
imprimir"Dame Total de Alumnos"; 
leert_alum 

imprimir"Dame Total de Exámenes"; 
leer t_exa 

desde (i < — 0, i < t_alum, i <— i + 1) 
inicio 

acum <— 0 

desde ( j < — 0, j < t_exa, j <— j + 1 ) 
inicio 

imprimir"Dame el Examen", j + 1, "del alumno:", i + 1 
leer calif[i][j] 

acum <— acum+calif[i][j] 
fin 



main ( ) 

{ 

float calif [MAX_ALUM] [MAX_MAT] ,acum; 
int i, j , t_alum, t_exa; 
printf("Dame Total de Alumnos") 
scanf ( "%d" , &t_alum) ; 
printf("Dame Total de Exámenes") 
scanf ( "%d" , &t_exa) ; 
for ( i = 0 ; i<t_alum; i + + ) 

{ 

acum= 0 ; 

for ( j =0 ; j <t_exa; j + + ) 

{ 

printf ( "Dame el Examen %d del alumno %d: 
scanf ( "%f " , &calif [i] [ j ] ) ; 
acum=acum+calif [i] [j] ; 

} 



j+1, i + 1) ; 



(continúa) 






4.3 Arreglos tridimensionales (matrices o tablas) 163 



( continuación ) 




En este ejercicio se trata de almacenar en una matriz calif todas las calificaciones y en la última columna 
que almacene su promedio. Utilizamos una constante para definir el tamaño de la matriz, considerando 
cuando máximo 50 alumnos y 10 materias. Se pregunta el total de alumnos y se almacena t_alum, y luego el 
total de exámenes, almacenándose en t_exa. El ciclo exterior i (renglones) controla los alumnos y el interior 
j (columnas) los exámenes; antes de entrar al ciclo j se inicializa acum = 0, esto es necesario ya que cada vez 
que se solicite las calificaciones de cada alumno su contador o acumulador inicie en cero. Luego entramos al 
segundo ciclo desde (for), que sirve para solicitar las calificaciones de cada materia y poder almacenarlas en 
la posición según sea el número de alumno y según la calificación del examen. Todas las calificaciones del 
alumno uno se almacenarán en la fila 0 y en la respectiva columna hasta la columna t_exa-l. Al mismo tiem- 
po estas calificaciones se van acumulando en la variable acum-, cuando se sale del ciclo desde (for) j se hace 
la operación para calcular el promedio de cada alumno y lo almacena en la última columna de cada alumno; 
es decir, si es el alumno uno y llevó cuatro materias, éstas estarían almacenadas en calif[0][0j=85, calif [0] 
[1]=75, calif[0][2]=90, calif[0][3]=80, así que su acumulado será acum = 330 para luego dividirlo entre 4 
para calcular el promedio y almacenarlo en la posición calif[0][4]=82.5. Luego encontramos el fin del primer 
ciclo, desde (for) el cual incrementa la variable i en uno para pasarse al siguiente alumno, y la variable acum se 
inicializa otra vez en cero (acum = 0) para iniciar con los exámenes del segundo alumno y así sucesivamente. 
La matriz leída crece de tamaño t_alum x t_exa a t_alum x t_exa+l, ya que el promedio ocupa una columna 
más. Los dos últimos desde (for) anidados sirven para mostrar toda la matriz, incluyendo el promedio calcu- 
lado de cada alumno. Veamos un ejemplo de la tabla respectiva: 



calif 


0 


1 


2 


3 


4 


0 


85 


75 


90 


80 


82.5 


1 


70 


80 


70 


80 


75 


2 


95 


90 


95 


90 


92.5 


3 


60 


70 


60 


70 


65 


4 


80 


90 


90 


80 


85 



Ejercicio 6. Encuentre el elemento mayor y el menor en una matriz de tamaño (10 X 1 0). 



Pseudocódigo 


Lenguaje C 




#include <stdio.h> 




#include <conio.h> 


constante MAX <— 1 0 


#define MAX 10 


principal () 


main ( ) 



( continúa ) 



164 Capítulo 4 Arreglos 



{' continuación ) 



Pseudocódigo 

inicio 

entero a[MAX][MAX],i,j,n,m,may,min 
imprimir"Dame el total de filas:"; 
leer m 

¡mprimir"Dame el total de columnas:" 
leer n 

desde (i <— 0,i<m,i < — i + 1 ) 
desde (j <— 0,j < n,j <— j + 1 ) 
inicio 

imprimir "a(",i,",",j,") = " 
leer a[i][j] 
fin 

may <— a[0][0] 
min <— a[0][0] 

desde (i < — 0,i < m, i < — i + 1 ) 
desde (j <— 0,j < n,j <— j + 1) 
inicio 

si (a[i][j] > may) may t — a[i][j] 
sino si (a[i][j] < min) 
min <— a[i][j] 
fin 

¡mprimir"Número mayor "may 
imprimir"Número menor "min 



fin 



Lenguaje C 

{ 

int a [MAX] [MAX] , i , j , n, m, may, min; 
printf("Dame el total de filas:"); 
scanf ( "%d" , &m) ; 

printf("Dame el total de columnas:"); 
scanf ( "%d" , &n) ; 
f or ( i = 0 ; i< m ; i + + ) 
for ( j = 0 ; j <n; j + + ) 

{ 

printf ( "a (%d, %d) =" , i, j ) ; 
scanf ( "%d" , &a [i] [ j ] ) ; 

} 

may=a [0] [0] ; 
min=a [0] [0] ; 
for ( i = 0 ; i<m; i + + ) 
f or ( j = 0 ; j <n ; j + + ) 

{ 

if (a [i] [ j ] > may) may=a[i][j]; 
else if(a[i] [j]<min) 
min=a [i] [j ] 

} 

printf ( "Número mayor %d\n" , may); 
printf ( "Número menor %d",min); 
getch ( ) ; return 0 ; 

} 



En este ejercicio se declara una matriz de m (filas) y n (columnas); posteriormente se llena utilizando dos 
ciclos anidados del desde (for), la variable i sirve como subíndice para las filas y la variable j para las colum- 
nas. A las variables may y min se les asigna el valor del elemento de la matriz que se encuentra en la primera 
posición, es decir a[0] [0], y otra vez se utilizan dos ciclos anidados del desde (for), ahora para ir comparando 
cada elemento de la matriz con el elemento mayor almacenado en may y con el elemento menor almacena- 
do en min. Para poder encontrar el mayor y el menor se utiliza una estructura de control selectiva doble 
anidada, para ir revisando si el elemento es mayor: si(a[i][j]>may) entonces se almacena este nuevo valor en 
la variable may. Si fue falso se revisa si es menor con la condición si(a[i][j]<min ); si se cumple se almacena 
este nuevo valor en la variable min. 



SI se llena la matriz a con cinco filas y cuatro columnas; si se almacenan los valores del ejemplo anterior en 
ella. Después may = 85 y min = 85, se va revisando cada elemento de matriz, la condición ( 75 > 85) es 
falsa y queda may = 85, luego compara la condición (75<85) es verdadera y se almacena en min = 75 y así 
sucesivamente hasta llegar al último elemento almacenado en a[4][3]. Dicho programa imprimiría Número 
mayor 95 y menor 60. 



Ejercicios complementarios de arreglos bidimensionales en pseudocódigo 165 



Ejercicios complementarios de arreglos bidimensionales en 

pseudocódigo 



Ejercicio 1. Guarde los nombres de los estados y el distrito de la República Mexicana en un arreglo y 
posteriormente imprimirlos. 

principal () 
inicio 

carácter est[ ][20] 

entero i 

desde (i < — 0, i < , i <— i + 1 ) 

inicio 

imprimir"Dame el nombre del estado", i + 1 

leercad 

fin 

desde (i <— 0, i< , i <— i + 1) 

imprimir" estado ",i + 1,"es 

fin 

Ejercicio 2. Complete el siguiente pseudocódigo para llenar una matriz cuadrada (máximo 15 X 15), e 
imprimir la diagonal principal. 

constante MAX 

principal () 
inicio 

entero x[ ][ ],i,j,n 

¡mprimir"Dame el total de filas o columnas" 

leer 

desde (i< — 0, , i<— i + 1) 

desde (j< — 0, , j <— j + 1 ) 



desde (i< — 0, , i <— i + 1) 

imprimir 

fin 



Ejercicio 3. Almacene en una matriz de 10x10 (máx), un conjunto de números enteros positivos y encuen- 
tre el elemento mayor de la matriz y decir en qué posición lo encontró. 



principalO 

inicio 

entero m[10][10], i,j, f, c, pf, pe, mayort— 0 
leerf,c 

desde ( , i < f, i <— i+1) 

desde (j< — 0, j< ,j <— j+1) 



( continúa ) 



166 Capítulo 4 Arreglos 



(continuación) 

inicio 



si(m[i][j]> ) 

inicio 

mayor <— 

pf <— i 



fin 

fin 

imprim¡r"el numero mayor es", "y se encontró en la fila", y columna", 

fin 

Ejercicio 4. Complete el siguiente pseudocódigo que almacena en una matriz de 4 X 4 números reales 
y realiza la suma de toda la fila y el resultado lo almacena en la misma fila y última columna disponible, y 
la suma de toda la columna y el resultado lo almacena en la misma columna y última fila disponible. Impri- 
me solamente la fila de las sumas y la columna de las sumas. 

principal () 
inicio 

real num [ ][ ], acum; entero ¡,j 

imprimir"Almacena los números y suma filas" 

desde (i <— 0, , i <— i + 1) 

inicio 

acum <— 0 

desde (j <— 0, , j <— j + 1 ) 

inicio 

¡mprimir"lntroduce el numero ", i + 1, j+1 

leer 

acum <— acum + num[i][j] 
fin 

num[i][j] +- 

fin 

imprimir"Sumar las columnas" 

desde (j <— 0, ,j <— j + 1) 

inicio 

acum <— 0 

desde 

acum +- acum + num[i][j] 

<— acum 

fin 

imprimir"La Suma de las filas" 

desde (i <— 0, , i <— i+1) 

imprimir 

imprimir"La Suma de las columnas" 

desde (j <— 0, ,j <— j + 1) 

imprimir 



fin 



Ejercicios complementarios de arreglos bidimensionales en lenguaje C 167 



Ejercicios complementarios de arreglos bidimensionales en 

lenguaje C 



Parte I. Complete el siguiente programa, el cual calcula e imprime la multiplicación de dos matrices 
cuadradas 

#include <stdio.h> 

#include <conio.h> 
main ( ) 

{ 

int i , j , k, n, ac=0 ; 

int a [12] [12] , b [12] [12] ,c ; 

printf("Dame el tamaño de la matriz ") ; 



for ( i = 0 ; i<n; i + + ) 

for ( j = 0 ; j <n; j + + ) 

{ 

printf("Dame el elemento de a con coordenadas %d,%d ",i+l,j+l); 



printf("Dame el elemento de b con coordenadas %d,%d ",i + l,j+l); 
scanf ("%d", ) ; 

} 

for ( i = 0 ; i<n; i + + ) 

for ( j = 0 ; j <n; j + + ) 

{ 

ac = 0; 

f or (k=0 ; k<n ; k+ + ) 

ac = ac + a [i] [k] *b [k] [ j ] ; 
c [i] [j]= ; 

} 

for ( i = 0 ; i<n; i + + ) 

{ 

for ( j = 0 ; j <n; j + + ) 

printf("%d ", ) ; 

printf ( "\n" ) ; 

} 

return 0 ; 
getch ( ) ; 




Parte II. Realice la prueba de escritorio o corrida a mano de los siguientes programas: 



Ejercicio 1 

main ( ) 

{ 



Ejercicio 2 

main ( ) 

{ 



int i , j , segundo [15] ; 

int primero [15] ={1,12,3,14,5,26,7,5,3,1}; 



int i , j ; 

int tercero [10] [10] ; 



( continúa ) 



168 Capítulo 4 Arreglos 



( continuación ) 

for ( i = 2 ; i<7 ; i + + ) 

segundo [i] = primero [ 2 * i — 2] +i ; 
for ( j =2 ; j <5 ; j + + ) 

{ 

printf("%d, ", primero [j +1] ) ; 
printf ( "%d\n" , segundo [j +2] ) ; 

} 

getch ( ) ; 
return 0 ; 

} 



Ejercicio 3 

main ( ) 

{ 

int i , j , veo [5] = {3 , 1, 6 , 4 , 5 } , mat [3] [4] ; 
for ( i = 0 ; i<3 ; i + + ) 
for ( j = 0 ; j <4 ; j + + ) 

mat [i] [ j ] =vec [i] +vec [ j ] + j ; 
for ( i = 0 ; i<2 ; i + + ) 

{ 

j=i; 

while (j<5) 

{ 

printf ( "%d\n" , mat [i + 1] [ j — i] ) ; 
j+=2; 

} 

} getch ( ) ; return 0 ; 



f or ( i = 0 ; i<5 ; i + + ) 
f or ( j = 0 ; j <5 ; j + + ) 

tercero [i + 1] [ j ] = — j/2 + i*3 + 3 ; 
for(i = l;i<5;i + = 2) 

{ 

j =2 ; 

while ( j <5 ) 

{ 

printf ( "%d, %d, %d\n" , i , j , tercero [i] [j] ) ; 
j=j+2; 

} 

return 0 ; 

} getch () ; 

} 

Ejercicio 4 

main ( ) 

{ 

int a [3] [3] = {11,12,31,4,5,16}, c[3] [3] ; 
int i, j ,b [3] ={7, 8, 9} ; 
for ( i = 0 ; i<3 ; i + + ) 
for ( j = 0 ; j<3 ; j + + ) 

c [i] [ j ] =a [ j ] [i]+b[j]+j; 
for ( i = l ; i<2 ; i + + ) 

{ 

j=0; 

while ( j<3) 

{ 

printf ( "%d, %d\n" , i*b [ j ] , c [i] [ j ] ) ; 
j+ = 2; 

} 

} getch ( ) ; return 0 ; 



Parte III. Elabore la codificación en lenguaje C de los siguientes programas (realizando el cálculo e 
impresión respectiva): 

1. Almacene los elementos de una matriz mXn (máximo 10X10) e imprimir cuántos números son ceros, 
cuántos son negativos, y cuántos positivos. Imprimir además la suma de los negativos y la suma de los 
positivos. 

2. Leer los elementos de una matriz mXn (máximo 10X10) y multiplicarla por un escalar. 

3. Almacene los elementos de una matriz mXn (máximo 10X10) e imprimir : 

a) Suma de los elementos. 

b ) Promedio de los elementos. 

c) Elemento que más se repite (moda). 



Ejercicios complementarios de arreglos bidimensionales en lenguaje C 169 



4. Almacene los elementos de una matriz nXm (10X 10 como máximo) y posteriormente almacene toda la 
matriz en un vector. Imprimir el vector resultante. 

5. Almacene los elementos de una matriz nXm (10X10 como máximo) y calcule el producto de dicha 
matriz por un vector. 

6. Almacene los elementos de una matriz de 4X4 (números enteros positivos). Imprimir la fila que contiene 
el número menor y la columna que tenga el número mayor. 

7. Leer los elementos de una matriz cuadrada mXn y almacenarlos los elementos en otra matriz donde se 
invertirá el orden original de cada fila. Al final imprimir la matriz resultante. 

8. Leer los elementos de una matriz mXn donde no se deben ingresar números repetidos. 

9. Leer los elementos de una matriz nXm (máximo 10X10) y generar un vector que almacene el máximo 
elemento de cada columna de la matriz. Imprimir dicho vector. 

10. Genere una matriz cuadrada (máximo 10X10) con números aleatorios entre 1 y 50, manejando el 
siguiente criterio: las filas se llenarán con números acordes a ellas, si son filas impares (1,3, 5, etc.) con 
números impares y si son las filas pares (0,2, 4, etc.) con números pares. Al final imprimir dicha matriz. 

11. Leer los elementos de una matriz cuadrada (máximo 15X15) y determinar si la matriz cumple con 
alguna de las siguientes propiedades: 

a) Matriz simétrica (si los valores de cada fila son iguales a los de su columna correspondiente) 

b) Matriz identidad (a. = 0 si i A j y a. = 1 si i = j) 

c) Matriz triangular superior (todos los elementos por debajo de la diagonal son ceros) 

d) Matriz triangular inferior (todos los elementos por encima de la diagonal son ceros) 

12. Leer los elementos de una matriz cuadrada (máximo 15X15) e imprimir : 

a) La traspuesta 

b ) La suma de todos los elementos que no son de la “periferia” de la matriz. 

13. Genere una matriz 4X4 con las primeras 16 letras del abecedario en minúsculas: 



a 


b 


c 


d 


e 


f 


9 


h 


¡ 


j 


k 


1 


m 


n 


O 


P 



14. Leer los elementos de una matriz cuadrada de tamaño n (10X10 como máximo), calcular la sumatoria de 
los elementos de las diagonales (principal e inversa) y guardar estos elementos en dos vectores (DP y DI). 



n = 4, sumatoria de DP = 1 9 y sumatoria de Dl = 50. 



Ejemplos 



M 


0 


1 


2 


3 


DP 


DI 


0 


7 


1 


9 


6 


7 


6 


1 


4 


2 


20 


7 


2 


20 


2 


3 


22 


1 


8 


1 


22 


3 


2 


11 


10 


9 


9 


2 



15. Genere la matriz espiral (en forma de caracol) de nXn. 





170 Capítulo 4 Arreglos 



Ejemplos 



1 


2 


3 


4 


5 


16 


17 


18 


19 


6 


15 


24 


25 


20 


7 


14 


23 


22 


21 


8 


13 


12 


11 


10 


9 



16. Genere un cuadrado mágico 3X3 (matriz 3X3 formada por números del 1 al 9 donde la suma de sus 
filas, sus columnas y sus diagonales son idénticas). 

17. Leer los elementos de una matriz de 3X3 y calcular su determinante. 

18. Genere una matriz de 5X5 con números aleatorios entre 1 y 100; posteriormente ordenarla en forma 
descendente utilizando el método de la burbuja. 

19. En el triángulo de Pascal cada número es la suma de los que se encuentran a ambos lados en el renglón 
de arriba. Calcular e imprimir los n primeros renglones del triángulo de Pascal. No es necesario que la 
impresión sea en la forma simétrica de triángulo: 

1 

1 1 
12 1 
1331 
14641 

20. En el campeonato de fútbol mexicano participan n equipos. Cada equipo se identifica con un número. 
Para cada equipo se registra el número de: 

a) Partidos ganados (PG). 

b) Partidos empatados (PE). 

c) Partidos perdidos (PP). 

d) Partidos jugados (PJ). 

e) Diferencia de goles (DG). 

En la última columna calcular los puntos respectivos sabiendo que se obtienen: 3 puntos por partido 
ganado y 1 punto por empate. Imprimir una matriz con los datos obtenidos por cada equipo. Al final 
imprimir el número del equipo campeón. 

Para el desempate en el primer lugar se toma en cuenta: 

a) Mayor número de partidos ganados. 

b) Mejor diferencia de goles. 

21. Considere el siguiente listado de países y capitales: Alemania-Berlín, Argentina-Buenos Aires, Brasil- 
Brasilia, Canadá-Ottawa, Chile-Santiago, Ecuador-Quito, Inglaterra-Londres, Francia-París, Italia-Roma, 
Japón-Tokio, México-D.F. Elabore un programa que permita leer el nombre de un país e imprimir el 
nombre de la capital o viceversa. 




Programación 

modular 








Al término de este capítulo, 
el alumno será capaz de 



Definir y utilizar la técnica de dividir un pro- 
blema en módulos para facilitar su resolución 
y mantenimiento así como la reutilización del 
código. 



5.4 Funciones sin paso de parámetros 

5.5 Ejercicios resueltos de funciones sin paso 
de parámetros 

5.6 Funciones con paso de parámetros 

5.7 Ejercicios resueltos de funciones con pa- 
so de parámetros 

5.8 Recursividad 

Funciones predefinidas de lenguaje C 

5.10 Ejercicios resueltos de funciones prede- 
finidas de lenguaje C 

5. 1 1 Creación de librerías en lenguaje C 






Contenido 



5.9 



5.1 Definición 

5.2 Programa principal y funciones 

5.3 Prototipo de una función 




Capítulo 5 Programación modular 



5.1 Definición 

/ 

Un problema difícil es más sencillo al dividirlo en pequeñas partes y tratar de buscar la solución de cada una 
de ellas y así resolver todo el problema general; lo mismo sucede en programación, la mejor forma de ela- 
borar y dar mantenimiento a un programa complejo es construirlo a partir de bloques menores o módulos, 
pues de esta manera es más fácil analizar, programar y darle mantenimiento a cada uno de ellos, que si estu- 
viera todo el código en el programa principal. Dichos módulos se escriben solamente una vez, pero pueden 
ser llamados en diferentes puntos del programa principal o de cualquier otro módulo. 

Al método que plantea la solución de un problema principal partiendo de las soluciones de sus subpro- 
blemas se le conoce como diseño descendente. 1 Se denomina así ya que inicia en la parte superior con un 
problema general y el diseño específico de las soluciones de los subproblemas. 

La programación modular es una técnica que consiste en dividir un programa en tareas y dar origen a la 
creación de pequeños programas llamados módulos, subprogramas o subrutinas con la finalidad de simplifi- 
car la elaboración y mantenimiento del mismo (véase figura 5.1), donde cada módulo se codifica y se procesa 
de manera independiente, sin importar los detalles de otros módulos. Esto facilita la localización de un error 
cuando se produce. Este tipo de programación es uno de los métodos de diseño más flexibles y potentes para 
mejorar la productividad de un programa. 

En lenguaje C a cada módulo o subprograma se le conoce como función; en este lenguaje se trabaja a 
base de funciones y, de manera general, los programas se elaboran combinando funciones que el programa- 
dor escribe y funciones “predefinidas” disponibles en la biblioteca estándar de C. 




Figura 5.1 Esquema de programación modular. 



Las ventajas de la programación modular son las siguientes: 

1. Facilita el diseño descendente. 

2. Se simplifica un algoritmo complejo. 

3. Cada módulo se puede elaborar de manera independiente, lo que permite trabajar simultáneamente a 
varios programadores y con ello disminuir el tiempo de elaboración del algoritmo. 

4. La depuración se lleva a cabo en cada módulo. 

5. El mantenimiento es más sencillo. 

6. Creación de bibliotecas con módulos específicos (se pueden utilizar en otros programas). 

Nota: En este capítulo a los módulos o subprogramas los llamaremos funciones, ya que todas las características descritas son 
propias del lenguaje C. 2 



1 Diseño descendente ( top-down) es un proceso mediante el cual un problema se descompone en un serie de niveles o pasos sucesivos 
de refinamiento (stepwise). 

2 Cada lenguaje de programación tiene sus propias características en programación modular; en este caso de lenguaje C. 



5.2 Programa principal y funciones 



173 



5.2 Programa principal y funciones 



La base de la programación en C es la función, ya que constituye una parte fundamental de la codificación 
en el proceso de solución de problemas. Un programa contiene una o más funciones en uno o más archivos. 
Una de las funciones es mainQ, donde se inicia la ejecución del programa. 

El resto de las funciones se llaman desde main() y desde el interior de otras funciones. 

5.2.1 Programa principal o función ma¡n() 

El papel más importante del programa principal (mainQ) es coordinar a las otras funciones mediante llama- 
das o invocaciones. 

5.2.2 Función 

Es un subprograma que realiza una tarea específica que puede o no recibir valores (parámetros). En C po- 
demos devolver cualquier tipo de datos escalares (puntero, tipo numérico y el tipo carácter o en su caso 
regresar un valor nulo que llamaremos nada o ninguno). Asimismo, no se pueden devolver arreglos ni es- 
tructuras. El uso de funciones es una práctica común y recomendable ya que permite dividir el código, sim- 
plificando así el desarrollo y la depuración del mismo. Para utilizar funciones en un programa es necesario 
declararlas previamente. 

5.2.3 Ámbito de las variables 

Variable local. Variable declarada en una determina función, sólo se encuentra disponible durante el fun- 
cionamiento de la misma, es decir está en memoria cuando dicha función está activa. 

Variable global? Variable declarada fuera de cualquier función y que puede ser utilizada por las funciones 
que se encuentran después de dicha declaración; por lo tanto si la declaramos junto a las librerías, la podrá 
utilizar todo el programa. Esta características es propia del lenguaje C. 

5.2.4 Llamada o invocación de una función 

Para llamar una función es necesario escribir el nombre o identificador de la función y en seguida un par de 
paréntesis, que estarán vacíos si hablamos de funciones sin paso de parámetros y tendrán información en 
caso de ser funciones con paso de parámetros. 

5.2.5 Cómo se ejecuta un programa que contiene funciones 

El compilador siempre inicia con la primera instrucción que encuentra en el programa principal (main) y 
continúa ejecutándolo según la estructura de control (secuencial, selectiva o repetitiva) del programa; cuan- 
do encuentra la llamada a una función éste se traslada y ejecuta el cuerpo de la función desde la primera 
instrucción hasta encontrar el fin de la misma; cuando esto sucede el compilador regresa a la siguiente ins- 
trucción que llamó a la función y continúa de la misma manera. 

5.2.6 Ubicación de una función en un programa 

Las funciones pueden ir antes o después del programa principal, pero si se ubican después es necesario es- 
cribir el prototipo de la función (el encabezado) antes del programa principal. Una función puede que regrese 
o no regrese nada ( void ). En el primer caso se comporta como una variable, ya que la podemos imprimir, 
asignar a otra variable, comparar, utilizar como parámetro, etc. En el segundo caso, el resultado lo tenemos 
que imprimir dentro de la función (sólo las variables globales se imprimirán fuera). Existen dos tipos de 



3 Es importante que la comunicación entre un programa y un subprograma o entre subprogramas deba realizarse a través de paráme- 
tros, y no de variables globales, ya que consumen más memoria. 



174 Capítulo 5 Programación modular 






Ejemplos 

© 



funciones: Sin paso de parámetros y con paso de parámetros. A partir de la sección 5.4 mencionaremos cada 
una de ellas. 



5.3 Prototipo de una función 

Un prototipo es el encabezado de una función, es decir la primera línea de la función. La ventaja de utilizar 
prototipos es que las funciones pueden estar en cualquier lugar y en cualquier orden y pueden ser llamadas 
desde cualquier punto del programa principal o de otra función. 

En lenguaje C, lleva punto y coma al finalizar. Primero mostramos la sintaxis de funciones sin paso de parámetros y sin prototipos: 



Pseudocódigo 


Lenguaje C 


Variables globales 


# librerías 
Variables globales; 


Constantes 


Constantes 


nada funcion_a ( ) 


void función a ( ) 


inicio 


{ 


variables locales 


variables locales; 


Instrucción 1 


Instrucción 1; 


Instrucción 2 


Instrucción 2; 


fin 


} 


nada funcion_b ( ) 


void función b ( ) 


inicio 


{ 


variables locales 


variables locales; 


Instrucción 1 


Instrucción 1; 


Instrucción 2 


Instrucción 2; 


fin 


} 


principal ( ) 


main ( ) 


inicio 


{ 


Variables locales 


Variables locales; 


Cuerpo del programa principal 


Cuerpo del programa principal 


funcion_a( ) 


función a( ); 


funcion_b() 


función b ( ) ; 


Instrucción 3 


Instrucción 3; 


fin 


} 


Si se desea declarar primero los prototipos de cada función, luego el cuerpo de la función principal y al final el 


cuerpo de cada función, ésta sería su sintaxis u orden: 


Pseudocódigo 


Lenguaje C 


Variables globales 


# librerías 
Variables globales 


Constantes 


Constantes 


funcion„a ()// prototipo de la función a 


función a 0 ;// prototipo de la función a 


funcion_b ()// prototipo de la función b 


función b 0 ;// prototipo de la función b 


principal () 


main ( ) 


inicio 


{ 



( continúa ) 



5.4 Funciones sin paso de parámetros 



175 



( continuación ) 



Pseudocódigo 


Lenguaje C 


Variables locales 


Variables locales 


Cuerpo del programa principal 


Cuerpo del programa principal 


funclon_a() 


función a(); 


función b() 


función b ( ) ; 


fin 


} 


función _a() 


función a () 


inicio 


{ 


Variables locales 


Variables locales 


Instrucción 1 


Instrucción 1; 


Instrucción 2 


Instrucción 2; 


Instrucción 3 


Instrucción 3; 


fin 


} 


Pseudocódigo 


Lenguaje C 


funcion_b() 


función b ( ) ; 


inicio 


{ 


Variables locales 


Variables locales 


Instrucción 1 


Instrucción 1; 


Instrucción2 


Instrucción 2; 


fin 


} 



La desventaja de las funciones sin prototipos, es que en el momento de llamarlas o invocarlas tienen que 
estar declaradas antes; por ejemplo, en la sintaxis de las funciones sin paso de parámetros y sin prototipos 
la funcion_b ( ) y principal ( ) (maín) llaman a la funcion_a ( ) que está declarada antes; sin embargo la 
funcion_a ( ) no puede llamar a la funcion_b ( ). La función mainQ puede llamar a cualquier función, pero 
ninguna otra función puede llamar a main(). 

Un prototipo sin paso de parámetros es el encabezado de la función; en lenguaje C, como veremos en 
seguida, a diferencia de la declaración de una función, lleva punto y coma. La ventaja es que le avisa al com- 
pilador que existe una función que regresa un determinado tipo de dato y puede ser utilizada en cualquier 
momento, por lo que la declaración de las funciones no tiene que ser antes de la llamada sino después de la 
función principal o main. 



5.4 Funciones sin paso de parámetros 



Son aquellas que no reciben parámetros o valores, ya que éstos se solicitan dentro de la función, luego se 
realizan las instrucciones (cálculos u operaciones) y normalmente se imprime el resultado. 

A continuación aparece la sintaxis correspondiente: 



Pseudocódigo 


Lenguaje C 


nada ldentif_funclon( ) 


void Identif función ( ) 


inicio 


{ 


Declaración de variablaes 


Declaración de variables; 


Cuerpo de la función 


Cuerpo de la función; 




fin 


} 



176 Capítulo 5 Programación modular 



Lenguaje C 

printf ("%d =" , Identif_funcion ( ) ) ; 
Variable = Identif_ funcion(); 
if ( Identif_f unción () > Expresión); 

Donde: 

Variable es la variable en donde se guardará el valor devuelto por la función. 
ldentif_funcion es el nombre de la función que regresará un determinado valor. 



De llamadas a una función sin paso de parámetros: 



Ejemplos 



Pseudocódigo 

imprimir ldentif_funcion ( ) 
Variable <— ldentif_ función () 
si (IdentifJúncionQ > Expresión) 






5.5 Ejercicios resueltos de funciones sin paso de parámetros 

Ejercicio 1 . Imprimir una serie de enunciados según el orden del programa principal y las funciones. 



Pseudocódigo 


Lenguaje C 




#include <stdio.h> 




#include <conio.h> 


nada funcion_x ( ) 


void función x ( ) 


inicio 


{ 


imprimir"Programación modular" 


printf ( "Programación i 


imprimir" Las funciones son importantes" 


printf ( "Las funciones 


fin 


} 


nada principal ( ) 


void* main ( ) 


inicio 


{ 


imprimir"Modulo 5" 


printf ( "Modulo 5\n"); 


func¡on_x ( ) 


función x ( ) ; 


imprimir"y nos ayudan en la programación" 


printf ( "y nos ayudan < 




getch ( ) ; return 0 ; 


fin 


} 



* Si se utiliza el compilador dev-cpp y Code::Blocks, no se puede utilizar el tipo de dato void; en su lugar se utiliza el tipo 
int o se omite el tipo. 

Todo programa inicia con la primera instrucción del programa principal; en este ejercicio es imprimir “Mó- 
dulo 5”, así que el compilador la ejecuta y muestra en pantalla Módulo 5; la siguiente instrucción es la llamada 
a la función funcion_x(), así que el compilador se ubica en la primera instrucción de la funcion_x, que en este 
caso es: imprimir “Programación modular”, así que el compilador la ejecuta y se muestra en pantalla Progra- 
mación modular, se continúa con la siguiente instrucción de la funcion_x que es imprimir “Las funciones son 
importantes”, así que el compilador la ejecuta y se muestra en pantalla Las funciones son importantes, luego se 
encuentra el fin de la funcion_x, por consiguiente el compilador regresa a la siguiente instrucción del progra- 
ma que lo llamó, que en este caso es imprimir “y nos ayudan en la programación”, por lo tanto la última línea 
que se imprime es: y nos ayudan en la programación. Por último encontramos el fin del programa principal 
y con eso termina el mismo. 



5.5 Ejercicios resueltos de funciones sin paso de parámetros 



177 



Ejercicio 2. Imprimir una serie de enunciados según el orden en que las fundones son llamadas. 




Este programa consta de cinco funciones, una de las cuales es la función principal que llama a las otras 
cuatro. La primera instrucción del programa principal es la llamada a la funcion_a, en la cual su primera y 
única instrucción es imprimir “Introducción a la programación”-, el compilador la ejecuta y muestra en pan- 
talla Introducción a la programación, encuentra el fin de la funcion_a y el compilador regresa al programa 
principal donde la siguiente instrucción es la llamada a la funcion_b. la cual ejecuta e imprime Introducción 
a la física-, regresa al programa principal donde la siguiente instrucción es la llamada a la funcion_c, la cual 
ejecuta e imprime Introducción a la química-, regresa al programa principal donde la siguiente instrucción 
es la llamada a la funcion_d, la cual ejecuta e imprime Introducción a la computación, regresa al programa 
principal y se encuentra con el fin del programa. 

Ejercicio 3. Utilización de las mismas fundones del ejercicio 2 pero con el siguiente programa principal. 




( continúa ) 



Capítulo 5 Programación modular 



(continuación) 




Es similar al ejercicio 2, sólo que la primera instrucción del programa es imprimir “Materias de la carrera’’, 
luego llama a las cuatro funciones en el siguiente orden: funcion_b, funcion_d, funcion_a, funcion_c, e im- 
prime Introducción a la física, Introducción a la computación, Introducción a la programación, Introducción 
a la química-, luego regresa al programa principal y la siguiente instrucción es imprimir "Otras más” y llama 
otra vez a la funcion_d mostrando en pantalla Introducción a la computación, luego regresa al programa prin- 
cipal y por último llama a la funcion_a e imprime Introducción a la programación. 

Como se puede apreciar, es posible llamar más de una función según la lógica del programa; en las fun- 
ciones con paso de parámetro se aprecia mejor la utilización de las funciones. 

Ejercicio 4. Imprimir una serie de enunciados según el orden en que las funciones son llamadas. 



Pseudocódigo 



nada funcion_2 ( ) 
nada funcion_1 ( ) 
inicio 

imprimir "Azul" 
imprimir "Verde" 
fin 

nada funcion_3 ( ) 
inicio 

impr¡m¡r"Blanco" 
imprimir "Negro" 
fin 

principal () 
inicio 

imprimir "Los colores" 
impr¡mir"Lila" 
funcion_2 () 
imprimir "café" 



fin 

nada funcion_2 ( ) 
inicio 

impr¡mir"Amarillo" 



Lenguaje C 

#include <stdio.h> 

#include <conio.h> 
void funcion_2 ( ) ; 
void funcion_l ( ) 

{ 

printf ("Azul\t"); 
printf ("Verde\t"); 

} 

void funcion_3 ( ) 

{ 

printf ( "Blanco\t" ) ; 
printf ("Negro\t"); 

} 

raain ( ) 

{ 

printf ("Los colores\n"); 
printf ("Lila\t"); 
funcion_2 ( ) ; 
printf ("café\t"); 
getch(); return 0; 

} 

void funcion_2 ( ) 

{ 

printf ( "Amarillo\t" ) ; 



( continúa ) 




5.5 Ejercicios resueltos de funciones sin paso de parámetros 



179 



( continuación ) 


Pseudocódigo 


Lenguaje C 


¡mprimir"Rojo" 


printf ("Rojo\t"); 


funcion_1 ( ) 


función 1 ( ) ; 


impr¡mir"Naranja" 


printf ( "Naranja\t" ) ; 


fin 


} 



En este ejercicio comenzamos a utilizar el concepto de prototipo, en la primera línea del pseudocódigo apa- 
rece el prototipo nada funcion_2, cuyo equivalente en lenguaje C es void funcion_2;. Es importante recordar 
que al final de un prototipo en C lleva punto y coma. En este ejemplo la función _2 se declaró después de 
principal o en el caso del lenguaje C de main, ya que el prototipo va y busca en qué parte del programa está 
declarada dicha función. Si no hubiéramos declarado el prototipo en el momento de llamar a la función fun- 
cion_2, marcaría error, ya que el compilador la buscaría arriba y no la encontraría. En este ejercicio vemos la 
desventaja de no utilizar prototipos ya que funcion_l no puede llamar a ninguna otra función. 

Este ejercicio nos muestra que una función puede ser llamada por el programa principal o por otra 
función; si compilamos el programa la primera instrucción es imprimir “Los colores”, se muestra en pantalla 
Los colores y Lila, luego llama a la funcion_2 cuya primera instrucción es imprimir “Amarillo”, muestra en 
pantalla Amarillo-, luego la siguiente instrucción es imprimir “Rojo” y muestra en pantalla Rojo, la siguiente 
instrucción llama a la funcion_l cuya primera línea imprime “Azul”, muestra en pantalla Azul, después im- 
prime “Verde”, encuentra el final de la funcion_l y regresa a la siguiente que imprime “Naranja”, encuentra el 
fin de la funcion_2 y regresa al programa principal para imprimir café. Como vemos, ninguna función llama 
a funcion_3. 

En este ejercicio vemos la desventaja de no utilizar prototipos ya que funcion_l ( ) no puede llamar a 
ninguna otra función. 

Ejercicio 5. Haga el programa principal y dos funciones sin paso de parámetros: a) sumar dos números 
enteros y b) multiplicar dos números enteros. 




( continúa ) 



180 Capítulo 5 Programación modular 



{' continuación ) 




En la primera línea del pseudocódigo aparece el prototipo nada suma, cuyo equivalente en lenguaje C es 
void suma. Al final de un prototipo en C lleva punto y coma. En este ejemplo la suma se declaró después 
de principal o en el caso del lenguaje C de main, ya que el prototipo va y busca en qué parte del programa 
está declarada dicha función. Si no hubiéramos declarado el prototipo en el momento de llamar a la función 
suma, marcaría error, ya que el compilador la buscaría arriba y no la encontraría. El programa principal 
tiene una variable opcional opc de tipo entero, y por lo tanto ésta queda en memoria para su utilización, 
luego se imprime “¿Qué deseas hacer?” y se muestran dos opciones: a) Suma de dos números, y b) Producto 
de dos números; el usuario elige una opción (1 o 2) y se almacena en la variable opc. Si eligió opc = l llama a 
la función suma, la cual declara tres variables locales de tipo entero ni, n2 y suma, solicita dos números y los 
almacena en ni y n2, luego hace la suma y almacena el resultado en la variable suma e imprime el resultado 
“La suma es: “. Si eligió opc =2 llama a la función producto, la cual declara tres variables locales de tipo en- 
tero ni, n2 y prod, solicita dos números y los almacena en ni y n2, luego hace la multiplicación y almacena 
el resultado en la variable prod e imprime el resultado, “El producto es: ”. Por lo tanto el programa principal 
solamente llama a una función cada vez que se corre el mismo. Hay que recordar que en las funciones que no 
regresan nada (void) el resultado se imprime dentro de la función. 

Ejercicio 6. Haga el programa principal y opciones a tres funciones sin paso de parámetros que calcu- 
len: a) La hipotenusa de un triángulo rectángulo, b) El área de un triángulo, c) El tercer ángulo de un 
triángulo. 




(continúa) 



5.5 Ejercicios resueltos de funciones sin paso de parámetros 



181 



( continuación ) 



Pseudocódigo 

imprimirla hipotenusa del triángulo mide: ", h 
fin 

nada area ( ) 
inicio 

entero base, alt 
real a 

imprimir "Escriba la base y la altura:" 
leer base, alt 
a <— base * alt / 2 

impr¡mir"EI área del triángulo es: " a 
fin 

nada ángulo ( ) 
inicio 

real al, a2, a3 

imprimir "Escriba el valor de los dos ángulos:" 
leer al, a2 

a3<- 180 - (al + a2) 
impr¡mir"EI tercer ángulo mide:", a3 
fin 

principal ( ) 
inicio 

carácter opc 

imprimir "a) Hipotenusa de un triángulo rectángulo" 

imprimir "b) Área de un triángulo" 

imprimir "c) Tercer ángulo de un triángulo" 

imprimir "Elige una opción"; leer opc 

segundea (opc) 

inicio 

caso 'a' : hipotenusaO 
salir 

caso'b': area( ) 
salir 

caso'c': angulo( ) 
salir 
fin 
fin 



El programa no tiene prototipos, por ello las funciones se declararon antes de ser llamadas, en este caso antes 
del programa principal (main); tiene una función principal y 3 funciones, cada una de ellas con sus variables 
locales y su cuerpo de la función; el programa principal declara una variable local opc de tipo carácter para 
almacenar a, b o c según lo que el usuario elija; se utilizan las estructuras de control selectiva múltiple ya que 
son tres opciones diferentes. Si elige la opc=a llamará a la función hipotenusa, si elige la opc=b llamará a 
la función area y si elige la opc=c llamará a la función ángulo. Cada función es independiente y puede ser 
llamada en cualquier orden. Cuando se ejecuten alguna de las tres funciones y encuentre el final de la misma 
regresa al programa principal, que en este caso en el fin del segun_sea, y concluye el programa. 



Capítulo 5 Programación modular 



Lenguaje C 

#include <stdio.h> 

#include <conio.h> 

#include <math.h> 
void hipotenusa ( ) 

{ 

int co, ca; 
float h; 

printf ("Escriba la longitud del cateto adyacente al ángulo 
scanf ("%d",&ca); 

printf ("Escriba la longitud del cateto opuesto al ángulo: 
scanf ("%d",&co); 
h = sqrt (co * co + ca * ca) ; 

printf ("La hipotenusa del triángulo mide: %f", h) ; 

} 

void area ( ) 

{ 

int base, alt; float a; 

printf ("Escriba la base y la altura: ") ; 
scanf ( "%d%d" , &base, &alt) ; 
a = base * alt / 2; 

printf ("El área del triángulo es: %f", a) ; 

} 

void ángulo ( ) 

{ 

float al, a2 , a3 ; 

printf ("Escriba el valor de los dos ángulos: "); 
scanf ("%f%f",&al, &a2); 
a3 = 180 - (al+a2) ; 

printf ("El tercer ángulo mide: %f", a3); 

} 

main ( ) 

{ char opc ; 

printf ( "a) Hipotenusa de un triángulo rectángulo \n") ; 
printf ("b)Área de un triángulo\n" ) ; 
printf ("c)Tercer ángulo de un triángulo \n") ; 
printf ("Elige una opción\n") ,- scanf ( "%c" , &opc) ; 
switch (opc) 

{ 

case 'a' : hipotenusa ( ) ; 
break; 

case 'b' : area ( ) ,- 
break; 

case 'c' : ángulo ( ) ; 
break; 

} 



getch ( ) ; return 0 ; 



5.5 Ejercicios resueltos de funciones sin paso de parámetros 



183 



Ejercicio 7. Haga el programa principal con opciones a cuatro fundones sin paso de parámetros que 
conviertan de: a) Grados centígrados a grados Fahrenheit, b) Grados Fahrenheit a grados centígrados, 
c) Grados centígrados a kelvins, d) Kelvins a grados centígrados. 



Pseudocódigo 

nada convertir_C_F ( ) 
nada convertir_F_C ( ) 
nada convertir_C_K ( ) 
nada convert¡r_K„C ( ) 
principal ( ) 
inicio 

carácter opc 

hacer 

inicio 

imprimir "Elige una de las siguientes conversiones" 
imprimir "a) Grados centígrados a grados Fahrenheit" 
imprimir "b) Grados Fahrenheit a grados centígrados" 
Imprimir "c) Grados centígrados a kelvins" 

Imprimir "d) Kelvins a grados centígrados" 
leer opc 

segun_sea (opc) 
inicio 

caso 'a': convertir_C_F( ); salir 
caso'b': convertir_F_C( ); salir 
caso'c': convertir_C_K(); salir 
caso'd': convertir_K_C( ); salir 
fin 

imprimir"¿Deseas repetir el programa S/N? leer opc 
fin 

mientras (opc = 'S') 
fin 

nada convertir_C„F ( ) 

inicio 

realc,f 

imprimir"Dame los grados centígrados:"; leer c 
f<- 1.8*c +32 
imprimir "Los grados son:" f 
fin 

nada convertir_F_C ( ) 
inicio 

realc.f 

imprimir"Dame los grados Fahrenheit:"; leerf 
c <— ( f —32 ) * 5/9 
imprimir "Los grados son:", c 
fin 

nada convertir_C„K ( ) 



( continúa ) 



184 Capítulo 5 Programación modular 



( continuación ) 

Pseudocódigo 

inicio 

real c , k 

imprimir"Dame los grados centígrados:"; leer c 
k<— c + 273 

imprimir "Los grados son:", k 
fin 

nada convertir_K_C ( ) 
inicio 

real c , k 

imprimir"Dame los kelvins:"; leer k 
c <— 273 — k; ¡mprimir"Los grados son:" c 
fin 



Lenguaje C 

#include <stdio.h> 
#include <conio.h> 
void convertir_C_F ( ) ; 
void convertir_F_C ( ) ; 
void convertir_C_K ( ) ; 
void convertir_K_C ( ) ; 
main ( ) 



char opc 
do 



{ 



printf ("Elige una de las siguientes conversiones 
printf ("a) Grados centígrados a grados Fahrenheit 
printf ("b) Grados Fahrenheit a grados centígrados 
printf ("c) Grados centígrados a Kelvins\n"); 
printf ("d) Kelvins a grados centígrados\n" ) ; 
scanf ( "%s" , &opc) ; 
switch (opc) 

{ 



\n" ) ; 
\n" ) ; 
\n" ) ; 



case 'a' 
case 'b' 
case 'c' 
case 'd' 



convertir_C_F ( ); break; 
convertir_F_C ( ); break; 
convertir_C_K ( ); break; 
convertir_K_C ( ); break; 



} 



printf ("\n¿ Deseas repetir el programa S/N?\n"); scanf 
Jwhile (opc == ’S'); return 0; 



} 



void convertir C F ( ) 



%s" , &opc) ; 



( continúa ) 



5.5 Ejercicios resueltos de funciones sin paso de parámetros 



185 



{ continuación ) 



Lenguaje C 

{ 

float c , f ; 

printf ("Dame los grados centígrados: " ); scanf ("%f",&c); 
f = 1.8 *c +32; printf ("Los grados son: %f", f) ; 

} 

void convertir_F_C ( ) 

{ 

float c , f ; 

printf ("Dame los grados Fahrenheit: " ); scanf ("%f",&f); c = (f— 32 ) * 5/9; 
printf ("Los grados son: %f", c) ; 

} 

void convertir_C_K ( ) 

{ 

float c , k ; 

printf ("Dame los grados centígrados: " ); scanf ("%f",&c); 
k = c + 273; printf ("Los grados son: %f", k) ; 

} 

void convertir_K_C ( ) 

{ 

float c , k ; 

printf ("Dame los kelvins : " ); scanf ("%f",&k); 
c = 273 — k; printf ("Los grados son: %f", c) ; 



Este ejercicio tiene prototipos, por ello las funciones se declararon después de ser llamadas (después de la 
función main); tiene una función principal y cuatro funciones para convertir de: a) Grados centígrados a 
grados Fahrenheit, b) Grados Fahrenheit a grados centígrados, c) Grados centígrados a kelvins, y d) Kelvins 
a grados centígrados. El programa principal tiene una estructura de control selectiva múltiple para cada op- 
ción. Cada función tiene declaradas sus variables locales, sus operaciones en el mismo cuerpo de la función 
y la impresión del resultado. El programa principal incorpora una hacer_mientras, para que el usuario tenga 
la opción de repetir el programa y elegir la misma u otra opción las veces que lo requiera, siempre y cuando 
conteste S para repetir el programa. 

Ejercicio 8. Haga el programa principal con opciones a cinco funciones sin paso de parámetros que 
calcule las siguientes áreas: a) Circulo, b) Cuadrado, c) Rectángulo, d) Triángulo, e) Trapecio. 




( continúa ) 



186 



Capítulo 5 Programación modular 



( continuación ) 

Pseudocódigo 

fin 

nada area_cuadrado ( ) 
inicio 

entero lado, area_cua 
imprimir"Escriba un lado:"; leer lado 
area_cua <— lado * lado 
imprimir "El área del cuadrado", area_cua 
fin 

nada area_rectangulo ( ) 
inicio 

entero base, alt, area_rec 

imprimir "Escriba la base y la altura:"; leer base, alt 
area_rec <— base * alt 

imprimir "El área del rectángulo es:", area_rec 
fin 

nada area_triangulo ( ) 
inicio 

entero base, alt; real area_tria 
imprimir"Escriba la base y la altura:"; leer base, alt 
area_tria <— base * alt / 2 
imprimir "El área del triángulo es:", area_tria 
fin 

nada area_trapecio ( ) 
inicio 

entero basemay, basemen, alt; real area_tra 

imprimir"Escriba la base mayor la base menor y la altura:"; leer basemay, basemen , alt 
area_tra <— (basemay + basemen) * alt / 2 
imprimir "El área del trapecio es:" area_tra 
fin 

principal ( ) 
inicio 

entero opc 

hacer 

inicio 

imprimir "Elige una de las siguientes áreas" 
imprimir "1)Círculo" 
imprimir "2)Cuadrado" 

Imprimir "3)Rectángulo" 

Imprimir "4)Triángulo" 

Imprimir "5)Trapecio"; leer opc 
segun_sea (opc) 



( continúa ) 



5.5 Ejercicios resueltos de funciones sin paso de parámetros 



187 



( continuación ) 

Pseudocódigo 

inicio 

caso 1 : area_circulo( ); salir 
caso 2 : area_cuadrado( ); salir 
caso 3 : area_rectangulo( ); salir 
caso 4 : area_triangulo( ); salir 
caso 5 : area_trapecio( ); salir 
fin 

imprimir"¿Deseas repetir el programa S = 1 / N=2? leer opc 
fin 

mientras ( opc = 1) 
fin 

Lenguaje C 

#include <stdio.h> 

#include <conio.h> 

#define PI 3.1416 
void area_circulo ( ) 

{ 

int radio; 
float area_cir; 

printf ("Escriba el radio: "); scanf ( "%d" , &radio) ; 
area_cir = PI * radio * radio; 

printf ("El área del círculo es: %f", area_cir) ; 

} 

void area_cuadrado ( ) 

{ 

int lado, area_cua; 

printf ("Escriba un lado :"); scanf ( "%d" , &lado) ; 
area_cua = lado * lado; 

printf ("El área del cuadrado %d", area_cua) ; 

} 

void area_rectangulo ( ) 

{ 

int base, alt, area_rec; 

printf ("Escriba la base y la altura : "),- scanf ( "%d%d" , &base , &alt ) ; 
area_rec = base * alt; 

printf ("El área del rectángulo es: %d", area_rec) ; 

} 

void area_triangulo ( ) 

{ 

int base, alt; 



{ continúa ) 



Capítulo 5 Programación modular 



( continuación ) 



Lenguaje C 

float area_tria; 

printf ("Escriba la base y la altura: "); scanf ( "%d%d" , &base , &alt ) ; 
area_tria = base * alt / 2; 

printf ("El área del triángulo es: %f", area_tria) ; 

} 

void area_trapecio ( ) 

{ 



float basemay, basemen, alt; 
float area_tra; 

printf ("Escriba la base mayor la base menor y la altura: "); 

scanf ( "%f %f %f " , &basemay, Sbasemen, &alt) ; 

area_tra = (basemay + basemen) * alt / 2; 

printf ("El área del trapecio es: %f", area_tra) ; 

} 

main ( ) 

{ int opc ; 
do 



{ 



printf 
printf 
printf 
printf 
printf 
printf 
scanf ( 
switch 
{ case 
case 
case 
case 
case 



("Elige una de las siguientes áreas\n"); 
("l)Círculo \n" ) ; 

( "2 ) Cuadrado \n" ) ; 

( "3 ) Rectángulo\n" ) ; 

( "4 ) Triángulo\n" ) ; 

( "5 ) Trapecio\n" ) ; 

"%d" , &opc) ; 

(opc) 

1 : area_circulo ( ) ; break; 

2 : area_cuadrado ( ) ; break; 

3 : area_rectangulo ( ); break; 

4 : area_triangulo ( ); break; 

5 : area_trapecio ( ) ; break; 



printf ("\n¿Deseas repetir el programa S=1 / N=2? \n" ) ; 
scanf ( "%d" , &opc) ; 

} while ( opc == 1) ; return 0; 

} 



Este ejercido no tiene prototipos. Tiene cálculos para cinco áreas definidas como: a) Círculo, b) Cuadrado, 
c) Rectángulo, d) Triángulo, e) Trapecio. Según la opción que desee el usuario, la variable opc, que es de 
tipo entero, almacena un número del 1 al 5, se realizará una de las funciones; al igual que en el ejercicio 7, el 
usuario tiene la posibilidad de repetir el programa las veces que desee, siempre y cuando elija S, es decir que 
capture el 1; cuando desee salirse del programa deberá elegir el 2, que es N. 



5.6 Funciones con paso de parámetros 



189 






5.6 Funciones con paso de parámetros 

Estas funciones son las más utilizadas en la programación ya que pueden recibir uno o más valores llamados 
parámetros y regresan un solo valor de tipo entero, real o carácter. Si deseas regresar un arreglo de carácter 
es necesario hacerlo desde los parámetros. Los parámetros o valores son enviados del programa principal 
o de otra función. Dentro de la función se realizan solamente las instrucciones (cálculos u operaciones). Es 
importante revisar que el tipo de dato que regresará la función sea del mismo tipo que el valor declarado en 
el encabezado de la misma. 

5.6.1 Parámetros de una función 

También son llamados argumentos y se corresponden con una serie de valores que se especifican en la 
llamada a la función, o en la declaración de la misma, de los que depende el resultado de la función; dichos 
valores nos permiten la comunicación entre dos funciones. Los parámetros o argumentos de una función se 
pueden clasificar en: 

1. Formales o ficticios. Son los que se encuentran en la definición de la función. Si una función usa 
argumentos, éstos se comportan como variables locales de la función. Son variables de la función que to- 
man los valores que se le pasan desde fuera de ella. Veamos el siguiente bloque de programa: 

float divide (int x, int y) 

1 

int a, b; 

printf ("Dame dos números enteros:"); 
scanf ("%d%d"&a,&b); 

Tenemos una función llamada divide, la cual regresa un dato float y los parámetros formales o ficticios 
son la x y la y. 

2. Actuales o reales. Se emplean en la llamada a la función. Pueden ser variables o expresiones cuyos 
valores se pasan a los argumentos formales. Algunos autores llaman argumentos a los parámetros 
actuales o reales. Veamos el siguiente bloque de programa: 

main () 

1 

int m, n; 
float z; 

printf ("Dame dos números enteros:"); 
scanf ("%d%d"&m,&n); 

z = divide(m,n); //Llamada o invocación a la función divide 

En el renglón anterior los parámetros actuales o reales son la m y la n. Los parámetros formales siempre 
son variables, mientras que los reales pueden ser variables, constantes, expresiones aritméticas e incluso 
lo que regrese la llamada a otra función. 

5.6.2 Paso de parámetros en una función 

En C todos los parámetros se pasan “por valor”, es decir, en cada llamada a la función se genera una copia 
de los valores de los parámetros actuales, que se almacenan en variables temporales en la pila mientras dure 
la ejecución de la función. Sin embargo, cuando sea preciso es posible hacer que una función modifique el 
valor de una variable que se pase como parámetro actual en la llamada a la función. Para ello, lo que se debe 
proporcionar a la función no es el valor de la variable, sino su dirección, lo cual se realiza mediante un pun- 
tero que señale a esa dirección; a estos parámetros los llamamos por variable o por referencia-, en este tipo de 
parámetros los datos salen modificados. 



Nota: En este capítulo nos enfocaremos a los parámetros por valor, pero debemos aclarar que en el caso del paso de 
arreglos, éstos se comportan como parámetros por variable ya que existe un puntero que apunta a la primera posición. 



190 



Capítulo 5 Programación modular 



A continuación veremos la sintaxis de las funciones con parámetros y sin prototipo. 



Pseudocódigo 


Lenguaje C 




# Librerías 


Variables globales 


Variables globales; 


Constantes 


Constantes 


tipo_dato funcion_a (parámetros formales) 4 


tipo dato función a (parámetros formales) 4 


inicio 


{ 


Variables locales 


Variables locales; 


Instrucción 1 


Instrucción 1; 


Instrucción 2 


Instrucción 2; 


Instrucción 3 


Instrucción 3 ; 


regresa (valor) 5 


return (valor) 5 ; 


fin 


} 


tipo„dato funcion_b (parámetros formales) 4 


tipo dato función b (parámetros formales) 4 


inicio 


{ 


Variables locales 


Variables locales; 


Instrucción 1 


Instrucción 1; 


c=func¡on_a(parámetros actuales) 6 


C=funcion a (parámetros actuales) 6 ; 


Instrucción 2 


Instrucción 2; 


regresa (valor) 5 


return (valor) 5 ; 


fin 


} 


principal ( ) 


main ( ) 


inicio 


{ 


Variables locales 


Variables locales; 


Cuerpo del programa principal 


Cuerpo del programa principal 


c=funcion_a(parámetros actuales) 6 


C=funcion a (parámetros actuales) 6 ; 


d=funcion„b(parámetros actuales) 6 


D=funcion b (parámetros actuales) 6 ; 


Instrucción 3 


Instrucción 3; 



fin } 



En la sintaxis anterior las variables c y d son locales a la función respectiva; por lo tanto la c es diferente en 
la funcion_b que en el mainQ, ya que el ámbito de trascendencia lo tienen en la función correspondiente. 

Como se comentó en la sección anterior, la desventaja de las funciones sin prototipos es que en el mo- 
mento de llamarlas o invocarlas tienen que estar declaradas antes; por ejemplo, en la sintaxis anterior la 
funcion_b y principal (main) llaman a la funcion_a, que está declarada antes; sin embargo, la funcion_a no 
puede llamar a ninguna otra función. 



4 Cada parámetro debe tener su tipo y nombre; si son varios se separan con una coma. 

5 Es opcional que el valor vaya entre paréntesis. 

6 Nombre de cada parámetro; si son varios se separan con una coma.