zoukankan      html  css  js  c++  java
  • 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爬虫数据分析挖掘,方便及时阅读最新文章
    回复【开源源码】免费获取更多开源项目源码
    

    欢è¿æ«ç 

  • 相关阅读:
    凯撒密码、GDP格式化输出、99乘法表
    字符串基本操作
    第四次作业
    第三次作业
    012黄意芳
    test指令的测试功能
    date命令
    zendstudio 10 项目导入乱码的解决
    用modelsim和debussy协同仿真VHDL Verilog的流程
    使用Debussy+ModelSim快速查看前仿真波形
  • 原文地址:https://www.cnblogs.com/chenlove/p/14231689.html
Copyright © 2011-2022 走看看