Fundamentos de Python con Orientación a Objetos y Basado en Problemas
-
Upload
carlos-arturo-castro-castro -
Category
Education
-
view
331 -
download
7
Transcript of Fundamentos de Python con Orientación a Objetos y Basado en Problemas
![Page 1: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/1.jpg)
Fundamentos de Python con Orientación a Objetos y Basado en Problemas
Por Carlos Arturo Castro Castro
1. El Problema
PROBLEMA EQUIPOS DE FUTBOL
Problema diseñado por Carlos Arturo Castro Castro
Temas: Arreglos Unidimensionales (vectores), Arreglos Bidimensionales (matrices).
Se tiene un arreglo unidimensional (vector) con los nombres de N equipos de futbol. Un jemplo podría ser (ejemplo 6 equipos-> N=6):
#1 #2 #3 #4 #5 #6
REAL LANÚS COLONIA LITEX BETIS NEC
Se tiene una tabla (matriz) con los puntajes resultado del enfrentamiento entre N equipos de futbol. Cada celda (posición fila,columna) tiene un valor de 0 (cero), 3 (tres) ó 1 (uno).
La primera columna tiene los puntajes resultado del enfrentamiento entre el equipo #1 con los
demás equipos. La segunda columna tiene los puntajes resultado del enfrentamiento entre el
equipo #2 con los demás equipos y así para las demás columnas. Los datos que están sobre la
diagonal principal son todos cero (0) debido a que un equipo no se enfrenta con el mismo. Es
decir en la celda en posición (2,1) (fila 2, columna 1) se encuentra el puntaje resultado del
enfrentamiento entre el equipo #1 y el equipo #2. En la celda en posición (3,1) (fila 3, columna
1) se encuentra el puntaje resultado del enfrentamiento entre el equipo #1 y el equipo #3. En la
celda en posición (i,j) (fila i, columna j) se encuentra el puntaje resultado del enfrentamiento
entre el equipo #j y el equipo #i.Ver la tabla ejemplo a continuación (N=6 equipos):
#1 #2 #3 #4 #5 #6
REAL LANÚS COLONIA LITEX BETIS NEC
REAL 0 0 1 1 1 3 LANÚS 3 0 3 0 3 3
COLONIA 1 0 0 3 3 3 LITEX 1 3 0 0 0 0 BETIS 1 0 0 3 0 0 NEC 0 0 0 3 3 0
Se requiere un vector con los puntajes totales. Es decir un vector en el cual la primera posición
![Page 2: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/2.jpg)
corresponde al puntaje total del equipo #1. Se obtiene sumando los puntajes de la columna #1
de la matriz. En la segunda posición se encuentra el puntaje total del equipo #2. En la posición
j, se encuentra el puntaje total del equipo #j (Se obtiene sumando los puntajes de la columna #j
de la matriz):
![Page 3: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/3.jpg)
#1 #2 #3 #4 #5 #6
REAL LANÚS COLONIA LITEX BETIS NEC
REAL 0 0 1 1 1 3
LANÚS 3 0 3 0 3 3
COLONIA 1 0 0 3 3 3
LITEX 1 3 0 0 0 0
BETIS 1 0 0 3 0 0
NEC 0 0 0 3 3 0
6 3 4 10 10 9
Requerimientos:
Vector de
nombres
Matriz de puntajes
Vector de
puntajes
totales
![Page 4: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/4.jpg)
Llenar el vector de nombres, digitando los datos, para un número N de equipos. N también debe ser digitado.
Llenar la matriz de puntajes, digitando solo los datos que se encuentran por debajo de
la diagonal principal, de modo que los que están por encima de la diagonal principal se
generen automáticamente. Es decir si el puntaje del equipo #j es 3, en la posición i,j de
la matriz se guarda 3 y la en posición j,i de la matriz se guarda 0 (cero). si el puntaje del
equipo #j es 0, en la posición i,j de la matriz se guarda 0 y la en posición j,i de la matriz
se guarda 3. si el puntaje del equipo #j es 1, en la posición i,j de la matriz se guarda 1 y
la en posición j,i de la matriz se guarda 1. Se debe controlar que el puntaje digitado en
la matriz sea cero, uno ó tres.
Mostrar los nombres de los equipos ordenados por puntajes totales. Se debe mostrar
en primer lugar el nombre del equipo con mayor puntaje (incluyendo su puntaje), en
segundo lugar el equipo con el puntaje que le sigue (incluyendo su puntaje), y así
sucesivamente. Se debe ordenar el vector de puntajes totales ascendentemente pero
los resultados se muestran de mayor a menor. Tenga en cuenta que el vector de
nombres y el vector de puntajes totales son paralelos. En este caso no considerar
diferencia de goles.
Mostrar la media aritm (promedio), desviación estándar, mediana y moda de los datos del vector de puntajes totales.
Para el ejemplo planteado N=6, debe mostrar:
LITEX BETIS NEC REAL COLONIA LANÚS
10 10 9 6 4 3
Media 7,00
DesvEst. 3,09838668
Mediana 7,50
Moda 10
![Page 5: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/5.jpg)
2. La Herramientas
Intérprete de Python: Versión 2.7.8
https://www.python.org/downloads/
![Page 6: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/6.jpg)
Diseñador de Ambiente gráfico para python 2.7 PYQT (Windows 32 bit installer)
http://www.riverbankcomputing.co.uk/software/pyqt/download
![Page 7: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/7.jpg)
IDE para python 2.7 PyScripter-v2.5.3 (32 bit)
https://code.google.com/p/pyscripter/downloads/list
![Page 8: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/8.jpg)
3. Instalar Herramientas
Instalar Python 2.7
![Page 9: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/9.jpg)
Finalizar
Instalar PyQt4-4.11.3-gpl-Py2.7-Qt4.8.6-x32
![Page 10: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/10.jpg)
![Page 11: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/11.jpg)
![Page 12: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/12.jpg)
Finalizar
Instalar PyScripter-v2.5.3-Setup
![Page 13: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/13.jpg)
![Page 14: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/14.jpg)
![Page 15: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/15.jpg)
![Page 16: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/16.jpg)
![Page 17: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/17.jpg)
Finalizar
4. Definir la arquitectura del software
![Page 18: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/18.jpg)
Se definió trabajar con dos paquetes de clases. El paquete Vista con los métodos que
implementan la interacción del programa con el usuario. Y el paquete Control, con los
métodos que poseen cálculos reutilizables e independientes de la forma como se
ingresan los datos y/o se muestran los resultados.
4.1 Crear una carpeta llamada proyectoEquipos
4.2 Paquete Control:
Se crea un archivo en blanco llamado __init__.py y se guarda en una carpeta llamada
control
![Page 19: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/19.jpg)
Se crea un módulo con la clase Matriz y métodos reutilizables
![Page 20: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/20.jpg)
# -*- coding: utf-8 -*- #La anterior Línea permite usar caracteres utf8 (tildes, eñes entre otros) #------------------------------------------------------------------------------- # Name: Matriz # Author: Carlos Arturo # Created: 29/11/2014 # Copyright: (c) Carlos Arturo 2014 # Licence: <your licence> #------------------------------------------------------------------------------- class Matriz: #atributos o propiedades mat=[] #se declara una arreglo numFilas=0 #se declara un entero numColumnas=0 #Métodos #Método para llenar matriz (Es decir asignar los datos en la matriz que se pasa como parámetro) def llenarMatriz(self,mat): self.mat=mat def obtenerNumFilas(self): self.numFilas=len(self.mat) return self.numFilas def obtenerNumColumnas(self):
![Page 21: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/21.jpg)
self.numColumnas=len(self.mat[0]) return self.numColumnas #método para retornar un vector en el que se obtiene la suma de cada columna def obtenerSumaColumnas(self): sum=0 vec = [] nc=self.obtenerNumColumnas() #ciclo para. Inicializa el vector con nc ceros for i in range(nc): vec.append(0) #ciclos para anidados. Suma cada columna de la matriz y la lleva a un vector for j in range(self.obtenerNumColumnas()): sum=0 for i in range(self.obtenerNumFilas()): sum=sum+self.mat[i][j] vec[j]=sum return vec
Se crea un módulo con la clase Vector y métodos reutilizables
# -*- coding: utf-8 -*- #-------------------------------------------------------------------------------
![Page 22: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/22.jpg)
# Name: Vector # Author: Carlos Arturo # Created: 29/11/2014 # Copyright: (c) Carlos Arturo 2014 #------------------------------------------------------------------------------- #ver https://docs.python.org/2/library/functions.html import math class Vector: #atributos vec=[] def __init__(self,vec): #método para inicilaizar atributos self.vec=vec def obtenerNumElementos(self): return len(self.vec) def obtenerMedia(self): return float(sum(self.vec))/len(self.vec) #algoritmo tradicional de la media def obtenerMedia1(self): Acum=0 for i in range(len(self.vec)): Acum=Acum+self.vec[i] media=float(Acum)/self.obtenerNumElementos() #tambien media= media=float(Acum)/len(self.vec) return media def ordenarVectorAsc(self): self.vec.sort() return self.vec def ordenarVectorDesc(self): self.vec.sort() self.vec.reverse() return self.vec def ordenarVectorBurbuja(self): n=len(self.vec) for i in range(n-1): for j in range(i+1,n): if self.vec[i] > self.vec[j]: aux=self.vec[i] self.vec[i]=self.vec[j] self.vec[j]=aux return self.vec def obtenerMediana(self): self.vec.sort() n = len(self.vec) if len(self.vec) % 2 == 0: #si n es par
![Page 23: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/23.jpg)
mediana = (self.vec[n/2-1]+ self.vec[n/2] )/2.0 #al dividirlo por 2.0 lo convierte a float else: mediana =self.vec[n/2] return mediana def obtenerModa1(self): n=len(self.vec) moda=self.vec[1] contModa=1 resultado=[contModa,moda] for i in range(n-1): cont=1 for j in range(i+1,n): if self.vec[i]==self.vec[j]: cont=cont+1 if cont >= contModa: contModa=cont moda=self.vec[i] resultado=[contModa,moda] if resultado[0]==1: moda=None else: moda=resultado[1]#aunque tenga varias modas. solo devuelve 1 return moda def obtenerVectorModas(self): n=len(self.vec) vecModas=[] for i in range(n): cont=1 for j in range(i+1,n): if self.vec[i]==self.vec[j]: cont=cont+1 #cuenta el número de veces que vec[i] se necuentra en el vector vecModas.append(cont) self.ordenarVectoresParalelos(0,vecModas,self.vec) return vecModas def obtenerDesviacionEstandarMuestral(self): media=self.obtenerMedia() n=len(self.vec) sumatoria=0.0 for i in range(n): sumatoria=sumatoria+(media-self.vec[i])**2 desVest = math.sqrt((sumatoria)/(n-1)) return desVest
![Page 24: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/24.jpg)
def ordenarVectoresParalelos(self,fila,*parametros): mat=list(parametros) nfil=len(mat) ncol=len(mat[0]) if fila >= nfil: fila=nfil-1 elif fila < 0: fila=0 aux=[] #aux es un vector para intercambiar columnas for i in range(nfil): aux.append(None) for i in range(ncol-1): for j in range(i+1,ncol): if mat[fila][i] < mat[fila][j]: for k in range(nfil): aux[k]=mat[k][i] for k in range(nfil): mat[k][i]=mat[k][j] for k in range(nfil): mat[k][j]=aux[k] return mat
4.3 Paquete Vista:
Se crea un archivo en blanco llamado __init__.py y se guarda en una carpeta llamada
vista
![Page 25: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/25.jpg)
Se crea un módulo llamado pryEquiposConsola.py y se guarda en la carpeta vista
Se importan las clases del paquete control
Se ingresan los datos por consola a un Vector de nombres de equipos y a una matriz de
puntajes.
Se Obtienen la medidas estadísticas invocando a los métodos correspondientes
![Page 26: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/26.jpg)
![Page 27: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/27.jpg)
# -*- coding: utf-8 -*- #------------------------------------------------------------------------------- # Name: pryEquiposConsola # Purpose: # # Author: Carlos Arturo # # Created: 30/11/2014 # Copyright: (c) Carlos Arturo 2014 # Licence: <your licence> #------------------------------------------------------------------------------- def main(): pass if __name__ == '__main__': main() from control.Matriz import * from control.Vector import * #vector de nombres vecNombres=[] continuar=True i=1 while (continuar == True): try: #Control de Excepciones nombreEquipo= raw_input("Ingrese Nombre del equipo # " + str(i)) i=i+1 vecNombres.append(nombreEquipo) except KeyboardInterrupt: continuar=False #Matriz de Puntajes matPuntajes=[] n= len(vecNombres) for i in range(n): matPuntajes.append( [0] * n ) #n filas for j in range(n): i=0 while i < n: #matPuntajes[i][j] = int(raw_input('Dame el componente (%i,%i): ' % (i, j))) if i>j: #por debajo de la diagonal principal matPuntajes[i][j] = int(input(" Puntaje del equipo " + vecNombres[j] + " al enfrentarse con el equipo " + vecNombres[i] + " :")) if matPuntajes[i][j]==3:
![Page 28: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/28.jpg)
matPuntajes[j][i]=0; else: if matPuntajes[i][j]==0: matPuntajes[j][i]=3; else: if matPuntajes[i][j]==1: matPuntajes[j][i]=1; else: print("Debe ingresar 1, 3 o 0") i=i-1 i=i+1 #contador para el mientras #print matPuntajes for i in range(n): print matPuntajes[i] #crear un objeto de la clase Matriz objMatriz = Matriz() objMatriz.llenarMatriz(matPuntajes) #obtner el Vector de puntajes totales vectPunajesTolates=[] vectPunajesTolates = objMatriz.obtenerSumaColumnas() vectPunajesTolates1 = objMatriz.obtenerSumaColumnas() print '____________' print vectPunajesTolates #Crear un objeto de la clase Vector objVector = Vector(vectPunajesTolates) #Obtener Medidas estadísticas media = objVector.obtenerMedia() mediana = objVector.obtenerMediana() moda = objVector.obtenerModa1() desviacionEstandar = objVector.obtenerDesviacionEstandarMuestral() print 'Media =' + str(media) print 'mediana =' + str(mediana) print 'moda =' + str(moda) print 'desviación Estándar =' + str(desviacionEstandar) print '____________' print vectPunajesTolates print vectPunajesTolates1 print '____________'
![Page 29: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/29.jpg)
#Ordenar el vector de Puntajes totales vectoresParalelos= objVector.ordenarVectoresParalelos(0,vectPunajesTolates1,vecNombres) print '____________' print vectoresParalelos print '____________' print vectoresParalelos[1] #nombres de los equipos print vectoresParalelos[0] #puntajes totales de los equipos
Puede usarse la función random.randint(1,3), para generar un aleatorio entero entre 1
y 3 y simular los puntajes ingresados por un usuario
Para esto se requiere importar el módulo random.
Se creó un nuevo proyecto denominado: pryEquiposConsolaRandom.py
# -*- coding: utf-8 -*- #------------------------------------------------------------------------------- # Name: pryEquiposConsola # Purpose: # # Author: Carlos Arturo # # Created: 30/11/2014 # Copyright: (c) Carlos Arturo 2014 # Licence: <your licence> #------------------------------------------------------------------------------- def main(): pass if __name__ == '__main__':
![Page 30: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/30.jpg)
main() from control.Matriz import * from control.Vector import * import random #vector de nombres vecNombres=[] continuar=True i=1 while (continuar == True): try: #Control de Excepciones nombreEquipo= raw_input("Ingrese Nombre del equipo # " + str(i)) i=i+1 vecNombres.append(nombreEquipo) except KeyboardInterrupt: continuar=False #Matriz de Puntajes matPuntajes=[] n= len(vecNombres) random.seed() #inicia generador de n{umeros aleatorios for i in range(n): matPuntajes.append( [0] * n ) #n filas for j in range(n): i=0 while i < n: #matPuntajes[i][j] = int(raw_input('Dame el componente (%i,%i): ' % (i, j))) if i>j: #por debajo de la diagonal principal #matPuntajes[i][j] = int(input(" Puntaje del equipo " + vecNombres[j] + " al enfrentarse con el equipo " + vecNombres[i] + " :")) matPuntajes[i][j]= random.randint(1,3) #aleatorio entre 1 y 3 if matPuntajes[i][j]==3: matPuntajes[j][i]=0; else: if matPuntajes[i][j]==0: matPuntajes[j][i]=3; else: if matPuntajes[i][j]==1: matPuntajes[j][i]=1; else: print("Debe ingresar 1, 3 o 0") i=i-1 i=i+1 #contador para el mientras #print matPuntajes for i in range(n): print matPuntajes[i]
![Page 31: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/31.jpg)
#crear un objeto de la clase Matriz objMatriz = Matriz() objMatriz.llenarMatriz(matPuntajes) #obtner el Vector de puntajes totales vectPunajesTolates=[] vectPunajesTolates = objMatriz.obtenerSumaColumnas() vectPunajesTolates1 = objMatriz.obtenerSumaColumnas() print '____________' print vectPunajesTolates #Crear un objeto de la clase Vector objVector = Vector(vectPunajesTolates) #Obtener Medidas estadísticas media = objVector.obtenerMedia() mediana = objVector.obtenerMediana() moda = objVector.obtenerModa1() desviacionEstandar = objVector.obtenerDesviacionEstandarMuestral() print 'Media =' + str(media) print 'mediana =' + str(mediana) print 'moda =' + str(moda) print 'desviación Estándar =' + str(desviacionEstandar) print '____________' print vectPunajesTolates print vectPunajesTolates1 print '____________' #Ordenar el vector de Puntajes totales vectoresParalelos= objVector.ordenarVectoresParalelos(0,vectPunajesTolates1,vecNombres) print '____________' print vectoresParalelos print '____________' print vectoresParalelos[1] #nombres de los equipos print vectoresParalelos[0] #puntajes totales de los equipos
![Page 32: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/32.jpg)
5. Clase Archivo
Se escribe el código para una clase con métodos que permitan manejar las operaciones básicas
con archivos planos: Abrir, Cerrar, Escribir una línea de texto en el archivo, leer una línea de
texto del archivo
# -*- coding: utf-8 -*- #------------------------------------------------------------------------------- # Name: Archivo # Purpose: # # Author: carlos.castro # # Created: 01/12/2014 # Copyright: (c) carlos.castro 2014 # Licence: <your licence> #------------------------------------------------------------------------------- #ver http://www.tutorialspoint.com/python/python_files_io.htm def main(): pass if __name__ == '__main__': main() import os class Archivo: f="" #Se declara la variable tipo archivo rutaYNombre="" mensaje="ok" def __init__(self,rutaYNombre): self.rutaYNombre =rutaYNombre def abirArchivo(self): try: if os.path.exists(self.rutaYNombre): self.f = open(self.rutaYNombre,'r+')#abre archivo para lectura escritura else: self.f = open(self.rutaYNombre,'a+')#crea archivo para lectura escritura except IOError as objIOError: self.mensaje= "Problemas con el archivo: Error #" + str(objIOError.errno) + " Mensaje : "+format(objIOError.strerror) return self.mensaje def cerrarArchivo(self): self.mensaje="ok" try: self.f.close() except IOError as objIOError:
![Page 33: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/33.jpg)
self.mensaje= "Problemas con el archivo: Error #" + str(objIOError.errno) + " Mensaje : "+format(objIOError.strerror) return self.mensaje def contarNumLineasArchivo(self): self.mensaje="ok" n=0 try: for LineaTexto in self.f: n=n+1 except IOError as objIOError: self.mensaje= "Problemas con el archivo: Error #" + str(objIOError.errno) + " Mensaje : "+format(objIOError.strerror) return self.mensaje return n def leerUnaLinea(self): self.mensaje="ok" try: lineaTexto = self.f.readline() if lineaTexto[-1] == '\n': lineaTexto=lineaTexto[:-1] #elimina el \n except IOError as objIOError: self.mensaje= "Problemas con el archivo: Error #" + str(objIOError.errno) + " Mensaje : "+format(objIOError.strerror) return self.mensaje return lineaTexto def escribirUnaLineaDebajo(self,lineaTexto): self.mensaje="ok" print lineaTexto try: self.f.writelines(lineaTexto+"\n") except IOError as objIOError: self.mensaje= "Problemas con el archivo: Error #" + str(objIOError.errno) + " Mensaje : "+format(objIOError.strerror) return self.mensaje def escribirUnaLineaAlFrente(self,lineaTexto): self.mensaje="ok" print lineaTexto try: self.f.writelines(lineaTexto) except IOError as objIOError: self.mensaje= "Problemas con el archivo: Error #" + str(objIOError.errno) + " Mensaje : "+format(objIOError.strerror) return self.mensaje
![Page 34: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/34.jpg)
6. Diseño de la Interfaz gráfica
Para la interfaz gráfica se seleccionó PYQY
6.1 ejecutar el diseñador que está en C:\Python27\Lib\site-packages\PyQt4
Seleccionar Main Window -> Crear
![Page 35: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/35.jpg)
Dibujar: dos Label, un Text Edit , tres TableView, un ListView , un Push Button:
Guardar el archivo en la carpeta C:\Python27\Lib\site-packages\PyQt4 con el nombre
de:
pryEquiposConsolaRandomGUIPYQT4
![Page 36: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/36.jpg)
Cerrar el Qt Designer
Crear el archivo pryEquiposConsolaRandomGUIPYQT4.py a partir del archivo
pryEquiposConsolaRandomGUIPYQT4.ui
En el PyScripter: Herramientas->Herramientas->Command Prompt
![Page 37: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/37.jpg)
Se cambia a la carpeta donde está el conversor:
>cd C:\Python27\Lib\site-packages\PyQt4
![Page 38: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/38.jpg)
Se ejecuta:
> pyuic4 -x pryEquiposConsolaRandomGUIPYQT4.ui -o pryEquiposConsolaRandomGUIPYQT4.py
Se copia el archivo pryEquiposConsolaRandomGUIPYQT4.py en la carpeta vista del proyecto
![Page 39: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/39.jpg)
Se abre el archivo pryEquiposConsolaRandomGUIPYQT4.py con PYSCRIPTER
![Page 40: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/40.jpg)
Al ejecutarlo queda así:
![Page 41: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/41.jpg)
Se programa un método que se identificará como btnCalcularClick en el que se programan los
llamados a los métodos que realizan los cálculos y se muestran los resultados en los objetos
gráficos:
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'pryEquiposConsolaRandomGUIPYQT4.ui' # # Created: Tue Dec 02 18:50:03 2014 # by: PyQt4 UI code generator 4.11.3 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig) class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName(_fromUtf8("MainWindow"))
![Page 42: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/42.jpg)
MainWindow.resize(1157, 720) self.centralwidget = QtGui.QWidget(MainWindow) self.centralwidget.setObjectName(_fromUtf8("centralwidget")) self.label = QtGui.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(330, 0, 211, 21)) font = QtGui.QFont() font.setPointSize(14) font.setBold(True) font.setWeight(75) self.label.setFont(font) self.label.setObjectName(_fromUtf8("label")) self.tableView = QtGui.QTableView(self.centralwidget) self.tableView.setGeometry(QtCore.QRect(30, 70, 861, 51)) self.tableView.setObjectName(_fromUtf8("tableView")) self.label_2 = QtGui.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(40, 40, 201, 16)) font = QtGui.QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.label_2.setFont(font) self.label_2.setObjectName(_fromUtf8("label_2")) self.textEdit = QtGui.QTextEdit(self.centralwidget) self.textEdit.setGeometry(QtCore.QRect(250, 40, 201, 21)) self.textEdit.setObjectName(_fromUtf8("textEdit")) self.tableView_2 = QtGui.QTableView(self.centralwidget) self.tableView_2.setGeometry(QtCore.QRect(30, 130, 861, 331)) self.tableView_2.setObjectName(_fromUtf8("tableView_2")) self.tableView_3 = QtGui.QTableView(self.centralwidget) self.tableView_3.setGeometry(QtCore.QRect(30, 480, 861, 61)) self.tableView_3.setObjectName(_fromUtf8("tableView_3")) self.pushButton = QtGui.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(420, 590, 141, 41)) self.pushButton.setObjectName(_fromUtf8("pushButton")) self.listView = QtGui.QListView(self.centralwidget) self.listView.setGeometry(QtCore.QRect(920, 130, 211, 321)) self.listView.setObjectName(_fromUtf8("listView")) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtGui.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 1157, 21)) self.menubar.setObjectName(_fromUtf8("menubar")) MainWindow.setMenuBar(self.menubar) self.statusbar = QtGui.QStatusBar(MainWindow) self.statusbar.setObjectName(_fromUtf8("statusbar")) MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) self.label.setText(_translate("MainWindow", "Equipos de Futbol", None))
![Page 43: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/43.jpg)
self.label_2.setText(_translate("MainWindow", "Número de equipos de fútbol", None)) self.pushButton.setText(_translate("MainWindow", "PushButton", None)) #****************************************************************************************************** #Se agrega la siguiente línea para programar el evento click sobre el botón e invoque qoe método btnCalcularClick QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.btnCalcularClick) #****************************************************************************************************** def btnCalcularClick(self): from control.Matriz import * from control.Vector import * from control.Archivo import * import random,os rta='s' rta2='s' #vector de nombres vecNombres=[] if rta =='s': objArchivo=Archivo("nombres.txt") sw=objArchivo.abirArchivo() if sw == 'ok': lineaTexto=objArchivo.leerUnaLinea() lineaTexto=lineaTexto[:-1] vecNombres=lineaTexto.split(",") objArchivo.cerrarArchivo() else: pass #Matriz de Puntajes matPuntajes=[] n= len(vecNombres) #****************************************************************************************************** #Se asigna el Cuadro de Texto con el valor de n self.textEdit.setText(str(n)) #******************************************************************************************************
![Page 44: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/44.jpg)
#****************************************************************************************************** #muestra el Vector de nombres en el Primer TableView model1 = QtGui.QStandardItemModel (1, n) #se define el modelo 1 filas y n columnas for fila in range(1): for columna in range(n): item1 = QtGui.QStandardItem(vecNombres[columna]) model1.setItem(fila, columna, item1) self.tableView.setModel(model1) #****************************************************************************************************** random.seed() #inicia generador de números aleatorios for i in range(n): matPuntajes.append( [0] * n ) #n filas if rta2=='s': objArchivo=Archivo("puntajes.txt") sw=objArchivo.abirArchivo() for i in range(n): if sw == 'ok': lineaTexto=objArchivo.leerUnaLinea() if lineaTexto[-1]==',': lineaTexto=lineaTexto[:-1] lista=[int(numero) for numero in lineaTexto.split(",")] #convertir la lista a enteros # del(lista[-1]) #borra el último de la lista print lista matPuntajes[i]=lista objArchivo.cerrarArchivo() #****************************************************************************************************** #muestra La Matriz de puntajes en el segundo TableView model2 = QtGui.QStandardItemModel (n, n) #se define el modelo n filas y n columnas for fila in range(n): for columna in range(n): item2 = QtGui.QStandardItem(str(matPuntajes[fila][columna])) model2.setItem(fila, columna, item2) self.tableView_2.setModel(model2) #****************************************************************************************************** else: for j in range(n): i=0 while i < n: #matPuntajes[i][j] = int(raw_input('Dame el componente (%i,%i): ' % (i, j))) if i>j: #por debajo de la diagonal principal
![Page 45: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/45.jpg)
#matPuntajes[i][j] = int(input(" Puntaje del equipo " + vecNombres[j] + " al enfrentarse con el equipo " + vecNombres[i] + " :")) matPuntajes[i][j]= random.randint(1,3) #aleatorio entre 1 y 3 if matPuntajes[i][j]==3: matPuntajes[j][i]=0; else: if matPuntajes[i][j]==0: matPuntajes[j][i]=3; else: if matPuntajes[i][j]==1: matPuntajes[j][i]=1; else: print("Debe ingresar 1, 3 o 0") i=i-1 i=i+1 #contador para el mientras #Guarda los puntajes en un archivo open('puntajes.txt', 'w').close() #borra el contenido del archivo y lo cierra objArchivo=Archivo("puntajes.txt") sw=objArchivo.abirArchivo() for j in range(n): for i in range(n): if sw == 'ok': objArchivo.escribirUnaLineaAlFrente(str(matPuntajes[i][j])+",") objArchivo.escribirUnaLineaDebajo("") objArchivo.cerrarArchivo() #Muest for i in range(n): print matPuntajes[i] #crear un objeto de la clase Matriz objMatriz = Matriz() objMatriz.llenarMatriz(matPuntajes) #obtner el Vector de puntajes totales vectPunajesTolates=[] vectPunajesTolates = objMatriz.obtenerSumaColumnas() vectPunajesTolates1 = objMatriz.obtenerSumaColumnas() print '____________' print vectPunajesTolates #****************************************************************************************************** #muestra el Vector de puntajes totales en el tercer TableView model3 = QtGui.QStandardItemModel (1, n) #se define el modelo 1 filas y n columnas for fila in range(1): for columna in range(n): item3 = QtGui.QStandardItem(str(vectPunajesTolates1[columna])) model3.setItem(fila, columna, item3)
![Page 46: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/46.jpg)
self.tableView_3.setModel(model3) #****************************************************************************************************** #Crear un objeto de la clase Vector objVector = Vector(vectPunajesTolates) #Obtener Medidas estadísticas media = objVector.obtenerMedia() mediana = objVector.obtenerMediana() moda = objVector.obtenerModa1() desviacionEstandar = objVector.obtenerDesviacionEstandarMuestral() print 'Media =' + str(media) print 'mediana =' + str(mediana) print 'moda =' + str(moda) print 'desviación Estándar =' + str(desviacionEstandar) print '____________' print vectPunajesTolates print vectPunajesTolates1 print '____________' #Ordenar el vector de Puntajes totales vectoresParalelos= objVector.ordenarVectoresParalelos(0,vectPunajesTolates1,vecNombres) print '____________' print vectoresParalelos print '____________' print vectoresParalelos[1] #nombres de los equipos print vectoresParalelos[0] #puntajes totales de los equipos #****************************************************************************************************** #muestra Los Vectores de nombres y de Puntajes Ordenados (Vectores paralelos) en el listView. al igual que las estadísticas model4 = QtGui.QStandardItemModel(self.listView) for i in range(n): # create an item with a caption item4 = QtGui.QStandardItem(str(vecNombres[i])+"\t"+str(vectPunajesTolates1[i])) model4.appendRow(item4) item4 = QtGui.QStandardItem("") model4.appendRow(item4) item4 = QtGui.QStandardItem("") model4.appendRow(item4)
![Page 47: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/47.jpg)
item4 = QtGui.QStandardItem("") model4.appendRow(item4) item4 = QtGui.QStandardItem("La Media es:\t"+str(media)) model4.appendRow(item4) item4 = QtGui.QStandardItem("La Mediana es:\t"+str(mediana)) model4.appendRow(item4) item4 = QtGui.QStandardItem("La Moda es:\t"+str(moda)) model4.appendRow(item4) item4 = QtGui.QStandardItem("La Desviación estándar es:\t"+str(desviacionEstandar)) model4.appendRow(item4) self.listView.setModel(model4) #****************************************************************************************************** if __name__ == "__main__": import sys app = QtGui.QApplication(sys.argv) MainWindow = QtGui.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())
![Page 48: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/48.jpg)
El resultado final se muestra a continuación
![Page 49: Fundamentos de Python con Orientación a Objetos y Basado en Problemas](https://reader030.fdocuments.net/reader030/viewer/2022020116/55ab0a1a1a28abbe718b45d3/html5/thumbnails/49.jpg)