lunes, 11 de abril de 2011

CICLOS REPETITIVOS

CCICLOS
 Los ciclos sirven para repetir la ejecución de una sentencia o bloque de sentencias. Aquí veremos la implementación de dichas estructuras de control en C.
WHILE

MIENTRAS:


El CICLO MIENTRAS ejecuta un bloque de acciones ‘mientras’ que una condición dada se cumpla, es decir, cuando la condición evalúa a verdadero. La condición es evaluada antes de ejecutar el bloque de acciones y si la condición no se cumple, el bloque no se ejecuta. De esta manera es que el número de repeticiones del bloque de acciones sea cero, pues, si la condición la primera vez evalúa a falso, el bloque no será ejecutado alguna vez. La forma general del ciclo mientras es la siguiente:

Código:

mientras (condición) hacer

      <bloque de instrucciones>

  fin_mientras


Donde, (condición) es la condición que determina si el bloque de accioneses ejecutado o no. Si la condición evalúa a verdadero el bloque es ejecutado y si evalúa a falso no es ejecutado. Después de ejecutar el bloque de acciones se vuelve a evaluar la condición.






EJEMPLO 1.

Dado un número natural n se desea calcular la suma de los números naturales desde 1 hasta n.

PROCEDIMIENTOS:
Objetos Conocidos un número natural.

Objetos Desconocidos Un número natural.

Condiciones El número buscado es la suma de los naturales empezando en cero hasta el número dado.

ESPECIFICACIÓN:

Entradas n Î Enteros, (n es el número dado).

Salidas suma Î Enteros, (suma es la suma de los primeros n números naturales).

Condiciones


DISEÑO:

Primera Iteración:

1. Leer el número

2. Recorrer los números desde el cero hasta el número dado e irlos sumando.

3. escribir la suma


 FOR

ciclo para, es una estructura de control en la que se puede indicar el número máximo de iteraciones. Está disponible en casi todos los lenguajes de programación imperativos.

Variable de control: prácticamente un mandato impuesto por el uso habitual es utilizar la letra i como variable de control, o bien sus sucesoras en caso de bucles anidados. El uso de esta letra críptica quizás a primera vista es sin embargo una excelente forma de aportar agilidad de lectura al código por su uso tan extensivo. Como raras veces los bucles anidados superan las tres dimensiones (por una sencilla cuestión de explosión exponencial), las letras i, j y k suelen ser las únicas relacionadas con este uso. En C se define en el primer parámetro de la instrucción junto con la inicialización (opcional).

Inicialización de la variable de control: en pseudolenguaje se pide explicitarlo (es la sección := ValorInicial), sin embargo, otros lenguajes más permisivos como C no lo requieren de forma obligatoria. De todos modos, la práctica de utilizar variables de control que no se inicializan en el bucle no es recomendada para la legibilidad del código. En C se define en el primer parámetro del bucle junto con la variable de control.
Condición de control: en pseudolenguaje se ve representado por el valor final que puede tomar la variable de control (la sección A ValorFinal). En C es el segundo parámetro y puede ser cualquier condición (ni siquiera es obligación que esté la variable de control, aunque una vez más, esto no se considera una buena práctica).

Incremento: en pseudolenguaje se toma por defecto el valor 1, aunque puede explicitarse por medio de la sentencia PASO = ValorPaso cualquier número entero (léase bien entero, o sea que técnicamente podemos decrementar). En C es el último parámetro.
Cuerpo: es lo que se hará en cada iteración, pueden ser una o más instrucciones. En pseudolenguaje pesa la restricción de no poder alterar el valor de la variable de control; esto no es requerido en C, pero no se considera una buena práctica.
Combina en una sentencia la definición de un ciclo repetitivo.
Para el caso del tipo de cambio, el código fuente será:

for (int i=1; i<=10; i++) { 
System.out.println(i*3.5);
}

La inicialización y la iteración puede ser compuesta.

for (int i=0, j=10; i<j; i++, j--) { 
System.out.println(j-i);
}

Se pueden crear bucles infinitos.

for (;;) { 
System.out.println("Hola mundo!");
}
DO WHILE
La estructura do while es otra estructura repetitiva, la cual ejecuta al menos una vez su bloque repetitivo, a diferencia del while o del for que podían no ejecutar el bloque.
Esta estructura repetitiva se utiliza cuando conocemos de antemano que por lo menos una vez se ejecutará el bloque repetitivo.
La condición de la estructura está abajo del bloque a repetir, a diferencia del while o del for que está en la parte superior.

Representación gráfica:
El bloque de operaciones se repite MIENTRAS que la condición sea Verdadera.
Si la condición retorna Falso el ciclo se detiene. En Java, todos los ciclos repiten por verdadero y cortan por falso.
Es importante analizar y ver que las operaciones se ejecutan como mínimo una vez.

Problema 1:

Escribir un programa que solicite la carga de un número entre 0 y 999, y nos muestre un mensaje de cuántos dígitos tiene el mismo. Finalizar el programa cuando se cargue el valor 0.

Diagrama de flujo:

No hay que confundir los rombos de las estructuras condicionales con los de las estructuras repetitivas do while.
En este problema por lo menos se carga un valor. Si se carga un valor mayor o igual a 100 se trata de un número de tres cifras, si es mayor o igual a 10 se trata de un valor de dos dígitos, en caso contrario se trata de un valor de un dígito. Este bloque se repite hasta que se ingresa en la variable valor el número 0 con lo que la condición de la estructura do while retorna falso y sale del bloque repetitivo finalizando el programa.

Programa:

import java.util.Scanner;
 
public class EstructuraRepetitivaDoWhile1 {
    public static void main(String[] ar) {
        Scanner teclado=new Scanner(System.in);
        int valor;
        do {
            System.out.print("Ingrese un valor entre 0 y 999 (0 finaliza):");
            valor=teclado.nextInt();
            if (valor>=100) {
                System.out.println("Tiene 3 dígitos.");
            } else {
                if (valor>=10) {
                    System.out.println("Tiene 2 dígitos.");
                } else {
                    System.out.println("Tiene 1 dígito.");
                }
            }
        } while (valor!=0);
    }
}

Problema 2:

Escribir un programa que solicite la carga de números por teclado, obtener su promedio. Finalizar la carga de valores cuando se cargue el valor 0.
Cuando la finalización depende de algún valor ingresado por el operador conviene el empleo de la estructura do while, por lo menos se cargará un valor (en el caso más extremo se carga 0, que indica la finalización de la carga de valores)

Diagrama de flujo:

Es importante analizar este diagrama de flujo.
Definimos un contador cant que cuenta la cantidad de valores ingresados por el operador (no lo incrementa si ingresamos 0)
El valor 0 no es parte de la serie de valores que se deben sumar.
Definimos el acumulador suma que almacena todos los valores ingresados por teclado.
La estructura repetitiva do while se repite hasta que ingresamos el valor 0. Con dicho valor la condición del ciclo retorna falso y continúa con el flujo del diagrama.
Disponemos por último una estructura condicional para el caso que el operador cargue únicamente un 0 y por lo tanto no podemos calcular el promedio ya que no existe la división por 0.
En caso que el contador cant tenga un valor distinto a 0 el promedio se obtiene dividiendo el acumulador suma por el contador cant que tiene la cantidad de valores ingresados antes de introducir el 0.

Programa:

import java.util.Scanner;
 
public class EstructuraRepetitivaDoWhile2 {
    public static void main(String[] ar) {
        Scanner teclado=new Scanner(System.in);
        int suma,cant,valor,promedio;
        suma=0;
        cant=0;
        do {
            System.out.print("Ingrese un valor (0 para finalizar):");
            valor=teclado.nextInt();
            if (valor!=0) {
                suma=suma+valor;
                cant++;
            }
        } while (valor!=0);
        if (cant!=0) {
            promedio=suma/cant;
            System.out.print("El promedio de los valores ingresados es:");
            System.out.print(promedio);
        } else {
            System.out.print("No se ingresaron valores.");
        }
    }
}
El contador cant DEBE inicializarse antes del ciclo, lo mismo que el acumulador suma. El promedio se calcula siempre y cuando el contador cant sea distinto a 0.




9 comentarios:

  1. Faltan mas aclaracion y que aregle el color de lectras para entender un poco mas.

    ResponderEliminar
  2. Todo sería mas claro si almenos se pudieran ver los programas, conesa letra no creo que alguien le pueda entender lo que se dice en el programa.

    ResponderEliminar
  3. No se puede visualizar el contenido de las imagenes,esto permite la comprension clara del contenido

    ResponderEliminar
  4. Es importante que cambie el color de letra de lo ejemplos, chao.

    ResponderEliminar
  5. La letra en la primer parte deberia de ir de otro color, tienes una teoria muy completa y desglosada pero los programas no se visualizan.

    ResponderEliminar
  6. la teoria esta bien aunque hace falta un poco mas de claridad en los ejemplos y tambien seria mejor que las imagenes se pudieran visualizar

    ResponderEliminar
  7. Me parece q esta completo pero como todo en esta carrera no solo nos tenemos q conformar con la teoria sino tambien complementarnos con la parctica

    ResponderEliminar
  8. LA PARTE TEORICA ES BASTANTE EXTENSA Y LA PARTE DE LOS EJEMPLOS LE FALTA UN POCO DE CLARIDAD POR AQUELLO DE LA LETRA.

    ResponderEliminar
  9. En pocas palabras, un ciclo for repite las instrucciones que se especifiquen dentro de el, es decir dentro de los corchetes { }; sean desde las mas simples (imprimir una linea) hasta llenar datos de arreglos

    http://lenguajedeprogramacion1.blogspot.com/

    ResponderEliminar