ciclos

25
CICLOS (while y for) Escribe un programa que lea dos números enteros y escriba todos los números mayores que el primero y menores que el segundo Ingresa el primer número: 38 Ingresa el segundo: 45 Los números son: 39 40 41 42 43 44 Muchas gracias por usar este programa Un intento (incorrecto) de solución es: 1. int a,b; 2. printf ("Ingresa el primer número :"); 3. scanf (“%d”,&a); 4. printf ("Ingresa el segundo:"); 5. scanf (“%d”,&b); 6. print ("Los numeros son"); 7. if (a+1<b) printf (“%d\n”,a+1); 8. if (a+2<b) printf (“%d\n”,a+2); 9. if (a+3<b) printf (“%d\n”,a+3); 10. if (a+4<b) printf (“%d\n”,a+4); 11. if (a+5<b) printf (“%d\n”,a+5); 12. if (a+6<b) printf (“%d\n”,a+6); 13. if (a+7<b) printf (“%d\n”,a+5); 14. if (a+8<b) printf (“%d\n”,a+6); 15. ... etcétera Flujo de un programa Hasta ahora todos los programas que hemos visto se caracterizan por el hecho de que las instrucciones se van ejecutando en orden y una sola vez. Esto impide realizar un programa como el queremos hacer.

Upload: amra26721

Post on 16-Dec-2015

3 views

Category:

Documents


0 download

DESCRIPTION

ciclos iterativos for y while

TRANSCRIPT

  • CICLOS (while y for)Escribe un programa que lea dos nmeros enteros y escribatodos los nmeros mayores que el primero y menores que elsegundoIngresa el primer nmero: 38

    Ingresa el segundo: 45

    Los nmeros son: 39 40 41 42 43 44

    Muchas gracias por usar este programa

    Un intento (incorrecto) de solucin es:1. int a,b;2. printf ("Ingresa el primer nmero :");3. scanf (%d,&a);4. printf ("Ingresa el segundo:");5. scanf (%d,&b);6. print ("Los numeros son");7. if (a+1

  • Sin embargo, C, al igual que muchos otros lenguajes, permiterepetir una cierta cantidad de instrucciones mientras unacondicin se cumpla.Esta instruccin de control de flujo se llama while, seesquematiza en la figura 1 y su sintaxis es:while (condicion) {instrucciones;}while evala la condicin entre parntesis y si esta esverdadera, ejecuta todas las instrucciones entre losparntesis { }. Cuando ha ejecutado la ltima instruccin,vuelve a evaluar la condicin. El proceso se repite hasta queal terminar de ejecutar las instrucciones se evala lacondicin y esta es falsa.

    Figura 1

  • En caso que slo se repita una sola instruccin, se puedeneliminar los parntesiswhile (condicion)instruccin;

    Un ejemplo

    Un primer ejemplo de while se ve en el siguiente programa:16.int a,b,i;17.printf ("Ingresa el primer nmero: ");18.scanf(%d,&a);19.printf ("Ingresa el segundo:");20.scanf(%d,&b);21.printf ("Los numeros son");22.i=a+1;23.while (i

  • escribir los valores a
  • i __41__22 Como nuevamente se llego al final de las

    instrucciones dentro delwhile, sereevalua la condicin del while, que esverdadera y se vuelve a iterar.

    ... ...24-25 El programa ha seguido iterando, y se ha

    entrado a las instrucciones con un valorde i de 44. Se escribe el valor de i y seincrementa

    Ingresa el primernmero: 38

    Ingresa elsegundo: 45

    Los nmeros son : 3940 41 42 43 44

    i __45__22 Se vuelve a evaluar la condicin

    del while, en este caso es falsa. C saltainmediatamente a la lnea que sigue a lasinstrucciones delwhile, es decir, la lnea26

    26 Se escribe el mensaje de agradecimiento yfinaliza el programa

    Ingresa el primernmero: 38

    Ingresa elsegundo: 45

    Los nmeros son : 39

  • 40 41 42 43 44

    Muchas gracias porusar estre programa

    28.A veces existen muchas formas de llevar a cabo una tarea. Enel caso del programa que acabamos de analizar se puedeusar un contador en el ciclowhile.

    29.Un contador es una variable auxiliar que se usa junto aun while para repetir un trozo de cdigo una cierta cantidadde veces. En nuestro ejemplo, sabemos que la cantidad denmeros entre a y b son b-a-1. Por ejemplo, si a vale 5 y b 8,hay que escribir 8-5-1=2 nmeros, que son 6 y 7.

    30.Una nueva versin del programa es:31.printf ("Ingresa el primer nmero: ");32....33.printf ("Los numeros son");34.i=b-a-1;35.while (i>0) {36.print (%d ,b-i);37.i=i-1;38.}

    Otra versin, igualmente correcta es:39.printf ("Ingresa el primer nmero: ");40....41.printf ("Los numeros son");42.i=b-a-1;43.while (i>0) {44.i=i-1;45.printf (%d,b-(i+1));46.}

    Una ejecucin del grupo de instrucciones sedenomina iteracin. Si se ejecuta 10 veces el

  • grupo de instrucciones, se dice que el ciclo tuvo10 iteraciones.

    No existe un lmite al nmero de iteraciones quese pueden llevar a cabo en un ciclo.

    mbito de una variable

    El mbito de una variable es la parte del programa donde lavariable es conocida y puede ser usada. Como ya vimos, unavariable puede ser usada slo despus que se ha definido. En C, elmbito de la variable termina cuando se encuentra el parntesis }que cierra al parntesis { que preceda la declaracin de la variable.Cualquier referencia a una variable tiene que ser hecha dentro delmbito de la variable, si no, C no compila el programa.La siguiente tabla muestra el mbito de las variables del cdigo deejemplo:a b c Cdigo

    int a;scanf(%d,&a);while (a

  • Por ejemplo, sera errneo usar la variable b c fuera del while, yaque al ser declaradas dentro de l, su mbito termina al cerrarse elbloque de instrucciones.Las variables que son declaradas dentro de un whilepierden su valor al fin de cada iteracin, y se declarannuevamente en la siguiente iteracin (como si fueran"variables nuevas").

    Indentacin del while

    Indentar es ordenar un programa agregando espacios al ladoizquierdo de las instrucciones. Dos formas de indentar un whileson las siguientes:Parentesis de comienzo de bloque en la misma lnea de la clusula while

    while (condicin) {

    instruccin;

    instruccin;

    instruccin;

    }

    Parntesis de comienzo de bloque en una nueva lnea

    while (condicin)

    {

    instruccin;

    instruccin;

  • instruccin;

    }

    En ambos casos se deja un espacio antes del comienzo de cadainstruccin dentro del bloque para clarificar el programa. Nuncaolvides indentar. Si bien no es obligacin hacerlo te puedesimplificar bastante entender lo que hace el programa.

    Whiles anidados

    Es perfectamente posible colocar un while dentro de otro while(while anidado). Como ejemplo, considera el siguiente programa,que escribe la tabla de multiplicar del 1 al 10:

    1. int i=0;2. while (i

  • while (jugador1 ni jugador2 ha ganado) {

    jugador1 mueve pieza

    if jugador1_gan {

    escribe_mensaje (gan jugador 1)

    break;

    }

    jugador2 mueve pieza

    if jugador2_gan

    escribe_mensaje (gan jugador 2)

    }

    Errores (demasiado) comunes

    Un error muy comn es creer que un while puedeterminar (salir de) en la mitad del bloque deinstrucciones, bastando que una instruccin haga quela condicin del while sea falsa, olvidando que lo querealmente ocurre es que C evala la condicindel while antes de entrar por primera vez al bloque yantes de reentrar en cada iteracin.

    Considera el siguiente programa:1. int i=3;2. while (i>1) {3. i=i-1;4. printf (%d,i);5. }6. printf ("fin");

  • La traza (orden en que se ejecutan las instrucciones) deeste programa es

    (1) (2) (3) (4) (2) (3) (4) (2) (6)

    yno

    (1) (2) (3) (4) (2) (3) (6)

    como podra pensar alguien que crea queel while termina abruptamente en la lnea 44 cuandoel valor de i se hace 1 (y por lo tanto la condicindel while falsa)Otro error es olvidar cual es el mbito de una variabledeclarada dentro de un while. El siguiente programa,que calcula n!, tiene dos errores:

    1. int i,n;2. printf ("ingresa n:");3. scanf(%d,&n);4. i=1;5. while (i

  • 1. int i,n,factorial=1;2. printf ("ingresa n:");3. scanf(%d,&n);4. i=1;5. while (i1)18.{19.printf ("Los factores son: ");20.factor=1;21./* Hacemos un ciclo probando todos los posibles

    factores */22.while(factor

  • 27./* Indicamos que termina la lista */28.printf(".\n");29.}30.else31.printf("El numero debe ser mayor que 1\n");

    Problema 2: Digito verificador del carn de identidad

    El sistema de identificacin que se usa en Chile sa basa en uncdigo (llamado numero del carn de identidad) que corresponde aun nmero entero (que se le asigna a cada habitante) y un dgitoverificador (que se calcula usando el numero anterior) para sabersi algunos de los dgitos del carnet han sido modificados. As, parasaber si la cdula 12.575.538-1 est correcta, debemos calcular eldgito verificador para 12575538 y compararlo con 1. Si soniguales, el nmero est bien, si no, fue adulterado.Para calcular el dgito verificador se utiliza el siguiente algoritmo:

    Se multiplican los digitos del nmero entero, partiendo delltimo, respectivamente con 2,3,4,5,6,7,2 y 3

    Luego se suman todos estos resultados parciales, y que sellamar SUMA.

    Se calcula el digito verificador como: D = 11 - ( SUMAmodulo 11 )

    Si D=11 entonces el digito verificador es "0" (cero). Si D=10, entonces el digito verificador es "K". En cualquier otro caso el digito verificador es D.

    Solucin

    1. int carnet,resultado;2. /* Preguntamos por el numero */3. printf("Ingrese un numero de carnet (mayor que 1)

    ? ");

  • 4. scanf(%d,&carnet);5. /* Verificamos que este en el rango */6. if(carnet>1)7. {8. int factor=2,suma=0,digito=0;9. /* Hacemos un ciclo que termina cuando carnet sea

    010.Para rescatar los digitos rescatamos el ultimo y11.lue go lo quitamos. */12.while (carnet>0)13.{14./* Rescatamos es ultimo digito */15.digito=carnet%10;16./* Quitamos el ultimo digito del numero */17.carnet=carnet/10;18.suma=suma + digito*factor;19.factor++;20.if(factor>=8)21.factor=2;22.}23.resultado=11-(suma%11);24.if(resultado==11)25.resultado=0;26./* Mostramos el resultado */27.if (resultado==10)28.printf("El digito verificador es: K");29.else30.printf("El digito verificador es: %d", resultado);31.}32.else33.printf("El numero debe ser mayor que 1");

    Problema 3: Sapo de Micro

    Un sapo de micro calcula cunto tiempo ha transcurrido entre elpaso de dos micros del mismo recorrido. Un Sapo posmodernousar un Notebook para ayudarse en el clculo.

  • a. Escribe un programa en C que sostenga el siguiente dilogo :A qu hora pas la primera micro (minutos)? 65

    A qu hora pas la micro 2? 73

    La diferencia entre la 1 y la 2 es de 8 minutos

    A qu hora pas la micro 3? 78

    La diferencia entre la 2 y la 3 es de 5 minutos

    A qu hora pas la micro 4? -1

    Muchas gracias por usar este programa

    Es decir, que pregunte la hora en minutos. Supn que el programase usa en un mismo da siempre.b) Escribe el mismo programa, pero la hora se ingresa ahora de lasiguiente forma:

    A qu hora pas la primera micro (minutos)? 1 5

    A qu hora pas la micro 2? 1 13

    La diferencia entre la 1 y la 2 es de 8 minutos

    A qu hora pas la micro 3? 2 18

    La diferencia entre la 2 y la 3 es de 1 hora 5minutos

    A qu hora pas la micro 4? -1

    Muchas gracias por usar este programa

    Es decir, la hora se muestra en horas y minutosSolucin a)

  • 1. int antes,actual,i;2. printf ("A qu hora pas la primera micro

    (minutos)?");3. scanf(%d,&antes);4. i=2;5. while (antes!=-1) {6. printf ("A que hora paso la micro %d?",i);7. scanf(%d,&actual);8. if (actual!=-1) {9. printf ("La diferencia entre la %d y la %d",i-

    1,i);10.printf (" es de %d minutos \n",actual-antes);11.}12.antes=actual;13.i=i+1;14.}15.printf ("Muchas gracias por usar este

    programa\n");

    Solucin b)

    16.int hora,minutos,antes,actual,i,difh,difm;17.printf ("A qu hora pas la primera micro

    (minutos)?");18.scanf(%d %d,&hora,&minutos);19.hora*60+minutos;20.i=2;21.while (antes!=-1) {22.int hora;23.printf ("A que hora paso la micro %d?",i);24.scanf(%d %d,&hora,&minutos);25.actual=hora*60+minutos;26.if (actual!=-1){27.difh=(actual-antes)/60;28.difm=(actual-antes)%60;29.printf ("La diferencia entre la %d y la %d es de

    ",i-1,i);30.if (difh>0)31.printf (%d horas y ",difh);

  • 32.printf ("%d minutos",difm);33.antes=actual;34.i=i+1;35.}36.}37.printf ("Muchas gracias por usar este

    programa\n");

    Pon tus conocimientos a prueba

    Escribe un programa que lea las notas de un alumno delteclado y escriba su promedio en la pantalla. Escribedos versiones; la primera versin pregunta al usuario lacantidad de notas, la segunda versin pregunta notashasta que se ingresa un 0 para indicar el fin.

    Cuntas notas son? 4

    Nota 1: 7.0

    Nota 2: 6.0

    Nota 3: 5.5

    Nota 4: 4.0

    Promedio: 5.5

    Versin 1Ingresa las notas (0=fin)

    Nota 1: 7.0

    Nota 2: 6.0

    Nota 3: 5.0

    Nota 5: 0

    Promedio: 6.0

  • Versin 2Diagramas de flujo

    Un diagrama de flujo es una representacin grfica del orden enque se van ejecutando las instrucciones de un programa, cmo yahemos visto de forma superficial en este captulo y elanterior. Hasta ahora hemos visto tres tipos de ejecucin:secuencial, cclica y condicional, cada uno de los cuales tiene undiagrama asociado:Secuencial Condicional Cclicainst1;

    inst2;

    inst3;

    if (cond)

    inst1;

    else

    inst2;

    while (cond)

    inst;

    Para programas ms complejos, basta con combinar los distintosdiagramas.

    Ejemplo de un diagrama de flujo

    El siguiente cdigo escribe si un nmero guardado en lavariable x es positivo, negativo o igual a cero. A su derecha se ve

  • su diagrama de flujo, que es una composicin de dos diagramasde secuencias condicionales.if (x>0)

    printf("positivo);

    else {

    if (x0)

    printf("positivo);

    if (x

  • En el caso en que el nmero sea negativo, la primeracondicin es falsa y se evala la segunda. Como esta esverdadera, se escribe "negativo" en la pantalla.

    Si el nmero es cero, la primera condicin es falsa, se evalala segunda, que tambin es falsa y se escribe "cero"

    Si el nmero es positivo, se escribe "positivo". Sin embargo,el error se produce al pasar a evaluar la segunda condicin,que es falsa, por lo que se escribe "cero". Es decir, si elnmero es mayor que cero, se escribe "positivo" y "cero" en lapantalla.

    Ejecucin paso a paso

    La ejecucin paso a paso consiste en escribir el orden en que lasinstrucciones se van ejecutando al correr el programa. Para ello sele asigna un nmero a cada lnea del programa. Al lado de cadalnea se escribe:Si lainstruccines ...

    Se debe escribir

    asignacin el nuevo valor de lavariable

    while o if el valor de verdadde la condicin

    print qu se escribe en lapantalla

  • El siguiente programa lee nmeros enteros desde el teclado yescribe cunto vale su suma acumulada. El programa itera hastaque se ingresa un cero.

    1. int suma= 0, num;2. printf("? ");3. scanf(%d,&num);4. while (num!=0) {5. suma= suma+num;6. printf("Total= %d\n",suma);7. printf("? ");8. scanf(%d,&num);9. }10.printf("Fin!\n");

    La siguiente pantalla muestra un ejemplo:? 3

    Total= 3

    ? 4

    Total= 7

    ? 1

    Total= 8

    ? 0

    Cmo es su ejecucin paso a paso?(1) suma=0

    (2) escribe "?"

    (3) num=3

    (4) Verdadero

  • (5) suma=3

    (6) escribe "Total="

    (6) escribe "3"

    (7) escribe "?"

    (8) num=4

    (4) Verdadero

    (5) suma=7

    (6) escribe "Total="

    (6) escribe "7"

    (7) escribe "?"

    (8) num=1

    (4) Verdadero

    (5) suma=8

    (6) escribe "Total="

    (6) escribe "8"

    (7) escribe "?"

    (8) num=0

    (4) Falso

    (10) escribe "Fin"

    Pon tus conocimientos a prueba

    El siguiente programa calcula el mximo comun divisorentre los nmeros 15 y 24 (Propuesto: demustralo).

  • Dibuja su diagrama de flujo y escribe su ejecucin pasoa paso.

    1. int x= 15;2. int y= 24;3. while (x!=y) {4. if (x>y)5. x= x-y;6. else7. y= y-x;8. }9. printf(%d,x);

    Solucin:(1) x=15

    (2) y=24

    (3) Verdadero

    (4) Falso

    (7) y=9

    (3) Verdadero

    (4) Verdadero

    (5) x=6

    (3) Verdadero

    (4) Falso

    (7) y=3

    (3) Verdadero

  • (4) Verdadero

    (5) x=3

    (3) Falso

    (9) Escribe 3

    For

    En C existe una forma abreviada de escribir un ciclo while: lainstruccin for. No slo abrevia, sino que ademas aporta claridaden ciertos casos. Su forma esfor (instruccin1; condicin; instruccin2) {

    instrucciones;

    }

    equivale ainstruccin 1;

    while (condicin) {

    instrucciones;

    instruccin2;

    }

    Los siguientes programas muestran ejemplos de la equivalenciaentre while y for:Con for... Con while...

  • Int i;

    for (i=0; i< 100; i++)

    printf ("El nmero es %d",i);

    int i=0;

    while (i