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 REAL LANÚS COLONIA LITEX BETIS
#6 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 REAL LANÚS COLONIA LITEX BETIS REAL LANÚS COLONIA LITEX BETIS NEC
0 3 1 1 1 0
0 0 0 3 0 0
1 3 0 0 0 0
1 0 3 0 3 3
1 3 3 0 0 3
#6 NEC 3 3 3 0 0 0
Se requiere un vector con los puntajes totales. Es decir un vector en el cual la primera posición
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):
#1 #2 REAL LANÚS REAL LANÚS COLONIA LITEX BETIS NEC
Requerimientos:
#3 COLONIA
#4 LITEX
#5 BETIS
0 3 1 1 1 0
0 0 0 3 0 0
1 3 0 0 0 0
1 0 3 0 3 3
1 3 3 0 0 3
6
3
4
10
10
#6 NEC 3 3 3 0 0 0 9
Vector de nombres
Matriz de puntajes
Vector de puntajes totales
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 10
BETIS 10
Media DesvEst. Mediana Moda
NEC 9
REAL COLONIA 6 4
7,00 3,09838668 7,50 10
LANÚS 3
2. La Herramientas
Int茅rprete de Python: Versi贸n 2.7.8 https://www.python.org/downloads/
DiseĂąador de Ambiente grĂĄfico para python 2.7 PYQT (Windows 32 bit installer) http://www.riverbankcomputing.co.uk/software/pyqt/download
IDE para python 2.7 PyScripter-v2.5.3 (32 bit) https://code.google.com/p/pyscripter/downloads/list
3. Instalar Herramientas Instalar Python 2.7
Finalizar Instalar PyQt4-4.11.3-gpl-Py2.7-Qt4.8.6-x32
Finalizar Instalar PyScripter-v2.5.3-Setup
Finalizar
4. Definir la arquitectura del software
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
Se crea un m贸dulo con la clase Matriz y m茅todos reutilizables
# -*- 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):
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 -*#-------------------------------------------------------------------------------
# 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
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
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
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
# -*- 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:
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 '____________'
#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__':
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]
#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
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:
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
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
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
Cerrar el Qt Designer
Crear el archivo pryEquiposConsolaRandomGUIPYQT4.py a partir del archivo pryEquiposConsolaRandomGUIPYQT4.ui En el PyScripter: Herramientas->Herramientas->Command Prompt
Se cambia a la carpeta donde estรก el conversor: >cd C:\Python27\Lib\site-packages\PyQt4
Se ejecuta: > pyuic4 -x pryEquiposConsolaRandomGUIPYQT4.ui -o pryEquiposConsolaRandomGUIPYQT4.py
Se copia el archivo pryEquiposConsolaRandomGUIPYQT4.py en la carpeta vista del proyecto
Se abre el archivo pryEquiposConsolaRandomGUIPYQT4.py con PYSCRIPTER
Al ejecutarlo queda asĂ:
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"))
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))
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)) #************************************************************************** ****************************
#************************************************************************** **************************** #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
#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)
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)
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_())
El resultado final se muestra a continuaci贸n