Un programa «foolproof»

La clase pasada de Ken una compañera y yo decidimos hacer la tarea 10 de la máquina del tiempo de Ken. Un poco retadora la situación pero pudimos hacerlo bien al final despues de muchos errores.

En este programa mi compañera y yo pudimos demostrar el conocimiento de muchos «Mastering Topics». Y me gustó mucho la experiencia del «Pair programming», ya que nunca lo había experimentado como tal.

El programa que hicimos consiste en pedirle al usuario 10 números, para después con estos hacer una serie de operaciones y obtener su suma, promedio y desviación estandar. Pero nosotros no quisimos quedarnos solo con eso, así que decidimos hacer el programa «foolprof». Esto consiste en que si el usuario del programa comete un error, el programa no haga un «crash» que haga que el usuario tenga que reinciar el programa, y que los datos que el usuario dió de alta no se pierdan.

Nuestro código fue el siguiente:

#create a list of floats

import math

print ("Welcome, please enter numbers: ")

this=[]
number=1

def ciclo():
    global number
    while(True):
        try:
            a=float(input("Number "+str(number)+": "))
            this.append(a)
            number=number+1
            break
        except:
            print ("That's not a valid input")

ciclo()
ciclo()
ciclo()
ciclo()
ciclo()
ciclo()
ciclo()
ciclo()
ciclo()
ciclo()

print(this)
suma=0

for x in this:
    suma=suma+x

print ("The total sum of the numbers is: "+str(suma))

prom=suma/10

print ("The average is: "+str(prom))

indice=0
that=[]

def est():
    global indice
    global prom
    element=(this[indice]-prom)**2
    that.append(element)
    indice=indice+1

est()
est()
est()
est()
est()
est()
est()
est()
est()
est()
sumaa=0
for y in that:
    sumaa=sumaa+y

desviacion= math.sqrt(sumaa/10)

print ("The standart deviation is: "+str(desviacion))

Lo primero que decidimos hacer fue empezar a pensar una manera en la cual si el usuario escribe un valor erroneo, no se pierda la información escrita por este. Entonces decidimos hacer una función llamada «ciclo» la cual lo que hace es basicamente pedirle un número al usuario y asignarselo a la variable «a», para despues agregarlo a la lista previamente creada «this».

Eso es la funcionalidad básica del programa, pero si se hubiera quedado hasta allí si el usuario escribe un texto no válido el programa gritaría errores. Entonces decidimos hacer un ciclo while. Este hace que mientras el comando «break» no rompa el ciclo, este no se detiene.  Dentro del ciclo utilizamos el valor «try»  para lo que es la entrada del usuario, y si este «try» falla, te manda un mensaje que dice que tu entrada no es valida, y vuelve a empezar el ciclo. Como podemos observar el valor que escribió el usuario se guarda en la lista «this» .

Después de terminar esto, nos llegó el segundo reto, como poder que el texto del input cambie cada vez que se ejecuta. Me refiero a que te aparezca «number 1» y paara el segundo número «number 2» y así sucesivamente.

Para poder hacer esto, creamos una variable global llamada número, y la incluimos en el «input» del usuario, para despues sumarle 1 para el siguiente. La función tiene que ser global para que las modificaciones que se le hacen (el sumarle 1) se guarde afuera de la función y del ciclo. Cuando vamos a utilizar una variable global dentro de una función, tenemos que decirle al programa que la busque fuera de la función, por eso se le pone «global number» al iniciar la función.

Despúes de definir la función la llamamos diez veces para que guarde los diez números. Despues de llamar la función diez veces, la imprimimos para que le muestre al usuario los números que el escribió. Y despues hicimos un ciclo for para la suma, para que después se imprima el resultado.

Para el promedio lo único que hicimos fue dividir el resultado de la suma entre diez, y después lo imprimimos.

de relación típica

El tercer reto fué la desviación estandar, que se nos ocurrió hacerlo mediante que otra cosa, funciones. Para esta función llamamos a dos variables globales, índice y prom. Índice lo utilizamos para localizar los numeros de la lista mediante el valga la redundancia, indice. Element es (x1-x(prom))^2, entonces se debe de repetir una vez por cada número de la lista. Element es igual al valor x de la lista (this[indice]) menor el promedio elevado al cuadrado, después este resultado lo «apendeamos» a la lista «that» que es la lista para estos valores, y le sumamos uno al indice. Tenemos que repetir esta función diez veces para todos los números, para después utilizar un ciclo for para sumar todos los valor de la lista «that». Después solo queda dividir ese resultado entre diez, y sacarle raiz para después imprimirlo.

PROBLEMAS DURANTE EL RETO

funny-picture-programmers-problems1

El primer problema que tuvimos obviamente fue el que se nos ocurriera como hacer las funciones para que estas sirvieran, después de un rato pensando, pudimos llegar a una respuesta, que no sirvió, para después arreglarla y que si funcionara.

Después tuvimos un error en el cual el ciclo while para la lista se quedaba ciclado imprimiendo que habia un error, tras mucho pensar nos dimos cuenta que fué una falta de parentesis en el «input». Después cuando quisimos hacer que el texto del input cambiara conforme los números, este mismo error apareció. Nos dimos cuenta que no reconocía la variable «number» porque no la estaba buscando fuera de la función. Entonces al declarar la variable como global se solucionó el problema.

Estos fueron nuestros tres mayores problemas, que afortunadamente pudimos resolver. Obviamente tuvimos muchos más problemas pequeños que fuimos solucionando conforme íbamos trabajando.

Nos quedamos los dos al final con una experiencia muy grata de aprender todo esto de la programación.

 

Fuentes:

https://docs.python.org/2/tutorial/errors.html

http://www.ditutor.com/estadistica/desviacion_estandar.html

 

h0cudhV

SDKLSDKVSDKN