Escolar Documentos
Profissional Documentos
Cultura Documentos
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 continuación, se escribe el algoritmo que da solución al problema paso a paso y en lenguaje natural.
3. Se obtiene el resultado
4. Se muestra el resultado
PROCESO: Tomar las medidas base y altura, aplicar la fórmula, A b a obtener el resultado de la
2
superficie y mostrarlo
Para resolver los problemas mediante un programa, debemos utilizar los recursos que nos permitan
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.
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.
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
NOT AND OR
a b a OR b a b
Tablas de verdad
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
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
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
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: num20.
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.
Ejercicios Resueltos
1. Dadas las siguientes cadenas de caracteres, realice sobre ellas las operaciones solicitas e indique el
resultado obtenido.
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’}
todosotrasletras + 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:
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
PROGRAMACIÓN ESTRUCTURADA
Trabajo Práctico Nº 2
Universidad
Nacional de
Tema: Estructuras de Control Secuenciales y Selectivas
Jujuy
Apellido y Nombre: Fecha: / /
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
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
Diccionario de Resultados
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.
OPERACIONES
ASIGNACIÓN
suma suma + 10
LECTURA
leer valor
ESCRITURA
ESTRUCTURAS DE CONTROL
si condición entonces
acciones
fin_si
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.
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;
sumanro1+nro2;
ESCRIBIR " ", nro1, "+", nro2, "="
,suma;
FIN
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
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 …”.
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
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”.
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)
MIENTRAS
mientras condición hacer
acciones
fin_mientras
PARA
para v desde vi hasta vf hacer con paso n
acciones
fin_para
Ejemplos
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
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
suma0
contador0
REPETIR
ESCRIBIR ‘ingrese dato:’
LEER dato
sumasuma + dato
contadorcontador + 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".
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
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.
x1 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
bandFALSO
SINO
x x*q
w w-1
FINSI
HASTA_QUE(band=FALSO)
ESCRIBIR “Resultado”, x
FIN
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
LECTURA
ESCRITURA
Do
repetir
{
acciones
acciones;
hasta_que condición
} while (condición);
MIENTRAS
para v desde vi hasta vf hacer con paso n hacer for (v=vi; v<=vf; v++)
acciones {
fin_para acciones; }
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;
}
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:
Utilizando cin y cout no es necesario especificar el tipo de dato que se imprimirá o leerá, asociándolo con un formato
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:
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.
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 {
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 {
suma0, contador0 int contador,dato;
REPETIR float promedio,suma;
ESCRIBIR ‘ingrese dato:’ char respuesta;
suma=0;
LEER dato
contador=0;
sumasuma + dato do
contadorcontador + 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
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.
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>
#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.
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.
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.
Codificación en C
#include <stream.h>
#include <stdlib.h>
main()
{
int num,fact;
cout << "Ingrese valor para el
cálculo: ";
cin >> num;
fact=factorial(num);
cout << "Resultado: " << fact <<
endl;
system("pause");
}
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.
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
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_areab * h / 2
FIN
{Programa Principal: llama al procedimiento Leer_datos y a la función Calculo_area}
INICIO
Leer_datos(base,altura)
areaCalculo_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;
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 enigmaZ
VARIABLES VARIABLES FIN
s:entero band: LOGICO
INICIO z1 (3)
s←0 INICIO PROCEDIMIENTO proc (E n:
MIENTRAS (y>0) bandx>=0 entero, E/S s: entero)
HACER MIENTRAS band HACER INICIO
y←y-1 SI (x=0) ENTONCES s←0
s←s+x bandFALSO 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.
#include<iostream>
#include<stdlib.h>
Using namespace std;
// 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));
}
{
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).
#include<iostream>
#include<stdlib.h>
Using namespace std;
// 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");
}
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.
∑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.
∑𝑛 𝑖
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.
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
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
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
Parámetro Condición
Acción
cantidad (cantidad=1)
Parámetro Condición
Acción
cantidad (cantidad=1)
2 FALSO Invocar Mostrar_Numeros(1)
Escribir cantidad = 2
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
Potenciaa
SINO
Potenciaa * 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 Potenciaa*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
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 Potenciaa,
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).
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
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
Í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
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");
}
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
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])
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)
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
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
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
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
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
constantes
D1=3, D2=2, D3=6
tipos
tridim=arreglo [1.. D1,1..D2,1..D3] de carácter
var
alfab:tridim
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
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.
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++;
}
}
}
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
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
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.
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
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 auxx
inicio xy
banderaVERDADERO yaux
mientras bandera hacer fin
banderaFALSO
para j desde 1 hasta ocup-1 hacer
si a[j]>a[j+1] entonces
cambio(a[j],a[j+1])
banderaVERDADERO
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.
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):
si a[j]<=a[k] entonces
j0
sino
cambio(a[j],a[k])
fin_si
jj-salto
fin_mientras
fin_para
saltosalto 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
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):
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):
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.
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 -
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.
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,
mercaderia.precio_producto12.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.dia28
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.dia28
empleado.t_fecha.dia28
t_persona.t_fecha.dia28
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.
vendedorempleado
En este caso, el valor de cada campo de empleado se copia en cada campo de vendedor.
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:
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
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
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
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.
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”.