2. Ciclos anidados
2
Bucles anidados
Los bucles anidados constan de un bucle externo con uno o más bucles internos. Cada vez
que se repite el bucle externo, los bucles internos se repiten, se vuelven a evaluar los
componentes de control y se ejecutan todas las iteraciones requeridas.
Ejemplo # 1
#include <stdio.h>
void main(void)
{
int i, y;
for(i = 1; i< =3; i++)
{
for(y = 1; y < =2; y++)
printf("#t");
printf("n");
}
}
Ejemplo # 2
#include<stdio.h>
void main(void)
{
int i, y;
for(i = 1; i<=2; i++)
{
for(y = 1; y<=3; y++)
printf("$t");
printf("n");
}
}
3. Ciclos anidados
3
Ejemplo #3:
//anidamiento1.c
#include <stdio.h>
int x,y, xultimo = 2, yultimo = 4;
void main(void)
{
for(x = 1; x <= xultimo; x++)
for(y = 1; y <= yultimo; y++)
{
int producto;
producto = x * y;
printf(" %d * %d = %d n",x,y,producto);
}
}
Ejemplo #4:
//anidamiento2.c
#include <stdio.h>
int i,j;
void main(void)
{
printf("n tt i t j n");
for(i = 0; i < 4; i++)
{
printf("Externo t %d n",i);
for(j = 0; j < i; j++)
printf("Interno tt %d n",j);
}
}
4. Ciclos anidados
4
Ejemplo #5:
Realice un programa que calcule el promedio de tres notas para 10 alumnos. El ejemplo
de una salida puede ser:
Nombre del alumno #1: Luis Pérez
Materia: Matemática Básica
Nota 1: 100
Nota 2: 90
Nota 3: 90
El promedio es: 93.33
//alumnosanidados2.c
#include<stdio.h>
#include <string.h>
char nombre[100];
char materia[70];
int i,k,nota;
float promedio,sumparc;
5. Ciclos anidados
5
void main(void)
{
for(i=1;i<=5;i++)
{
printf("Nombre del alumno #%d: ",i);
fflush(stdin);
gets(nombre);
sumparc=0;
printf("Materia: ");
fflush(stdin);
gets(materia);
for(k=1;k<=3;k++)
{
printf("Nota %d: ",k);
scanf("%d",¬a);
sumparc=sumparc + nota;
}//fin del for k
promedio=sumparc/3;
printf("El promedio es:%.2fnnn",promedio);
}//fin del for padre
}
6. Ciclos anidados
6
Ejemplo #6:
La función factorial se aplica a enteros positivos. El factorial de un entero positivo n es
(!n) es igual al producto de los enteros positivos del 1 al n. Escriba un programa que
calcule los factoriales de los enteros del 1 al 5.
Ejemplo: !3 = 1*2*3 = 6
Sugerencia: Primero calcular el factorial para un solo número, luego introducir un
ciclo que vaya del 1 al 5.
//factorialanidado3.c
#include <stdio.h>
void main(void)
{
int num, i;
long fac;
//printf("Ingrese el numero: ");
//scanf("%d",&num);
for(num = 1; num <= 5; num++)
{
fac = 1;
for(i = 1; i <= num; i++)
fac = fac * i;
printf("nEl factorial de %d es: %ldn",num,fac);
}
}
7. Ciclos anidados
7
Ejemplo #7:
Escriba un programa que calcule y visualice:
1! + 2! + 3! + … + (n – 1)! + n!
//factorialanidado2.c
#include <stdio.h>
void main(void)
{
int n, i = 1, m;
float fact, suma = 0;
printf("Ingrese el valor de n: ");
scanf("%d",&n);
do
{
fact = 1;
m = i;
while(m > 1)
{
fact *= m;
m--;
}
suma+=fact;
printf("t %d! = %0.f n",i,fact);
i++;
}while(i <= n);
printf("ntsuma = %0.fnn",suma);
}
8. Ciclos anidados
8
Ejemplo #8:
El siguiente programa imprime una tabla de m filas por n columnas y un carácter de
entrada.
//filascolumnas.c
#include <stdio.h>
int filas, columnas;
int i, j;
char elCar;
void main()
{
printf("¿Cuantas filas?: ");
scanf("%d",&filas);
printf("¿Cuantas columnas?: ");
scanf("%d",&columnas);
printf("¿Que caracter?:");
fflush(stdin);
elCar=getchar();
/* bucle externo */
for(i = 0; i < filas; i++)
{
/*bucle interno */
for(j = 0; j < columnas; j++)
putchar(elCar);
putchar('n');
}
}
9. Ciclos anidados
9
Ejercicios resueltos
1. Diseñar e implementar un programa que solicite a su usuario un valor no
negativo n y visualice la siguiente salida:
1 2 3 … n-1 n
1 2 3 … n-1
….
1
Solución en Lenguaje C:
//triangulonum.c
#include <stdio.h>
int k, i ,n;
void main(void)
{
do
{
printf("Introduzca un valor entero:");
scanf("%d",&n);
}while(n<=0);
i = n;
while(i >= 1)
{
k = 1;
while(k <= i)
{
printf("%dt",k);
k++;
}
printf("n");
i--;
}
}
10. Ciclos anidados
10
2. Una aplicación de las computadoras es dibujar gráficos de barra(llamados
histogramas). Escriba un programa que dibuje un gráfico como el siguiente donde la
cantidad de asteriscos de cada línea corresponda al número que está a la par.
Solución en Lenguaje C:
/*histogra.c*/
#include<stdio.h>
int naster,nlineas,i;
void main(void)
{
for(nlineas=3;nlineas<=9;nlineas++)
{
if(nlineas % 2!=0)
{
printf("%d.| ",nlineas);
for(naster=1;naster<=nlineas;naster++)
printf("*");
printf("n");
}
else
printf(" |n");
}//fin del for padre
3. | ***
|
5. | *****
|
7. | *******
|
9. | *********
|____________
11. Ciclos anidados
11
printf(" |");
for(i=1;i<=12;i++)
printf("_");
printf("nn");
}//fin del programa
3. Diseñar un programa que produzca la siguiente salida:
ZYXWVUTSRQPONMLKJIHGFEDCBA
YXWVUTSRQPONMLKJIHGFEDCBA
XWVUTSRQPONMLKJIHGFEDCBA
WVUTSRQPONMLKJIHGFEDCBA
VUTSRQPONMLKJIHGFEDCBA
UTSRQPONMLKJIHGFEDCBA
TSRQPONMLKJIHGFEDCBA
SRQPONMLKJIHGFEDCBA
RQPONMLKJIHGFEDCBA
QPONMLKJIHGFEDCBA
PONMLKJIHGFEDCBA
ONMLKJIHGFEDCBA
NMLKJIHGFEDCBA
MLKJIHGFEDCBA
LKJIHGFEDCBA
KJIHGFEDCBA
JIHGFEDCBA
IHGFEDCBA
HGFEDCBA
GFEDCBA
FEDCBA
EDCBA
DCBA
CBA
BA
A
14. Ciclos anidados
14
Ejercicios propuestos
1. Escribir un programa que visualice la siguiente salida:
1
1 2
1 2 3
1 2 3 4
1 2 3
1 2
1
2. Se desea obtener el promedio de g grupos que están en un mismo año escolar;
siendo que cada grupo puede tener n alumnos, que cada alumno puede llevar m
materias y que en todas las materias se promedian tres calificaciones para obtener
el promedio de la materia. Lo que se desea desplegar es el promedio de los grupos,
el promedio de cada grupo y el promedio de cada alumno.
3. El profesor de una materia desea conocer la cantidad de sus alumnos que no
tienen derecho al examen de nivelación.
Diseñe un programa que lea las calificaciones obtenidas en las 5 unidades por cada
uno de los 40 alumnos y escriba la cantidad de ellos que no tienen derecho al
examen de nivelación.
4. Escriba un programa que imprima la forma en diamante siguiente. Puede utilizar
enunciados printf que impriman ya sea un (*), o un espacio en blanco. Maximice
su utilización de repeticiones(utilizando estructuras for anidadas) y minimice el
número de enunciados printf.
*
* *
* * * *
* * * * * *
* * * * * * * *
* * * * * *
* * * *
* *
*
15. Ciclos anidados
15
5. Realice un programa que dé como salida lo siguiente:
6. Escriba un programa que imprima los siguientes patrones por separado, uno
debajo del siguiente. Utilice ciclos for para generar los patrones. Todos los
asteriscos deberán ser impresos por un solo enunciado printf de la forma
printf(“*”); esto hace que los asteriscos se impriman uno al lado del otro.
Sugerencia: los dos últimos patrones requieren que cada línea empiece con un
número correcto de espacios en blanco.
(A) (B) (C) (D)
* ********** ********** *
** ********* ********* **
*** ******** ******** ***
**** ******* ******* ****
***** ****** ****** *****
****** ***** ***** ******
******* **** **** *******
******** *** *** ********
********* ** ** *********
********** * * **********
7. Una compañía de seguros tiene contratados a n vendedores. Cada uno hace tres
ventas a la semana. Su política de pagos es que un vendedor recibe un sueldo
base, y un 10% extra por comisiones de sus ventas. El gerente de su compañía
desea saber cuánto dinero obtendrá en la semana cada vendedor por concepto de
comisiones por las tres ventas realizadas, y cuanto tomando en cuenta su sueldo
base y sus comisiones.
*
**
***
****
*****
******
*******
********
*********