GuÃa 03. Estructuras repetitivas
Transcription
GuÃa 03. Estructuras repetitivas
OBJETIVO: Codificar algoritmos utilizando Estructuras Repetitivas. Estas estructuras son aquellas que se encargan de controlar el número de veces que una sentencia o conjunto de sentencias se ejecutan. Se denominamos B U C L E a cualquier construcción de programa que repite una sentencia o un conjunto de sentencias un número indeterminado de veces. Esta sentencia o conjunto de sentencias que se repite se denomina bloque o cuerpo del bucle y cada repetición se llama iteración del bucle. ESTRUCTURA WHILE. Acá, un bucle while tiene una condición que controla la secuencia de repetición. La condición está al comienzo del bloque. De este modo, se evalúa primero la condición antes de ejecutar el cuerpo. Si la condición se cumple, se ejecuta el bloque y vuelve a evaluar la condición. De lo contrario, se termina la iteración. Su sintaxis es la siguiente: while(condicion_bucle) { sentencia 1; sentencia 2; . sentencia n; } Recordemos: el “bloque” se refiere al conjunto de sentencias agrupadas entre llaves, las cuales se ejecutarán mientras la condición sea verdadera. Recuerde que antes de trabajar con el while debemos: Establecer el valor inicial de la variable a manipular en la condición del bucle. Comprobar la condición que involucra esta variable. Actualizar el valor de esta variable antes de que se termine el ciclo del bucle. ESTRUCTURA WHILE. EJEMPLOS. 01. Programa que lee la población de una ciudad A y su tasa de crecimiento (TA), y también lee la población de una ciudad B y su tasa de crecimiento (TB). Al momento de suministrar los datos, tenga en cuenta que la población inicial de A es menor que la de B, pero la tasa de crecimiento de A es mayor que la de B. Si el crecimiento poblacional se mantiene constante en las dos ciudades, elabore un algoritmo que calcule e imprima en cuántos años la población de la ciudad A es mayor que la de B. Lenguaje C++ #include <iostream> using namespace std; main() { float A, B; float TA, TB; int Y=0; cout<<"Poblacion de A : "; cin>>A; cout<<"Tasa de crecimiento de A : "; cin>>TA; cout<<"Poblacion de B : "; cin>>B; cout<<"Tasa de crecimiento de B : "; cin>>TB; while(A<=B) { A = A * (1+(TA/100)); //poblacion se multiplica por la tasa de crecimiento A B = B * (1+(TB/100)); //poblacion se multiplica por la tasa de crecimiento B Y = Y + 1; //por cada aumento de poblacion //y mientras se mantenga la condicion //se aumenta en 1 el contador del año } cout<<"\n\nLa poblacion de A sobrepasa a la de B en "<<Y<<" anios"<<endl; system("PAUSE"); return EXIT_SUCCESS; } 1 Versión 2: Lenguaje C++ #include <iostream> using namespace std; main() { float A, B, TA, TB; int Y=0; cout<<"Poblacion de A : "; cin>>A; cout<<"Tasa de crecimiento de A : "; cin>>TA; cout<<"Poblacion de B : "; cin>>B; cout<<"Tasa de crecimiento de B : "; cin>>TB; if ( (A < B) && (TA > TB) ) { while(A<=B) { A = A * (1+(TA/100)); B = B * (1+(TB/100)); Y = Y + 1; } cout<<"\n\nLa poblacion de A sobrepasa a la de B en "<<Y<<" anios"<<endl; } else cout<<"\n\nValores no validos"<<endl; system("PAUSE"); return EXIT_SUCCESS; } 02. Programa que calcula en cuantos meses se duplica un capital a un interés compuesto. El programa muestra cómo cambia el capital mes a mes. El capital y el interés se leen por teclado y deben validarse. Pseudocódigo Inicio Leer C , I M = 0 //recordemos inicializar el contador Si ((C>0) Y (I>0)) entonces DC = 2*C Mientras (C < DC) hacer C = C * (1+(I/100)) M = M + 1 Imprimir “Mes” , M, “Capital”, C Fin_Mientras Imprimir “Meses” , M Si_no Imprimir “Valores inválidos” Fin_Si Fin Lenguaje C++ #include <iostream> using namespace std; main() { float C, I, DC; int M=0; cout<<"Digite el valor del capital : "; cin>>C; cout<<"Digite el valor del interes : "; cin>>I; if((C>0)&&(I>0)) { DC=(2*C); while(C<DC) { C=C*(1+(I/100)); //se multiplica el capital por el interes y se suma al valor anterior M=M+1; //se aumenta la cuenta del mes por cada aumento de capital cout<<"\nMes "<<M<<" -- Capital = "<<C; //esto es para mostrar el aumento del capital mes a mes } cout<<"\n\nEl capital se duplica en "<<M<<" meses"<<endl; } else { cout<<"\nDebe ingresar valores positivos"; } system("PAUSE"); } return EXIT_SUCCESS; 2 03. Programa que lee un número de cualquier cantidad de cifras y lo invierte. El mecanismo de inversión se basa en el principio de ir dividiendo sucesivamente al número entre 10 y obtener el residuo, para así separar cada cifra. Este proceso se repite hasta que el número a dividir sea cero. Lenguaje C++ #include <iostream> using namespace std; main() { unsigned long long N, M, NI; unsigned long long D, R; cout<<"Digite el Numero : "; cin>>N; M = N; NI=0; while(N!=0) { D = N/10; R = N-(D*10); NI = (NI*10) + R; N = D; } cout<<"El numero original es : "<<M<<endl; cout<<"El numero invertido es : "<<NI<<endl; system("PAUSE"); return EXIT_SUCCESS; } Versión 2: Lenguaje C++ #include <iostream> using namespace std; main() { unsigned long long N, M, NI; unsigned long long D, R; cout<<"Digite el Numero : "; cin>>N; M = N; NI=0; while(N<0) { cout<<"El Numero debe ser positivo "<<endl; cout<<"Digite el Numero : "; cin>>N; M = N; } while(N!=0) { D = N/10; R = N-(D*10); NI = (NI*10) + R; N = D; } cout<<"El numero original es : "<<M<<endl; cout<<"El numero invertido es : "<<NI<<endl; system("PAUSE"); return EXIT_SUCCESS; } 3 Versión 3: Lenguaje C++ #include <iostream> using namespace std; main() { unsigned long long N, M, NI; unsigned long long D, R; char resp='s'; while(resp!='N') { cout<<"Digite el Numero : "; cin>>N; M = N; NI=0; if(N>0) { while(N!=0) { D = N/10; R = N-(D*10); NI = (NI*10) + R; N = D; } cout<<"El numero original es : "<<M<<endl; cout<<"El numero invertido es : "<<NI<<endl; } else cout<<"NO VALIDO. El Numero debe ser positivo "<<endl; cout<<"\nDesea ingresar otro numero? (S/N): "; cin>>resp; getchar(); resp=toupper(resp); } system("PAUSE"); return EXIT_SUCCESS; } 4 USO DE REGISTRO CENTINELA O VALOR CENTINELA. 04. Programa que lee el código de un estudiante y las notas de una materia. El proceso continúa mientras el valor del sucesivo código leído sea diferente de cero. Al final muestra cuántos de los estudiantes obtuvieron una nota final menor de 3. Lenguaje C++ #include <iostream> using namespace std; main() { int con = 0; long c; float n1,n2,n3,nf; cout<<"Digite el numero del codigo: "; cin>>c; while (c!=0) { cout<<"Digite la primera nota : "; cin>>n1; cout<<"Digite la segunda nota : "; cin>>n2; cout<<"Digite la tercera nota : "; cin>>n3; if ((n1>=0 && n1<=5) && (n2>=0 && n2<=5) && (n3>=0 && n3<=5)) { nf=(n1*0.35)+(n2*0.35)+(n3*0.3); if (nf<3){con = con + 1;} cout<<"El codigo es : "<<c; cout<<"\nLa nota final es : "<<nf<<endl; } else {cout<<"Ha suministrado notas por fuera del rango"<<endl;} cout<<"Digite el numero del codigo: "; cin>>c; } cout<<"Los estudiantes que perdieron son un total de: "<<con<<endl; system("PAUSE"); return EXIT_SUCCESS; } 5 05. Tenemos la información de las personas mayores de edad que viven en un barrio determinado. Por cada una de ellas hay un registro con cuatro datos: el número de cédula, el nombre, el género (H=hombre, M=mujer) y la edad. No sabemos cuántos son, pero en el último registro el campo del número de cédula es igual a cero. Elabore un algoritmo que averigüe e imprima: a) ¿Cuántos hombres y cuántas mujeres hay en el barrio? b) El nombre y la edad de todas las mujeres mayores de 70 años, y cuántas son. Lenguaje C++ #include <iostream> using namespace std; main() { long int CC; char nombre[100]; char GEN; int E; int CM = 0, CH = 0, CM70 = 0 ; cout<<"Digite la cedula: "; cin>>CC; while (CC!=0) { cout<<"Escriba el Nombre : "; cout<<"Escriba el Genero : "; fflush(stdin); gets(nombre); cin>>GEN; getchar(); GEN=toupper(GEN); cout<<"GEN : "<<GEN<<endl; cout<<"Digite la Edad : "; cin>>E; if ( GEN == 'H') { CH = CH + 1; } else { CM = CM + 1; if (E > 70) { CM70 = CM70 + 1; cout<<"Nombre : "; puts(nombre); cout<<"Edad : "<<E<<endl; } } cout<<"Digite la cedula: "; cin>>CC; } cout<<"Cantidad de Mujeres : "<<CM<<endl; cout<<"Cantidad de Hombres : "<<CH<<endl; cout<<"Cantidad de Mujeres Mayores de 70 : "<<CM70<<endl; system("PAUSE"); return EXIT_SUCCESS; } 6 06. Tenemos la información de un grupo de estudiantes de la Universidad del Cauca, no sabemos cuántos. Por cada uno de ellos hay un registro que contiene el Código, la Edad y el Promedio Acumulado (ya vienen validados). El último registro trae grabados ceros en el Código. Elabore un algoritmo que imprima el código, la edad y el promedio acumulado de los estudiantes de Ingeniería en Automática mayores de 21 años con promedio acumulado menor a 3.2, también debe imprimir al final cuántos son. Recuerde que el código de la carrera de Ingeniería en Automática es 47. Lenguaje C++ #include <iostream> using namespace std; main() { long long int COD; int vp1, vp2, C, E; float PRO; int CON=0; cout<<"\nDigite el numero del codigo (digite cero cuando quiera salir) : "; cin>>COD; while(COD!=0) //Condicion del registro centinela { cout<<"\nDigite la edad : "; cin>>E; cout<<"\nDigite el promedio : "; cin>>PRO; vp1 = COD/100000000; cout<<"\n vp1 vale = " <<vp1; vp2 = vp1/100; cout<<"\n vp2 vale = " <<vp2; C = vp1 - (vp2*100); cout<<"\n C vale = " <<C; if((int)C==47) { if(E>21) { if(PRO<3.2) { cout<<"\nCodigo: "<<COD <<" | Edad: "<<E<<" | Promedio : "<<PRO; CON = CON + 1; } } } //la nueva lectura (siguente estudiante) cout<<"\nDigite el numero del codigo (digite cero cuando quiera salir) : "; cin>>COD; } cout<<"\nCantidad de estudiantes que cumplen las condiciones : "<<CON<<endl; system("PAUSE"); return EXIT_SUCCESS; } 7 ESTRUCTURA DO - WHILE (REPETIR-HASTA). Esta sentencia se utiliza para especificar un bucle condicional que se ejecuta al menos una vez. Esta situación se suele dar en algunas circunstancias en las que se ha de tener la seguridad de que una determinada acción se ejecutará una o varias veces, pero al menos una vez. Su sintaxis es la siguiente: do { sentencia 1; sentencia 2; . . sentencia n; } while(expresion); ESTRUCTURA DO - WHILE. EJEMPLO. Reescribiremos el ejercicio 01 con esta estructura. Pseudocódigo Inicio Y = 0 //recordemos inicializar el contador Leer A, TA, B, TB Si ( (A < B) Y (TA > TB) ) entonces Hacer A B Y Mientras = A*(1+(TA/100)) = B*(1+(TB/100)) = Y+1 (A<=B) Imprimir Y else Imprimir “Valores No Válidos” Fin Si Fin Lenguaje C++ #include <iostream> using namespace std; main() { float A, B; float TA, TB; int Y=0; cout<<"Poblacion cout<<"\nTasa de cout<<"Poblacion cout<<"\nTasa de if ( (A { do { A B Y de A : "; cin>>A; crecimiento de A : "; cin>>TA; de B : "; cin>>B; crecimiento de B : "; cin>>TB; < B) && (TA > TB) ) = A * (1+(TA/100)); = B * (1+(TB/100)); = Y + 1; }while(A<=B); cout<<"\n\nLa poblacion de A sobrepasa a la de B en "<<Y<<" anios"<<endl; } else cout<<"\n\nValores no validos"<<endl; system("PAUSE"); return EXIT_SUCCESS; } 8 FOR. Es la estructura más adecuada para implementar bucles controlados por un contador, que no son más que bucles en los que un conjunto de sentencias se ejecutan una vez por cada valor de rango especificado, de acuerdo al algoritmo. La sentencia for es un método para ejecutar un bloque de sentencias un número fijo de veces. Este se diferencia del bucle while en que las operaciones de control se sitúan en un solo sitio: la cabecera de la sentencia. Su sintaxis es la siguiente: for ( inicialización_variables; { sentencia1; . . sentencia n; } condición_iteración; incremento_decremento ) En la parte de inicialización, se le asignan los valores iniciales a las variables de control del bucle. En la parte de la condición, se encuentra una o varias condiciones que hacen que el bucle realice las iteraciones mientras que sean verdaderas. En la parte del incremento, se incrementan o decrementan las variables de control del bucle. Las sentencias, son las acciones que se deben ejecutar por cada iteración del bucle. ESTRUCTURA FOR. EJEMPLOS. 01. Programa que lee un número entero y positivo (validar que sea positivo), que calcule su factorial y que lo imprima junto con el número leído. Lenguaje C++ #include <iostream> using namespace std; main() { cout.precision(100); int N, i; double FAC; FAC = 1; cout<<"Digite un numero : "; cin>>N; while(N<=0) { cout<<"\nEl valor digitado no es valido"; cout<<"\nDigite un numero : "; cin>>N; } for(i=1; i<=N; i++) { FAC = FAC * i; } cout<<"El Factorial de "<<N<<" es : "<<FAC<<endl; system("PAUSE"); return EXIT_SUCCESS; } 9 Versión 2: Reescribimos el ejemplo 01 pero con el for en conteo descendente Lenguaje C++ #include <iostream> using namespace std; main() { cout.precision(100); int N, i; double FAC; cout<<"Digite un numero : "; cin>>N; while(N<=0) { cout<<"\nEl valor digitado no es valido"; cout<<"\nDigite un numero : "; cin>>N; } FAC = N; for(i=N-1; i>=1; i--) { FAC = FAC * i; } cout<<"El Factorial de "<<N<<" es : "<<FAC<<endl; system("PAUSE"); return EXIT_SUCCESS; } 02. Programa que lee un número N, entero y positivo, y que averigüe e imprima si es o no número Primo Lenguaje C++ #include <iostream> using namespace std; main() { long int N; long int flag, d, i; cout<<"Digite un numero entero (Mayor a 0): "; while(N<=0) { cout<<"\nEl valor digitado no es valido"; cout<<"Digite un numero entero (Mayor a 0): "; } cin>>N; cin>>N; flag = 0; for (i=2; i<=N-1; i++) { d=(N/i)*i; if (d==N) { flag = 1; i = N; } } if (flag == 0) cout<<N<<" SI ES un numero primo"<<endl; else cout<<N<<" NO ES un numero primo"<<endl; system("PAUSE"); return EXIT_SUCCESS; } 10 03. Programa que imprime las tablas de multiplicar desde un valor A hasta la tabla de multiplicar de un valor B, y que en cada tabla se imprima los productos desde C hasta D. Por ejemplo, si A=3, B=5 y C=2, D=9 tendremos: 3 3 3 3 3 3 3 3 * * * * * * * * 2 3 4 5 6 7 8 9 = = = = = = = = 6 9 12 15 18 21 24 27 4 4 4 4 4 4 4 4 * * * * * * * * 2 3 4 5 6 7 8 9 = = = = = = = = 8 12 16 20 24 28 32 36 5 5 5 5 5 5 5 5 * * * * * * * * 2 3 4 5 6 7 8 9 = = = = = = = = 10 15 20 25 30 35 40 45 ---------------------------------------------------------------------------------------------------------------------------------Lenguaje C++ #include <iostream> using namespace std; main() { int A, B, C, D, i, k, p; cout<<"Tabla inicial: "; cin>>A; cout<<"\nTabla final : "; cin>>B; while(A>=B) { cout<<"\nTabla inicial debe ser menor que Tabla final"; cout<<"Tabla inicial: "; cin>>A; cout<<"\nTabla final : "; cin>>B; } cout<<"\nValor inicial de recorrido: "; cout<<"\nValor final de recorrido : "; cin>>C; cin>>D; while(C>=D) { cout<<"\nValor inicial debe ser menor que Valor final"; cout<<"\nValor inicial de recorrido: "; cin>>C; cout<<"\nValor final de recorrido : "; cin>>D; } for (i=A; i<=B; i++) { cout<<"\n"; for (k=C; k<=D; k++) { p = i * k; cout<<"\n"<<i<<" * "<<k<<" = "<<p; } } cout<<endl; system("PAUSE"); return EXIT_SUCCESS; } ------------------------------ FIN DEL DOCUMENTO 11