informática tema 5 - estructuras de control estructuras de repetición

Post on 23-Jan-2016

279 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Informática

Tema 5 - Estructuras de Control

Estructuras de Repetición

Índice

• Necesidad

• Conceptos

• El while

• Bucle infinito

• El do...while

• El for

Necesidad

• En ciertos problemas es necesario ejecutar una instrucción o bloque de instrucciones más de una vez:P.e: “Hacer un programa en C que calcule la

suma de N números enteros leídos desde teclado”

• Hay veces que conocemos el número de veces que deben repetirse y otras veces finalizará cuando se satisfaga una condición.

Conceptos

• A las estructuras de repetición se les conoce con el nombre de “bucle”.

• A cada repetición de las instrucciones de un bucle se le denomina “iteración”. Así se habla de primera iteración del bucle, segunda iteración, etc...

El while

• Sintaxis:while (exp_condicional)

bloque¿exp?

Bloque

Resto de instrucciones

Cierto(1)

Falso(0)

while

• Ejemplo 1: “Hacer un programa en C que calcule la suma de N números enteros leídos desde teclado”

• Algoritmo:– Pedir el valor que va a tener N.– Poner a cero una variable acumulador.– Mientras n sea distinto de cero:

• Pedir un valor

• Acumular el valor en la variable

– Mostrar el resultado de la variable acumulador.

/* ejemplo 1*/main(){

int N,suma,numero;prinft(“Deme la cantidad de numeros a leer: ”);scanf(“%d”,&N); /* numero de veces a ejecutarse */

suma=0; /* guarda la suma */

while (N!=0) {printf(“Deme el valor del numero: “);scanf(“%d”,&numero);suma=suma+numero; /*se van acumulando valores*/

N=N-1; /* se decrementa el contador*/

}printf(“el valor de la suma es: %d\n”,suma);

}

• Ejemplo 2: “Hacer un programa en C que muestre por pantalla la tabla de multiplicar de un numero introducido por teclado”

• Algoritmo:– Pedir el número.– Poner un contador a cero.– Mientras que el contador sea menor o igual a

10:• Sacar por pantalla el resultado del numero

multiplicado por el contador.

• Incrementar el contador.

/* ejemplo 2*/

main(){

int num,contador;

prinft(“Deme el numero: ”);

scanf(“%d”,&num); /* obtener el numero */

contador=0; /* iniciamos el contador a cero */

while (contador<=10) {

printf(“%4d por %4d es %4d“,num,contador,num*contador);

contador=contador+1; /* se incrementa el contador*/

}

}

• En ambos ejemplos se conoce cuantas veces se debe ejecutar el bloque de instrucciones del while. La expresión del while se convierte normalmente en una compro-bación del valor del contador .

(contador<=10) y (N!=0)• Se define el contador como una variable

que se incrementa o decrementa un valor constante en cada iteración del bucle y que nos permite contabilizar en que iteración nos encontramos del bucle.

• Puede ser que no conozcamos el número de veces a ejecutar:– P.e.: “Calcular la suma de números introdu-

cidos desde teclado hasta introducir un cero”

En este caso no hay contador, no conocemos la iteración en la que nos encontramos en cada momento y es el valor del número introducido el que determina el final del bucle.En la expresión deberemos controlar el valor del numero introducido, es decir: “Mientras que el número sea distinto de cero”

• Algoritmo:– Pedir el número.– Poner a cero la variable que va a acumular los

valores.– Mientras que el número sea distinto de cero:

• Acumular el valor del número en la variable.• Pedir un nuevo numero

– Mostrar por pantalla el contenido de la variable

donde se han ido acumulado los números.

/* ejemplo 3*/main(){

int n,suma,numero;

printf(“Deme el valor del numero: “);scanf(“%d”,&numero);

suma=0; /* guarda la suma */

while (numero!=0) {suma=suma+numero;printf(“Deme el valor del numero: “);scanf(“%d”,&numero);

}printf(“el valor de la suma es: %d\n”,suma);

}

Bucle infinito• Un bucle infinito es un bucle que se repite

infinitas veces, típicamente, nunca deja de cumplirse la condición del bucle.

• P.e: Si en el ejemplo 1 nos olvidamos de decrementar la variable contador.

while (n!=0) {printf(“Deme el valor del numero: “);scanf(“%d”,&numero);suma=suma+numero; /*se van acumulando

valores*/

}

El do...while

• Sintaxis:

do

bloque

while (exp_condicional);¿exp?

Bloque

Resto de instrucciones

Cierto(1)

Falso(0)

do

while

Características

• Se ejecuta el bloque de instrucciones al menos una vez. Ello lo hace especialmente indicado para validar datos de entrada. (Ver ejemplo, pag. siguiente)

• Aunque es parecido al while no siempre existe una correspondencia entre ellos.– P.e.: intentar hacer el ejemplo 3.

/*ejemplo 2 comprobando la entrada entre 1 y 9*/

main(){

int num,contador;

do {

prinft(“Deme el numero entre 1 y 9: ”);

scanf(“%d”,&num); /* obtener el numero */

} while ((num<1)||(num>9));

/* comprueba si num está fuera del intervalo 1-9*/

contador=0; /* iniciamos el contador a cero */

while (contador<=10) {

printf(“%4d por %4d es %4d“,num,contador,num*contador);

contador=contador+1; /* se incrementa el contador*/

}

}

El for• Se suele emplear cuando se conoce el

número de iteraciones a realizar.

• Sintaxis:for(exp1;exp2;exp3)

bloque

La exp1 suele contener inicializaciones de vbles. Las instrucciones que se encuentren en esta parte del for sólo se ejecutarán una vez antes de cualquier iteración del bucle, si tiene más de una deberá ser separadas por una coma.

La exp2 contiene una expresión condicional al estilo del while que controla la ejecución o no del bloque de instrucciones.

La exp3 contiene instrucciones que se deben ejecutar en cada iteración del bucle. p.e. El incremento/decremento de un contador, si contiene más de una instrucción, deberán ir separadas por comas. Estas instrucciones se ejecutan al final de cada iteración.

P.e: for(i=0;i<10;i++)

for(i=0,j=N;i<N;i++,j--)

¿exp2?

exp1

Resto de instrucciones

Cierto(1)

Falso(0)

for

bloque

exp3

/*ejemplo 2 comprobando la entrada entre 1 y 9*/

main(){

int num,contador;

do {

prinft(“Deme el numero entre 1 y 9: ”);

scanf(“%d”,&num); /* obtener el numero */

} while ((num<1)||(num>9));

/* comprueba si num está fuera del intervalo 1-9*/

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

{

printf(“%4d por %4d es %4d“,num,contador,num*contador);

}

}

Correspondencia for-while

• Un for siempre se puede substituir por un while y viceversa

exp1

for(exp1;exp2;exp3) while (exp2) {

bloque bloque

exp3

}

Algunos for’s y while’s singulares

• for(;;) /*bucle infinito*/

• for(;exp2;) /*sin exp1 y sin exp3*/

• while(1) /*bucle infinito*/

Problemas

• Realizar un programa en C que calcule la multiplicación de dos números enteros a y b empleando sólo la operación suma.

• Realizar un programa en C que calcule a elevado b siendo a y b enteros y empleando sólo la operación multiplicación.

• Realizar un programa en C que calcule la a elevado b siendo a y b enteros y empleando sólo la operación suma.

main () { int a,b,mult; printf ("deme dos numeros enteros: "); scanf("%d%d",&a,&b); mult=0; while (b>0) { mult=mult+a; b--; } printf("el resultado es %d\n",mult); }

Finalización anticipada de un bucle

Escribir un programa en C para determinar si un numero entero es primo o no.– Pedir un numero entero.– Comprobar si es divisible por el 2, el 3, 4, 5, etc

hasta llegar al numero.– Si he llegado al numero es primo, sino es que

he encontrado un numero por el que es divisible.

/* solucion 1*/

main() {int num,i,primo;printf(“deme un numero entero positivo: ”);scanf(“%d”,&num);i=2;primo=1;while (i<num) {

if ((num%i)==0)primo=0;

i++;}if (primo)

printf(“El numero es primo”);else

printf(“El numero no es primo”);}

/* solucion 2*/

main() {int num,i,primo;printf(“deme un numero entero positivo: ”);scanf(“%d”,&num);i=2;primo=1;while ((i<num) && (primo)) {

if ((num%i)==0)primo=0;

i++;}if (primo)

printf(“El numero es primo”);else

printf(“El numero no es primo”);}

/* solucion 3*/

main() {int num,i;printf(“deme un numero entero positivo: ”);scanf(“%d”,&num);i=2;while ((i<num) && ((num%i)!=0))

i++;if (i==num)

printf(“El numero es primo”);else

printf(“El numero no es primo”);}

/* solucion 4*/

main() {int num,i;printf(“deme un numero entero positivo: ”);scanf(“%d”,&num);for(i=2;((i<num) && ((num%i)!=0));i++){ }if (i==num)

printf(“El numero es primo”);else

printf(“El numero no es primo”);}

Problema

• Hacer un programa en C que calcule el factorial de un numero i!=i-1*i-2*i-3*…*1

• Hacer programa que calcule ex segun Tailor:

N

i

ix

i

xe

0 !

top related