Download EI-EstructurasIterativas
Document related concepts
no text concepts found
Transcript
Proyecto 0151-14 UNA – Mora & Coto, 2015 Programación Orientada a Objetos Compilado por: Mag. Sonia Mora. Dra. Mayela Coto. EIF200 FUNDAMENTOS DE INFORMÁTICA Recordemos la clase número #include <iostream> // metodos set #include <math.h> void setValor (int valor) using namespace std; { valor = valor; class Numero { } private: int valor; // metodos get int getValor ( ) public: { Numero () { valor = 0; return(valor); } Numero (int valor) { } // metodos cálculo valor = valor; } EIF200 FUNDAMENTOS DE INFORMÁTICA }; class Numero { private: int valor; ….. Problema En la clase Numero, escriba un método que sume todos los números menores que valor Ejemplo: si valor =13, el método calcula 13 Σ𝑖 i=1 = 1+3+4+5+6+7+8+9+10+11+12+ 13 EIF200 FUNDAMENTOS DE INFORMÁTICA Estructuras de control iterativas Permiten ejecutar una o más acciones un número determinado de veces. Son denominadas también bucles, lazos, o ciclos. Constan de tres partes • Cuerpo del ciclo: conjunto de acciones que deben ser realizadas. • Iteración: hecho de repetir la ejecución del cuerpo del ciclo. • Condición de salida o término del ciclo: condición que debe ser evaluada. Por lo general se indica al final o al inicio del mismo. Tres tipos de estructuras repetitivas: while -- do while -- for EIF200 FUNDAMENTOS DE INFORMÁTICA Ejemplos Comer palomitas en el cine Contar ¿cuántos números pares hay entre 102 y 510 Instrucción while while (condición) while (condición) <instrucciones>; V instrucciones 1. 2. 3. 4. 5. Evalúa la expresión o condición Si el resultado de esta evaluación es verdadero se ejecuta el cuerpo de la estructura (las instrucciones). Se vuelve a evaluar la expresión Si el resultado de esta evaluación es falso no se ejecutan las instrucciones y sale del ciclo while Es decir, la estructura while repite una serie de acciones mientras se cumpla una condición Cambia el valor de la condición int sumatoriaN() { int i=1, sum=0; while (i< valor){ sum = sum +i; i++; } return sum; EIF200 FUNDAMENTOS DE INFORMÁTICA } F Instrucción do-while instrucciones do <instrucciones>; while (condición); Siempre ejecuta por lo menos una vez el cuerpo de la estructura. La expresión se valida después de ejecutar <instrucciones>, y en función a este resultado vuelve a iterar o no. cambio de la variable de condición V int sumatoriaN() { int i=1, sum; do sum = sum +i; i++; while EIF200 FUNDAMENTOS DE INFORMÁTICA (i< valor); return sum; } mientras (condición) F Instrucción for for ( condición de inicio ; expresión ; acción después de cada iteración ) { instrucciones (s); } condición de inicio se ejecuta una sola vez al inicio del ciclo, generalmente se realizan inicializaciones y declaraciones de variables. expresión es evaluada en cada ciclo y dependiendo del valor que devuelva, el bucle continúa ejecutándose (valor de la evaluación true o false). acción después de cada iteración es ejecutada siempre en cada ciclo al terminar de ejecutar todas las instrucciones que pertenecen al bucle for. Por lo general puede contener alguna actualización para las variables de control. instrucciones grupo de instrucciones que se ejecutan repetidamente EIF200 FUNDAMENTOS DE INFORMÁTICA Instrucción for class Numero { private: int valor; ….. int sumatoriaN() { int sum=0; for (int i=1; i < = valor; i++) sum = sum + i; return sum; } En el main Numero num1; ……. cout<<"La sumatoria hasta: “<<num1.getValor()<<“ es: “<<endl; num1.sumatoriaN(); EIF200 FUNDAMENTOS DE INFORMÁTICA class Numero { private: int valor; ….. Ejercicio En la clase Numero, escriba un método que muestre todos los números pares menores que valor. Ejemplo: si valor =13, el método muestra 2,4,6,8,10,12 EIF200 FUNDAMENTOS DE INFORMÁTICA class Numero { private: int valor; ….. Ejercicio void numPares() { for (int i=1; i <valor; i++) Versión #1 if (i%2 ==0) cout<<i<<" "; } void numPares() { for (int i=2; i <valor; i+=2) Versión #2 cout<<i<<" "; } En el main() cout<<"Los siguientes son los numeros pares menores que " <<num1.getValor()<<endl; num1.numPares(); EIF200 FUNDAMENTOS DE INFORMÁTICA Ejemplo: porristas class Numero { private: int valor; ….. Un equipo de porristas está formado por n personas. El entrenador quiere colocarlos en filas de tal forma que todas sean iguales y no sobre ningún porrista. ¿Qué opciones tiene el entrenador, filas de cuántas personas puede hacer? Ejemplo: si valor = 24 **** **** **** **** **** **** ****** ****** ****** ****** ******** ******** ******** ************ ************ etc DIVISORES DE UN NÚMERO EIF200 FUNDAMENTOS DE INFORMÁTICA Ejemplo: porristas (divisores) void divisores() { int i; for(i=1;i <= valor ; i++) if (valor % i ==0) cout<<i<<endl; } En el main cout<<"El entrenador puede hacer filas de "<<endl; num1.divisores(); EIF200 FUNDAMENTOS DE INFORMÁTICA class Numero { private: int valor; ….. Ejemplo: número perfecto Un número se dice perfecto si la suma de sus divisores propios es igual al número Ejemplos: Número=8 divisores propios = 1,2,4 suma divisores= 7 , 7 NO es igual a 8 NO es perfecto Número=6 divisores= 1,2,3 suma divisores= 6, 6 SI es igual a 6 SI es perfecto Número=28 divisores= 1,2,4,7,14 suma divisores= 28, 28 SI es igual a 28 SI es perfecto EIF200 FUNDAMENTOS DE INFORMÁTICA Ejemplo: número perfecto class Numero { private: int valor; ….. Escriba primero un método que sume todos los divisores propios de un número. En la clase Numero agregue un método que retorne true si el número es perfecto y false si no. EIF200 FUNDAMENTOS DE INFORMÁTICA Ejemplo: suma de divisores int sumDivisoresPropios() { int suma=0; for(int i=1;i < valor; i++) if (valor % i ==0) suma=suma+i; return suma; } EIF200 FUNDAMENTOS DE INFORMÁTICA class Numero { private: int valor; ….. Ejercicio: número perfecto Una opción más eficiente: int sumDivisoresPropios() { int suma; for(int i=1;i <= valor/2 ; i++) if (valor % i ==0) suma=suma+i; return suma; } EIF200 FUNDAMENTOS DE INFORMÁTICA Ejemplo: número perfecto class Numero { private: int valor; ….. bool perfecto () { if (sumaDivisoresPropios()== valor) return(true); else return(false); } En el main if (num1.perfecto()) cout<<"El numero "<<num1.getValor()<<" es perfecto "<<endl; else cout<<"El numero "<<num1.getValor()<<" NO es perfecto "<<endl; EIF200 FUNDAMENTOS DE INFORMÁTICA Ejemplo: número perfecto class Numero { private: int valor; ….. Una opción más eficiente: bool perfecto () { return (sumaDivisoresPropios()== valor); } EIF200 FUNDAMENTOS DE INFORMÁTICA Ejercicio: números amigos Dos números amigos son dos enteros positivos a y b tales que a es la suma de los divisores propios de b, y b es la suma de los divisores propios de a. (la unidad se considera divisor propio, pero no el mismo número). divisores de 220= 1+2+4+5+10+11+20+22+44+55+110 = 284 divisores de 284= 1+2+4+71+142 = 220 Otras parejas de números amigos son: 1184 y 1210; 17,296 y 18,416 EIF200 FUNDAMENTOS DE INFORMÁTICA Ejemplo: números amigos class Numero { private: int valor; ….. bool amigos ( Numeros obj) { if (sumaDivisoresPropios()== obj.getValor() && valor == obj. sumaDivisoresPropios()) return(true); else return(false); } bool amigos ( Numeros obj) { return(sumaDivisoresPropios()== obj.getValor()&& valor == obj. sumaDivisoresPropios()); } EIF200 FUNDAMENTOS DE INFORMÁTICA Ejercicio: números amigos class Numero { private: int valor; ….. Ya se definió un método que suma los divisores propios de un número. En el main () Cree un objeto num1 con un valor dado por el usuario Cree un objeto num2 con un valor dado por el usuario Determine si los números son amigos mediante un mensaje. EIF200 FUNDAMENTOS DE INFORMÁTICA Ejercicio: números amigos class Numero { private: int valor; ….. int main() { int a,b; cout<<"Valor del numero: "<<endl<<endl; cin>>a; Numero num1(a) ; cout<<"Valor del segundo numero: "<<endl<<endl; cin>>b; Numero num2(b); if ((num1.getValor()==num2.sumaDivPropios())&& (num2.getValor()==num1.sumaDivPropios())) cout<<"Los numeros "<<num1.getValor()<<" y "<<num2.getValor()<<" son amigos; else cout<<"Los numeros "<<num1.getValor()<<" y "<<num2.getValor()<<" NO son amigos"; return 0 ; } EIF200 FUNDAMENTOS DE INFORMÁTICA Ejercicio: número primo class Numero { private: int valor; ….. En la clase Numero escriba un método que retorne true si el número es primo y false si no. Un número primo es un número natural que tiene exactamente dos divisores distintos: él mismo y el 1. El número 1 no se considera número primo. Ejemplos: 2, 3, 17, 29, 31, 43, 59, 67, 71, 73, 83, 97 EIF200 FUNDAMENTOS DE INFORMÁTICA Ejercicio: número primo class Numero { private: int valor; ….. bool esPrimo () { int i= 2; while (i <= valor/2) { if (valor % i == 0) return false; i++; } return true; } En el main if (num1.esPrimo ()) cout<<"El numero "<<num1.getValor()<<" es primo "<<endl; else cout<<"El numero "<<num1.getValor()<<" NO es primo "<<endl; EIF200 FUNDAMENTOS DE INFORMÁTICA Ejemplo: La conjetura de Ulam La conjetura de ULAM en honor al matemático S. ULam, define una serie de números, de la siguiente forma: Comience con cualquier número entero positivo N. Para obtener el siguiente número haga: Si N es par, divídalo entre 2, pero si N es impar, multiplíquelo por 3 y súmele un 1, esto nos dará un nuevo número N. Obtenga enteros sucesivos repitiendo el paso 2 hasta que el entero obtenido sea igual a uno. En la clase Numero diseñe un método que imprima la sucesión de números de la conjetura de ULAM para un valor determinado. EIF200 FUNDAMENTOS DE INFORMÁTICA Ejemplo:Conjetura ULAM void Ulam(){ int n = valor; while(n!=1) { cout <<n<<" "; if ((n%2)==0) n= n/2; else n=3*n+1; } cout <<n<<" "; } En el main num1.Ulam(); class Numero { private: int valor; ….. EIF200 FUNDAMENTOS DE INFORMÁTICA Ejercicio: número de Armstrong Se denominan números de Armstrong aquellos números que son iguales a la suma de los cubos de las cifras que lo integran, por ejemplo 153 es un número de Armstrong ya que 153= 13+53+33 = 1+ 125 + 27. En la clase Numero escriba un método que retorne true si el número es de Armstrong y false si no. EIF200 FUNDAMENTOS DE INFORMÁTICA Ejercicio: número de Armstrong bool amstrong () { int div,val; int suma=0; val=valor; while (val!=0) { div= val % 10; suma= suma + pow(div,3); val= val / 10; } if (suma==valor) return(true); else return(false); } EIF200 FUNDAMENTOS DE INFORMÁTICA class Numero { private: int valor; ….. pow(x,y) = xy requiere #include <math.h> Ejercicio: número de Armstrong class Numero { private: int valor; ….. En el main if (num1.armstrong ()) cout<<"El numero "<<num1.getValor()<<" es de armstrong "<<endl; else cout<<"El numero "<<num1.getValor()<<" NO es de armstrong "<<endl; EIF200 FUNDAMENTOS DE INFORMÁTICA Ejercicio class Numero { private: int valor; ….. Se dice que un número de n dígitos es n-narcisista (también llamado invariante digital perfecto), si puede ser obtenido de la suma de las n-ésimas potencias de sus n dígitos. Por ejemplo: 8 es 1-narcisista, 371 es 3-narcisista y 8208 es 4narcisista, pues: 8 = 81 371 = 33+73+13 8208=84+24+04+84 Escriba un método que devuelva el numero de dígitos (n) de valor. Escriba un método para la clase Numero que devuelva verdadero si valor es n-narcisista y falso en caso contrario. Debe hacer uso del método anterior. Puede además utilizar la función pow(x,y) = xy EIF200 FUNDAMENTOS DE INFORMÁTICA Número narcisista class Numero { private: int valor; ….. Escriba un método que devuelva el numero de dígitos (n) de valor. int cuentaDigitos () { int cant=0; int aux = valor; while (aux>0) { cant++; aux= aux/10; } return cant; } EIF200 FUNDAMENTOS DE INFORMÁTICA Número narcisista class Numero { private: int valor; ….. bool narcisista () { int div,val, i, n; int suma=0; val=valor; n = cuentaDigitos(); for(i=1; i <= n; i++) { div= val % 10; suma= suma + pow(div,n); val/=10; } if (suma==valor) return(true); else return(false); } EIF200 FUNDAMENTOS DE INFORMÁTICA Ejemplo: Una comida gratis Diez jóvenes decidieron celebrar su graduación con un almuerzo en un restaurante. Una vez reunidos, se entabló entre ellos una discusión sobre el orden en que habían de sentarse a la mesa. Unos propusieron que la colocación fuera por orden alfabético; otros, por edad; otros, por el promedio de graduación; otros, por la estatura, etc. La discusión se prolongaba, la sopa se enfrió y nadie se sentaba a la mesa. El camarero cansado de la situación, les dijo que se sentaran en cualquier orden y que él les tenía una propuesta. Todos se sentaron sin seguir un orden determinado. El camarero entonces les dijo: Que uno cualquiera anote el orden en que están sentados ahora. Mañana vienen a comer y se sientan en otro orden. Pasado mañana vienen de nuevo a comer y se sientan en orden distinto, y así sucesivamente hasta que hayan probado todas las combinaciones posibles. Cuando llegue el día en que ustedes tengan que sentarse de nuevo en la misma forma que ahora, les prometo solemnemente, que en lo sucesivo les invitaré a comer gratis diariamente, sirviéndoles los platos que ustedes deseen. EIF200 FUNDAMENTOS DE INFORMÁTICA La proposición agradó a todos y fue aceptada. Ejemplo: Una comida gratis Calcule cuántos días necesitan los estudiantes ir a comer al restaurante antes de que empiecen a disfrutar de comida gratis. Recuerde que los estudiantes deben probar todos los modos distintos, posibles, de colocación alrededor de la mesa. 10*9*8*7*6*5*4*3*2*1 Imágenes son de dominio público = 10! (factorial de un número) EIF200 FUNDAMENTOS DE INFORMÁTICA Factorial de un número El factorial de un número entero positivo se define como el producto de todos los números naturales anteriores o iguales a él. Se escribe n!, y se lee "n factorial". Por definición el factorial de 0 es 1 Por ejemplo, 0!=1 3! = 1*2*3 = 6 5! = 1*2*3*4*5 = 120 Su utilidad estriba en que se utiliza en la mayoría de las fórmulas de la combinatoria EIF200 FUNDAMENTOS DE INFORMÁTICA Factorial de un número class Numero { private: int valor; ….. long unsigned int factorial () { int i; long unsigned int fact=1; if (valor == 0) return 1; else for (i=1;i<=valor; i++) fact= fact* i; return (fact); } En el main cout<<"El número de días que los estudiantes deben ir a comer al restaurante antes de disfrutar de comidas gratis es "<< num1.factorial()<<endl; Ejemplo: Una comida gratis En este caso los muchachos tendrían que ir a comer al restaurante 3.628.800 días lo que equivale a ¡¡¡más de 9.000 años!!!! El camarero nunca tuvo que darles comida gratis. Imágenes son de dominio público EIF200 FUNDAMENTOS DE INFORMÁTICA Ejemplo: reproducción de los conejos Tenemos una pareja de conejos, si, en cada parto obtenemos una nueva pareja y cada nueva pareja tarda un mes en madurar sexualmente y el embarazo dura un mes, ¿Cuantas parejas tendremos en 12 meses? EIF200 FUNDAMENTOS DE INFORMÁTICA Ejemplo: reproducción de los conejos Parejas: 1 sexto 21 primer mes 2 séptimo 34 segundo 3 octavo 55 tercero 5 noveno 89 cuarto 8 décimo 144 quinto 13 undécimo 233 EIF200 FUNDAMENTOS DE INFORMÁTICA Ejemplo: Fibonacci En matemática, la sucesión de Fibonacci es la siguiente sucesión infinita de números naturales: fo = 0 f1 = 1 fn = fn-1 + fn-2 para n =2,3,4,5 La sucesión inicia con 0 y 1, y a partir de ahí cada elemento es la suma de los dos anteriores: 0 , 1 , 1 , 2 , 3 , 5 , 8 , 1 3 , 2 1 , 3 4 , 5 5 , 8 9 , 1 4 4 , ….. A cada elemento de esta sucesión se le llama número de Fibonacci. Esta sucesión fue descrita en Europa por Leonardo de Pisa, matemático italiano del siglo XIII. La sucesión fue descrita como la solución a un problema de la cría de conejos Tiene numerosas aplicaciones en ciencias de la computación, matemáticas y teoría de juegos. También aparece en configuraciones biológicas, como por ejemplo en las ramas de los árboles, en la disposición de las hojas en el tallo, en la flora de la alcachofa y en el arreglo de un cono. EIF200 FUNDAMENTOS DE INFORMÁTICA Ejemplo: Fibonacci class Numero { private: int valor; ….. En la clase Numero escriba un método que muestre los primeros n números de la serie de Fibonacci Ejemplo: Si n= 7 el método desplegará en pantalla 0,1,1,2,3,5,8 EIF200 FUNDAMENTOS DE INFORMÁTICA Ejemplo: números de Fibonacci void fibonacci() { int f1,f2, fn; f1=0; f2=1; for (int i=1; i<=valor; i++) { cout<<f1<<", "; fn=f1+f2; f1= f2; f2=fn; } } En el main class Numero { private: int valor; ….. EIF200 FUNDAMENTOS DE INFORMÁTICA cout<<endl<<"Los primeros "<<num1.getValor()<< " numeros de la serie de Fibonacci son "<<endl; num1.fibonacci(); Ejercicio: ¿queHace? Retorna el promedio de float queHace() { los divisores pares int i=1, s=0, n=0; del número while ( i <= valor) { if (( i % 2 == 0) && (valor% i ==0)){ n= n + 1; s = s + i; Tiene un grave problema, } ¿cuál es? i++; } return s/n; División por cero, cuando } los números son impares o EIF200 FUNDAMENTOS DE INFORMÁTICA primos (n nunca cambia) class Numero { private: int N; ….. Ejercicio Un estudiante de Fundamentos tiene como tarea escribir un método que calcule la siguiente sumatoria: N-1 ∑ (i+1)3/(i2 +1) * (i-1) i=2 Por ejemplo si N = 5, el método debe retornar el valor resultante de sumar: (2+1)3/(22 +1) * (2-1) + (3+1)3/(32 +1) * (3-1) + (4+1)3/(42 +1) * (4-1) El estudiante empezó a hacer la tarea a las 11 de la noche y logró escribir el siguiente código antes de caer dormido sobre la computadora. Ayude al estudiante a terminar el código para que pueda entregar la tarea al día siguiente. EIF200 FUNDAMENTOS DE INFORMÁTICA class Numero { private: int N; ….. Ejercicio _____ Sumatoria() { N-1 ∑ (i+1)3/(i2 +1) * (i-1) i=2 int i, suma=____; for (i=2; i < _____; ____) suma = suma + pow(i+1,3) / ( ____+1) * ( ___ ); return ( _____ ); } EIF200 FUNDAMENTOS DE INFORMÁTICA class Numero { private: int N; ….. Ejercicio void queHace (int x) { int aux , m , de , rd; de = N; rd = 0; aux = 0; m = 1; while (de!= 0) { rd = de % 10; de = de / 10; if (rd!= x) { aux = aux+(rd * m); m = m*10; } } N= aux ; } aux m de rd } EIF200 FUNDAMENTOS DE INFORMÁTICA Ejercicio Para x, un número real, que se encuentra entre -1 y 1. Los polinomios de Legendre se pueden calcular mediante las fórmulas: P0 (x) = 1 P1 (x) = x …… 𝑃𝑛 𝑥 = 2∗𝑛−1 𝑛 ∗ 𝑥 ∗ 𝑃𝑛−1 𝑥 − 𝑛−1 𝑛 ∗ 𝑃𝑛−2 𝑥 Escriba un método polLegendre(float x) que recibe como parámetro a x determina el polinomio de Legendre para x y genera el Pvalor(x) correspondiente, con valor en la clase Número. Proyecto 0151-14 UNA – Mora & Coto, 2015 Uso didáctico curso EIF 200 Escuela de Informática Universidad Nacional Costa Rica EIF200 FUNDAMENTOS DE INFORMÁTICA