学python一星期了,练习写了个处理学生成绩的小程序.由于刚刚
起步,还没有学到OOP的部分,所以程序主题还是用函数实现的,
知识点主要涉及到对列表(二维)和哨兵值,以及起泡法对二维列
表进行排序的知识.之所以贴出来,是想与和我一样刚刚起步的兄
弟们分享,同时也希望老鸟们批评指正.
代码如下:
#一个期末学生成绩统计程序
#打印帮助信息
from __future__ import division
print '==================================
'
print ' 姓名输入inputOff表示结束数据录入
'
print '==================================
'
#输入学生成绩信息
listStu = [] #初始化学生列表
inpStu = [] #初始化学生信息列表
stuName = "" #初始化学生姓名
while True:
stuName = raw_input('请输入学生姓名:')
if stuName == "inputOff":
break
stuEng = float(raw_input('请输入英语成绩:'))
stuMath = float(raw_input('请输入数学成绩:'))
stuCum = float(raw_input('请输入计算机成绩:'))
stuBio = float(raw_input('请输入生物成绩:'))
inpStu.append(stuName)
inpStu.append(stuEng)
inpStu.append(stuMath)
inpStu.append(stuCum)
inpStu.append(stuBio)
print
listStu.append(inpStu)
inpStu = [] #复位学生信息列表以存储下一名学生的信息
#定义学生个人最好学科与最差学科
def bestObj(inputer):
i = 0 #用于存取最好成绩的科目序列号
obj = 0 #用于存取最好科目成绩
iBad = 0 #用于存取最差学科科目序列号
objBad = 150 #用于存取最差科目成绩
for stu in range(len(inputer)):
for eachStu in range(1,len(inputer[stu])):
if inputer[stu][eachStu] > obj:
obj = inputer[stu][eachStu]
i = eachStu
if inputer[stu][eachStu] < objBad:
objBad = inputer[stu][eachStu]
iBad = eachStu
print
print '姓名:',inputer[stu][0]
if i == 1:
print "最好成绩为英语:%d分" % obj
elif i == 2:
print "最好成绩为数学:%d分" % obj
elif i == 3:
print "最好成绩为计算机:%d分" % obj
elif i == 4:
print "最好成绩为生物:%d分" % obj
else:
print "无录入信息!"
if iBad == 1:
print "最差成绩为英语:%d分" % objBad
elif iBad == 2:
print "最差成绩为数学:%d分" % objBad
elif iBad == 3:
print "最差成绩为计算机:%d分" % objBad
elif iBad == 4:
print "最差成绩为生物:%d分" % objBad
else:
print "无录入信息!"
i = 0 #复位变量以存储下一名学生的信息
obj = 0
iBad = 0
objBad = 150
#显示单科成绩最优及平均成绩
def singleBest(studentList):
studentName = ''#用于存取最好成绩的学生姓名
obj = 0 #用于存取科目最好成绩
totle = 0 #用于存取总成绩
average = 0.00 #平均成绩
for kemu in range(1,len(studentList[0])):
for stu in range(len(studentList)):
if studentList[stu][kemu] > obj:
obj = studentList[stu][kemu]
studentName = studentList[stu][0]
totle += studentList[stu][kemu]
average = (totle*1.00)/len(studentList)
print
if kemu == 1:
print '英语最高分:%s %.1f分'%(studentName,obj)
print '平均分:%.2f分'% average
elif kemu == 2:
print '数学最高分:%s %.1f分'%(studentName,obj)
print '平均分:%.2f分'% average
elif kemu == 3:
print '计算机最高分:%s %.1f分'%(studentName,obj)
print '平均分:%.2f分'% average
elif kemu == 4:
print '生物最高分:%s %.1f分'%(studentName,obj)
print '平均分:%.2f分'% average
else:
print '无录入信息'
studentName = ''#变量复初值
obj = 0
totle = 0
average = 0.00
#定义总成绩排队
#定义统计学生总成绩的函数
def totlelist(newList):
subTotle = 0.0
for h in range(1,5):
subTotle += newList[h] #求每个学生的总成绩
return subTotle
#创建新列表,包含姓名和成绩
def creatlist(creat):
creatL = [] #定义存储学生姓名和总成绩的列表
createdL = []#定义存储creatL的二维列表
for i in range(len(creat)):
creatL += [creat[i][0]]
creatL += [totlelist(creat[i])]#调用totlelist()函数把总成绩压入新列表
createdL += [creatL]
creatL = [] #恢复creatL初始值
return createdL
#对新列表createdL进行排队
def taxis(tax): #利用起泡法对新创建的学生
#姓名和总成绩二维列表进行
#降序排序;接收的参数为creatlist()函数
for u in range(len(tax)-1):
for i in range(len(tax)-1,u,-1):
if tax[i][1] > tax [i-1][1]:
tax[i-1],tax[i] = tax[i],tax[i-1]
print '名次: 姓名: 分数:'
for l in range(len(tax)):
print '%5d %-6s %8d' % (l+1,tax[l][0],tax[l][1])
print
print '*****************************'
print ' 学生擅长及较弱科目'
print '*****************************'
bestObj(listStu)
print
print '*****************************'
print ' 单科最高分及各科平均成绩'
print '*****************************'
singleBest(listStu)
print '*****************************'
print ' 学 生 成 绩 榜'
print '*****************************'
taxis(creatlist(listStu))
raw_input()