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