Anda di halaman 1dari 64

Ciclos y

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

Nombre_Tipo = TIPO Secuencia de


Tipo_Base
SC = TIPO Secuencia de Carácter
SR = TIPO Secuencia de Real
Comenzar (S), Avanzar (S), EA (S),
Crear(S), Registrar (S, e), Marcar (S)
PROBLEMA: Dada una secuencia con solo ceros y unos, calcular el número de ceros y
unos que contiene.

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

Escriba algoritmos que :


1. Dado un numero entero en pesos lo
desglose según los billetes legales.
2. Dado un numero entero <= 106
descomponerlo en dd hh mm ss.
LEXICO
B100, B50, B20, B10, B5, B2, Monedas, Num : Entero;
MAXIMO = 65000;
Leer(Num)
MIENTRAS Numero > 0 HACER
SEGÚN Num
Num 100 .. MAXIMO : B100Num Div 100; NumNum – B100*100;
Num 50 .. 99 : B50Num Div 50; NumNum – B50*50;
Num 20 .. 49 : B20Num Div 20; NumNum – B20*20;
Num 10 .. 19 : B10Num Div 10; NumNum – B10*10;
Num 5 .. 9 : B5Num Div 5; NumNum – B5*5;
Num 2 .. 4 : B2Num Div 2; NumNum – B2*2;
Num 1 : Monedas = 1; Num = 0;
FIN_SEGUN
FIN_MIENTRAS
LEXICO
DD, HH, MM, SS; Num : Entero;
MAXIMO = 1000000;
Leer(Num)
MIENTRAS Numero > 0 HACER
SEGÚN Num
Num 86400..MAXIMO : DDNum Div 86400; NumNum – DD*86400;
Num 3600..86399 : HHNum Div 3600; NumNum – HH*3600;
Num 60.. 3599 : MMNum Div 60; NumNum – MM*60;
Num 1 .. 59 : SS = Num; Num = 0;
FIN_SEGUN
FIN_MIENTRAS
Otras Composiciones
Iterativas Condicionales
Composición REPETIR

REPETIR
S
HASTA_QUE COND

Composición ITERAR

ITERAR
S1
DETENER: cond
S2
FIN_ITERAR
Composicion PARA

Permite expresar el numero de veces


que se ejecuta el cuerpo del ciclo.
Este numero esta expresado por el
recorrido de un intervalo de valores de
tipo ordinal.
Composicion PARA
Esquema General
PARA i [j,n]HACER
S
I es un ordinal, j y n
FIN_PARA; representan el valor
inicial y final del
intervalo.
PARA i [n,j](-)HACER
CR = n – i + 1
S
FIN_PARA;
PROBLEMA:Calcular Valor medio de una secuencia de numeros

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

El flujo de controlde una funcion


recursiva requiere tres condiciones para
una terminacion normal:
1 Un test para detener o continuar con la
recursion.
2 una llamada recursiva para continuar la
recursion
3 un caso base para terminar la recursion
A tener en cuenta

Define el problema en terminos de un


problema mas simple de la misma
naturaleza.
Debe disminuir el espacio del problema
en cada llamada recursiva
Hay una instancia particular que se
conoce como caso base o caso
degenerado
Iteracion vs Recursion
Considerar solucion recursiva solo si una solucion iterativa
sencilla no es posible.
Solo utilice recursividad dentro de limites aceptables de
ejecucion y uso de memoria.
Si son posibles las soluciones iterativas y recursivas esta
ultima requerira mas tiempo y mas recursos de memoria.
En ciertos problemas la recursion produce soluciones mas
simples de leer. Los beneficios de la claridad compensan el
costo extra
Ambas implican repeticion. iteracion explicitamente y
recursion con llamadas repetidas.
Ambas consideran un test de salida. Iteracion en la
condicion, recursividad en el caso base
Ejemplo
Factorial (dato N : Entero) Entero : Funcion
ALGORITMO
SI N = 0
Entonces
Factorial = 1
SI_NO
Factorial = N * Factorial (N – 1)
FIN_SI
FIN.
Datos de tipo estructurado

Hemos trabajado con tipos que definen un


dominio de valores simples o atomico.
Datos de tipo estructurado.
 Compuestos por mas de un dato.
 Divisible en datos mas elementales.

 Unico nombre para todo el conjunto.

 Acceso directo a cada miembro del conjunto.


Tipo Registro
Compuesto por una enumeracion de
otros valores de tipo ya definidos.
El termino campo refire a cada
elemento del registro.
El operador de acceso a cada miembro
es el operador . (punto).
NombreEstructura.NombreCampo.
La cardinalidad de un tipo es el numero
de valores de su dominio.
Definicion de tipos
LEXICO
NombreDelTipo = TIPO <c1 : Td1;
c2 : Td2;
.............
cn : tdn >;
Punto = TIPO <abs: Real ; ord: Real>
Asignación
Interna:
 Campo campo
 Estructura completa (de igual tipo);

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

CalcularImprimirPromedio(Dato Matriz : TME) : una accion


LEXICO
i , j , Total : Entero;
ALGORITMO
Total = 0;
PARA i[1,COLUMNAS HACER
PARA j[1,FILAS] HACER
Total = Total + Matriz[i, j] ;
FIN_PARA
FIN_PARA
Escribir (“El pomedio es : “,Total / Columnas / Filas
FIN //accion ImprimirMatrizPorColumna
CargarVectorMaxFil(Dato Resultado Vector : TVM; Dato Matriz:TME) :
una accion
LEXICO
i , j, : Entero;
ALGORITMO
PARA i[1,COLUMNAS] HACER
Vector[i] = Matriz[i, 1];
PARA j[2,FILAS] HACER
SI Matriz[i, j] > Vector[i]
ENTONCES
Vector[i] = Matriz[i, j]
FIN_SI
FIN_PARA
FIN_PARA
FIN //accion CargarVectorMaxFil
MostrarVectorMaxFil(Dato Vector : TVM) : una accion
LEXICO
i : Entero;
ALGORITMO
PARA i[1,COLUMNAS] HACER
Escribir(“Fila : “, i,“Valor maximo : ”,Vector[i]);
FIN_PARA //accion MostrarVectorMaxFil

ALGORITMO // Algoritmo principal


CargarMatrizPorFila(MATRIZA);
ImprimirMatrizPorColumna(MATRIZA);
CalcularImprimirPromedio(MATRIZA);
CargarVectorMaxFil(MATRIZA, VECMAXFIL);
MostrarVectorMaxFil(VECMAXFIL);
FIN
Ejercicios
Ingresar un valor N = 20 y luego por filas una
matriz cuadrada CUADRA de N filas y columnas.
Desarrollar un programa que determine e
imprima:
Todos los elementos de la diagonal principal o
secundaria según de cual resulte mayor la
sumatoria de elementos.
Los elementos del cuarto (N/2 filas y N/2
columnas) cuya sumatoria resulte mayor
(considerando que N es par).
Los elementos de la triangular superior o inferior
dependiendo de cual tenga mayor sumatoria
de elementos.
ARCHIVOS

Colección de datos almacenada en unidad


externa, por ejemplo disco que se asocia con
un nombre.
Puede ser de texto o binario.
El acceso puede ser secuencial o indexado.
Operaciones con archivos
Asignar(a,s)
Abrir(a)
Crear(a)
Cerrar(a)
Leer(a,d)
Escribir(a,d)
CantElemntos(a)
PosActual(a)
FinArchivo(a)
Acceder(a,p)
Definiciones de tipos

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;

FIN. // Busqueda maximo En Vector


Carga sin Repeticion
CargaSinRepetirEnVectorV1(Dato_Resultado V:
Tvector; Dato_Resultado N: Entero; Dato
Clave:Tinfo; Dato_resultado Posic: Entero;
Dato_resultado Enc : Booleano): 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, o donde lo inserta si
no esta. Retorna 0 (cero) en caso que el vector esta completo y no
encuentra el valor buscado
Enc : Retorna True si estaba y False si lo inserto con esta invocacion
Carga vector sin orden
LEXICO
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 > MAX_FIL
ENTONCES
Posic = 0
SI_NO
Posic = j:
SI (j > N)
ENTONCES
Enc =FALSE; // No encontro la clave buscada
Inc(N);
V[N] = Clave;
SI_NO
Enc = True // Encontro la clave en la posicion de indice j
FIN_SI;
FIN_SI
FIN. // Carga sin repetir en vector
Busqueda Binaria
BusquedaBinariaEnVectorV1(Dato V: Tvector; Dato
N: Entero; Dato Clave:Tinfo; Dato_resultado
Posic: Entero; Dato_resultado Pri : Entero): una
acccion

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;

FIN. // Busqueda binaria en vector


ALGORITMO // Version con clave repetida 1ra ocurrencia de la clave
Posic = 0; Pri = 1; U = N;
MIENTRAS (Pri < U ) HACER
M = (Pri + U ) div 2
SI V[M] = Clave
ENTONCES
Posic = M;
U = M;
SI_NO
SI Clave > V[M]
ENTONCES
Pri = M+1
SI_NO
U=M–1
FIN_SI
FIN_SI
FIN_MIENTRAS;

FIN. // Busqueda binaria en vector


Carga Sin repetir V2
ALGORITMO
Enc = True;
BusquedaBinariaEnVectorV(V; N; Clave; Posic; Pri)
SI (Posic = 0)
ENTONCES
Enc = False ;
Posic = Pri;
PARA j [N, Pri](-) HACER
V[j+1] = V[j];
FIN_PARA;
V[Pri] = Clave;
Inc(N);
FIN_SI
FIN. // Carga sin repetir con vector ordenado
Ordenamiento Vector
OrdenarVectorBurbuja(Dato_Resultado V:
Tvector; Dato N: Entero): una acccion

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

Anda mungkin juga menyukai