Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1. El Problema
PROBLEMA EQUIPOS DE FUTBOL
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 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.
BETIS
10
Media
DesvEst.
Mediana
Moda
NEC
9
REAL COLONIA
6
4
7,00
3,09838668
7,50
10
LANS
3
2. La Herramientas
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
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
# -*- 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
# 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
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
#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()
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]
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:
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
Dibujar: dos Label, un Text Edit , tres TableView, un ListView , un Push Button:
Cerrar el Qt Designer
Se ejecuta:
> pyuic4 -x pryEquiposConsolaRandomGUIPYQT4.ui -o pryEquiposConsolaRandomGUIPYQT4.py
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))
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
#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 '____________'
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_())