Un tipo particular de problemas para el cual resulta adecuada la iteración es el procesamiento de secuencias de valores. Dra. Jessica Andrea Carballi jac@cs.uns.edu.ar Dpto. de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR Los valores pueden ser leís por consola o desde algún otro dispositivo (archivos por ejemplo, no se ven en esta materia). Cuan los valores se ingresan por consola es posible: Conocer la cantidad de valores antes de comenzar a leerlos. Utilizar un valor específico para indicar fin de la secuencia. Preguntarle al usuario, luego de leer cada valor, si desea ingresar otro. Problema: Leer una secuencia de n valores y calcular la suma de los cuadras de tos los valores. for i := 1 to n suma:= suma + sqr(v); end Consumir toda la cadena de n elementos. se conoce el número de valores que van a leerse. function sumasec(n: integer): integer; var suma, v: integer; for i := 1 to n suma:= suma + sqr(v); sumasec:=suma; Problema: Leer una secuencia de n valores y calcular la suma de los cuadras de tos los valores. program SumaDeCuadras; var i, n, v, suma: integer; write ( Ingrese la long. de la secuencia ); readln (n); for i := 1 to n suma := suma + sqr(v); Problema: Leer una secuencia de N números enteros y calcular la cantidad de veces que aparece el entero M. N y M son valores ingresas por el usuario inicialmente. Casos de prueba: N=5 M= 10 y la secuencia es 1 2 3 10 2 N=8 M=-1 y la secuencia es -1 2 3-1 -1 2 3-1 N=4 M=4 y la secuencia es 2 5 6 2 Cuáles son los datos de entrada? Cuáles son los datos de salida? Conocemos la cantidad de iteraciones? program contarensecuencia; {Lee una secuencia de N elementos enteros y cuenta cuantos son iguales a M con N y M leis previamente} var N, M, si, i, cont: integer; 1
write ('Ingrese el elemento a buscar: '); readln (M) ; cont := 0; write ('Ingrese una secuencia de ', N, ' enteros'); for i:=1 to N cont := cont+1; writeln (M, ' está ', cont, ' veces '); function vecesm(n, M: integer): integer; var veces: integer; veces:=0; for i := 1 to N if (v=m) veces:= veces+1; vecesm:=veces; Problema: Leer una secuencia de N números enteros y determinar si el entero M aparece al menos una vez. N y M son valores ingresas por el usuario inicialmente. Casos de prueba: N=5 M= 10 y la secuencia es 1 2 3 10 2 11 N=8 M=-1 y la secuencia es -1 2 3-1 -1 2 3-1 N=4 M=4 y la secuencia es 2 5 6 2 Conozco la longitud de la secuencia, uso un for?? write ('Ingrese el elemento a detectar: '); readln (M) ; esta := false; write ('Ingrese la secuencia de ', n, ' enteros'); for i:=1 to N read (si); esta:=true; SE CONOCE el número de valores que van a leerse pero puede suceder que NO NECESITEMOS leerlos tos para conocer la solución. write ('Ingrese el elemento a detectar: '); readln (M) ; esta := false; i:=1; write ('Ingrese la secuencia de ', n, ' enteros'); while (i<=n) and (not esta) read (si); i:=i+1; esta:=true; Puede suceder que no necesitemos consumir toda la secuencia. OPTIMIZAMOS!! Problema: Leer una secuencia de números enteros terminada en 0 y contar cuántos son múltiplos de n, con n positivo e ingresa previamente por el usuario. hayelem:=true; Mientras que haya elementos en la secuencia, contar :=0; while (hayelem) leo un elemento y si es múltiplo de n incremento el contar. Consumir toda la secuencia hasta llegar al 0. hayelem:=false if (si mod n = 0) contar := contar + 1; NO SE CONOCE el número de valores que van a leerse. program ContarMultiplosSecuencia; var si, contar, n: integer; hayelem: boolean; write ('Ingrese n '); readln (n); writeln( Ingrese la secuencia ); hayelem:=true; contar :=0; while (hayelem) hayelem:=false if (si mod n = 0) contar := contar + 1; writeln('cantidad de multiplos: ', contar); 2
fin:=false; contar := 0; while (not fin) OTRA FORMA fin:=true if (si mod n = 0) contar := contar + 1; Problema: Leer una secuencia de números enteros terminada en 0 y determinar si hay algún múltiplo de n, con n positivo e ingresa previamente por el usuario. hayelem:=true; encontre:=false; while (hayelem) and (not encontre) Puede no ser necesario consumir toda la secuencia hasta llegar al 0. Condición múltiple hayelem:=false if (si mod n = 0) econtre:=true; Problema: Leer una secuencia de números positivos terminada en 0 y obtener el mayor. El mayor es 19 read (numero) mayor := numero; mayor := numero; read (numero) mayor := numero; mayor := numero; while (numero <> 0) mayor := numero; end Considere la secuencia VACÍA Problema: A partir de los montos de un resumen bancario ingresas por tecla, computar el total de créditos (valores positivos) y de débitos (valores negativos). La secuencia termina en 0. program resumenbanco; var totcre, totdeb:integer; writeln( Ingrese los montos finalizan en 0. ); sumardyc(totcre, totdeb); writeln('creditos: ', totcre); writeln('debitos: ', totdeb); La sintaxis de la llamada a un procedimiento es siempre la misma, tanto para los procedimientos predefinis como para los definis por el programar. 3
Necesito recorrerla completa? NO SI 28/10/2016 Datos de salida = parámetros por referencia procedure sumardyc(var cc, cd: integer); var num :integer; cd:=0; cc:= 0; repeat readln(num); if (num < 0) cd := cd + num if (num > 0) cc := cc + num; until (num = 0); program p; var totcre, totdeb: integer; procedure sumardyc(var cc, cd: integer); var num :integer; cd:=0; cc:= 0; repeat readln(num); if (num < 0) cd := cd + num if (num > 0) cc := cc + num; until (num = 0); writeln( Ingrese los montos finalizan en 0. ); sumardyc(totcre, totdeb); writeln('creditos: ', totcre); writeln('debitos: ', totdeb); Problema: Leer una secuencia de números positivos terminada en 0 (que se considera elemento de la misma) y obtener el mayor y el menor elementos de la secuencia. Implemente un procedimiento para resolver este problema. Problema: Leer una secuencia de números positivos terminada en 0 y obtener la posición del mayor. Implemente una función para resolver este problema. El mayor es el 19 y el menor es el 2. La posición del mayor es 8 Preguntas que deberíamos hacernos antes de diseñar el algoritmo: La longitud de la secuencia, es conocida? Es necesario analizar tos los elementos de la secuencia para conocer el resulta? Si no es necesario, optimizamos!! SI for i:=1 to long i:=1; encontre:=false; while (i<=long) and (not encontre). i:=i+1; Conozco la longitud de la secuencia? fin:=false; while (not fin) NO fin:=false; encontre:=false; while (not fin) and (not encontre) 4
5