Estructuras en
Programación
Máquina de acceso secuencial
Una secuencia es una colección de
elementos del mismo tipo.
Pueden representarse de diferentes
formas. Para acceder al elemento de la
posición p, hay que recorrer los p-1
elementos anteriores.
El recorrido termina cuando se alcanza
la marca de fin de secuencia.
Primitivas para el
acceso secuencial
LÉXICO
S: Secuencia de carácter;
NumCeros, NumUnos : Entero;
ALGORITMO
NumCeros = 0; NumUnos = 0;
Comenzar (S);
MIENTRAS EA (S) < > MarcaFin HACER
SI EA (S) = ‘0’ ENTONCES numCeros = numCeros + 1
SI_NO numUnos = numUnos + 1
FIN_SI;
AVANZAR (S)
FIN_MIENTRAS;
Escribir(“Ceros = ” , numCeros,unos = ” , numUnos)
FIN
Componentes de una
iteración
Inicialización: instrucciones que se ejecutan
para inicializar las variables que participan de
la iteración.
Condición de terminación: expresión
booleana que determina cuando acaba la
iteración.
Cuerpo: conjunto de instrucciones que se
ejecutan mientras no se cumple la condición
de terminación.
Finalización: conjunto de instrucciones que
deben ejecutarse cuando la iteración termina.
Composiciones
iterativas condicionales
Se presentan tres composiciones iterativas en las
que la finalización viene determinada por una
condición.
Estas son la composición MIENTRAS, REPETIR,
ITERAR.
Lo que las diferencia es el lugar donde se
comprueba la condición: al principio, al final, en
un punto intermedio del ciclo. Y también si es una
condición de terminación o de continuación.
Diseño iterativo: noción
de invariante
El invariante de un ciclo, INV, es una
condición que se cumple al inicio y a
cada paso de la iteración. Cuando
finaliza la iteración, el hecho de que se
satisfaga el invariante y la condición de
terminación implica que se alcanzó la
solución.
Pasos para una solucion
iterativa
Dada una especificación de un problema de
recorrido de secuencias, la estrategia de una
solución iterativa consta de los siguientes
pasos:
1. Identificar qué variables son necesarias a
partir de la poscondición.
2. Establecer el invariante del ciclo.
3. Aplicar un razonamiento inductivo.
4. Escribir el algoritmo iterativo.
Composicion MIENTRAS
Esquema General
Aini;
//E0
MIENTRAS Cc HACER
//Ek
Acuerpo
//Ek+1
FIN_MIENTRAS;
//En
Afin
EJERCICIO
Dado un conjunto de valores enteros,
calcular e imprimir : promedio de los
valores positivos, sumatoria de
negativos. El lote termina cuando se
ingresa un valor cero.
LEXICO
SumaPos, CanPos, SumaNeg, Numero : Entero;
ALGORITMO
SumaPos 0; CanPos 0; SumNeg 0;
Leer(Numero);
MIENTRAS Numero <> 0 HACER
SI Numero > 0
ENTONCES
Inc(CanPos); SumaPos = SumaPos + Numero;
SI_NO
SumaNeg = SumaNeg + Numero
FIN_SI
FIN_MIENTRAS;
Escribir(SumaPos, SumaNeg);
FIN.
Otros Ejemplos
REPETIR
S
HASTA_QUE COND
Composición ITERAR
ITERAR
S1
DETENER: cond
S2
FIN_ITERAR
Composicion PARA
LÉXICO
S : Secuencia de Real;
Suma : Real;
NumElem : Entero;
ALGORITMO
Comenzar (S);
Suma = 0;
NumElem = 0;
//Eini : suma = 0 y numElem = 0 y ea = Primero (S) y INV
= verdadero
ALGORITMO
MIENTRAS EA (S) < > MarcaFin HACER
suma = suma + EA (S)
numElem = numElem + 1
Avanzar (S)
FIN_MIENTRAS;
//Efin : INV y (EA (S) = MarcaFin)
SI numElem > 0
ENTONCES Escribir(“Valor medio de las
notas = ”, suma/num)
SI_NO Escribir(“Secuencia Vacía”)
FIN_SI
FIN
EJERCICIOS
Dado un conjunto de valores enteros, calcular e
imprimir : cuantos valores cero hubo, promedio de
los valores positivos, sumatoria de negativos
Resolver el problema para :
100 valores enteros.
N valores, N debe ser leído previamente.
El conjunto termina con un valor igual al anterior.
Se dan N valores, pero el proceso deber finalizar si
se procesan todos los valores o la cantidad de
ceros supera a cuatro.
Ejercicios
Dado un conjunto de triángulos representados por
sus lados L1, L2 y L3 que finaliza con un triángulo
con un lado nulo, determinar e imprimir la
cantidad de triángulos equiláteros, isósceles y
escalenos.
Dados dos valores N y M determinar e imprimir
cuantos múltiplos de M hay dentro del conjunto 1
a N.
Dados dos valores enteros A y B determinar e
imprimir el producto de ambos obtenido por
sumas sucesivas.
Dado un valor M, determinar e imprimir los M
primeros múltiplos de 3 que no lo sean de 5,
dentro del conjunto de números naturales.
Trabajo Practico obligtorio
TP1
Ejercicios 2, 3, 10, 11 y 12
TP2
Ejercicios 2, 3 y 5
TP3
Ejercicios 1, 3, 4, 6 y 8
TP4
Ejercicios 8, 9, 10 y 11
La presentación será individual, utilizando la notación algoritmica desarrollada
en el curso, debe incluir:
•Caratula con datos del estudiante y fecha presentacion
•Enunciado, Lexico y algoritmo.
Debe enviarse via a correo electronico y antes de la ultima clase.
Recursividad
Una funcion con sentencias entre las
cuales se encuentra una llamada a si
misma se dice que es recursiva.
Divide el problema original en
subproblemas mas pequeños. Cuando es
lo suficientemente chico se resuelve
directamente y se combinan soluciones
del subproblema hasta que queda resuelto
el problema.
Requerimientos
Externa
De entrada - salida
Campo a campo (dispositivo std)
Estructura completa (otro dispositivo)
Tablas
Los lenguajes de programacion usan el termino
array para referirse a tablas.
Permite almacenar colección de valores y asociar
un indice a cada valor almacenado.
Es posible el acceso indexado.
Son posiciones contiguas de datos homogeneos y
de tamaño fijo.
El operador de acceso es [ ].
Cada subordinacion incrementa la dimension.
Tamaño logico y fisico.
Declaraciones
NombreTipo = TIPO Tabla [li, lf] de
TipoBase
TVR = TIPO Tabla [1, 100] de Real
La variacion del indice determina la
cantidad de elementos, el tipoBase de
que tipo es cada componente.
TR = TIPO <absc : Real; ord : Real>
TVR = TIPO tabla [1, 50] de TR
Tabla : TVR
Operaciones basicas
Asignacion
Interna (por elemento o por estructura)
Externa de entrada o salida
Por elemento
Por estructura completa
Acceso directo
Recorrido
Busqueda Secuencial Binaria Directa
Ordenamiento
ESQUEMA DE
RECORRIDO
PARA i [li, ls] HACER
// INV = V f(i)
FIN_PARA
Tablas vs Registros
Registro permite agrupar datos no
homogeneos, la tabla homogeneos.
Las tablas permiten el acceo directo a
sus miembros por un indice y los
registros por el operador punto.
En un registro el numero de miembros
lo de sus campos en una tabla el
intervalo de los indices.
Ejercicios
Ingresar un valor N (< 25). Generar un arreglo
de N componentes en el cual las mismas
contengan los primeros números naturales
pares e imprimirlo.
Ingresar un valor entero N (< 30) y a
continuación un conjunto de N elementos. Si
el último elemento del conjunto tiene un valor
menor que 10 imprimir los negativos y en caso
contrario los demás.
Ingresar un valor entero N (< 25). A
continuación ingresar un conjunto VEC de N
componentes. Si la suma de las componentes
resulta mayor que cero imprimir las de índice
par, sino las de índice impar.
Tablas Multidimensionales
Si una tabla representa una funcion de un
argumento las tablas multidimensionales
representan una funcion de n argumentos,
uno por cada dimension.
Se utilizan para representar colecciones de
objetos de la misma naturaleza a los que se
puede acceder mediante un conjunto de
indices.
La nocion matematica de matriz se puede
representar mediante un atabla de dos
dimensiones.
Declaraciones
NombreTipo = TIPO Tabla [fi, fj; ck,cl]
de TipoBase
TTR = TIPO Tabla [1, 100; 1,10] de
Real
El producto del intervalo de sus indices
determina la cantidad de elementos, el
tipoBase de que tipo es cada
componente.
El tipo puede ser primitivo o derivado.
ESQUEMA DE RECORRIDO
INV = T
PARA i [1, nfilas] HACER
INV = T
A = f(fila(i))
PARA j [1, ncol] HACER
INV = T
A = f(fila(i),col(j)
FIN_PARA
FIN_PARA
Ejercicios
Ingresar dos valores, M = 30 y N = 25. A
continuación por filas todos los componentes
de una matriz MATRIZA de M filas y N
columnas. Desarrollar un programa que:
Imprima la matriz MATRIZA por columnas.
Calcule e imprima el valor promedio de los
componentes de la matriz.
Genere e imprima un vector VECMAXFIL
donde cada componente sea el valor
máximo de cada fila.
Ejemplo
LEXICO
FILAS = 30; COLUMNAS = 25;
TVM = TIPO Tabla [1, COLUMNAS] de Entero // Vector de maximos
TME = TIPO Tabla [1, FILAS; 1,COLUMNAS] de Entero;
MATRIZA : TME; VECMAXFIL : TVM; Promedio : Real;
CargarMatrizPorFila(Dato Resultado Matriz : TME) : una accion
LEXICO
i , j : Entero;
ALGORITMO
PARA i[1,FILAS] HACER
PARA j[1,COLUMNAS] HACER
Leer(Matriz[i, j];
FIN_PARA
FIN_PARA
FIN //accion CargarMatrizPorFila
ImprimirMatrizPorColumna(Dato Matriz : TME) : una accion
LEXICO
i , j : Entero;
ALGORITMO
PARA i[1,COLUMNAS HACER
PARA j[1,FILAS] HACER
Escribir(Matriz[i, j];
FIN_PARA
FIN_PARA
FIN //accion ImprimirMatrizPorColumna
MAX_FIL = 100;
Tinfo = TIPO Entero;
TinfoC = TIPO <C1 : Td1, C2 : Td2>
TVector = TIPO Tabla [1,MAX_FIL] de
Tinfo;
Busqueda Secuencial
BusqSecEnVector(Dato V: Tvector; Dato N:
Entero; Dato Clave:Tinfo; Dato_resultado
Posic: Entero): una acccion
LEXICO
Pre: V: Vector en el que se debe buscar
Clave : Valor Buscado
N : Tamaño logico del vector
Pos:Posic: Posicion donde se encuentra la
clave, 0 ( Cero) si no esta.
j : Entero;
ALGORITMO
Posic = 0;
J = 1;
MIENTRAS (j <= MAX_FIL y j <= N y V[j] <>
Clave) HACER
Inc (j)
FIN_MIENTRAS;
SI (j > N)
ENTONCES
Posic =0 // No encontro la clave buscada
SI_NO
Posic = j // Encontro la clave en la posicion de indice
j
FIN_SI;
FIN. // Busqueda secuencial En Vector
Buscar Máximo
BusqMaxEnVector(Dato V: Tvector; Dato N:
Entero; Dato_resultado Maximo :Tinfo;
Dato_resultado Posic: Entero): una acccion
LEXICO
Pre: V: Vector en el que se debe buscar
N : Tamaño logico del vector
Pos: Posic: Posicion donde se encuentra el maximo
Maximo : Valor maximo del vector.
j : Entero;
ALGORITMO
Posic = 1;
Maximo = V[1];
PARA j [2, MAX_FIL] HACER
SI (v[j] > Maximo)
ENTONCES
Posic = j;
Maximo = v[j];
FIN_SI;
FIN_PARA;
LEXICO
Pre: V: Vector en el que se debe buscar con clave sin repetir
Clave : Valor Buscado
N : Tamaño logico del vector
Pos: Posic: Posicion donde se encuentra la clave, o 0 (cero) si no esta
Pri : Retorna la posicion del limite inferior
J,u,m : Entero;
ALGORITMO
Posic = 0; Pri = 1; U = N;
MIENTRAS (Pri < = U y Pos = 0) HACER
M = (Pri + U ) div 2
SI V[M] = Clave
ENTONCES
Posic = M;
SI_NO
SI Clave > V[M]
ENTONCES
Pri = M+1
SI_NO
U=M–1
FIN_SI
FIN_SI
FIN_MIENTRAS;
LEXICO
Pre: V: Vector en el que se debe ordenar
N : Tamaño logico del vector
Pos: Vector ordenado por clave creciente
I,J, : Entero;
Aux : Tinfo;
ALGORITMO // Metodo burbuja
PARA i [1, N - 1] HACER
PARA j [1, N - i] HACER
SI (v[j] > v[j + 1])
ENTONCES
Aux = v[j];
V[j] = v[j + 1];
V[j + 1] = Aux;
FIN_SI;
FIN_PARA;
FIN_PARA;
FIN
ALGORITMO // Metodo burbuja mejorado
j = 0;
REPETIR
Inc (j); Ord = True:
PARA j [1, N - i] HACER
SI (v[j] > v[j + 1])
ENTONCES
Aux = v[j];V[j] = v[j + 1];
V[j + 1] = Aux; Ord = False;
FIN_SI;
FIN_PARA;
HASTA_QUE ( J = N – 1 o Ord);
FIN
N Mejores
ALGORITMO
SI (N < MAX-FIL)
ENTONCES
Inc (N);
V[n] = Clave
SI_NO
BusqMaxEnVector(V,N, Maximo, Posic);
SI (Clave > Maximo)
ENTONCES
V[Posic] = Clave;
FIN_SI;
FIN_SI;
FIN. // Carga los N mejores en vector
Ejemplo
LEXICO
TVE = TIPO Tabla [1, 100] de Entero;
Tabla : TVE;
i, N : Entero;
ALGORITMO
REPETIR // leer tamaño logico del vector
Leer(N);
HASTA_QUE (N > 0 y N <= 25);
PARA i[1,N] HACER // Cargar vector hasta tamaño logico
Tabla[i] = 2 * i;
FIN_PARA
PARA i[1,N] HACER
Escribir(Tabla[i]); //Muestra contenido del vector
FIN_PARA
FIN