23
2013 M.Sc. Ana María Salgado G. UNAN- LEON SENTENCIA DE CONTROL WHILE

sentencias de control while 2013 - ING.KARINA … · Escriba un programa en lenguaje C que, al recibir como datos los N lanzamientos del martillo de la atleta cubana ganadora de la

Embed Size (px)

Citation preview

2013

M.Sc. Ana María Salgado G.

UNAN-

LEON SENTENCIA DE CONTROL WHILE

Sentencia de control while

2

M.Sc. Ana María Salgado G.

Unidad IV:

Estructuras de control

Sentencia while

La forma general de esta sentencia es: while (expresion)

sentencia;

sentencia se ejecutará mientras el valor de expresión sea verdadero.

Primero se evalúa expresión.

Lo normal es que sentencia incluya algún elemento que altere el valor de expresión

proporcionando así la condición de salida del bucle.

Si sentencia es compuesta se encierra entre { }.

Primero se evalúa la expresión si ésta es falsa, el control pasa directamente a la instrucción

siguiente, pero si es verdadera entonces se ejecuta el cuerpo del laso while devolviendo el

control al principio del mismo.

Es evidente que una de las acciones internas del bucle while debe modificar en un momento

dado una de las variables que intervienen en la expresión que condiciona el bucle para que

dicha condición se haga falsa y se pueda abandonar el bucle. Si el cuerpo del laso está formado

por una sola instrucción no necesita las llaves que delimitan el cuerpo del bucle, pero si tiene

más de una instrucción entonces las llaves son obligatorias.

Ejemplo #1:

//digitosdecimales

proceso digitosdecimales

Definir numero Como Entero;

numero = 0;

escribir "DIGITOS DEL SISTEMA DECIMAL";

mientras numero < 10 hacer

escribir "digito: ",numero;

numero = numero + 1;

finmientras

finproceso

Sentencia de control while

3

M.Sc. Ana María Salgado G.

Código en lenguaje C:

//digitosdecimales.c

#include <stdio.h>

void main(void)

{

int numero = 0;

printf("DIGITOS DEL SISTEMA DECIMAL\n");

while(numero < 10)

{

printf("digito: %d\n",numero);

numero = numero + 1;

}

}

Ejemplo # 2

Realice un programa que eleve una base entera x, a una potencia:

Pseudocódigo en PSEINT

Proceso potencia

Definir i, p, n, base como entero;

i <- 1;

p <-1;

Escribir "Entero elevado a una potencia";

Escribir "Base:";

Leer base;

Escribir "Potencia:";

Leer n;

Sentencia de control while

4

M.Sc. Ana María Salgado G.

Mientras (i<=n) Hacer

p <- p*base;

i <- i +1;

FinMientras

Escribir base," ^ ", n , " = ", p;

FinProceso

Código en lenguaje C:

//potenciawhile.c

#include <stdio.h>

void main(void)

{

int i = 1,p=1,base,n;

printf("Entero elevado a una potencia\n");

printf("Base:");

scanf("%d",&base);

printf("Potencia:");

scanf("%d",&n);

while (i<=n)

{

p=p*base;

i++;

}

printf("%d^%d = %d\n",base,n,p);

}

Sentencia de control while

5

M.Sc. Ana María Salgado G.

Ejemplo # 3

Versión utilizando while, del ejercicio resuelto #1 de sentencia for. Página # 4:

//serie1while.c

#include <stdio.h>

int m,n,i = 0;

float suma=0;

void main(void)

{

do

{

printf("Introduzca los enteros m y n\n");

scanf("%d %d",&m,&n);

}while(m>n);

while (i<=n)

{

suma+=1.0/(float)(m+i);

i++;

}

printf("El resultado de la funcion es %f\n",suma);

}

Ejemplo # 4

Versión utilizando while, del ejercicio resuelto #4 de sentencia for. Página # 7:

//serie2while.c

#include <stdio.h>

#include <math.h>

int x,n,i = 1;

float suma = 1;

void main(void)

{

printf("Ingrese el valor de n:");

scanf("%d",&n);

printf("Ingrese el valor de x:");

scanf("%d",&x);

Sentencia de control while

6

M.Sc. Ana María Salgado G.

while(i <= n)

{

suma = suma +i/pow(x,i);

i++;

}

printf("suma = %.2f\n",suma);

}

Ejemplo # 5

Un estudiante ha escrito un programa en C para evaluar la fórmula:

Para simplificar el programa el estudiante ha definido una nueva variable u, de la siguiente

forma:

Con lo que la fórmula se transforma en:

Escribir un programa en C.

Solución:

//evalpolinomio.c

#include <stdio.h>

#include <math.h>

/*programa para evaluar una formula algebraica*/

void main(void)

{

float u,x,y = 0;

5432

5432uuuu

uy ++++=

5432

1

5

11

4

11

3

11

2

11

−+

−+

−+

−+

−=x

x

x

x

x

x

x

x

x

xy

−=x

xu

1

Sentencia de control while

7

M.Sc. Ana María Salgado G.

int n = 5, i = 1;

/*leer datos de entrada*/

printf("x=");

scanf("%f",&x);

u=(x-1)/x;

/*realizar los calculos*/

while(i <= n)

{

y = y + pow(u,i)/i;

i++;

}

/*escribir la salida*/

printf("x = %f y = %f\n",x,y);

}

Ejemplo # 6

Escriba un programa en lenguaje C que, al recibir como datos los N lanzamientos del martillo

de la atleta cubana ganadora de la medalla de oro en las últimas olimpiadas celebradas en

Atenas, calcule el promedio de dichos lanzamientos.

Pseudocódigo en PSEINT

Proceso lanzamientosprom

Definir lanzamientos, i Como Entero;

Definir suma, media, longitud como real;

i <- 1;

suma <-0;

Escribir "Cuantos lanzamientos de martillo realizo la atleta?:";

Leer lanzamientos;

Sentencia de control while

8

M.Sc. Ana María Salgado G.

Mientras (i <= lanzamientos ) Hacer

Escribir "Longitud del lanzamiento ",i,"?:";

Leer longitud;

suma <- suma + longitud;

i <- i + 1;

FinMientras

media <- suma/lanzamientos;

Escribir "El promedio de lanzamientos es ",media;

FinProceso

Código en lenguaje C

FinProceso

//lanzamientosprom.c

#include<stdio.h>

int lanzamientos, i = 1;

float suma=0, media, longitud;

void main(void)

{

printf("Cuantos lanzamientos de martillo realizo la atleta?:\n");

scanf("%d",&lanzamientos);

while(i <= lanzamientos )

{

printf("Longitud del lanzamiento %d?:",i);

scanf("%f",&longitud);

suma = suma + longitud;

i++;

}

media = suma/lanzamientos;

printf("El promedio de lanzamientos es %g\n",media);

}

Sentencia de control while

9

M.Sc. Ana María Salgado G.

Ejemplo #7:

El siguiente programa, recibe como dato un número entero N y obtiene el resultado de la

siguiente serie:

11 – 2

2 + 3

3 - … ± N

N

Pseudocódigo en PSEINT

Proceso serie5_while

Definir N, i como entero;

Definir suma como real;

i<-1;

suma <- 0;

Escribir "Ingrese el valor de N: ";

Leer N;

Mientras (i<=N) Hacer

Si i % 2 <> 0 Entonces

suma <- suma + (i^i);

Sino

Si i % 2 = 0 Entonces

suma <- suma - i^i;

FinSi

FinSi

Escribir "i= ", i, " suma = ",suma;

i<- i + 1;

FinMientras

Escribir "El resultado final de la serie es ",suma;

FinProceso

Sentencia de control while

10

M.Sc. Ana María Salgado G.

Código en lenguaje C

//serie5_while.c

#include <stdio.h>

#include <math.h>

int N,i = 1;

float suma=0;

void main(void)

{

printf("Ingrese el valor de N: ");

scanf("%d",&N);

while(i<=N)

{

if(i % 2 != 0)

suma= suma + pow(i,i);

else

if(i % 2 == 0)

suma= suma - pow(i,i);

printf("i= %d\t suma = %g\n",i,suma);

i++;

}

printf("\nEl resultado final de la serie es %g\n\n",suma);

}

Sentencia de control while

11

M.Sc. Ana María Salgado G.

Ejemplo #8:

/*Lee una palabra y la escribe al reves */

#include <stdio.h>

void main (void)

{

char palabra[20];

int i;

printf("Teclee una palabra (sin espacios) de menos de 20 letras:");

scanf("%s", palabra);

i = 0;

while(palabra[i] !='\0')

i++;

printf("\n%s tiene %d letras.", palabra, i);

printf("\n%s escrita al revés es: ", palabra);

while (i >=0)

{

printf("%c", palabra[i]);

i--;

}

}

Bucles controlados por centinelas

Normalmente, no se conoce con exactitud cuántos elementos de datos se procesarán antes de

comenzar su ejecución. Esto se produce bien porque hay muchos datos a contar normalmente

o porque el número de datos a procesar depende de cómo prosigue el proceso de cálculo.

Un medio para manejar esta situación es instruir al usuario a introducir un único dato definido y

especificado denominado valor centinela como último dato. La condición del bucle comprueba

cada dato y termina cuando se lee el valor centinela. En realidad el centinela es un valor que

sirve para terminar el proceso del bucle.

Sentencia de control while

12

M.Sc. Ana María Salgado G.

En el siguiente código hay un bucle con centinela; se introducen notas mientras que ésta sea

distinta de centinela.

Ejemplo #9:

Pseudocódigo en PSEINT

Proceso centinela

Definir nota, suma, centinela como entero;

suma <- 0;

centinela <- -1;

Escribir "Introduzca primera nota: ";

Leer nota;

Mientras (nota <> centinela) Hacer

suma <- suma + nota;

Escribir "Introduzca la siguiente nota:";

Leer nota;

FinMientras

Escribir "Final";

Escribir "La suma de las notas es ",suma;

FinProceso

Código en C:

//centinela.c

/*

entrada de datos numéricos,

centinela -1

*/

#include <stdio.h>

void main()

{

int nota,suma = 0;

const int centinela = -1;

printf("Introduzca primera nota: ");

scanf("%d",&nota);

while(nota != centinela)

{

suma += nota;

printf("Introduzca la siguiente nota:");

scanf("%d",&nota);

}/* fin de while*/

Sentencia de control while

13

M.Sc. Ana María Salgado G.

puts("Final");

printf("La suma de las notas es %d \n",suma);

}

Ejemplo #10:

Pseudocódigo en PSEINT:

Proceso Nterminos

Definir NT, TER, CONT, BAN como entero;

Escribir "Numero de terminos a generar:";

Leer NT;

TER <- 17;

CONT <- 0;

BAN <- 1;

Mientras CONT <= NT Hacer

Escribir TER;

SI BAN = 1 Entonces

TER <-TER - 2;

BAN <-2;

Sino

TER <- TER + 3;

BAN <- 1;

FinSi

CONT <- CONT +1;

FinMientras

FinProceso

Sentencia de control while

14

M.Sc. Ana María Salgado G.

Código en lenguaje C:

//Nterminos.c

#include <stdio.h>

int TER, CONT, BAN,NT;

void main(void)

{

printf("Numero de terminos a generar:\n");

scanf("%d",&NT);

TER = 17;

CONT = 0;

BAN = 1;

while(CONT <= NT)

{

printf("%d\n",TER);

if(BAN == 1)

{

TER =TER - 2;

BAN = 2;

}

else

{

TER = TER + 3;

BAN = 1;

}

CONT = CONT +1;

}

}

Sentencia de control while

15

M.Sc. Ana María Salgado G.

Ejemplo # 11

Hacer un programa que encuentre la suma de los valores de un conjunto de números enteros,

la cantidad de valores negativos, positivos, iguales a cero y el total de números en el conjunto.

Pseudocódigo en PSEINT

Código en lenguaje C

//GrupoNumEnteros.c

#include <stdio.h>

#include <string.h>

int VALN = 0, VAL0 = 0, VALP = 0, SUMA = 0, TOTALN, NUM;

char SIGA[3] = {"SI"};

Sentencia de control while

16

M.Sc. Ana María Salgado G.

void main(void)

{

while(strcmp(SIGA,"SI") == 0)

{

printf("Ingrese un numero entero: ");

fflush(stdin);

scanf("%d",&NUM);

SUMA = SUMA + NUM;

if(NUM > 0)

VALP = VALP + 1;

else

{

if(NUM == 0)

VAL0 = VAL0 + 1;

else

VALN = VALN +1;

}

printf("Desea seguir? ");

fflush(stdin);

gets(SIGA);

}

TOTALN = VALP + VALN + VAL0;

printf("SUMA DE LOS NUMEROS: %d\n",SUMA);

printf("NUMEROS POSITIVOS: %d \n", VALP);

printf("NUMEROS NEGATIVOS: %d \n", VALN);

printf("NUMEROS NULOS: %d \n", VAL0);

printf("TOTAL DE NUMEROS INGRESADOS: %d\n",TOTALN);

}

Sentencia de control while

17

M.Sc. Ana María Salgado G.

Ejemplo #12

Se tiene una serie de N números enteros. Se quiere saber si dentro de ellos existe, por lo

menos, uno cuyo valor sea cero.

Código en lenguaje C

//NnumerosEnteros.c

#include <stdio.h>

int CONTA = 1, NN, NUM;

char ENCONTRADO ='F';

void main(void)

{

printf("Cuantos numeros?");

scanf("%d",&NN);

while((CONTA <= NN) && (ENCONTRADO == 'F'))

{

printf("Ingrese un numero:");

scanf("%d",&NUM);

if(NUM == 0)

ENCONTRADO = 'V';

else

CONTA = CONTA + 1;

}

Sentencia de control while

18

M.Sc. Ana María Salgado G.

if(ENCONTRADO == 'V')

printf("SI HAY UN CERO ENTRE LOS NUMEROS \n");

else

printf("NO HAY UN CERO ENTRE LOS NUMEROS \n");

}

Ejemplo # 13:

#include <stdio.h>

#include <conio.h>

#define FIN '*'

void main(void)

{

char ch = '\0';

int contador = 0;

printf("Ingrese una cadena de caracteres. Escriba * para finalizar\n");

ch=getchar();

while(ch != FIN)

{

contador++;

ch=getchar();

}

printf("La cadena tiene %d caracteres\n",contador);

}

Sentencia de control while

19

M.Sc. Ana María Salgado G.

Ejemplo# 14:

//centinela3.c

#include <stdio.h>

void main(void)

{

int c;

printf("Ingrese una cadena. Presione ^Z para terminar.\n");

while((c=getchar()) != EOF)

putchar(c);

}

Ejercicios resueltos

Ejercicio # 1

Suponga que el usuario quiere encontrar la suma de 15 + 47 + 43 + 64 + 29

Con el siguiente programa, el usuario puede ingresar un número cada vez y después introducir

el centinela de datos -1 para indicar que ya no hay más datos. La computadora no agregará el

-1 a la suma, si no que lo tomará como una señal de salida del ciclo.

//sumacentinela.c

#include <stdio.h>

int suma=0, num;

void main(void)

{

printf("Escriba un numero entero ó -1 para salir: ");

scanf("%d",&num);

Sentencia de control while

20

M.Sc. Ana María Salgado G.

while(num!=-1)

{

suma+=num;

printf("Escriba un numero entero ó -1 para salir: ");

scanf("%d",&num);

}

printf("La suma es %d\n",suma);

}

Ejercicio # 2

Como entrada al siguiente programa, un cajero teclea los datos de las compras de un cliente.

Cada grupo de datos consiste del nombre del artículo, el precio del mismo y la cantidad

comprada. Puesto que el cajero no sabe de antemano el número de los artículos que se van a

comprar, para producir el recibo de venta el programa usa un ciclo while con el centinela

“xyz”

//recibocentinela.c

#include <stdio.h>

#include <string.h>

char artic[30];

int cant;

float precio, suma=0, costo;

void main(void)

{

printf("Escriba nombre de articulo o xyz para terminar\n");

gets(artic);

while(strcmp(artic,"xyz"))

{

fflush(stdin);

printf("Escriba precio unitario y cantidad\n");

scanf("%f %d",&precio,&cant);

costo=precio * cant;

suma+=costo;

printf("%d %s cuesta %f\n",cant,artic,costo);

printf("\n\nEscriba nombre de articulo o xyz para terminar\n");

fflush(stdin);

gets(artic);

}

Sentencia de control while

21

M.Sc. Ana María Salgado G.

printf("Total = %f\n",suma);

}

Ejercicio # 3

Lo siguiente se llama conjetura de Ulam en honor del matemático S. Ulam:

Empiece con cualquier entero positivo.

Si es par, divídase entre 2; si es impar, multiplíquese por 3 y agréguese 1.

Obtenga enteros sucesivamente repitiendo el proceso hasta que el entero en curso no sea 1.

Al final se obtendrá el número 1, independientemente del entero inicial. Por ejemplo, cuando

el entero inicial es 26, la secuencia será:

26 13 40 20 10 5 16 8 4 2 1

//ulam.c

#include <stdio.h>

int n;

void main(void)

{

do

{

printf("Escriba un entero positivo:");

scanf("%d",&n);

}while(n<=0);

printf("Sucesion de Ulam para %d\n",n);

while(n!=1)

{

if(n%2==0)

n=n/2;

else

n=3 * n + 1;

printf("%d ",n);

}

}

Sentencia de control while

22

M.Sc. Ana María Salgado G.

Ejercicios propuestos

1. Construya un programa que, al recibir como datos la clave del empleado y los seis

primeros sueldos del año, calcule el ingreso total semestral y el promedio mensual, e

imprima la clave del empleado, el ingreso total y el promedio mensual.

2. Todos los lunes, miércoles y viernes, una persona corre la misma ruta y cronometra los

tiempos obtenidos. Determinar el tiempo promedio que la persona tarda en recorrer la

ruta en una semana cualquiera.

3. Realice una nueva versión utilizando while, del ejercicio resuelto # 5 de for, página # 8.

4. Ejercicios propuestos for #1, 2, 4, 5, 6.

5. A lo largo de un día un cajero procesa a las personas que llegan a efectuar movimientos

bancarios. Estos movimientos son esencialmente depósitos y retiros. Determinar la

cantidad total de dinero obtenido por concepto de depósitos y retiros en todo el día, lo

mismo que un balance que indique si hubo más retiros que consignaciones.

6. Suponga que el usuario quiere encontrar la suma:

15 + 47 + 43 + 64 + 29

Escriba un programa donde el usuario no sepa de anticipado la cantidad de números a

sumar. En vez de ello, el usuario escribe cada número, uno después de otro y termina la

escritura de datos por medio del centinela n(de no). Consejo: Use como centinela el

siguiente rótulo: “Teclee s para continuar, n para parar:”

7. Construya un programa que al recibir como datos el nombre, las horas trabajadas, el

sueldo por hora, calcule e imprima el pago para cada uno de los empleados de una

empresa. Además, calcule la nómina total, pero no sabemos exactamente cuántos

empleados existen.

8. Escribir un programa interactivo que lea un valor entero positivo y determine lo

siguiente:

• Si el entero es un número primo.

• Si el entero es un número de Fibonacci.

Escribir el programa de forma que se ejecute de forma repetida, hasta que se introduzca

como valor de entrada un cero.

9. En una elección realizada en Piedra Dura se presentaron tres candidatos: Pedro, Pablo y

Vilma. Por cada votante se tiene la siguiente información:

Sentencia de control while

23

M.Sc. Ana María Salgado G.

Piedracédula: Número de cédula del votante. Dentro de sus posibles valores no tiene uno que

sea cero o negativo. El ciclo de entrada de datos terminará cuando encuentre un valor de cero

para el campo piedracédula.

Opción: Campo que indica el candidato escogido, si el valor del campo es:

1: votó por Pedro

2: votó por Pablo

3: votó por Vilma

4: votó en blanco

Elaborar un programa que muestre el número de votos depositados por cada cantidato y el

total de votantes.

Bibliografía

� Ceballos Francisco Javier. Curso de Programación C/C++ . Segunda Edición. Editorial

RAMA, Madrid, 2002.

� Joyanes Aguilar Luis, Zahonero Martínez Ignacio. Programación en C. Metodología,

estructura de datos y objetos. Mc Graw Hill.

� Byron S. Gottfried . Programación en C. Mc Graw Hill.

� H.M. Dietel – P. J. Dietel . Como Programar en C/C++ . Segunda Edición. Prentice Hall.

� Hernández María Lourdes. Diseño estructurado de algoritmos. Diagramas de flujos y

pseudocódigos. Universidad de Teuxtepe, México.