Você está na página 1de 76

Programación Estructurada

CARTILLA DE TRABAJOS
PRÁCTICOS
2018
ESCUELA DE MINAS “DR. HORACIO CARRILLO”

PROGRAMACIÓN ESTRUCTURADA
Trabajo Práctico Nº 1
Universidad
Nacional de
Tema: Introducción a la Programación
Jujuy
Apellido y Nombre: Fecha: / /

UNIDAD N° 1 y UNIDAD N° 2
A. La computadora.
B. Software y hardware.
Conceptos teóricos a
tener en cuenta C. Algoritmo. Características que debe cumplir.
D. Programa. Objetivo de la programación.
E. Pasos de la resolución de problemas basados en computadora.
F. Lenguaje máquina, lenguajes de bajo nivel y lenguajes de alto nivel.
G. Corrección de algoritmos, eficiencia de un algoritmo, mantenimiento de programas y reusabilidad de
código.
H. Variable y constante.
I. Tipos de datos.
J. Expresiones. Tipos.
K. Cadena de caracteres. Operaciones que pueden realizarse sobre cadenas de caracteres.
L. Operadores. Clasificación.
M. ¿Qué significa que un dato sea de tipo ordinal?
N. Defina los tipos definidos por el usuario subrango, enumerado y conjunto.

Introducción
Dados los siguientes procesos, ¿qué entidades hardware y/o software participan en la realización de estos?
a) Comando de voz para buscar en Google.
b) Iniciar una video llamada.
c) Escanear una imagen y enviarla por email.
d) Consultar la cuenta bancaria.
Para pensar: ¿Existe para cada proceso más de una posibilidad? ¿Porqué?
Cada vez que se nos presenta un problema en la vida cotidiana, debemos realizar un diagnóstico de las
posibles soluciones y una vez que elegimos la adecuada para su resolución, seguimos una secuencia de
acciones hasta llegar a resolverlo, por ejemplo, si un alumno requiere solicitar libros en la biblioteca realiza
los siguientes pasos:
a) El alumno indica los libros (título y autor) que desea consultar y presenta su carnet al bibliotecario.
b) El bibliotecario verifica el estado del alumno.
c) Si el alumno adeuda libros, se realiza el paso g), de lo contrario se realiza el paso d).
d) El bibliotecario consulta el inventario de libros, y si los libros están disponibles se realiza el paso e),
de lo contrario se realiza el paso f).
e) El bibliotecario busca los libros, registra el préstamo y se los entrega al alumno (con lo que finaliza
la transacción, paso h).
f) El bibliotecario informa al alumno de falta de libros y finaliza la transacción (paso h).
g) El bibliotecario notifica al alumno de su situación de moroso y finaliza la transacción (paso h).
h) El alumno se retira de la biblioteca.
ENTRADA: datos del alumno y datos de los libros a consultar.
PROCESO: examinar la situación del alumno, verificar la disponibilidad de libros, registrar el préstamo.

Año 2018 Pág. 1


SALIDA: aceptación (entrega de libros) o rechazo de la solicitud (por falta de libros o por condición de
alumno moroso).

ALGORITMO: conjunto de instrucciones Como vemos la solución de problemas implica la consecución de


que especifiquen la secuencia de ejecuciones de un conjunto de pasos. En el contexto de la Informática
operaciones a realizar, en orden, para un algoritmo se traduce a un Programa mediante algún lenguaje de
resolver un problema específico o clase de programación, este proceso se denomina programación.
problemas. Problemas de tipo matemático son plausibles de resolver mediante la
programación, por este motivo, muchos de los problemas propuestos
en la materia son de tipo matemático. A continuación, el ejemplo de un problema matemático, resuelto con un
algoritmo por ahora escrito en lenguaje natural, en las siguientes prácticas veremos cómo traducir este lenguaje a un
programa informático, sin embargo, en el ejemplo introducimos ideas iniciales.
Problema: Calcular el área de un triángulo.

Sabemos que un problema se resuelve mediante un algoritmo.

A continuación, se escribe el algoritmo que da solución al problema paso a paso y en lenguaje natural.

1. Se solicitan las medidas de base y altura del triángulo

2. Se aplica la fórmula de resolución

3. Se obtiene el resultado

4. Se muestra el resultado

Partes de la resolución del algoritmo.

ENTRADA: Medidas de base y altura del triángulo

PROCESO: Tomar las medidas base y altura, aplicar la fórmula, A  b  a  obtener el resultado de la
2
superficie y mostrarlo

SALIDA: Medida del área del triángulo.

Para resolver los problemas mediante un programa, debemos utilizar los recursos que nos permitan

PROGRAMA: es la descripción de un representar datos de entrada, realizar procesos, devolver


algoritmo en un lenguaje de resultados, mostrarlos, etc. entre otros usaremos variables,
programación.
constantes, expresiones algorítmicas.

Por ejemplo, en el problema propuesto usaremos para los datos VARIABLES: representan un espacio
de ENTRADA: Base y Altura son dos variables de tipo de memoria de la computadora. A
través de las variables, podemos
numéricas.
almacenar temporalmente datos
El tipo de un dato determina la naturaleza del conjunto de para tenerlos disponibles durante la
ejecución del programa. Para poder
valores que puede tomar una variable. Un dato puede ser un
utilizar una variable, tenemos que
carácter: ‘b’, un número entero: 13, un número real: 5,46, etc. especificar un nombre (identificador)
y un tipo de datos. En general, un
Podemos representar la medida de la base con la variable b de identificador debe comenzar con una
tipo real y la medida de la altura estará contenida en la variable letra y no pueden contener espacios
en blanco, signos de puntuación u
denominada a de tipo real. Para realizar el PROCESO de
operadores.
obtención del área haremos la conversión de la expresión
algebraica Area 
b  a  a expresión algorítmica con lo cual obtendríamos area=b*a/2. Cabe destacar
2
que area es una variable de tipo real que almacenará en resultado de la expresión b*a/2 y el símbolo =
está asignando el resultado del valor a esta. Para el pasaje de una expresión algebraica a una expresión
aritmética debemos tener en cuenta las reglas de evaluación de expresiones.

Todas las subexpresiones entre paréntesis se evalúan primero. Las subexpresiones con paréntesis
anidados se evalúan de adentro hacia afuera, el paréntesis más interno se evalúa primero.

Año 2018 Pág. 2


Prioridad de operaciones. Dentro de una misma expresión o subexpresión, los operadores se evalúan
en el siguiente orden:
Operador Prioridad
^ Más alta (se evalúa primero)
REGLA ASOCIADA IZQUIERDA: Los
*, / operadores en una misma expresión o
div, mod
+, - Más baja (se evalúa al final) subexpresión con igual nivel de prioridad (tal
Si se utilizan paréntesis, las expresiones encerradas como * y /) se evalúan de izquierda a
se evalúan primero.
derecha.
El resultado será visible a partir de mostrar por pantalla el valor de la variable area, operación a estudiar
más adelante.

Ejercicios a Resolver
1. Escriba el algoritmo que da solución a los siguientes problemas paso a paso y en lenguaje natural.
Diferencie las partes de la resolución del algoritmo.
a) Calcular la hipotenusa de un triángulo rectángulo, conociendo el valor de los catetos.
b) Calcular el área de una esfera.

Expresiones, tipo de datos y operadores.


Expresiones lógicas

Operadores de relación
Operador Significado Ejemplo OPERADORES DE RELACIÓN: Los
< Menor que a<b operadores de relación se utilizan
<= Menor o igual que a<=b para expresar condiciones y
= Igual a a=a describen una relación entre dos
<> Distinto a a<>b
valores. El resultado de una
>= Mayor o igual que b>=a
expresión lógica es un valor de tipo
> Mayor que b>a
lógico VERDADERO o FALSO.
Observación expresiones verdaderas en columna ejemplo considerando a=10 y b=20

Operadores lógicos OPERADORES LÓGICOS:


NOT (NO): niega un valor.
Las expresiones lógicas pueden combinarse para formar AND (Y): Combina dos condiciones
expresiones más complejas utilizando operadores lógicos: AND, simples y produce un resultado
verdadero solo si los dos
OR y NOT. Los operadores trabajan con expresiones lógicas. componentes son verdaderos.
Orden de prioridad NOT, AND, OR. OR (O): es verdadera si uno de los
componentes es verdadero.

NOT AND OR
a b a OR b a b

Tablas de verdad

Operador NO (NOT) Operador Y (AND) Operador O (OR)


Negación de a Conjunción de a y b Disyunción de a y b
A NO a A b aYb a b aOb
Verdadero Falso Verdadero Verdadero Verdadero Verdadero Verdadero Verdadero
Falso Verdadero Verdadero Falso Falso Verdadero Falso Verdadero
Falso Verdadero Falso Falso Verdadero Verdadero
Falso Falso Falso Falso Falso Falso

Año 2018 Pág. 3


Expresiones complejas
EVALUACIÓN DE EXPRESIONES
Poseen expresiones aritméticas, de relación y lógicas. COMPLEJAS:
Operador Prioridad 1. Las expresiones aritméticas
NO, ^ Más alta (se evalúa primero) respetando su correspondiente
*, /, Y jerarquía de operadores.
div, mod 2. Las expresiones de relación
+, -, O respetando su correspondiente
<, <=, =, <>, >=, > Más baja (se evalúa al final) jerarquía de operadores.
Si se utilizan paréntesis, las expresiones encerradas
3. Las expresiones lógicas respetando
se evalúan primero. su correspondiente jerarquía de
operadores.

Ejercicios ejemplos
1. Identifique el tipo de los datos de las siguientes variables, de acuerdo al tipo de Dato que contiene:
Variable Dato Tipo
M ‘D’ Carácter
Letra ‘verdadero’ Cadena
Es 100 Entero
L2 4.25 Real
num FALSO Lógico

2. Escriba las siguientes expresiones algebraicas como expresiones algorítmicas:


3
  x  5y  2 7 x  1 
Ejemplo:      expresión algorítmica equivalente (((x+5*y) /x) ^2 – (7*x+1) /(5*y)) ^3
 x  5y 
 
3. Considerando las tablas de verdad de los operadores lógicos, resuelva las siguientes expresiones lógicas:
Expresión lógica Resultado Observación
(num <= 33) Y (num> 13) Verdadero num es una variable numérica que tiene valor 20
(4 <> cuenta) O (5 >= 4) Verdadero cuenta es una variable numérica que tiene valor 4
Resta = nro1 – nro2 Falso nro1 y nro2 son variables numéricas que valen 10 y 18,
respectivamente. Resta = 20
4. Resuelva las siguientes expresiones teniendo en cuenta la prioridad de los operadores.
Expresión Resultado Observación
5 * x ^ 2 + 5 * y + 12 52 x=2, y=4
(12 + 8* 3) div 2 18
64 / x * r - s * r mod r * 2 32 x=8, r=4, s=44
40 / 4 * 5 + 3 53
5. Analice las siguientes operaciones de asignación y determine los valores finales de las variables A, B, y
C.
Asignación A B C
A22*2 div 5 8
B24 mod 2 + 5 5
CA 8

Ejercicios a Resolver
1. Identifique el tipo de los datos de las siguientes variables, de acuerdo al tipo de Dato que contiene:
Variable Dato Tipo
L 0.33
n ‘r’
s ‘123’
car VERDADERO
V 500

Año 2018 Pág. 4


may Falso
nro 200000
C “son valores”

2. Escriba las siguientes expresiones algebraicas como expresiones algorítmicas:

8X 3  8 AB 2  A
a) 3 c)
2Z 2 C3
 4 x  5 y 3x 
5
 b  b 2  4ac
b)    d)
2a
 6x 5
e) 5 x  5 z  y
2

3. Considerando las tablas de verdad de los operadores lógicos, resuelva las siguientes expresiones lógicas:
Expresión lógica Resultado Observación
(num <= 22) Y (num> 13) num es una variable numérica que tiene valor 20
(14 <> mas) O (15 >= 24) mas es una variable numérica que tiene valor 18
(a > b) O (b < c) a, b y c son variables numéricas cuyos valores son 35, 12
y 24, respectivamente.
NO sopa sopa es una variable lógica = NO (23<=23)
(18 > 20) Y (7 = 7) O bandera bandera es una variable lógica que tiene valor lógico
VERDADERO
(11 <= 1) Y (NO(18 > 17) O (1 >= 1))
a Y b O NO c a=Falso, b=Verdadero, c=Verdadero
a O NO (b Y c) a=Verdadero, b=Falso, c=Verdadero
NO(q Y p O r) Y q O r p=Verdadero, q=Falso, r=Verdadero
pOqYrOp p=Verdadero, q=Falso, r=Verdadero

4. Resuelva las siguientes expresiones teniendo en cuenta la prioridad de los operadores.


Expresión Resultado Observación
40 mod 4 * 3
(3 ^ 3 - 12) / 3
(n/(m*p)) = 20 n es una variable numérica que tiene valor 25, m tiene
valor 5 y p tiene valor 4
No(x-z*y=y) Y ((z-1)/w < w) x, y, z y w son variables numéricas cuyos valores son 15, 21,
20 y 2, respectivamente.
a * b * c div d + 3 a=10, b=24, c=6, d=3
c * 3 - z <> 9 - z siendo z=8, c=3
m * 2 - 7<= g * 2^2 siendo m=4, g=3
m div n * 2 + p / q ^ 3 div 2 – n ^ m=32, n=8, p=48, q=2
2/3
No(x-z*y=y) Y ((z-1)/w < w) x, y, z y w son variables numéricas cuyos valores son 15, 21,
20 y 2, respectivamente.
(b*a-y*z/2 > 0) O ((7/b)*(a-z) <> bandera es una variable lógica que tiene valor lógico
7) O bandera FALSO, a, b, y, z valen 4, 8, 12 y 16 respectivamente

ASIGNACIÓN: los valores que mantienen las variables pueden cambiar durante la ejecución del programa,
justamente por eso, son “variables”. Para que una variable adquiera un determinado valor se lo tendremos que
asignar manualmente con el operador de asignación ( ) o bien leer un valor a través de algún dispositivo de
entrada y almacenarlo en la variable. Ejemplo: Asigno el valor 20 a la variable num: num20.
Leo un valor por consola y lo asigno a la variable num: Leer num.
La operación de asignación es destructiva, por lo que el nuevo valor pisa el valor anterior, y actualiza la variable.

Año 2018 Pág. 5


5. Analice las siguientes operaciones de asignación y determine los valores finales de las variables X, R y
S.
Asignación X R S bande OBSERVACIONES
Xc / d * e - (8 / e + c) mod 2 siendo c=32, d=8, e=4
R 3 * x ^ (1/2) + 5 * x + 2
SR-X
X X div 3 – S div 3
R R - X * S
S R/X
bande NO((13 > R) Y (X <= 9)) Y (2*S = R)

Cadenas de caracteres, Enumerado y Conjuntos.


Ejemplos de cadenas: “esta es una cadena”, ‘soy cadena’.
Longitud. Esta función, cuyo argumento es una cadena, retorna un CADENA DE CARACTERES: Una cadena
de caracteres es un conjunto de
OPERACIONES: valor entero que indica el número de caracteres (incluido el espacio en
Longitud caracteres de la cadena. blanco) reconocidos por la
Comparación computadora, los que se almacenan en
Micadena <- “argentina”
Concatenación posiciones de memorias contiguas. La
Extracción de Subcadenas Longitud(micadena) da como resultado longitud de una cadena es el número de
Comparación La comparación de cadenas se basa en el orden caracteres que ésta contiene. La cadena
que no contiene ningún carácter se
numérico del código ASCII. denomina vacía o nula.
Ejemplo: Las siguientes comparaciones son verdaderas
‘0’<’1’ – ‘A’<’B’ – ‘M’>’B’ – ‘a’>’Z’ - ‘diagrama’ <= ‘pseudocodigo’ - ‘Pascal’ = ‘Pascal ’
Concatenación es el proceso de concatenar dos o más cadenas en una sola. El símbolo que representa la
concatenación varía de un lenguaje a otro. Los más utilizados son: +, // y &.
Ejemplo: ‘sombrero’ + ‘ loco’ da como resultado ‘sombrero loco’
Extracción de subcadenas La operación de extraer una parte SUBCADENA DE CARACTERES:
específica de una cadena se representa por la función subcadena. Una subcadena es un conjunto de
caracteres extraído de una cadena de
Esta función presenta el siguiente formato: subcadena(cadena,
mayor longitud.
p_inicial, p_final) Ejemplo: ‘soy’ es subcadena de ‘soy
Ejemplo: Subcadena (‘programas ejecutables’,5,12) da como cadena’.

resultado ‘ramas ej’

Ejercicios Resueltos

1. Dadas las siguientes cadenas de caracteres, realice sobre ellas las operaciones solicitas e indique el
resultado obtenido.

Cadenas de caracteres Operación Resultado Almacenado en Tipo de dato de


variable la variable
‘Canal’ Concatenación ‘CanaldeYoutube’ a Cadena de
‘de‘ Caracteres
‘Youtube’
a Longitud 1 c Entero
‘canal’ <= ‘Canal’ Comparación FALSO e Logico
‘Las cadenas son un conjunto de Subcadena ‘as son un c’ h Cadena de
caracteres ’ posición carácter inicial=10 Caracteres
posición carácter final=20

Año 2018 Pág. 6


Ejercicios a Resolver
2. Dadas las siguientes cadenas de caracteres, realice sobre ellas las operaciones solicitas e indique el
resultado obtenido.
Cadenas de caracteres Operación Resultado Almacenado en Tipo de dato de
variable la variable
‘GATO’ <= ‘GATOS’ Comparación e
‘variables’>‘verano’ Comparación f
‘TIEMPO’ <> ‘TIEMPO ’ Comparación g
‘El aula tiene sillas para todos los Subcadena h
estudiantes de primero ’ posición carácter inicial=5
posición carácter final=14
‘la constante’ Concatenación b
‘fue necesaria’
‘muchas veces’
‘los programas resuelven problemas’ Longitud d

Conjuntos.
Inicialización: La inicialización de
OPERACIONES: CONJUNTO:
Inicialización una variable conjunto se referencia Un conjunto es una colección ordenada
Asignación como conjunto vacío. de datos simples, todos del mismo tipo.
Pertenencia
Unión Ejemplo: La variable letras está Es decir, es una colección de elementos
Intersección definida como un conjunto de tipo no repetidos de tipo ordinal.
Diferencia
conjunto de caracteres. letras  { }
Asignación permite cargar elementos en un conjunto. Ejemplo considerando la variable misletras (de tipo
conjunto de caracteres) se puede realizar la siguiente asignación:
misletras{‘a’, ’m’, ‘q’, ‘z’}
Pertenencia: utiliza la función pertenece que determina si un elemento en particular está contenido en un
dato tipo conjunto. pertenece(nombre_conjunto, elemento)
La función utiliza 2 argumentos, el primero indica el nombre de la variable tipo conjunto y el segundo especifica
el elemento cuya pertenencia al conjunto se quiere verificar. La función retorna un valor lógico VERDADERO
si el elemento especificado pertenece al conjunto indicado, de lo contrario devuelve FALSO.
Ejemplo: pertenece (misletras, ‘b’) retorna FALSO
Unión es un conjunto compuesto de los elementos de ambos conjuntos. La operación se denota con el signo
+. Por ejemplo:
otrasletras{‘j’, ‘k’, ‘l’}
misletras{‘a’, ’m’, ‘q’, ‘z’}
todosotrasletras + misletras. La variable todos, de tipo conjunto, resulta de la unión de los conjuntos
otrasletras y misletras. El conjunto todos contiene los elementos ‘j’, ‘k’, ‘l’, ‘a’, ’m’, ‘q’ y ‘z’.
Intersección es el conjunto formado por los elementos comunes a ambos conjuntos. El operador intersección
es *. Por ejemplo:
simbolos {‘b’, ‘m’, ‘q’}
letras {‘a’, ’m’, ‘q’, ‘z’}
interconj simbolos * letras. La variable interconj, de tipo conjunto, resulta de la intersección de los conjuntos
simbolos y letras. El conjunto interconj contiene los elementos ‘m’ y ‘q’.
Diferencia es el conjunto formado por los elementos del primero que no pertenecen al segundo. El operador
diferencia es -. Por ejemplo:

Año 2018 Pág. 7


simbolos {‘b’, ‘m’, ‘q’}
letras {‘a’, ’m’, ‘q’, ‘z’}
difconj simbolos – letras. La variable difconj, de tipo conjunto, resulta de la diferencia de los conjuntos
simbolos y letras. El conjunto difconj contiene el elemento ‘b’.

Ejercicios Resueltos
1. Dados los siguientes conjuntos, realice sobre ellos las operaciones solicitadas e indique el resultado
obtenido. Además, consigne el tipo del conjunto (entero, carácter, etc.).
Cadenas de caracteres Tipo del Conjunto Operación Resultado
{3,5,16,24,85} Entero Pertenencia Falso
elemento a verificar: 2
{3,5,16,24,85} Entero Unión {3,5,7,9,
{5,7,9, 11,13,15,17,19,21} 11,13,15,16,17,19,21,24,85}
{‘a’,’d’,’f’,’g’,’h’} Carácter Intersección {‘a’,’d’,’f’,’g’}
{‘a’,’b’,’c’,’d’,’e’,’f’,’g’}

Ejercicios a Resolver
2. Dados los siguientes conjuntos, realice sobre ellos las operaciones solicitadas e indique el resultado
obtenido. Además, consigne el tipo del conjunto (entero, carácter, etc.).
Cadenas de caracteres Tipo del Conjunto Operación Resultado
{20, 40, 30, 56, 80} Intersección
{12, 40, 38, 65, 80,89,99,100}
{‘r’,’x’,’s’,’t’,‘u’} Unión
{‘o’,’p’,’q’,’r’,’s’,’t’,’u’,’v’}
{‘r’,’x’,’s’,’t’,‘u’} Diferencia
{‘o’,’p’,’q’,’r’,’s’,’t’,’u’,’v’}
{20, 40, 30, 56, 80} Pertenencia
elemento a verificar: 45



Año 2018 Pág. 8


ESCUELA DE MINAS “DR. HORACIO CARRILLO”

PROGRAMACIÓN ESTRUCTURADA
Trabajo Práctico Nº 2
Universidad
Nacional de
Tema: Estructuras de Control Secuenciales y Selectivas
Jujuy
Apellido y Nombre: Fecha: / /

Conceptos Teóricos a tener en cuenta de la UNIDAD N° 3


A. La programación estructurada.
B. Teorema de la Programación Estructurada.
Conceptos teóricos a
tener en cuenta C. Estructuras de control secuenciales.
D. Estructuras de control selectivas.

Introducción
Dados los siguientes problemas realice el algoritmo que permita resolverlos.
a) Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que permita ingresar 3 valores y determinar
cuál de ellos es el menor.
b) Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que permita ingresar 100 valores y
determinar cuál de ellos es el menor.
c) Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que permita ingresar 100 valores y
determinar cuál de ellos es el menor, además la cantidad de valores pares e impares.
Para pensar: ¿Es posible resolver las situaciones problemáticas en lenguaje natural? ¿Qué ventajas y
desventajas se presentan? ¿Qué herramientas nos permiten resolverlos de una forma más práctica?
Para lograr la resolución de problemas basados en computadora se requiere utilizar técnicas de apoyo. Estas
nos permitirán representar los pasos de resolución de un algoritmo. Es fundamental un adecuado análisis del
problema para lograr un correcto diseño del algoritmo de resolución. A continuación, les brindamos
herramientas que servirán de apoyo para comprender el análisis y el planteo del diseño para la resolución de
un problema.

Análisis de problemas
El procedimiento para la resolución de los ejercicios incluye la DICCIONARIO DE DATOS: En el
lectura de cada uno de los problemas a resolver de forma diccionario de datos se incluyen las
variables que se dan en el enunciado del
minuciosa, a partir de esta realizará su análisis, herramienta útil
problema, sean estas primarias o
para llevar esta tarea es el diccionario de datos. secundarias y las constantes definiendo
para cada una de ellas el identificador
Ejemplos: Para los siguientes enunciados realice los diccionarios que las representa, el formato (donde se
de datos, resultados y condiciones vinculantes. especifica el tipo de dato de la variable),
y la descripción de la misma.
Enunciado 1: Diseñe un algoritmo que permita ingresar tres
valores reales y muestre el promedio de ellos.

Diccionario de datos
Identificador Formato Descripción
Primarias A, B, C Real Valores numéricos
Variables S Real Suma de los tres valores
Secundarias
P Real Promedio de los tres valores
Constantes N Entero Cantidad de valores = 3

Año 2018 Pág. 1


A, B y C son variables primarias, en tanto la variable secundaria S, VARIABLES PRIMARIAS: son
corresponde a la suma de los valores y sirve para obtener el resultado aquellas que surgen de la lectura del
enunciado del problema.
VARIABLES SECUNDARIAS: son aquellas pedido. Se posee una sola
que se calculan a partir de las primarias y constante que es 3 y representa la cantidad de valores
son necesarias para llegar al resultad.
ingresados.
Diccionario de resultados
Para cada variable o constante que contenga el resultado, RESULTADOS: se incluyen los datos a los que
se determina el identificador que las representa, el formato debemos llegar, representados por las
variables y las constantes.
(donde se especifica el tipo de dato de la variable o
constante), y la descripción de las mismas.

El formato del diccionario de resultados es el siguiente:


Identificador Formato Descripción
Promedio de los tres
Variables primarias P Real
valores
Constantes Mensaje1 Cadena “El promedio es”

En este caso la variable resultado es P que representa el promedio de los tres valores ingresados y posee un
formato real. La constante es un mensaje que nos permite mostrar el promedio.
Diccionario de condiciones vinculantes
El diccionario de condiciones vinculantes, permite representar el CONDICIÓN VINCULANTE: cada acción a
algoritmo a seguir para la resolución. En este se incluyen el
realizar en un algoritmo.
número de la condición, de forma consecutiva comenzando en 1
e incrementándose en igual valor.
El formato del diccionario de condiciones vinculantes es el siguiente:
Número Descripción
1 Ingrese A, B, C
2 Asignar S = A+B+C
3 Asignar P = S/N
4 Mostrar Mensaje1 + P
Enunciado 2: Calcule la superficie y el volumen de un cilindro, conociendo la altura y el radio de la base
(ingresados por el usuario).
Datos: Radio y altura
Resultados: superficie y volumen del cuerpo geométrico Cilindro.
Condiciones vinculantes: Determinar la superficie y volumen del Cilindro dado el radio y altura.
Diccionario de Datos

Identificadores Formato Descripción


R Real Radio del cilindro
Primarias
H Real Altura del cilindro
Variables
A Real Área de cilindro
Secundarias
V Real Volumen de cilindro
Constantes PI Real Número 3.1416

Diccionario de Resultados

Identificadores Formato Descripción


Variables A Real Área del cilindro
Primarias V Real Volumen del cilindro
Constantes

Diccionario de Condiciones Vinculantes


# Descripción
1 A 2*Pi*R*(H+R)
2 V  Pi*R^2*H

Año 2018 Pág. 2


PROGRAMACIÓN ESTRUCTURADA. Diseño de Algoritmos.

En nuestra materia estudiaremos y aplicaremos el paradigma de LENGUAJE ALGORÍTMICO: es todo


la programación estructurada. Utilizaremos como lenguajes
recurso que permita describir con mayor
algorítmicos en especial:
o menor nivel de detalle los pasos que
a) El pseudocódigo que es un lenguaje de componen un algoritmo. Son lenguajes
especificación de algoritmos escrito y algorítmicos, los lenguajes de
b) El diagrama de flujo (flowchart) es una técnica programación, el pseudocódigo, los
de representación gráfica de algoritmos que diagramas de flujo, los diagramas de
utiliza símbolos (cajas) estándar y que tiene los Nassi-Shneiderman, etc.
pasos del algoritmo escritos en esas cajas
unidas por flechas, denominadas líneas de flujo, que indican la secuencia en que se deben
ejecutar.

TEOREMA DE LA PROGRAMACIÓN ESTRUCTURADA: El Teorema de la Programación Estructurada establece que un


programa propio puede ser escrito utilizando solamente las siguientes estructuras de control:
• Secuenciales
• Selectivas
• Repetitivas
Un programa se define como propio si cumple con las siguientes características:
• tiene exactamente una entrada y una salida para control del programa,
• existen caminos que se pueden seguir desde la entrada hasta la salida que conducen por cada parte del
programa, es decir, no existen lazos infinitos ni instrucciones que no se ejecutan.

A continuación, se aborda este paradigma, acotando este práctico solo al estudio de estructuras
secuenciales y selectivas, ahondaremos el estudio de las estructuras repetitivas en el trabajo práctico
siguiente.

Equivalencias de las Operaciones y Estructuras de Control entre Diagrama de Flujo y Pseudocódigo.

OPERACIONES

ASIGNACIÓN

suma  suma + 10

LECTURA

leer valor

ESCRITURA

escribir ‘hola mundo!!!’

ESTRUCTURAS DE CONTROL

CONDICIONALES O SELECTIVAS SIMPLES

si condición entonces
acciones
fin_si

Funciona de la siguiente forma:


1. Se evalúa la expresión lógica condición.
2. Si la condición toma el valor Verdadero, se ejecutan las acciones1 y el control pasa a la sentencia
inmediatamente siguiente a la SI…. ENTONCES….FINSI, es decir a la siguiente sentencia del
programa.
3. Si la condición toma el valor Falso, el control pasa a la sentencia inmediatamente siguiente a la
SI…. ENTONCES….FINSI, es decir a la siguiente sentencia del programa.

Año 2018 Pág. 3


CONDICIONALES O SELECTIVAS DOBLES
si condición entonces
acciones1
sino
acciones2
fin_si
Funciona de la siguiente forma:
1. Se evalúa la expresión lógica condición.
2. Si la condición toma el valor Verdadero, se ejecutan las acciones 1 y el control pasa a la sentencia
inmediatamente siguiente a la SI…. ENTONCES….FINSI, es decir a la siguiente sentencia del
programa.
3. Si la condición toma el valor Falso, se ejecutan las acciones 2 y el control pasa a la sentencia
inmediatamente siguiente a la SINO…. ENTONCES….FINSI, es decir a la siguiente sentencia del
programa.
CONDICIONALES O SELECTIVAS MÚLTIPLES
Funciona de la siguiente forma:
1. La expresión opción se evalúa si es igual a op1 se ejecutarán acciones_1, si es igual a op2 se
ejecutarán acciones_2…. si es igual a opn se ejecutarán acciones_n. Se pueden agregar tantos
casos como se necesiten.
2. Si el valor de opción no coincide con op1…opn, ejecutará las acciones que se indican en la opción
DE OTRO MODO, que representa a todos los otros casos que no fueron indicados explícitamente.
según opción hacer
op1: acciones_1
op2: acciones_2

opn: acciones_n
de otro modo
acciones
fin_segun

Ejemplos

Ejemplo 1: Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que calcule la superficie de un rectángulo
de base b y altura h. Los valores de b y h son ingresados por el usuario.

Análisis del problema


Diccionario de datos
Identificador Formato Descripción
Primarias b, h Real Valores numéricos
Variables Valor de la superficie del
Secundarias Superficie Real
rectángulo
Constantes
Diccionario de resultados

Identificador Formato Descripción


Variables primarias Superficie Real Valor de la superficie del rectángulo
Constantes
Condiciones vinculantes
Número Descripción
1 Ingrese b, h
2 Asignar Superficie = b*h
3 Mostrar Superficie
El algoritmo tiene por objetivo calcular la superficie de un rectángulo, para ello, se usan 3 variables reales: b
(base), h (altura) y superficie; donde b y h son las variables de entrada del problema y superficie es la variable

Año 2018 Pág. 4


de salida. Los valores de b y h son asignados en operaciones de lectura o entrada. Con los valores ingresados

ESTRUCTURA DE UN PROGRAMA PRINCIPAL DIAGRAMA DE FLUJO


PROGRAMA
{CABECERA DE PROGRAMA} PROGRAMA rectangulo
VARIABLES
PROGRAMA nombre_programa b, h, superficie: REAL
{DECLARACIÓN DE VARIABLES} INICIO
VARIABLES ESCRIBIR "ingrese base";
LEER b;
Nombre variable: tipo ESCRIBIR "ingrese altura";
{DECLARACIÓN DE PROCEDIMIENTOS Y LEER h;
FUNCIONES} superficieb*h;
…… ESCRIBIR "Sup. es:"
superficie;
{PROGRAMA PRINCIPAL} FIN
INICIO
Acción 1
Acción 2
….
Acción n
FIN

se realiza el cálculo y se almacena el resultado en la variable superficie, cuyo contenido se presenta al usuario.

Ejemplo 2: Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que calcule la suma de dos números
enteros, ingresados por el usuario y luego muestre el resultado por pantalla.

Diccionario de datos
Identificador Formato Descripción
Primarias num1, num2 Entero Valores numéricos
Variables
Secundarias suma Entero Valor de la suma
Constantes

Diccionario de resultados
Identificador Formato Descripción
Variables primarias suma Entero Valor de la suma
Constantes

Condiciones vinculantes
Número Descripción
1 Ingrese num1, num2
2 Asignar suma = num1 + num2
3 Mostrar suma

PROGRAMA suma_nros
VARIABLES
num1, num2, suma: ENTERO
INICIO
ESCRIBIR "ingrese el primer número:";
LEER nro1;
ESCRIBIR "ingrese el segundo número:";
LEER nro2;
sumanro1+nro2;
ESCRIBIR " ", nro1, "+", nro2, "="
,suma;
FIN

Año 2018 Pág. 5


El algoritmo tiene por objetivo calcular la suma de dos números enteros ingresados por el usuario, para ello,
se usan 3 variables enteras: nro1, nro2 y suma; donde nro1 y nro2 son las
LEER: operación de entrada,
permite leer determinados variables de entrada del problema y suma es la variable de salida. Los valores
valores y asignarlos a variables de nro1 y nro2 son asignados en operaciones de lectura o entrada (LEER).
específicas. Esta entrada se
conoce como operación de Con los valores ingresados se realiza el cálculo y se almacena el resultado en
Lectura. Los datos se la variable suma, cuyo contenido se
introducen al procesador ESCRIBIR: operación de salida,
presenta al usuario con la sentencia de
mediante dispositivos de visualiza en el dispositivo de
entrada (teclado, unidades de escritura o salida en pantalla (ESCRIBIR). salida elegido el mensaje
disco, etc.).

Ejemplo 3: Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que permita el ingreso de una palabra,
calcule su longitud y la muestre por pantalla si es mayor a 10.

PROGRAMA ejemplo3
VARIABLES
palabra: CADENA;
cantidad: ENTERO;
INICIO
ESCRIBIR "Ingrese una
palabra";
LEER palabra;
cantidad<-LONGITUD(palabra);
SI cantidad>10 ENTONCES
ESCRIBIR "La longitud de
", palabra," es ", cantidad;
FINSI
FIN

La figura de la derecha muestra la pantalla


del diagrama de flujo del ejemplo 3
resuelto en el programa DFD.

DFD: es un software diseñado para construir y


analizar algoritmos. Usted puede crear
diagramas de flujo de datos para la
representación de algoritmos de programación
estructurada a partir de las herramientas de
edición que para éste propósito suministra el
programa. Después de haber ingresado el
algoritmo representado por el diagrama,
podrá ejecutarlo, analizarlo y depurarlo en un
entorno interactivo diseñado para éste fin. La
interfaz gráfica de DFD, facilita en gran medida
el trabajo con diagramas ya que simula la
representación estándar de diagramas de flujo
en hojas de papel.

NOTA: Encontrarán en el aula virtual


guías de ayuda de la aplicación.
El algoritmo tiene por objetivo mostrar la longitud de la palabra si es mayor a 10, para ello, se usan 2 variables
una tipo cadena: palabra, variable que a través de la operación de entrada o lectura LEER, almacena en su
espacio reservado de memoria los caracteres que entra por teclado el usuario del programa. La segunda
variable es cantidad de tipo entero, es la variable de salida, que almacena el valor calculado por LONGITUD.
Longitud es la función que calcula la cantidad de caracteres de una cadena, para usarla se coloca su nombre
seguida de los argumentos de la misma encerrado entre paréntesis, en este caso el argumento es la variable
palabra de tipo carácter o cadena, en el programa DFD, la función para el cálculo de la longitud es LEN. Para

Año 2018 Pág. 6


almacenar el valor en la variable cantidad se utiliza una sentencia de ASIGNACIÓN. Seguidamente se usa la
estructura condicional simple SI…condición …ENTONCES…acciones…FINSI, ya que se evalúa el resultado
obtenido y se decide si se muestra por pantalla, para ello se utiliza la expresión lógica cantidad>10 el operador
de relación > permite comparar el valor almacenado en cantidad y el número 10, si el resultado es
VERDADERO el programa ejecutará la instrucción de salida ESCRIBIR "La longitud de ", palabra," es
",cantidad; y finalizará el programa; en caso contrario es decir por FALSO directamente finalizará el programa.
Si se supone otra situación además de las descriptas, por ejemplo: se necesita evaluar si la longitud de la
palabra es par y realizar otras acciones a partir de esta decisión, en tal caso, se usan las estructuras
condicionales anidadas. Las estructuras de decisión anidadas se dan cuando en una estructura de decisión
se utiliza otra estructura de decisión.

Ejemplo 4: Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que determine cuál es el mayor de dos
valores ingresados por el usuario.

PROGRAMA ejemplo4
VARIABLES
valor_1, valor_2: ENTERO;
INICIO
LEER valor_1;
LEER valor_2;
SI valor_1 > valor_2 ENTONCES
ESCRIBIR ‘El mayor valor es:’,
valor_1
SINO
ESCRIBIR ‘El mayor valor es:’,
valor_2’
FIN_SI
FIN

El objetivo del algoritmo es determinar el mayor de 2 valores ingresados por el usuario. En este caso, se utilizan
2 variables enteras: valor_1 y valor_2 (variables de entrada). Utilizando una instrucción selectiva se evalúa la
condición valor_1 > valor_2 (cuyo resultado es de tipo lógico) y según su valor de verdad (VERDADERO o
FALSO) se imprime el mensaje “El mayor valor es …”.

▪ Si la vocal es ‘a’ mostrar VOCAL A


Ejemplo 5: Diseñe un algoritmo (diagrama de
▪ Si la vocal es ‘e’ mostrar VOCAL E
flujo y pseudocódigo) que muestre el nombre ▪ Si la vocal es ‘i’ mostrar VOCAL I
▪ Si la vocal es ‘o’ mostrar VOCAL O
de la vocal ingresada por el usuario. Para
▪ Si la vocal es ‘u’ mostrar VOCAL U
ello, considere lo siguiente: ▪ Para cualquier otra letra o símbolo, mostrar NO ES VOCAL

PROGRAMA letras
VARIABLES
letra: CARACTER;
INICIO
LEER letra
SEGÚN letra HACER
‘a’,’A’: ESCRIBIR ‘VOCAL A’;
‘e’,’E’: Escribir ‘VOCAL E’;
‘i’,’I’: Escribir ‘VOCAL I’;
‘o’,’O’: Escribir ‘VOCAL O’;
‘u’,’U’: Escribir ‘VOCAL U’;
DE OTRO MODO
Escribir ‘NO ES VOCAL’;
FIN_SEGÚN
FIN

PSEINT: PSeInt es un intérprete de pseudocódigo


basado en los contenidos de la cátedra de
Fundamentos de Programación de la UNL.
Fuentes y sitio de descarga:
http://pseint.sourceforge.net/

Año 2018 Pág. 7


El algoritmo tiene por objetivo visualizar un mensaje que identifique la vocal ingresada por el usuario. Para
ello, se utiliza una variable de tipo carácter denominada LETRA, que almacena el dato ingresado y se analiza
esta variable en el caso de ser una de las cinco vocales, se debe mostrar el cartel VOCAL + NOMBRE DE LA
VOCAL. La estructura de selección múltiple se usa para evaluar una expresión que puede tomar n valores
distintos: 1, 2, 3,4…, n según se presente un carácter vocal o no el programa ejecutará uno de los caminos
posibles. El problema se podría resolver con estructuras condicionales simples o dobles, anidadas o en
cascada; sin embargo, para que el código sea más simple y legible se recomienda cuando el número de
alternativas es grande el uso de la alternativa múltiple. En el problema planteado se analiza la variable letra
si coincide con una de las vocales, tanto en minúscula como mayúscula se ejecuta una de las sentencias de
escritura ‘Vocal A…U’, es decir, se visualiza el mensaje correspondiente; si el valor introducido no coincide
con los casos esperados, sigue el camino DE OTRO MODO, donde muestra ‘No es vocal’.

Ejercicios a Resolver
1. Diseñe un algoritmo (diagrama de flujo y pseudocódigo) permita ingresar un número entero y visualizar
en forma decreciente los tres números anteriores al dado.
2. Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que calcule la superficie y el perímetro de un
círculo de radio r (ingresada por el usuario).
3. Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que permita ingresar 2 cadenas de caracteres,
visualizar la longitud de cada una y su concatenación.
4. Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que permita ingresar 3 valores, si el primero es
positivo e impar, calcular el promedio, en caso contrario calcular la suma, mostrar el resultado.
5. Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que permita al usuario, ingresar 2 cadenas de
caracteres, visualizar la longitud de cada una y decir cuál tiene la longitud mayor, si alguna de las dos
longitudes es cero, mostrar el mensaje “Ingreso incorrecto”.
6. Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que permita ingresar 3 valores, determinar y
mostrar el mayor y el menor número.
7. Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que calcule las raíces de una ecuación
cuadrática. Tenga en cuenta que el algoritmo debe contemplar las posibles situaciones de error, de modo que
pueda notificarse al usuario en caso de ocurrir alguna.
8. Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que muestre el nombre de un tipo de periférico
de una computadora, de acuerdo a una letra ingresada por el usuario. Considere la siguiente correspondencia:
(‘e’,’E’) Entrada, (‘s’,’S’) Salida, (‘m’,’M’) Mixto y (‘a’,’A’) Almacenamiento. En caso de un ingreso no
contemplado, muestre el mensaje “ERROR EN LA ENTRADA”.
9. Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que muestre el nombre de un mes del año, de
acuerdo a un valor (entre 1 y 12) ingresado por el usuario. Además, considere que los nombres de los meses
podrán visualizarse en español o inglés según lo requiera el usuario. Ejemplo, si el usuario ingresa 1 y la
opción de idioma seleccionada es español, se mostrará Enero; si es inglés January. En caso de un ingreso
no contemplado, muestre el mensaje “NO CORRESPONDE A UN MES DEL AÑO”.

10. Dado el siguiente algoritmo:


PROGRAMA misterio c) Realice la prueba de escritorio para los
VARIABLES
x: ENTERO pares de valores: x=12 y n=4; x=12 y n=5.
band: LOGICO d) Determine el objetivo del algoritmo.
INICIO
LEER x e) Realice el diagrama de flujo equivalente.
LEER n
band <- (x MOD n = 0)
SI (band = VERDADERO) ENTONCES
ESCRIBIR x
FIN_SI
FIN



Año 2018 Pág. 8


ESCUELA DE MINAS “DR. HORACIO CARRILLO”

PROGRAMACIÓN ESTRUCTURADA
Trabajo Práctico Nº 3
Universidad
Nacional de Tema: Estructuras de Control Repetitivas
Jujuy
Apellido y Nombre: Fecha: / /

UNIDAD N° 3
A. Estructuras de control repetitivas o iterativas.
B. Bucles, contador, acumulador y bandera.
Conceptos teóricos a
tener en cuenta C. Formas de controlar la finalización de un bucle: bucle controlado por
bandera, bucle controlado por valor centinela y bucle controlado por contador.
D. Bucle infinito.
E. Reglas de anidamiento de las estructuras de control.
F. Pruebas de Escritorio.

Introducción
Las computadoras están especialmente diseñadas para todas PROBLEMAS REPETITIVOS O CÍCLICOS:
aquellas aplicaciones en las que una operación o conjunto de ellas son los que requieren para su solución
utilizar un mismo conjunto de acciones
deben repetirse muchas veces. que se puedan ejecutar una cantidad
La cantidad de iteraciones o veces que se repiten específica de veces.
determinadas acciones, puede ser fija (previamente determinada por
el programador) o puede ser variable (estar en función de algún dato BUCLES: estructuras que permiten
repetir una secuencia de instrucciones.
dentro del programa).
Las sentencias que permiten especificar la repetición de un ITERACIÓN: hecho de repetir la ejecución
conjunto de instrucciones son: de una secuencia de acciones.
• Para (PARA-FIN_PARA)
• Mientras (MIENTRAS-FIN_MIENTRAS)
• Repetir (REPETIR-HASTA_QUE)

Diagrama de Flujo y Sintaxis en Pseudocódigo: REPETIR, MIENTRAS Y PARA.


REPETIR
repetir
acciones
hasta_que condición

Funciona de la siguiente forma:


4. Se ejecuta el bloque de ACCIONES incluido en el bucle.
5. Se evalúa la CONDICIÓN.
6. Si la CONDICIÓN toma el valor Falso, se retorna al paso 1, si toma valor
Verdadero, se sigue al paso 4.
7. Sale del bucle.

Año 2018 Pág. 1


Programación Estructurada

MIENTRAS
mientras condición hacer
acciones
fin_mientras

Funciona de la siguiente forma:


1. Se evalúa la CONDICIÓN.
2. Si la CONDICIÓN toma el valor Verdadero, se sigue con el paso 3, si la
CONDICIÓN toma valor FALSO, se sigue al paso 4.
3. Se ejecuta el bloque de ACCIONES incluido en el bucle y se retorna al paso 1.
4. Sale del bucle.

PARA
para v desde vi hasta vf hacer con paso n
acciones
fin_para

Funciona de la siguiente forma:


1. Se asigna a la variable de control o índice el valor inicial (vi)
2. Si la CONDICIÓN (vi <= vf) toma el valor Verdadero, se sigue con el paso 3, si
la CONDICIÓN (vi <= vf) toma valor FALSO, se sigue al paso 5.
3. Por defecto, se incrementa (v+1) o decrementa (v-1) el índice en una unidad,
aunque puede especificarse otro valor (paso n ej. v*2).
4. Se ejecuta el bloque de ACCIONES incluido en el bucle, se retorna al paso 2.
5. Sale del bucle.

Ejemplos

Ejemplo 1: Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que sume 30


valores ingresados por el usuario.

PROGRAMA Ejemplo_1
VARIABLES
suma, i, valor: Entero
INICIO
suma  0
PARA i DESDE 1 HASTA 30 HACER
ESCRIBIR ‘ingrese valor:’
LEER valor
suma  suma + valor
FINPARA
ESCRIBIR ‘la suma es:’ suma
FIN

Año 2018 Pág. 2


Programación Estructurada

ACUMULADOR: es una variable cuya El algoritmo permite ingresar 30 valores (cantidad fija) y calcular su suma.
misión es almacenar cantidades El ingreso de los valores y cálculo de las sumas parciales se realizó
variables resultantes de sumas o dentro de una estructura PARA. Esta estructura permite especificar las
productos sucesivos. acciones a repetir y el número de iteraciones (repeticiones) a realizar.
Obsérvese que la variable suma, inicializada en cero (valor neutro de la
operación suma), funciona como acumulador de los valores de entrada.
Un acumulador realiza la misma función que un contador, con la diferencia que el incremento o decremento es
variable en lugar de constante.
Ejemplo 2: Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que calcule el promedio de valores
ingresados por el usuario. Considere que el ingreso finaliza a pedido del usuario.
PROGRAMA Ejemplo_2
VARIABLES
suma, contador: Entero
promedio, dato: Real
respuesta: Caracter
INICIO
suma0
contador0
REPETIR
ESCRIBIR ‘ingrese dato:’
LEER dato
sumasuma + dato
contadorcontador + 1
ESCRIBIR ‘ingresar más datos s/n:’
LEER respuesta
HASTA_QUE respuesta=’n’
promedio <- suma/contador
ESCRIBIR ‘promedio:’ promedio
FIN

El algoritmo permite introducir valores, en tanto el usuario desee CONTADOR: es una variable cuyo valor
continuar con el ingreso (la entrada de datos finaliza a petición del se incrementa o decrementa en una
usuario), y calcular el promedio de los valores ingresados. Al cantidad constante en cada iteración.
desconocerse a priori la cantidad de números a promediar es necesario
El contador puede ser positivo o
utilizar una variable que lleve la cuenta del ingreso, en este caso, la
negativo.
variable contador. Obsérvese que la estructura REPETIR itera en tanto
la condición sea FALSA, es decir, mientras la variable respuesta sea
distinta de ‘n’. En el momento que respuesta sea igual al ‘n’, la condición CENTINELA: es aquel valor especial
se hace VERDADERA y el bucle finaliza. La letra ‘n’ funciona como un que, al ingresar en el bucle, permite
valor especial, denominado valor centinela. Un bucle controlado por finalizar las iteraciones.
centinela es aquel en el que un valor que se ingresa en el bucle permite
finalizar las iteraciones.
Además, la variable suma funciona como acumulador de los datos de entrada y la variable respuesta,
mediante la condición respuesta = ‘n’, permite evaluar si se continua o no con las acciones del bucle REPETIR.
Es decir, si el usuario ingresa un carácter diferente a ‘n’, por ejemplo ‘s’, ‘r’, ‘4’, ‘%’, las iteraciones siguen
sucediendo, la parada del bucle se da, con la ocurrencia del valor centinela.
Ejemplo 3: Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que
resuelva la siguiente expresión: SUMATORIA: La sumatoria se emplea
para representar la suma de muchos o
𝑛 infinitos sumandos.
∑𝑐 = 1 + 2 + 3 +⋯+ 𝑛 La expresión se lee: "sumatoria de
𝑐=1 c, donde c toma los valores de 1 a n".

Año 2018 Pág. 3


Programación Estructurada

La operación sumatoria se expresa con la letra griegra sigma mayúscula Σ.


i es el valor inicial llamado límite inferior.
n es el valor final llamado límite superior.
PROGRAMA Sumatoria
VARIABLES
n, c, suma: Entero
INICIO
ESCRIBIR ‘ingrese la cantidad de términos a sumar:’
LEER n
suma0
c1
MIENTRAS c<=n HACER
sumasuma + c
cc + 1
FIN_MIENTRAS
ESCRIBIR ‘El resultado es:’ suma
FIN

El algoritmo permite sumar la cantidad de términos indicados por el valor n, primeramente solicitado e
introducido mediante teclado por el usuario. La variable c funciona como un contador inicializado en 1, se
incrementa de uno en uno hasta llegar al valor n. Estamos frente a un bucle controlado por contador, la
finalización del bucle sucede cuando una variable, en este caso c, alcanza el valor n. La variable c, se utiliza para
contabilizar la cantidad de veces que ocurre algún evento, y de este modo finalizar o no las iteraciones del bucle.
Además la variable suma funciona como acumulador, inicializado en 0, valor neutro de la suma, acumula uno a
uno los términos en cada iteración del bucle, MIENTRAS se cumpla la condición c<=n.
Ejemplo 4: Dado el algoritmo del presente enunciado, escrito en lenguaje natural.
a) realice el diagrama de flujo equivalente, b) realice la prueba de escritorio para los valores: m=6 y n=3,
m=4 y n=4, c) determine el objetivo del algoritmo y d) escriba el pseudocódigo equivalente.

ALGORITMO a)
Programa Producto
INICIO
Mostrar por pantalla “Ingrese el primer valor”
Asignar a m un valor introducido por el usuario
Mostrar por pantalla “Ingrese el segundo valor”
Asignar a n un valor introducido por el usuario Inicializar
band en FALSO
Inicializar x en 0
REPETIR
SI band es igual a FALSO ENTONCES
Aumentar al valor de m al valor de x
Decrementar n en 1
FIN_SI
SI n es igual a 0 ENTONCES
Asignar a band VERDADERO
FIN_SI
HASTA QUE band sea igual a VERDADERO
Mostrar por pantalla “Resultado”, x
FIN

Año 2018 Pág. 4


Programación Estructurada

b) d)
Pasos m n band x PROGRAMA Producto
01 6 3 F 0 VARIABLES
02 6 2 F 6 m, n, x: Entero
03 6 1 F 12 band: Logico
04 6 0 V 18
Resultado 18
01 4 4 F 0 INICIO
02 4 3 F 4 ESCRIBIR "Ingrese primer valor:"
03 4 2 F 8 LEER m
04 4 1 F 12 ESCRIBIR "Ingrese segundo valor:"
10 4 0 V 16 LEER n
Resultado 16 band←FALSO
x←0
REPETIR
c) El objetivo del ALGORITMO PRODUCTO, es SI band=FALSO ENTONCES
determinar el producto de dos números x←x+m
ingresados por el usuario. n←n-1
FINSI
SI n=0 ENTONCES
band←VERDADERO
FIN_SI
HASTA QUE band=VERDADERO
ESCRIBIR "Resultado: ", x
FIN

El algoritmo permite sumar la cantidad de términos m indicados BANDERA: variable lógica que permite
por el valor n, valores solicitados e ingresados mediante teclado por el determinar la ocurrencia de un evento
usuario. La variable n funciona como un contador inicializado en la y de este modo finalizar o no las
cantidad que tipea el usuario, se decrementa de uno en uno hasta iteraciones del bucle.
llegar a 0. Además la variable x funciona como acumulador, inicializado
en 0, valor neutro de la suma, acumula los términos m en cada iteración
del bucle y mientras se cumpla la condición band=Falso. La variable band, es una variable lógica empleada como
bandera, esta permite controlar el bucle y tiene la misión de determinar la ocurrencia de un evento, en este caso
el evento es determinar si n llega al valor 0, de este modo finaliza o no las iteraciones del bucle. Estamos en
presencia de un bucle controlado por bandera.

Ejercicios a Resolver
11. Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que permita mostrar N veces una cadena, ingresada
por el usuario. Considere que la cantidad de veces, está dada por la longitud de la cadena, si esta es cero,
mostrar el mensaje “Ingreso incorrecto” y salir del programa.
12. Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que permita ingresar valores y determinar la cantidad
de negativos, positivos y ceros introducidos. Considere que el ingreso finaliza a petición del usuario.
13. Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que determine los valores máximo y mínimo de una
serie de números enteros ingresados por el usuario. Considere que el ingreso finaliza cuando el valor introducido
es CERO. Utilice el concepto de finalización de bucle por valor centinela.
14. Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que calcule el producto de 2 números a y b, pero
utilizando para ello sólo sumas; ¿cómo lo hace?
15. Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que permita calcular el factorial de un número N.
Para realizar el cálculo utilice todas las estructuras repetitivas estudiadas.
Se llama factorial de un número natural n al producto de los n primeros números naturales. Se representa
por n!, es decir, el factorial de n (n!) se calcula como:
n!=n x (n-1) x (n-2) x …. x 3 x 2 x 1. Por ejemplo, el factorial de 5 es 5!=5 x 4 x 3 x 2 x 1  5!=120
Se define el factorial de 0 por 0! = 1.
16. Considerando que la potencia de un número entero positivo a elevado a un número entero positivo b, puede
expresarse como el producto sucesivo de a, b veces, diseñe un algoritmo que calcule la potencia de a elevado
a b mediante productos sucesivos. Controle el bucle de cálculo con una bandera.
Año 2018 Pág. 5
Programación Estructurada

17. Considerando que la división entera de dos números enteros positivos, a y b, puede expresarse como la
resta sucesiva entre a y b (siempre que a sea mayor o igual que b), diseñe un algoritmo (diagrama de flujo y
pseudocódigo) que calcule el cociente y el resto de la división entre a y b mediante restas sucesivas. Escriba
una versión con estructuras MIENTRAS y otra con estructuras REPETIR.
Nota: la cantidad de veces que pueda realizar la resta de a y b (a >= b) indica el cociente de la división.
18. Dada la serie numérica 2, 3, 4, 9, 16, 29, 54, 99, … cada término de ésta se calcula como la suma de los 3
términos precedentes, salvo los 3 primeros que valen 2, 3 y 4 respectivamente. Teniendo en cuenta esto:
a) diseñe un algoritmo (diagrama de flujo) que permita calcular un término N de la serie.
b) realice la prueba de escritorio para N=6
19. La sumatoria (que se denota por la letra griega Sigma, Σ es un operador matemático que representa la suma
de N (o incluso infinitos) términos que tienen una forma general. Por ejemplo:
𝑛

∑2 ∗ 𝑖 − 1
𝑖=1

Dónde n indica la cantidad de términos a sumar e i el valor que varía de término a término.
Desarrolle un algoritmo que calcule el valor de la sumatoria anterior. ¿Cuál es el objetivo del algoritmo?
20. Al finalizar el dictado de una materia el profesor a cargo calcula, por cada alumno, el promedio de las 3
evaluaciones que se han realizado. Diseñe un algoritmo (diagrama de flujo y pseudocódigo) que permita calcular
el promedio de los alumnos y clasificarlos según la siguiente correspondencia: Insuficiente (entre 0 y 3), Suficiente
(entre 4 y 5), Satisfactorio (entre 6 y 7), Bueno (entre 8 y 9) y Muy Bueno (10). Considere que las notas son
ingresadas por el profesor, al igual que la petición de finalización de carga de datos.
21. Dado el siguiente algoritmo (pseudocódigo):
PROGRAMA enigma
VARIABLES 1. Realice la prueba de escritorio para
q, w, x: ENTERO q=4 y w=2, y para q=3 y w=3 determine
band: LOGICO
INICIO el valor de la función en cada caso.
x1 2. Determine el propósito del algoritmo.
band  VERDADERO
ESCRIBIR “Ingrese dos números 3. Dibuje el diagrama de flujo
enteros y positivos” correspondiente
LEER w
REPETIR
SI (w=0) ENTONCES
bandFALSO
SINO
x  x*q
w  w-1
FINSI
HASTA_QUE(band=FALSO)
ESCRIBIR “Resultado”, x
FIN



Año 2018 Pág. 6


ESCUELA DE MINAS “DR. HORACIO CARRILLO”

PROGRAMACIÓN ESTRUCTURADA
Trabajo Práctico N º 4
Universidad
Nacional de
Tema: Estructuras de Control en C/C++
Jujuy
Apellido y Nombre: Fecha: / /

Conceptos
Estructuras de Control: Equivalencias entre Pseudocódigo y Lenguaje C/C++.

ASIGNACIÓN

suma  suma + 10 suma=suma + 10;

LECTURA

leer valor cin >> valor;

ESCRITURA

escribir ‘hola mundo!!!’ cout << “hola mundo!!!”;

CONDICIONALES O SELECTIVAS SIMPLES

si condición entonces if (condición)


acciones acciones;
fin_si

CONDICIONALES O SELECTIVAS DOBLES

si condición entonces if (condición)


acciones1 acciones1;
sino else
acciones2
acciones2;
fin_si

CONDICIONALES O SELECTIVAS MÚLTIPLES

según opción hacer switch (opción)


op1: acciones_1 {
op2: acciones_2 case op1: acciones_1; break;
… case op2: acciones_2; break;
opn: acciones_n …
de otro modo case opn: acciones_n; break;
acciones default: acciones;
fin_segun }
REPETIR

Do
repetir
{
acciones
acciones;
hasta_que condición
} while (condición);

MIENTRAS

mientras condición hacer while (condición)


acciones {
fin_mientras acciones; }
PARA

para v desde vi hasta vf hacer con paso n hacer for (v=vi; v<=vf; v++)
acciones {
fin_para acciones; }

Año 2018 Pág. 1


Programación Estructurada

Programas en C. Estructura General


Un programa codificado en lenguaje C se estructura, básicamente, en 3 secciones
▪ Declaraciones
• Librerías del lenguaje: la directiva #include permite indicar al compilador qué librerías debe incluir
en el programa objeto para generar el programa ejecutable correspondiente. Las librerías a utilizar
se indican entre paréntesis angulares, por ejemplo, <stdio.h> (librería de las funciones estándar
de entrada/salida). De esta manera, el programador puede utilizar las funciones internas del
lenguaje.
• Módulos del programador: se especifica el tipo y argumentos de los módulos escritos por el
programador.
• Variables globales: se especifica el tipo de dato y nombre de las variables globales del programa.
• Constantes: se especifica el tipo, nombre y valor de las constantes del programa.
▪ Programa principal (función main): la función main() contiene declaraciones de variables e instrucciones
necesarias para controlar la secuencia de operaciones que ejecuta el programa a fin de resolver el
problema para el que fue pensado.
▪ Módulos del programador: se especifica el código correspondiente a cada uno de los módulos creados por
el programador. Un módulo contiene declaración de variables e instrucciones que resuelven un
subproblema específico.
A continuación, se presenta un modelo de la estructura general para un programa codificado en lenguaje C.
/* Comentario inicial: nombre del programa,
del programador, fecha, etc */

/* Archivos de cabecera (prototipos de funciones de librería) */


#include <archivo_cabecera.h>
#include <archivo_cabecera.h>

// Prototipos de funciones y procedimientos escritos por el programador


tipo_dato modulo1 (argumentos);
tipo_dato modulo2 (argumentos);

/* Variables y constantes globales */


tipo_dato variable_global;

const
tipo_dato constante_global=valor;
#define PI 3.14

/* Algoritmo principal */
tipo_dato main(argumentos)
{
/* Variables locales del algoritmo principal */
tipo_dato nombre_variable1, nombre_variable2;
tipo_dato nombre_variable3, nombre_variable4;
...
...
/* Instrucciones del algoritmo principal */
...
modulo1(argumentos);
...
modulo2(argumentos);
...
return valor;
}

Año 2018 Pág. 2


Programación Estructurada

/* Código completo de las funciones escritas por el programador */


tipo_dato modulo1 (argumentos)
{
/* Variables locales e instrucciones del módulo */
}

tipo_dato modulo2 (argumentos)


{
/* Variables locales e instrucciones del módulo */
}

Tipos de datos básicos


En un programa en C, los datos que se utilicen pueden definirse según los tipos presentados en la siguiente tabla.
Nombre Descripción Tamaño Rango
Con signo: -128 … 127
Char Caracter (código ASCII) 8 bits
Sin signo: 0 … 255
Con signo: -32768 … 32767
short int (short) Número Entero corto 16 bits
Sin signo: 0 … 65535
Con signo: -2147483648 … 2147483647
Int Número Entero 32 bits
Sin signo: 0 … 4294967295
Con signo: -9223372036854775808,
long int (long) Número Entero largo 64 bits 9223372036854775807
Sin signo: 0 … 18446744073709551615
Float Número real 32 bits 3,4*10-38 … 3,4*10+38 (6 decimales)
Número real en doble
double 64 bits 1,7*10-308 … 1,7*10+308 (15 decimales)
precisión
Número real largo de
long double 80 bits 3,4*10-4932 … 1,1*10+4932
doble precisión
Bool Valor booleano 1 bit true (VERDADERO) o false (FALSO)
La selección del tipo de dato adecuado para los elementos del programa se realiza teniendo en cuenta el rango de
valores a representar y las operaciones que se deban aplicar.

Funciones Básicas de Entrada/Salida de datos.


Las funciones de entrada/salida estándar de C están definidas en la biblioteca stdio. Cuando estas funciones se
utilizan en el programa fuente es preciso incluir el archivo stdio.h mediante la directiva de precompilación #include
<stdio.h>. Entre las funciones que contiene esta librería se encuentran printf, scanf y gets.

La función printf es la salida genérica por consola utilizada por C, mientras que la función scanf es la entrada
estándar asociada al teclado. Tanto la función printf como la función scanf permiten especificar el formato en el
que se van a escribir o leer los datos, esto se conoce como entrada/salida formateada.
La función de entrada gets permite almacenar una cadena de caracteres ingresada por teclado. Es decir, permite
leer datos de la entrada estándar y almacenarlos en la variable que utiliza como argumento. La sintaxis de esta
función es la siguiente:
gets(nombre_variable);
En C++ además de las funciones printf y scanf, que siguen estando vigentes, se pueden utilizar las “funciones” cin
y cout. Para utilizarlas es necesario incluir la librería iostream.h especificando la directiva #include <iostream.h>,
cin y cout responden a la siguiente sintaxis:

cin >> nombre_variable;


cout << “cadena de caracteres” << nombre_variable << endl;

Utilizando cin y cout no es necesario especificar el tipo de dato que se imprimirá o leerá, asociándolo con un formato

Año 2018 Pág. 3


Programación Estructurada

determinado (como ocurre con printf y scanf), sino que es el propio programa el que decide el tipo de dato en
tiempo de ejecución. De este modo, cin y cout admiten tanto los tipos predefinidos como aquellos tipos de datos
definidos por el usuario. Al ser C++ una ampliación del lenguaje C, es necesario agregar nuevas palabras
reservadas. Estas palabras reservadas están en un espacio de nombres o “namespace”. Para usar las palabras
reservadas cout y cin, que están el namespace std (standard), se debe incorporar la instrucción:

using namespace std;

en la cabecera del programa, al incorporarla le estamos diciendo al compilador que usaremos el espacio de
nombres std, y que busque e interprete todos los elementos definidos en el archivo.

Documentación Interna. Comentarios


Los comentarios en programas fuente C pueden especificarse para líneas individuales o párrafos completos. Un
comentario de línea se indica con el símbolo // y un comentario de párrafo se especifica con los símbolos /* (inicio
del comentario) */ (fin del comentario).
Operadores en C
La siguiente tabla presenta los operadores básicos utilizados en C.
Tipo Operadores
Potencia: pow(x,y) (librería math.h); x, y valores numéricos
Producto: *
Cociente: /
Aritmético
Módulo o resto: %
Sumar: +
Diferencia: -
Operaciones con cadenas (librería string.h)
strcat(s,t); concatena s al final de t.
strcmp(s,t); compara s y t, retornando negativo, cero, o positivo para: s<t,
Alfanuméricos s==t, s > t.
strcpy(s,t); copia t en s.
strlen(s); retorna la longitud de s.
donde s y t son variables de tipo cadena.
Negación (NO, NOT): !
Lógicos Conjunción (Y, AND): &&
Disyunción (O, OR): ||
Igual: ==
Distinto: !=
Mayor: >
Relacionales
Mayor o igual: >=
Menor: <
Menor o igual: <=
Asignación =

Ejemplos

Ejemplo 1: Diseñe un algoritmo (pseudocódigo) que sume 30 valores ingresados por el usuario. Codifique el
algoritmo en C, incluyendo las librerías necesarias.
PROGRAMA SUMAR_VALORES //Sumar_Valores
VARIABLES #include <stream.h>
ENTERO suma, valor, i #include <stdlib.h>
INICIO
suma  0 main ()
PARA i DESDE 1 HASTA 30 HACER {
ESCRIBIR ‘ingrese valor:’ int suma,valor,i;
LEER valor suma=0;
suma  suma + valor for(i=1;i<=30;i++)
FINPARA {

Año 2018 Pág. 4


Programación Estructurada

ESCRIBIR ‘la suma es:’ suma cout << "Ingrese valor:";


FIN cin >> valor;
suma=suma+valor;
}
cout << "La suma es:" << suma << endl;
system("pause");
}
El algoritmo permite ingresar 30 valores (cantidad fija) y calcular su suma. El ingreso de los valores y cálculo de las
sumas parciales se realiza dentro de una estructura PARA. Esta estructura permite especificar las acciones a repetir
y el número de iteraciones (repeticiones) a realizar. Obsérvese que la variable suma, inicializada en cero, funciona
como acumulador de los valores de entrada. El programa codificado en C especifica el tipo de las variables de
entrada, proceso y salida utilizadas, valores de inicialización y operaciones de entrada/salida de acuerdo a la
sintaxis del lenguaje.

Ejemplo 2: Diseñe un algoritmo (pseudocódigo) que calcule el promedio de valores ingresados por el usuario.
Considere que el ingreso finaliza a pedido del usuario. Codifique el algoritmo en C, incluyendo las librerías
necesarias.
PROGRAMA PROMEDIO_VALORES //Promedio_Valores
VARIABLES #include <stream.h>
#include <stdlib.h>
ENTERO dato,contador
REALES suma,promedio main()
INICIO {
suma0, contador0 int contador,dato;
REPETIR float promedio,suma;
ESCRIBIR ‘ingrese dato:’ char respuesta;
suma=0;
LEER dato
contador=0;
sumasuma + dato do
contadorcontador + 1 {
ESCRIBIR ‘ingresar más datos s/n:’ cout << "Ingrese dato:";
LEER respuesta cin >> dato;
HASTA_QUE respuesta=’n’ suma=suma+dato;
contador++;
promedio <- suma/contador cout << "Ingresar mas datos S/N:";
ESCRIBIR ‘promedio:’ promedio cin >> respuesta;
FIN } while ((respuesta!='n') &&
(respuesta!='N'));
promedio=suma/contador;
cout << "El promedio es: " << promedio << endl;
system("pause");
}

El algoritmo permite introducir valores, en tanto el usuario desee continuar con el ingreso (la entrada de datos
finaliza a petición del usuario), y calcular su promedio. Al desconocerse a priori la cantidad de números a promediar
es necesario utilizar una variable que lleve cuenta del ingreso, en este caso, la variable contador. Además la variable
suma funciona como acumulador de los datos de entrada y la variable respuesta permite evaluar si se continua o
no con las acciones del bucle REPETIR.
En el programa codificado puede observarse que las variables suma y promedio están definidas como reales. Es
conveniente destacar que el operador de división (/) realiza el cociente entero si los datos que opera son enteros y
calcula el cociente real si al menos uno de los operandos es real (promedio=suma/contador). Otra observación
importante es la condición de finalización de bucle. Mientras que en el pseudocódigo se evalúa la condición
respuesta=’n’, en el programa en C la condición del bucle es ((respuesta!='n') && (respuesta!='N')). Esto se debe a
que en DISEÑO la estructura REPETIR se considera que itera en tanto la condición sea FALSA y finaliza con condición

Año 2018 Pág. 5


Programación Estructurada

VERDADERA. En C, la estructura pos-condicional do-while repite las acciones del bucle si la condición es
VERDADERA y finaliza cuando ésta se hace FALSA.

Ejemplo 3: Diseñe un algoritmo (pseudocódigo) que determine el valor máximo de una serie de números enteros
ingresados por el usuario. La cantidad de números a considerar es indicada por el usuario. Codifique el algoritmo
en C, incluyendo las librerías necesarias.

PROGRAMA MAXIMO // Programa Mayor


VARIABLES #include <stream.h>
LOGICO bmax #include <stdlib.h>
ENTERO cantidad,valor,max,i
INICIO main()
ESCRIBIR ‘ingrese cantidad de datos: ’ {int cantidad,i,max,valor;
LEER cantidad bool bmax;
bmaxVERDADERO cout << "Ingrese cantidad de valores:";
PARA i DESDE 1 HASTA cantidad HACER cin >> cantidad;
LEER valor bmax=true;
SI bmax=verdadero ENTONCES for(i=1;i<=cantidad;i++)
bmaxFALSO {
maxvalor cout << "Ingrese valor:";
SINO cin >> valor;
SI valor > max ENTONCES if (bmax==true)
Max valor {
FIN_SI max=valor;
FIN_SI bmax=false;
FIN_PARA }
ESCRIBIR ‘el máximo valor es: ’, max else
FIN {
if (max<valor)
max=valor;
}
}
cout << "El maximo es:" << max << endl;
system("pause");
}
El algoritmo permite determinar el valor máximo de una serie de datos ingresada por el usuario. En este ejemplo
puede observarse el uso de una variable bandera (bmax, variable lógica) que permite identificar el primer valor de
la serie, que luego será asignado a la variable max y modificándose el valor de bmax de modo que los siguientes
ingresos se comparen con max. De modo se consigue que sólo los valores introducidos por el usuario se comparen
para obtener el máximo.

Ejercicios
1) El siguiente programa, codificado en lenguaje C, muestra la cadena “PROGRAMACION ESTRUCTURADA - APU”.
Codifique el programa y guárdelo como tp4-1.cpp. Compile y ejecute este programa.
// librerías que permiten utilizar las funciones del lenguaje
#include <stream.h>
#include <stdlib.h>

// programa principal
main ()
{
cout << "PROGRAMACION ESTRUCTURADA - APU";
system("pause");
}
2) El siguiente programa, codificado en lenguaje C, permite ingresar un número entero y un número real y
mostrarlos por pantalla. Codifique el programa y guárdelo como tp4-2.cpp. Compile y ejecute este programa.
// librerias que permiten utilizar las funciones del lenguaje
#include <stream.h>

Año 2018 Pág. 6


Programación Estructurada

#include <stdlib.h>
// programa principal
main ()
{
int valor;
float num;
cout << "Ingrese numero entero:";
cin >> valor;
cout << "Ingrese numero real:";
cin >> num;
cout << "El numero entero ingresado es: " << valor << endl;
cout << "El numero real ingresado es: " << num << endl;
system("pause");
}
3) El siguiente programa, codificado en lenguaje C, permite ingresar un carácter y mostrarlo por pantalla.
Codifique el programa y guárdelo como tp4-3.cpp. Compile y ejecute este programa.
#include <stream.h>
#include <stdlib.h>
main ()
{
char letra;
cout << "Ingrese caracter:";
cin >> letra;
cout << "El caracter ingresado es: " << letra << endl;
system("pause");
}
4) El siguiente programa, codificado en lenguaje C, permite ingresar una cadena de caracteres y mostrarla por
pantalla. Codifique el programa y guárdelo como tp4-4.cpp. Compile y ejecute este programa.
#include <stdio.h>
#include <stream.h>
#include <stdlib.h>
typedef char tcad[20];
main()
{
tcad frase;
cout << "Ingrese cadena:";
gets(frase);
cout << "La cadena ingresada es: " << frase << endl;
system("pause");
}
5) El siguiente programa, codificado en lenguaje C, permite ingresar 2 números enteros y determinar si son
iguales o cuál de ellos es el mayor. Codifique el programa y guárdelo como tp4-5.cpp. Compile y ejecute este
programa.
#include <stream.h>
#include <stdlib.h>
main ()
{
int num1,num2;
cout << "Ingrese primer valor: ";
cin >> num1;
cout << "Ingrese segundo valor: ";
cin >> num2;
if (num1 == num2)
cout << "VALORES IGUALES" << endl;
else
if (num1 > num2)
cout << num1 << " es mayor que " << num2 << endl;
else
cout << num2 << " es mayor que " << num1 << endl;
Año 2018 Pág. 7
Programación Estructurada

system("pause");
}
6) El siguiente programa, codificado en lenguaje C, permite ingresar un carácter y determinar si es una vocal
(mayúscula) o no. Codifique el programa y guárdelo como tp4-6.cpp. Compile y ejecute este programa.
#include <stream.h>
#include <stdlib.h>
main ()
{
char vocal;
cout << "Ingrese letra:";
cin >> vocal;
switch (vocal)
{
case 'A': cout << "VOCAL A" << endl;
break;
case 'E': cout << "VOCAL E" << endl;
break;
case 'I': cout << "VOCAL I" << endl;
break;
case 'O': cout << "VOCAL O" << endl;
break;
case 'U': cout << "VOCAL U" << endl;
break;
default: cout << "NO ES VOCAL" << endl;
}
system("pause");
}

7) Modifique el programa anterior, de modo que también considere las vocales minúsculas. Codifique el
programa en el compilador Dev-cpp y guárdelo como tp4-7.cpp. Compile y ejecute este programa.
8) Modifique el programa del ítem 7, de modo que la determinación de vocales se realice únicamente utilizando
sentencias “if”. Codifique el programa en el compilador Dev-cpp y guárdelo como tp4-8.cpp. Compile y ejecute
este programa.
9) Codifique en C un programa que permita ingresar 15 caracteres y determinar la cantidad de mayúsculas (‘A’,
…, ‘Z’) introducidas. Guarde el archivo fuente como tp4-9. Compile y ejecute este programa.
10) Codifique en C un programa que calcule la suma de los valores comprendidos entre valor_inferior y
valor_superior. Estos valores son ingresados por el usuario. Por ejemplo, si el usuario introduce los números
28 y 35 deben sumarse los valores 28, 29, 30, 31, 32, 33, 34 y 35. Guarde el archivo fuente como tp4-10.
Compile y ejecute este programa.
11) Codifique en C un programa que dado un número natural N menor o igual que 20, permita calcular y mostrar
las 10 primeras potencias de N. Por ejemplo, si N=5 deben calcularse 50, 51, 52, 53, 54, 55, 56, 57, 58 y 59.
Guarde el archivo fuente como tp4-11. Compile y ejecute este programa.
12) Codifique en C un programa que calcule la potencia (mediante productos sucesivos) de un número entero A
elevado a otro B, ambos valores ingresados por el usuario. Considerando que los valores pueden ser
positivos y/o negativos, controle que el resultado se calcule correctamente. Guarde el archivo fuente como
tp4-12. Compile y ejecute este programa. Nota: Un número elevado a un exponente par genera un resultado
positivo, mientras que un exponente impar genera un resultado que tiene el mismo signo que la base.
Recuerde que a-b se calcula como 1/ab.



Año 2018 Pág. 8


ESCUELA DE MINAS “DR. HORACIO CARRILLO”

PROGRAMACIÓN ESTRUCTURADA
Trabajo Práctico Nº 5
Universidad
Nacional de Tema: Modularidad. Funciones. Pasaje de Parámetros
Jujuy
Apellido y Nombre: Fecha: / /

UNIDAD N° 4
A. Programación Modular
B. Definición de Procedimiento.
Conceptos teóricos a
C. Definición de Función.
tener en cuenta
D. Declaración e invocación de una función.
E. Declaración e invocación de un procedimiento.
F. Parámetros por Valor y por Referencia.
G. Ámbito de una variable. Variables Locales y variables Globales.

Introducción
Cuando los programas se vuelven más grandes, cosa que lógicamente sucede cuando aumenta la complejidad
del problema a resolver, la lista de instrucciones aumenta considerablemente, de modo tal que el programador
tiene muchas dificultades para controlar ese gran número de instrucciones. Los programadores pueden controlar,
de modo normal, unos centenares de líneas de instrucciones. Para resolver este problema los programas se
descomponen en unidades más pequeñas que adoptan el nombre de subprogramas (procedimientos, funciones
o subrutinas en otros lenguajes de programación). De este modo un programa modular se divide en
subprogramas (funciones y procedimientos), de modo que cada subprograma tiene un propósito bien definido,
resuelve una tarea concreta y se diseña una interfaz claramente
definida (el prototipo o cabecera del subprograma) para la SUBPROGRAMA: conjunto de sentencias
de un programa que realiza determinada
comunicación entre subprogramas. tarea y que puede ser ejecutada desde
Con el auxilio de este último concepto podemos aclarar la resolución uno o más puntos del programa principal
con la simple mención de su nombre y
de complicados problemas, mediante su división en problemas de
posee todas las características propias
menor complejidad o subproblemas. de un programa.
Estos subproblemas pueden dividirse a su vez en otros subproblemas
más pequeños, hasta llegar a ser problemas fáciles de solución. CONTROL DEL PROGRAMA: Al
El proceso de subdividir en tareas de menor envergadura a una tarea efectuarse el llamado a un subprograma,
el control del programa se transfiere a
compleja, es el método denominado de Refinamiento Sucesivo o este módulo independiente el cual
también conocido como diseño descendente TOP-DOWN. después de realizar la tarea
encomendada retorna nuevamente el
El refinamiento sucesivo es, por lo tanto, el proceso mediante el cual
control al programa llamador o principal
podemos desglosar un problema en problemas más pequeños que continuando este la ejecución normal del
pueden tratarse y desarrollarse independientemente entre sí. resto de sus instrucciones.

Las soluciones derivadas de un diseño descendente de problemas


complejos pueden implementarse fácilmente en cualquiera de los PROGRAMA PRINCIPAL - MAIN: modulo
lenguajes de alto nivel hoy. que actúa como coordinador el cual
controla y relaciona a todos los
subprogramas.

Año 2018 Pág. 1


Programación Estructurada

Funciones
Ejemplo 1: Diseñe, en pseudocódigo, un algoritmo modular que calcule el factorial de un número ingresado por
el usuario. Considere que el ingreso de datos se realiza en el programa principal.

Pseudocódigo FUNCIÓN: Construcción matemática a la


{CABECERA DE PROGRAMA} que se pueden aplicar valores y que
PROGRAMA calculo_factorial devuelve un resultado.
{DECLARACIÓN DE VARIABLES}
VARIABLES
FUNCIÓN INTERNA: Funciones
factor:entero
predefinidas en los lenguajes de
numero:entero programación. Ej. Matemáticas,
{DECLARACIÓN DE PROCEDIMIENTOS Y FUNCIONES} geométricas, fecha y hora, manipulación
FUNCION factorial (E valor: entero): entero de cadenas, conversión de tipos, etc.
VARIABLES
k,fac:entero
FUNCIÓN EN PE: grupo de sentencias de
INICIO
un programa que forman un bloque
fac1 separado e independiente. Este bloque
PARA k DESDE 1 HASTA valor HACER de sentencias, constituye una subtarea
facfac*k que realiza un conjunto determinado de
FIN_PARA operaciones sobre un grupo de
factorialfac argumentos dados y devuelve un único
FIN resultado.
{PROGRAMA PRINCIPAL}
INICIO
TIPO DE UNA FUNCIÓN: El tipo indicado en la
ESCRIBIR ‘Ingrese numero para calculo del factorial:’
cabecera de la definición califica el tipo de valor
LEER numero
devuelto por la función, el cual podrá ser entero, real,
factorfactorial(numero) lógico, carácter, cadena, etc.
ESCRIBIR ‘El factorial es:’ factor
FIN
El objetivo del algoritmo es calcular el factorial de un número
RETORNO AL MAIN DESDE UNA
ingresado por el usuario. Para modularizar el algoritmo, se define
FUNCIÓN: El retorno al programa que hizo
una función (llamada factorial) de tipo entero, que contiene las el llamado, tiene lugar cuando se ejecutara la
última sentencia del cuerpo de la función o
acciones necesarias para realizar el cálculo. cuando se encuentra con una instrucción
Esta función utiliza como retorne. El control pasa entonces al punto del
programa en cual tuvo lugar la llamada de la
ARGUMENTOS DE UNA FUNCIÓN: se argumento, un función, reemplazando el nombre por su
escriben entre paréntesis a continuación del
parámetro formal de tipo valor.
nombre y constituyen la información de
entrada o datos suministrados a la misma, los entero, llamado valor. En
cuales pueden ser constantes, variables o
expresiones. Tanto en la definición como en la el programa principal, la ASIGNACIÓN DEL VALOR DE UNA
invocación deben coincidir en número o FUNCIÓN: Dentro del cuerpo del programa
variable entera número de una función (desde INICIO hasta FIN), debe
cantidad, orden y tipos.
es pasado como existir por lo menos una sentencia de
asignación donde figure el nombre de la
parámetro actual y tiene función a la izquierda del signo igual, con lo
correspondencia, en cantidad, orden y número cuando se invoca la que asignaremos el valor a devolver por la
función.
función, con valor, el parámetro formal (factorfactorial(numero)).
El parámetro es pasado a la subrutina utilizando el Pasaje de
Parámetros por Valor (se trata de una copia del dato original), lo que se indica anteponiendo E al nombre del
argumento en la cabecera de declaración de la función. Nótese que la subrutina cuenta con una sección de
declaración de variables donde se definen las variables (k, fac) necesarias para la operación. Por último, el
resultado de la función se asigna a la variable factor (de tipo entero), que es visualizada en el programa principal.

Año 2018 Pág. 2


Programación Estructurada

Codificación en C
#include <stream.h>
#include <stdlib.h>

int factorial(int dato);

main()
{
int num,fact;
cout << "Ingrese valor para el
cálculo: ";
cin >> num;
fact=factorial(num);
cout << "Resultado: " << fact <<
endl;
system("pause");
}

int factorial(int dato)


{
int i,prod;
prod=1;
for(i=1;i<=dato;i=i+1)
prod=prod*i;
return prod;
}

Procedimientos
Un procedimiento está constituido por un bloque de sentencias similar PROCEDIMIENTO: Cuando un bloque de
a una función, pero tiene diferencias importantes en el modo del instrucciones se maneja como si fuera la
única instrucción, se ha creado un
llamado y en la información retornada. Mientras que, en el caso de
procedimiento. Este a su vez, puede
una función, se obtiene un único resultado y los parámetros constar de otros tantos bloques
representan solo datos que se suministran a la función, con un independientes.

procedimiento se pueden obtener tantos resultados como se desee


(uno, varios o ninguno) y sus parámetros cuando existan, podrán ser ARGUMENTOS DE UN PROCEDIMIENTO:
se escriben entre paréntesis a
unos datos y otros resultados.
continuación del nombre y constituyen la
Una segunda diferencia que se observa en el modo de llamado o información de entrada o salida. Tanto en
activado. Para una función su activado se realiza mediante el llamado la definición como en la invocación deben
coincidir en número o cantidad, orden y
desde una expresión, mientras que, para el caso de un procedimiento, tipos.
su llamado es una instrucción más y retorna la ejecución a la
inmediata siguiente. RETORNO AL MAIN DESDE UN
PROCEDIMIENTO: Luego de ser
ejecutado como una instrucción más,
retorna a la ejecución de la instrucción
inmediata siguiente.

Procedimientos. Ejemplos
Ejemplo 1: Analice el siguiente algoritmo y determine el valor de las variables a y b tras la ejecución de los
procedimientos pvalor y preferencia.
El programa prueba_parámetros ilustra el paso de parámetros por Valor y por Referencia.
Año 2018 Pág. 3
Programación Estructurada

PROGRAMA prueba_parámetros El procedimiento pvalor recibe parámetros


pasados por VALOR, es decir, trabaja con copias
VARIABLES de las variables del programa que realiza la
a, b: entero invocación. Las modificaciones realizadas sobre
las variables x e y (en el procedimiento) no alteran
PROCEDIMIENTO pvalor (E x: entero, E y: entero) los valores de las variables a y b (en el programa
INICIO principal).
x6 El procedimiento preferencia recibe parámetros
yx*2 pasados por REFERENCIA, es decir, trabaja
FIN directamente con las variables del programa que
lleva a cabo la invocación. Los cambios realizados
sobre las variables m y n (en el procedimiento)
PROCEDIMIENTO preferencia (E/S m: entero, E/S n: entero) modifican los valores de las variables a y b (en el
INICIO programa principal).
mn-1 En el programa se utilizan 2 procedimientos que
nm+n ilustran el paso de parámetros por VALOR y por
FIN REFERENCIA. Observe que los valores iniciales
de las variables a y b se visualizan antes de invocar
INICIO los procedimientos pvalor y preferencia. El
a7 procedimiento pvalor recibe parámetros por
b5 VALOR, es decir, que utiliza una copia de los datos
Escribir ‘Valores Originales’, a, b y cualquier modificación sobre ellos no afecta a los
ESCRIBIR ‘Pasando por Valor’ valores de las variables a y b.
pvalor(a,b) El procedimiento preferencia recibe parámetros
ESCRIBIR ‘La variable a vale:’, a pasados por REFERENCIA, lo que implica que
ESCRIBIR ‘La variable b vale:’, b cualquier cambio realizado sobre los datos dentro
ESCRIBIR ‘Pasando por Referencia’ del procedimiento modificará los valores de las
preferencia(a,b) variables a y b.
ESCRIBIR ‘La variable a vale:’, a
ESCRIBIR ‘La variable b vale:’, b
FIN
Ejemplo 2: Diseñe un algoritmo modular que permite intercambiar el contenido de 2 variables asignadas por el
usuario.
PROGRAMA intercambio_datos PASAJE DE PARÁMETROS POR VALOR: Esta es la
VARIABLES forma más sencilla de pasar parámetros, en el
primero, segundo: entero momento de efectuarse la llamada a la función, los
parámetros formales que son locales a la función,
PROCEDIMIENTO intercambio (E/S num1: entero, E/S num2: entero) reciben como valores iniciales, los valores de los
VARIABLES parámetros actuales y, con estos valores, comienza la
auxiliar: entero ejecución de las instrucciones descriptas en el cuerpo
INICIO de la función. Los parámetros actuales podrán ser en
auxiliarnum1 este caso tanto variables, constantes o expresiones.
num1num2
num2auxiliar
FIN
INICIO PASAJE DE PARÁMETROS POR REFERENCIA: En
ESCRIBIR ‘Ingrese primer número:’ lugar de pasar el valor del parámetro actual como valor
inicial para su respectivo parámetro formal, el pasaje
LEER primero
de parámetro por referencia, también llamado por
ESCRIBIR ‘Ingrese segundo número:’
dirección, establece una conexión directa entre ambos
LEER segundo
parámetros. Dicho de otro modo, el parámetro formal
intercambio(primero,segundo) utiliza la dirección de memoria del parámetro actual,
ESCRIBIR ‘VALORES CAMBIADOS’ de esta forma cualquier cambio que se efectúe en las
ESCRIBIR ‘Primero: ’, primero variables dentro del procedimiento alterarán los
ESCRIBIR ‘Segundo: ’, segundo correspondientes valores en el programa desde el que
FIN fue llamado. Solo podremos usar variables como
parámetros actuales y no valores constantes o
expresiones.

Año 2018 Pág. 4


Programación Estructurada

El programa permite intercambiar el valor de 2 variables inicialmente asignadas por el usuario. Para realizar este
intercambio se utiliza un procedimiento cuyos parámetros son pasados por referencia, lo que implica que el
módulo trabaja con los datos originales.

Ejemplo 3: Diseñe, en pseudocódigo, un algoritmo modular que calcule el área de un triángulo utilizando como
datos la base y altura de éste. VARIABLES GLOBALES: Las variables
PROGRAMA calculo_triangulo declaradas en un programa que
contenga funciones o procedimientos,
VARIABLES son válidas (están disponibles) en
{Declaración de las variables base, altura y area utilizadas en el programa} cualquier parte del programa, tanto
base, altura, area: real dentro de las funciones o
{Procedimiento Leer_datos: carga los valores de base y altura de un triángulo} procedimientos, como así fuera de ellos.
PROCEDIMIENTO Leer_datos(E/S b: real, E/S h: real)
INICIO
ESCRIBIR ‘Ingrese la base del triángulo:’ VARIABLES LOCALES: las variables
LEER b declaradas dentro de los
ESCRIBIR ‘Ingrese la altura del triángulo:’ procedimientos o funciones, son
LEER h variables locales o privadas de los
FIN mismos y solo están disponibles en su
{Función Calculo_area: calcula el área de un triángulo usando los valores de base y altura}
propio ámbito.
FUNCIÓN Calculo_area(E b:real, E h:real): real
INICIO
Calculo_areab * h / 2
FIN
{Programa Principal: llama al procedimiento Leer_datos y a la función Calculo_area}
INICIO
Leer_datos(base,altura)
areaCalculo_area(base,altura)
ESCRIBIR ‘El área calculada es:’, area
FIN

Las variables implicadas en un procedimiento o función pueden ser de uso exclusivo de este bloque, o
compartirse con el módulo que los llama. En el ejemplo las variables base, altura y área son globales, y las
variables b y h son locales.

El procedimiento leer_datos realiza la asignación interactiva de valores para la base y altura del triángulo. Los
parámetros utilizados en el procedimiento son pasados por referencia (E/S) ya que deben modificar el valor de
las variables del programa principal.
La función calculo_area, utilizando los datos de base y altura, determina la superficie de un triángulo. Esta función
emplea parámetros pasados por valor (E), debido a que sólo se necesita leerlos (sin modificarlos).
Recomendación, para asegurarse la flexibilidad de los módulos, cada una de las partes de que se compone de
ser autónoma y contener, por tanto, sus propias variables independientes. Las modificaciones sucesivas no
presentarán de esta forma problemas, ya que cada variable se usa solo en un módulo concreto.

Codificación en C
// PROGRAMA calculo_triangulo
#include <stream.h>
#include <stdlib.h>
void leer_datos(float &b,float &h);
float calculo_area(float b,float h);
// Principal: llama al procedimiento leer_datos y a la función calculo_area
main()
{ //Declaración de las variables base, altura y area utilizadas en el programa
float base, altura, area;

Año 2018 Pág. 5


Programación Estructurada

leer_datos(base,altura);
area=calculo_area(base,altura);
cout << "El area calculada es: " << area << endl;
system("pause");
}
// Procedimiento leer_datos: carga los // Función calculo_area: calcula el área
valores de base y altura de un triángulo de un triángulo con los datos de base y
altura
void leer_datos(float &b,float &h)
{ float calculo_area(float b,float h)
cout << "Ingrese la base:"; {
cin >> b; return(b * h / 2);
cout << "Ingrese la altura:"; }
cin >> h;
return;
}
Ejercicios a Resolver
2. Codifique la función PRIMO que determine si un valor ingresado por el usuario es primo o no. Suponga que
el valor de entrada es ingresado en el programa principal. Indique el pasaje de parámetros utilizado.
3. Codifique la función POTENCIA implementada mediante productos sucesivos. Suponga que la base y el
exponente son ingresados en el programa principal. Indique el pasaje de parámetros utilizado.
4. Considerando que la división entera entre 2 números enteros positivos puede realizarse mediante restas
sucesivas, codifique la función RESTO que calcule el módulo de la división entera entre 2 números
ingresados por el usuario. Considere que el dividendo y el divisor son ingresados en el programa principal.
Indique el pasaje de parámetros utilizado.
5. Codifique la función MAYUSCULA que determine si un carácter ingresado por el usuario es mayúscula o no.
Suponga que el carácter de entrada es ingresado en el programa principal. Indique el pasaje de parámetros
utilizado.
6. Codifique la función MINUSCULA que convierta una letra introducida por el usuario a su equivalente
mayúscula. Suponga que el carácter de entrada es ingresado en el programa principal. Indique el pasaje de
parámetros utilizado.
7. Codifique un algoritmo modular MOSTRAR_CADENA que visualice N veces una cadena introducida por el
usuario. Considere que la cadena y el número de veces que se visualizará se indican en el programa
principal. Indique el pasaje de parámetros utilizado.
8. Codifique el procedimiento MAX_MIN que visualice los valores impares comprendidos en el intervalo
[límite_inferior, límite_superior]. Considere que los valores límite_inferior y límite_superior se ingresan en el
programa principal. Considere que el ingreso de valores finaliza a petición del usuario. Indique el pasaje de
parámetros utilizado.
9. Analice los siguientes módulos.
a) Realice pruebas de escritorio.
b) Determine su objetivo.
c) Indique que tipo de datos retornan.
d) Codifique en C++, el programa principal y las invocaciones necesarias para la ejecución.
(1) (2) FIN_SI
FUNCIÓN fn (E x: entero, E FUNCIÓN enigma (E x: FIN_MIENTRAS
y: entero):? ENTERO): ENTERO enigmaZ
VARIABLES VARIABLES FIN
s:entero band: LOGICO
INICIO z1 (3)
s←0 INICIO PROCEDIMIENTO proc (E n:
MIENTRAS (y>0) bandx>=0 entero, E/S s: entero)
HACER MIENTRAS band HACER INICIO
y←y-1 SI (x=0) ENTONCES s←0
s←s+x bandFALSO MIENTRAS (n>0) ENTONCES
FIN_MIENTRAS SINO s←s + n mod 10
fn←s Z  Z * X n←n div 10
FIN x  x - 1 FIN_MIENTRAS
FIN

Año 2018  Pág. 6


ESCUELA DE MINAS “DR. HORACIO CARRILLO”

PROGRAMACIÓN ESTRUCTURADA
Trabajo Práctico Nº 6
Universidad
Nacional de Tema: Modularidad. Procedimientos y Funciones. Pasaje de Parámetros
Jujuy
Apellido y Nombre: Fecha: / /

Procedimientos. Ejemplos
Ejemplo 1:
Dada la siguiente expresión:
𝑡𝑜𝑡𝑎𝑙
𝑚𝑘 + 𝑛 × 𝑘

𝑘!
𝑘=1
Diseñe el procedimiento/función que realice el cálculo teniendo en cuenta las siguientes consideraciones:
a) Los productos se calculan utilizando la función producto (mediante sumas sucesivas) cuyo bucle de
cálculo esté controlado por BANDERA.
b) Las potencias se calculan utilizando la función potencia (mediante productos sucesivos) cuyo bucle de
cálculo esté controlado por CONTADOR.
c) Los cálculos de factorial se resuelven utilizando la función factorial, implementada con estructuras
MIENTRAS.
d) Diseñe un procedimiento de carga de datos que controle que los valores ingresados sean positivos.
Indique en cada caso el paso de parámetros utilizado.

Resolución
A fin de resolver el problema planteado es necesario identificar las entradas de datos, el objetivo del algoritmo
(programa) y las salidas o resultados a producir. Los valores m, n y total corresponden a los datos de entrada
que proporcionará el usuario. Con estos datos el programa debe calcular la productoria dada y presentar al
usuario el resultado del cálculo (un valor real).
La solución propuesta se plantea de forma modular, lo que permite simplificar la estructura del programa. El
ingreso de datos se implementa mediante un procedimiento que trabaja con parámetros por REFERENCIA (lo
que garantiza que el módulo modifica los datos). Luego, el cálculo de la productoria, que utiliza los valores m, n
y total, se realiza mediante una función. Esta función, a su vez, se vale de las funciones producto, potencia y
factorial para efectuar el cálculo:
▪ Función Producto: usa 2 parámetros enteros y mediante sumas sucesivas permite calcular el producto
de 2 números enteros.
▪ Función Potencia: usa 2 parámetros enteros y mediante productos sucesivos permite calcular la potencia
de un número entero elevado a otro.
▪ Función Factorial: usa 1 parámetro entero y mediante productos acumulados permite calcular el factorial
de 1 número entero.
Para realizar el cálculo, la función productoria ejecuta un bucle que acumula los términos generados en cada
iteración. Cada término se obtiene utilizando las funciones producto, potencia y factorial con los valores
correspondientes a la iteración actual. El resultado final se muestra en el programa principal.
A continuación se presenta el programa, codificado en C/C++, que resuelve el problema planteado.

Año 2018 Pág. 1


Programación Estructurada

#include<iostream>
#include<stdlib.h>
Using namespace std;

// Declaracion de funciones y procedimientos


void ingreso(int &num1,int &num2, int &num3);
int producto (int nro1, int nro2);
int potencia (int nro1, int nro2);
int factorial (int nro1);
float productoria(int m, int n, int total);

// Programa Principal
main()
{
int m,n,total; // Variables del programa principal
ingreso(m, n, total);//Invocación del procedimiento
cout<<"resultado productoria "<<productoria(m,n,total)<<endl;
//Invocación delafunción productoria
system("pause");
}
//Definición del procedimiento que permite el ingreso de datos
void ingreso(int&num1,int &num2, int&num3)
{
do
{
cout<<” Ingrese primer numero para m:”<<endl;
cin>> num1;
cout<<” Ingrese segundo numero para n:”<<endl;
cin>> num2;
cout<<” Ingrese tercer numero para total:”<<endl;
cin>> num3;
}while((num1<0)||(num2<0)||(num3<0));
}

//Definición de la función que calcula el producto por sumas sucesivas


int producto (int nro1, int nro2)
{
int p=0;
bool band=true;
do{
p=p+nro1;
nro2--;
if (nro2==0)
band=false;
}while(band==true);
return p;
}

//Definición de la función que calcula la potencia por productos


sucesivos
int potencia (int nro1, int nro2)
{
int pot=1, c=0;
while(c<nro2)
{
pot=pot*nro1;
c++;
}
return pot;
}
//Definición de la función que calcula el factorial por productos
sucesivos
int factorial (int nro1)
Año 2018 Pág. 2
Programación Estructurada

{
int f=1;
while (nro1>=1)
{
f=f*nro1;
nro1--;
}
return f;
}
//Definición de la función que calcula la productoria invocando las
funciones definidas previamente
float productoria(int m, int n, int total)
{
int i;
float prod=1;
for(i=1;i<=total;i++)
prod=prod*((potencia(m,i)+producto(n,i))/factorial(i));
return prod;
}
Ejemplo 2: Escriba un programa modular que presente un menú con las siguientes opciones: 1) Determinar el
factorial de un número ingresado por el usuario, 2) Calcular el cuadrado de un número ingresado por el usuario,
3) Determinar si el número ingresado por el usuario es primo y 4) Salir del Programa. Considere que cada opción
se implementa mediante procedimientos y/o funciones.

Resolución

Para resolver el problema planteado se propone desarrollar un programa que utilice un módulo para gestionar
las opciones. Este módulo debe presentar las opciones disponibles y registrar la elección del usuario de modo
que el programa principal ejecute las acciones correspondientes. Cada opción, a su vez, debe implementarse
mediante un módulo que calcule el factorial de un número (opción 1) o el cuadrado de un número (opción 2).
Para que las opciones se presenten continuamente al usuario, hasta que éste decida finalizar el programa, es
necesario que el módulo principal incluya un bucle. Dicho bucle debe comprender tanto la presentación de
opciones como la ejecución de las acciones seleccionadas. Para que el programa se ejecute correctamente es
necesario establecer en qué forma deben comunicarse los datos entre los distintos módulos (pasaje de
parámetros por VALOR o por REFERENCIA).

A continuación se muestra el código C/C++ del programa propuesto.

#include<iostream>
#include<stdlib.h>
Using namespace std;

// Declaracion de funciones y procedimientos


int calculo_factorial(int x);
int calculo_cuadrado (int x);
bool es_primo (int x);
void procedimiento_menu(int&opcion);

// Programa Principal
main()
{
int num;
int opc; // Variables del programa principal
do
{
Año 2018 Pág. 3
Programación Estructurada

system("cls");
cout<< "Ingrese numero:";
cin>>num;
procedimiento_menu(opc);
switch(opc)
{
case 1:
cout<< "RESULTADO del FACTORIAL de: "<<num<<"es "<<calculo_factorial(num)
<<endl;break;// Invocacion del modulo de calculo del factorial
case 2:
cout<< "RESULTADO del CUADRADO de: "<<num<<"es "<<calculo_cuadrado(num)
<<endl;break;// Invocacion del modulo de calculo del cuadrado
case 3: if (es_primo (num)==true)// Invocacion del modulo que determina si
un numero es primo
{
cout<< "EL NUMERO: "<<num<<"es PRIMO "<<endl;break;
}
else
{
cout<< "EL NUMERO: "<<num<<" NO es PRIMO "<<endl;break;
}
case 4:cout<< "Este programa fue realizado por primero de Info"
<<endl; break;
default:
cout<< "Lo sentimos....la opcion es invalida "<<endl;break;
}
system("pause");
}
while(opc!=4);
system("pause");
}

// Definicion de FUNCION para calcular el factorial


int calculo_factorial(int x)
{ int factorial,i; // Variables de la funcion (locales a la funcion)
factorial=1;
for(i=1;i<=x;i=i+1)
factorial=factorial*i;
return factorial;
}

// Definicion de FUNCION para calcular el cuadrado


int calculo_cuadrado (int x)
{
return x*x;
}
// Definicion de FUNCION para determinar si un número es Primo o No es Primo
bool es_primo (int x)
{
int i=2;
bool primo=false;
if ((x!=1)&&(x>=2)&&(x%2!=0))
{
primo=true;
while((primo==true)&&(i<=x/i))
{
if(x%i==0)
primo=false;
i++;
}
}
return primo;
}
Año 2018 Pág. 4
Programación Estructurada

// Definicion del procedimiento MENU


void procedimiento_menu(int&opcion)
{
cout<< "1: Calcular factorial"<<endl;
cout<< "2: Calcular cuadrado"<<endl;
cout<< "3: Determinar primo"<<endl;
cout<< "4: Salir"<<endl;
cin>>opcion;

Ejercicios a Resolver
10. Diseñe (pseudocódigo) un algoritmo modular que permita realizar el INTERCAMBIO de valores de dos
números ingresados por el usuario. El intercambio debe realizarse usando un subprograma. Indique el pasaje
de parámetros utilizado.

11. Diseñe (pseudocódigo) el procedimiento ORDENAR que ordene de forma creciente 3 valores (a, b, c)
ingresados por el usuario. Considere que la ordenación se realiza por intercambio de valores entre las
variables indicadas. Utilice el módulo de intercambio diseñado en el ítem 1. Indique el pasaje de parámetros
utilizado.

12. Diseñe un algoritmo modular que calcule el COCIENTE y RESTO de la división entera de 2 números
ingresados por el usuario. En su diseño utilice, únicamente, procedimientos. Considere
las posibles situaciones de error. Indique el paso de parámetros utilizado.

13. Diseñe un algoritmo modular PIRAMIDE, que permita con el uso de un menú: a)
ingresar altura, generatriz y radio, b) calcular la superficie y volumen del cono y c)
mostrar los resultados obtenidos. Indique el paso de parámetros utilizado.

14. Escriba un algoritmo modular CUADRATICA, que presente un menú con las siguientes opciones: 1) Ingresar
los coeficientes de una ecuación cuadrática, 2) Determinar las raíces de la ecuación cuadrática, 3) Ordenar
(ascendente) los coeficientes por intercambio y 4) Salir del Programa. Considere que cada opción se
implementa mediante módulos. Indique cómo se pasan los parámetros.

15. Dada la siguiente expresión:


𝑁

∑2∗ 𝑖 − 1
𝑖=1
a) Diseñe el procedimiento/función que realice el cálculo teniendo en cuenta las siguientes
consideraciones:

1. Los productos se calculan utilizando la función producto (mediante sumas sucesivas) cuyo
bucle se implemente con estructuras PARA.
2. Diseñe un procedimiento de carga de datos que controle que el valor de N sea positivo.
Indique en cada caso el paso de parámetros utilizado.

b) Realice la prueba de escritorio para N=4, y para N=3 determine el valor de la función en cada caso.

c) Indique el objetivo de la función.

∑𝑛 𝑖
16. Codifique un programa modular que resuelva la expresión:𝑎𝑛 = ∏𝑖=0
𝑛 𝑖 ; Si se ingresa el valor n=5, da por
𝑖=1
Año 2018 Pág. 5
Programación Estructurada

resultado 𝑎𝑛 = 𝑎5 = 0.125. El algoritmo debe presentar un menú con las siguientes opciones: 1) Ingresar en
la cadena programador nombre, apellido y curso del estudiante, 2) Ingresar la cantidad de términos (n) de la
sumatoria, 2) Calcular el valor de la expresión utilizando las funciones PRODUCTO y COCIENTE y 3) Salir,
que muestre el mensaje “FIN DE PROGRAMA” y los datos del programador, ingresados en la opción 1.
Implemente las opciones utilizando procedimientos/funciones e indique en cada caso el paso de parámetros
utilizados.

17. Dado el siguiente algoritmo:

PROGRAMA ejemplo1 a) Realice la prueba de escritorio para los


VARIABLES
num: ENTERO valores: num=4 y num=5
FUNCION incognita(E n:entero):?? b) Determine el objetivo del algoritmo.
VARIABLES
res,i: Entero
INICIO
res<-0
i<-1
MIENTRAS i<= n*2 HACER
res<-res+i
i<-i+2
FIN_MIENTRAS
incognita<-res
FIN
//Programa principal
INICIO
ESCRIBIR "Ingrese numero:"
LEER num
ESCRIBIR "Resultado: ",incognita(num)
FIN
18. Dada la siguiente función:
FUNCIÓN misterio (E a:entero):?? a) Realice la prueba de escritorio para los
VARIABLES
valores: a=4 y a=5
t: ENTERO
bandera: LÓGICO b) Determine el objetivo del algoritmo.
INICIO
bandera<-VERDADERO
t<-1
MIENTRAS bandera=VERDADERO HACER
SI a=0 o a=1 ENTONCES
t<-1
bandera<-FALSO
SINO
t<-t*a
a<-a-1
SI a < 2 ENTONCES
bandera<-FALSO
FIN_SI
FIN_SI
FIN_MIENTRAS
FIN


Año 2018 Pág. 6


ESCUELA DE MINAS “DR. HORACIO CARRILLO”

PROGRAMACIÓN ESTRUCTURADA
Trabajo Práctico N º 7
Universidad
Nacional de
Tema: Recursividad
Jujuy
Apellido y Nombre: Fecha: / /

Conceptos Teóricos
RECURSIVIDAD
La recursividad consiste en realizar una definición de un concepto en términos del propio concepto que
se está definiendo. Para que una definición recursiva sea válida, la referencia a sí misma debe ser relativamente
más sencilla que el caso considerado.
Una definición recursiva indica cómo obtener nuevos conceptos a partir del concepto que se intenta
definir. Esto es, la recursividad expresa un concepto complejo en función de las formas más simples del mismo
concepto.
Un razonamiento recursivo tiene dos partes:
• caso base y
• regla recursiva de construcción
El caso base no es recursivo y es el punto tanto de partida como de terminación de la definición.
La regla recursiva de construcción intenta resolver una versión más simple (pequeña) del problema
original.
Por lo tanto, para resolver problemas en forma recursiva debe considerarse:
1. la división sucesiva del problema original en uno o varios problemas más pequeños, del mismo tipo que
el inicial;
2. la resolución de los problemas más sencillos, y
3. la construcción de las soluciones de los problemas complejos a partir de las soluciones de los problemas
más sencillos.
Teniendo en cuenta todo esto, un algoritmo recursivo se caracteriza por:
1. el algoritmo debe contener una llamada a sí mismo,
2. el problema planteado puede resolverse atacando el mismo problema pero de tamaño menor,
3. la reducción del tamaño del problema eventualmente permite alcanzar el caso base, que puede
resolverse directamente sin necesidad de otro llamado recursivo.
En resumen, un algoritmo recursivo consta de una parte recursiva, otra iterativa o no recursiva y una
condición de terminación. La parte recursiva y la condición de terminación siempre existen. En cambio la parte
no recursiva puede coincidir con la condición de terminación. Es importante destacar que siempre debe
alcanzarse el caso base, si esto no se cumple el algoritmo nunca se finalizará.

Ventajas e inconvenientes
La principal ventaja es la simplicidad de comprensión y su gran potencia, favoreciendo la resolución de
problemas de manera natural, sencilla y elegante; y facilidad para comprobar y convencerse de que la solución
del problema es correcta.
Los algoritmos que por naturaleza son recursivos y donde la solución iterativa es complicada y debe
manejarse explícitamente una pila para emular las llamadas recursivas, deben resolverse por métodos
recursivos.
En general, las soluciones recursivas son menos eficientes que las iterativas (coste mayor en tiempo y

Año 2018 Pág. 1


Programación Estructurada

memoria). Tenga en cuenta que por cada invocación se crea una copia en memoria del programa recursivo con
los parámetros indicados en el llamado.
Cuando haya una solución obvia al problema por iteración, debe evitarse la recursividad.

Tipos de Recursividad
La recursividad puede ser de 2 tipos:
• Recursividad Directa (simple): un algoritmo se invoca a sí mismo una o más veces directamente.
• Recursividad Indirecta (mutua): un algoritmo A invoca a otro algoritmo B y éste a su vez invoca al
algoritmo A.
Problemas resueltos mediante recursividad
Un ejemplo clásico de un problema que se resuelve utilizando recursividad es el cálculo del factorial de
un número. Suponga que se calcula el factorial de 5, éste es:
5! = 120
Esto puede expresarse también como:
Problema Descomposición del Problema
5! = 5 * 4! Factorial de 5 (Original)
4! = 4 * 3! Factorial de 4
3!= 3 * 2! Factorial de 3
2! = 2 * 1! Factorial de 2
1! = 1 * 0! Factorial de 1
0! = 1 Solución Directa Factorial de 0 = 1

Como puede observarse este problema se expresa en términos cada vez más simples hasta que se
alcanza el caso base, donde la solución más simple se obtiene directamente (por definición se sabe que el
factorial de 0 es 1). A partir del caso base pueden obtenerse las soluciones para los problemas más complejos.
Funcion Factorial(E n: entero):entero
INICIO
SI n=0 ENTONCES
Factorial=1;
SINO
Factorial= n*Factorial(Factorial(n-1));
FINSI
FIN

Año 2018 Pág. 2


Programación Estructurada

Procedimientos y Funciones Recursivos


Un procedimiento P que contiene una sentencia de llamada a sí mismo, se dice que es un procedimiento
recursivo. Un procedimiento recursivo debe cumplir con lo siguiente:
1. incluye un cierto criterio, llamado caso base, por el que el procedimiento no se llama a sí mismo.
2. cada vez que el procedimiento se llame a sí mismo (directa o indirectamente), debe estar más cerca del
caso base.
Un procedimiento recursivo con estas dos propiedades se dice que está bien definido.
De igual modo, una función es recursiva si su definición contiene una invocación a sí misma. Una función
recursiva debe cumplir con lo siguiente:
1. debe haber ciertos argumentos, llamados valores base, para los que la función no se refiera a sí misma.
2. cada vez que la función se refiera a sí misma, el argumento de la función debe acercarse más al valor
base.
Una función recursiva con estas dos propiedades se dice que está bien definida.

Ejemplos
Los siguientes ejemplos ilustran procedimientos y funciones recursivos.
El procedimiento Mostrar_Numeros visualiza, en orden creciente, valores enteros entre 1 y cantidad. Por
ejemplo, si se invoca a Mostrar_Numeros con el parámetro cantidad igual a 5, el algoritmo se comporta como
sigue:
PROCEDIMIENTO Mostrar_Numeros(E cantidad: entero)
INICIO
SI cantidad=1 ENTONCES
ESCRIBIR cantidad
SINO
Mostrar_Numeros(cantidad-1)
ESCRIBIR cantidad
FINSI
FIN
1. Se invoca al procedimiento con el parámetro cantidad igual a 5, se evalúa la condición (cantidad=1) y
como ésta no se cumple, se invoca a Mostrar_Numeros con parámetro cantidad igual a 4. Tenga en
cuenta que la acción ESCRIBIR cantidad (con valor 5 en este caso) no se realizará hasta que finalice la
ejecución del nuevo llamado al procedimiento.
Parámetro Condición
Acción
cantidad (cantidad=1)
5 FALSO Invocar Mostrar_Numeros(4)
Escribir cantidad = 5

2. Mostrar_Numeros, ahora con parámetro cantidad igual a 4, comprueba la condición (cantidad=1). Al


evaluar dicha condición se determina que es FALSA, y por lo tanto se realiza el llamado al procedimiento
Mostrar_Numeros con parámetro cantidad igual a 3. Esto se repite en tanto no se cumpla que cantidad
sea igual a 1. Las acciones ESCRIBIR cantidad con valores 4, 3 y 2 no se llevan a cabo hasta que finalice
la ejecución de las invocaciones realizadas.
Parámetro Condición
Acción
cantidad (cantidad=1)
4 FALSO Invocar Mostrar_Numeros(3)
Escribir cantidad = 4

Parámetro Condición
Acción
cantidad (cantidad=1)

Año 2018 Pág. 3


Programación Estructurada

3 FALSO Invocar Mostrar_Numeros(2)


Escribir cantidad = 3

Parámetro Condición
Acción
cantidad (cantidad=1)
2 FALSO Invocar Mostrar_Numeros(1)
Escribir cantidad = 2

3. Finalmente, cuando se invoca a Mostrar_Numeros con parámetro cantidad igual a 1, se verifica la


condición (cantidad=1) que finaliza la recursión (no se realizan más llamados al procedimiento) y se
ejecuta la sentencia ESCRIBIR cantidad (con valor 1). Al terminar la ejecución de este llamado, se realiza
la instrucción ESCRIBIR cantidad del procedimiento Mostrar_Numeros que tiene parámetro cantidad
igual a 2, al finalizar éste se ejecutan las instrucciones ESCRIBIR de todos los llamados anteriores.
Parámetro Condición
Acción
cantidad (cantidad=1)
1 VERDADERO Escribir cantidad = 1

Nótese que el procedimiento ejemplificado contiene las 2 partes indicadas para los algoritmos recursivos,
una que realiza el llamado al mismo procedimiento y otra que finaliza la recursión (condición cantidad=1).

La función Potencia calcula el resultado de elevar un número entero a al exponente entero b, mediante
productos sucesivos. Por ejemplo, si se invoca a Potencia con los parámetros a igual a 3 y b igual a 4, el algoritmo
se comporta como sigue:
FUNCIÓN Potencia(E a:entero, E b:entero): entero
INICIO
SI b=1 ENTONCES
Potenciaa
SINO
Potenciaa * Potencia(a,b-1)
FINSI
FIN
1. Al ejecutarse la función Potencia con los parámetros a=3 y b=4 se evalúa la condición (b=1) indicada en
el algoritmo. Dicha condición resulta FALSA, por lo que se realiza Potenciaa*Potencia(a,b-1), sentencia
que invoca a Potencia con los parámetros a=3 y b=3. Tenga en cuenta el valor final de la función no se
obtiene hasta que todos los llamados recursivos finalicen su ejecución.
Parámetro a Parámetro b Condición (b=1) Acción
3 4 FALSO Potencia<-3 * Potencia(3,3)
Potencia = 81

2. Potencia, con parámetros a=3 y b=3, comprueba la condición (b=1) del algoritmo. Al evaluar dicha
condición se determina que es FALSA, y por lo tanto se realiza el llamado a la función Potencia con
parámetros a=3 y b=2. Esto se repite en tanto no se cumpla que el parámetro b sea igual a 1. El valor de
la función para cada llamado no se calcula hasta que finalice la ejecución de las invocaciones realizadas.
Parámetro a Parámetro b Condición (b=1) Acción
3 3 FALSO Potencia<-3 * Potencia(3,2)
Potencia = 27

Parámetro a Parámetro b Condición (b=1) Acción


3 2 FALSO Potencia<-3 * Potencia(3,1)
Potencia = 9

3. Finalmente, cuando se llama a Potencia con parámetros a=3 y b=1, se verifica la condición (b=1) que
finaliza la recursión (no se realizan más llamados a la función) y se ejecuta la sentencia Potenciaa,

Año 2018 Pág. 4


Programación Estructurada

que asigna a la función el valor 3. Al terminar la ejecución de este llamado, se calcula el valor de la
función Potencia con los parámetros a=3 y b=2 cuyo resultado es 9. Al finalizar ésta se calcula el valor
de la función para todos los llamados anteriores.
Parámetro a Parámetro b Condición (b=1) Acción
3 1 VERDADERO Potencia=3

Nótese que el función ejemplificada contiene las 2 partes indicadas para los algoritmos recursivos, una
que realiza el llamado a la misma función y otra que finaliza la recursión (condición b=1).
Ejercicios a Resolver
19. Codifique el siguiente programa y analice el comportamiento del módulo recursivo
#include <iostream>
#include <stdlib.h>
using namespace std;
void recursivo(int tamanio);
main()
{
int tam_problema;
cout << "Ingrese tamaño del problema: ";
cin >> tam_problema;
fflush(stdin);
recursivo(tam_problema);
system("pause");
}
void recursivo(int tamanio)
{
if (tamanio==1)
{
cout << endl << "CASO BASE - Tamaño: " << tamanio << " - SOLUCION DIRECTA";
getchar();
}
else
{
cout << endl << "Reducción del problema a:" << tamanio-1;
getchar();
recursivo(tamanio-1);
cout << endl << "Resolución del problema de tamaño: " << tamanio;
getchar();
}
}
20. Compare los siguientes módulos recursivos y determine
a) ¿cuál es el objetivo de estos módulos?
b) ¿para qué sirve la variable p del módulo engima?
void enigma(int m, int n, int &p)
int incognita(int a, int b) {
{ if (n==0)
if (b==0) p=1;
return 1; else
else { enigma(m,n-1,p);
return a * ncognita(a,b-1); p=p * m;
} }
}
21. Diseñe una función recursiva que calcule el factorial de un número M. ¿Puede plantearse una solución
recursiva utilizando un procedimiento recursivo? Diseñe el módulo correspondiente.
22. Diseñe un procedimiento/función recursivo que calcule la cantidad de dígitos de un número entero. Por
ejemplo, dado el valor 364, el módulo obtendrá el valor 3.
23. Diseñe un procedimiento/función recursivo que calcule el producto de dos números enteros (utilice el
concepto de sumas sucesivas).
24. Diseñe un procedimiento/función recursivo que calcule el cociente de la división entera de dos números
enteros (utilice el concepto de restas sucesivas).

Año 2018 Pág. 5


Programación Estructurada

25. Diseñe los procedimientos/funciones recursivos que calculen las siguientes expresiones:

26. Diseñe un procedimiento/función recursivo que calcule el MCD (Máximo Común Divisor) de 2 números
enteros positivos. Para ello utilice el método de Euclides. Dicho método contempla los siguientes pasos:
a) Dividir el número mayor (X) por el menor (Y). Si el resto de la división es cero, el número Y es el
máximo común divisor.
b) Si la división no es exacta, se divide el número menor (Y) por el resto de la división anterior.
c) Se siguen los pasos anteriores hasta obtener un resto cero. El último divisor es el MCD buscado.
27. La siguiente secuencia de números es conocida como Serie de Fibonacci:
1, 1, 2, 3, 5, 8, 13, 21, … , m, n, (m+n), …
Cada término de la serie, a excepción del primer y segundo término (cuyo valor es 1), se calcula sumando
el valor de los 2 términos precedentes. Por ejemplo, el 6º término de la serie (cuyo valor es 8) se obtiene de
sumar los términos 4º (cuyo valor es 3) y 5º (cuyo valor es 5). Diseñe un procedimiento/función recursiva
que calcule un término cualquiera de la serie.
28. El cuadrado de un número Q puede calcularse como la suma de los Q primeros números impares. Diseñe
un procedimiento/función recursivo que calcule el cuadrado de un entero positivo Q basándose en esta
propiedad. Tenga en cuenta que el Q-ésimo número impar se puede obtener como 2 * Q – 1.
Q Q-ésimo impar Q2
1 2*1–1=1 1
2 2*2–1=3 3+1=4
3 2*3–1=5 5+3+1=9
4 2*4–1=7 7+5+3+1=16
5 2*5–1=9 9+7+5+3+1=25
29. Realice la prueba de escritorio del siguiente módulo recursivo (n=2018) y determine su propósito.
FUNCIÓN incognita(E n:ENTERO):ENTERO
INICIO
SI (n=0) ENTONCES
incognita<-0
SINO
incognita<-n % 10 + incognita(n / 10)
FIN_SI
FIN
30. Realice la prueba de escritorio del siguiente módulo recursivo (x=13, y=3), (x=25, y=5), y determine su
propósito. Además indique cómo se realiza el llamado de este procedimiento desde el programa principal.
PROCEDIMIENTO incognita(E x: ENTERO, E y: ENTERO, E/S a: ENTERO, E/S b: ENTERO)
INICIO
SI(x < y) ENTONCES
a<-x
b<-0
SINO
incognita(x-y, y, a, b)
b=b+1;
FIN_SI
FIN




Año 2018 Pág. 6


ESCUELA DE MINAS “DR. HORACIO CARRILLO”

PROGRAMACIÓN ESTRUCTURADA
Trabajo Práctico N° 8
Universidad
Nacional de
Tema: Tema: Arreglos. Operaciónes básicas.
Jujuy Apellido y Nombre: Fecha: / /

Conceptos Teóricos
Un arreglo es un conjunto de elementos del mismo tipo de dato que comparten un nombre común;
podemos decir que se asemeja a una variable que puede almacenar más de un valor al mismo tiempo. Un
arreglo es un conjunto finito de elementos del mismo tipo cuyo acceso se realiza a través de índices. Desde el
punto de vista del programa un arreglo se define como una zona de almacenamiento contiguo (posiciones de
memoria consecutivas) que contiene una serie de elementos, todos del mismo tipo (enteros, reales, lógicos,
etc.) que pueden ser procesados individualmente o en conjunto.
Los siguientes arreglos, Vector_1 y Vector_2, son unidimensionales, comúnmente denominados
vectores, cuentan con espacio de almacenamiento suficiente para guardar 8 datos del tipo numérico y
alfanumérico respectivamente.
Un vector de tipo numérico con una dimensión de 8 espacios es:
33 18 3 65 94 4 7 12
Vector_1
0 1 2 3 4 5 6 7

Un vector de tipo alfanumérico con una dimensión de 8 espacios es:

Vector_2 ‘a’ ‘*1’ ‘hola’ ‘un@’ ‘94’ ‘sol’ ‘abc’ ‘<’


0 1 2 3 4 5 6 7

Índices de Vectores
Los índices permiten referenciar directamente posiciones específicas de un vector. Los índices pueden
ser valores constantes ordinales (por ejemplo, Vector_1[5]), variables ordinales (por ejemplo, Vector_1[i])
o expresiones de tipo ordinal (por ejemplo, Vector_1[i+2])

Rango
El número de elementos de un vector se conoce como Rango del Vector. Este se determina mediante
la siguiente expresión: Rango de Vector=LS – LI +1
Límite inferior (LI): valor mínimo permitido para el índice
Límite superior (LS): el valor máximo permitido para el índice.
Por ejemplo, podría definirse un arreglo cuyos índices estuvieran entre 1 y 50, donde LI=1 y LS=50.
Entonces Rango de Vector=LS – LI +1, Rango de Vector=50 – 1 +1, Rango de Vector=50.
Lectura y Escritura
Para acceder a un elemento específico del arreglo valores, se indica el nombre del arreglo y el índice
que especifica su posición. Por ejemplo, si deseamos saber en el Vector_1, el valor 2, y en el Vector_2, el
valor 5, hacemos lo siguiente:
Escribir Vector_1 [2] //nos mostrará el valor 3
Escribir Vector_2 [i] //con i=5, entonces, nos mostrará el valor ‘sol’
La asignación de valores a los elementos de un vector se realiza indicando el espacio de orden con el
operador asignación  para asignar el valor, de igual manera que con las variables simples. Es posible realizar

Año 2018 Pág. 1


Programación Estructurada

la carga de vectores con datos mediante estructuras de control repetitivas. Por ejemplo, si deseamos realizar
la carga de valores a un vector, en pseudocódigo y en c++:
PROGRAMA vectores #include <iostream.h>
CONSTANTES using namespace std;
MAX_ELEMENTOS=10
TIPOS const int Max_Elem=5;
tipo_vector=ARREGLO [1..MAX_ELEMENTOS] de caracter typedef char tipo_vector [Max_Elem];
VARIABLES
num: tipo_vector main ()
i:entero {
INICIO tipo_vector num;
Para i desde 1 hasta Max_Elem hacer int i;
Escribir "Ingrese un caracter"; for(i=0;i<=Max_Elem-1;i++)
Leer num(i); {
Fin Para cout<<"Ingrese un caracter"<<endl;
Para i desde 1 hasta Max_Elem hacer cin>>num[i];
Escribir num(i); }
Fin Para for(i=0;i<=Max_Elem-1;i++)
FIN cout<<num[i]<<endl;
system("pause");
}

Arreglos Bidimensionales o Matrices


Las matrices son estructuras que contienen datos homogéneos, es decir, del mismo tipo. Así como
antes utilizamos un indicador o índice para posicionarnos y almacenar algún valor, en el caso de las matrices,
utilizaremos dos índices que determinarán la posición de fila y columna. Las matrices se representan mediante
tablas con dimensión M x N, en donde M es el número de filas, y N, el número de columnas.

1 2 3 4
Matriz_1 1 2 3 4 Matriz_2
1 A O S O
1 4 7 5 9
2 B M L M
2 3 1 4 2
3 M L V X
3 5 8 3 1
4 G P H C
4 9 4 7 2
5 D C J W
Matriz_1: Una matriz de tipo numérico con una dimensión de 4 x 4.
Matriz_2: Una matriz de tipo caracter con una dimensión de 5 x 4.
Si la matriz tiene igual número de filas que de columnas se dice que se trata de una matriz cuadrada.
En las matrices cuadradas los elementos que ocupan las posiciones donde los índices de fila y columna son
iguales reciben el nombre de diagonal principal. Por ejemplo, en la Matriz_1 los elementos de la diagonal
principal son: 4, 1, 3, 2.

Índices de Matrices
Los índices permiten referenciar directamente posiciones específicas de los elementos de una matriz.
Los índices pueden ser valores constantes ordinales (por ejemplo, Matriz_1[1,1]), variables ordinales (por
ejemplo, Matriz_1[i,j]) o expresiones de tipo ordinal (por ejemplo, Matriz_1[i+2,j])

Rango
El número de elementos de una matriz se conoce como Rango de la Matriz. Este se determina
mediante la siguiente expresión:
Rango de la matriz=(LSF-LIF+1)*(LSC-LIC+1)
LSF: límite superior del índice de filas
LIF: límite inferior del índice de filas
LSC: límite superior del índice de columnas
LIC: límite inferior del índice de columnas
Por ejemplo, el rango para Matriz_1, Rango de Matriz_1 =(LSF-LIF+1)*(LSC-LIC+1), entonces

Año 2018 Pág. 2


Programación Estructurada

Rango de Matriz_1 =(4-1+1)*(4-1+1)=16

Lectura y Escritura
Para acceder a un elemento específico de una matriz, se indica el nombre de la matriz y los índices que
especifican una posición. Por ejemplo, si deseamos saber en Matriz_1, el valor que se encuentra en la fila 2,
columna 3, y en la Matriz_2, el valor que se encuentra en la fila 5, columna 1, hacemos lo siguiente:
Escribir Matriz_1 [2,3] //nos mostrará el valor 4
Escribir Matriz_2 [i,j] //con i=5 y j=1 entonces, nos mostrará el valor ‘D’
La asignación de valores a los elementos de una matriz se realiza indicando el espacio de orden con el
operador asignación  para asignar el valor, de igual manera que con las variables simples. Es posible realizar
la carga de matrices con datos mediante estructuras de control repetitivas. Por ejemplo, si deseamos realizar
la carga de valores a la Matriz_1, en pseudocódigo y en c++:
PROGRAMA Matriz_1 #include <iostream.h>
CONSTANTES using namespace std;
FILAS=4
COLUMNAS=4 const int FILAS=4, COLUMNAS=4;
TIPOS typedef char tipo_matriz [FILAS][COLUMNAS];
tipo_matriz=ARREGLO[1..FILAS, 1..COLUMNAS] de entero
VARIABLES main ()
num: tipo_matriz {
i,j:entero tipo_matriz num;
INICIO int i,j;
Para i desde 1 hasta FILAS hacer for(i=0;i<=FILAS-1;i++)
Para j desde 1 hasta COLUMNAS hacer for(j=0;j<=COLUMNAS-1;j++)
Escribir "Ingrese un caracter"; {
Leer num(i,j); cout<<"Ingrese un caracter"<<endl;
Fin Para cin>>num[i][j];
Fin Para }
Para i desde 1 hasta FILAS hacer for(i=0;i<=FILAS-1;i++)
Para j desde 1 hasta COLUMNAS hacer for(j=0;j<=COLUMNAS-1;j++)
Escribir num(i,j); cout<<num[i][j]<<endl;
Fin Para system("pause");
Fin Para }
FIN

Arreglos Multidimensionales
Un arreglo multidimensional, puede definirse de tres, cuatro o hasta N dimensiones. De acuerdo a la
cantidad de dimensiones será necesario especificar la cantidad de índices para acceder a los elementos
individuales del arreglo. Por ejemplo, si el arreglo tiene 3 dimensiones, requiere de 3 índices; si el arreglo tiene
4 dimensiones, requiere de 4 índices; y si el arreglo tiene n dimensiones, entonces
requiere de n índices.
Multi
Índices de Arreglos Multidimensionales
Los índices permiten referenciar directamente posiciones específicas de los
elementos de un arreglo multidimensional.
Considerando un arreglo de 3 dimensiones de tipo entero denominado Multi
de 4x5x30, para acceder al elemento ubicado en la posición 1,3,10 se debe
especificar: Multi[1,3,10].
Los índices pueden ser valores constantes ordinales (por ejemplo,
Multi[1,5,10]), variables ordinales (por ejemplo, Multi[i,j,k]) o expresiones de tipo
ordinal (por ejemplo, Multi[3+2,j-3,5])

Año 2018 Pág. 3


Programación Estructurada

Rango
El número de elementos de arreglo multidimensional se determina mediante la siguiente expresión:
Rango del arreglo multidimensional=(LS1-LI1+1)*(LS2-LI2+1)* …*(LSn-LIn+1)

LS1: límite superior del índice de la dimensión 1.


LI1: límite inferior del índice de la dimensión 1.
LS2: límite superior del índice de la dimensión 2.
LI2: límite inferior del índice de la dimensión 2.

LSn: límite superior del índice de la dimensión n.
LIn: límite inferior del índice de la dimensión n.

Por ejemplo, el rango para Multi, Rango de Multi =(LS1-LI1+1)*(LS2-LI2+1)* (LS3-LI3+1), entonces
Rango de Multi =(4-1+1)*(5-1+1)* (30-1+1)=600
Ejemplo: realizar la carga de valores a Multi, en pseudocódigo y en c++:
PROGRAMA Multidimensional #include <iostream.h>
CONSTANTES using namespace std;
D1=4
D2=5 const int D1=4, D2=5, D3=30;
D3=30 typedef char tipo_multi [D1][D2][D3];
TIPOS
tipo_multi=ARREGLO [1..D1, 1..D2, 1..D3] de entero main ()
VARIABLES {
num: tipo_multi tipo_multi num;
i,j,k:entero int i,j,k;
INICIO for(i=0;i<=D1-1;i++)
Para i desde 1 hasta D1 hacer for(j=0;j<=D2-1;j++)
Para j desde 1 hasta D2 hacer for(k=0;k<=D3-1;k++)
Para k desde 1 hasta D3 hacer {
Escribir "Ingrese un caracter"; cout<<"Ingrese un caracter"<<endl;
Leer num(i,j,k); cin>>num[i][j][k];
Fin Para }
Fin Para for(i=0;i<=D1-1;i++)
Fin Para for(j=0;j<=D2-1;j++)
Para i desde 1 hasta D1 hacer for(k=0;k<=D3-1;k++)
Para j desde 1 hasta D2 hacer {
Para k desde 1 hasta D3 hacer cout<<num[i][j][k]<<endl;
Escribir num(i,j,k); }
Fin Para system("pause");
Fin Para }
Fin Para
FIN

Operaciones sobre Arreglos mediante Modularidad


Sobre los arreglos pueden realizarse las siguientes operaciones:
• Asignación
• Lectura/Escritura
• Recorrido (acceso secuencial)
• Actualización (agregar, insertar y borrar)
• Búsqueda
• Ordenación
Para simplificar la repetición de estos procesos los resolveremos aplicando la programación modular,
realizando procesos más pequeños, mediante procedimientos y funciones. Esto implica que el problema original
será resuelto por medio de varios módulos, cada uno de los cuales se encargará de solucionar alguna parte
determinada.

Año 2018 Pág. 4


Programación Estructurada

Ejemplos
Ejemplo 1: Dado un vector de valores enteros de tamaño 20, diseñe un programa modular (los procedimientos
y funciones necesarios) que permita cargar elementos en el vector y mostrar los valores almacenados.
programa vectores
constantes
MAX =20
tipos
vector=arreglo [1..MAX] de enteros
variables
num:vector
opción, ocupado:entero

procedimento agregar (E/S x:vector,E/S ocup:entero)


var
i:entero
inicio
si ocup=MAX entonces
escribir ‘Vector Completo’
sino
ocup<-ocup+1
escribir ‘Ingrese valor:’
leer x[ocup]
fin_si
fin

procedimiento mostrar (E z:vector, E ocup:entero)


var
i:entero
inicio
para i desde 1 hasta ocup hacer
escribir z[i]
fin_para
fin

inicio
ocupado<-0
repetir
escribir ‘1-cargar vector‘
escribir ‘2-mostrar vector‘
escribir ‘3-salir‘
escribir ‘ingrese opcion:’
leer opcion
según opcion hacer
1: agregar(num,ocupado)
2: mostrar(num,ocupado)
3: escribir ‘fin del programa…’
de otro modo: escribir ‘opcion incorrecta’
fin_segun
hasta_que opcion=3
fin

Ejemplo 2: Considerando una matriz 3X3 (matriz cuadrada) de valores enteros, diseñe un programa (y los
procedimientos y funciones necesarios) que permita cargar la matriz, calcular la suma de su diagonal principal
y mostrar los elementos de la matriz.
programa matrices

constantes
FILAS=3, COLUMNAS=3

tipos
matriz=arreglo [1.. FILAS,1.. COLUMNAS] de enteros

variables
numeros: matriz
opcion:entero

procedimiento cargar_matriz (E/S num:matriz)

Año 2018 Pág. 5


Programación Estructurada

var
i,j:entero
inicio
para i desde 1 hasta FILAS hacer
para j desde 1 hasta COLUMNAS hacer
escribir ‘ingrese elemento [’,i,’,’,j,’]:’
leer num[i,j]
Fin_para
Fin_para
fin

funcion diag_matriz (E num:matriz):entero


var
i,j,suma:entero
inicio
suma<-0
para i desde 1 hasta FILAS hacer
para j desde 1 hasta COLUMNAS hacer
si i=j entonces
suma<-suma+num[i,j]
fin_si
Fin_para
Fin_para
diag_matriz<-suma
fin

procedimiento mostrar_matriz (E num:matriz)


var
i,j:entero
inicio
escribir ‘valores almacenados en la matriz’
para i desde 1 hasta FILAS hacer
para j desde 1 hasta COLUMNAS hacer
escribir ‘dato[‘,i,’,’,j,’]:’,num[i,j]
Fin_para
Fin_para
fin

inicio
repetir
escribir ‘1-cargar matriz’
escribir ‘2-suma de la diagonal principal’
escribir ‘3-mostrar valores de la matriz’
escribir ‘4-salir’
escribir ‘ingrese opcion:’
leer opcion
según opcion hacer
1: escribir ‘cargar matriz’
cargar_matriz(numeros)
2: escribir ‘suma de la diag. principal’
escribir ‘suma=’,diag_matriz(numeros)
3: mostrar_matriz(numeros)
4: escribir ‘programa finalizado’
de otro modo: escribir ‘opcion incorrecta’
fin_segun
hasta_que opcion=4
fin

Ejemplo 3: Considerando un arreglo 3x2x6 (tridimensional) de caracteres, diseñe un programa (y los


procedimientos y funciones necesarios) que permita cargar el arreglo, contar las veces que aparece una letra
indicada por el usuario y mostrar los elementos del arreglo.
programa tridimensional

constantes
D1=3, D2=2, D3=6

tipos
tridim=arreglo [1.. D1,1..D2,1..D3] de carácter
var
alfab:tridim

Año 2018 Pág. 6


Programación Estructurada

letra:carácter
opcion:entero
procedimiento cargar_arreglo(E/S alfa:tridim)
var
i,j,k:entero
inicio
para i desde 1 hasta D1 hacer
para j desde 1 hasta D2 hacer
para k desde 1 hasta D3 hacer
escribir ‘ingrese elemento:’
leer alfa[i,j,k]
fin_para
fin_para
fin_para
fin
funcion contarletra(E alfa:tridim,E let:caracter):entero
var
i,j,k,contar:entero
inicio
contar<-0
para i desde 1 hasta D1 hacer
para j desde 1 hasta D2 hacer
para k desde 1 hasta D3 hacer
si let=alfa[i,j,k] entonces
contar<-contar+1
fin_si
fin_para
fin_para
fin_para
fin
procedimiento mostrar_arreglo(E alfa:tridim)
var
i,j,k:entero
inicio
escribir ‘valores almacenados en el arreglo’
para i desde 1 hasta D1 hacer
para j desde 1 hasta D2 hacer
para k desde 1 hasta D3 hacer
escribir ‘letra:’,alfa[i,j,k]
fin_para
fin_para
fin_para
fin
procedimiento menu (E/S opcion: entero)
inicio
escribir ‘1-cargar arreglo
escribir ‘2-contar letra’
escribir ‘3-mostrar valores del arreglo’
escribir ‘4-salir’
escribir ‘ingrese opcion:’
leer opcion
fin
inicio
repetir
menu(opcion)
según opcion hacer
1: escribir ‘cargar arreglo
cargar_arreglo(alfab)
2: escribir ‘ingrese letra a contar:’
leer letra
escribir ‘contadas:’,contarletra(alfab,letra)
3: mostrar_arreglo(alfab)
4: escribir ‘programa finalizado’
de otro modo: escribir ‘opcion incorrecta’
fin_segun
hasta_que opcion=4
fin

Año 2018 Pág. 7


Programación Estructurada

Ejercicios a Resolver
1. Dadas las siguientes definiciones de arreglo, calcule el Rango del Arreglo (cantidad de elementos)
determine el tipo y número de dimensiones para cada una:
tarreglo6=ARREGLO [15,15] de ENTERO
tarreglo1=ARREGLO [-18..36] de REAL
tarreglo2=ARREGLO [-12..7, 20]de ENTERO
tarreglo3=ARREGLO [-1..6,-7..5, 15..22] de CARÁCTER
tarreglo4=ARREGLO [-3..7,-9..2,-3..5,-4..9] de CARÁCTER
tarreglo5=ARREGLO [-2..13,-3..10,10,-4..11,11] de LOGICO
2. Considerando un vector de reales de tamaño 10, diseñe un programa (y las subrutinas) que presente un
menú con las siguientes opciones:
a) agregar elementos al vector,
b) visualizar los valores negativos del vector, y
c) contar los valores positivos almacenados en el vector.
3. Considerando un vector de enteros de tamaño 20, diseñe un programa (y las subrutinas) que presente un
menú con las siguientes opciones:
a) insertar elementos en el vector (en orden descendente),
b) calcular el promedio de los elementos del vector almacenados en posiciones impares, y
c) determinar el máximo valor almacenado en posiciones pares del arreglo.
4. Considerando un vector de caracteres de tamaño 13, diseñe un programa (y las subrutinas) que presente
un menú con las siguientes opciones:
a) insertar elementos en el vector (siempre por la primera posición),
b) borrar un elemento del vector (especificado por el usuario) y
c) indicar, por cada carácter almacenado en el vector, si se trata de una mayúscula o una minúscula (en
caso de otros caracteres visualice el mensaje “Símbolo”).
5. Considerando 2 vectores de valores enteros de tamaño 20 (cada uno), diseñe un programa (y las
subrutinas) que permita:
a) agregar elementos a los vectores,
b) determinar si los vectores son iguales o no.
c) multiplicar posición a posición los elementos de los vectores (guardando los resultados en el primero),
A = A * B, es igual a: A[1], A[2], …, A[i], …,A[20] = A[1] * B[1], A[2] * B[2], …, A[i] * B[i], …, A[16] * B[16]
d) visualizar el contenido de los vectores.
Nota: Considere que el producto (por sumas sucesivas) se calcula mediante un algoritmo recursivo.
6. Considerando una matriz 10x20 de caracteres, diseñe un programa (y las subrutinas) que permita:
a) cargar los elementos de la matriz (desde la última posición hacia la primera),
b) visualizar elementos en la matriz por filas,
c) visualizar los elementos de la matriz por columnas, y
d) cargar un vector que contenga los elementos de la matriz (desde la primera posición hacia la última).
7. Considerando una matriz 10x10 de valores enteros, diseñe un programa (y las subrutinas) que permita:
a) cargar números enteros positivos pares en la diagonal secundaria de la matriz,
b) cargar números enteros positivos primos en los elementos fuera de la diagonal secundaria de la matriz,
c) cargar números aleatorios a los demás elementos de la matriz,
d) determinar la suma de los elementos de la diagonal principal y secundaria.

Año 2018 Pág. 8


Programación Estructurada

8. Dadas las matrices A, B y C de enteros (25 elementos c/u), escriba un programa modular que permita:
e) iniciar las matrices (poner en cero sus elementos)
f) cargar números enteros positivos en ambas matrices A y B,
g) determinar si las matrices son iguales o no
9. Considerando un arreglo 2x5x7 de enteros, diseñe un programa (y las subrutinas) que permita:
a) cargar elementos en el arreglo,
b) contar los valores múltiplos almacenados en el arreglo a partir de un numero solicitado al usuario, y
c) visualizar los elementos cuyos índices sean impares.
10. Considerando 3 arreglos A, B y C de 3x10x4 de valores enteros, diseñe un programa (y las subrutinas) que
permita:
a) agregar elementos a los arreglos A y B,
b) determinar si los arreglos A y B son iguales o no.
c) Calcular la potencia posición a posición de los elementos de los arreglos A y B (guardando los
resultados en el arreglo C,
C = A ˄ B, es igual a: C[1,1,1], C[2,1,1], …, C[i,j,k] = A[1,1,1] ˄ B[1,1,1],….A[i,j,k] ˄ B[i,j,k]
Considere que la potencia (por productos sucesivos) se calcula mediante un algoritmo recursivo.
11. Dado el siguiente módulo, ¿Qué valor devuelve con las definiciones a) y b)? Diga entonces cuál es su
propósito, Además, indique cómo se realiza el llamado de este procedimiento desde el programa principal.
a. const int d1=4, d2=3, d3=5, int rango(tipo_multi am)
d4=2; { int i,j,k,l,cont=0;
b. const int d1=5, d2=9, d3=6, for(i=0;i<=d1-1;i++)
d4=10; for(j=0;j<=d2-1;j++)
for(k=0;k<=d3-1;k++)
typedef int for(l=0;l<=d4-1;l++)
tipo_multi[d1][d2][d3][d4]; cont++;
return cont;
}
12. Dado el siguiente módulo, realice la prueba de escritorio y determine su propósito. ¿Qué valor debe
contener z y q para que funcione correctamente y utilice el mínimo espacio de memoria estática?
const int x=3, y=3, z=?, q=?; void nn(tipo_xy &a, tipo_z &b,tipo_q &c)
typedef int tipo_xy[x][y]; { int i,j,k=0, l=0;
typedef int tipo_z[z]; for(i=0;i<=x-1;i++)
typedef int tipo_q[q]; for(j=0;j<=y-1;j++)
{
if (i==j)
{
b[l]=a[i][j];
l++;
}
else
{
c[k]=a[i][j];
k++;
}
}
}



Año 2018 Pág. 9


ESCUELA DE MINAS “DR. HORACIO CARRILLO”

PROGRAMACIÓN ESTRUCTURADA
Trabajo Práctico N° 9
Universidad
Nacional de
Tema: Operaciones sobre Arreglos. Búsqueda. Intercalación. Ordenación.
Jujuy Apellido y Nombre: Fecha: / /

Conceptos Teóricos
BÚSQUEDA E INTERCALACIÓN
La búsqueda y la intercalación son operaciones básicas en programas de gestión de información. Estas
operaciones permiten manipular los grandes volúmenes de datos almacenados en sistemas de archivos, bases
de datos, etc. agilizando así el funcionamiento de los procesos de negocio.
La operación de búsqueda consiste en explorar una colección de datos para determinar la presencia de
determinados elementos, de acuerdo a algún criterio preestablecido.
La operación de intercalación permite combinar 2 colecciones de datos (de igual estructura) en una sola.
A continuación, se presentan estas operaciones aplicadas a estructuras de tipo arreglo.

BÚSQUEDA EN ARREGLOS
Los métodos más usuales de búsqueda en arreglos son:
• Búsqueda Secuencial
• Búsqueda Binaria
Búsqueda Secuencial
El método más sencillo de búsqueda consiste en explorar secuencialmente (uno a uno) los elementos de
un arreglo comparando cada uno con el criterio de búsqueda hasta que éste se encuentra o hasta que el arreglo
se lee por completo (recorrido desde el primer al último elemento).
La búsqueda secuencial no requiere de ningún requisito y, por consiguiente, no se necesita que el arreglo
esté ordenado. El recorrido del vector se realiza normalmente con estructuras repetitivas.
El algoritmo de búsqueda secuencial se presenta a continuación:
{La función Busqueda_Sec recorre el vector comparando cada posición con la variable buscado. Si el buscado
se encuentra en el vector la función retorna su posición, de lo contrario la función asume valor cero.}
funcion busqueda_sec(E num:vector; E buscado:entero): entero
variables
i:entero
encontrado:lógico
inicio
encontrado<-FALSO
i<-1
mientras (i<=MAX) Y NO encontrado hacer
si buscado=num[i] entonces
encontrado<-VERDADERO
sino
i<-i+1
fin_si
fin_mientras
si encontrado=VERDADERO entonces
busqueda_sec<-i
sino
busqueda_sec<-0
fin_si
fin

Búsqueda Binaria
Si bien el método de búsqueda secuencial resulta sencillo, su aplicación a grandes volúmenes de datos
ralentiza excesivamente el tiempo de procesamiento de un programa. Una alternativa más eficiente la constituye

Año 2018 Pág. 1


Programación Estructurada

el método de búsqueda binaria. Este algoritmo parte de la premisa de un vector ordenado y utiliza el método
“divide y vencerás” para encontrar el valor buscado. Básicamente, se examina primero el elemento central del
arreglo, si éste es el buscado, entonces finaliza allí; de lo contrario se determina si el elemento buscado está en
la primera o la segunda mitad del arreglo y a continuación se repite el proceso, utilizando el elemento central del
subarreglo.
El algoritmo de búsqueda binaria se presenta a continuación:
{La función Busqueda_Bin debe aplicarse sobre un vector ORDENADO. La búsqueda binaria consiste en dividir
el vector original, sucesivamente, en vectores más pequeños hasta encontrar el valor indicado (si es que éste
existe en el vector). Puede observarse que central permite determinar si la búsqueda prosigue por izquierda
(valores menores que el central) o por derecha (valores mayores que el central). En cada iteración del bucle
mientras se reduce el tamaño de la sublista (cuyos límites están definidos por alto y bajo) de elementos
analizados.}
funcion busqueda_bin(E/S num:vector, E buscado:entero): entero
variables
alto,bajo,central:entero
encontrado:lógico
inicio
bajo<-1
alto<-MAX
encontrado<-FALSO;
mientras NO encontrado Y (bajo<=alto) hacer
central<- (bajo+alto) div 2;
si buscado=num[central] entonces
encontrado<-VERDADERO
sino
si buscado<num[central] entonces
alto<-central-1
sino
bajo<-central+1
fin_si
fin_si
fin_mientras
si encontrado=VERDADERO entonces
busqueda_bin<-central
sino
busqueda_bin<-0
fin_si
fin

INTERCALACIÓN DE ARREGLOS
La intercalación es el proceso de mezclar (intercalar) dos vectores ordenados y producir un nuevo vector
también ordenado. En general pueden presentarse 2 casos:
• los vectores a intercalar tienen igual longitud,
• los vectores a intercalar tienen longitudes diferentes
En ambos casos, el tamaño del vector de intercalación resulta de sumar las longitudes de los vectores a
mezclar. El algoritmo de intercalación se presenta a continuación (caso 1: vectores de igual longitud):
procedimiento intercalar (E uno:vector1;E dos:vector1;E/S tres:vector2)
variables
i,j,k:entero
inicio
i<-1;j<-1;k<-1;
mientras (i<=MAX1) Y (j<=MAX1) hacer
si uno[i]<dos[j] entonces
tres[k] <-uno[i];
k<-k+1;
i<-i+1;
sino
tres[k] <-dos[j];
k<-k+1;
j<-j+1;
fin_si
fin_mientras
mientras i<=MAX1 hacer

Año 2018 Pág. 2


Programación Estructurada

tres[k] <-uno[i];
k<-k+1;
i<-i+1;
fin_mientras
mientras j<=MAX1 hacer
tres[k] <-dos[j];
k<-k+1;
j<-j+1;
fin_mientras
fin

En las siguientes tablas se muestra el comportamiento del algoritmo de intercalación, obsérvese que se
han destacado los elementos de los vectores que se utilizan en cada paso para generar el vector de intercalación.

Vector 1 Vector 2 Vector 3 Vector 1 Vector 2 Vector 3 Vector 1 Vector 2 Vector 3


14 2 2 14 2 2 14 2 2
16 6 - 16 6 6 16 6 6
21 44 - 21 44 - 21 44 14
42 63 - 42 63 - 42 63 -
- - -
- - -
- - -
- - -

Vector 1 Vector 2 Vector 3 Vector 1 Vector 2 Vector 3 Vector 1 Vector 2 Vector 3


14 2 2 14 2 2 14 2 2
16 6 6 16 6 6 16 6 6
21 44 14 21 44 14 21 44 14
42 63 16 42 63 16 42 63 16
- 21 21
- - 42
- - -
- - -

Vector 1 Vector 2 Vector 3 Vector 1 Vector 2 Vector 3 Vector 1 Vector 2 Vector 3


14 2 2 14 2 2 14 2 2
16 6 6 16 6 6 16 6 6
21 44 14 21 44 14 21 44 14
42 63 16 42 63 16 42 63 16
21 21 21
42 42 42
44 44 44
- 63 63

ORDENACIÓN DE ARREGLOS
Los métodos más usuales de ordenación de arreglos son:
▪ Burbuja o Intercambio
▪ Selección
▪ Inserción
▪ Shell
▪ Rápido (Quicksort)
A continuación, se describen los métodos estos métodos.
Método de Burbuja o Intercambio
El algoritmo de intercambio o burbuja se basa en comparar pares de elementos adyacentes e
intercambiarlos entre sí hasta que estén todos ordenados. Por ejemplo, si se considera el siguiente vector
2.30 5.90 1.44 3.11 0.32
Elemento 1 Elemento 2 Elemento 3 Elemento 4 Elemento 5

Los pasos a dar son:

Año 2018 Pág. 3


Programación Estructurada

1. Comparar elemento[1] y elemento[2]; si están en orden, se mantienen como están; en caso contrario, se
intercambian entre sí.
2. A continuación, se comparan los elementos 2 y 3; de nuevo se intercambian si es necesario.
3. El proceso continúa hasta que cada elemento del vector ha sido comparado con sus adyacentes y se
han realizado los intercambios necesarios.
En la siguiente tabla se muestra el comportamiento del algoritmo de ordenación burbuja (en cada paso
se destacan los valores que se van comparando), la última línea de la tabla presenta los valores del vector
ordenados.
Elemento 1 Elemento 2 Elemento 3 Elemento 4 Elemento 5
2.30 5.90 1.44 3.11 0.32
2.30 5.90 1.44 3.11 0.32
2.30 1.44 5.90 3.11 0.32
2.30 1.44 3.11 5.90 0.32
2.30 1.44 3.11 0.32 5.90
1.44 2.30 3.11 0.32 5.90
1.44 2.30 3.11 0.32 5.90
1.44 2.30 0.32 3.11 5.90
1.44 2.30 0.32 3.11 5.90
1.44 2.30 0.32 3.11 5.90
1.44 0.32 2.30 3.11 5.90
1.44 0.32 2.30 3.11 5.90
1.44 0.32 2.30 3.11 5.90
0.32 1.44 2.30 3.11 5.90
0.32 1.44 2.30 3.11 5.90
0.32 1.44 2.30 3.11 5.90
0.32 1.44 2.30 3.11 5.90
El algoritmo de ordenación burbuja se presenta a continuación (el procedimiento cambio realiza el
intercambio de valores entre los parámetros x e y, que recibe):
procedimiento cambio(E/S x:entero, E/S y:entero)
procedimiento burbuja (E/S a: vector,E ocup:entero) variables
variables aux:entero
j:entero inicio
bandera:lógico auxx
inicio xy
banderaVERDADERO yaux
mientras bandera hacer fin
banderaFALSO
para j desde 1 hasta ocup-1 hacer
si a[j]>a[j+1] entonces
cambio(a[j],a[j+1])
banderaVERDADERO
fin_si
fin_para
fin_mientras
fin
Método de Ordenación por Selección
El algoritmo de ordenación por selección se basa en buscar el elemento menor del arreglo y colocarlo en
primera posición. Luego se busca el segundo elemento más pequeño y se coloca en la segunda posición, y así
sucesivamente. Por ejemplo, si se considera el siguiente vector
2.30 5.90 1.44 3.11 0.32
Elemento 1 Elemento 2 Elemento 3 Elemento 4 Elemento 5
Los pasos sucesivos a dar son:
1. Seleccionar el elemento menor del arreglo de n elementos.
2. Intercambiar dicho elemento con el primero.
3. Repetir estas operaciones con los n-1 elementos restantes, seleccionando el segundo elemento;
continuar con los n-2 elementos restantes hasta que sólo quede el mayor.
En la siguiente tabla se muestra el comportamiento del algoritmo de ordenación por selección (en cada
paso se destacan los valores que se van comparando), la última línea de la tabla presenta los valores del vector
ordenados.

Año 2018 Pág. 4


Programación Estructurada

Elemento 1 Elemento 2 Elemento 3 Elemento 4 Elemento 5


2.30 5.90 1.44 3.11 0.32
2.30 5.90 1.44 3.11 0.32
1.44 5.90 2.30 3.11 0.32
1.44 5.90 2.30 3.11 0.32
0.32 5.90 2.30 3.11 1.44
0.32 2.30 5.90 3.11 1.44
0.32 2.30 5.90 3.11 1.44
0.32 1.44 5.90 3.11 2.30
0.32 1.44 3.11 5.90 2.30
0.32 1.44 2.30 5.90 3.11
0.32 1.44 2.30 3.11 5.90

El algoritmo de ordenación por selección se presenta a continuación (el procedimiento cambio realiza el
intercambio de valores entre los parámetros x e y, que recibe):

procedimiento seleccion(E/S a:vector,E ocup:entero)


variables
i,j:entero
inicio
para i desde 1 hasta ocup-1 hacer
para j desde i+1 hasta ocup hacer
si a[i]>a[j] entonces
cambio(a[i],a[j])
fin_si
fin_para
fin_para
fin
Método de Ordenación por Inserción
El algoritmo de ordenación por inserción ordena un vector insertando cada elemento[i] entre los i-1
anteriores que ya están ordenados. Para realizar esto comienza a partir del segundo elemento, suponiendo que
el primero ya está ordenado. Si los 2 primeros elementos están desordenados, los intercambia. Luego, toma el
tercer elemento y busca su posición correcta con respecto a los dos primeros. En general, para el elemento i,
busca su posición con respecto a los i-1 elementos anteriores y de ser necesario lo inserta adecuadamente.
En la siguiente tabla se muestra el comportamiento del algoritmo de ordenación por inserción para el
vector:
2.30 5.90 1.44 3.11 0.32
Elemento 1 Elemento 2 Elemento 3 Elemento 4 Elemento 5
i j aux a[j] Elemento 1 Elemento 2 Elemento 3 Elemento 4 Elemento 5
2.30 5.90 1.44 3.11 0.32
2 1 5.90 2.30 2.30 5.90 1.44 3.11 0.32
2.30 5.90 1.44 3.11 0.32
3 2 1.44 5.90 5.90
1 2.30 2.30
0 1.44
1.44 2.30 5.90 3.11 0.32
4 3 3.11 5.90 5.90
2 2.30 3.11
1.44 2.30 3.11 5.90 0.32
5 4 0.32 5.90 5.90
3 3.11 3.11
2 2.30 2.30
1 1.44 1.44
0 0.32
0.32 1.44 2.30 3.11 5.90

El algoritmo de ordenación por inserción se presenta a continuación:


Año 2018 Pág. 5
Programación Estructurada

procedimento insercion(E/S a:vector,E ocup:entero)


variables
i,j,aux:entero
inicio
para i desde 2 hasta ocup hacer
auxa[i]
ji-1
mientras (j>=1) Y (a[j]>aux) hacer
a[j+1]a[j];
jj-1
fin_mientras
a[j+1]aux
fin_para
fin
Método de Ordenación Shell
El algoritmo de ordenación Shell (o también llamado de inserción con incrementos decrecientes) es una
mejora del método de inserción. En este método se realizan comparaciones por saltos constantes (mayores a 1)
con lo que se consigue una ordenación más rápida.
La ordenación Shell se basa en tomar como salto N/2 (N elementos del arreglo) y luego el salto se va
reduciendo a la mitad en cada repetición hasta que vale 1.
En la siguiente tabla se muestra el comportamiento del algoritmo de ordenación Shell para el vector:
18 11 27 13 9 4 16
Elemento 1 Elemento 2 Elemento 3 Elemento 4 Elemento 5 Elemento 6 Elemento 7

Salto i j K Elemento 1 Elemento 2 Elemento 3 Elemento 4 Elemento 5 Elemento 6 Elemento 7


3 4 1 4 18 11 27 13 9 4 16
-2 13 11 27 18 9 4 16
5 2 5 13 11 27 18 9 4 16
-1 13 9 27 18 11 4 16
6 3 6 13 9 27 18 11 4 16
0 13 9 4 18 11 27 16
7 4 7 13 9 4 18 11 27 16
1 4 13 9 4 16 11 27 18
0 13 9 4 16 11 27 18
1 2 1 2 13 9 4 16 11 27 18
0 9 13 4 16 11 27 18
3 2 3 9 13 4 16 11 27 18
1 2 9 4 13 16 11 27 18
0 4 9 13 16 11 27 18
4 3 4 4 9 13 16 11 27 18
0 4 9 13 16 11 27 18
5 4 5 4 9 13 16 11 27 18
3 4 4 9 13 11 16 27 18
0 4 9 11 13 16 27 18
6 5 6 4 9 11 13 16 27 18
0 4 9 11 13 16 27 18
7 6 7 4 9 11 13 16 27 18
5 6 4 9 11 13 16 18 27
0 4 9 11 13 16 18 27
El algoritmo de ordenación Shell se presenta a continuación:
procedimiento shell(E/S a:vector,E ocup:entero)
variables
i,j,k,salto:entero
inicio
saltoocup div 2
mientras salto > 0 hacer
para i desde (salto+1) hasta ocup hacer
ji-salto
mientras j>0 hacer
kj+salto
Año 2018 Pág. 6
Programación Estructurada

si a[j]<=a[k] entonces
j0
sino
cambio(a[j],a[k])
fin_si
jj-salto
fin_mientras
fin_para
saltosalto div 2
fin_mientras
fin
Método de Ordenación Rápido (Quicksort)
El algoritmo de ordenación Rápido permite ordenar una lista basándose en el hecho de que es más fácil
ordenar 2 listas pequeñas que una lista grande. El método divide al arreglo en 2 sublistas, una con todos los
valores menores o iguales a un cierto valor específico y otra con todos los valores mayores que ese valor. El
valor elegido puede ser cualquier valor arbitrario del vector. A este valor se lo denomina pivote.
En la siguiente tabla se muestra el comportamiento del algoritmo de ordenación Rápido para el vector:
18 11 27 13 9 4 16
Elemento 1 Elemento 2 Elemento 3 Elemento 4 Elemento 5 Elemento 6 Elemento 7

Pivote izq der i j Elemento 1 Elemento 2 Elemento 3 Elemento 4 Elemento 5 Elemento 6 Elemento 7
13 1 7 1 6 18 11 27 13 9 4 16
3 5 4 11 27 13 9 18 16
4 4 4 11 9 13 27 18 16
5 3
11/18 1/5 3/7 1/5 3/7 4 11 9 13 27 18 16
2/6 /6 4 9 11 13 16 18 27
3/7 2/5
- - - - - 4 9 11 13 16 18 27

El algoritmo de ordenación Rápido se presenta a continuación:


procedimiento rapido(E/S a:vector,E izq:integer,E der:integer)
variables
i,j,pivote:entero
inicio
iizq
jder
pivotea[(izq+der) div 2]
mientras i<= j hacer
mientras a[i]<pivote hacer
ii+1;
fin_mientras
mientras a[j]>pivote hacer
jj-1
fin_mientras
si i<= j entonces
cambio(a[i],a[j]);
ii+1;
jj-1;
fin_si
fin_mientras
si izq < j entonces
rapido(a,izq,j)
fin_si
si i < der entonces
rapido(a,i,der)
fin_si
fin

Año 2018 Pág. 7


Programación Estructurada

Ejercicios a Resolver

1. Realice la prueba de escritorio del algoritmo de ordenación burbuja para el siguiente vector (utilice la tabla
adjunta):

bandera j j+1 a[j]> a[j+1] Elemento 1 Elemento 2 Elemento 3 Elemento 4 Elemento 5 Elemento 6
8 10 4 7 6 5
… … .. … … … … … … …

2. Dado los siguientes vectores, muestre gráficamente el comportamiento del algoritmo de ordenación burbuja.
76 47 69 57 66 48 53 20

12 81 71 61 63 90 53 50

3. Realice la prueba de escritorio del algoritmo de ordenación por selección para el siguiente vector (utilice la
tabla adjunta):

i j a[i]>a[j+1] Elemento 1 Elemento 2 Elemento 3 Elemento 4 Elemento 5


20 6 4 25 2
… … … … … … … …

4. Dado los siguientes vectores, muestre gráficamente el comportamiento del algoritmo de ordenación por
selección.
22 50 60 33 44 88 55 25

93 75 22 68 74 48 63 27

5. Realice la prueba de escritorio del algoritmo de ordenación por inserción para el siguiente vector (utilice la
tabla adjunta):

I aux j j>=1 Y a[j]>aux Elemento 1 Elemento 2 Elemento 3 Elemento 4 Elemento 5


5 52 3 18 11
… … … … … … … … …

6. Dado los siguientes vectores, muestre gráficamente el comportamiento del algoritmo de ordenación por
inserción.
3 18 9 43 22 33 15 12

42 28 36 29 30 5 3 17

7. Modifique los algoritmos de ordenación Burbuja, Selección e Inserción para que la disposición de elementos
se realice en forma decreciente.

8. Implemente el algoritmo de ordenación Burbuja utilizando estructuras REPETIR (para todos los bucles) y el
algoritmo de Selección utilizando estructuras MIENTRAS (para todos los bucles).

9. Modifique el algoritmo de Selección de modo que la ordenación se realice a partir de la última posición del
arreglo.

10. Sabiendo que el algoritmo de ordenación Selección, en cada pasada (recorrido), intercambia el contenido de
la posición comparada con cada valor que cumpla la condición de ordenación, modifíquelo de manera que
por recorrido sólo se realice un intercambio (correspondiente al valor mínimo detectado para esa pasada).
Suponga que ordena de forma decreciente.

11. Considerando los arreglos Vector1 y Vector2, ambos ordenados en forma decreciente, modifique el algoritmo
de Intercalación para realizar la mezcla de estos vectores. Verifique el algoritmo modificado con una prueba
de escritorio.

Año 2018 Pág. 8


Programación Estructurada

12. Dado los siguientes pares de vectores, confeccione las tablas necesarias que muestren el comportamiento
del algoritmo de intercalación para cada par.
Vector 1 Vector 2 Vector 3 Vector 1 Vector 2 Vector 3
70 10 - 23 88 -
74 12 - 62 77 -
85 14 … 70 66 …
94 15 - 74 33 -
98 16 - 85 22 -
18 - 94 12 -
- 98 6 -

Vector 1 Vector 2 Vector 3 Vector 1 Vector 2 Vector 3


26 18 - 3 25 -
18 17 - 8 38 -
15 16 … 12 52 …
11 13 - 20 -
8 12 - 36 -
5 - 48 -

13. Considerando 2 vectores de caracteres de 30 elementos cada uno, modifique el algoritmo de Intercalación
de modo que los vectores se mezclen a partir de la última posición hacia la primera. Verifique el algoritmo
modificado con una prueba de escritorio.

14. Considerando 2 vectores de valores enteros de 15 elementos cada uno, modifique el algoritmo de
Intercalación de modo que pueda mezclar los vectores considerando que el primero está ordenado en forma
creciente y que el segundo está ordenado en forma decreciente. Verifique el algoritmo modificado con una
prueba de escritorio.



Año 2018 Pág. 9


ESCUELA DE MINAS “DR. HORACIO CARRILLO”

PROGRAMACIÓN ESTRUCTURADA
Trabajo Práctico N° 10
Universidad
Nacional de
Tema: Arreglos. Registros.
Jujuy Apellido y Nombre: Fecha: / /

Conceptos Teóricos
REGISTROS
Un registro es una estructura de datos compuesta que permite agrupar datos de diferentes clases
(reales, lógicos, caracteres, etc.) que tienen alguna conexión lógica en una única estructura. En otras
palabras, un registro es un conjunto de valores, con tres características básicas:
▪ Los valores pueden ser de distinto tipo, un registro es una estructura heterogénea.
▪ Los valores almacenados en un registro se denominan campos, y cada uno de ellos tiene un
identificador; los campos son nombrados individualmente, como variables ordinarias.
▪ El almacenamiento (memoria) ocupado por un registro es fijo; por esto, un registro es una estructura
estática.
La definición de registros en programación permite representar entidades del mundo real en
soluciones basadas en computadora. Así, la información acerca de los empleados de una empresa (nombre,
fecha de nacimiento, cargo, salario, etc.) pueden ser almacenados en una única estructura que permita
manejar como un todo un conjunto de datos relacionados.

Declaración de Registros
Un registro se declara identificando al tipo como un registro (t_registro=registro) y luego especificando
el nombre y tipo de los campos individuales (campo_1:tipo_dato). Esta lista de campos sigue las reglas
generales de declaración de variables, y se encuentra entre las palabras reservadas registro y fin_registro.
Los campos pueden ser de cualquier tipo, datos simples o estructurados (arreglos, registros).
El formato general de declaración de registros es:
TIPOS
t_registro=registro
campo_1: tipo_dato
campo_2: tipo_dato

campo_n: tipo_dato
fin_registro
VARIABLES
nombre_variable:t_registro
Obsérvese que una vez declarado el tipo registro, se pueden definir variables de ese tipo para
utilizarlas en el programa. El siguiente ejemplo ilustra la declaración de un registro que almacena la
información acerca de un producto.
TIPOS
t_producto=registro
cod_producto: entero
marca_producto: cadena
precio_producto: real
descripción_producto: cadena
fin_registro
VARIABLES
mercadería: t_producto
Acceso a los campos de un registro
Para acceder a los campos de un registro es necesario especificar tanto el nombre de la variable de
tipo registro como el del campo que se desea referenciar. Esto se denomina calificar el campo. Por ejemplo,

Año 2018 Pág. 1


Programación Estructurada

si se quiere almacenar un valor en el campo precio_producto de la variable mercaderia (ejemplo anterior) se


procede como sigue:

mercaderia.precio_producto12.36
Puede observarse que entre el registro mercaderia y el campo precio_producto aparece un punto.
Este símbolo se denomina designador o selector de campo.

Anidamiento de registros
Las variables estructuradas, como los registros, pueden estar anidadas (una dentro de otra). Es decir,
un campo de un registro puede, a su vez, ser otro registro. Un registro con uno o más campos de tipo registro
se llama registro jerárquico o anidado.
El siguiente ejemplo ilustra un anidamiento de registro de 2 niveles:
TIPOS
t_fecha=registro
día: entero
mes: entero
anio: entero
fin_registro

t_persona=registro
legajo: entero
nombre: cadena
f_nacimiento: t_fecha
fin_registro
VARIABLES
empleado: t_persona
En la declaración precedente se especifican los registros t_fecha y t_persona. Nótese que en la
declaración de t_persona el campo f_nacimiento es de tipo t_fecha, es decir, que este campo es también un
registro.
La manera de acceder a los campos esencialmente no cambia, sin embargo, es necesario utilizar
doble calificación para referenciar los campos día, mes y anio. Por ejemplo, si se quiere almacenar un valor
en el campo día del registro f_nacimiento, que es campo de la variable empleado se procede como sigue:

empleado.f_nacimiento.dia28
Observe que se destacaron en negritas y cursiva (negritas para el primer nivel y cursiva para el
segundo) los dos niveles de registro presentes en esta definición. Los siguientes son ejemplos de
especificaciones INCORRECTAS de esta misma jerarquía (en negritas se indican los errores):
t_persona.f_nacimiento.dia28
empleado.t_fecha.dia28
t_persona.t_fecha.dia28
Operaciones sobre registros
Dado que los campos de un registro son variables de algún tipo de dato, las operaciones posibles
sobre un campo son las permitidas para el tipo de dato correspondiente.
Además de las operaciones sobre cada campo, existe una que puede realizarse sobre un registro
completo, la ASIGNACIÓN. Esto es posible si las variables utilizadas en la operación son del mismo tipo de
registro. Por ejemplo, si la variable vendedor y la variable empleado son del tipo t_persona, la siguiente
operación de asignación es válida.

vendedorempleado
En este caso, el valor de cada campo de empleado se copia en cada campo de vendedor.

Año 2018 Pág. 2


Programación Estructurada

No pueden realizarse comparaciones entre registros completos, es decir, que dos variables del mismo
tipo de registro no pueden ser comparadas utilizando los operadores relacionales. Para determinar si dos
registros son iguales es necesario realizar la comparación campo por campo.
Sobre las variables de tipo registro no se pueden aplicar directamente las operaciones LEER y
ESCRIBIR; éstas deben ejecutarse sobre campos individuales. Por ejemplo, NO ES CORRECTA la sentencia
ESCRIBIR vendedor
pero si lo es la sentencia
ESCRIBIR vendedor.nombre
La sentencia WITH
Cuando se trabaja con registros, hay ocasiones en que el acceso a los campos a través de la
calificación suele ser tediosa (por ejemplo, asignaciones con nombres de registro demasiado largos). Para
evitar esto, el lenguaje Pascal provee la sentencia WITH que permite que un registro sea nombrado una vez,
y luego sea accedido directamente. El formato general de la sentencia WITH es:
WITH nombre_variable_registro DO
BEGIN

END
o en pseudocódigo
CON nombre_variable_registro HACER

FIN-CON
El siguiente ejemplo ilustra el uso de la sentencia WITH:

Sin utilizar la sentencia WITH


PROCEDIMIENTO CARGAR-EMPLEADO (E/S empleado_sucursal:t_persona)
INICIO
ESCRIBIR ‘Ingrese legajo del empleado:’
LEER empleado_sucursal.legajo
ESCRIBIR ‘Ingrese nombre del empleado:’
LEER empleado_sucursal.nombre
ESCRIBIR ‘Ingrese día de nacimiento:’
LEER empleado_sucursal.f_nacimiento.dia
ESCRIBIR ‘Ingrese mes de nacimiento:’
LEER empleado_sucursal.f_nacimiento.mes
ESCRIBIR ‘Ingrese año de nacimiento:’
LEER empleado_sucursal.f_nacimiento.anio
FIN
Utilizando la sentencia WITH (CON)
PROCEDURE CARGAR-EMPLEADO (E/S empleado_sucursal:t_persona)
INICIO
CON empleado_sucursal HACER
INICIO
ESCRIBIR ‘Ingrese legajo del empleado:’
LEER legajo
ESCRIBIR ‘Ingrese nombre del empleado:’
LEER nombre
CON f_nacimiento HACER
INICIO
ESCRIBIR ‘Ingrese día de nacimiento:’
LEER dia
ESCRIBIR ‘Ingrese mes de nacimiento:’
LEER mes
ESCRIBIR ‘Ingrese año de nacimiento:’
LEER anio
FIN
FIN
FIN

Año 2018 Pág. 3


Programación Estructurada

Arreglos de Registros
En la práctica no es tan común el uso de registros simples. En general, los registros se agrupan en
conjuntos conocidos como arreglos de registro. Por ejemplo, la siguiente declaración permite representar 100
productos:
CONSTANTES
MAXPROD=100
TIPOS
t_producto=registro
cod_producto: entero
marca_producto: cadena
precio_producto: real
descripción_producto: cadena
fin_registro

t_stock=arreglo [1..MAXPROD] de t_producto


VARIABLES
inventario: t_stock

Posición 1 Posición 2 Posición 3 … Posición 99 Posición 100


cod_producto cod_producto cod_producto cod_producto cod_producto
marca_producto marca_producto marca_producto marca_producto marca_producto

precio_producto precio_producto precio_producto precio_producto precio_producto
descripción_producto descripción_producto descripción_producto descripción_producto descripción_producto
inventario (variable de tipo t_stock)
Observe que cada una de las posiciones del arreglo inventario es un registro de tipo t_producto. En
este caso si se quiere asignar un valor al campo precio_producto del registro que ocupa la posición 3 del
arreglo inventario se procede como sigue:
inventario[3].precio-producto69.50
Todas las operaciones (asignación, lectura/escritura, recorrido, actualización, ordenación, búsqueda,
intercalación) vistas para arreglos son aplicables (con ligeras modificaciones) a arreglos de registros. Por
ejemplo, a continuación, se presenta el algoritmo Borrar modificado para trabajar sobre el arreglo de productos
definido previamente.
PROCEDIMIENTO BORRAR (E/S productos: t_stock, E/S ocuprod: entero, E codigoprod: entero)
variables
i: entero
encontrado: logico
inicio
si ocuprod=0 entonces
escribir ‘NO EXISTEN PRODUCTOS EN STOCK’
sino
i<-1
encontrado<-FALSO
mientras i<=ocuprod Y NO encontrado hacer
si productos[i].cod_producto=codigoprod entonces
encontrado<-VERDADERO
sino
i<-i+1
fin_si
fin_mientras
si encontrado=VERDADERO entonces
mientras i<ocuprod hacer
productos[i]<-productos[i+1]
i<-i+1
fin_mientras
ocuprod<-ocuprod-1
sino
escribir ‘EL PRODUCTO NO EXISTE’
fin_si
fin_si
fin

Año 2018 Pág. 4


Programación Estructurada

Ejemplos
Ejemplo: El encargado del depósito de una empresa de artículos electrónicos necesita almacenar información
de inventario acerca de los 400 tipos de productos que se comercializan. La información de interés para el
encargado es la siguiente: código del producto, descripción, marca, precio unitario, cantidad (stock), fecha de
elaboración y proveedor. Escriba un programa que permita gestionar esta información, y que presente al
encargado del depósito, un menú con las siguientes opciones: 1-Agregar productos, 2-Listar productos, 3-
Buscar un producto determinado, 4-Salir.
PROGRAMA EMPRESA
CONSTANTES
MAXPROD =400
TIPOS
t_fecha=registro
dia:entero
mes:entero
anio:entero
fin-registro
t_producto=registro
codigo:entero
descrip:cadena
marca:cadena
precio:real
cantidad:entero
f_elab:t_fecha
proveedor:cadena
fin_registro
t_deposito=arreglo [1..MAXPROD] de t_producto
VARIABLES
almacen:t_deposito
ocupado, opcion, código-prod:entero
PROCEDIMENTO AGREGAR_PRODUCTOS (E/S prods:t_deposito, E/S ocup:entero)
INICIO
si ocup < MAXPROD entonces
ocup<-ocup+1
escribir ‘Ingrese código del producto:’
leer prods[ocup].codigo
escribir ‘Ingrese descrip del producto:’
leer prods[ocup].descrip
escribir ‘Ingrese marca del producto:’
leer prods[ocup].marca
escribir ‘Ingrese precio del producto:’
leer prods[ocup].precio
escribir ‘Ingrese cantidad del producto:’
leer prods[ocup].cantidad
escribir ‘Ingrese fecha de elaboración del producto:’
escribir ‘Ingrese día:’
leer prods[ocup].f_elab.dia
escribir ‘Ingrese mes:’
leer prods[ocup].f_elab.mes
escribir ‘Ingrese año:’
leer prods[ocup].f_elab.anio
escribir ‘Ingrese proveedor del producto:’
leer prods[ocup].proveedor
sino
escribir ‘No se pueden agregar más productos’
fin-si
FIN
PROCEDIMIENTO LISTAR_PRODUCTOS (E/S prods:t_deposito, E ocup:entero)
VARIABLES

Año 2018 Pág. 5


Programación Estructurada

i:entero
INICIO
para i desde 1 hasta ocup hacer
escribir prods[i].codigo
escribir prods[i].descrip
escribir prods[i].marca
escribir prods[i].precio
escribir prods[i].cantidad
escribir prods[i].f_elab.dia
escribir prods[i].f_elab.mes
escribir prods[i].f_elab.anio
escribir prods[i].proveedor
fin_para
FIN
PROCEDIMIENTO BUSCAR_PRODUCTO(E/S prods:t_deposito, E ocup: entero, E buscado:entero)
VARIABLES
i:entero
encontrado:lógico
INICIO
i<-1
encontrado<-FALSO
mientras i<=ocup Y no encontrado hacer
si prods[i].codigo=buscado entonces
encontrado<-VERDADERO
sino
i<-i+1
fin-si
fin-mientras
si encontrado=VERDADERO entonces
escribir prods[i].codigo
escribir prods[i].descrip
escribir prods[i].marca
escribir prods[i].precio
escribir prods[i].cantidad
escribir prods[i].f_elab.dia
escribir prods[i].f_elab.mes
escribir prods[i].f_elab.anio
escribir prods[i].proveedor
sino
escribir ‘El producto no existe o el código es incorrecto’
fin-si
FIN
INICIO
ocupado<-0
repetir
escribir ‘1-Agregar Productos‘
escribir ‘2-Listar Productos‘
escribir ‘3-Buscar un Producto‘
escribir ‘4-Salir‘
escribir ‘Ingrese opcion:’
leer opcion
según opcion hacer
1: agregar_productos(almacen,ocupado)
2: listar_productos(almacen,ocupado)
3: escribir ‘Ingrese código del producto a buscar:’
Leer código-prod
buscar_producto(almacen,ocupado,código-prod)
4: escribir ‘Fin del Programa…’
de otro modo
escribir ‘Opción Incorrecta’
fin_segun
hasta_que opcion=4
FIN

Año 2018 Pág. 6


Programación Estructurada

Ejercicios a Resolver
31. Dada la siguiente definición de datos que representa a la entidad empleado, diseñe las operaciones
cargar_empleado y mostrar_empleado.

PROGRAMA gestion_empleados
TIPOS
t_empleado=REGISTRO
legajo:ENTERO
apellido:cadena
nombre:cadena
cargo:cadena
salario:REAL
FIN_REGISTRO
VARIABLES
trabajador:t_empleado
32. Analice el siguiente módulo, escriba la definición de datos correspondiente a la entidad representada y
diseñe el módulo de carga.
PROCEDIMIENTO mostrar_libro (E book:t_libro)
INICIO
ESCRIBIR “Código: ”, book.codigo
ESCRIBIR “Título: ”, book.titulo
ESCRIBIR “Género: ”, book.genero
ESCRIBIR “Precio: ”, book.precio
ESCRIBIR “Publicación:”, book.fpub.dia,”/”,book.fpub.mes,”/”,book.fpub.anio
ESCRIBIR “Stock: ”, book.stock
FIN
33. Consigne la declaración de tipos y variables necesaria para almacenar información acerca de un docente
(legajo, apellido y nombre, DNI, CUIL, fecha de nacimiento (día, mes, año), nacionalidad, domicilio (calle,
número, piso, departamento, localidad, provincia, código postal), e-mail, título y cargo. Además, diseñe
los procedimientos de carga y visualización para manipular estos datos.
34. Modifique la definición del ítem 3 de modo que permita almacenar la información de 500 docentes.
Además, diseñe los módulos necesarios para agregar un nuevo docente, borrar un docente y listar todos
los docentes.
35. Modifique el algoritmo de Ordenación Burbuja de modo que ordene los docentes del ítem 4 por DNI.
36. Consigne la declaración de tipos y variables necesaria para almacenar la siguiente información acerca
de pacientes (máximo 1000) de la Clínica “El Sol”: DNI, apellido y nombre, Nro. Historia Clínica, fecha de
ingreso (día, mes, año), tipo de servicio (total, intermedio, básico), localidad. Además, diseñe los
procedimientos de carga y visualización correspondientes.
37. Consigne la declaración de tipos y variables necesaria para almacenar registros de las atenciones
(máximo 150) a los pacientes de la Clínica “El Sol”. La historia clínica debe contener: Nro. Historia Clínica,
fecha de atención (día, mes, año), hora de atención (hora, minutos, segundos), Nro. de Legajo del doctor,
especialidad y detalle de la atención. Además, diseñe los procedimientos de carga y visualización
correspondientes.
38. Diseñe un procedimiento/función que liste los pacientes del punto 6 (DNI, apellido y nombre, fecha de
ingreso y tipo de servicio) cuyo servicio corresponda a uno solicitado por el usuario. Indique cuántos
pacientes se encontraron.
39. Diseñe un procedimiento/función que liste todas las atenciones realizadas a un paciente según un DNI
ingresado por el usuario. Considere las definiciones de los puntos 6 y 7.
40. El administrador de un Cooperativa desea mantener registrada información acerca de los socios (máx.

Año 2018 Pág. 7


Programación Estructurada

150) que participan de sus actividades. Por cada socio se debe almacenar los siguientes datos: número
de socio, nombre, apellido, fecha de nacimiento (día, mes, año), fecha de ingreso (día, mes, año), grupo
familiar (cantidad de integrantes), domicilio (calle, número, barrio, localidad) y teléfono. En virtud de lo
enunciado se pide:
a) Consigne la declaración de tipos y variables que represente la situación planteada.
b) Diseñe un procedimiento/función que liste los socios (nombre, apellido, fecha de ingreso y
localidad) cuya localidad corresponda a una solicitada por el usuario. Indique cuántos socios se
encontraron.
c) Diseñe un procedimiento/función que cuente cuántos socios no tienen grupo familiar.
41. El responsable del centro de cómputos de la provincia desea registrar información acerca de las 400
computadoras del área de liquidación de sueldos. Por cada computadora se debe guardar: código de la
computadora, marca, modelo, características (procesador, memoria RAM, disco), fecha de alta (día, mes,
año) y usuario (nombre, cargo). Considerando esto, se le solicita:
a) Consigne la declaración de tipos y variables de la estructura que represente la situación
planteada.
b) Diseñe los procedimientos/funciones que permitan listar todas computadoras (código de la
computadora, características y nombre del usuario) que correspondan a una marca especificada
por el usuario. Indique además la cantidad de computadoras listadas.
42. El club deportivo “Recreo” desea mantener registrada la información acerca de sus afiliados (máx. 800).
Por cada afiliado se debe almacenar los siguientes datos: número de afiliado, nombre, apellido, fecha de
nacimiento (día, mes, año), fecha de ingreso (día, mes, año), domicilio (calle, número, barrio) y deporte.
En virtud lo enunciado se pide:
c. Consigne la declaración de tipos y variables que represente la situación planteada.
d. Diseñe un procedimiento/función que cuente los afiliados cuyo año de ingreso al club, sea igual
a uno especificado por el usuario. Indique cuántos afiliados se encontraron.
e. Diseñe un procedimiento/función que muestre los afiliados (nombre, apellido y fecha ingreso)
cuyo deporte elegido sea “tenis”.



Año 2018 Pág. 8

Você também pode gostar