Sei sulla pagina 1di 49

Fundamentos de Python con Orientacin a Objetos y Basado en Problemas

Por Carlos Arturo Castro Castro

1. El Problema
PROBLEMA EQUIPOS DE FUTBOL

Problema diseado 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
podra ser (ejemplo 6 equipos-> N=6):
#1
#2
#3
#4
#5
REAL LANS COLONIA LITEX BETIS

#6
NEC

Se tiene una tabla (matriz) con los puntajes resultado del enfrentamiento entre N equipos de
futbol. Cada celda (posicin 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
dems equipos. La segunda columna tiene los puntajes resultado del enfrentamiento entre el
equipo #2 con los dems equipos y as para las dems columnas. Los datos que estn 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 posicin (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 posicin (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 posicin (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 continuacin (N=6 equipos):
#1
#2
#3
#4
#5
REAL LANS COLONIA LITEX BETIS
REAL
LANS
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 posicin

corresponde al puntaje total del equipo #1. Se obtiene sumando los puntajes de la columna #1
de la matriz. En la segunda posicin se encuentra el puntaje total del equipo #2. En la posicin
j, se encuentra el puntaje total del equipo #j (Se obtiene sumando los puntajes de la columna #j
de la matriz):

#1
#2
REAL LANS
REAL
LANS
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

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 nmero N de equipos. N


tambin 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 estn por encima de la diagonal principal se
generen automticamente. Es decir si el puntaje del equipo #j es 3, en la posicin i,j de
la matriz se guarda 3 y la en posicin j,i de la matriz se guarda 0 (cero). si el puntaje del
equipo #j es 0, en la posicin i,j de la matriz se guarda 0 y la en posicin j,i de la matriz
se guarda 3. si el puntaje del equipo #j es 1, en la posicin i,j de la matriz se guarda 1 y
la en posicin 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), desviacin estndar, 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

LANS
3

2. La Herramientas

Intrprete de Python: Versin 2.7.8


https://www.python.org/downloads/

Diseador de Ambiente grfico 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 mtodos que
implementan la interaccin del programa con el usuario. Y el paquete Control, con los
mtodos que poseen clculos 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 mdulo con la clase Matriz y mtodos reutilizables

# -*- coding: utf-8 -*#La anterior Lnea permite usar caracteres utf8 (tildes, ees 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
#Mtodos
#Mtodo para llenar matriz (Es decir asignar los datos en la matriz que se pasa
como parmetro)
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
#mtodo 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 mdulo con la clase Vector y mtodos 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): #mtodo 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 nmero 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 mdulo 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 estadsticas invocando a los mtodos 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 estadsticas
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 'desviacin Estndar =' + 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 funcin 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 mdulo 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 estadsticas
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 'desviacin Estndar =' + 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 cdigo para una clase con mtodos que permitan manejar las operaciones bsicas
con archivos planos: Abrir, Cerrar, Escribir una lnea de texto en el archivo, leer una lnea 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. Diseo de la Interfaz grfica


Para la interfaz grfica se seleccion PYQY
6.1 ejecutar el diseador 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 mtodo que se identificar como btnCalcularClick en el que se programan los


llamados a los mtodos que realizan los clculos y se muestran los resultados en los objetos
grficos:
# -*- 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", "Nmero de equipos de ftbol", None))


self.pushButton.setText(_translate("MainWindow", "PushButton", None))
#**************************************************************************
****************************
#Se agrega la siguiente lnea para programar el evento click sobre el botn e invoque
qoe mtodo 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 nmeros 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 estadsticas
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 'desviacin Estndar =' + 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 estadsticas
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 Desviacin estndar 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 continuacin

Potrebbero piacerti anche