Está en la página 1de 49

Fundamentos de Informtica

ETSID
Tema 4: Estructuras de
Repeticin (Bucles).

Departamento de Sistemas Informticos y Computacin


Universidad Politcnica de Valencia

ndice
1.
2.
3.
4.
5.
6.
7.
8.

Introduccin
Bucle for
Bucle while
Bucle do-while
Bucle infinito
Utilizacin de cada tipo de bucle
Ficheros y bucles
Bucles anidados

Objetivos
z

z
z

Entender los conceptos de la repeticin de


instrucciones
Conocer funcionamiento y utilizacin de
sentencias while, do...while y for
Combinar estructuras de repeticin
Reforzar conocimientos adquiridos en temas
anteriores

1. Introduccin
Bucle: instruccin que permite repetir
otra instruccin o un conjunto de
instrucciones (bloque) un nmero de
veces.
Instruccin 1
Instruccin 2
Instruccin 3

Finalizacin de un bucle
El bucle puede repetirse:
z

Un nmero fijo de veces.


Repetir 100 veces
Leer un nmero
Sumarlo a la variable total

Otras veces finalizar cuando se cumpla una


condicin.
Repetir hasta que la variable total llegue a 10.000
Leer un numero
Sumarlo a la variable total

Partes de un bucle
Repetir 100 veces

Cabecera del bucle

Leer dos nmeros enteros


Sumarlos

Cuerpo del bucle

Restarlos

A cada ejecucin del bloque de instrucciones


del cuerpo del bucle se le llama iteracin.

Tipos de bucles
for
while
do-while
La diferencia entre ellos depende de:
z

La forma de gestionar el nmero de veces que se


repite el bucle.
El nmero mnimo de repeticiones del bucle.

Bucle for

2. Bucle for
for (inicializacin; condicin; incremento)
instrucciones;
z
z
z
z
z

Ejecuta el cuerpo del bucle un nmero determinado


de veces.
Necesita una variable de control. Puede ser de
cualquier tipo, incluso real.
Inicializacin: sentencia de asignacin que establece
el valor inicial de la variable de control del bucle.
Condicin: expresin relacional que determina
cuando finalizar el bucle.
Incremento: define cmo cambiar la variable de
control del bucle en cada pasada del bucle.

Inicializacin: le da a la
variable i el valor 1.

Ejemplo:

Condicin: debe cumplirse


mientras se ejecuta el bucle.

for (i=1; i<10; i++)


printf(%d\n, i);
La variable de
control del
bucle es i

Incremento: en cada
iteracin del bucle la variable
i se incrementa en 1.

for (inicializacin; condicin; incremento)


instrucciones;
z
z

Se ejecuta mientras la
condicin sea cierta.
Cuando la condicin
sea falsa la ejecucin
del bucle terminar y
se reanudar en la
instruccin siguiente al
bucle.
El bucle no se ejecuta
si la condicin es falsa
al entrar en el bucle.

Ejemplo
Cul es la salida por
pantalla?

i=1

i<=5

Falso

for (i=1; i<=5; i++)


printf(%d\n,i);

Cierto

printf(%d\n,i);

1
2
i++

3
4
5

Resto de Instrucciones

Cuerpo del bucle


Si el cuerpo del bucle contiene ms de una instruccin
hay que poner llaves.
Muy importante:
identacin
for (i=1; i<=5; i++)
{
printf(El valor del contador es: );
printf(%d\n,i);
}
for (i=1; i<=5; i++)
printf(El valor del contador es: %d\n,i);

Ejemplo
Cul es la salida por pantalla del
siguiente bucle for?
1

for (i=1; i<=5; i++)


printf(%d\n,i);
printf(Fuera: %d\n,i);

2
3
4
5
Fuera: 6

Ejemplo
for (i=1; i<=10; i++)
printf(i=%d\n, i);

2
3
4
5
6
1

10

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


printf(i=%d\n, i+1);

6
7
8
9
10

25

Ejemplo
for (i=25; i!=200; i=i+25)
printf(%d\n, i);

50
75
100
125
150
175

a
b
c
d
e

for (i=a; i<=z; i++)


printf(%c\n, i);

f
g

Ejemplo
for (i=10; i>0; i--)
printf(%d\n,i);
printf(Valor final: %d\n,i);
23
21
19
17
15
13
11
Valor final: 9

10
9
8
7
6
5
4
3
2
1
Valor final: 0

for (i=23; i>10; i-2)


printf(%d\n,i);
printf(Valor final: %d\n,i);

Cuando usar el bucle for


z

Se utiliza siempre que se conoce el nmero exacto


de iteraciones antes de ejecutar el bucle
Si no se conoce previamente el nmero de
iteraciones, no usar for:
z
z

Si al menos se debe ejecutar una vez: do..while


Si puede no ejecutarse nunca: while

Se puede alterar el contenido de variables de


control del bucle desde dentro del cuerpo del bucle

NO HACERLO: nunca hay que modificar la


variable del bucle dentro de ste.

Ejemplo: NO SE DEBE HACER


Cul es la salida por pantalla del
siguiente bucle for?
for (i=1; i<=5; i++)
{
i++;
printf(%d\n,i);
}
printf(Fuera: %d\n,i);

2
4
6
Fuera: 7

Ejemplo: NO SE DEBE HACER


Cul es la salida por pantalla del
siguiente bucle for?
0
for (i=1; i<=5; i++)
{
i--;
printf(%d\n,i);
}
printf(Fuera: %d\n,i);

0
0
0
0

Bucle infinito

10

Ejemplo: NO SE DEBE HACER


Qu hace el siguiente bucle for?
for (i=1; i<=10; i++)
{
scanf(%d,&n);
if (n>0) printf(%d\n,i);
else i=11;
}
printf(Fuera: %d\n,i);

Lee 10 valores enteros


(como mximo).
Si alguno de ellos es
negativo, finaliza el
bucle sin completar la
lectura.
Los valores positivos los
muestra por pantalla.

Ejercicio
Escribir un programa que solicite al usuario 100
nmeros enteros y muestre la media de los
valores introducidos.

11

#include <stdio.h>
#define N 100
void main()
{
int i, num, suma=0;

Usar una constante para


controlar el nmero de
repeticiones del bucle

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


{
Acordarse del
printf(Dame un nmero: );
casting
scanf("%d", &num);
suma = suma + num;
}
printf("La media es %f\n", suma/(float)N);
}

Ejercicio
#include <stdio.h> Cul es la salida por pantalla?
void main()
0 2 4 6 8
{
0 1 2 3 4 5 6 7 8 9
3 4 5 6 7 8 9 10
int i;
for (i=0; i<10; i++)
if (i%2==0) printf ("%d\t", i);
printf("\n");
for (i=0; i<10; i++) printf ("%d\t", i);
printf("\n");
for (i=3; i<=10; i++) printf ("%d\t", i);
}

12

Mltiples variables de control


Se pueden utilizar mltiples variables de bucle,
condiciones e incrementos, separadas por
comas.
Ejemplo:
for (i=1, j=10; i!=j; i++, j--)
printf(i=%d j=%d\n, i-1, j+1);

Ejercicio
Leer 10 nmeros. Si el nmero ledo es el 0,
terminar de leer.
void main()
{
int i, valor, es_cero=0;
for (i=0; i<10 && es_cero==0; i++)
{
scanf(%d,&valor);
if (valor==0) es_cero=1;
}
}

13

Ejercicio
Cul es la salida de este programa?.
j=0;
for (i=0; i<=5; i++)
j++;
printf(i=%d j=%d\n, i, j);

i=6 j=5

Ejercicio
Cul es la salida de este programa?.
for (i=0; i<=5; i++);
printf(i=%d\n, i);

i=6

14

Eliminar partes del bucle


Las variables de control, condiciones e incrementos son
opcionales. La parte correspondiente se queda en
blanco, pero no desaparece el ;.
for (i=1; i!=100; )
scanf(%d,&i);
x = 0;
for (; x<10;)
{
printf(%d, x);
x++;
}

Ejemplo
i = 10;
for (; i>10; i--)
printf(i=%d\n, i+1);
for (;;)
{
scanf(%c,&x);
if (x==A)
break;
}

15

Otros usos
Se pueden utilizar partes del bucle for para
ejecutar otro tipo de instrucciones.
Ejemplo:
for (printf(Empiece a introducir nmeros); n==6; )
scanf(%d, &n);

Ejercicio
Escribir un programa que solicite al usuario el
nmero de valores a leer.
Posteriormente los leer y mostrar la suma de
los nmeros pares por pantalla.

16

#include <stdio.h>
void main()
{
int i, n, suma, numero;
printf(Cantidad de nmeros a leer: );
scanf(%d,&n);
suma=0;
for (i=0; i<n; i++)
{
printf(Dame un nmero: );
scanf(%d,&numero);
if (numero%2==0)
suma=suma+numero;
}
printf(El valor de la suma es: %d\n, suma);
}

Ejercicio
Modificar el programa anterior para que lea los
valores de un fichero datos.txt.
En la primera lnea se encuentra el nmero de
valores. En lneas sucesivas se encuentran los
valores.

17

void main()
{
int i, n, suma, numero; FILE *f;
if ((f=fopen(datos.txt, r))==NULL)
printf(No se puede abrir el fichero.\n);
else
{
fscanf(f, %d,&n); /* Nmero de valores */
suma=0;
for (i=0; i<n; i++)
{
fscanf(f, %d, &numero); /* Siguiente nmero a sumar */
if (numero%2==0)
suma=suma+numero;
}
printf(El valor de la suma es: %d\n, suma);
fclose(f);
}
}

Ejercicio
Escribir un programa en C que muestre por pantalla la
tabla de multiplicar de un numero introducido por
teclado.
Algoritmo:
z
z
z

Pedir el nmero.
Se necesita un valor que cuente de 0 a 10. Poner el
contador a cero.
Mientras que el contador sea menor o igual a 10:
z Mostrar por pantalla el resultado del nmero multiplicado
por el contador.
z Incrementar el contador.

18

#include <stdio.h>
void main()
{
int num, contador;
prinft(Dme el nmero: );
scanf(%d,&num);
/* Obtener el nmero */
for (contador=0; contador<=10; contador++)
printf(%d %d = %d\n, num, contador,
num*contador);
}

Bucle while

19

3. Bucle while
z

Ejecuta el cuerpo del bucle mientras se


cumple la condicin (condicin cierta).
while (condicin)
instruccin;

z
z

Instruccin: simple o bloque de instrucciones.


Condicin: expresin, siendo cierto cualquier
valor <> 0.

while (condicin)
instruccin;

Condicin
Falso

z
z

El bucle se ejecuta mientras


la condicin es cierta.
Cuando la condicin sea
falsa el control en el
programa pasa a la lnea
siguiente
despus
del
cdigo del bucle.
El
bucle
puede
no
ejecutarse si la condicin
resulta ser falsa al inicio del
bucle.

Cierto

Instruccin

Resto de Instrucciones

20

Ejercicio
Leer nmeros hasta que la suma de estos sea
mayor o igual a 1000.
total=0;
while (total<1000)
{
printf(Dame un nmero: );
scanf(%d,&n);
total = total + n;
}

Ejercicio
i = 1;
while (i <= 5)
{
printf(%d\n,i);
i++;
}

Qu hace este bucle?


1
2
3
4
5

for (i=1; i<=5; i++)


printf(%d\n, i);

21

Ejercicio
Calcular la suma de los nmeros introducidos desde
teclado. El programa se detendr cuando se
introduzca un cero.
No se conoce cuantas veces se debe ejecutar el
bloque de instrucciones del while. La expresin del
while se convierte normalmente en una comprobacin
del valor del contador. En este caso no hay contador y
es el valor del nmero introducido el que determina el
final del bucle.

Algoritmo:
z
z
z

Inicializar la variable de acumulacin.


Pedir el nmero.
Mientras que el nmero sea distinto de cero:
z
z

Acumular el valor del nmero.


Leer nuevo nmero.

Imprimir el resultado.

22

#include <stdio.h>
Versin 1: se inicializa la variable
void main()
nmero fuera del bucle para que entre
{
la 1 vez. Ese valor nunca se usa.
int n, suma, numero;
suma=0;
/* Inicializar variable acumulador */
numero = 1; /* Se inicializa a cualquier valor distinto de 0 */
while (numero!=0)
{
printf(Dme un nmero: )
scanf(%d, &numero);
suma=suma+numero; /*Acumular nmero*/
}
printf(La suma total es: %d\n, suma);
}

#include <stdio.h>
void main()
{
int n, suma, numero;

Versin 2: se solicita el primer valor


fuera del bucle. Dentro del bucle
primero hay que sumar el valor, para
que el valor de fuera no se pierda.

suma=0;
/* Inicializar variable acumulador */
printf(Dme un nmero: ); /* Lee un nmero fuera del bucle */
scanf(%d, &numero);
while (numero!=0)
{
suma=suma+numero; /*Acumular nmero*/
printf(Dme un nmero: )
scanf(%d, &numero);
}
printf(La suma total es: %d\n, suma);
}

23

Ejercicio
Escribir un programa que lea nmeros de
teclado hasta que el nmero introducido sea
negativo.
El programa debe obtener la suma de todos los
valores.
Los valores negativos no se suman.

Versin 1: se inicializa la variable


#include <stdio.h>
nmero fuera del bucle para que entre
void main()
la 1 vez. Ese valor nunca se usa.
{
int n, suma=0, numero;

/* Inicializa el nmero para que entre la primera vez en el bucle */


numero =0;
while (numero >=0)
{
printf(Dme un nmero: );
scanf(%d,&numero); /* Lee el siguiente nmero a sumar */
/*Slo se suma si el valor es correcto */
if (numero>=0)
suma=suma+numero;
}
printf(El valor de la suma es: %d\n,suma);
}

24

#include <stdio.h>
void main()
{
int n, suma=0, numero;
printf(Dme un nmero: );
scanf(%d,&numero);

Versin 2: se solicita el primer


valor fuera del bucle. Dentro
del bucle primero hay que
sumar el valor, para que el
valor de fuera no se pierda. No
hace falta el if, porque ya se
comprueba en la condicin del
bucle.

while (numero >=0)


{
suma=suma+numero;
printf(Dme un nmero: );
scanf(%d,&numero);
}
printf(El valor de la suma es: %d\n,suma);
}

Bucle do-while

25

4. Bucle do-while
z

Ejecuta el cuerpo del bucle mientras se cumple la condicin


(condicin cierta).
do
{
instruccin;
}
while (condicin);

z
z
z

Instruccin: sentencia simple o bloque de sentencias. Siempre


lleva llaves, aunque haya una nica instruccin.
Condicin: expresin, siendo cierto cualquier valor <> 0.
Termina siempre en ; (a diferencia del bucle while).

do
{
instruccin;
}
while (condicin);

Instruccin

Cierto

Condicin

z
z

Comprueba su condicin al
final del bucle (condicin de
salida).
El bucle siempre se ejecuta
al menos una vez.
Se ejecuta mientras se
cumpla la condicin (sea
cierta).

Falso

Resto de Instrucciones

26

Ejemplo
Leer nmeros hasta que el valor introducido sea un 0.
do
{
printf(Dame un valor: );
scanf(%d,&valor);
}
while (valor!=0);

Se ejecuta el bloque de instrucciones al


menos una vez.
Aunque es parecido al while no siempre
existe una correspondencia entre ellos.
Especialmente indicado para validar datos
de entrada (se le solicita un dato al usuario),
sobre todo para mens.

27

Ejercicio
Solicitar al usuario un nmero entre el 10 y el
20 (ambos inclusive).
Solicita un valor.

do
Si el valor es correcto (est
{
entre 10 y 20):
printf(Dame un valor: );
El bucle termina.
scanf(%d,&valor);
if (valor<10 || valor>20)
Si es incorrecto:
printf(Valor incorrecto\n);
Solicita de nuevo el
}
valor.
while (valor<10 || valor>20);
Da un mensaje de error.

Ejercicio
Escribir un programa que muestre la tabla de
multiplicar de un valor solicitado al usuario.
El valor pedido al usuario
comprendido entre 1 y 9.

debe

estar

Debe comprobarse antes de mostrar la tabla


que el valor introducido es correcto.

28

#include <stdio.h>
void main()
{
int num, contador;
/* Solicita el valor. El bucle termina cuando el usuario escribe
un valor entre 1 y 9. */
do
{
prinft(Dame un nmero entre 1 y 9: );
scanf(%d, &num);
}
while ((num<1) || (num>9));
/* Escribe la tabla de multiplicar. */
for (contador=0; contador<=10; contador++)
printf(%4d %4d = %4d\n, num, contador,
num*contador);
}

Ejercicio
Escribir un programa que muestre el men de
un cajero automtico y lea la opcin elegida. Si
la opcin elegida por el usuario es incorrecta
se debe repetir el men hasta que teclee una
opcin correcta. Las opciones posibles son:
1.
2.
3.
4.

Extraer dinero
Ingresar dinero
ltimos movimientos
Salir

29

#include <stdio.h>
void main()
{
int opcion;
Repite el bucle hasta
que selecciona una
do
opcin correcta:
{
valida la lectura
printf(1.- Extraer dinero\n);
printf(2.- Ingresar dinero\n);
printf(3.- ltimos movimientos\n);
printf(4.- Salir del men\n" );
scanf( "%d", &opcion );
}
while (opcion<1 || opcin>4);
}

Ejercicio
Escribir un programa que muestre el men de
una mquina de caf. Las opciones posibles
son:
A.
B.
C.
D.
E.
F.

Caf slo
Caf cortado
Caf con leche
Capuchino
T
Apagar mquina

30

#include <stdio.h>
void main()
{
char opcion;
do
{
prinft(Indique opcin deseada:\n);
prinft(A. Caf slo\nB.- Caf cortado\nC.- Caf con leche\n
D.- Capuchino\nE.- T\nF.- Apagar mquina\n);
scanf(%c,&opcion);
switch (toupper(opcion))
{
case A: printf(Caf slo);
break;
case B: printf(Caf cortado);
break;
case C: printf(Caf con leche);
break;
case D: printf(Capuchino);
break;
case E: printf(T);
break;
case F: printf(Salir);
break;
default
rintf (Opcin no valida);
}
}
while (opcion!=F);
}

Repite el bucle
hasta que
selecciona la
opcin de
salida

5. Bucle infinito
z
z

Bucle que se repite eternamente.


Esto ocurre porque nunca deja de cumplirse
la condicin del bucle
Ejemplos:
for ( ; ; )
printf(Hola\n);

n=0;
do
{
printf(Hola\n);
}
while (n==0);

n=0;
while (n==0)
{
printf(Hola\n);
}

31

Ejemplo

Leer 10 nmeros y
sumarlos.
Hace lo que se pide?

void main()
{
int n, suma, numero;
prinft(Cantidad de nmeros a leer: );
El valor de n nunca
scanf(%d,&n);
cambia BUCLE
suma=0;
INFINITO
while (n!=0)
{
printf(Valor del nmero: );
scanf(%d,&numero);
Cmo
suma+=numero;n--;
solucionarlo?
}
printf(El valor de la suma es: %d\n, suma);
}

6. Utilizacin de cada tipo de


bucle
Depende de:
z
z

Nmero de iteraciones
Bucles con condicin de entrada o de salida

32

Nmero de iteraciones
N mnimo de
iteraciones

N mximo de
iteraciones

while

Variable

do ... while

Variable

for

Fijo

Condicin de entrada o salida


z

Bucles con condicin de entrada: evalan la


condicin antes de entrar al bucle (for y while).
z

Necesarios cuando el bucle puede no ejecutarse


dependiendo de cierta condicin.
Ante la duda, son ms legibles con condicin de entrada.

Bucles con condicin de salida: evalan la


condicin despus de ejecutar el cuerpo del bucle,
por lo que siempre ejecutan al menos una vez el
cuerpo (do-while).

33

Bucles con condicin de


entrada: for y while
z
z

Funcionalmente son idnticos.


Se usa for cuando:
z
z

Se inicializa y actualiza una variable (contador).


Se conoce de antemano el nmero de
iteraciones.

Se usa while cuando:


z

La condicin del bucle depende de condiciones


que no sea el incremento de variables.

Ejemplo
/* Suma los 100 primeros nmeros enteros positivos */
suma=0;
for (cont = 1; cont <= 100; cont++)
suma += cont;
/* Suma nmeros hasta que el total sea >= 1000 */
suma=0;
while (suma<1000)
{
printf(Dime un nmero:);
scanf(%d,&n);
suma += n;
}

34

Conversin de bucles
while for

while (condicin)
cuerpo;

for ( ; condicin; )
cuerpo;

for while

for (inicializar; condicin;


actualizar)
cuerpo;

inicializar;
while (condicin)
{
cuerpo;
actualizar;
}

do

instruccin;
while (condicin)
{
instrucciones;
}

do-while while

{
instrucciones;
}
while (condicin) ;

Ejercicio
Escribir un programa que lea un nmero entre
1 y 100 (el programa debe asegurarse que el
nmero es correcto).
Despus, debe calcular el factorial del nmero.
Decidir cual es el tipo de bucle ms apropiado.

35

#include <stdio.h>
void main()
{
char N, i;
double Factorial;

#include <stdio.h>
void main()
{
char N, i;
double Factorial;

/*Bucle de validacin del nmero ledo */


printf (Nmero (0 100): );
scanf(%d, &N);
while ((N<0) || (N>100))
{
printf (Nmero (0 100): );
scanf(%d, &N);
}

/*Bucle de validacin del nmero ledo */


do
{
printf (Nmero (0 100): );
scanf(%d, &N);
}
while ((N<0) || (N>100));

/*Bucle de clculo de factorial*/


i = 1;
Factorial = 1;
while (i<=N)
{
Factorial *= i;
i++;
}
printf (El factorial de %d es %g \n, N,
Factorial);
}

/*Bucle de clculo de factorial */


Factorial = 1;
for(i=1;i<=N; i++)
Factorial *= i;
printf (El factorial de %d es %g \n, N,
Factorial);
}

Mejor opcin

Ejercicio
Leer un nmero entero (long int) y decir si es
capica.
Ejemplo:
12321 es capica
4567 no es capica
3 es capica

36

Algoritmo:
z
z

Pedir un nmero.
Mientras queden cifras.
z
z

Quitar la ltima cifra.


Poner la ltima cifra como primera de un nuevo
nmero.

Si el nuevo nmero y el antiguo son iguales:


capica.

#include <stdio.h>
void main()
{
long int valor, nuevo=0, aux_valor;
int resto;
printf("Introduce un valor: "); scanf("%ld", &valor);
aux_valor = valor;
while (aux_valor>0)
{
/* Toma la ltima cifra */
resto = aux_valor % 10;
aux_valor = aux_valor / 10;
/* La pone como primera de un nuevo nmero */
nuevo = (nuevo * 10) + resto;
}
if (valor == nuevo)
printf("Capica\n");
else
printf("No es capica\n");
}

37

while (aux_valor>0) {
resto = aux_valor % 10;
aux_valor = aux_valor / 10;
nuevo = (nuevo * 10) + resto;}

valor

resto

aux_valor

nuevo

12321

12321

12321

12321

1232

0 x 10 + 1 = 1

12321

123

1 x 10 + 2 = 12

12321

12

12 x 10 + 3 = 123

12321

123 x 10 + 2 = 1232

12321

1232 x 10 + 1 = 12321

12321

12321

7. Ficheros y bucles
z
z

Los ficheros finalizan siempre con el carcter EOF.


La funcin fscanf retorna EOF cuando, realizando la
lectura, uno de los datos que ha ledo es EOF.
Para leer el contenido de un fichero se puede leer
hasta que se encuentre EOF.
while (fscanf(f, %d%f, &a, &b)!=EOF)
printf(%d %f\n, a, b);

38

Ejercicio
Leer caracteres del fichero a.txt. Escribir slo
uno de cada 3 caracteres, en el fichero b.txt.

abcdefg

adg

EOF
a.txt

EOF
b.txt

void main ()
{
int i=0;
char c;
FILE *e, *s;
if ((e=fopen(a.txt, r))==NULL)
printf(No se puede abrir el fichero a.txt\n);
else
{ /* 1 */
if ((s=fopen(b.txt, w))==NULL)
printf(No se puede abrir el fichero b.txt\n);
else
{ /* 2 */

39

while (fscanf(e, %c, &c)!=EOF)


{
if (i%3==0)
fprintf(s, %c, c);
i++;
}
fclose (s);
} /* 2 */
fclose (e);
} /* 1 */
}

while (fscanf(e, %c, &c)!=EOF)


{
if (i==0)
fprintf(s, %c, c);
i++;
if (i==3) i=0;
}
Otra versin

40

8. Bucles anidados
z
z

Anidar: incluir un bucle dentro de otro bucle.


Cada vez que ejecuta el bucle externo una
iteracin, se ejecutan todas las iteraciones del bucle
externo.
Puede anidarse cualquier tipo de bucle, no es
necesario que sean del mismo tipo.

Ejemplo:
for (i=0; i<10; i++)
for (j=0; j<30; j++)
....

Anidacin
Correcta
Incorrecta

El bucle ms interno
debe estar incluido
completamente dentro
del externo (no deben
existir solapamientos).

41

Ejercicio
for (i=0; i<3; i++)
{
for (j=0; j<5; j++)
printf(%d , j+1);
printf(\n);
}

Salida por pantalla?


12345
12345
12345

Ejercicio
for (i=0; i<5; i++)
{
for (j=0; j<=i; j++)
printf(%d , j+1);
printf(\n);
}

Salida por pantalla?


1
12
123
1234
12345

42

Ejercicio
for (i=0; i<5; i++)
{
for (j=1; j<=5-i; j++)
printf(%d , j);
printf(\n);
}

Salida por pantalla?


12345
1234
123
12
1

Ejercicio
Se dispone de los datos sobre las edades y
coeficientes de inteligencia (CI) de los hijos de varias
familias. Escribir un programa en C que lea el nmero
de familias y para cada familia lea el nmero de hijos
as como la edad y el CI de cada hijo, y calcule:
z

z
z
z

El nmero mximo, mnimo y promedio de hijos por


familia.
El CI mximo, mnimo y promedio de todos los hijos.
El CI promedio de los hijos menores de 6 aos.
El CI promedio de los hijos mayores de 6 aos.

43

Algoritmo:
z
z

Pedir el nmero de familias


Para cada familia:
z
z
z

Pedir el nmero de hijos


Clculos de mximo y mnimo de n de hijos
Para cada hijo:

Pedir el CI y edad del hijo


Clculos de valores solicitados

Nota:
z

INT_MAX: Constante incluida en limits.h


que da el mayor valor entero
representable.

INT_MIN:
menor
representable.

valor

entero

44

#include <stdio.h>
#include <limits.h>
void main()
{
int i, j, total_hijos=0, max_hijos=0,
min_hijos=INT_MAX, max_ci=0,
min_ci=INT_MAX, menores6=0,
mayores6=0, ci_menores6=0,
ci_mayores6=0, familias, hijos, edad, ci,
total_ci=0;
printf("Nmero de familias: ");
scanf("%d",&familias);

for (i=1; i<=familias; i++)


{
printf("Nmero de hijos de la familia %d: ",i);
scanf("%d",&hijos);
/* Mximo y mnimo de hijos por familia */
if (hijos>max_hijos)
max_hijos = hijos;
if (hijos<min_hijos)
min_hijos = hijos;
/* Total de hijos para calcular la media de
hijos por familia */
total_hijos += hijos;

45

for (j=1; j<=hijos; j++)


{
printf("Edad del hijo %d: ", j);
scanf("%d",&edad);
printf("CI del hijo %d: ", j);
scanf("%d",&ci);
/* CI mximo y mnimo */
if (ci>max_ci) max_ci = ci;
if (ci<min_ci) min_ci = ci;
/* CI total de los hijos para la media */
total_ci += ci;

/* CI de menores y mayores de 6 aos */


if (edad<6)
{
ci_menores6 += ci;
menores6++;
}
else
{
ci_mayores6 += ci;
mayores6++;
}
} /* For de hijos por familia */
} /* For de familias */

46

if (familias>0)
printf("Hijos por familia, mximo: %d, mnimo:
%d, promedio: %f\n", max_hijos, min_hijos,
total_hijos/(float)familias);
if (total_hijos>0)
printf("CI, mximo: %d, mnimo: %d, promedio:
%f\n", max_ci, min_ci, total_ci/(float)total_hijos);
if (menores6>0)
printf("Promedio, menores 6: %f,
ci_menores6/(float)menores6);
if (mayores6>0)
printf("Promedio, mayores 6: %f\n",
ci_mayores6/(float)mayores6);
}

Ejercicio
Calcular y para una n y x dadas por el
usuario:

1 x 1
y=

i =1 i x
n

47

#include <stdio.h>
Versin 1: con
bucles anidados.
void main ()
{
int n, i, j;
float x, y=0, aux_valor, termino, valor;
printf("Dame el nmero de trminos: ");
scanf("%d", &n);
printf("Dame el valor x: ");
scanf("%f", &x);
/* Clculo de la parte constante del sumatorio */
valor = (x-1)/x;

for (i=1; i<=n; i++)


{
/* Clculo de ((x-1)/x)i */
aux_valor=1;
for (j=1; j<=i; j++)
aux_valor = aux_valor * valor;
/* Clculo del trmino */
termino = aux_valor / (float)i;
/* Sumar el trmino a y */
y = y + termino;
}
printf("y=%f\n",y);
}

48

#include <stdio.h>
Versin 2: sin
void main ()
bucles anidados.
{
int n, i;
float x, y=0, aux_valor=1, termino, valor;
printf("Dame el nmero de trminos: "); scanf("%d", &n);
printf("Dame el valor x: "); scanf("%f", &x);
valor = (x-1)/x; /* Clculo de la parte constante del sumatorio */
for (i=1; i<=n; i++)
{
aux_valor = aux_valor * valor;
termino = aux_valor / (float)i;
y = y + termino;
}
printf("y=%f\n",y);
}

#include <stdio.h>
#include <math.h>
void main ()
{
int n, i;
float x, y=0, termino, valor;

Versin 3: sin
bucles anidados y
con pow

printf("Dame el nmero de trminos: "); scanf("%d", &n);


printf("Dame el valor x: "); scanf("%f", &x);
valor = (x-1)/x; /* Clculo de la parte constante del sumatorio */
for (i=1; i<=n; i++)
{
termino = pow(valor,i) / (float)i;
y = y + termino;
}
printf("y=%f\n",y);
}

49

También podría gustarte