Overblog
Edit post Seguir este blog Administration + Create my blog
13 mayo 2009 3 13 /05 /mayo /2009 13:48

        Estructuras Iterativas


Introducción.

Para repetir varias veces un proceso determinado haremos uso de los ciclos repetitivos, a los cuales se les conoce con el nombre de estructura repetitiva, estructura iterativa, lazo o bucle.

En C, al igual que en Java podemos encontrar tres tipos de ciclos:

·         Entrada Asegurada (while)

·         Ciclo Controlado Por Contador (for)

·         Hacer Mientras (do.. while)


Funcionamiento de Un Ciclo

Un ciclo, funciona de la siguiente manera: Evalúa una condición de resultar cierta, realiza una acción o bloque de acciones, luego vuelve a evaluar la condición y si nuevamente resulta cierta, realiza la (s) acción (es). Cuando la condición de cómo resultado falso, se sale del ciclo y continúa con la ejecución normal del programa.

Acumulador:

Es una variable, que , como su nombre lo indica se encarga de acumular valores. Esto se vuelve muy útil, por ejemplo, cuando queremos encontrar la suma de los números del 0 al 9, en el acumulador, vamos guardando los valores de dichas cifras. Puede ser tanto real como entera. Su valor inicial, en la mayoría de los casos es cero.

Contador:

Es una variable de tipo entero, que nos ayuda, en el programa a contabilizar el número de ejecuciones de una misma acción, de un grupo de alumnos etc. Un acumulador tiene tres valores distintos:

·         Valor Inicial: es el valor con el cual iniciamos nuestro contador. Generalmente es cero. Esta asignación puede hacerse cuando se declara la variable.

·         Valor Final: después de la ejecución del ciclo, el valor del contador, será distinto a su valor inicial, este puede ser mayo o menor que el mismo, todo depende si fue una cuenta creciente o decreciente.

·         Valor de Cambio: Es el valor Constante, en el cual se irá incrementando nuestro contador, este puede ser positivo o negativo; es decir, si la cuanta se realiza de manera ascendente o descendente.

 

Bandera:


Las variables tipo bandera son aquellas que sólo admiten dos valores: cierto o falso, true o false, hombre o mujer... etc


Ciclo de Entrada Asegurada

La sintaxis es la siguiente:

while(condición)

       Acción;

Funciona de la siguiente manera: primero evalúa la condición, si da como resultado cierta realiza la acción, luego vuelve a evaluar la condición, si su resultado es falso, se sale del ciclo y continúa con la ejecución del programa. Hay que tener mucho cuidado, cuando trabajamos con ciclos, ya que podemos caer en un ciclo infinito, es decir que nunca se sale de él. Por lo cual en las acciones debemos siempre colocar algo que haga que se modifique el resultado de la condición, lo cual puede ser una bandera, un contador o un acumulador.

 

Ejemplo.

En una empresa, se desea  se tienen datos correspondientes a los sueldos de 10 empleados, de los cuales, se desea saber, quien goza del sueldo mayor, quien goza del sueldo menor y cuantos poseen un sueldo mayor a 300.

1    import javax.swing.*;
 2     class UsaWhile{
 3        public static void main (String args []){
 4          String leer;
 5          double sueldo, mayor=0, menor=10000;
 6          int i=1, contador=0;
 7          while(i<=10)
 8          {
 9             leer=JOptionPane.showInputDialog("Ingrese el sueldo del empleado: "+i);
10             sueldo=Double.parseDouble(leer);
11             while(sueldo<0)//si el sueldo es negativo
12             {
13                leer=JOptionPane.showInputDialog("ERROR, el sueldo no puede ser Negativo\nIngrese el sueldo del empleado: "+i);
14                sueldo=Double.parseDouble(leer);
15             }  
16             if(sueldo>300)
17                contador=contador+1;
18             if(sueldo>mayor)
19                mayor=sueldo;
20             if(sueldo<menor)
21                menor=sueldo;
22             i=i+1;
23          }
24          JOptionPane.showMessageDialog(null, "El sueldo mayor es de: "+mayor+"\nEl sueldo menor es: "+menor+"\n"+contador+" Empleados tienen un sueldo mayor a 300");
25       }
26    }

Ciclo Controlado por contador.


En algunas ocasiones, sabemos a ciencia cierta el número de veces que se tiene que repetir una misma acción o bloque de acciones. Y para ello es que nos sirve, esta estructura. Su sintaxis es la siguiente:


for(
valor inicial; condición; incremento)

        accion;

Donde:

Valor inicial: es el valor con el cual inicializamos nuestra variable de control.

Condición:  si la cumple, ejecuta la acción o acciones e incrementa o decrementa la variable de control, sino la cumple la condición, se sale del ciclo.

Incremento; que puede ser positivo o negativo (decremento).

 

Ciclo Do... while

Es te ciclo funciona de la siguiente manera, realiza la acción o conjunto de acciones, luego evalúa una condición de resultar cierta vuelve a realizar la/s accion/es. Cuando sea falsa, se sale del ciclo.

Formato :

          do {

               sentencia;

               .

               .

                } while(<expL>);

La diferencia fundamental, entre el ciclo while y do...while, es que en este ultimo, las sentencias se realizarán por lo menos una vez, en cambio, con while, solo se  cumplirán mientras se cumpla la condición, lo cual puede ser nunca.


Ejemplo.

Programa que suma los valores de n1, mientras estos no sean mayores que 100

1 class fibo{ 
2 public static void main(String args[]){            
3      int n1=0;              
4            do{       n1++;               
5                      System.out.println(n1+" ");
6          }while(n1<100);
7   }
8 }

 

Compartir este post
Repost0

Comentarios

A
1
#include

int main(){
double radiacion,mayor, mayor1, mayor2;
char ciudad, ciudad1, ciudad2;
radiacion = 1;
mayor1 = 0;
mayor2 = 0;

while(radiacion > 0){

printf("Ingrese el nombre de la ciudad:
");
scanf("
%c", &ciudad);
printf("Ingrese valor de radiacion:
");
scanf("%lf",&radiacion);

mayor = radiacion;

if(mayor > mayor1 ){
ciudad2 = ciudad1;
mayor2 = mayor1;
mayor1 = mayor;
ciudad1 = ciudad;
}else{
if( mayor > mayor2 && mayor< mayor1) {
mayor2 = mayor;
ciudad2 = ciudad;
}
}

}
if( mayor1 == 0 && mayor2== 0){
printf("
No se ingresaron valores de radiacion para ninguna ciudad.");

}
else{
printf("La primera ciudad con mayor radiacion es %c (%.2lf)
",ciudad1, mayor1);
if(mayor1 == 0 || mayor2 == 0){
printf("Solo se registro una ciudad.
");
}else {

printf("La segunda ciudad con mayor radiacion es %c (%.2lf)
",ciudad2 ,mayor2);
}
}

return 0;
}


2
#include

int main(){
char residencia;
int cant_residentes_N = 0,cant_residentes_S = 0, cant_residentes_C = 0, cant_residentes_O = 0, cant_nulos = 0, control = 1;

while (residencia != 'X'){
printf("Ingrese la region de residencia del encuestado %d:", control);
scanf("
%c",&residencia);
if(residencia == 'N'){
cant_residentes_N++;
}else{
if(residencia == 'S'){
cant_residentes_S++;
}else{
if(residencia=='C'){
cant_residentes_C++;
}else{
if(residencia=='O'){
cant_residentes_O++;
}else{
cant_nulos++;
}
}
}
}
control++;
}
int cant_total= cant_residentes_N + cant_residentes_S + cant_residentes_C + cant_residentes_O + cant_nulos - 1;

printf("
Cantidad de residentes en Region Norte: %d",cant_residentes_N);
printf("
Cantidad de residentes en Region Sur: %d",cant_residentes_S);
printf("
Cantidad de residentes en Region Centro: %d",cant_residentes_C);
printf("
Cantidad de residentes en Region Oriente: %d",cant_residentes_O);
printf("
Cantidad de blancos o nulos: %d",cant_nulos - 1 );

printf("
Porcentaje de residentes de Region Norte: %.3lf %%",(double)cant_residentes_N*100/cant_total );
printf("
Porcentaje de residentes de Region Sur: %.3lf %%",(double)cant_residentes_S*100/cant_total );
printf("
Porcentaje de residentes de Region Centro: %.3lf %%",(double)cant_residentes_C*100/cant_total);
printf("
Porcentaje de residentes de Region Oriente: %.3lf %%",(double)cant_residentes_O*100/cant_total);
printf("
Porcentaje de blancos o nulos: %.3lf %%", (double)(cant_nulos-1)*100/cant_total);


return 0;
}


3
#include
#include
#include
int main (){

int centinela, distribucion = 1, control = 1, cant_term = 0;
double suma = 0,producto = 1, suma_inversa = 0;
double media_aritmetica, media_geometrica, media_armonica, mayor=DBL_MIN, menor=DBL_MAX;
double varianza, desviacion, suma_cuadrados= 0 ;
// Tener en cuenta que la distribucion es positiva

printf("Ingrese el centinela: ");
scanf("%d", ¢inela);

while(1){

printf("
Ingrese el valor %d de la distribucion: ", control);
scanf("%d", &distribucion);


if(distribucion != centinela){
if(distribucion > mayor ){
mayor = distribucion;
}else{
if( distribucion < menor){
menor = distribucion;
}
}
suma += distribucion;
producto *= distribucion;
suma_inversa += (double) 1 / distribucion;
suma_cuadrados += pow(distribucion,2);
cant_term ++;
control ++;
media_aritmetica = suma / cant_term;
media_geometrica = pow(producto, (double)1/cant_term);
media_armonica = (double)cant_term / suma_inversa;
varianza = suma_cuadrados/cant_term - pow(media_aritmetica,2) ;
desviacion= pow( varianza , 0.5) ;
}
else{
break;
}
}

printf("
La media aritmetica es %lf", media_aritmetica);
printf("
La media geometrica es %lf", media_geometrica);
printf("
La media armonica es %lf", media_armonica);
printf("
Rango: [%.lf,%.lf]", menor, mayor);
printf("
La varianza es %lf", varianza);
printf("
La desviacion estandar es %lf", desviacion);
//El ejemplo de ejecucion de la guia esta mal en la varianza y desviacion estandar



return 0;
}


4
#include

int main(){
char criterio;
int control = 1;
int angulo1, angulo2, angulo3, lado1, lado2, lado3;

printf("Ingrese el criterio de clasificacion: ");
scanf("
%c", &criterio);

while( criterio == 'A' || criterio == 'L' ){

if(criterio == 'A'){
printf("
Ingrese angulos (a, b, c) del triangulo %d: ", control);
scanf("%d %d %d", &angulo1, &angulo2, &angulo3 );

if( angulo1 + angulo2 + angulo3 == 180){
if( angulo1 < 90 && angulo2 < 90 && angulo3 < 90 ){
printf("
El triangulo es acutangulo");
}
else{
if( angulo1 == 90 || angulo2 == 90 || angulo3 == 90 ){
printf("
El triangulo es rectangulo");
}
else{
printf("
El triangulo es obtusangulo");
}
}
}
else {
printf("
Los angulos ingresados no corresponden a un triangulo.");
break;
}
}
if( criterio == 'L' ){
printf("
Ingrese los lados (l1, l2, l3) del triangulo %d: ", control);
scanf("%d %d %d", &lado1, &lado2, &lado3 );

if( lado1 < lado2 + lado3 && lado2 < lado1 + lado3 && lado3 < lado1 + lado2 ){

if(lado1 == lado2 && lado2 == lado3 ){
printf("
El triangulo es equilatero");

}
else{

if( lado1 == lado2 || lado1 == lado3 || lado2 == lado3 ){
printf("
El triangulo es isosceles");
}
else{
printf("
El triangulo es escaleno");
}

}
}
else{
printf("
Los lados ingresados no corresponden a un triangulo.");
break;
}
}

control ++;

}
printf("
La lectura de datos ha finalizado.");


return 0;
}


5
#include
#include

int main(){
int n,n_copy, termino = 1, suma = 0;

printf("Ingrese numero n: ");
scanf("%d", &n);
n_copy = n;
n = fabs(n);
printf("
La suma es S = ");

while( termino <= n){
if( termino < n){
suma += 2*termino - 1;
printf("%d + ", 2*termino-1);
}
else{
suma += 2*termino - 1;
printf("%d", 2*termino-1);
}
termino++;
}
printf(" = %d", suma);
printf("
%d al cuadrado es %d ",n_copy,suma);

return 0;
}
Responder
J
He intentado hacer funcionar el ciclo controlado por controlador, pero algunas de las lineas me falla... y no se por que.
Responder