Etiqueta: ejercicios resueltos python

  • s2Eva_IIT2004_T1 Calcular raíz cúbica recursiva

    Ejercicio: 2Eva_IIT2004_T1 Calcular raíz cúbica recursiva

    Usar la fórmula recursiva:

    x = \frac{2 x^3+n}{3 x^2}

    considere controlar el número de iteraciones como máximo 100 veces (tarea). Para evitar un bucle infinito si la diferencia no disminuye (convergente).

    Algoritmo en Python

    # 2Eva_IIT2004_T1 Calcular raíz cúbica recursiva
    
    def cubic(n, tolera = 0.0001):
        xi = 1
        diferencia = 1
        while (diferencia>tolera):
            xn = (2*(xi**3)+n)/(3*(xi**2))
            diferencia = abs(xn-xi)
            xi = xn
        return(xi)
    
    

    resultado del algoritmo

    >>> cubic(8)
    2.0000000000120624
    >>> cubic(27)
    3.0000000000000973
    >>> 
    
  • s1Eva_IIT2004_T4 Matriz de paridad

    Ejercicio: 1Eva_IIT2004_T4 Matriz de paridad

    Establecer una matriz de n filas y n+1 columnas.

    matriz = np.zeros(shape=(n,n+1),dtype=int)

    Para cada casilla en cada fila y columna, generar un aleatorio de dos posibilidades que mínimo puede ser cero.

    aleatorio = int(rnd.random()*2)+0

    con lo que se genera la matriz de números aleatorios.
    bit en Matriz de Paridad
    Al finalizar una fila, considere la suma de fila para revisar la paridad con el residuo de la división para 2.

        residuo = sumafila % 2

    Si hay residuo el número es impar y se debe escribir el número 1 en la última casilla de toda la fila (fila, n), es decir se completa la paridad.

    En el caso opuesto, que no hay residuo=0, el conteo de '1' ya es par y se deja el valor cero en la última casilla.

    Algoritmo en Python

    # 1Eva_IIT2004_T4 Matriz de paridad
    import numpy as np
    import random as rnd
    
    # INGRESO
    n = 7 # tamaño matriz
    
    # PROCEDIMIENTO
    # matriz de n filas y n+1 columnas
    matriz = np.zeros(shape=(n,n+1),dtype=int)
    
    # recorre matriz
    for fila in range(0,n,1):
        sumafila = 0
        for columna in range(0,n,1):
            aleatorio = int(rnd.random()*2)+0
            matriz[fila,columna] = aleatorio
            sumafila = sumafila + aleatorio
        # revisa residuo paridad
        residuo = sumafila % 2  
        if residuo: # sumafila es impar
            matriz[fila,n] = 1
    
    # SALIDA
    print(' Matriz obtenida')
    print(matriz)
    

    resultado:

     Matriz obtenida
    [[0 1 1 1 0 1 1 1]
     [1 1 0 1 0 0 1 0]
     [0 1 1 1 0 1 1 1]
     [1 0 0 1 1 0 1 0]
     [0 1 0 0 0 1 0 0]
     [1 0 0 0 1 1 0 1]
     [1 0 0 0 1 0 1 1]]
    >>> 
    

    Nota: Observe que la matriz contiene números aleatorios, por lo que el resultado varía cada vez que se ejecuta el algoritmo.

  • s1Eva_IIT2004_T3 Estimar π por Montecarlo

    Ejercicio: 1Eva_IIT2004_T3 Estimar π por Montecarlo

    [ algoritmo ] [ diagrama flujo ]

    Ingresar la cantidad de puntos n para ubicar en el plano de forma aleatoria dentro del rango del cuadrado que contiene al círculo. 

    Usar una variable k como el contador para los puntos que caen dentro del círculo.

    Al generar aleatoriamente cada punto (x,y), se puede calcular la distancia al centro usando Pitágoras.

    d= \sqrt{x^2 +y^2}

    Se repite el proceso para n puntos y al final se calcula el valor estimado de pi según la relación del enunciado.

    \frac{k}{n} =\frac{\pi}{4}

    Nota: no se usa como variable la palabra “pi” debido a que es nombre de variable reservada.

    [ algoritmo ] [ diagrama flujo ]
    ..


    Algoritmo en Python

    # 1Eva_IIT2004_T3 Estimar Pi por Montecarlo
    # Propuesta de solución. edelros@espol.edu.ec
    # se usa todo el círculo
    import random as rnd
    import numpy as np
    
    # INGRESO
    n = int(input('¿Cuántos puntos?: '))
    radio = 1
    
    # PROCEDIMIENTO
    punto = np.zeros(shape=(n,2),dtype=float)
    k = 0
    i = 0
    while i<n:
        x = rnd.random()*(2*radio)-1
        y = rnd.random()*(2*radio)-1
    
        d = np.sqrt(x**2+y**2)
        if d<=radio:
            k = k + 1
        punto[i] = [x,y]
        i = i + 1
    
    estimadopi = 4*k/n
    
    # SALIDA
    print(k,n)
    print('estimador pi: ', estimadopi)
    print(punto)
    

    la estimación de π con números aleatorios que se ubican dentro del círculo de radio 1 es:

    ¿Cuántos puntos?: 1000
    781 1000
    estimador pi:  3.124
    [[ 0.15581724  0.43992571]
     [-0.11114653 -0.86426905]
     [ 0.51257751 -0.1969925 ]
     ...
     [ 0.26965478 -0.01555604]
     [-0.89575602  0.56077385]
     [ 0.33467618 -0.59497405]]
    >>> 
    

    [ algoritmo ] [ diagrama flujo ]
    ..


    Diagrama de Flujo

    [ algoritmo ] [ diagrama flujo ]

    ejercicios resueltos Matlab parc_iit2004_t3 pdf

  • s1Eva_IT2004_T3 Sortear parejas para tenis

    Ejercicio: 1Eva_IT2004_T3 Sortear parejas para tenis

    Propuesta de solución en Python:

    La variable n indica el número de parejas o tamaño de los vectores para almacenar la "pareja" y el contador de "veces" que juega cada una.

    # INGRESO
    n = int(input('cuantas parejas: '))

    El ejercicio se divide en dos partes: la primera para seleccionar de forma aleatoria la pareja de la dama (una por una), es decir se sortean los caballeros (quien), y la segunda parte se realiza el proceso para los caballeros.

    dama = n+1
    while not(dama>(2*n)):
        quien = int(rnd.random()*n)+1
        pareja[dama] = quien
        veces[quien] = veces[quien]+1
        dama = dama + 1

    En cada sorteo se registra cuántas veces participa cada uno.

    Algoritmo en Python

    # ICM00794-Fundamentos de Computación - FCNM-ESPOL
    # 1Eva_IT2004_T3 Sortear parejas para tenis
    
    import random as rnd
    import numpy as np
    
    # INGRESO
    n = int(input('cuantas parejas: '))
    
    # PROCEDIMIENTO
    pareja = np.zeros(2*n+1,dtype=int)
    veces  = np.zeros(  n+1,dtype=int)
    
    dama = n+1
    while not(dama>(2*n)):
        quien = int(rnd.random()*n)+1
        pareja[dama] = quien
        veces[quien] = veces[quien]+1
        dama = dama + 1
    
    # SALIDA
    print(pareja[n+1:])
    print('veces: ')
    print(veces)
    
    print('juegan varias veces: ')
    caballero = 1
    while not(caballero>n):
        if (veces[caballero]>1):
            print(caballero)
        caballero = caballero + 1
    
    print('los que no juegan: ')
    caballero = 1
    while not(caballero>n):
        if (veces[caballero]==0):
            print(caballero)
        caballero = caballero + 1
    

    con un ejemplo de resultado:

    cuantas parejas: 10
    [ 6  2  1  8  3  9 10  1  7  9]
    veces: 
    [0 2 1 1 0 0 1 1 1 2 1]
    juegan varias veces: 
    1
    9
    los que no juegan: 
    4
    5
    >>> 
    
  • s1Eva_IT2004_T2 Verificar ISBN

    Ejercicio: 1Eva_IT2004_T2 Verificar ISBN

    Propuesta de solución en Python, para un número ISBN dadoisbn libro

    ISBN = 9684443242

    Luego de pedir el número ISBN, se inicia extrayendo el dígito verificador escrito, quedando el resto de dígitos del número hacia la izquierda para realizar los cálculos.

    vescrito = ISBN%10
    n = ISBN//10
    

    Tarea: verificar el número de dígitos del ISBN

    Para la posición del dígito se usa un contador.

    Las operaciones se acumulan en suma, de la que se obtiene el residuo de la división para 11.

    El residuo corresponde al verificador calculado que se compara con el verificador escrito para dar el veredicto.

    Algoritmo en Python

    # ICM00794-Fundamentos de Computación - FCNM-ESPOL
    # 1Eva_IT2004_T2 Verificar ISBN
    # propuesta: edelros@espol.edu.ec
    
    # INGRESO
    ISBN = int(input('cual ISBN: '))
    
    # PROCEDIMIENTO
    vescrito = ISBN%10
    n = ISBN//10
    
    contador = 9
    suma = 0
    while (n>0):
        digito = n%10
        n = n//10
        suma =  suma + digito*contador
        contador = contador -1
    
    vcalculado = suma%11
    
    if (vescrito==vcalculado):
        respuesta = 1
    else:
        respuesta = 0
    
    #SALIDA
    print(respuesta)
    

    Resultado del algoritmo

    cual ISBN: 9684443242
    1
    >>> 
    cual ISBN: 9684443243
    0
    >>> 
    
  • 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'.

    Algoritmo 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
    >>> 
    
    

    Algoritmo 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

    [ mientras repita] [ para/for ]

    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  
    

    [ mientras repita] [ para/for ]
    ..


    Algoritmo en Python: bucle para/for

    # 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
    >>> 
    

    [ mientras repita] [ para/for ]
    ..


    Algoritmo en Python: mientras-repita

    # 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
    y = a
    while y<=b+1:
        x = a
        while x<=b+1:
            dist = np.sqrt(x**2 + y**2)
            if dist<=radio:
                encirculo = encirculo + 1
                sumadist  = sumadist + dist
            x = x + 1
        y = y + 1
    
    promdist = sumadist/encirculo
    # SALIDA
    print(' coordenadas enteras en círculo: ')
    print(encirculo)
    print('promedio distancias al centro: ')
    print(promdist)
    

    [ mientras repita] [ para/for ]

  • s1Eva_IIIT2003_T2 Verificar números triangulares

    Ejercicio: 1Eva_IIIT2003_T2 Verificar números triangulares

    [ mientras-repita ] [ repita-hasta ] [ diagrama flujo ]

    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 acumulan 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.

    [ mientras-repita ] [ repita-hasta ] [ diagrama flujo ]
    ..


    Algoritmo en Python: Bucle/Lazo mientras-repita

    # 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 )
    

    [ mientras-repita ] [ repita-hasta ] [ diagrama flujo ]
    ..


    Algoritmo en Python: Bucle/Lazo Repita-hasta

    # 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 )
    

    [ mientras-repita ] [ repita-hasta ] [ diagrama flujo ]
    ..


    Diagrama de Flujo

    Diagrama de Flujo de números triangulares

    [ mientras-repita ] [ repita-hasta ] [ diagrama flujo ]


    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

    [ mientras-repita ] [ repita-hasta ] [ diagrama flujo ]

  • 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.

    Algoritmo 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