Ejercicios simples de programación

En esta página voy a escribir algunos ejercicios simples de programación. Creo que cualquier estudiante, interesado en matemáticas (o en física, o en ingeniería), debe resolver la mayor parte de estos ejercicios en la secundaria o en la preparatoria. Es demasiado tarde resolver estos ejercicios en la licenciatura, pero es mejor tarde que nunca.

Los ejercicios se pueden resolver en Python, versión 3 (es mi recomendación personal), o en otros lenguajes de tipización dinámica (por ejemplo, JavaScript), o en lenguajes imperativos con tipización estricta (C++, Java, C#). La mayor parte de los ejercicios se puede resolver también en lenguajes funcionales (Haskell), pero yo sugiero estudiar lenguajes funcionales después de lenguajes más tradicionales.



Funciones

El concepto principal de programación es el concepto de función. Por supuesto, aquí hablamos de funciones computables que se realizan por medio de secuencias de operaciones elementales. La función recibe algunos argumentos (la «entrada» de la función) y regresa un resultado (la «salida» de la función).

Algunos alumnos piensan demasiado en la interfaz del programa (scanf y printf en C), pero no saben escribir sus propias funciones. Insisto en otro enfoque: en cada ejercicio se debe escribir una función con argumentos indicados y resultado indicado. Además de esta función, el programa debe incluir varias pruebas. Para los principiantes recomiendo realizar las pruebas de la siguiente manera: llamar la función programada con varias entradas, predeterminadas en el programa, y mostrar los resultados.


Fun0. Escribir una función de un argumento entero a que calcule y regrese el cubo de a.
Ejemplo. Entrada: −11. Salida: −1331.
Ejemplo. Entrada: 5. Salida: 125.
Soluciones: Python, JavaScript, C++, Haskell.

Fun1. Escribir una función de un argumento x que devuelva el cuadrado de x.
Ejemplo. Entrada: 17. Salida: 289.
Ejemplo. Entrada: −6. Salida: 36.

Fun2. Escribir una función de dos argumentos x, y que devuelva su diferencia x − y.
Ejemplo. Entrada: 5, 18. Salida: −13.
Ejemplo. Entrada: 32, −5. Salida: 37.

Fun3. Dados dos números enteros, regresar la suma de sus cubos. Sugerencia: usar la función programada en el Ejercicio Fun0.
Ejemplo. Entrada: 3, −12. Salida: −1701.
Ejemplo. Entrada: 15, −14. Salida: 631.

Fun4. Escribir una función de dos argumentos reales a, b que calcule y regrese la raíz cuadrada de la suma de sus cuadrados, es decir, la longitud de la hipotenusa del triángulo rectángulo cuyos catetos tienen longitudes a, b. Sugerencia: en el lenguaje de programación elegido encontrar la función que calcula la raíz cuadrada.
Ejemplo. Entrada: 11, 27.5. Salida: 29.6184064392398.

Fun5. Dados tres números a, b, c, regresar su suma. En otras palabras, hay que escribir una función con tres argumentos que calcule y regrese la suma de sus argumentos.
Ejemplo. Entrada: 25, −3, 17. Salida: 41.

Fun6. Dado un número real estrictamente positivo, regresar su raíz cúbica. Sugerencia: usar exp y log.
Ejemplo. Entrada: 65. Salida: 4.02072575858906.
Ejemplo. Entrada: 1000. Salida: 10.0000000000000.

Fun7. Dados tres números a, b, c, regresar la longitud de la diagonal del paralelogramo cuyos lados tienen longitudes a, b, c.
Entrada: −2.5, 0.3, −1.9. Salida: 3.1532620591175.

Fun8. Dados dos números reales positivos a, b, regresar la medida del ángulo BAC en el triángulo ABC, si el ángulo ACB es recto, |BC| = a y |AC| = b. Sugerencia: en el lenguaje de programación elegido encontrar la función trigonométrica inversa adecuada.
Entrada: 2.7, 5. Salida: 0.4951332634684.

Fun9. Dado un número entero x, regresar el resto al dividir x entre 7.
Sugerencia: encontrar la operación o la función correspondiente en el lenguaje de programación elegido.
Ejemplo. Entrada: 17. Salida: 3.
Ejemplo. Entrada: −40. Salida: 2.
Ejemplo. Entrada: 35. Salida: 0.

Fun10. Dado un número entero no negativo x, devolver la suma de los últimos dos dígitos de x en el sistema decimal.
Sugerencia: usar el cociente y el resido al dividir entre 10.
Ejemplo. Entrada: 729. Salida: 11.
Ejemplo. Entrada: 688. Salida: 16.
Ejemplo. Entrada: 5. Salida: 5.



Funciones que reciben números como argumentos y regresan un valor lógico

En estos ejercicios denotamos los dos valores lógicos («booleanos») por True y False. En algunos lenguajes de programación estos valores se denotan como true y false o como 1 y 0.

NumberToBool0. Determinar si el número entero dado es positivo. En otras palabras, escribir una función de un argumento entero; si el número dado es positivo, la función debe regresar True; en otro caso la función debe regresar False.
Ejemplo. Entrada: 8. Salida: True.
Ejemplo. Entrada: 53. Salida: True.
Ejemplo. Entrada: 0. Salida: False.
Ejemplo. Entrada: −4. Salida: False.
Ejemplo. Entrada: −70. Salida: False.

NumberToBool1. Determinar si el número entero dado es estrictamente menor que 7.
Ejemplo. Entrada: 5. Salida: True.
Ejemplo. Entrada: 7. Salida: False.
Ejemplo. Entrada: 82. Salida: False.
Ejemplo. Entrada: −31. Salida: True.

NumberToBool2. Dados tres números enteros a, b, x, determinar si x es mayor o igual al número a y al mismo tiempo estrictamente menor que b. En otras palabras, determinar si el número x pertenece al intervalo [a, b[.
Observación: si a ≥b, entonces para cualquier x la función debe regresar False.
Ejemplo. Entrada: 3, 32, 20. Salida: True.
Ejemplo. Entrada: −7, 40, 43. Salida: False.
Ejemplo. Entrada: 40, 6, 30. Salida: False.

NumberToBool3. Determinar si el número entero dado es par.
Sugerencia: en el lenguaje de programación elegido encontrar la operación o función que regresa el resto al dividir un número entre otro.
Ejemplo. Entrada: 5. Salida: False.
Ejemplo. Entrada: −44. Salida: True.
Ejemplo. Entrada: 0. Salida: True.
Ejemplo. Entrada: 466. Salida: True.

NumberToBool4. Determinar si el número entero dado es impar.
Sugerencia: en el lenguaje de programación elegido encontrar la operación o función que regresa el resto al dividir un número entre otro.
Ejemplo. Entrada: 5. Salida: True.
Ejemplo. Entrada: −44. Salida: False.
Ejemplo. Entrada: 0. Salida: False.
Ejemplo. Entrada: 466. Salida: False.

NumberToBool5. Determinar si el número entero dado es un múltiplo de 3. En otras palabras, dado un número entero a, regresar True si a es un múltiplo de 3; regresar False en otro caso. Sugerencia: en el lenguaje de programación elegido encontrar la operación o función que regresa el resto al dividir un número entre otro.
Ejemplo. Entrada: 18. Salida: True.
Ejemplo. Entrada: −42. Salida: True.
Ejemplo. Entrada: −71. Salida: False.
Ejemplo. Entrada: 0. Salida: True.



Construcción condicional

En algunos lenguajes hay varias construcciones condicionales: la expresión condicional (ternaria), la sentencia condicional con dos casos, la sentencia condicional con varios casos, etc. Para empezar, sugiero aprender las más simples de estas construcciones.


Cond0. Dado un número entero, regresar su valor absoluto. Sugerencia: usar la expresión condicional o el operador condicional.
Ejemplo. Entrada: −17. Salida: 17.
Ejemplo. Entrada: 63. Salida: 63.
Ejemplo. Entrada: 0. Salida: 0.
Soluciones: Python, JavaScript, C++, Haskell.

Cond1. Dado un número entero a, regresar su parte positiva. En otras palabras, si a es mayor o igual a cero, entonces regresar el mismo número a; en otro caso regresar el número cero.
Ejemplo. Entrada: −20. Salida: 0.
Ejemplo. Entrada: 38. Salida: 38.

Cond2. Escribir una función max2 de dos argumentos enteros que regrese el más grande de estos dos números. Ejemplo. Entrada: 70, −43. Salida: 70.
Ejemplo. Entrada: −23, −10. Salida: −10. Ejemplo. Entrada: −42, 35. Salida: 35. Ejemplo. Entrada: −17, −17. Salida: −17.

Cond3. Escribir una función max3 de tres argumentos enteros que regrese el más grande de estos tres números. Sugerencia: usar la función max2 del Ejercicio Cond2.

Cond4. Escribir una función min2 de dos argumentos enteros que regrese el más pequeño de estos dos números. Ejemplo. Entrada: 70, −43. Salida: 43.
Ejemplo. Entrada: −23, −10. Salida: −23. Ejemplo. Entrada: −42, 35. Salida: −42. Ejemplo. Entrada: −17, −17. Salida: −17.

Cond5. Escribir una función min3 de tres argumentos enteros que regrese el más pequeño de estos tres números. Sugerencia: usar la función min2 del Ejercicio Cond4.

Cond6. Escribir la función de dos argumentos reales positivos p, q, que calcule y regrese la raíz más grande de la ecuación x2 − 2p x − q = 0

Cond7. Están dados dos números enteros, a y b. Hagamos un análisis de la ecuación lineal a x = b, donde la incógnita x puede ser un número racional. Si la ecuación tiene una única solución, entonces regresar 1. Si la ecuación no tiene solución, entonces regresar 0. Si la ecuación tiene más de una solución, entonces regresar 2.
Ejemplo. Entrada: 70, −37. Salida: 1. Ejemplo. Entrada: 0, 56. Salida: 0. Ejemplo. Entrada: 0, 0. Salida: 2.

Cond8. Dados tres números reales a, b, x, devolver 1 si a ≤ x ≤ b; devolver 0 en otro caso. En otras palabras, se trata de programar la función característica del segmento [ab].
Ejemplo. Entrada: −3.0, 7.5, 5.0. Salida: 1.
Ejemplo. Entrada: 7.5, −3.0, 5.0. Salida: 0.
Ejemplo. Entrada: −3.0, 7.5, −5.0. Salida: 0.



Funciones que reciben números como argumentos y regresan un arreglo

En estos ejercicios entendemos la frase «número natural» como número entero no negativo (puede ser cero). Denotamos por [17, 4, −11] al arreglo (o la lista) de longitud 3 con entradas 17, 4, −11. Numeramos las posiciones desde 0. En algunos lenguajes de programación los arreglos o listas se denotan de otra manera.

NumberToArray0. Dado un número natural n y un número entero v, regresar el arreglo de longitud n tal que todas sus entradas son iguales a v. En otras palabras, construir un arreglo constante de longitud dada y con el valor dado.
Entrada: 6, −14. Salida: [−14, −14, −14, −14, −14, −14].

NumberToArray1. Dado un número natural n, regresar el arreglo de longitud n cuyos elementos son los cuadrados de los primeros números naturales.
Entrada: 5. Salida: [0, 1, 4, 9, 16].

NumberToArray2. Dados un número natural n y un número entero x, regresar el arreglo de longitud n cuyos elementos son los cuadrados de los enteros consecutivos, a partir de x.
Entrada: 7, −4. Salida: [16, 9, 4, 1, 0, 1, 4].

NumberToArray3. Dado un número natural n, regresar el arreglo a de longitud n cuyos elementos son las primeras potencias de 2, a partir de la potencia 0. Sugerencia: utilizar la fórmula recursiva para las potencias de 2. En otras palabras, para cada j con j ≥1, expresar a[j] a través de a[j − 1].
Entrada: 5. Salida: [1, 2, 4, 8, 16].

NumberToArray4. Dado un número natural n, regresar el arreglo de longitud n cuyos elementos son los factoriales de los primeros números naturales. Sugerencia: utilizar la fórmula recursiva para la función factorial.
Entrada: 5. Salida: [1, 1, 2, 6, 24].

NumberToArray5. Dado un número natural n, regresar el arreglo de longitud n cuyos elementos son los números 1 (en posiciones pares) y −1 (en posiciones impares).
Entrada: 5. Salida: [1, −1, 1, −1, 1].

NumberToArray6. Dado un número natural n y dos números enteros a y d, regresar el arreglo de longitud n que contiene los primeros n elementos de la progresión aritmética con el valor inicial a y la diferencia (incremento) d.
Entrada: 5, −3, 11. Salida: [−3, 8, 19, 30, 41].
Entrada: 4, 20, −15. Salida: [20, 5, −10, −25].
Entrada: 0, 5, −3. Salida: [].



Funciones que reciben un arreglo como argumento y regresan un arreglo

ArrayToArray0. Dado un arreglo a de números enteros, regresar un arreglo de números enteros de la misma longitud, cuyos elementos son los cuadrados de los elementos del arreglo dado.
Entrada: [−12, 23, 14, 6]. Salida: [144, 529, 196, 36].

ArrayToArray1. Dado un arreglo a de números enteros, regresar un arreglo que contiene los elementos de a en el orden invertido.
Entrada: [−12, 23, 14, 6]. Salida: [6, 14, 23, −12].

ArrayToArray2. Dados dos arreglos a y b de la misma longitud, devolver el arreglo de las sumas de sus elementos correspondientes.
Entrada: [−17, 4, 8, −28], [24, 7, −14, 9]. Salida: [7, 11, −6, −19].

ArrayToArray3. Dado un arreglo a, regresar el arreglo b de sus sumas parciales. En otras palabras, b[j] es la suma de los elementos de a con índices desde 0 hasta j. Sugerencia: si j ≥ 1, entonces b[j] se expresa a través de b[j − 1] y a[j].
Ejemplo. Entrada: [−7, 3, 29, −18]. Salida: [−7, −4, 25, 7].

ArrayToArray4. Dado un arreglo a de números enteros y un número entero b, devolver el arreglo que contiene a los elementos de a y después el número b.
Ejemplo. Entrada: [−7, 3, 25, −7, −18], 4. Salida: [−7, 3, 25, −7, −18, 4].

ArrayToArray5. Dado un arreglo a de números enteros y un número entero b, devolver el arreglo que contiene al número b y después los elementos de a.
Ejemplo. Entrada: [−7, 3, 25, −7, −18], 4. Salida: [4, −7, 3, 25, −7, −18].

ArrayToArray6. Dados dos arreglos a y b de números enteros, devolver el arreglo que contiene los elementos de a y después los elementos de b. En otras palabras, pegar dos arreglos en uno.
Ejemplo. Entrada: [−9, 14, 2, 14], [14, −15, 7, −6]. Salida: [−9, 14, 2, 14, 14, −15, 7, −6].

ArrayToArray7. Dado un arreglo a, devolver el arreglo dos veces más largo que tiene dos copias del arreglo a.
Ejemplo. Entrada: [−7, 3, 25, −7, −18]. Salida: [−7, 3, 25, −7, −18, −7, 3, 25, −7, −18].

ArrayToArray8. Dado un arreglo a, devolver el arreglo dos veces más largo que repite cada elemento de a dos veces.
Ejemplo. Entrada: [−7, 3, 25, −7, −18]. Salida: [−7, −7, 3, 3, 25, 25, −7, −7, −18, −18].

ArrayToArray9. Dado un arreglo a y un número entero j, devolver el arreglo que se obtiene de a al intercambiar los elementos con índices j y j + 1.
Sugerencia: en vez de modificar el arreglo original, se recomienda modificar su copia.
Sugerencia: si alguno de los índices j o j + 1 sale del rango adecuado, entonces se recomienda regresar una copia del arreglo original.
Ejemplo. Entrada: [−7, 3, 25, −7, −18], 2. Salida: [−7, 3, −7, 25, −18].



Funciones que reciben un arreglo como argumento y regresan un número

ArrayToNumber0. Dado un arreglo de números enteros, regresar la suma de sus entradas. En otras palabras, escribir una función de un argumento a que calcule y regrese la suma de las entradas de a.
Ejemplo. Entrada: [3, −44, −8, 0, 19]. Salida: −30.

ArrayToNumber1. Dado un arreglo de números enteros, regresar la suma de los cubos de sus entradas.

ArrayToNumber2. Dado un arreglo de números enteros, regresar la suma de los cuadrados de sus entradas.
Ejemplo. Entrada: 3, −44, −8, 0, 19. Salida: 2370.

ArrayToNumber3. Dado un arreglo de números reales, regresar la raíz cuadrada de la suma de los cuadrados de sus entradas. En otras palabras, regresar la norma euclideana del vector dado.

ArrayToNumber4. Dado un arreglo de números enteros, regresar el producto de sus entradas.

ArrayToNumber5. Dados dos arreglos de números reales (se supone que son de la misma longitud), regresar su producto punto.

ArrayToNumber6. Dado un arreglo de números enteros, regresar la cantidad de las entradas estrictamente positivas.

ArrayToNumber7. Dado un arreglo de números enteros, regresar la cantidad de las entradas que se dividen entre 3.

ArrayToNumber8. Dado un arreglo de números enteros, regresar la suma de sus entradas positivas.



Funciones con iteraciones que reciben números y regresan un número

For0. Dado un número entero a y un número natural p, devolver la p–ésima potencia del número a.
Ejemplo. Entrada: −5, 3. Salida: −125.
Ejemplo. Entrada: −5, 0. Salida: 1.
Ejemplo. Entrada: 0, 0. Salida: 1.
Ejemplo. Entrada: 7, 4. Salida: 2401.

For1. Dado un número natural n, devolver su factorial.
Ejemplo. Entrada: 0. Salida: 1.
Ejemplo. Entrada: 5. Salida: 120.

For2. Dado un número natural n y un número entero a, devolver el producto de n números enteros consecutivos, empezando con a.
Ejemplo. Entrada: 3, 7. Salida: 504.
Ejemplo. Entrada: 3, −7. Salida: −210.
Ejemplo. Entrada: 0, −7. Salida: 1.

For3. Dado un número natural n y un número entero a, devolver el producto de n números enteros consecutivos descendientes, empezando con a.
Ejemplo. Entrada: 3, 7. Salida: 210.
Ejemplo. Entrada: 3, −7. Salida: −504.
Ejemplo. Entrada: 0, −7. Salida: 1.

For4. Dados dos números naturales n y k, devolver el coeficiente binomial correspondiente. Se recomienda realizar un ciclo. Otra idea es llamar las funciones programadas en los ejercicios For1 y For3.
Ejemplo. Entrada: 5, 2. Salida: 10.
Ejemplo. Entrada: 5, 0. Salida: 1.



Iteración condicional (mientras)

While0. Dado un número entero positivo x, regresar el mínimo entre los números naturales n cuyos cuadrados son mayores o iguales a x. Sugerencia: en este ejercicios se pide usar un ciclo while o una recursión. Una solución más eficiente consiste en calcular la raíz cuadrada de x (o alguna de sus aproximaciones), pero en este ejercicio queremos ensayar el ciclo while o la recursión.
Ejemplo. Entrada: 40. Salida: 7.
Ejemplo. Entrada: 120. Salida: 11.
Ejemplo. Entrada: 64. Salida: 8.

While1. Dado un número entero positivo x, regresar el máximo entre los números naturales n cuyos cuadrados son menores o iguales a x. Ejemplo. Entrada: 40. Salida: 6.
Ejemplo. Entrada: 120. Salida: 10.
Ejemplo. Entrada: 64. Salida: 8.

While2. Dado un número entero estrictamente positivo x, calcular la longitud de su representación en el sistema decimal. Se recomienda resolver este ejercicio con un ciclo o con una recursión. Otra idea es usar la función logaritmo.
Ejemplo. Entrada: 40. Salida: 2.
Ejemplo. Entrada: 120. Salida: 3.

While3. Dado un número entero positivo x, calcular la suma de sus dígitos en el sistema decimal.
Ejemplo. Entrada: 47. Salida: 11.
Ejemplo. Entrada: 3742. Salida: 17.

While4. Dados dos números enteros estrictamente positivos x y b, calcular la longitud de la representación de x en el sistema posicional con base b. Se recomienda resolver este ejercicio con un ciclo o con una recursión. Otra idea es usar la función logaritmo.
Ejemplo. Entrada: 40, 2. Salida: 6.
Ejemplo. Entrada: 120, 2. Salida: 7.



Funciones que reciben un arreglo como argumento y regresan un valor lógico

ArrayToBool0. Dado un arreglo de números enteros, determinar si todas sus entradas se dividen entre 3. En otras palabras, regresar True, si todas los elementos de a son múltiplos de 3, y regresar False en el caso contrario.

ArrayToBool1. Dado un arreglo de números enteros, determinar si alguna de sus entradas se divide entre 3.

ArrayToBool2. Dado un arreglo de números enteros, determinar si todos sus elementos son mayores o iguales a 0.

ArrayToBool3. Dado un arreglo de números enteros, determinar si alguno de sus elementos es mayor o igual a 0.

ArrayToBool4. Dados dos arreglos a y b de números enteros, supuestamente de la misma longitud, determinar si todas las entradas de a son mayores o iguales que las entradas correspondientes de b.



Operaciones simples con polinomios

En este grupo de ejercicios se trata de polinomios de una variable, la cual denotamos por x. Guardamos los polinomios como arreglos de coeficientes, empezando con el término libre. Por ejemplo, el polinomio 3−x2 guardamos como [3, 0, −1]. Denotamos por Pol(a) al polinomio con coeficientes a. Por ejemplo, Pol([3, 0, −1]) es 3−x2. El arreglo vacío se trata como el polinomio cero. Los coeficientes de los polinomios se pueden guardar como números reales.

PolSimplified. Dado un arreglo a, regresar su subarreglo, desde el inicio y hasta el último elemento no nulo.
Ejemplo. Entrada: [−7, 4, 0, 0, 8, 0]. Salida: [−7, 4, 0, 0, 8, 0].

PolDeg. Dado un arreglo a, regresar el grado del polinomio Pol(a). Si el polinomio es nulo, entonces regresar −1.

PolByScalar. Dado un arreglo a y un número b, regresar el arreglo de los coeficientes del polinomio Pol(a) multiplicado por el escalar b.
Ejemplo. Entrada: [−7, 4, 0, 24], −11. Salida: [77, −44, 0, −264].
Ejemplo. Entrada: [−7, 4, 0, 24], 0. Salida: [].

PolSum. Dados dos arreglos a y b (no necesariamente de la misma longitud), regresar el arreglo de los coeficientes de la suma Pol(a) + Pol(b).
Ejemplo. Entrada: [−7, 4, 0, 24], [11, 5]. Salida: [4, 9, 0, 24].

PolByBinom. Dado un arreglo a y un número b, calcular los coeficientes del producto del polinomio Pol(a) por el binomio mónico x+b.

PolFromRoots. Dado un arreglo a, calcular los coeficientes del producto de los binomios mónicos xa[0], …, xa[n−1], donde n es la longitud de a. Sugerencia: usar la función PolByBinom.

PolBasicLagrange. Dado un arreglo a y un número j, calcular los coeficientes del j–ésimo polinomio básico de Lagrange que toma valor 1 en el punto a[j] y valor 0 en los puntos a[k], donde k ≠ j.

PolEval. Dado un arreglo a y un número b, calcular el valor del polinomio Pol(a) en el punto b.

PolValues. Dado un arreglo a y un arreglo b, calcular los valores del polinomio Pol(a) en los puntos b. Sugerencia: usar la función PolEval.



Funciones que reciben algunos números como argumentos y regresan una matriz

MatrixIdentity. Dado un número entero positivo n, regresar la matriz identidad de tamaño n por n. Recordamos que la entrada (j, k) de la matriz identidad es 1, si j = k, y 0, si j ≠ k. La función se puede realizar con expresión condicional o sin expresión condicional.
Ejemplo. Entrada: 3. Salida: [[1, 0, 0], [0, 1, 0], [0, 0, 1]].

MatrixHilbert. Dado un número entero positivo n, regresar la matriz de Hilbert de tamaño n por n. Recordamos que la entrada (j, k) de la matriz de Hilbert es 1 / (j + k − 1).
Ejemplo. Entrada: 3. Salida: [[1.00, 0.50, 0.33], [0.53, 0.33, 0.25], [0.33, 0.25, 0.20]].

MatrixMax. Dado un número entero positivo n, regresar la matriz de tamaño n por n cuya entrada (j, k) es max(j, k).
Ejemplo. Entrada: 3. Salida: [[0, 1, 2], [1, 1, 2], [2, 2, 2]].

MatrixMin. Dado un número entero positivo n, regresar la matriz de tamaño n por n cuya entrada (j, k) es min(j, k).
Ejemplo. Entrada: 3. Salida: [[0, 0, 0], [0, 1, 1], [0, 1, 2]].