clase 9 - Web del Profesor

Anuncio
Estructuras de
Repetición:
Repita Mientras.
Andrés Arcia
Departamento de Computación
Escuela de Ingeniería de Sistemas
Facultad de Ingeniería
Universidad de Los Andes
15/05/05
Programación Digital I
1
Programación Estructurada
La programación estructurada es un paradigma que
consiste en la organización de un código en bloques
conformados por estructuras del tipo:
Secuencial (asignación, lectura, escritura)
Decisión o selección (simple, doble, múltiple)
Repetición (Repita mientras, Hacer-Mientras, Repita para)
15/05/05
Programación Digital I
2
Estructuras de Repetición
Estructura de repetición o lazo
Permite que un conjunto de sentencias (bloque) de
un programa puedan ser ejecutadas repetidamente
según el resultado de una expresión lógica.
Tipos de estructuras de repetición
Repetición condicional o controlada por un
centinela: REPITA-MIENTRAS y HACERMIENTRAS.
Repetición controlada por un contador: REPITA
-PARA.
Conceptos Básicos
15/05/05
Contador
Acumulador
Programación Digital I
3
Contador
Variable cuyo valor se incrementa o
decrementa en una cantidad constante
cada vez que se produce un determinado
suceso o acción. Se debe realizar
primeramente una operación de
inicialización y posteriormente los
correspondientes incrementos o
decrementos.
15/05/05
Programación Digital I
4
Operaciones sobre un Contador
Inicialización:
contador = valor inicial
Incremento/decremento:
contador = contador + valor_constante
contador = contador – valor_constante
Ejemplo
// inicialización
int i=0, j=1000;
i++;
// incremento
i+=15; // incremento
j--; //decremento
j-=10; //decremento
¿Cuántas iteraciones hacen falta para que j llegue a 0 (cero)?
15/05/05
Programación Digital I
5
Acumulador
Variable cuyo valor se incrementa o
decrementa en una cantidad variable cada
vez que se produce un determinado
suceso o acción. Se debe realizar
primeramente una operación de
inicialización y posteriormente los
correspondientes incrementos o
decrementos.
15/05/05
Programación Digital I
6
Operaciones sobre un Acumulador
Inicialización:
acumulador = valor inicial
Acumulación:
acumulador = acumulador + valor
acumulador = acumulador * valor
acumulador = acumulador - valor
acumulador = acumulador / valor
15/05/05
Programación Digital I
7
Ejemplo
float iterador = 0, nota = 15.5;
unsigned multiplicador = 1; // valor distinto de cero
signed divisor = 2021;
- Acumular (Incrementos)
iterador = iterador + nota;
multiplicador = multiplicador * nota;
multiplicador *= nota;
- Acumular (Decrementos)
iterador = iterador – nota;
multiplicador /= nota;
15/05/05
Programación Digital I
8
Centinela
Es el valor asignado a una variable que hace que se
ejecute un bloque de instrucciones. Por lo general existen
dos puntos críticos dentro del algoritmo, cuando se
pregunta por el valor centinela y cuando se cambia de
valor.
Ejemplo
char bandera = 1;
inicio:
…
// cuerpo del programa;
…
// punto de cambio;
bandera = 0;
if (bandera) goto inicio;
15/05/05
Programación Digital I
9
Repita Mientras
Diagrama de flujo
Pseudocódigo en español
Repita mientras (condición)
S1
…
Sn
Fin_RM
Código en C
while (condición)
{
S1
…
Sn
}
15/05/05
Programación Digital I
10
Repita Mientras
Las sentencias (una o más) del cuerpo del lazo se
ejecutan mientras la condición (expresión lógica) es
cierta. Cuando la condición es falsa, termina la
ejecución del lazo.
Se pregunta al principio por la condición, por tanto el
lazo se ejecuta cero (si la primera vez la condición es
falsa) o mas veces.
Si la condición nunca se hace falsa, el programa entra
en un “lazo infinito”, es decir, las sentencias del cuerpo
del lazo se ejecutarán indefinidamente.
15/05/05
Programación Digital I
11
Repita Mientras
Hay que estar pendientes de INICIALIZAR las variables
que intervienen en la condición antes de ejecutar el lazo
por primera vez, ya que lo primero que hace la
estructura es evaluar la condición.
Hay que estar pendientes de MODIFICAR dentro del
cuerpo del lazo los valores de las variables que
intervienen en la condición, para garantizar que en algún
momento ésta se haga falsa y el lazo pueda terminar su
ejecución y así tratar que el lazo no sea infinito.
15/05/05
Programación Digital I
12
Ejemplo
Pseudocódigo en Español
Código en C
i=0;
#define MAX 1000
REPITA MIENTRAS (i<MAX)
i=i+1;
Escribir (i)
Fin_RM.
int i=0;
while (i < MAX)
{
i++;
printf(“%i”,i);
}
NOTA: recuerde usar las
llaves {} cuando haya más
de una instrucción.
15/05/05
Programación Digital I
13
Ejemplo
Pseudocódigo en Español
Código en C
pot = 1
#define MAXPOT 500
REPITA MIENTRAS (pot < 500)
pot = pot * 2;
int pot=1;
while (pot < MAXPOT)
Fin_RM
pot *=2;
Escribir(“potencia =“,pot)
printf(“potencia: %i“,pot);
NOTA: recuerde que puede
omitir las llaves {} cuando
hay solo una instrucción.
15/05/05
Programación Digital I
14
Ejemplo
Pseudocódigo en Español
Código en C
bandera = cierto;
contador = 1;
REPITA MIENTRAS (bandera =
cierto)
Escribir(contador)
contador = contador + 1
Si (contador = 10)
bandera = falso;
Fin_si
Fin_RM
#define true 1
char bandera=true;
int contador=1;
15/05/05
while (bandera)
{
printf(“%i”,contador);
contador++;
if (contador == 10)
bandera = !bandera;
}
Programación Digital I
15
Ejemplo
Pseudocódigo en Español
Código en C
seguir = verdadero
respuesta = ‘s’
REPITA MIENTRAS (seguir=verdadero)
Escribir (“¿Seguir repitiendo?”)
Leer (respuesta)
Si respuesta = ‘n’
seguir = falso
Fin_Si
Fin_RM
char seguir = TRUE;
char respuesta = ‘s’;
while (seguir)
{
printf(“¿Seguir
repitiendo?”);
scanf(“%c”,&respuesta);
if (respuesta == ‘n’)
seguir = false;
}
seguir = verdadero
REPITA MIENTRAS (seguir = verdadero)
contador = contador + 1
Fin_RM
char seguir = 1;
int contador = 0;
while(seguir)
contador+=1;
15/05/05
Programación Digital I
16
Ejemplo
Corrida en Frío
#include <stdio.h>
void main()
{
int i = 0,suma = 0;
while(i<5)
{
suma += i;
i++;
printf(“%i”,suma);
}
}
15/05/05
Programación Digital I
Iteración i suma
(0)
0
0
(1)
1
0
(2)
2
1
(3)
3
3
(4)
4
6
(5)
5
10
17
Ejemplo
#include <stdio.h>
Corrida en Frío
void main ()
{
int i = 1;
while ( i < 3 )
{
printf(”i es menor que 3\n”);
i++;
}
printf(”Se termino el lazo\n”);
Iteración
i
(0)
1
(1)
2
(2)
3
}
15/05/05
Programación Digital I
18
Salidas abruptas del while
Algunas veces es conveniente salir de
forma abrupta de una estructura de
repetición. Para esto se utiliza la sentencia
break.
Según break, el lazo de repetición más
interno se cancelará.
15/05/05
Programación Digital I
19
Ejemplo de break
Observe que:
➢ Hay un par de while anidados
➢ El break esta dado por una
condición y se encuentra en el
while más interno.
➢ La condición que imperará en el
lazo interno será la del if.
Int i, j;
i=0;
j=0;
while (i>-1)
{
j++;
while (j<20)
{
printf(“Valor de j %i”,j);
if (j>=15) break;
// pueden haber mas instr.
}
}
15/05/05
Programación Digital I
20
Regreso abrupto a la condición
Dentro de un lazo de repetición, se pueden
hacer regresos abrutos a la condición que
gobierna al lazo.
El constructo en C para tal proposito es el
“continue”.
15/05/05
Programación Digital I
21
Ejemplo del continue
Supongamos que queremos procesar solamente los números
enteros positivos de un conjunto introducido por
teclado:
i=0;
while (i<10)
{
prinf(“Introduzca un número: “);
scanf(“%i”,&n);
if (n < 0)
continue;
else
{ i++;
printf(“Procesable”); }
}15/05/05
Programación Digital I
22
Ejemplo
Calcular la suma de n números introducidos por teclado.
Análisis E-P-S
Entradas: total de números (n ∈ Z), números (a1, a2, a3, …, an ∈ Z)
Proceso: Calcular suma = a1
+ a2 + a3 + … + an
Salidas: suma ∈ Z
15/05/05
Programación Digital I
23
Ejemplo
Algortimo
0.
1.
2.
3.
4.
5.
Inicio
Escribir (“Introduzca el número de elementos a sumar”)
Leer (n)
suma = 0
contador = 0
Repita mientras (contador < n)
contador = contador + 1
Escribir (“Introduzca un numero”)
Leer (num)
suma = suma + num
fin_RM
6. Escribir (suma)
7. Fin
15/05/05
Programación Digital I
24
Estructura de Repetición
“Repita mientras”: Ejemplo 3
Codificación
#include <stdio.h>
void main ()
{
int n, num, suma = 0, contador = 0;
printf(“Introduzca el número de
sumar”);
scanf(“%i”,n);
while (contador < n)
{
contador++;
printf(“Introduzca un numero”);
elementos
a
scanf(“%i”,&num);
suma += num;
}
15/05/05
}
printf(“Suma = %i\n“, suma);
Programación Digital I
25
Ejemplo. EPS.
Leer una serie de números reales y calcular su media.
La marca de fin de lectura será el –999
Análisis E-P-S
Entradas: num1, num2, num3, …, numn -999
Proceso:
- Acumular la suma e incrementar contador de números
mientras número leído sea diferente de -999
suma = num1 + num2 + num3 + … + numn
contador = contador + 1
- Calcular media = suma / contador
Salidas: media
15/05/05
Programación Digital I
26
Ejemplo. Algoritmo.
0.
1.
2.
3.
4.
5.
Inicio
contador = 0
suma = 0
Escribir (“Introduzca el primer número”)
Leer (num)
Repita mientras (num != -999)
contador = contador + 1
suma = suma + num
Escribir (“Introduzca un número”)
Leer (num)
Fin_RM
6. Si (contador != 0) entonces
media = suma/contador
Escribir (“La media es =”, media)
sino
Escribir (“El usuario no introdujo numeros”)
Fin_Si
7. Fin
15/05/05
Programación Digital I
27
Ejemplo. Código.
#include <stdio.h>
if (contador != 0)
{
media = suma/contador;
printf(“La media es = %i”,
media);
}
else
printf(“El usuario no
introdujo numeros”);
void main()
{
float contador = 0.0,
suma = 0.0, media;
printf(“Introduzca el primer
numero”;
scanf(“%i”,&num);
while (num != -999.0)
{
contador = contador +
1.0;
suma = suma + num;
printf(“Introduzca un
número”;
scanf(“%i”,&num);
}
15/05/05
}
Programación Digital I
28
Ejercicios Propuestos
Para cada uno de los siguientes problemas realizar el análisis EP-S, algoritmo y codificación.
Hallar el resultado de la siguiente sucesión:
S = 1 + 1/2 + 1/3 + 1/4 … + 1/n
hasta que 1/N converja hacia e/100 (o sea igual o menor que un
número e cualquiera dividido entre 100).
Calcular la sumatoria de los 100 primeros números naturales.
Calcular independientemente la suma de los números pares e
impares comprendidos entre 1 y n.
15/05/05
Programación Digital I
29
Ejercicios Propuestos
Escribir todos los enteros positivos menores que 100
omitiendo aquellos divisibles por 7.
Encuentre el número de puntos con coordenadas
enteras que están dentro de la elipse
2x2 + 3y2 = 100
En Caracas se hizo una encuesta de los medios de
transporte urbano mas comunes. A cada persona se le
preguntó si el autobús, el metro o el carro era el medio
mas usado para ir al trabajo. Se permitió mas de una
respuesta. El resultado de la encuesta fue el siguiente:
15/05/05
Programación Digital I
30
Ejercicios Propuestos
n1 personas escogieron el autobús
n2 personas escogieron el metro
n3 personas escogieron el carro
n4 personas escogieron el autobús y el metro
n5 personas escogieron el autobús y el carro
n6 personas escogieron el metro y el carro
n7 personas escogieron los tres medios de transporte
¿ Cuántas personas respondieron la encuesta ?
¿ Cuántas personas escogieron sólo un medio de transporte ?
¿ Cuántas personas escogieron dos medios de transporte ?
¿ Cuántas personas escogieron los tres medios de transporte ?
15/05/05
Programación Digital I
31
Ejercicios Propuestos
Leer valores que representan años e indique si son o no
años bisiestos. El programa seguirá leyendo años hasta
un máximo de 10 o hasta que haya leido 3 años
bisiestos. Recuerde, una vez más, la regla:
"Un año es bisiesto si es divisible por 400, o bien si es
divisible por 4 pero no por 100"
Por ejemplo, el año 2000 es bisiesto (es divisible por
400), el año 1992 es bisiesto (es divisible por 4 y no por
100), y el año 2100 no es bisiesto (es divisible por 4 y
también por 100).
15/05/05
Programación Digital I
32
Ejercicios Propuestos
Imprimir la tabla de multiplicar de un número dado. El
funcionamiento del programa se muestra en el siguiente
ejemplo de ejecución.
Introduzca un número: 5
La tabla de multiplicar del 5 es:
5x1=5
5 x 2 =10
...
5 x 10 =50
15/05/05
Programación Digital I
33
Descargar