Temas:
Es importante conocer estos patrones de programación porque son muy útiles para concebir nuevos programas. Ellos resuelven problemas conocidos sin tener que re-inventar soluciones para esos problemas una y otra vez.
Un ejemplo de estos patrones de programación es la acumulación. Este patrón se usa para realizar cálculos como la suma de varios valores calculados en las iteraciones de un ciclo:
La forma general de este patrón es:
Ejemplos:
``tipo'' ``variable'' = ``valor inicial'';
...
while ( ... ) {
...
``variable'' = ``variable'' ``operador'' ``expresión'';
...
}
? 4.0
? 5.0
? 6.0
? 0.0
Contador= 3
Observe la similitud de esta solución con la que calcula
la suma de las notas.
int cont= 0; double suma= 0.0;
double nota;
print("? ");
nota= readDouble();
while (nota!=0.0) {
cont= cont+1; suma= suma + nota;
print("? ");
nota= readDouble();
}
print("Contador= "); print("Suma= ");
println(cont); println(suma);
? 4.0
? 5.0
? 6.0
? 0.0
Promedio= 5.0
En este programa se presenta también el patrón de lectura de datos. Su
forma general es:
double suma= 0;
int cont= 0;
double nota;
print("? ");
nota= readDouble();
while (nota!=0.0) {
suma= suma+nota;
cont= cont+1;
print("? ");
nota= readDouble();
}
print("Promedio= ");
println(suma/cont);
Típicamente marcaremos el fin de los datos con un cero o -1.
``tipo'' ``variable'';
...
``variable''= read``tipo''();
while ( ... ) {
...
``variable''= read``tipo''();
}
? 4
1
2
3
4
Acá, el programa termina cuando la variable i excede en valor a n.
En realidad, estamos acá en presencia de otro patrón muy utilizado:
recorrido de un intervalo de enteros. Su forma general es:
print("? ");
int n= readInt();
int i= 1;
while (i<=n) {
println(i);
i= i+1;
}
La variable i toma valores entre [``valor inicial'',``valor final''],
incrementándose en 1 en cada iteración.
int i= ``valor inicial'';
while ( i <= ``valor final'' ) {
...
i= i + 1;
}
Definición matemática:
O informalmente:
Solución: al programa anterior le agregamos el producto de los valores sucesivos que toma la variable i en cada iteración. Para hacer el cálculo usamos el patrón acumulación con el operador *.
print("? ");
int n= readInt();
double fact= 1.0;
int i= 1;
while (i<=n) {
fact= fact*i;
i= i+1;
}
print("El factorial es ");
println(fact);
Ejercicio: Calcular exp(x) por medio de la siguiente aproximación.
El siguiente programa calcula i! al mismo tiempo que calcula x^i.
Observe que en la i-ésima iteración, la variable xi es x^i
y facti es i!.
double xi= 1.0;
double facti= 1.0;
int i= 1;
while (i<=n) {
xi= xi*x;
facti= facti*i;
i= i+1;
}
A este programa podemos agregarle una acumulación de xi/facti:
Ahora basta desplegar el resultado final con la instrucción:
double x= ...; // Obtener x y n
int n= ...;
double xi= 1.0;
double facti= 1.0;
double expx= 1.0;
int i= 1;
while (i<=n) {
xi= xi*x;
facti= facti*i;
expx= expx + xi/facti;
i= i+1;
}
println(expx);
Tarea:
Haga un programa que lea varios números positivos (terminados con un -1) e indique en qué rango se encontraban (exceptuando el -1). El diálogo debe ser:
? 5
? 3
? 20
? 10
? -1
El rango es [3,20]