ayuda con un problema de python

Sonia siosss en ono.com
Mie Ago 13 00:14:01 CEST 2003


a ver ahora q tal

me sale el error de
'no module named matrices'
y si kito esto: from matrices import matriz
me pide ya el numero (aleluya!!!!)
pero despues me dice q:   la matriz no esta definida (in english)
en esta linea:  notas=matriz(n,n)

bueno te dejo mi nuevo (y ultimo?¿?¿?¿) codigo!!!


#procedimiento q reciba como parametros la matriz,
#los 2 vectores nif y codigos, y el codigo de la
#asignatura, y muestre por pantalla el NIF de aquellos
#estudiantes q hayan obtenido en dicha asignatura una
#nota superior a la media de la asignatura. Para
#calcular la media unicamentese deben considerar las
#notas de los presentados al examen
from matrices import matriz

def p1(nif, codigos,notas,codigo_asig):
  #mira la posicion del codigo_asig en el vector codigos
  #para saber la columna a recorrer en la matriz
  cont=0
  for j in codigos:
    if codigos[j]==codigo_asig:
      posic=j #columna a recorrer

  media=0
  sum=0
  cont=0
  for i in range (0,len(nif)):
    # ahora  j es posic:
      if notas[i][posic]>0: #no presentado y no presentado
        cont=cont+1 #num de notas
        sum=sum+notas[i][posic] #suma todas las notas
  media=sum/cont

#como se inicializaba el vector q creo?¿?¿?¿

  for i in range(0,len(nif)) and j==posic:
    #for j==posic:
      if notas[i][j]>media:
        print nif[i]  #lo de [j] spongo q sera error




#escribir un procedimiento q reciba como parametros
#la matriz de notas y el vector codigos, y muestre por
#pantalla el codigo de la asignatura q tiene mayor
#porcentaje de presentados respecto al total de los
#matriculados

def p2(notas,codigos):

#recorro la matriz y hago un vector q pondre el
#contador de cada columna cuando sean <> -1

  vcont=[0]*len(codigos)
  vmatriculas=[0]*len(codigos)


  for i in range(0,len(nif)):
    for j in range(0,len(codigos)):
      if notas[i][j]<>-2: # matriculados
        vmatriculas=vmatriculas+1
        if notas[i][j]<> -1: # presentados
          vcont[j]=vcont[j]+1


  #ver la posicion q tiene el maximo contador
  max=0
  pos=0
  for i in range(0,len(vcont)):
    if vcont[i] / vmatriculas[i] >max:
      max=vcont[i]
      pos=i
  print codigo[pos]


#PROGRAMA PRINCIPAL


nif=["07525818J","18234590V","10437112X","21334801A"]
codigos=["IG20","IG02","IG03","IG04","J11"]
codigo_asig='IG02'

n=float(raw_input('dime un numero: '))
notas=matriz(n,n)
for i in range(0,n):
    for j in range(0,n):
        mat[i,j]=int(raw_input('valor de la matriz: '))

rdo1=p1(nif, codigos,notas,codigo_asig)
rdo2=p2(notas,codigos)

print notas
print 'Estudiantes con nota superior a la media', rdo1
print 'Asignatura con mayor porcentaje', rdo2



----- Original Message -----
From: Chema Cortés <ch3m4 en ch3m4.org>
To: <python-es en aditel.org>
Sent: Tuesday, August 12, 2003 7:04 AM
Subject: [Python-es] Re: ayuda con un problema de python


> Sonia escribió:
>
> > hola!!
> > creo q he mejorado el programa, intentado hacer el principal y todo,
uanq la
> > matriz la pido y en verdad kiero poner un ejemplo, al igual q hago en
las
> > listas
> > os agrego el programa 'completo'
> > lo he compilado (gasto el pythong) pero me da errores de identacion en
los
> > fors y eso, y no se q pasa. yo creo q son asi
> > bueno si podeis me lo mirais y me corregiis lo q veais!!
>
> Bueno, vayamos por tramos,
>
> > #procedimiento q reciba como parametros la matriz,
> > #los 2 vectores nif y codigos, y el codigo de la
> > #asignatura, y muestre por pantalla el NIF de aquellos
> > #estudiantes q hayan obtenido en dicha asignatura una
> > #nota superior a la media de la asignatura. Para
> > #calcular la media unicamentese deben considerar las
> > #notas de los presentados al examen
> > from matrices import matriz
> >
> > def p1(nif, codigos,notas,codigo_asig):
> >   #mira la posicion del codigo_asig en el vector codigos
> >   #para saber la columna a recorrer en la matriz
> >   cont=0
> >   for j in codigos:
> >     if codigos[j]==codigo_asig:
> >       posic=j #columna a recorrer
>
> Por ahora bien, aunque no estaría mal que cortaras el bucle cuando has
> encontrado el código (utiliza 'break')
>
> >   media=0
> >   sum=0
> >   cont=0
> >   for i in range (0,len(nif)) and j==posic:
>                                  ^^^
> Esta construcción está mal.
>
> >     #for j==posic:
> >       if notas[i][j]>0: #no presentado y no presentado
> >         cont=cont+1 #num de notas
> >         sum=sum+notas[i][j] #suma todas las notas
> >   media=sum/cont
>
> El bucle debería ser:
>
> for i in range(0,len(nif)):
>      if notas[i][posic]>0:
>          cont=cont+1
>          sum=sum+notas[i][posic]
>
> > #como se inicializaba el vector q creo?¿?¿?¿
> >
> >   for i in range(0,len(nif)) and j==posic:
> >     #for j==posic:
> >       if notas[i][j]>media[j]:
> > return nif[j]
>
> Aquí te pasa lo mismo con el bucle. Hay algunos fallos gordos: 'media'
> no es una matriz, el 'if' no contiene ninguna instrucción, el 'return'
> está mal identado y con errores,...
>
> Piensa un poco sobre lo que debería devolver esta función (un elemento,
> una lista, nada de nada,...). Si lees el enunciado, el procedimiento
> imprime la lista, y no tiene que devolver nada:
>
> for i in range(0,len(nif)):
>      if notas[i][posic]>media:
>          print nif[i]
>
> > #escribir un procedimiento q reciba como parametros
> > #la matriz de notas y el vector codigos, y muestre por
> > #pantalla el codigo de la asignatura q tiene mayor
> > #porcentaje de presentados respecto al total de los
> > #matriculados
> >
> > def p2(notas,codigos):
> >
> > #recorro la matriz y hago un vector q pondre el
> > #contador de cada columna cuando sean <> -1
> >
> >   for i in range(0,len(nif)):
> >     for j in range(0,len(codigos)):
> >       if notas[i][j]<> -1:
> >         vcont[j]=vcont[j]+1
>
> No has inicializado 'vcont'. La forma más fácil:
>
> vcont=[0]*len(codigos)
>
> El algoritmo lo tendrás que revisar, ya que así sólo obtienes el número
> de presentados en la asignatura. Necesitarás calcular el cociente entre
> presentados y matriculados.
>
> >   #ver la posicion q tiene el maximo contador
> >   max=0
> >   pos=0
> >   for i in range(0,len(vcont)):
> >     if vcont[i]>max:
> >       max=vcont[i]
> >       pos=i
> > return codigo[pos]
>
> Cuida con las identaciones de los 'return'. Deben estar a la derecha del
> 'def' de la función que estás definiendo.
>
> > #supongo q ahora el programa principal solo sera
> > #inicializar todas las listas y matrices, no se si me
> > #faltara algo mas
> >
> >
> > #PROGRAMA PRINCIPAL
> >
> >
> > nif=["07525818J","18234590V","10437112X","21334801A"]
> > codigos=["IG20","IG02","IG03","IG04","J11"]
> > codigo_asig='IG02'
> >
> > n=int(raw_input('dime un numero: '))
> > notas=matriz(n,n)
> > for i in range(0,n):
> >     for j in range(0,n):
> >         mat[i,j]=int(raw_input('valor de la matriz: '))
>
> Ojo!, que las notas son números reales (float) y no enteros.
>
> > rdo1=p1(nif, codigos,notas,codigo_asig):
> > rdo2=p2(notas,codigos):
> >
> > print notas
> > print 'Estudiantes con nota superior a la media', rdo1
> > print 'Asignatura con mayor porcentaje', rdo2
>
> No te compliques, y mete estos print's dentro de las funciones. Se
> podría hacer que las funciones devolvieran listas, pero es algo que no
> te pide el problema.
>
> Cuando arregles tu código, te pondré mi solución ;-)
>
>
> Saludos,
> Chema
>
>
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es




Más información sobre la lista de distribución Python-es