taller_1a_Python3_old

TALLER DE PROGRAMACION 1: (20% de la nota final)

Fuente: []

**Fecha y hora límite de entrega:** Enviar a daalvarez@unal.edu.co. Sin excepción, por cada día de retraso en la entrega, se rebajarán 3 décimas de la nota __definitiva__ del Taller 1.
 * Parte 1: Marzo 24, 2015 a las 11:59pm
 * Parte 2: Abril 15, 2015 a las 11:59pm
 * Parte 3: Abril 30, 2015 a las 7:00am
 * Parte 4 (opcional): Mayo 19, 2015 a las 7:00am. La parte 4 de este taller es opcional y reemplaza la nota más baja de las entregas, 1, 2 y 3.

=Los ejercicios a realizar= Del libro Marzal-Gracia-García: Capítulo 4: Estructuras de Control 80 112 124
 * Parte 1: 18 ejercicios**

Del libro Trejos: Capítulo 7: Decisiones 5 15 25 30 40: . Leer dos números enteros y si la diferencia entre los dos es menor o igual a 10 entonces mostrar en pantalla todos los enteros comprendidos entre el menor y el mayor de los números leídos. Incluir ambos números en la impresión 45: Leer un número natural de 3 dígitos y si es par mostrar en pantalla la suma de sus dígitos, si es primo y menor que 500 mostrar en pantalla su último dígito y si es múltiplo de 5 y menor que 300 mostrar en pantalla el primer dígito. 50: Leer un número entero y si es múltiplo de 4 mostrar en pantalla su mitad, si es múltiplo de 5 mostrar en pantalla su cuadrado y si es múltiplo e 6 mostrar en pantalla su primer dígito. Asumir que el número no es mayor que 100. Observe que en este caso si entramos por ejemplo el 20, al ser múltiplo de 4 y 5 tendrá que mostrarse en pantalla su mitad y su cuadrado.

Capítulo 8: Ciclos 15 20 25 30 35: Leer dos números naturales y determinar a cuánto es igual el producto del primer dígito de cada uno. Tengamos en cuenta que para el número 23 el primer dígito es el 2. Y para el número 543 es el 5. 40 45 50

Del libro Marzal-Gracia-García: Capítulo 5: Secuencias: Listas y cadenas 152  160: Diseña un programa que lea una cadena y un número entero n y nos diga si todas sus palabras tienen una longitud de n caracteres. Aclaración: este programa por ejemplo diría que en la cadena "ábaco ratón cl123        +1231      éxito  horas" todas las cadenas tienen una longitud de 5 caracteres (observe que entre las palabras pueden existir uno o más espacios). Asuman que las palabras están separadas únicamente por espacios. Obviamente n debe ser un número positivo. Si se ingresa un número negativo, debe sacar una advertencia al usuario. Tenga en cuenta que pueden existir varios espacios entre las palabras; dichos espacios, no se deben tener en cuenta. 168  180: Diseña un programa que lea una cadena que representa un número NATURAL codificado en base 8 y muestre por pantalla su representación en base 2. 188: Una de las técnicas de criptografía más rudimentarias consiste en sustituir cada uno de los caracteres por otro situado n posiciones más a la derecha en el abecedario. Si n = 2, por ejemplo, sustituiremos la «a» por la «c», la «b» por la «d», y así sucesivamente. El problema que aparece en las últimas n letras del alfabeto tiene fácil solución: en el ejemplo, la letra «y» se sustituirá por la «a» y la letra «z» por la «b». La sustitución debe aplicarse a las letras minúsculas y mayúsculas y a los dígitos (el «0» se sustituye por el «2», el «1» por el «3» y así hasta llegar al «8», que se sustituye por el «0», y el «9», que se sustituye por el «1»). Diseña un programa que lea un texto y el valor de n y muestre su versión criptografiada. NOTAS: - El valor de n debe estar entre 1 y 10. - A caracteres diferentes a letras y números no se les aplicaría el cambio (se dejan tal cual) ejemplo: ?^^¡![] se dejan así - Los caracteres áéíóúüÁÉÍÓÚ no se cambiarán con dicha codificación. Si se debe tener en cuenta la ñÑ - Este tipo de codificación se conoce como "el cifrado César": [] []
 * Parte 2: 21 ejercicios**

200. Diseña un programa que lea dos cadenas y devuelva el prefijo común más largo de ambas. Por ejemplo: "¡¡¡Hoy, 14 de abril de 2015, es un día muy especial!!!" y "¡¡¡Hoy, 14 de agosto de 2015, es un día muy especial!!!". El programa retornaría "¡¡¡Hoy, 14 de a". 224  240: Haz un de programa que pida un número natural n y almacene en una variable M la matríz identidad de n × n (la que tiene unos en la diagonal principal y ceros en el resto de celdas. Imprima dicha matriz.

Del libro Trejos: Capítulo 9: Arreglos 10 20: Leer 10 números enteros, almacenarlos en un vector y determinar en qué posición está el menor número primo. Si el menor número primo está en varias posiciones, reportar todas aquellas posiciones donde este se encuentra. 35 40 45 50: Leer 10 números enteros, almacenarlos en un vector y determinar cuántos números de los almacenados en dicho vector comienzan en dígito primo. Tenga en cuenta por ejemplo que el número -79812 comienza en 7 (no en -7).

Capítulo 10: Matrices 10 20 30 35: Leer una matriz 4x6 entera y determinar cuál es el mayor dato almacenado en ella que pertenece a la serie de Fibonacci" 40 45 50: Leer una matriz entera 5x5 y determinar si el promedio ENTERO de los elementos que se encuentran en su diagonal PRINCIPAL está almacenado en ella. Mostrar en pantalla en qué posiciones exactas se encuentra dicho dato.


 * Parte 3: 21 ejercicios**
 * **En todos los programas se debe incluir un mecanismo para leer los datos requeridos por la función desde el teclado.**
 * **Se puede utilizar la librería math para los cálculos requeridos en esta entrega del taller.**

Del libro Marzal-Gracia-García: Capítulo 6: Funciones: 272 276

280 Define una función, que dados dos parámetros b y x, devuelva el valor del logaritmo de x en base b. Para tal fin, tenga en cuenta que: math \log_b(x) = \frac{\ln(x)}{\ln(b)} math y que, math \ln(a) = \int_1^a \frac{1}{x} dx math En este caso, se permite un error en el cálculo de la integral anterior de máximo 1e-3, asumiendo que a<5.

284: Define una función llamada raiz_n_esima que devuelva el valor de x^{1/n}. Utilice series de Taylor. Recuerde que: math a^b = \exp(b \ln(a)) = \sum_{i=0}^\infty \frac{(b \ln(a))^i}{i!} = 1 + (b \ln(a)) + \frac{(b \ln(a))^2}{2!} + \frac{(b \ln(a))^3}{3!} + \frac{(b \ln(a))^4}{4!} + \cdots math 288. Un ejemplo de programa podría ser el siguiente:

Por favor responda UNICAMENTE "sí" o "no" a cada una de las siguientes preguntas:


 * ¿Has besado alguna vez alguien que no te gusta?
 * ¿Te has dormido en clase de programación de computadores?
 * ¿Cantas por la mañana en la ducha?
 * ¿Has comido carne de cocodrilo?
 * ¿Has olvidado el cumpleaños de tu mejor amig@?

etc. Simplemente usen su creatividad.

292: Diseña un programa que, dado un número n, muestre por pantalla todas las parejas de números amigos menores que n. La impresión de los resultados debe hacerse desde un procedimiento. NOTA: los números amigos se explican en [] 296  300: Diseña una función que reciba una lista de palabras (cadenas) y devuelva, simultáneamente, la primera y la última palabras según el orden alfabético. En este ejercicio no se deben tener en cuenta las tildes y la ñ. Sin embargo, no se puede utilizar el comando sorted o el método sort de Python. Deben crear sus propias funciones de ordenamiento de cadenas. 304  308   312   316   332   336   348   352   356   364

La solución de los ejercicios MGG_380, MGG_384 y MGG_388 requiere la implementación de módulos. En este caso, se solicita que el nombre de los archivos asociados a ese módulo sean: vectores.py, estadisticas.py y matrices.py respectivamente. 380  384   388
 * En los siguientes programas se debe mejorar/implementar el módulo pedido, junto con las funciones que se solicitan:**

=Parte 4 -- opcional para los que quieran mejorar su nota y obligatorio para los que quieran volver a repetir la sustentación (12 ejercicios)=

MGG_178.py MGG_182.py MGG_210.py MGG_222.py No utilizar los métodos de cadenas lower, split, ni las utilidades de conjuntos para realizar este ejercicio. MGG_262.py En el postulado hay un error. Por ejemplo "ababab" es repetición de "ab" varias veces. Sin embargo "ababa" no lo es. Otro ejemplo sería: "123 123 123 123 " es repetición de "123 " pero "123 123 123 123" no lo sería (observe el espacio final). MGG_278.py ​Considere las palabras con tilde y sin tilde como palabras diferentes. Lo mismo aquellas escritas con mayúscula y con minúscula. MGG_310 No utilizar para ello las utilidades de conjuntos que suministra Python. EJE_1.py Dados dos vectores x e y de "n" elementos cada uno, calcular la ecuación de regresión lineal. Es decir, estimar las constantes m y b de y = m*x+b. Pista: http://www.cs.toronto.edu/~mbrubake/teaching/C11-Fall2014/Handouts/LinearRegression.pdf EJE_2.py Dado una lista L, que contiene números enteros repetidos y en desorden, imprimir una lista en la cual aparezcan dichos valores ordenados y una sola vez; por ejemplo si L = [2,1,7,1,3,4,-1,7,9,5,2,5], entonces el programa imprime [-1,1,2,3,4,5,7,9]. No usar las utilidades de conjuntos ni las utilidades para ordernar listas que provee Python (ejemplo: sorted o el método sort). EJE_3.py Elaborar un algoritmo que pregunte al usuario vectores de n1 y n2 elementos, los cuales, se sabe, están ordenados ascendentemente cada uno. Forme un tercer arreglo que quede ordenado en la medida que pasan los elementos de los dos arreglos iniciales. Imprimir el nuevo arreglo. No usar las utilidades que provee Python para ordenar listas: ejemplo sorted o el método sort. EJE_4.py Sin utilizar las funcionalidades que provee Python para convertir un número de una base a otra, elabore un programa que lea un número de base 10 e imprima su equivalente en las bases 2 8 y 16. EJE_5.py Haga una simulación de Monte Carlo para estimar el número pi. No utilizar para ello las funciones suministradas por el módulo random, sino que debe implementar el algoritmo "Linear Congruential Generator". Imprima la estimación de pi para 1000, 10000, 10000 y 100000 simulaciones de Monte Carlo (junto con el respectivo error en porcentaje de la estimación). Pistas: https://www.youtube.com/watch?v=VJTFfIqO4TU https://www.youtube.com/watch?v=9aJADZgNl18

=Fecha y hora de la sustentación= Grupo 1: Mayo 4 de 2015, 4:00pm Grupo 2: Mayo 7 de 2015, 10:00am

=Forma de presentación=
 * Individual

=Forma de calificación= code format="matlab" figure; plot([0 60 120 180 240],[1.2 1.2 1 0 0], 'LineWidth', 6); hold on; axis([0 240 -0.05 1.25]); grid on; title('Factor de ponderación obtenido en la sustentación', 'FontSize',16); xlabel('Tiempo utilizado para resolver la sustentación (minutos)', 'FontSize', 12); ylabel('Factor de ponderación', 'FontSize', 12); code
 * Una vez entregados los ejercicios por todos los estudiantes, en clase se seleccionarán de la parte 1 tres ejercicios al azar, de la parte 2 tres ejercicios y de la parte 3 cuatro ejercicios al azar, los cuales serán los únicos calificados. Se calificarán por lo tanto solo 10 ejercicios de los presentados.
 * En caso que no se haya presentado dicho ejercicio, tendrá una nota de 0 en dicho ejercicio (no importa si se olvidó incluirlo en el correo).
 * En caso que se detecte que hay copia en alguno de los ejercicios presentados (seleccionado o no en clase para calificación) se tendrá como nota un CERO en todo el taller (usted y su compañero).
 * Habrá sustentación de los ejercicios. La sustentación será un examen basado en los ejercicios presentados (no necesariamente los seleccionados anteriormente). Incluso si se hizo el ejercicio para el taller y funciona bien, pero no se pudo resolver LA TOTALIDAD de los ejercicios en la sustentación, se tendrá una nota en el taller de CERO. La nota de la sustentación básicamente un coeficiente de ponderación de la nota del trabajo, dado por la siguiente figura:

math Nota = CoefPonderación \times (0.3\text{Nota}_{\text{parte 1}} + 0.4\text{Nota}_{\text{parte 2}} + 0.4\text{Nota}_{\text{parte 3}}) math Asumiendo que Nota 1, Nota 2 y Nota 3 se evaluan sobre 5.0. Con el factor de ponderación de la sustentación, podría obtenerse una nota mayor.
 * La nota del taller será
 * Sin excepción alguna, por cada día de retraso en la entrega se rebajarán 3 décimas de la nota final.

=Forma de presentación (si no se cumple EXACTAMENTE les rebajo una unidad en la nota final. Seré estricto con respecto a esto)= code 107011_Pepito_Perez (nombre de la carpeta con guión bajo en vez de espacio) | |- 07_01.py       (Nombrar de esta forma los archivos del libro de Trejos) |- 07_03.py       (OJO al 0 que antecede al 1) |- 07_05.py       (observe que son dos dígitos no tres) |- 07_07.py |- 07_09.py |- 07_11.py |- 07_13.py |- ... |- MGG_090.py     (Nombrar de esta forma los archivos del libro de Marzal-Gracia-García) |- MGG_091.py     (OJO al 0 que antecede al 9) \- MGG_130.py     (observe que son tres dígitos) code NOTA: si el correo que ustedes envían les rebota, revisen que no tengan archivos de extensiones diferentes al .c. Si ustedes por ejemplo envían la carpeta con un archivo .exe, el correo de gmail siempre rechazará el archivo adjunto que ustedes tratan de enviar.
 * Se deben entregar archivos .py empaquetados en un solo archivo .zip y en una única carpeta
 * La forma de nombrar los archivos será por ejemplo 09_03.py, lo cual quiere decir que se está entregando el ejercicio 3 del capítulo 9 (observe los ceros). Todos los archivos deben ir en una carpeta cuyo nombre es su código+nombre; algo así como:

=Notas adicionales= code format="python" printf("Hola")  # imprime Hola x += 1          # incrementa la variable x en 1 code ya que son obvios!!.
 * Independientemente del libro y del capítulo del libro, utilizar siempre funciones para realizar actividades como detectar el primer dígito, verificar si un número entero es primo, verificar si un número entero es Fibonacci, etc. Si no se realiza esto, se rebajará en 20% la nota obtenida. **Cuando utilice funciones estas deben retornar algún valor y el único lugar donde está permitido imprimir los resultados es en el bloque principal del programa. Se exceptúa el caso que se hace una función que explícitamente está diseñada para imprimir resultados o datos, algo así como imprimir_matriz(M).**
 * El programa deberá estar **super comentado**, explicando las razones del porqué de su código, no las implementaciones de su código. La falta de comentarios explicativos le rebajará en 50% de la nota en ese punto. Se recomienda leer: http://www.variablenotfound.com/2007/12/13-consejos-para-comentar-tu-cdigo.html y http://www.genbetadev.com/trabajar-como-desarrollador/diez-consejos-para-mejorar-tus-comentarios-de-codigo-fuente. Por favor evite comentarios del tipo:


 * Si el programa está feo o desordenado en su presentación, se rebajará 50% de la nota en ese punto.
 * Se debe utilizar una identación de 4 espacios (ajustar la configuración en el IDE utilizado). Si no se sigue esta regla, se rebajará -0.5 unidades en ese punto.
 * Si el programa no corre o funciona incorrectamente, se tendrá como nota 0.0 en ese punto (así sea porque falta un espacio de identación).
 * Si se utilizan innecesariamente variables globales: se rebajará 50% de la nota para ese programa.
 * Por ninguna razón deben aparecer "errores" o excepciones. La aparición de un error o excepción le rebajará el 50% de la nota final.
 * Utilización de nombres de identificadores (variables, funciones, listas, etc) inapropiados o sin mucho sentido para quien lo lee (a excepción del programador) y sin comentarios apropiados (-1.0 unidades).
 * Si el programa excede en más del 10% del código las 80 columnas se rebajará el 50% de la nota (se sugiere activar la opción que muestra la columna # 80 en su ambiente de desarrollo)
 * Por cada error de ortografía se rebajará 1 décima en ese punto (para evitar esto se sugiere activar el corrector de ortografía de su ambiente de desarrollo).
 * No tildar el nombre de las variables o funciones. Tampoco utilizar la ñ mayúscula o minúscula o las diéresis. La violación de esta norma rebaja -0.5 en el ejercicio propuesto. Los comentarios si deben ir con toda la ortografía del caso, es decir, en los comentarios si se puede utilizar la eñe, las tildes y las diéresis.
 * Por no utilizar codificación UTF-8 se tendrán -0.5 unidades en el ejercicio en cuestión.
 * Por no alinear los comentarios, cuando estos se encuentren en filas consecutivas, se tendrá -0.5 unidades.
 * Por escribir o acceder a zonas de memoria no permitidas (esto sucede por ejemplo al utilizar incorrectamente las referencias a una lista o indexar incorrectamente una lista/tupla, etc), se tendrá 0 en la nota de ese punto, incluso si el programa aparentemente funciona bien.
 * Revisar las notas de como se debe escribir un buen código de programación (ver las diapositivas 07_-_Consejos_de_programacion_y_normas_de_estilo_con_Python_3.pdf)

A partir de la segunda entrega del Taller 1, se tendrán adicionalmente las siguientes reglas (ver las diapositivas 07_-_Consejos_de_programacion_y_normas_de_estilo_con_Python_3.pdf). Cualquier violación a las mismas descontarán 50% en la nota obtenida: code format="python" for i in range(5): i += 2 code o code format="python" for i in range(5): for i in range(3): print(i) code son ciclos for que incumplen la norma anterior. code format="python" if num%2 == 0: return True else: return False code lo correcto sería: code format="python" return num%2 == 0 code
 * Se prohíbe expresamente cualquier manipulación de un número convirtiéndolo previamente a una cadena de texto. Todas las operaciones con números deben realizarse utilizando operaciones aritméticas.
 * Se debe colocar un comentario informativo al principio de cada programa que indique la misión que debe realizar el programa que se muestra a continuación.
 * Se deben utilizar estructuras "try-except" para evitar que el programa falle debido a entradas no esperadas por parte del usuario.
 * Todas las funciones deben tener un docstring asociado. Estas deben estar contenidas entre  y . Las ''' deben ir en reglones separados y estar perfectamente alineadas.
 * No se deben utilizar comparaciones de variables booleanas contra True o False... es decir, no se deben hacer comparaciones como "if es_primo == True" (asumiendo que es_primo es una variable booleana) ya que son confusas e innecesarias.
 * No se deben utilizar comparaciones contra funciones que retornan True o False... es decir, no se deben hacer comparaciones como "if es_primo(n) == True" (asumiendo que es_primo(n) es una función que retorna True si n es primo, de lo contrario retorna False) ya que son confusas e innecesarias.
 * No se debe cambiar la variable índice de un ciclo for dentro del mismo ciclo for: ejemplo
 * No se debe mezclar o alternar las definiciones de función, importación de módulos y sentencias del programa principal.
 * El programa se debe escribir con secciones perfectamente definidas. Por ejemplo, una sección de entrada de datos, otra de procesamiento de datos y otra de presentación de resultados. Estas secciones se pueden mezclar únicamente cuando la legibilidad del programa se mejore.
 * No se deben crear funciones que lea información directamente desde el teclado o que la imprima a la pantalla, excepto si la función se crea explícitamente con el objetivo de leer/imprimir dicha información. Por ejemplo es válido crear funciones como leer_matriz o imprimir_matriz, pero no es válido crear funciones como es_primo la cual imprima desde la misma si un valor dado es primo o no.
 * Se debe informar al usuario sobre todas las situaciones anómalas posibles. El programa no debe quedarse callado frente a ciertas entradas incorrectas o que no producen los resultados esperados.
 * No se debe usar la palabra reservada pass "indiscriminadamente". Si se utiliza en ciertas construcciones con el objeto de mejorar la claridad del código, esa bien.
 * No se pueden utilizar estructuras if similares a:

o a code format="python" if num%2 == 0: es_divisible_2 = True else: es_divisible_2 = False code lo correcto sería: code format="python" es_divisible_2 = num%2 == 0 code

A partir de la tercera entrega del Taller 1, se tendrán en cuenta las siguientes reglas: Si el programa no corre o funciona incorrectamente, se tendrá en cuenta los siguientes criterios de calificación:
 * No usar variables con asignaciones enteras (como es_primo = 1 o es_primo = 0) que podrían perfectamente reemplazarse con variables booleanas (en tal caso la forma correcta sería es_primo = True o es_primo = False).
 * Si es un error grave en la concepción del algoritmo: Nota 0.0.
 * Si es un error menor en la concepción del algoritmo (por ejemplo, faltó un espacio de identación, se olvidó tener en cuenta un caso muy particular de entrada no esperada, etc), se rebajará la nota de la siguiente forma:
 * Por un error menor: se rebaja la nota en 30%.
 * Por dos errores menores: se rebaja la nota en 50%.
 * Por tres errores menores: se rebaja la nota en 75%.
 * Por cuatro o más menores: NOTA 0.0.


 * El decidir si un programa se encuentra en una categoría o en otra se deja a total criterio del profesor y de los monitores.


 * Por escribir código innecesario, se rebajará la nota en 30%.


 * Por escribir código extremadamente ineficiente, se rebajará la nota en 20%.


 * Ortografía: se exceptúa escribir en mayúscula la primera letra de cada comentario y poner el punto final a las líneas de los comentarios.


 * En los bloques try-except o se debe solicitar de nuevo una entrada o se debe corregir el error hecho por el usuario.


 * Si el programa imprime información alguna sin contexto se rebajará la nota en 30.

=Consejo= Si quieren aprender en verdad a programar intenten ustedes mismos hacer los ejercicios de forma autónoma (sin ayuda de los compañeros de clase o de alguien más). Por lo tanto eviten en lo posible los grupos de trabajo. Se prohíbe cualquier tipo de "colaboración" externa. Aprender a programar es como aprender a nadar. Uno no aprende a nadar viendo los campeonatos de natación en la TV. Hay que tirarse al agua para en verdad volverse un nadador. De alguna forma la sustentación es tan estricta porque solo le otorga los puntos obtenidos si usted le muestra al profesor que adquirió la habilidad para programar.

=Nota con respecto al Taller 2= Para poder presentar el Taller 2 se deberán cumplir el siguiente requisito: En caso que lo anterior no se cumpla se le asignarán 12 nuevos ejercicios; de dicho taller adicional se seleccionarán al azar 3 ejercicios que se computarán con los ejercicios ya presentados. Adicionalmente, se repetirá la sustentación previa entrega de los ejercicios adicionales. Esta acción se repetirá hasta que aprueben ambas condiciones. Si al finalizar el semestre no han aprobado dichas condiciones, no podrá presentar el Taller 2. La nota recibida en el Taller 2 será la misma nota del Taller 1.
 * Obtener en la sustentación un factor de ponderación por tiempo mayor o igual a 0.8

=Nota (para Diego)= Imprimir el taller con el comando de consola de Linux: code format="bash" for f in MGG_240.py 09_20.py 10_50.py; do   echo "-" echo "$f" echo "-" for dir in *; do       if test -d "$dir"; then echo ">>>> $dir <<<<" cd "$dir" iconv -c -f utf-8 -t ISO-8859-1 "$f" > "_$f" a2ps "_$f" --prologue=fixed --highlight-level=heavy --landscape --tabsize=4 --file-align=fill --header=%c --output="${f%.*}.pdf" a2ps "_$f" --prologue=fixed --highlight-level=heavy --landscape --tabsize=4 --file-align=fill --header=%c --sides=duplex rm "_$f" cd .. fi           done done code