一、问题导向
处理n位学生m门课程的成绩,学生的姓名、学号、课程名称、课程成绩都由键盘输入。对学生的课程成绩进行求平均分,并按平均分进行降序排序。
二、问题分析
学生信息和课程成绩信息可以由一个二维列表进行表示,其中课程信息以字典形式作为列表的数据项;对每个学生的课程成绩求平均值;按平均值采用冒泡排序进行降序排序。
1、原始数据的输入
原始数据的输入即二维列表的创建,采用for循环的形式进行创建,用以下函数实现。需要注意的是每记录一个学生信息的同时在第一层循环内加上一个空列表;在记录每一门课程信息时在第二层循环加入一个空字典。
def datainput(n,m):
data=[]
for i in range(n):
data.append([])
stu_name=input("请输入第"+str(i+1)+"学生姓名:\n")
data[i].append(stu_name)
stu_num=input("请输入第"+str(i+1)+"学生学号:\n")
data[i].append(stu_num)
for j in range(m):
course={}
c_name=input("请输入第"+str(j+1)+"课程名称:\n")
course[str(c_name)]=input("请输入第"+str(j+1)+"课程成绩:\n")
data[i].append(course)
return data
2、求平均值
用以下函数实现,第一层循环对二维列表里的每一个列表进行遍历,即每位学生,第二层循环找到其中字典型数据项,即课程信息,取出其各个键所对应的值,将其变成列表参与求和运算(这里可能复杂了)。
def solve_mean(data):
mean=[]
for i in data:
sum1=0
n=0
for j in i:
if type(j)==dict:
l=list(j.values())
sum1=sum1+float(l[0])
n=n+1
mean.append(sum1/n)
return mean
3、冒泡排序
用以下函数实现,对均值进行降序排序的同时,对二维列表中的每一个列表进行排序。这里值的注意的是当函数输入参数为列表时,在函数外部也会对列表进行改变。
def dtat_sort(mean,data):
for i in range(len(mean)-1):
j=i
for j in range(len(mean)-1):
temp=[]
if mean[j]< mean[j+1]:
#是对均值进行排序,对原来数据进行对应的变动
temp1=mean[j+1]
mean[j+1]=mean[j]
mean[j]=temp1
temp=data[j+1]
data[j+1]=data[j]
data[j]=temp
data_out=data
return data_out
4、结果分析
将原始数据和排序后的数据各自保存为.txt文件,比较可发现基本解决了所提出的问题。
if __name__ == '__main__':
n=input("请输入学生数目\n")
m=input("请输入课程数目\n")
data=datainput(int(n),int(m))
#将原始数据进行保存,不能直接在函数里进行
f=open('原始数据.txt','w')
for i in data:
for j in i:
f.write(str(j))
f.write(' ')
f.write('\n')
f.close()
mean=solve_mean(data)
#函数参数为列表时,为可变参数类型,传进函数后外部也会变化
data_out=dtat_sort(mean,data)
f=open('输出结果.txt','w')
for i in data_out:
for j in i:
f.write(str(j))
f.write(' ')
f.write('\n')
f.close()
print(mean)
print(data)