ayuda con un problema de python

Chema Cortés ch3m4 en ch3m4.org
Mar Ago 12 14:04:37 CEST 2003


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




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