Documentos de Académico
Documentos de Profesional
Documentos de Cultura
For While
For While
ETSID
Tema 4: Estructuras de
Repeticin (Bucles).
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
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
Partes de un bucle
Repetir 100 veces
Restarlos
Tipos de bucles
for
while
do-while
La diferencia entre ellos depende de:
z
Bucle for
2. Bucle for
for (inicializacin; condicin; incremento)
instrucciones;
z
z
z
z
z
Inicializacin: le da a la
variable i el valor 1.
Ejemplo:
Incremento: en cada
iteracin del bucle la variable
i se incrementa en 1.
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
Cierto
printf(%d\n,i);
1
2
i++
3
4
5
Resto de Instrucciones
Ejemplo
Cul es la salida por pantalla del
siguiente bucle for?
1
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
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
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
2
4
6
Fuera: 7
0
0
0
0
Bucle infinito
10
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;
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
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
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
z
z
while (condicin)
instruccin;
Condicin
Falso
z
z
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++;
}
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
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;
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.
24
#include <stdio.h>
void main()
{
int n, suma=0, numero;
printf(Dme un nmero: );
scanf(%d,&numero);
Bucle do-while
25
4. Bucle do-while
z
z
z
z
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);
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
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
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);
}
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
33
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
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;
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
#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
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
40
8. Bucles anidados
z
z
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);
}
Ejercicio
for (i=0; i<5; i++)
{
for (j=0; j<=i; j++)
printf(%d , j+1);
printf(\n);
}
42
Ejercicio
for (i=0; i<5; i++)
{
for (j=1; j<=5-i; j++)
printf(%d , j);
printf(\n);
}
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
43
Algoritmo:
z
z
Nota:
z
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);
45
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;
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
49