Problema. Escribir un programa que produzca la planilla final de
las notas de la prueba 2.
Datos.
Notas1.txt: archivo con las notas de la pregunta 1. Cada línea con
nombre (20 caracteres) y nota (2 dígitos).
Notas2.txt: archivo con las notas de la pregunta 2. Cada línea con
nombre (20 caracteres) y nota (2 dígitos).
Resultado.
Planilla.txt: archivo que en cada línea contendrá nombre y notas
de pregunta 1, 2 y promedio.
Solución 1. Con 3 listas
nombres: lista para mantener los nombres de los alumnos
Ej: nombres=[“gabriela”,”jose”,”rosa”,”matias”]
notas1: lista para mantener las notas de la pregunta1
Ej: notas1=[62,48,56,49]
notas2: lista para mantener las notas de la pregunta2
Ej: notas2=[45,52,35,48]
¿Estructura del programa?
1. leer primer archivo y guardar en listas nombres y notas1
2. leer segundo archivo y guardar en lista notas2
3. calcular y grabar planilla final
#leer primer archivo y guardar
#en listas nombres y notas1
#inicializar listas vacias
nombres=[]
notas1=[]
#leer todas las lineas del archivo
for linea in open("notas1.txt"):
#agregar nombre a la lista de nombres
nombres.append(linea[0:20])
#agregar nota a la lista de notas1
notas1.append(int(linea[20:22]))
#leer segundo archivo y guardar en lista notas2
#inicializar lista con “n” ceros
notas2=[0]*len(nombres)
#leer todas las líneas del archivo
for linea in open("notas2.txt"):
#buscar nombre en lista de nombres
i=nombres.index(linea[0:20])
#guardar nota correspondiente al nombre
notas2[i]=int(linea[20:22])
#calcular y grabar planilla final
archivo=open("planilla.txt","w")
#recorrer las 3 listas paralelamente
for i in range(len(nombres)):
#calcular promedio redondeado
promedio=int((notas1[i]+notas2[i])/2.0+0.5)
#grabar línea con nombre y 3 notas
archivo.write(nombres[i]+
\
str(notas1[i])+
\
str(notas2[i])+
\
str(promedio)+"\n")
archivo.close()
Solución 2. Con una tabla de 3 filas y n columnas (n: n° alumnos)
¿tabla? lista de listas (“lista de 2 dimensiones”)
[ [“gabriela”,”jose”,”rosa”,”matias”], \ #fila 0: lista de nombres
[62,48,56,49], \ #fila 1: lista de notas pregunta 1
[45,52,35,48] #fila 2: lista de notas pregunta 2
]
Estructura del programa
1. Leer primer achivo y guardar nombres y notas en primeras 2 filas
2. Leer 2° archivo y guardar notas de pregunta2 en 3ª fila
3. Calcular y grabar planilla final
#lista de 3 listas (inicialmente vacías)
L=[[],[],[]]
#guardar nombre y notas en primeras 2 filas
#leer líneas del primer archivo
for linea in open("notas1.txt"):
#agregar nombre a primera fila
L[0].append(linea[0:20])
#agregar nota a segunda fila
L[1].append(int(linea[20:22]))
#guardar notas de pregunta2 en 3ª fila
L[2]=[0]*len(L[0]) #lista con “n” ceros
#leer líneas del sgdo archivo
for linea in open("notas2.txt"):
#buscar nombre en lista de nombres
i=L[0].index(linea[0:20])
#guardar nota correspondiente al nombre
L[2][i]=int(linea[20:22])#en fila 2 col i
#calcular y grabar planilla final
archivo=open("planilla.txt","w")
#recorrer 3 filas en paralelo
for i in range(len(L[0])):
promedio=int((L[1][i]+L[2][i])/2.0+0.5)
archivo.write(L[0][i]
+ \ #nombre
str(L[1][i]) + \ #nota1
str(L[2][i]) + \ #nota2
str(promedio)+"\n")
archivo.close()
Solución 3. Con una tabla de n filas y 3 columnas
[ [“gabriela”,62,45], \ #fila 0: lista de datos de primer alumno
[“jose”,48,52],
\ #fila 1: lista de datos de segundo alumno
[“rosa”,56,35],
\
[“matias”,49,48] \#fila n-1: lista de datos de último alumno
]
Estructura del programa
1. leer primer archivo y guardar nombre y nota de los alumnos en primeras
dos columnas de las filas
2. leer segundo archivo y guardar notas de pregunta2 en tercera columna de
las filas
3. calcular y grabar planilla final
#Lista para n listas con 3 valores
L=[]
#leer todas las líneas del primer achivo
for linea in open("notas1.txt"):
#agregar lista con nombre y nota de pregunta1
L.append( [linea[0:20],int(linea[20:22])] )
#leer todas las líneas del 2° archivo
for linea in open("notas2.txt"):
#buscar nombre en lista alumnos
for alumno in L:
if alumno[0]==linea[0:20]: break
#agregar nota a la lista del alumno
alumno.append(int(linea[20:22]))
#calcular y grabar planilla final
archivo=open("notas.txt","w")
#recorrer alumnos de lista de alumnos
for alumno in L:
#calcular promedio redondeado
promedio=int((alumno[1]+alumno[2])/2.0+0.5)
#grabar línea en planilla
archivo.write(alumno[0]+
\
str(alumno[1])+ \
str(alumno[2])+ \
str(promedio)+"\n")
archivo.close()
¿Cómo grabar la lista ordenada por nombre?
archivo=open("planilla.txt","w")
L.sort() #ordena la lista
#recorrer las “filas”
for alumno in L:
…
L.sort() ordena de acuerdo a los valores del primer elemento de cada lista
Propuesto. Grabar la planilla ordenada por nombre en las soluciones 1 y 2
Hint. Crear inicialmente una lista de nombres y ordenarla
Ejercicio. Escribir un programa que produzca la planilla final de
las notas de la prueba 2.
Datos.
Notas1.txt: archivo con las notas de la pregunta 1. Cada línea con
sección(un dígito),nombre (20 caracteres) y nota (2 dígitos).
Notas2.txt: archivo con las notas de la pregunta 2. Cada línea con
sección,nombre (20 caracteres) y nota (2 dígitos).
Resultado.
Planilla.txt: archivo que en cada línea contendrá sección, nombre
y notas de pregunta 1, 2 y promedio.
Ordenada por sección y nombre (dentro de cada sección por
nombre)
#definir lista de n "filas" y 4 "columnas"
L=[]
#leer lineas de primer archivo
for linea in open("notas1.txt"):
#agregar lista con sección, nombre y nota
L.append( [linea[0],
\
linea[1:21], \
int(linea[21:23])] )
#leer lineas de segundo archivo
for linea in open("notas2.txt"):
#buscar nombre en lista alumnos de seccion
for alumno in L:
if alumno[1]==linea[1:21]: break
#agregar nota a lista de alumno
alumno.append(int(linea[21:23]))
#ordenar lista por sección y nombre
L.sort()
#calcular y guardar planilla final ordenada
archivo=open(“planilla.txt","w")
for alumno in L:
promedio=int((alumno[2]+alumno[3])/2.0+0.5)
archivo.write(alumno[0]+
\
alumno[1]+
\
str(alumno[2])+ \
str(alumno[3])+ \
str(promedio)+"\n")
archivo.close()
Solución 2: Con lista de 8 listas (una por sección)
#definir lista de 8 listas (inicialmente vacías)
L=[]
for i in range(8):
L.append([])
#leer lineas primer archivo
for linea in open("notas1.txt"):
#obtener indice de lista de secciones
i=int(linea[0])-1
#agregar [nombre,nota] a lista de seccion
L[i].append([linea[1:21],int(linea[21:23])])
#leer lineas segundo archivo
for linea in open("notas2.txt"):
#obtener indice de lista secciones
isec=int(linea[0])-1
#buscar nombre en lista de la sección
for alumno in L[isec]:
if alumno[0]==linea[1:21]: break
#agregar nota a lista de alumno de seccion
alumno.append(int(linea[21:23]))
#grabar planilla
archivo=open("planilla.txt","w")
#recorrer indices de secciones
for i in range(len(L)):
#obtener lista de la seccion
seccion=L[i]
#ordenar lista de la seccion
seccion.sort()
#recorrer alumnos de la seccion
for alumno in seccion:
#grabar datos del alumno en planilla
promedio=int((alumno[1]+alumno[2])/2.0+0.5)
archivo.write(str(i+1)+alumno[0]+ \
str(alumno[1])+str(alumno[2])+ \
str(promedio)+"\n")
archivo.close()
Descargar

clase15(Listas_de_Li..