4个小时我赚了600块
一、背景
在昨天(2020-12-30号)晚上,接了一个Python的课设,对方给的价钱是600块(因为第二天早上就要,所以我必须在当天晚上给写出来),这600块也算是包含了加急费吧(哈哈哈,我猜的)
不过这个课设600块确实感觉有点肥,因为内容我看了,不是很难,如果对python比较熟悉的话,能很快顺畅做出来。
之前也帮过同学在提交报告的前几个小时,从0到1完整的给出来一个报告(这个报告是一个学期的工作量,我几个小时写出来了,当时我自己的有点不敢相信)。所以对于这个单子,在这么短的时间做出来,我感觉可以挑战一下
二、介绍
先来看一下这个课设主要是做什么?
分析
这就是对方的课设要求,感觉不是很难,数据库采用mysql,并且里面也只有三个表。
这个课设只要是围绕前面的8小问去写程序,里面的数据库表是给出的样例,相关的逻辑也是按照流程图的逻辑去编程
最后我在当晚给对方完整的写出来,并且对方也感到非常满意。
这绝对是一个双赢的结果,对方完成了课设,我收获外块(哈哈哈)
三、解题(第一小问)
python+数据库实现一个课程信息的管理。课程信息包括:课程编号(唯一),课程 名称,学分。实现课程信息的增删改查。通过 prettytable 显示结果
分析
首先先建立要求中的三个表
代码
开始编程写代码
# 查询所有
def show():
cur.execute('select * from course')
results = cur.fetchall()
# 添加表头
pt.field_names = ('编号 名称 学分'.split())
for row in results:
pt.add_row([row[0], row[1], row[2]])
print(pt)
pt.clear()
# 查询单条数据
def find(no):
sql = "select * from course where no = {0}".format(no)
cur.execute(sql)
results = cur.fetchall()
# 添加表头
pt.field_names = ('编号 名称 学分'.split())
for row in results:
pt.add_row([row[0], row[1], row[2]])
print(pt)
pt.clear()
# 插入
def insert(name,score):
#插入数据一
cur.execute("INSERT INTO course(Name,Score) VALUES('"+str(name)+"',"+str(score)+")")
#提交到数据库 -------ps:不写这一行无法插入
con.commit()
#删除
def delete(no):
sql = "delete from course where no = {0}".format(no)
try:
cur.execute(sql)
con.commit()
except:
con.rollback()
# 更新
def update(no,socre):
sql = "update course set Score='"+str(socre)+"' where no = {0}".format(no)
try:
cur.execute(sql)
con.commit()
except:
con.rollback()
show()
#insert("网页设计",5)
#delete(7)
#update(9,3)
#delete(9)
#show()
#find(1)
#show()
运行结果
(1)查找全部
(2)查找一个
(3)插入一个
(4)更新操作
(5)删除操作
三、解题(第二问)
python+数据库实现一个学生信息管理功能。学生信息包括:学生编号(唯一),学 生姓名,专业。实现学生信息的增删改查。通过 prettytable 显示结果
上代码
# 查询所有
def show():
cur.execute('select * from student')
results = cur.fetchall()
# 添加表头
pt.field_names = ('学号 姓名 专业'.split())
for row in results:
pt.add_row([row[0], row[1], row[2]])
print(pt)
pt.clear()
# 查询单条数据
def find(no):
sql = "select * from student where no = {0}".format(no)
cur.execute(sql)
results = cur.fetchall()
# 添加表头
pt.field_names = ('学号 姓名 专业'.split())
for row in results:
pt.add_row([row[0], row[1], row[2]])
print(pt)
pt.clear()
# 插入
def insert(name,major):
#插入数据一
cur.execute("INSERT INTO student(Name,Major) VALUES('"+str(name)+"','"+str(major)+"')")
#提交到数据库 -------ps:不写这一行无法插入
con.commit()
#删除
def delete(no):
sql = "delete from student where no = {0}".format(no)
try:
cur.execute(sql)
con.commit()
except:
con.rollback()
# 更新
def update(no,major):
sql = "update student set major='"+str(major)+"' where no = {0}".format(no)
try:
cur.execute(sql)
con.commit()
except:
con.rollback()
show()
#find(1)
#insert("李叔","计算机科学与技术")
#update(10,"计算机科学与技术222")
#delete(10)
#
#show()
运行结果
(1)查找全部
(2)查找一个
(3)插入一个
(4)更新操作
(5)删除操作
三、解题(第三小问)
实现选课功能。能通过学生编号,为每个学生选择不同课程。并能显示相关信息。
选课流程图
上代码
# 根据学号查询未选课程
def find_nocourse_byno(no):
print("该学生未选课程")
sql="select * from course where no != (select course from grade where student = "+str(no)+")"
cur.execute(sql)
results = cur.fetchall()
# 添加表头
pt.field_names = ('编号 名称 学分'.split())
for row in results:
pt.add_row([row[0], row[1], row[2]])
print(pt)
pt.clear()
# 根据学号查询已选课程
def find_course_byno(no):
print("该学生已选课程")
sql="select * from course where no in (select course from grade where student = "+str(no)+")"
cur.execute(sql)
results = cur.fetchall()
# 添加表头
pt.field_names = ('编号 名称 学分'.split())
for row in results:
pt.add_row([row[0], row[1], row[2]])
print(pt)
pt.clear()
# 判断学号是否存在
def isfindstudent(no):
sql = "select * from student where no = {0}".format(no)
cur.execute(sql)
results = cur.fetchall()
if len(results)>0:
return True
else:
return False
# 查询课程是否存在
def isfindcourse(no):
sql = "select * from course where no = {0}".format(no)
cur.execute(sql)
results = cur.fetchall()
if(len(results)>0):
return True
else:
return False
# 查询该用户是否已选修课程
def isfindcourse_and_student(studentno,courseno):
sql ="select * from grade where student = {0} and course ={1}".format(studentno,courseno)
cur.execute(sql)
results = cur.fetchall()
if(len(results)>0):
return False
else:
return True
#给学号studentno添加选课
def addgrade(studentno,courseno):
# 插入数据一
cur.execute("INSERT INTO grade(student,course) VALUES(" + str(studentno) + "," + str(courseno) + ")")
# 提交到数据库 -------ps:不写这一行无法插入
con.commit()
def main():
print("---------当前是选课功能----------")
while(1):
studentno = int(input("请输入学号:"))
res = isfindstudent(studentno)
if res:
#学生存在
#根据学号查询已选课程
find_course_byno(studentno)
#根据学号查询未选课程
find_nocourse_byno(studentno)
courseno = int(input("请输入选课编号:"))
#判断课程是否存在
if courseno!=99:#没有退出选课
if isfindcourse(courseno):#课程存在
if isfindcourse_and_student(studentno,courseno):#该用户没有选修课程
addgrade(studentno,courseno)#给学号studentno添加选课
find_course_byno(studentno)#显示学生选课情况
else:
print("你已经选择了这门课程")
else:
print("该课程不存在")
else:
print("该学生不存在")
运行结果
三、解题(第四小问)
课程的成绩录入。通过课程编号能获得所有选修课程的学生,并为学生录入或修改 成绩。
分析:录入成绩流程图
代码
# 查询所有
def showgrade():
cur.execute('select * from course')
results = cur.fetchall()
# 添加表头
pt.field_names = ('编号 名称 学分'.split())
for row in results:
pt.add_row([row[0], row[1], row[2]])
print(pt)
pt.clear()
# 判断课程是否存在
def isfindcourse(no):
sql = "select * from course where no = {0}".format(no)
cur.execute(sql)
results = cur.fetchall()
if len(results)>0:
return True
else:
return False
# 根据课程编号获得该课程的所有学生选课记录及成绩
def find_grade_bycourseno(courseno):
print("该课程的所有学生选课记录及成绩")
sql="select grade.no,grade.course,student.no,student.Name,student.Major,grade.grade from grade join student on grade.student=student.no where grade.course ="+str(courseno)+""
cur.execute(sql)
results = cur.fetchall()
# 添加表头
pt.field_names = ('编号 课程编号 学生编号 学生名字 专业 分数'.split())
for row in results:
pt.add_row([row[0], row[1], row[2],row[3],row[4],row[5]])
print(pt)
pt.clear()
# 根据课程编号获得该课程的所有学生选课记录及成绩
def findGradeByCourseNoAndStuNo(studentno,courseno):
print("该课程的所有学生选课记录及成绩")
sql="select grade.no,grade.course,student.no,student.Name,student.Major,grade.grade from grade join student on grade.student=student.no where grade.course ="+str(courseno)+" and grade.student="+str(studentno)+""
cur.execute(sql)
results = cur.fetchall()
# 添加表头
pt.field_names = ('编号 课程编号 学生编号 学生名字 专业 分数'.split())
for row in results:
pt.add_row([row[0], row[1], row[2],row[3],row[4],row[5]])
print(pt)
pt.clear()
if len(results)>0:
return True
else:
return False
# 更新录入分数
def updatescore(studentno,courseno,grade):
sql = "update grade set grade="+str(grade)+" where student = {0} and course={1}".format(studentno,courseno)
try:
cur.execute(sql)
con.commit()
except:
con.rollback()
def main():
print("---------当前是成绩录入功能----------")
#显示所有课程信息
showgrade()
while(1):
courseno = int(input("请输入录入成绩课程编号:"))
res = isfindcourse(courseno)
if res:
#课程存在
#根据课程编号获得该课程的所有学生选课记录及成绩
find_grade_bycourseno(courseno)
#输入学生编号
studentno = int(input("请输入学生学号:"))
if findGradeByCourseNoAndStuNo(studentno,courseno):
score = int(input("请输入分数:"))
#更新录入分数
updatescore(studentno,courseno,score)
# 显示所有课程信息
find_grade_bycourseno(courseno)
else:#没有该学生编号
print('没有该学生编号')
else:
print("该课程不存在")
main()
运行结果
三、解题(第五小问)
能通过 excel 表,将课程的学生成绩导入数据库。并通过 prettyable 显示信息。
分析:excel的信息如下
导入excel前的数据库
代码
def insertgrade_byexcel(name,courseno):
# 打开文件
data = xlrd.open_workbook(str(name))
# 查看工作表
data.sheet_names()
# 通过文件名获得工作表,获取工作表1
table = data.sheet_by_name('Sheet1')
for i in range(1,table.nrows):
row = table.row_values(i)
#print(str(row))
#print(type(row))
# 插入数据一
cur.execute("INSERT INTO grade(student,course,grade) VALUES('" + str(row[0]) + "'," + str(courseno) + "," + str(row[2])+")")
# 提交到数据库 -------ps:不写这一行无法插入
con.commit()
print("导入成功")
insertgrade_byexcel('grade.xlsx',4)
运行结果
导入数据后的数据库结果
三、解题(第六小问)
能统计分析出每门课程的成绩分布,包括:最高分,最低分,及格率
代码
def tj():
cur.execute('select * from course')
results = cur.fetchall()
for row in results[2:5]:
#课程编号row[0]
cur.execute('select grade from grade where course ='+str(row[0])+'')
g_results = cur.fetchall()
max=0
min=101
count=0
for i in g_results:
i = i[0]
if i>max:
max=i
if i<min:
min=i
if i>60:
count =count+1
if len(g_results)==0:
count = 100
else:
count = (count/len(g_results))*100
if min>101:
min=0
# 添加表头
pt.field_names = ('课程编号 课程名称 最高分 最低分 及格率'.split())
pt.add_row([row[0], row[1], max,min,str(int(count))+"%"])
print(pt)
pt.clear()
print("------------------------------")
tj()
运行结果
三、解题(第七小问)
统计每门课每个成绩段的人数,不及格(<60), 及格(60~70);中( 70~80);良(80~90);优秀(90~100)。并通过图表显示。
代码
def tj():
cur.execute('select * from course')
results = cur.fetchall()
for row in results[2:5]:
#课程编号row[0]
cur.execute('select grade from grade where course ='+str(row[0])+'')
g_results = cur.fetchall()
s1 = 0
s2 = 0
s3 = 0
s4 = 0
s5 = 0
ss1 = 0
ss2 = 0
ss3 = 0
ss4 = 0
ss5 = 0
for i in g_results:
i = i[0]
if i<60:
s1 = s1+1
if i>60 and i<70:
s2 = s2+1
if i>70 and i<80:
s3 = s3+1
if i>80 and i<90:
s4 = s4+1
if i>90 and i<100:
s5 = s5+1
if len(g_results)>0:
ss1 = (s1/len(g_results))*100
ss2 = (s2 / len(g_results)) * 100
ss3 = (s3 / len(g_results)) * 100
ss4 = (s4 / len(g_results)) * 100
ss5 = (s5 / len(g_results)) * 100
salary = ['不及格(<60)', '及格(60~70)', '中(70~80)', '良(80~90)', '优秀(90~100)']
group = [int(s1),int(s2), int(s3), int(s4), int(s5)]
plt.bar(salary, group)
plt.legend()
plt.xlabel('分数段')
plt.ylabel('人数')
plt.title(u''+str(row[1]), FontProperties=font)
plt.show()
#添加表头
print("课程名称="+str(row[1]))
pt.field_names = ('成绩 人数 比例'.split())
pt.add_row(["不及格(<60)", s1,str(int(ss1))+"%"])
pt.add_row(["及格(60~70)", s2, str(int(ss2))+"%"])
pt.add_row(["中(70~80)", s3, str(int(ss3))+"%"])
pt.add_row(["良(80~90)", s4, str(int(ss4))+"%"])
pt.add_row(["优秀(90~100)", s5, str(int(ss5))+"%"])
print(pt)
pt.clear()
#print("------------------------------")
tj()
运行结果(这里展示了其中的三门课程)
三、解题(第八小问)
用图表显示每门课程的学生成绩的正态分布图
分析
这里由于课程数量较少,对方要求只需要生成1000个从0~100的随机数就可以了,最后画出一个正态分布图
代码
def demo2():
mu, sigma , num_bins = 0,1, 50
x = np.random.randint(0,100,size=1000)
# 正态分布的数据
n, bins, patches = plt.hist(x, num_bins, facecolor = 'blue', alpha = 0.5)
# 拟合曲线
y = stats.norm.pdf(bins, mu, sigma)
plt.plot(bins, y, 'r--')
plt.xlabel('分数')
plt.ylabel('个数')
plt.title('成绩分布')
plt.subplots_adjust(left = 0.15)
plt.show()
运行结果(这里展示三门课程的结果图)
四、结尾
到这里这个课设就基本完成了,个人感觉不是很难,里面的逻辑也很清楚,我也在当晚给对方写出来,对方也能够完成了这么课的课设,有一种双赢的感觉:
1、对方完成了课设报告,顺利结课
2、我收获了外块(哈哈哈),以及回顾了一下以前的知识
最后做出来后,得到了对方的满意,同样也是帮对方解决了课设这个担忧(因为这个课设是第二天早上就截止了)
------------------- End -------------------
【加群获取学习资料QQ群】
公众号回复:入群
【各种爬虫源码获取方式】
识别文末二维码,回复:爬虫源码
---------------往期精彩文章 ----------------
欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持
想加入Python学习群请在后台回复【入群】
万水千山总是情,点个【在看】行不行
【加群获取学习资料QQ群:901381280】
【各种爬虫源码获取方式】
识别文末二维码,回复:爬虫源码
欢迎关注公众号:Python爬虫数据分析挖掘,方便及时阅读最新文章
回复【开源源码】免费获取更多开源项目源码