查看原文
其他

4个小时我赚了600块

李运辰 Python研究者 2022-07-01



一、背景


在昨天(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群

公众号回复:入群


各种爬虫源码获取方式

识别文末二维码,回复:爬虫源码

---------------往期精彩文章 ----------------

记录一次爬虫接单项目【采集国际淘宝数据】


终于还是对B站动漫动手了!【数据可视化分析】


Python爬取最爱的电影并下载到本地(附源码)


欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存