1Eva_IT2003_T3 Operaciones sucesivas hasta 1

Parcial I Término 2003 – 2004. Julio 08, 2003 /ICM00794

Tema 3 (25 puntos) Dado un número n entero positivo, el siguiente procedimiento aplicado repetidamente al número lo modifica hasta que finalmente toma el valor de 1:

a) Si es par, divídalo para dos
b) Si es impar, multiplíquelo por tres y súmele 1

Diseñe un diagrama de flujo que encuentre cuál es el número entre 1 y 100 que requiere más repeticiones del procedimiento anterior hasta convertirlo en 1.

2Eva_IT2003_T2 Función recursiva f(n)

Final I Término 2003 – 2004. Septiembre 02, 2003 /ICM00794

Tema 2. (25 puntos) Escriba una función recursiva f en C/C++ tal que:

f(n) ={1/2, si n=0 ó n=1
      {1/2*[f(n-1) + f(n-2)], si n es impar mayor que 1
      {1/2*[f(n-1) - f(n-2)], si n es par mayor que 1

Escriba un programa en C/C++ que determine el mayor valor de la función f para n=0, 1, 2, 3, 4, 5

1Eva_IT2003_T2 Verificar una inducción matemática

Parcial I Término 2003 – 2004. Julio 08, 2003 /ICM00794

Tema 2. (15 puntos) Por el proceso de Inducción Matemática se puede demostrar la siguiente propiedad:

1^3 + 2^3 + 3^3 + \text{...}+ n^3 = \Big[ \frac{n(n+1)}{2}\Big]^2 \forall n \in \mathbb{N}

Realice un programa que valide el ingreso de un valor n entero (10 n 50) y verifique si cumple tal propiedad.

Sugerencia: calcule ambos lados de la ecuación y compare resultados.

Rúbrica: suma de serie al cubo (5 puntos), formula derecha y comparación (5 puntos). Revisión de la propiedad (5 puntos)

2Eva_IT2003_T1 Funciones promedio, mayor y menor

Final I Término 2003 – 2004. Septiembre 02, 2003 /ICM00794

Tema 1. (25 puntos) Escriba 3 funciones en C/C++, denominadas promedio, mayor y menor, las cuales reciben como parámetro un arreglo de 12 números reales y retornen, respectivamente:

  • el promedio de los elementos del vector,
  • el mayor de los elementos del vector y
  • el menor de los elementos del vector.

Escriba un programa en C/C++ que almacene en un arreglo las temperaturas medias de los 12 meses del año (datos de tipo float ingresados desde el teclado); luego llame a las 3 funciones anteriores a fin de mostrar por pantalla:

  • la temperatura anual promedio,
  • la diferencia de temperaturas entre el mes mas caluroso y el mes mas frío.

s2Eva_IIIT2003_T3 función distancia de Hamming

Ejercicio: 2Eva_IIIT2003_T3 función distancia de Hamming

Se deben comparar las cadenas U y V en los elementos de las mismas posiciones.
Primero se plantea un algoritmo para determinar el número de parejas diferentes que existen dentro de cada cadena.

Si las cadenas difieren en el tamaño, la respuesta será ‘-1’.

Intrucciones en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 2Eva_IIIT2003_T3 Distancia de Hamming

# INGRESO
U = '20001'
V = '10103'

# PROCEDIMIENTO
n = len(U)
m = len(V)

diferente= -1  # tamaño diferente U,V
if n == m:
    diferente = 0
    i = 0
    while not(i>=n):
        if U[i] != V[i]:
            diferente = diferente +1
        i = i + 1
# SALIDA
print('distancia Hamming: ', diferente)

resultado del algoritmo

distancia Hamming:  3
>>> 

Luego se procede a convertir el algoritmo a una función y hacer la llamada desde un programa, con lo que se cumple lo requerido en cada literal

Instrucciones en Python usando una función

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 2Eva_IIIT2003_T3 Distancia de Hamming

# literal a. funcion
def dHamming(U,V):
    n = len(U)
    m = len(V)

    diferente = -1
    if n == m:
        diferente = 0
        i = 0
        while not(i>=n):
            if U[i] != V[i]:
                diferente = diferente +1
            i = i + 1
    return(diferente)

# Programa -------------
# INGRESO
U = '20001'
V = '10103'

# PROCEDIMIENTO
diferente = dHamming(U,V)

# SALIDA
print('distancia Hamming: ', diferente)

Tarea: Añadir la lectura de los datos desde un archivo.

s2Eva_IIIT2003_T2 Raíz cuadrada por Newton, recursiva

Ejercicio: 2Eva_IIIT2003_T2 Raíz cuadrada por Newton

Recuerde que toda función recursiva requiere un valor inicial para la primera iteración. Empezando para n=0 con el valor de x:

f(1) = \frac{x}{2}

En el caso que n>1, se usa la expresión recursiva:

f(n) = 0.5\Bigg(f(n-1) + \frac{x}{f(n-1)}\Bigg)

Los valores tabulados para x=9 y n=10

ingrese x: 9
aproximación n-esima: 10
i , f(i)
0 nan
1 4.5
2 3.25
3 3.0096153846153846
4 3.000015360039322
5 3.0000000000393214
6 3.0
7 3.0
8 3.0
9 3.0
10 3.0
>>> 

Observe que a partir de la iteración 6, ya no muestra diferencia entre resultados consecutivos.

Para x= 9.5 con x=10

ingrese x: 9.5
aproximación n-esima: 10
i , f(i)
0 nan
1 4.75
2 3.375
3 3.0949074074074074
4 3.082233060472589
5 3.0822070015946474
6 3.0822070014844885
7 3.0822070014844885
8 3.0822070014844885
9 3.0822070014844885
10 3.0822070014844885
>>> 


Instrucciones en Python

La función no debe admitir valores de x negativos o cero, de darse el caso se responde np.NaN que corresponde a no es un número o ‘Not a Number’.

# 2Eva_IIIT2003_T2 Raíz cuadrada por Newton
import numpy as np

# literal a. función recursiva
def raizNewton(x,n)
    if n<=0 or x<=0:
        # no se admiten negativos o cero
        f = np.NaN
    else:
        if n == 1:
            f = x/2  # valor inicial
        if n>1:
            f = 0.5 *(raizNewton(x,n-1)+x/raizNewton(x,n-1))
    return (f)

# literal b. Programa ---------------
# INGRESO
x = float(input('ingrese x: '))
n = int(input('aproximación n-esima: '))

# PROCEDIMIENTO
print(' i , f(i)')
for i in range(0,n+1,1):
    print(i , raizNewton(x,i))

s1Eva_IIIT2003_T3 Coordenadas enteras en un círculo

Ejercicio: 1Eva_IIIT2003_T3 Coordenadas enteras en un círculo

Considere el círculo centrado en el origen (0,0), siendo su intervalo entre [-radio, radio].

Recorrer las coordenadas de números  enteros en el recuadro limitado por [-radio,radio] en cada lado, determinando la distancia del punto al origen.

radio = 10
x = [-10, -9, -8, -7, -6 ... 8, 9, 10]
\text{distancia} = \sqrt{x^2+y^2}
dist = np.sqrt(x**2 + y**2)

Con la distancia revisar si el punto está dentro del círculo.

if dist<=radio:
    encirculo = encirculo + 1
    sumadist  = sumadist + dist  

Instrucciones en Python

# 1Eva_IIIT2003_T3 Coordenadas enteras en un círculo
import numpy as np

# INGRESO
radio = 10

# PROCEDIMIENTO
a =  - int(radio)
b = int(radio)

encirculo = 0
sumadist = 0
for y in range(a,b+1,1):
    for x in range(a,b+1,1):
        dist = np.sqrt(x**2 + y**2)
        if dist<=radio:
            encirculo = encirculo + 1
            sumadist  = sumadist + dist          

promdist = sumadist/encirculo
# SALIDA
print(' coordenadas enteras en círculo: ')
print(encirculo)
print('promedio distancias al centro: ')
print(promdist)

resultado:

 coordenadas enteras en círculo: 
317
promedio distancias al centro: 
6.698944789255016
>>> 

s1Eva_IIIT2003_T2 Verificar números triangulares

Ejercicio: 1Eva_IIIT2003_T2 Verificar números triangulares

El problema planteado es semejante a construir una pirámide, en la que se disponen de solo t bloques y se requiere saber si el número de bloques es exacto para formar una pirámide.

El ejercicio se desarrolla suponiendo que se construirá una pirámide con bloques de varios «pisos».

Se observa que el número de bloques coincide con el número de piso a construir.

Ejemplo:

  • Piso 1 tiene 1 bloque,
  • piso 2 tiene 2 bloques,
  • etc.
piso = 1  # contador
usados = 0 # acumulador

Cada piso usa una cierta cantidad de bloques que se cuentan como «usados», es decir se acumulan. La cantidad de bloques por piso es la misma que el número del piso, contador que se inicia con 1.

El lazo o bucle  repite el proceso de tal forma que los bloques usados  se aumulan en cada piso.

while (usados<t):
    usados = usados + piso
    piso = piso+1

Dado un número t de bloques ,se calcula la secuencia de números triangulares mientras los bloques usados sean menores que los t disponibles.

En caso que el número “usados” de la secuencia es igual a t, se considera al número t como un número triangular.

La respuesta es un valor de verdad, si es triangular 1, si no lo es 0.

Lazo mientras-repita en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IIIT2003_T2 Números triangulares
# Propuesta de solución. edelros@espol.edu.ec

# INGRESO
t = int(input('Verificar si es triangular: '))

# PROCEDIMIENTO
piso = 1
usados = 0
while (usados<t):
    usados = usados + piso
    piso = piso+1

# verifica si es triangular
if usados==t:
    estriangular = 1
else:
    estriangular = 0

# SALIDA
print(estriangular )

Lazo Repita-hasta en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IIIT2003_T2 Números triangulares
# Propuesta de solución. edelros@espol.edu.ec

# INGRESO
t = int(input('Verificar si es triangular: '))

# PROCEDIMIENTO
piso = 1
usados = 0
while not(usados>=t):
    usados = usados+piso
    piso = piso+1

# verifica si es triangular
if usados==t:
    estriangular = 1
else:
    estriangular = 0

# SALIDA
print(estriangular )

Diagrama de Flujo

Diagrama de Flujo de números triangulares

Propuesta de solución con diagrama de flujo, Python y otra versión con matlab

ejercicios resueltos Python Parc_IIIT2003_T2 pdf

ejercicios resueltos Matlab parc_iiit2003_t2 pdf

s2Eva_IIT2003_T2 Mostrar un triángulo de Pascal

Ejercicio: 2Eva_IIT2003_T2 Mostrar un triángulo de Pascal

Para crear la matriz de Pascal en Python se usa la librería Numpy, con lo que se crea un arreglo de tamaño nxn lleno de ceros.

ejemplo:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
…. …. …. …. …. ….

Al recorrer la matriz por cada fila f y columna c, si la posición matriz[f,c] es la primera columna a la izquierda (c==0) o la diagonal (f==c) se escribe 1.

Si la posición de la matriz[f,c] es debajo de la diagonal, se suman los valores de las casilla inmediata superior e izquierda superior.

pascal[f,c] = pascal[f-1,c] + pascal[f-1,c-1]

Al terminar el recorrido se tendrá la matriz con el triángulo de Pascal.

Propuesta de solución en Python: py_pdf, también en versión matlab: m_pdf

Tarea: Convertir el algoritmo a función.

Instrucciones en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 2Eva_IIT2003_T2 Mostrar un triángulo de Pascal
# propuesta: edelros@espol.edu.ec

import numpy as np

# INGRESO
n = int(input('tamaño del triangulo: '))

# PROCEDIMIENTO
pascal = np.zeros(shape=(n,n),dtype=int)
f = 0
while (f<n):
    c = 0
    while (c<=f):
        if (c==0 or c==f):
            pascal[f,c] = 1
        else:
            pascal[f,c] = pascal[f-1,c] + pascal[f-1,c-1]
        c = c+1
    f = f+1

print(pascal)

resultado del algoritmo en una matriz

tamaño del triangulo: 10
[[  1   0   0   0   0   0   0   0   0   0]
 [  1   1   0   0   0   0   0   0   0   0]
 [  1   2   1   0   0   0   0   0   0   0]
 [  1   3   3   1   0   0   0   0   0   0]
 [  1   4   6   4   1   0   0   0   0   0]
 [  1   5  10  10   5   1   0   0   0   0]
 [  1   6  15  20  15   6   1   0   0   0]
 [  1   7  21  35  35  21   7   1   0   0]
 [  1   8  28  56  70  56  28   8   1   0]
 [  1   9  36  84 126 126  84  36   9   1]]
>>>

ejercicios resueltos Python final_iit2003_t2 pdf

ejercicios resueltos Matlab final_iit2003_t2 pdf