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群

公众号回复:入群

各种爬虫源码获取方式

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

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

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

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

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

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

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

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

 

 

 
【加群获取学习资料QQ群:901381280】
【各种爬虫源码获取方式】
识别文末二维码,回复:爬虫源码
欢迎关注公众号:Python爬虫数据分析挖掘,方便及时阅读最新文章
回复【开源源码】免费获取更多开源项目源码

欢è¿æ«ç 

posted @ 2020-12-31 21:51  Python研究者  阅读(340)  评论(2编辑  收藏  举报