Introducción a la Programacion [T4.P2]
Introducción a la Programacion
Aunque hablamos de ella en la parte anterior, existen tres modelos de iteracion. Aunque en esencia sirven para lo mismo, y se pueden generar cualquiera de las tres con las dos opuestas, cada una tiene la particularidad de cuando se hace la comprobacion para salir fuera del bucle.
While (condicion = true) do x: En esta iteracion la condicion se escribe lo primero y se comprueba, luego se hace algo (o un cumulo de operaciones entre begin y end;).
repeat x until (y=true); En la iteracion se realiza una accion (o muchas mas sin el begin) y si es verdad, se detiene, si es falsa volvemos al inicio y repetimos todo, la parada está al final.
Iterar-Repetir: Esta no está integrada en pascal, consiste en una comprobacion intermedia, si es falsa, salimos del bucle, si es cierta proseguimos, se puede componer con las dos anteriores por lo que tecnicamente si se puede introducir en pascal.
ESQUEMAS ALGORITMICOS DE RECORRIDO
Un esquema algoritmico de recorrido consiste en recorrer toda una secuencia para conseguir el resultado final. Por ejemplo, si quisieramos contar las veces que aparece cierto nombre en una lista necesitamos recorrerla toda porque podría ser que el ultimo elemento fuera uno de los que buscamos.
Existen diferentes tipos de esquemas para los algoritmos de recorridos, teniendo en cuenta los elementos que podemos o no podemos tratar:
(H0,H1): Podemos tratar la secuencia vacía (solo marcafin) y el primer elemento como algo normal (contar el número de notas superior a cierto numero...).
(¬H0,H1): No podemos tratar a la secuencia vacía pero si al primer elemento como algo normal (contar ciertos numeros y si es una secuencia vacía decir que lo es pero no hacer nada mas).
(¬H0,¬H1): Ni el primer elemento ni la secuencia vacía son tratables como al resto de elementos.
Ejemplo: Calcular la suma consecutiva de una secuencia de enteros. Suponemos que si es vacia, lo informamos (por tanto aplciamos el segundo esquema de recorrido).
TratamientoInicial_Mse1(S);
if EA_Mse1(S) = Mse1_MarcaFin then WriteLn('La secuencia es vacía');
While (EA_Mse1(S) <> Mse1_MarcaFin) do
suma := suma + EA_Mse1(S);
WriteLn('La suma total de la secuencia es de: ',suma);
Ejemplo: Calculo de la meseta mayor de una secuencia. Donde una meseta es la serie de numeros iguales de forma consecutiva. Por ejemplo la meseta (2,2) es mas pequeña que la meseta (3,3,3). Supondremos que todos los datos ya vienen ordenados porque de lo contrario hacen mucho mas dificil los calculos.
Nota: Usaremos tres contadores, uno para guardar el primer valor del numero, inmediatamente el que tendremos para la meseta se incrementara en 1 si el siguiente elemento coincide y meteremos dicho valor en el contador de mesetas, reseteamos el segundo y volvemos a lo mismo. Si la segunda meseta es mas grande que la primera, el contador de mesetas (tercera variable, será sustituida).
valor,meseta,mayor:Integer;
TratamientoInicial_Mse1(S);
if EA_Mse1(S) = Mse1_MarcaFin then WriteLn('Secuencia vacía');
While EA_Mse1(S) <> Mse1_MarcaFin then
if valor <> EA_Mse1(s) then //¿que pasa si no es igual al siguiente?
valor := EA_Mse1(S); //el valor es el nuevo
if (meseta > max) then max := meseta; // la meseta será la nueva si la supera
meseta := 1; //reseteamos la siguiente meseta
WriteLn('El valor maximo de la meseta es: ',max);
Ejemplo: Calculo del numero máximo de una secuencia de enteros.
TratamientoInicial_Mse1(S);
if (EA_Mse1(S) = Mse1_MarcaFin) then Write('La secuencia es vacía');
while (EA_Mse1(S) <> Mse1_MarcaFin) then
if (EA_Mse1(S) > max) then max := EA_Mse1(S);
WriteLn('El numero máximo es: ',max);
ESQUEMAS ALGORITMICOS DE BÚSQUEDA
A diferencia del recorrido, la busqueda puede terminar -ademas de si es la marca de fin- cuando se cumple una o mas condiciones. Por tanto el esquema básico es el siguiente. En cualquier otro caso se aplican las mismas conciciones que con el esquema de busqueda.
While EA_Mse1(S) <> Mse1_MarcaFin & NO Condicion1...
SEGUNDO MODELO DE ACCESO SECUENCIAL
Como diferencia entre el primer modelo y el segundo, hay una serie de caracteristicas que os hacen optimos para diferentes problemas. En pascal la unica diferencia es la estructura de la secuencia, dado que podremos seguir haciendo busquedas y recorridos como en el primer modelo de acceso secuencial.
El primer elemento no está disponible cuando se inicia el acceso (¬DP).
El final del recorrido no se detecta cuando avanzamos y llegamos a la marca de fin sino cuando se está en el ultimo elemento válido (¬FS) por lo que necesitaremos una funcion que nos diga si es el ultimo elemento o no (y no marca de fin).
EsVacía(S) -> devuelve un valor booleano
EsUltimo(S) -> devuelve un valor booleano.
EJEMPLOS DE ESQUEMAS DEL S.A.S
Ejemplo: Realice la media aritmética con el primer y el segundo esquema del segundo modelo de acceso secuencial.
TratamientoInicial_Msr2(S);
While not EsVacía_Msr2(S) do
if (cont = 0) then WriteLn('Secuencia vacía')
else WriteLn('La media aritmetica es: ',suma/cont);
TratamientoInicial_Msr2(S);
if EsVacía_Msr2(S) then WriteLn('Secuencia S es vacía')
suma := suma + EA_Msr2(S)
WriteLn('La media aritmetica es: ', suma/cont);
Ejemplo: Averigue si el texto está blanco o contiene algun caracter haciendo uso del 2 ssistema de acceso secuenial con el tercer esquema (¬H0, ¬H1)
TratamientoInicial_Msc2(S);
if EsVacía_Msc2(S) then WriteLn('La secuencia es vacía')
until (EA_Msc2(S) <> ' ') or (EsUltimo_Msc2(S));
if (EA_Msc2(S) <> ' ') then WriteLn('El texto no es blanco')
else WriteLn('El texto es blanco');