精华内容
下载资源
问答
  • 学生信息管理系统软件测试 报告软件测试 报告
  • 学生信息管理系统测试报告,是具体的web软件的测试,对需要做软件工程,软件测试专业的课程设计的童鞋很有参考意义。
  • 学生信息管理系统测试总报告

    万次阅读 多人点赞 2019-10-18 11:55:53
    目录 1 前言 4 1.1 编写目的 4 1.2 背景说明 4 1.3 适用范围 4 1.4 参考资料 4 ...3 测试需求 5 ...3.2 功能需求 5 ...3.2.1 系统管理模块 6 ...4.1 专业管理功能模块(场景分析法) 8 4.1.1 专业管理...

    目录
    1 前言 4
    1.1 编写目的 4
    1.2 背景说明 4
    1.3 适用范围 4
    1.4 参考资料 4
    2 实验设备与软件环境 4
    3 测试需求 5
    3.1 需求分析 5
    3.2 功能需求 5
    3.2.1 系统管理模块 6
    3.2.2 系统设置模块 6
    3.2.3 用户管理模块 7
    3.3 非功能需求 7
    4. 设计测试用例 8
    4.1 专业管理功能模块(场景分析法) 8
    4.1.1 专业管理的流程图 8
    4.1.2 找出基本流和备选流 9
    4.1.3 生成相应场景 9
    4.1.4 根据场景设计测试用例 10
    4.1.5 根据模板转换成对应测试用例 10
    4.2 成绩管理功能模块(等价类划分法) 13
    4.2.1 成绩管理的流程图 13
    4.2.2 分析需求,找出输入数据类型、长度、约束条件 14
    4.2.3 划分有效等价类、无效等价类 14
    4.2.4 设计测试用例 14
    4.3 用户管理功能模块(边界值分析法) 18
    4.3.1 用户管理的流程图 18
    4.3.2 分析需求,找出输入数据类型、长度、约束条件 18
    4.3.3 找输入数据的边界值(整型数据本身;非整型数据长度) 18
    4.3.4 设计测试用例 19
    4.4 其他模块 26
    5.缺陷分析 32
    5.1 失败的测试用例 32
    5.2 缺陷列表 34
    5.3 缺陷情况总结 36
    5.3.1 缺陷统计 36
    5.3.2 按缺陷等级汇总 36
    5.3.3 按缺陷所占的比值汇总 37
    5.4 测试结论 37
    5.5 建议 37
    6 总结 38

    1 前言
    1.1 编写目的
    (1)通过对测试结果的分析,得到对软件质量的评价 ;
    (2)分析测试的过程,为以后制定测试计划提供参考;
    (3)评估测试测试执行和测试计划是否符合 ;
    (4)分析系统存在的缺陷,为修复和预防bug提供建议。
    1.2 背景说明
    该项目主要对学生管理信息系统进行测试,包括需求评审、黑盒测试以及缺陷报告,测试该系统是否满足用户的需求。
    1.3 适用范围
    本报告为软件测试课程期末考查内容,读者为评审老师、测试报告的作者。
    1.4 参考资料
    编写该文档时,引用的资料有《学生管理信息系统_需求评审报告.docx》、《学生管理信息系统_测试用例设计报告.docx》、《学生管理信息系统_测试用例设计报告.xlsx》、《学生管理信息系统_系统缺陷报告.docx》。
    2 实验设备与软件环境
    在这里插入图片描述
    3 测试需求
    3.1 需求分析
    在这里插入图片描述
    3.2 功能需求
    功能需求包括以下几个:系统管理模块、系统设置模块、用户管理模块,如下图所示:
    在这里插入图片描述
    3.2.1 系统管理模块
    系统管理模块包括以下3个子功能点:添加新用户、修改用户信息、删除用户信息信息,如下图所示:
    在这里插入图片描述
    3.2.2 系统设置模块
    系统设置模块包括以下4个子功能点:专业管理、课程管理、研究生管理、成绩管理,如下图所示:

    在这里插入图片描述
    3.2.3 用户管理模块
    用户管理模块包括以下2个子功能点:更改密码和重新登录,如下图所示:
    在这里插入图片描述
    3.3非功能需求
    非功能需求包括性能需求、安全性需求、稳定性需求等,对非功能需求的测试包括:
    (1)前台界面、后台界面、数据精度、灵活性、搜索引擎seo优化要求、浏览器兼容稳定性要求和网站响应性能要求;
    (2)安全性要求;
    (3)质量检测及故障处理要求。
    在这里插入图片描述
    4.设计测试用例
    利用功能测试的方法(等价类划分法,边界值分析法、因果图、场景设计法),对MasterMIS.exe中的系统管理功能模块、专业管理功能模块、课程管理功能模块、成绩管理功能模块、研究生管理功能模块、用户管理功能模块写出案例系统完整的测试用例。
    4.1专业管理功能模块(场景分析法)
    4.1.1专业管理的流程图
    如下所示:
    在这里插入图片描述
    4.1.2找出基本流和备选流
    在这里插入图片描述
    4.1.3生成相应场景
    在这里插入图片描述
    4.1.4根据场景设计测试用例
    在这里插入图片描述
    4.1.5根据模板转换成对应测试用例
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    4.2成绩管理功能模块(等价类划分法)
    4.2.1成绩管理的流程图
    如下所示:
    在这里插入图片描述
    4.2.2分析需求,找出输入数据类型、长度、约束条件
    在这里插入图片描述
    4.2.3划分有效等价类、无效等价类
    在这里插入图片描述
    4.2.4设计测试用例
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    4.3用户管理功能模块(边界值分析法)
    4.3.1用户管理的流程图
    如下所示:
    在这里插入图片描述
    4.3.2分析需求,找出输入数据类型、长度、约束条件
    在这里插入图片描述
    4.3.3找输入数据的边界值(整型数据本身;非整型数据长度)
    在这里插入图片描述
    4.3.4设计测试用例
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    4.4 其他模块
    其他模块包含研究生管理模块、课程管理模块以及系统管理模块。
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    (续上表)
    在这里插入图片描述

    (续上表)
    在这里插入图片描述
    (续上表)

    在这里插入图片描述
    5.缺陷分析
    5.1失败的测试用例
    在这里插入图片描述

    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    5.2缺陷列表
    在这里插入图片描述
    (续上表)
    在这里插入图片描述
    5.3缺陷情况总结
    本章节对各模块的缺陷进行统计,主要从缺陷等级以及缺陷所占的比重来进行汇总。根据发现的缺陷分析该路由器的质量,能否满足需求。
    5.3.1缺陷统计
    在这里插入图片描述
    5.3.2按缺陷等级汇总
    在这里插入图片描述
    从上面的柱状图可以看出,在2-Very High等级中,系统管理模块有14个缺陷,课程管理模块有13个缺陷,研究生管理模块有6个缺陷,成绩管理模块有6个缺陷;在3-High中,专业管理模块有6个缺陷,用户管理模块有2个缺陷。
    5.3.3按缺陷所占的比值汇总
    在这里插入图片描述
    从上面的饼状图可以看出,课程管理模块中缺陷所占的比例最多,用户管理模块中缺陷所占的比例最少,六个模块的缺陷数由多到少的排序是:课程管理→系统管理→专业管理、成绩管理、研究生管理→用户管理。
    5.4测试结论
    从测试过程中发现bug的严重程度与分布情况来看,引起缺陷主要有以下几方面:
    (1)功能性错误:在测试的过程中,每个功能模块都不能正常实现全部功能,系统管理和课程管理的功能模块出现的问题最多,有“在文本框中无限添加字符”、“可输入空格”等缺陷问题;其中用户管理的功能模块出现的问题最少,毕竟这是关乎到一个系统的安全性。
    (2)代码错误:在测试过程中,每个功能模块的文本框都出现无限输入的缺陷,还有数据的组合问题,每个功能都存在缺陷不能完全实现或不完整或产生错误结果;使系统不稳定、或破坏数据等。
    5.5建议
    尽快将测试过程中发现的bug改正过来。需求提出方可以在使用该系统的基础上,继续搜集用户的使用需求反馈,并结合市场上同类系统的优势,在今后的版本中不断补充并完善功能。
    6总结
    本报告主要是对学生管理信息系统进行一个总的测试,首先要对系统进行需求分析,然后设计测试用例并执行,最后对缺陷进行分析,测试系统是否实现所有的需求功能,并及时对系统存在的缺陷及时解决。

    展开全文
  • Python题目:学生信息管理系统-高级版(图形界面+MySQL数据库) 使用图形界面显示,选用list、tuple、dictionary或map等数据结构,操作数据库存储X个学生的三门课的成绩(机器学习、Python程序设计、研究生英语)...

    Python题目:学生信息管理系统-高级版(图形界面+MySQL数据库)

           使用图形界面显示,选用list、tuple、dictionary或map等数据结构,操作数据库存储X个学生的三门课的成绩(机器学习、Python程序设计、研究生英语),并实现以下功能:

    1.添加学生信息
    2.修改学生信息
    3.删除学生
    4.添加学生的成绩
    5.修改学生成绩
    6.按姓名或者学号查找学生,显示学生信息及三门课的成绩,以及排名
    7.学生成绩统计(每门课的平均分、最高分、最低分)

    代码里的注释很清楚了,这里不做讲解了,有任何问题可以评论提问。 

    注意:

    • 数据表不存在则创建表,但自动创建的表是空白的,管理员用户名和密码需要自己数据库中添加一个(也可以运行文章最后的sql语句),为什么会出现这个问题,因为这是个课堂作业,当时没有设计好,现在懒得再改代码了╮(╯﹏╰)╭.......
    • 数据库在代码中(代码里有两处需要修改数据库 用户名、密码 的地方第66行第490行),配置为:
    # 打开数据库连接 连接测试
    db = pymysql.connect("localhost", "root", "root", "student")

           分别表示  主机名:localhost,用户名:root,密码:root,数据库名:student 


    下面是界面的截图

     

     管理员操作界面,拥有增删改查功能,甚至拥有排序功能φ(>ω<*) ,快点击标签栏试试

     

     代码:

    #!/usr/bin/python3
    
    import pymysql
    from tkinter import ttk
    import tkinter as tk
    import tkinter.font as tkFont
    from tkinter import * # 图形界面库
    import tkinter.messagebox as messagebox # 弹窗
    
    
    class StartPage:
    	def __init__(self, parent_window):
    		parent_window.destroy() # 销毁子界面
    
    		self.window = tk.Tk()  # 初始框的声明
    		self.window.title('学生信息管理系统')
    		self.window.geometry('300x470') # 这里的乘是小x
    
    		label = Label(self.window, text="学生信息管理系统", font=("Verdana", 20))
    		label.pack(pady=100)  # pady=100 界面的长度
    
    		Button(self.window, text="管理员登陆", font=tkFont.Font(size=16), command=lambda: AdminPage(self.window), width=30, height=2,
    			   fg='white', bg='gray', activebackground='black', activeforeground='white').pack()
    		Button(self.window, text="学生登陆", font=tkFont.Font(size=16), command=lambda: StudentPage(self.window), width=30,
    			   height=2,fg='white', bg='gray', activebackground='black', activeforeground='white').pack()
    		Button(self.window, text="关于", font=tkFont.Font(size=16), command=lambda: AboutPage(self.window), width=30, height=2,
    			   fg='white', bg='gray', activebackground='black', activeforeground='white').pack()
    		Button(self.window, text='退出系统', height=2, font=tkFont.Font(size=16), width=30, command=self.window.destroy,
    			   fg='white', bg='gray', activebackground='black', activeforeground='white').pack()
    
    		self.window.mainloop() # 主消息循环
    
    
    #管理员登陆页面
    class AdminPage:
    	def __init__(self, parent_window):
    		parent_window.destroy() # 销毁主界面
    
    		self.window = tk.Tk()  # 初始框的声明
    		self.window.title('管理员登陆页面')
    		self.window.geometry('300x450')  # 这里的乘是小x
    
    		label = tk.Label(self.window, text='管理员登陆', bg='green', font=('Verdana', 20), width=30, height=2)
    		label.pack()
    
    		Label(self.window, text='管理员账号:', font=tkFont.Font(size=14)).pack(pady=25)
    		self.admin_username = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory')
    		self.admin_username.pack()
    
    		Label(self.window, text='管理员密码:', font=tkFont.Font(size=14)).pack(pady=25)
    		self.admin_pass = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory', show='*')
    		self.admin_pass.pack()
    
    		Button(self.window, text="登陆", width=8, font=tkFont.Font(size=12), command=self.login).pack(pady=40)
    		Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=12), command=self.back).pack()
    
    		self.window.protocol("WM_DELETE_WINDOW", self.back)  # 捕捉右上角关闭点击
    		self.window.mainloop()  # 进入消息循环
    
    	def login(self):
    		print(str(self.admin_username.get()))
    		print(str(self.admin_pass.get()))
    		admin_pass = None
    
    		# 数据库操作 查询管理员表
    		db = pymysql.connect("localhost", "root", "root", "student")  # 打开数据库连接
    		cursor = db.cursor()  # 使用cursor()方法获取操作游标
    		sql = "SELECT * FROM admin_login_k WHERE admin_id = '%s'" % (self.admin_username.get())  # SQL 查询语句
    		try:
    		# 执行SQL语句
    			cursor.execute(sql)
    			# 获取所有记录列表
    			results = cursor.fetchall()
    			for row in results:
    				admin_id = row[0]
    				admin_pass = row[1]
    				# 打印结果
    				print("admin_id=%s,admin_pass=%s" % (admin_id, admin_pass))
    		except:
    			print("Error: unable to fecth data")
    			messagebox.showinfo('警告!', '用户名或密码不正确!')
    		db.close()  # 关闭数据库连接
    
    		print("正在登陆管理员管理界面")
    		print("self",self.admin_pass)
    		print("local",admin_pass)
    
    		if self.admin_pass.get() == admin_pass:
    			AdminManage(self.window)  # 进入管理员操作界面
    		else:
    			messagebox.showinfo('警告!', '用户名或密码不正确!')
    
    	def back(self):
    		StartPage(self.window) # 显示主窗口 销毁本窗口
    
    
    #学生登陆页面
    class StudentPage:
    	def __init__(self, parent_window):
    		parent_window.destroy() # 销毁主界面
    
    		self.window = tk.Tk()  # 初始框的声明
    		self.window.title('学生登陆')
    		self.window.geometry('300x450')  # 这里的乘是小x
    
    		label = tk.Label(self.window, text='学生登陆', bg='green', font=('Verdana', 20), width=30, height=2)
    		label.pack()
    
    		Label(self.window, text='学生账号:', font=tkFont.Font(size=14)).pack(pady=25)
    		self.student_id = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory')
    		self.student_id.pack()
    
    		Label(self.window, text='学生密码:', font=tkFont.Font(size=14)).pack(pady=25)
    		self.student_pass = tk.Entry(self.window, width=30, font=tkFont.Font(size=14), bg='Ivory', show='*')
    		self.student_pass.pack()
    
    		Button(self.window, text="登陆", width=8, font=tkFont.Font(size=12), command=self.login).pack(pady=40)
    		Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=12), command=self.back).pack()
    
    		self.window.protocol("WM_DELETE_WINDOW", self.back)  # 捕捉右上角关闭点击
    		self.window.mainloop()  # 进入消息循环
    
    	def login(self):
    		print(str(self.student_id.get()))
    		print(str(self.student_pass.get()))
    		stu_pass = None
    
    		# 数据库操作 查询管理员表
    		db = pymysql.connect("localhost", "root", "root", "student")  # 打开数据库连接
    		cursor = db.cursor()  # 使用cursor()方法获取操作游标
    		sql = "SELECT * FROM stu_login_k WHERE stu_id = '%s'" % (self.student_id.get())  # SQL 查询语句
    		try:
    			# 执行SQL语句
    			cursor.execute(sql)
    			# 获取所有记录列表
    			results = cursor.fetchall()
    			for row in results:
    				stu_id = row[0]
    				stu_pass = row[1]
    				# 打印结果
    				print("stu_id=%s,stu_pass=%s" % (stu_id, stu_pass))
    		except:
    			print("Error: unable to fecth data")
    			messagebox.showinfo('警告!', '用户名或密码不正确!')
    		db.close()  # 关闭数据库连接
    
    		print("正在登陆学生信息查看界面")
    		print("self", self.student_pass.get())
    		print("local", stu_pass)
    
    		if self.student_pass.get() == stu_pass:
    			StudentView(self.window, self.student_id.get()) # 进入学生信息查看界面
    		else:
    			messagebox.showinfo('警告!', '用户名或密码不正确!')
    
    	def back(self):
    		StartPage(self.window)  # 显示主窗口 销毁本窗口
    
    
    
    # 管理员操作界面
    class AdminManage:
    	def __init__(self, parent_window):
    		parent_window.destroy() # 销毁主界面
    
    		self.window = Tk()  # 初始框的声明
    		self.window.title('管理员操作界面')
    
    		self.frame_left_top = tk.Frame(width=300, height=200)
    		self.frame_right_top = tk.Frame(width=200, height=200)
    		self.frame_center = tk.Frame(width=500, height=400)
    		self.frame_bottom = tk.Frame(width=650, height=50)
    
    		# 定义下方中心列表区域
    		self.columns = ("学号", "姓名", "性别", "年龄")
    		self.tree = ttk.Treeview(self.frame_center, show="headings", height=18, columns=self.columns)
    		self.vbar = ttk.Scrollbar(self.frame_center, orient=VERTICAL, command=self.tree.yview)
    		# 定义树形结构与滚动条
    		self.tree.configure(yscrollcommand=self.vbar.set)
    
    		# 表格的标题
    		self.tree.column("学号", width=150, anchor='center')  # 表示列,不显示
    		self.tree.column("姓名", width=150, anchor='center')
    		self.tree.column("性别", width=100, anchor='center')
    		self.tree.column("年龄", width=100, anchor='center')
    
    		# 调用方法获取表格内容插入
    		self.tree.grid(row=0, column=0, sticky=NSEW)
    		self.vbar.grid(row=0, column=1, sticky=NS)
    
    		self.id = []
    		self.name = []
    		self.gender = []
    		self.age = []
    		# 打开数据库连接
    		db = pymysql.connect("localhost", "root", "root", "student")
    		cursor = db.cursor()  # 使用cursor()方法获取操作游标
    		sql = "SELECT * FROM student_k"  # SQL 查询语句
    		try:
    			# 执行SQL语句
    			cursor.execute(sql)
    			# 获取所有记录列表
    			results = cursor.fetchall()
    			for row in results:
    				self.id.append(row[0])
    				self.name.append(row[1])
    				self.gender.append(row[2])
    				self.age.append(row[3])
    				# print(self.id)
    				# print(self.name)
    				# print(self.gender)
    				# print(self.age)
    		except:
    			print("Error: unable to fetch data")
    			messagebox.showinfo('警告!', '数据库连接失败!')
    		db.close()# 关闭数据库连接
    
    
    		print("test***********************")
    		for i in range(min(len(self.id), len(self.name), len(self.gender), len(self.age))):  # 写入数据
    			self.tree.insert('', i, values=(self.id[i], self.name[i], self.gender[i], self.age[i]))
    
    		for col in self.columns:  # 绑定函数,使表头可排序
    			self.tree.heading(col, text=col,
    							  command=lambda _col=col: self.tree_sort_column(self.tree, _col, False))
    
    		# 定义顶部区域
    		# 定义左上方区域
    		self.top_title = Label(self.frame_left_top, text="学生信息:", font=('Verdana', 20))
    		self.top_title.grid(row=0, column=0, columnspan=2, sticky=NSEW, padx=50, pady=10)
    
    		self.left_top_frame = tk.Frame(self.frame_left_top)
    		self.var_id = StringVar()  # 声明学号
    		self.var_name = StringVar()  # 声明姓名
    		self.var_gender = StringVar()  # 声明性别
    		self.var_age = StringVar()  # 声明年龄
    		# 学号
    		self.right_top_id_label = Label(self.frame_left_top, text="学号:", font=('Verdana', 15))
    		self.right_top_id_entry = Entry(self.frame_left_top, textvariable=self.var_id, font=('Verdana', 15))
    		self.right_top_id_label.grid(row=1, column=0)  # 位置设置
    		self.right_top_id_entry.grid(row=1, column=1)
    		# 姓名
    		self.right_top_name_label = Label(self.frame_left_top, text="姓名:", font=('Verdana', 15))
    		self.right_top_name_entry = Entry(self.frame_left_top, textvariable=self.var_name, font=('Verdana', 15))
    		self.right_top_name_label.grid(row=2, column=0)  # 位置设置
    		self.right_top_name_entry.grid(row=2, column=1)
    		# 性别
    		self.right_top_gender_label = Label(self.frame_left_top, text="性别:", font=('Verdana', 15))
    		self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_gender,
    											font=('Verdana', 15))
    		self.right_top_gender_label.grid(row=3, column=0)  # 位置设置
    		self.right_top_gender_entry.grid(row=3, column=1)
    		# 年龄
    		self.right_top_gender_label = Label(self.frame_left_top, text="年龄:", font=('Verdana', 15))
    		self.right_top_gender_entry = Entry(self.frame_left_top, textvariable=self.var_age,
    											font=('Verdana', 15))
    		self.right_top_gender_label.grid(row=4, column=0)  # 位置设置
    		self.right_top_gender_entry.grid(row=4, column=1)
    
    		# 定义右上方区域
    		self.right_top_title = Label(self.frame_right_top, text="操作:", font=('Verdana', 20))
    
    		self.tree.bind('<Button-1>', self.click)  # 左键获取位置
    		self.right_top_button1 = ttk.Button(self.frame_right_top, text='新建学生信息', width=20, command=self.new_row)
    		self.right_top_button2 = ttk.Button(self.frame_right_top, text='更新选中学生信息', width=20,
    											command=self.updata_row)
    		self.right_top_button3 = ttk.Button(self.frame_right_top, text='删除选中学生信息', width=20,
    											command=self.del_row)
    
    		# 位置设置
    		self.right_top_title.grid(row=1, column=0, pady=10)
    		self.right_top_button1.grid(row=2, column=0, padx=20, pady=10)
    		self.right_top_button2.grid(row=3, column=0, padx=20, pady=10)
    		self.right_top_button3.grid(row=4, column=0, padx=20, pady=10)
    
    		# 整体区域定位
    		self.frame_left_top.grid(row=0, column=0, padx=2, pady=5)
    		self.frame_right_top.grid(row=0, column=1, padx=30, pady=30)
    		self.frame_center.grid(row=1, column=0, columnspan=2, padx=4, pady=5)
    		self.frame_bottom.grid(row=2, column=0, columnspan=2)
    
    		self.frame_left_top.grid_propagate(0)
    		self.frame_right_top.grid_propagate(0)
    		self.frame_center.grid_propagate(0)
    		self.frame_bottom.grid_propagate(0)
    
    		self.frame_left_top.tkraise() # 开始显示主菜单
    		self.frame_right_top.tkraise() # 开始显示主菜单
    		self.frame_center.tkraise() # 开始显示主菜单
    		self.frame_bottom.tkraise() # 开始显示主菜单
    
    		self.window.protocol("WM_DELETE_WINDOW", self.back)  # 捕捉右上角关闭点击
    		self.window.mainloop()  # 进入消息循环
    
    	def back(self):
    		StartPage(self.window) # 显示主窗口 销毁本窗口
    
    	def click(self, event):
    		self.col = self.tree.identify_column(event.x)  # 列
    		self.row = self.tree.identify_row(event.y)  # 行
    
    		print(self.col)
    		print(self.row)
    		self.row_info = self.tree.item(self.row, "values")
    		self.var_id.set(self.row_info[0])
    		self.var_name.set(self.row_info[1])
    		self.var_gender.set(self.row_info[2])
    		self.var_age.set(self.row_info[3])
    		self.right_top_id_entry = Entry(self.frame_left_top, state='disabled', textvariable=self.var_id,
    										font=('Verdana', 15))
    
    		print('')
    
    	def tree_sort_column(self, tv, col, reverse):  # Treeview、列名、排列方式
    		l = [(tv.set(k, col), k) for k in tv.get_children('')]
    		l.sort(reverse=reverse)  # 排序方式
    		# rearrange items in sorted positions
    		for index, (val, k) in enumerate(l):  # 根据排序后索引移动
    			tv.move(k, '', index)
    		tv.heading(col, command=lambda: self.tree_sort_column(tv, col, not reverse))  # 重写标题,使之成为再点倒序的标题
    
    	def new_row(self):
    		print('123')
    		print(self.var_id.get())
    		print(self.id)
    		if str(self.var_id.get()) in self.id:
    			messagebox.showinfo('警告!', '该学生已存在!')
    		else:
    			if self.var_id.get() != '' and self.var_name.get() != '' and self.var_gender.get() != '' and self.var_age.get() != '':
    				# 打开数据库连接
    				db = pymysql.connect("localhost", "root", "root", "student")
    				cursor = db.cursor()  # 使用cursor()方法获取操作游标
    				sql = "INSERT INTO student_k(id, name, gender, age) \
    				       VALUES ('%s', '%s', '%s', '%s')" % \
    					  (self.var_id.get(), self.var_name.get(), self.var_gender.get(), self.var_age.get())  # SQL 插入语句
    				try:
    					cursor.execute(sql)  # 执行sql语句
    					db.commit()  # 提交到数据库执行
    				except:
    					db.rollback()  # 发生错误时回滚
    					messagebox.showinfo('警告!', '数据库连接失败!')
    				db.close()  # 关闭数据库连接
    
    				self.id.append(self.var_id.get())
    				self.name.append(self.var_name.get())
    				self.gender.append(self.var_gender.get())
    				self.age.append(self.var_age.get())
    				self.tree.insert('', len(self.id) - 1, values=(
    				self.id[len(self.id) - 1], self.name[len(self.id) - 1], self.gender[len(self.id) - 1],
    				self.age[len(self.id) - 1]))
    				self.tree.update()
    				messagebox.showinfo('提示!', '插入成功!')
    			else:
    				messagebox.showinfo('警告!', '请填写学生数据')
    
    	def updata_row(self):
    		res = messagebox.askyesnocancel('警告!', '是否更新所填数据?')
    		if res == True:
    			if self.var_id.get() == self.row_info[0]:  # 如果所填学号 与 所选学号一致
    				# 打开数据库连接
    				db = pymysql.connect("localhost", "root", "root", "student")
    				cursor = db.cursor()  # 使用cursor()方法获取操作游标
    				sql = "UPDATE student_k SET name = '%s', gender = '%s', age = '%s' \
    				 WHERE id = '%s'" % (self.var_name.get(), self.var_gender.get(), self.var_age.get(), self.var_id.get())  # SQL 插入语句
    				try:
    					cursor.execute(sql)  # 执行sql语句
    					db.commit()  # 提交到数据库执行
    					messagebox.showinfo('提示!', '更新成功!')
    				except:
    					db.rollback()  # 发生错误时回滚
    					messagebox.showinfo('警告!', '更新失败,数据库连接失败!')
    				db.close()  # 关闭数据库连接
    
    				id_index = self.id.index(self.row_info[0])
    				self.name[id_index] = self.var_name.get()
    				self.gender[id_index] = self.var_gender.get()
    				self.age[id_index] = self.var_age.get()
    
    				self.tree.item(self.tree.selection()[0], values=(
    					self.var_id.get(), self.var_name.get(), self.var_gender.get(),
    					self.var_age.get()))  # 修改对于行信息
    			else:
    				messagebox.showinfo('警告!', '不能修改学生学号!')
    
    	def del_row(self):
    		res = messagebox.askyesnocancel('警告!', '是否删除所选数据?')
    		if res == True:
    			print(self.row_info[0])  # 鼠标选中的学号
    			print(self.tree.selection()[0])  # 行号
    			print(self.tree.get_children())  # 所有行
    			# 打开数据库连接
    			db = pymysql.connect("localhost", "root", "root", "student")
    			cursor = db.cursor()  # 使用cursor()方法获取操作游标
    			sql = "DELETE FROM student_k WHERE id = '%s'" % (self.row_info[0]) # SQL 插入语句
    			try:
    				cursor.execute(sql)  # 执行sql语句
    				db.commit()  # 提交到数据库执行
    				messagebox.showinfo('提示!', '删除成功!')
    			except:
    				db.rollback()  # 发生错误时回滚
    				messagebox.showinfo('警告!', '删除失败,数据库连接失败!')
    			db.close()  # 关闭数据库连接
    
    			id_index = self.id.index(self.row_info[0])
    			print(id_index)
    			del self.id[id_index]
    			del self.name[id_index]
    			del self.gender[id_index]
    			del self.age[id_index]
    			print(self.id)
    			self.tree.delete(self.tree.selection()[0])  # 删除所选行
    			print(self.tree.get_children())
    
    
    # 学生查看信息界面
    class StudentView:
    	def __init__(self, parent_window, student_id):
    		parent_window.destroy() # 销毁主界面
    
    		self.window = tk.Tk()  # 初始框的声明
    		self.window.title('关于')
    		self.window.geometry('300x450')  # 这里的乘是小x
    
    		label = tk.Label(self.window, text='学生信息查看', bg='green', font=('Verdana', 20), width=30, height=2)
    		label.pack(pady=20)
    
    		self.id = '学号:' + ''
    		self.name = '姓名:' + ''
    		self.gender = '性别:' + ''
    		self.age = '年龄:' + ''
    		# 打开数据库连接
    		db = pymysql.connect("localhost", "root", "root", "student")
    		cursor = db.cursor()# 使用cursor()方法获取操作游标
    		sql = "SELECT * FROM student_k WHERE id = '%s'" % (student_id) # SQL 查询语句
    		try:
    			# 执行SQL语句
    			cursor.execute(sql)
    			# 获取所有记录列表
    			results = cursor.fetchall()
    			for row in results:
    				self.id = '学号:' + row[0]
    				self.name = '姓名:' + row[1]
    				self.gender = '性别:' + row[2]
    				self.age = '年龄:' + row[3]
    		except:
    			print("Error: unable to fetch data")
    		db.close()		# 关闭数据库连接
    
    		Label(self.window, text=self.id, font=('Verdana', 18)).pack(pady=5)
    		Label(self.window, text=self.name, font=('Verdana', 18)).pack(pady=5)
    		Label(self.window, text=self.gender, font=('Verdana', 18)).pack(pady=5)
    		Label(self.window, text=self.age, font=('Verdana', 18)).pack(pady=5)
    
    		Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=16), command=self.back).pack(pady=25)
    
    		self.window.protocol("WM_DELETE_WINDOW", self.back)  # 捕捉右上角关闭点击
    		self.window.mainloop()  # 进入消息循环
    
    	def back(self):
    		StartPage(self.window)  # 显示主窗口 销毁本窗口
    
    
    # About页面
    class AboutPage:
    	def __init__(self, parent_window):
    		parent_window.destroy() # 销毁主界面
    
    		self.window = tk.Tk()  # 初始框的声明
    		self.window.title('关于')
    		self.window.geometry('300x450')  # 这里的乘是小x
    
    		label = tk.Label(self.window, text='学生信息管理系统', bg='green', font=('Verdana', 20), width=30, height=2)
    		label.pack()
    
    		Label(self.window, text='作者:清晨的光明', font=('Verdana', 18)).pack(pady=30)
    		Label(self.window, text='blog.csdn.net/kdongyi', font=('Verdana', 18)).pack(pady=5)
    
    		Button(self.window, text="返回首页", width=8, font=tkFont.Font(size=12), command=self.back).pack(pady=100)
    
    		self.window.protocol("WM_DELETE_WINDOW", self.back)  # 捕捉右上角关闭点击
    		self.window.mainloop()  # 进入消息循环
    
    	def back(self):
    		StartPage(self.window)  # 显示主窗口 销毁本窗口
    
    
    if __name__ == '__main__':
    	try:
    		# 打开数据库连接 连接测试
    		db = pymysql.connect("localhost", "root", "root", "student")
    		# 使用cursor()方法获取操作游标
    		cursor = db.cursor()
    		# 如果数据表不存在则创建表 若存在则跳过
    		# 设置主键唯一
    		sql = """CREATE TABLE IF NOT EXISTS student_k(
    				id char(20) NOT NULL,
    				name char(20) default NULL,
    				gender char(5) default NULL,  
    				age char(5) default NULL,
    				PRIMARY KEY (id)
    				
    				) ENGINE = InnoDB 
    				DEFAULT	CHARSET = utf8
    				"""
    		cursor.execute(sql)
    		# 如果数据表不存在则创建表 若存在则跳过
    		sql = """CREATE TABLE IF NOT EXISTS admin_login_k(
    						admin_id char(20) NOT NULL,
    						admin_pass char(20) default NULL,
    						PRIMARY KEY (admin_id)
    						) ENGINE = InnoDB 
    						DEFAULT	CHARSET = utf8
    						"""
    		cursor.execute(sql)
    		# 如果数据表不存在则创建表 若存在则跳过
    		sql = """CREATE TABLE IF NOT EXISTS stu_login_k(
    						stu_id char(20) NOT NULL,
    						stu_pass char(20) default NULL,
    						PRIMARY KEY (stu_id)
    						) ENGINE = InnoDB 
    						DEFAULT	CHARSET = utf8
    						"""
    		cursor.execute(sql)
    
    		# 关闭数据库连接
    		db.close()
    
    		# 实例化Application
    		window = tk.Tk()
    		StartPage(window)
    	except:
    		messagebox.showinfo('错误!', '连接数据库失败!')
    
    

     下面是我从我电脑数据库转储的SQL文件:

    /*
    Navicat MySQL Data Transfer
    
    Source Server         : mysql
    Source Server Version : 50532
    Source Host           : localhost:3306
    Source Database       : student
    
    Target Server Type    : MYSQL
    Target Server Version : 50532
    File Encoding         : 65001
    
    Date: 2019-11-28 15:09:36
    */
    
    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for `admin_login_k`
    -- ----------------------------
    DROP TABLE IF EXISTS `admin_login_k`;
    CREATE TABLE `admin_login_k` (
      `admin_id` char(20) NOT NULL,
      `admin_pass` char(20) DEFAULT NULL,
      PRIMARY KEY (`admin_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of admin_login_k
    -- ----------------------------
    INSERT INTO `admin_login_k` VALUES ('admin', 'admin');
    
    -- ----------------------------
    -- Table structure for `student_k`
    -- ----------------------------
    DROP TABLE IF EXISTS `student_k`;
    CREATE TABLE `student_k` (
      `id` char(20) NOT NULL,
      `name` char(20) DEFAULT NULL,
      `gender` char(5) DEFAULT NULL,
      `age` char(5) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of student_k
    -- ----------------------------
    INSERT INTO `student_k` VALUES ('182085211003', 'a', '女', '22');
    INSERT INTO `student_k` VALUES ('182085211004', 'b', '女', '18');
    INSERT INTO `student_k` VALUES ('182085211005', 'abc', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211006', 'abc', '女', '24');
    INSERT INTO `student_k` VALUES ('182085211008', 'Tom', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211009', 'Tom', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211010', 'Tom', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211011', 'Tom', '男', '23');
    INSERT INTO `student_k` VALUES ('1820852110111', 'Tom', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211012', 'Tom', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211013', 'Tom', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211014', 'Tom2', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211015', 'Tom1', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211016', 'Tom', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211017', 'Tom', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211018', 'Tom', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211019', 'Tom', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211020', 'Tom', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211021', 'Tom', '男', '23');
    INSERT INTO `student_k` VALUES ('1820852110211', 'Tom', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211022', 'Tom1', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211023', 'Tom', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211024', 'Tom', '男', '23');
    INSERT INTO `student_k` VALUES ('182085211034', 'Tom', '男', '23');
    
    -- ----------------------------
    -- Table structure for `stu_login_k`
    -- ----------------------------
    DROP TABLE IF EXISTS `stu_login_k`;
    CREATE TABLE `stu_login_k` (
      `stu_id` char(20) NOT NULL,
      `stu_pass` char(20) DEFAULT NULL,
      PRIMARY KEY (`stu_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of stu_login_k
    -- ----------------------------
    INSERT INTO `stu_login_k` VALUES ('182085211000', '123456');
    
    -- ----------------------------
    -- Table structure for `t_course`
    -- ----------------------------
    DROP TABLE IF EXISTS `t_course`;
    CREATE TABLE `t_course` (
      `SNO` char(255) NOT NULL,
      `COURSE` char(255) DEFAULT NULL,
      `CREDIT` char(255) DEFAULT NULL,
      `GRADE` char(255) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of t_course
    -- ----------------------------
    INSERT INTO `t_course` VALUES ('08300205', '程序设计', '4', '88');
    INSERT INTO `t_course` VALUES ('08300205', '数据库', '2.5', '90');
    INSERT INTO `t_course` VALUES ('08300205', '力学', '5', '92');
    INSERT INTO `t_course` VALUES ('08080929', '数据库', '2.5', '85');
    INSERT INTO `t_course` VALUES ('09350124', '数据库', '2.5', '92');
    INSERT INTO `t_course` VALUES ('09620233', '数据库', '2.5', '80');
    INSERT INTO `t_course` VALUES ('09300218', '数据库', '2.5', '78');
    INSERT INTO `t_course` VALUES ('09010122', '数据库', '2.5', '87');
    INSERT INTO `t_course` VALUES ('08080929', '程序设计', '4', '86');
    INSERT INTO `t_course` VALUES ('09010122', '程序设计', '4', '80');
    INSERT INTO `t_course` VALUES ('08300516', '程序设计', '4', '76');
    
    -- ----------------------------
    -- Table structure for `t_st`
    -- ----------------------------
    DROP TABLE IF EXISTS `t_st`;
    CREATE TABLE `t_st` (
      `SNO` char(11) NOT NULL,
      `SNAME` char(255) DEFAULT NULL,
      `SSEX` char(255) DEFAULT NULL,
      `AGE` char(255) DEFAULT NULL,
      `DEPT` char(255) DEFAULT NULL,
      PRIMARY KEY (`SNO`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of t_st
    -- ----------------------------
    INSERT INTO `t_st` VALUES ('08080929', '刘超世', '男', '19', '计算机应用技术');
    INSERT INTO `t_st` VALUES ('08300205', '李媛媛', '女', '19', '软件工程');
    INSERT INTO `t_st` VALUES ('09300218', '王海超', '男', '19', '软件工程');
    INSERT INTO `t_st` VALUES ('09350124', '王彤', '女', '19', '通信原理');
    INSERT INTO `t_st` VALUES ('09620233', '陈晓丽', '女', '21', '通信工程');
    

    觉得有用,点个赞再走吧^_^

    展开全文
  • 学生信息管理系统——C语言版

    万次阅读 多人点赞 2019-04-06 18:07:13
    1)查询学生信息 2)添加学生信息 3)修改学生信息 4)删除学生信息 5)刷新学生信息 6)保存学生信息 7)输出当前学生信息 2.题目要求: 1)使用结构体建立学生信息体制 2)实现七大基本功能 3)采用文件存储学生...

    一.题目分析:
    1.功能概述:
    1)查询学生信息
    2)添加学生信息
    3)修改学生信息
    4)删除学生信息
    5)刷新学生信息
    6)保存学生信息
    7)输出当前学生信息
    2.题目要求:
    1)使用结构体建立学生信息体制
    2)实现七大基本功能
    3)采用文件存储学生信息
    二.算法构造
    1.难点解析----对文件的操作
    1.1文件读取

    FILE * fp;
    	if ((fp = fopen(filename, "r")) == NULL) return 0;
    	//从文件读取信息 
    	while (fscanf(fp, "%s %s %s %d %d %d %d ", &stu[j].StudentId, &stu[j].StudentName, &stu[j].StudentAge, &stu[j].StudentSex, &stu[j].score[0], &stu[j].score[1], &stu[j].score[2]) == 7) {
    		j++;
    	}
    

    1.2文件写入

    FILE * fp;
    fp = fopen(filename, "w");
    	for (i = 0; i < n; i++){
    		fprintf(fp, "%s%s%d%c%.lf%.lf%.lf\n", stu[i].StudentId, stu[i].StudentName, stu[i].StudentAge, stu[i].StudentSex,
    			stu[i].score[0], stu[i].score[1], stu[i].score[2]);
    	}
    

    2.流程图
    在这里插入图片描述
    3.七大基本功能----函数实现
    3.1菜单函数:通过菜单建立用户与程序之间的交流

    void menu()/* 界面*/
    {
    	int num;
    	printf(" \n\n                    \n\n");
    	printf("  ******************************************************\n\n");
    	printf("  *                学生信息管理系统                    *\n \n");
    	printf("  ******************************************************\n\n");
    	printf("*********************系统功能菜单*************************       \n");
    	printf("     ----------------------   ----------------------   \n");
    	printf("     *********************************************     \n");
    	printf("     * 0.系统帮助及说明  * *  1.刷新学生信息   *     \n");
    	printf("     *********************************************     \n");
    	printf("     * 2.查询学生信息    * *  3.修改学生信息   *     \n");
    	printf("     *********************************************     \n");
    	printf("     * 4.增加学生信息    * *  5.按学号删除信息 *     \n");
    	printf("     *********************************************     \n");
    	printf("     * 6.显示当前信息    * *  7.保存当前学生信息*     \n");
    	printf("     ********************** **********************     \n");
    	printf("     * 8.退出系统        *                            \n");
    	printf("     **********************                            \n");
    	printf("     ----------------------   ----------------------                           \n");
    	printf("请选择菜单编号:");
    	scanf("%d", &num);
    	switch (num)
    	{
    	case 0:help(); break;
    	case 1:flush(); break;
    	case 2:seek(); break;
    	case 3:modify(); break;
    	case 4:insert(); break;
    	case 5:del(); break;
    	case 6:display(); break;
    	case 7:save(); break;
    	case 8:
    		k = 0; 
    		printf("即将退出程序!\n");
    		break;
    	default:printf("请在0-8之间选择\n");
    	}
    }
    

    3.2系统帮助与说明函数:适用于初次接触学生信息管理系统的用户参考

    void help()
    {
    	printf("\n0.欢迎使用系统帮助!\n");
    	printf("\n1.初次进入系统后,请先选择增加学生信息;\n");
    	printf("\n2.按照菜单提示键入数字代号;\n");
    	printf("\n3.增加学生信息后,切记保存;\n");
    	printf("\n4.谢谢您的使用!\n");
    }
    

    3.3刷新学生信息函数
    功能:调用刷新信息函数后,文件中再无学生信息

    int flush(){
    	char filename[LEN + 1];
    	int i = 0;
    	printf("请输入要刷新学生信息的文件名:\n");
    	scanf("%s", filename);
    	int j = 0;
    	FILE * fp;
    	if ((fp = fopen(filename, "r")) == NULL) return 0;
    	//从文件读取信息 
    	while (fscanf(fp, "%s %s %s %d %d %d %d ", &stu[j].StudentId, &stu[j].StudentName, &stu[j].StudentAge, &stu[j].StudentSex, &stu[j].score[0], &stu[j].score[1], &stu[j].score[2]) == 7) {
    		j++;
    	}
    	n = j;
    	printf("刷新成功!!!");
    	return n;
    }
    
    

    3.4查询学生信息函数
    功能:通过输入要查询的学生学号或者姓名,与系统中的学生信息进行对比,若相等,则输出该学生的基本信息;反之,则输出该学生在该管理系统中不存在
    查询方式:
    1)按照学号查询
    2)按照姓名查询

    void seek() /*查找*/
    {
    	int i, item, flag;
    	char s1[21]; /* 以姓名和学号最长长度+1为准*/
    	printf("------------------\n");
    	printf("-----1.按学号查询-----\n");
    	printf("-----2.按姓名查询-----\n");
    	printf("-----3.退出本菜单-----\n");
    	printf("------------------\n");
    	while (1)
    	{
    		printf("请选择子菜单编号:");
    		scanf("%d", &item);
    		flag = 0;
    		switch (item)
    		{
    		case 1:
    			printf("请输入要查询的学生的学号:\n");
    			scanf("%s", s1);
    			for (i = 0; i<n; i++)
    			if (strcmp(s1,stu[i].StudentId) == 0)
    			{
    				flag = 1;
    				printf("学生学号\t学生姓名\t年龄\t性别\tC语言成绩\t高等数学\t大学英语成绩\n");
    				printf("--------------------------------------------------------------------\n");
    				printf("%s\t%s\t%d\t%6\t%.1f\t%.1f\t%.1f\n", stu[i].StudentId,stu[i].StudentName,stu[i].StudentAge,stu[i].StudentSex,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
    			}
    			if (0 == flag)
    				printf("该学号不存在!\n"); break;
    		case 2:
    			printf("请输入要查询的学生的姓名:\n");
    			scanf("%s", s1);
    			for (i = 0; i<n; i++)
    			if (strcmp(stu[i].StudentName, s1) == 0)
    			{
    				flag = 1;
    				printf("学生学号\t学生姓名\t年龄\t性别\tC语言成绩\t高等数学\t大学英语成绩\n");
    				printf("--------------------------------------------------------------------\n");
    				printf("%s\t%s\t%d\t%c\t%.1f\t%.1f\t%.1f\n", stu[i].StudentId, stu[i].StudentName, stu[i].StudentAge, stu[i].StudentSex, stu[i].score[0], stu[i].score[1], stu[i].score[2]);
    			}
    			if (0 == flag)
    				printf("该姓名不存在!\n"); break;
    		case 3:return;
    		default:printf("请在1-3之间选择\n");
    		}
    	}
    }
    

    3.5修改学生信息
    功能:通过输入学号来选择要修改的该学号学生的信息内容,从而完成修改信息操作;

    //修改学生信息
    void modify() /*修改信息*/
    {
    	int i, item, num = -1;
    	char sex1, s1[LEN + 1], s2[LEN + 1]; /* 以姓名和学号最长长度+1为准*/
    	float score1;
    	printf("请输入要要修改的学生的学号:\n");
    	scanf("%s", s1);
    	for (i = 0; i < n; i++){
    		if (strcmp(stu[i].StudentId, s1) == 0){/*比较字符串是否相等*/
    			num = i;
    			printf("------------------\n");
    			printf("1.修改姓名\n");
    			printf("2.修改年龄\n");
    			printf("3.修改性别\n");
    			printf("4.修改C语言成绩\n");
    			printf("5.修改高等数学成绩\n");
    			printf("6.修改大学英语成绩\n");
    			printf("7.退出本菜单\n");
    			printf("------------------\n");
    			while (1)
    			{
    				printf("请选择子菜单编号:");
    				scanf("%d", &item);
    				switch (item)
    				{
    				case 1:
    					printf("请输入新的姓名:\n");
    					scanf("%s", s2);
    					strcpy(stu[num].StudentName, s2);
    					break;
    				case 2:
    					printf("请输入新的年龄:\n");
    					scanf("%d", stu[num].StudentAge);
    					break;
    				case 3:
    					printf("请输入新的性别:\n");
    					scanf("%s", &sex1);
    					stu[i].StudentSex = sex1;
    					break;
    				case 4:
    					printf("请输入新的C语言成绩:\n");
    					scanf("%f", &score1);
    					stu[num].score[0] = score1;
    					break;
    				case 5:
    					printf("请输入新的高等数学成绩:\n");
    					scanf("%f", &score1);
    					stu[num].score[1] = score1;
    					break;
    				case 6:
    					printf("请输入新的大学英语成绩:\n");
    					scanf("%f", &score1);
    					stu[num].score[2] = score1;
    					break;
    				case 7:	return;
    				default:printf("请在1-7之间选择\n");
    				}
    			}
    			printf("修改完毕!请及时保存!\n");
    		}
    		else{
    			printf("没有该学生学号!!!");
    		}
    	}
    }
    

    3.6添加学生信息函数
    功能:添加学生信息,并保存至文件中

    //添加学生信息函数
    void insert() /*插入函数*/
    {
    	int i = n, j, flag;
    	printf("请输入待增加的学生数:\n");
    	scanf("%d", &m);
    	if (m > 0){
    		do
    		{
    			flag = 1;
    			while (flag)
    			{
    				flag = 0;
    				printf("请输入第%d位学生的学号:\n", i + 1);
    				scanf("%s", stu[i].StudentId);
    				for (j = 0; j < i; j++){
    					if (strcmp(stu[i].StudentId, stu[j].StudentId) == 0){
    						printf("该学号已存在,请重新输入!\n");
    						flag = 1;
    						break;
    					}
    				}
    			}
    			printf("请输入第%d 个学生的姓名:\n", i+1);
    			scanf("%s", stu[i].StudentName);
    			printf("请输入第%d 个学生的年龄:\n", i+1);
    			scanf("%d", &stu[i].StudentAge);
    			printf("请输入第%d 个学生的性别:\n", i+1);
    			scanf(" %c", &stu[i].StudentSex);
    			printf("请输入第%d 个学生的C语言成绩\n",i+1);
    			scanf("%f", &stu[i].score[0]);
    			printf("请输入第%d 个学生的高等数学成绩:\n", i+1);
    			scanf("%f", &stu[i].score[1]);
    			printf("请输入第%d 个学生的大学英语成绩:\n", i+1);
    			scanf("%f", &stu[i].score[2]);
    			if (0 == flag){
    				i++;
    			}
    		} while (i<n + m);
    	}
    		n += m;
    		printf("学生信息增加完毕!!!\n");
    		system("pause");
    }
    

    3.7删除学生信息函数
    功能:通过输入要删除学生信息的学号,删除该学生在该管理系统中的所有信息;

    //删除学生信息函数
    void del()
    {
    	int i, j, flag = 0;
    	char s1[LEN + 1];
    	printf("请输入要删除学生的学号:\n");
    	scanf("%s", s1);
    	for (i = 0; i < n; i++){
    		if (strcpy(stu[i].StudentId, s1) == 0){
    			flag = 1;
    			//要删除学生后面的学生往前移一位
    			for (j = i; j < n - 1; j++){
    				stu[j] = stu[j + 1];
    			}
    		}
    	}
    		//查找失败
    		if (0 == flag){
    			printf("该学号不存在!!!\n");
    		}
    		if (1 == flag){
    			printf("删除成功!!!");
    			//删除成功,学生人数减1
    			n--;
    		}
    		system("pause");
    }
    

    3.8显示当前学生信息
    功能:可以输出进行多种操作后的学生信息管理系统中的所有学生信息;

    //显示全部数据信息
    void display()
    {
    	int i;
    	printf("共有%d位学生的信息:\n", n);
    	if (0 != n)
    	{
    		printf("学生学号 \t学生姓名 \t年龄   \t性别   \tC语言成绩\t高等数学 \t大学英语成绩\n");
    		printf("--------------------------------------------------------------------\n");
    		for (i = 0; i<n; i++)
    		{
    			printf("%s \t%s \t%d   \t%c   \t%.1f\t%.1f \t%.1f\n", stu[i].StudentId, stu[i].StudentName, stu[i].StudentAge, stu[i].StudentSex, stu[i].score[0],stu[i].score[1],stu[i].score[2]);
    		}
    	}
    	system("pause");
    }
    

    3.8保存学生信息
    功能:将进行某些操作后的学生信息保存到指定文件中

    void save(){
    	int i;
    	FILE *fp;
    	char filename[LEN + 1];
    	printf("请输入要保存的文件名:\n");
    	scanf("%s", filename);
    	fp = fopen(filename, "w");
    	for (i = 0; i < n; i++){
    		fprintf(fp, "%s%s%d%c%.lf%.lf%.lf\n", stu[i].StudentId, stu[i].StudentName, stu[i].StudentAge, stu[i].StudentSex,
    			stu[i].score[0], stu[i].score[1], stu[i].score[2]);
    	}
    	printf("保存成功!!!\n");
    	fclose(fp);
    	system("pause");
    }
    
    

    三.源程序代码

    #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>	/*I/O函数*/
    #include<stdlib.h>	/*其它说明*/
    #include<string.h>	/*字符串函数*/
    
    #define LEN 15		/* 学号和姓名最大字符数,实际请更改*/
    #define N 50		/* 最大学生人数,实际请更改*/
    
    int k = 1, n = 0, m = 0;/* n代表当前记录的学生人数*/
    
    //函数声明
    void readfile();
    void seek();
    void modify();
    void insert();
    void del();
    void display();
    void save();
    void menu();
    
    //结构体保存学生信息
    struct student{
    	char StudentId[LEN+1];
    	char StudentName[LEN+1];
    	int StudentAge;
    	char StudentSex;
    	float score[3];
    }stu[N];
    
    //主函数
    int main()
    {
    	while (k)
    	{
    		menu();
    	}
    	system("pause");
    	return 0;
    }
    
    //系统帮助函数
    void help()
    {
    	printf("\n0.欢迎使用系统帮助!\n");
    	printf("\n1.初次进入系统后,请先选择增加学生信息;\n");
    	printf("\n2.按照菜单提示键入数字代号;\n");
    	printf("\n3.增加学生信息后,切记保存;\n");
    	printf("\n4.谢谢您的使用!\n");
    }
    
    //刷新文件
    int flush(){
    	char filename[LEN + 1];
    	int i = 0;
    	printf("请输入要刷新学生信息的文件名:\n");
    	scanf("%s", filename);
    	int j = 0;
    	FILE * fp;
    	if ((fp = fopen(filename, "r")) == NULL) return 0;
    	//从文件读取信息 
    	while (fscanf(fp, "%s %s %s %d %d %d %d ", &stu[j].StudentId, &stu[j].StudentName, &stu[j].StudentAge, &stu[j].StudentSex, &stu[j].score[0], &stu[j].score[1], &stu[j].score[2]) == 7) {
    		j++;
    	}
    	n = j;
    	printf("刷新成功!!!");
    	return n;
    }
    
    //查找学生信息
    void seek() /*查找*/
    {
    	int i, item, flag;
    	char s1[21]; /* 以姓名和学号最长长度+1为准*/
    	printf("------------------\n");
    	printf("-----1.按学号查询-----\n");
    	printf("-----2.按姓名查询-----\n");
    	printf("-----3.退出本菜单-----\n");
    	printf("------------------\n");
    	while (1)
    	{
    		printf("请选择子菜单编号:");
    		scanf("%d", &item);
    		flag = 0;
    		switch (item)
    		{
    		case 1:
    			printf("请输入要查询的学生的学号:\n");
    			scanf("%s", s1);
    			for (i = 0; i<n; i++)
    			if (strcmp(s1,stu[i].StudentId) == 0)
    			{
    				flag = 1;
    				printf("学生学号\t学生姓名\t年龄\t性别\tC语言成绩\t高等数学\t大学英语成绩\n");
    				printf("--------------------------------------------------------------------\n");
    				printf("%s\t%s\t%d\t%6\t%.1f\t%.1f\t%.1f\n", stu[i].StudentId,stu[i].StudentName,stu[i].StudentAge,stu[i].StudentSex,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
    			}
    			if (0 == flag)
    				printf("该学号不存在!\n"); break;
    		case 2:
    			printf("请输入要查询的学生的姓名:\n");
    			scanf("%s", s1);
    			for (i = 0; i<n; i++)
    			if (strcmp(stu[i].StudentName, s1) == 0)
    			{
    				flag = 1;
    				printf("学生学号\t学生姓名\t年龄\t性别\tC语言成绩\t高等数学\t大学英语成绩\n");
    				printf("--------------------------------------------------------------------\n");
    				printf("%s\t%s\t%d\t%c\t%.1f\t%.1f\t%.1f\n", stu[i].StudentId, stu[i].StudentName, stu[i].StudentAge, stu[i].StudentSex, stu[i].score[0], stu[i].score[1], stu[i].score[2]);
    			}
    			if (0 == flag)
    				printf("该姓名不存在!\n"); break;
    		case 3:return;
    		default:printf("请在1-3之间选择\n");
    		}
    	}
    }
    
    //修改学生信息
    void modify() /*修改信息*/
    {
    	int i, item, num = -1;
    	char sex1, s1[LEN + 1], s2[LEN + 1]; /* 以姓名和学号最长长度+1为准*/
    	float score1;
    	printf("请输入要要修改的学生的学号:\n");
    	scanf("%s", s1);
    	for (i = 0; i < n; i++){
    		if (strcmp(stu[i].StudentId, s1) == 0){/*比较字符串是否相等*/
    			num = i;
    			printf("------------------\n");
    			printf("1.修改姓名\n");
    			printf("2.修改年龄\n");
    			printf("3.修改性别\n");
    			printf("4.修改C语言成绩\n");
    			printf("5.修改高等数学成绩\n");
    			printf("6.修改大学英语成绩\n");
    			printf("7.退出本菜单\n");
    			printf("------------------\n");
    			while (1)
    			{
    				printf("请选择子菜单编号:");
    				scanf("%d", &item);
    				switch (item)
    				{
    				case 1:
    					printf("请输入新的姓名:\n");
    					scanf("%s", s2);
    					strcpy(stu[num].StudentName, s2);
    					break;
    				case 2:
    					printf("请输入新的年龄:\n");
    					scanf("%d", stu[num].StudentAge);
    					break;
    				case 3:
    					printf("请输入新的性别:\n");
    					scanf("%s", &sex1);
    					stu[i].StudentSex = sex1;
    					break;
    				case 4:
    					printf("请输入新的C语言成绩:\n");
    					scanf("%f", &score1);
    					stu[num].score[0] = score1;
    					break;
    				case 5:
    					printf("请输入新的高等数学成绩:\n");
    					scanf("%f", &score1);
    					stu[num].score[1] = score1;
    					break;
    				case 6:
    					printf("请输入新的大学英语成绩:\n");
    					scanf("%f", &score1);
    					stu[num].score[2] = score1;
    					break;
    				case 7:	return;
    				default:printf("请在1-7之间选择\n");
    				}
    			}
    			printf("修改完毕!请及时保存!\n");
    		}
    		else{
    			printf("没有该学生学号!!!");
    		}
    	}
    }
    
    void sort()//按学号排序
    {
    	int i, j, k, *p, *q, s;
    	char temp[LEN + 1], ctemp;
    	float ftemp;
    	for (i = 0; i<n - 1; i++)
    	{
    		for (j = n - 1; j>i; j--)
    		if (strcmp(stu[j - 1].StudentId, stu[j].StudentId)>0)
    		{
    			strcpy(temp, stu[j - 1].StudentId);
    			strcpy(stu[j - 1].StudentId, stu[j].StudentId);
    			strcpy(stu[j].StudentId, temp);
    			strcpy(temp, stu[j - 1].StudentName);
    			strcpy(stu[j - 1].StudentName, stu[j].StudentName);
    			strcpy(stu[j].StudentName, temp);
    			ctemp = stu[j - 1].StudentSex;
    			stu[j - 1].StudentSex = stu[j].StudentSex;
    			stu[j].StudentSex = ctemp;
    			p = &stu[j - 1].StudentAge;
    			q = &stu[j].StudentAge;
    			s = *q;
    			*q = *p;
    			*p = s;
    			for (k = 0; k<3; k++)
    			{
    				ftemp = stu[j - 1].score[k];
    				stu[j - 1].score[k] = stu[j].score[k];
    				stu[j].score[k] = ftemp;
    			}
    		}
    	}
    }
    
    //添加学生信息函数
    void insert() /*插入函数*/
    {
    	int i = n, j, flag;
    	printf("请输入待增加的学生数:\n");
    	scanf("%d", &m);
    	if (m > 0){
    		do
    		{
    			flag = 1;
    			while (flag)
    			{
    				flag = 0;
    				printf("请输入第%d位学生的学号:\n", i + 1);
    				scanf("%s", stu[i].StudentId);
    				for (j = 0; j < i; j++){
    					if (strcmp(stu[i].StudentId, stu[j].StudentId) == 0){
    						printf("该学号已存在,请重新输入!\n");
    						flag = 1;
    						break;
    					}
    				}
    			}
    			printf("请输入第%d 个学生的姓名:\n", i+1);
    			scanf("%s", stu[i].StudentName);
    			printf("请输入第%d 个学生的年龄:\n", i+1);
    			scanf("%d", &stu[i].StudentAge);
    			printf("请输入第%d 个学生的性别:\n", i+1);
    			scanf(" %c", &stu[i].StudentSex);
    			printf("请输入第%d 个学生的C语言成绩\n",i+1);
    			scanf("%f", &stu[i].score[0]);
    			printf("请输入第%d 个学生的高等数学成绩:\n", i+1);
    			scanf("%f", &stu[i].score[1]);
    			printf("请输入第%d 个学生的大学英语成绩:\n", i+1);
    			scanf("%f", &stu[i].score[2]);
    			if (0 == flag){
    				i++;
    			}
    		} while (i<n + m);
    	}
    		n += m;
    		printf("学生信息增加完毕!!!\n");
    		system("pause");
    }
    
    //删除学生信息函数
    void del()
    {
    	int i, j, flag = 0;
    	char s1[LEN + 1];
    	printf("请输入要删除学生的学号:\n");
    	scanf("%s", s1);
    	for (i = 0; i < n; i++){
    		if (strcpy(stu[i].StudentId, s1) == 0){
    			flag = 1;
    			//要删除学生后面的学生往前移一位
    			for (j = i; j < n - 1; j++){
    				stu[j] = stu[j + 1];
    			}
    		}
    	}
    		//查找失败
    		if (0 == flag){
    			printf("该学号不存在!!!\n");
    		}
    		if (1 == flag){
    			printf("删除成功!!!");
    			//删除成功,学生人数减1
    			n--;
    		}
    		system("pause");
    }
    
    //显示全部数据信息
    void display()
    {
    	int i;
    	printf("共有%d位学生的信息:\n", n);
    	if (0 != n)
    	{
    		printf("学生学号 \t学生姓名 \t年龄   \t性别   \tC语言成绩\t高等数学 \t大学英语成绩\n");
    		printf("--------------------------------------------------------------------\n");
    		for (i = 0; i<n; i++)
    		{
    			printf("%s \t%s \t%d   \t%c   \t%.1f\t%.1f \t%.1f\n", stu[i].StudentId, stu[i].StudentName, stu[i].StudentAge, stu[i].StudentSex, stu[i].score[0],stu[i].score[1],stu[i].score[2]);
    		}
    	}
    	system("pause");
    }
    
    void save(){
    	int i;
    	FILE *fp;
    	char filename[LEN + 1];
    	printf("请输入要保存的文件名:\n");
    	scanf("%s", filename);
    	fp = fopen(filename, "w");
    	for (i = 0; i < n; i++){
    		fprintf(fp, "%s%s%d%c%.lf%.lf%.lf\n", stu[i].StudentId, stu[i].StudentName, stu[i].StudentAge, stu[i].StudentSex,
    			stu[i].score[0], stu[i].score[1], stu[i].score[2]);
    	}
    	printf("保存成功!!!\n");
    	fclose(fp);
    	system("pause");
    }
    
    void menu()/* 界面*/
    {
    	int num;
    	printf(" \n\n                    \n\n");
    	printf("  ******************************************************\n\n");
    	printf("  *                学生信息管理系统                    *\n \n");
    	printf("  ******************************************************\n\n");
    	printf("*********************系统功能菜单*************************       \n");
    	printf("     ----------------------   ----------------------   \n");
    	printf("     *********************************************     \n");
    	printf("     * 0.系统帮助及说明  * *  1.刷新学生信息   *     \n");
    	printf("     *********************************************     \n");
    	printf("     * 2.查询学生信息    * *  3.修改学生信息   *     \n");
    	printf("     *********************************************     \n");
    	printf("     * 4.增加学生信息    * *  5.按学号删除信息 *     \n");
    	printf("     *********************************************     \n");
    	printf("     * 6.显示当前信息    * *  7.保存当前学生信息*     \n");
    	printf("     ********************** **********************     \n");
    	printf("     * 8.退出系统        *                            \n");
    	printf("     **********************                            \n");
    	printf("     ----------------------   ----------------------                           \n");
    	printf("请选择菜单编号:");
    	scanf("%d", &num);
    	switch (num)
    	{
    	case 0:help(); break;
    	case 1:flush(); break;
    	case 2:seek(); break;
    	case 3:modify(); break;
    	case 4:insert(); break;
    	case 5:del(); break;
    	case 6:display(); break;
    	case 7:save(); break;
    	case 8:
    		k = 0; 
    		printf("即将退出程序!\n");
    		break;
    	default:printf("请在0-8之间选择\n");
    	}
    }
    

    四.调试、测试以及实验结果
    1.调试:
    在这里插入图片描述
    2.测试:
    输入数据类型与定义时不符合,程序运行过程中会出现错误
    在这里插入图片描述
    3.实验结果:
    (1)~(9)是一个连续的运行实验结果
    (1)运行菜单
    在这里插入图片描述
    (2)添加学生信息
    在这里插入图片描述
    (3)保存学生信息
    在这里插入图片描述

    (4)显示全部信息
    在这里插入图片描述

    (5)修改学生信息
    在这里插入图片描述

    (6)显示修改后全部信息
    在这里插入图片描述

    (7)刷新学生信息
    在这里插入图片描述

    (8)保存学生信息
    在这里插入图片描述

    (9)显示刷新后的全部信息
    在这里插入图片描述
    五、总结:
    编写一个功能齐全的、方便用户操作的学生管理系统,需要长期的实践与积累。
    实践时检验的好办法,学到的知识经过实践的检验,才能更好的被自身吸收。文件的操作的程序编写应用对我来说,是一个没有经过多次实践的问题,所以我在写这部分程序时,还是有些难度。该程序中还存在一个问题就是,当输入一个与定义时不符的数据,程序在运行过程中会出现错误,修改办法还在思考,欢迎大家来与我互相共勉。

    展开全文
  • C语言实现学生信息管理系统

    万次阅读 多人点赞 2019-04-08 14:40:48
    使用C语言对学生管理系统进行优化

    一、题目分析

    对学生信息管理系统,要求完成以下基本任务:

    1. 改写程序为良好程序风格(文档注释,函数注释,语句注释)。
    2. 将功能补充完全(基于文件处理,完成刷新和保存功能)。
    3. 将学生信息改为更好的数据组织,而非离散形式(结构体)。
    4. 可将程序中的不足(如数据验证)等根据自己的能力与理解完成。

    用使用C语言做一个学生信息管理系统,我的想法是先把需要的一些变量封装在结构体中,然后结合以前学过的数据结构知识(链表),做一些增删查改的操作,并将其保存在文件中。

    二、关键算法构造:

    typedef struct score 			//成绩   
    {
         int score_c;				//C语言成绩
         int score_math;			//高等数学成绩
         int score_english;			//大学英语成绩
    }Score;
    
    typedef struct Student  
    {  
       char name[100]; 		//姓名 
       char num[100]; 		//学号  
       char sex;			//性别 (m代表女生f代表男生)  
       int age;				//年龄  
       Score score;			//成绩  
    }stu;  
    
    typedef struct LNode  
    {  
        stu data; 
        struct LNode *next;  
    }LinkList; 
    

    流程图:
    在这里插入图片描述

    三、程序实现:

    #include <stdio.h>   
    #include <malloc.h> 
    #include <string.h> 
    #include <stdlib.h> 
    typedef struct score
    {
    	int score_c;		//C语言成绩
    	int score_math;		//高等数学
    	int score_english;  //大学英语成绩
    }Score;
    typedef struct Student  
    {  
       char name[100]; 		//姓名  
       char num[100];  		//学号  
       char sex;			//性别 (m代表女生f代表男生)  
       int age;				//年龄  
       Score score;			//成绩  
    }stu;  
    typedef struct LNode  
    {  
        stu data;  
        struct LNode *next;  
    }LinkList;
    
    
    char nam[100];//名字  
    char nu[100];//学号  
    char s;//性别  
    int ag;//年龄  
    Score sc;//成绩 
    
    void menu()/* 菜单界面*/
    {
    	 printf("\t\t\t  ******************************************************\n\n");
    	 printf("\t\t\t  *                学生信息管理系统                   * \n\n");
    	 printf("\t\t\t  ******************************************************\n\n"); 
    	 printf("\t\t\t*********************系统功能菜单*************************\n");
    	 printf("\t\t\t     ----------------------   ----------------------  \n");
    	 printf("\t\t\t     *********************************************  \n");
    	 printf("\t\t\t     * 0.系统帮助及说明  * *  1.刷新学生信息   *   \n");
    	 printf("\t\t\t     *********************************************  \n"); 
    	 printf("\t\t\t     * 2.查询学生信息    * *  3.修改学生信息   *   \n");
    	 printf("\t\t\t     *********************************************  \n");
    	 printf("\t\t\t     * 4.增加学生信息    * *  5.按学号删除信息 *   \n");
    	 printf("\t\t\t     *********************************************  \n");
    	 printf("\t\t\t     * 6.显示当前信息    * *  7.保存当前学生信息*   \n");
    	 printf("\t\t\t     ********************** **********************  \n");
    	 printf("\t\t\t     * 8.退出系统        *        \n");
    	 printf("\t\t\t     **********************        \n");
    	 printf("\t\t\t     ----------------------   ----------------------  \n");
    }
    
    void help()/*帮助界面*/
    { 
    	 printf("\n\t\t\t0.欢迎使用系统帮助!\n");
    	 printf("\n\t\t\t1.初次进入系统后,请先选择增加学生信息;\n");
    	 printf("\n\t\t\t2.按照菜单提示键入数字代号;\n");
    	 printf("\n\t\t\t3.增加学生信息后,切记保存;\n");
    	 printf("\n\t\t\t4.谢谢您的使用!\n");
    }
    
    void InitList(LinkList *&L)//初始化链表  
    {  
        L=(LinkList *)malloc(sizeof(LinkList));  
        L->next=NULL;  
    }
    void ListInsert(LinkList *&L,LinkList *p)//插入新的节点  
    {  
        LinkList *q=NULL;  
        q=L;  
        p->next=q->next;  
        q->next=p;  
    }  
    void addstu(LinkList *&L)//增加新的学生  
    {   
        printf("请输入学生的信息:\n");  
        printf("学号:");  
        scanf("%s",nu);  
        LinkList *q=L->next;  
        while(q!=NULL )  //用于判断学生信息是否已经存在
        {  
            if(0==strcmp(q->data.num,nu))  
            {  
                printf("该学生已存在\n");  
                break;  
            }  
            q=q->next;  
        }  
        if(q==NULL)  
        {  
            LinkList *p;  
            InitList(p);  
            strcpy(p->data.num,nu);  
            printf("姓名") ;  
            scanf("%s",nam) ;  
            strcpy(p->data.name,nam);  
            printf("性别:(m为男 f为女)");  
            scanf(" %c",&s);  
            p->data.sex=s;  
            printf("年龄:");  
            scanf("%d",&ag);  
            p->data.age=ag;  
    	 	printf("C语言成绩:");
      		scanf("%d",&sc.score_c); 
      		while(sc.score_c<0||sc.score_c>100)
      		{
                printf("输入有误,请重新输入\n");
       			scanf("%d",&sc.score_c);  
            }
      		p->data.score.score_c=sc.score_c;
      		printf("高等数学成绩:");
      		scanf("%d",&sc.score_math); 
       		while(sc.score_math<0||sc.score_math>100)
       		{
                printf("输入有误,请重新输入\n");
                scanf("%d",&sc.score_math);  
            }
       		p->data.score.score_math=sc.score_math;
      		printf("大学英语成绩:");
      		scanf("%d",&sc.score_english);  
            while(sc.score_english<0||sc.score_english>100)
            {
                printf("输入有误,请重新输入\n");
                scanf("%d",&sc.score_english);  
            }
            p->data.score.score_english=sc.score_english;  
            ListInsert(L,p);  
        }  
    }  
    
    void deletestu(LinkList *L)//删除学生  
    {   
        printf("请输入您要删除的学生的学号:");  
        scanf("%s",nu);  
        //判断  
        LinkList *p,*pre;  
        if(L->next==NULL)  
        {  
            printf("还没有学生信息,请增加学生信息\n");  
            return;  
        }  
        pre=L;  
        p=pre->next;  
        int judge=0;  
        while(p)  
        {  
             if(0==strcmp(p->data.num,nu))  
             {  
                     judge=1;  
                     pre->next =p->next;  
                     free(p);  
                     printf("删除学生成功\n");  
                     break;  
             }  
             pre=p;  
             p=p->next;  
        }  
        if(judge==0)  
           printf("这个学生不存在\n");  
    }  
    
    void changestu(LinkList *L)//改变学生信息  
    {  
    	int judge=0;  
        printf("请输入您要修改学生的学号:\n");  
        scanf("%s",nu);  
        LinkList *q=L->next;  
        while(q!=NULL )  
        {  
            if(0==strcmp(q->data.num,nu))  
            {  
                judge=1;  
                printf("请输入您要修改的信息选项:1.姓名 2. 成绩(c语言,高等数学,大学英语)  3.年龄   \n");  
                int choose;  
                scanf("%d",&choose); 
                switch(choose)  
                {  
                case 1:  
                    	printf("请输入您要修改的名字:");  
                    	scanf("%s",nam);  
                    	printf("修改的名字为:%s\n",nam);  
                    	strcpy(q->data.name,nam);
                    	printf("修改名字成功!\n");  
                    	break;  
                case 2:  
                    	printf("请输入您要修改的成绩");  
                   		scanf("%d%d%d",&sc.score_c,&sc.score_math,&sc.score_english);  
                    	printf("修改的c成绩为:%d  修改的高等数学成绩为:%d  修改的大学英语成绩为:%d\n",sc.score_c,sc.score_math,sc.score_english);  
                   		q->data.score=sc;  
                    	printf("修改成绩成功!\n");  
                    	break;  
                case 3:  
                    	printf("请输入您要修改的年龄:");  
                    	scanf("%d",&ag);  
                    	printf("修改的年龄为:%d\n",ag);  
                   		q->data.age=ag;  
                    	printf("修改年龄成功!\n");  
                    	break;  
                default :  
                    	printf("请输入正确的选项\n");  
                    	break;  
                }  
            }  
            q=q->next;  
        }  
       if(judge==0)  
       {  
         printf("该生不存在\n");  
       }  
    }  
    void findstu(LinkList *L)//按学号或者姓名查找学生并输出该生信息  
    {  
        int flag; 
        printf("1.按学号查询:\n");
        printf("2.按姓名查询:\n");
        printf("请输入查询方式:");
        scanf("%d",&flag); 
        if(flag==1){
            printf("请输入该生学号:"); 
            scanf("%s",nu);  
            //判断  
            LinkList *q=L->next;  
            while(q!=NULL )  
            {  
                if(strcmp(q->data.num,nu)==0)  
                {  
                    printf("姓名:%s\n",q->data.name);  
                    printf("学号:%s\n",q->data.num);  
                    printf("性别:%c\n",q->data.sex);  
                    printf("年龄:%d\n",q->data.age);  
                    printf("c语言成绩:%d\n",q->data.score.score_c); 
        			printf("高等数学成绩:%d\n",q->data.score.score_math); 
        			printf("大学英语成绩:%d\n",q->data.score.score_english); 
                    break;  
                }  
                 q=q->next;  
            }  
            if(q==NULL)  
                printf("该生不存在\n");  
        	}else{
            	printf("请输入该生姓名:");
            	scanf("%s",nam);  
            	LinkList *q=L->next;  
            	while(q!=NULL)  
            	{  
                	if(strcmp(q->data.name,nam)==0)  
                	{  
                    	printf("姓名:%s\n",q->data.name);  
                    	printf("学号:%s\n",q->data.num);  
                    	printf("性别:%c\n",q->data.sex);  
                    	printf("年龄:%d\n",q->data.age);  
                    	printf("c语言成绩:%d\n",q->data.score.score_c); 
        				printf("高等数学成绩:%d\n",q->data.score.score_math); 
        				printf("大学英语成绩:%d\n",q->data.score.score_english);
                    	break;  
                	}  
                 	q=q->next;  
            	}  
            	if(q==NULL)  
                	printf("该生不存在\n");  
        	}
    }  
    void display(LinkList *&L)//浏览全部学生信息  
    {  
        LinkList *q=L->next;  
        if(q==NULL)  
        {  
            printf("还没有学生信息,请增加学生信息\n");  
            return;  
        }  
        while(q)  
        {   
      		printf("姓名:%s\t",q->data.name);  
            printf("学号:%s\t",q->data.num);  
            printf("性别:%c\t",q->data.sex);  
            printf("年龄:%d\t",q->data.age);  
            printf("c语言成绩:%d\t",q->data.score.score_c); 
      		printf("高等数学成绩:%d\t",q->data.score.score_math); 
      		printf("大学英语成绩:%d\n",q->data.score.score_english);
      		q=q->next;  
        }  
    }  
    void sort(LinkList *L)//按学号排序排序 并输出排序后的结果  
    {   
        LinkList *q,*p,*r=L->next;  
        //判断  
        if(r==NULL)  
        {  
            printf("还没有学生信息,请增加学生信息\n");  
            return;  
        }  
        while(r) //两层循环完成排序  
        {  
             p=r;  
             q=r->next;  
             LinkList *tmp;//用于排序时暂存节点  
             InitList(tmp);  
             while(q)  
             {  
                 if(q->data.num < p->data.num)  //学号由小到大
                 {  
                    /*先复制q结点信息到tmp*/  
                    strcpy(tmp->data.num,q->data.num);  
                    strcpy(tmp->data.name,q->data.name);  
                    tmp->data.sex=q->data.sex;  
                    tmp->data.age=q->data.age;  
                    tmp->data.score=q->data.score; 
    				/*再复制p结点信息到q*/  
                    strcpy(q->data.num,p->data.num);  
                    strcpy(q->data.name,p->data.name);  
                    q->data.sex=p->data.sex;  
                    q->data.age=p->data.age;  
                    q->data.score=p->data.score;
    				/*最后复制exchange结点信息到p*/  
                    strcpy(p->data.num,tmp->data.num);  
                    strcpy(p->data.name,tmp->data.name);  
                    p->data.sex=tmp->data.sex;  
                    p->data.age=tmp->data.age;  
                    p->data.score=tmp->data.score;  
                 }  
                  q=q->next;  
             }  
             r=r->next; 
             }
            printf("刷新后的学生信息是:\n");  
        	display(L);  
    }  
    void saveStuDentFile(LinkList * &L)//保存学生信息到文件  
    {  
        FILE *fp;  
        LinkList *p=L->next;  
        if((fp=fopen("student.txt","w"))==NULL)// 以可写的方式打开当前目录下的.txt  
        {  
            printf("不能打开此文件,请按任意键退出\n");  
            exit(1);  //异常退出
        }  
        while(p)  
        {  
            fprintf(fp,"%s  %s  %c  %d  %d %d %d \n",p->data.num,p->data.name,p->data.sex,p->data.age,p->data.score.score_c,p->data.score.score_math,p->data.score.score_english);  
            p=p->next;  
            printf("保存成功\n");  
        }  
        fclose(fp);  
    }  
    
    void readStuDentput (LinkList *&L) //运行前把文件内容读取到电脑内存  
    {  
        FILE *fp;  
        fp=fopen("student.txt","rb"); //以只读方式打开当前目录下的.txt  
        if(fp==NULL)  
        {  
            printf("文件不存在\n");  
            exit(0);                   //终止程序  
        }  
        int i=0;  
        while(!feof(fp))  
        {  
            char nu[100];//学号  
            char nam[100];//名字 
            char s;//性别  
            int ag;//年龄  
            score sc;//成绩  
            fscanf(fp," %s %s %c %d %d %d %d",nu,nam,&s,&ag,&sc.score_c,&sc.score_math,&sc.score_english);
            i++;  
        }  
        fclose(fp);  
        FILE *FP;  
        FP=fopen("student.txt","rb"); //以只读方式打开当前目录下的.txt  
        if(FP==NULL)  
        {  
            printf("无法打开文件\n");  
            exit(0); //终止程序  
        }  
        int b=i-1;  
        int j=1;  
            while(!feof(FP))  
            {  
                fscanf(FP,"%s %s %c %d %d %d %d",nu,nam,&s,&ag,&sc.score_c,&sc.score_math,&sc.score_english);  
                LinkList *n=(LinkList *)malloc(sizeof(LinkList));  
                strcpy(n->data.num,nu);//把后者的内容拷贝到前者中  
                strcpy(n->data.name,nam);//把后者的内容拷贝到前者中  
                n->data.sex=s;  
                n->data.age=ag;  
                n->data.score=sc;  
                ListInsert(L,n);//插入新的节点  
                n=n->next;  
                if(j==b)  
                   break;  
                j++;  
            }  
        fclose(FP);    //关闭文件  
    }  
    
    int main()  
    {       
    	LinkList *L;  
        InitList(L);  
        readStuDentput (L);   //运行前把文件内容读取到电脑   
        int choose;  
        while(1)  
        {  
      		printf("\n");
            menu();     //功能菜单 
      		printf("请输入您的选择:\n"); 
            scanf("%d",&choose);  
            switch(choose)  
            {  
            case 0://系统帮助及说明
       			help();
       			break; 
            case 1://刷新信息(按学号排序)
       			sort(L);
       			break;
      		case 2: //查询学生信息
                findstu(L);  
                break;  
            case 3://修改学生信息  
       			changestu(L); 
                break; 
      		case 4://增加学生信息  
                addstu(L); 
                break; 
     		case 5://删除学生信息  
                deletestu(L);  
                break;  
            case 6://输出所有学生的信息  
                display(L);  
                break; 
            case 7://保存学生信息到文件   
                saveStuDentFile(L);  
                break;
      		case 8://退出  
                printf("谢谢使用!");  
                exit(0);        
            default:  
                printf("请输入正确的选择\n");  
                break;  
            }  
        } 
     	return 0;
    }  
    

    四、调试、测试、及运行结果

    运行结果:
    帮助界面:
    在这里插入图片描述
    刷新:(按学号排序)
    在这里插入图片描述
    查询
    在这里插入图片描述
    修改:
    在这里插入图片描述
    增加:
    在这里插入图片描述
    删除:
    在这里插入图片描述
    显示:
    在这里插入图片描述
    保存:
    在这里插入图片描述
    退出:
    在这里插入图片描述

    五、经验归纳

    这次上机的任务是学生信息管理系统。编写代码的过程中,利用了学习过的链表等知识,将学生信息管理系统通过链表进行了重写。复习了链表的知识和C语言的文件操作。

    文件操作标准库函数有:
          文件的打开操作 fopen 打开一个文件
          文件的关闭操作 fclose 关闭一个文件
          文件的读写操作 fgets 从文件中读取一个字符串
                  fputs 写一个字符串到文件中去
                  fprintf 往文件中写格式化数据
                  fscanf 格式化读取文件中数据
       文件状态检查函数 feof 文件结束

    说明:上述代码均能够在dev C++编译器中运行,VS系列编译器暂不知到。2019/12/29更新。

    展开全文
  • 学生信息管理系统

    2019-04-06 16:40:02
    学生信息管理系统 一.题目内容 对例1的学生信息管理系统,要求完成以下基本任务: 1.改写程序为良好程序风格(文档注释,函数注释,语句...这次的程序是关于一个学生信息管理系统,它的菜单里有8个选项功能,基...
  • C#学生信息管理系统

    千次阅读 2020-02-29 08:59:21
    题目:学生信息管理系统 语言和环境 语言:C#,WinForms 环境:Visual Studio 2010,SQL Server 2008 实现目标 某学校要实现班级学生信息管理,要求使用.NET WinForms技术完成一个班级学生信息管理系统的开发,...
  • C++学生信息管理系统

    千次阅读 多人点赞 2019-11-06 11:20:30
    我大一时,使用C++写了一个简单的学生管理系统,主要是为了完成老师布置的课程设计。现在又快到那个验收课程设计的时候了,现在分享给大家。如果你要的是用C写的代码,这个也是可以参考的,你可以自己进行修改成C的...
  • 学生信息管理系统(Java+JSP)

    万次阅读 多人点赞 2019-01-23 13:33:38
    简易的学生信息管理系统(含源码)
  • Java学生信息管理系统源码

    千次阅读 2019-12-24 11:24:10
    学生信息管理系统 功能说明 学生信息管理,包括学生、班级、院系、课程、成绩等的管理。 本程序仅供学习食用。 工程环境 JDK IntelliJ IDEA MySQL 运行说明 1、安装JDK。 2、导入SQL脚本并配置。 使用...
  • 学生信息管理系统 asp

    热门讨论 2009-11-12 01:24:32
    摘 要 随着高校规模的不断扩大,学生数量急剧增加,有关学生...第五章 学生信息管理系统测试 52 § 5.1 试环境 52 § 5.2 试目的和目标 52 § 5.3 选课测试 52 § 5.4 成绩录入测试 57 结 论 59 参考文献 60 致 谢 61
  • 学生信息管理系统,要求完成以下基本任务: 1.改写程序为良好程序风格(文档注释,函数注释,语句注释)。 2.将功能补充完全(基于文件处理,完成刷新和保存功能)。 3.将学生信息改为更好的数据组织,而非离散...
  • 基于C语言的学生信息管理系统

    千次阅读 2019-04-29 21:11:52
    基于C语言的学生信息管理系统 一、系统需求与功能分析 1.1 系统需求分析 (1) 能完成学生信息的录入,插入、修改、删除、输出、查询等功能; (2)采用单链表存储结构实现; (3) 所有数据以外部文件方式保存。 ...
  • Java实训项目:GUI学生信息管理系统(2017)

    万次阅读 多人点赞 2018-02-19 08:39:32
    Java实训项目:GUI学生信息管理系统(2017) 实训目的:让学生综合运用J2SE有关知识开发【学生信息管理系统】。主要涉及程序控制结构、面向对象编程、图形用户界面、Java数据库应用、MySQL数据库这几个方面的内容。...
  • 基于SSM的学生信息管理系统(选课)

    万次阅读 多人点赞 2019-04-15 19:40:52
    项目简介: 由SpringMVC+MyBatis为主要框架,mysql8.0配置主从复制实现...在添加修改相关功能时通过ajax来验证其主键是否存在可用。代码层次清晰,输入框约束较高,已配置登录拦截。 一、应用技术 工具:e...
  • PHP+MySQL 实现数据库增删改查,学生信息管理系统

    万次阅读 多人点赞 2019-10-28 16:46:20
    通过学生信息管理系统,熟悉PHP+MySQL增删改查,本文介绍了学生信息管理系统。 此项目运行环境:Apache2.4.41 PHP7.3.8 查看演示 http://39.105.0.128/PHP/php_mysql_student/ 项目地址 ...
  • 基于Java的学生信息管理系统

    千次阅读 2019-07-18 16:21:45
    学生信息管理系统 描述:通过java语言,设计一个学生信息管理系统。 要求: 1. 实现基本的增删改查功能 2. 采用面向对象思维 3. 在考虑到代码的可读性的前提下,尽可能多的实现封装 4. 设计初始化交互界面 一...
  • Java实现学生信息管理系统

    万次阅读 多人点赞 2021-03-28 11:12:43
    学生信息管理系统,要求完成以下基本任务: 1.有良好程序风格(文档注释,函数注释,语句注释)。 2.将功能补充完全(基于文件处理,完成刷新和保存功能)。 3.将学生信息改为更好的数据组织,而非离散形式...
  • 学生信息管理系统需求规格

    千次阅读 2019-10-28 21:24:08
    学生信息管理系统需求规格 桂林理工大学 软件工程 评审日期: 2019 年 9 月 26日 目录 目录 1.导言 5 1.1 编写目的 5 1.2 项目范围 5 1.3 参考资料 5 1.4 版本更新信息 6 2.项目介绍 6 2.1 项目背景 6 2.2 项目...
  • C语言:学生信息管理系统(详解+源码)

    万次阅读 多人点赞 2020-05-30 21:56:40
    /* 主要方式 :结构体、链表和文件读取结合 功能模块 : 1、用户界面,给予用户更好的视觉体验 2、录入信息,通过链表开辟内存空间进行录入学生的基本信息 ... 7、查询信息,按照学号查询指定学生信息
  • c++实现文件实现学生信息管理系统

    万次阅读 多人点赞 2018-09-06 21:43:51
    c++实现文件实现学生信息管理系统 功能如下: 添加学生信息(学生添加完成将直接保存进文件) 成绩信息(c语言,大学英语,高等数学) 个人信息(姓名、性别、学号、年龄) 显示学生信息 查询学生信息 按学号...
  • 学生信息管理系统总结

    万次阅读 热门讨论 2017-07-25 11:38:40
    学生信息管理系统总算初步告一段落了,个人认为这个程序经典,为以后的学习奠定了坚实的基础,它淋漓尽致的体现了我们生活中离不开的基本功能,它让我学到了很多。它时不时的会出现一堆BUG,让我找到它的根本原因,...
  • c++学生信息管理系统

    千次阅读 多人点赞 2020-02-19 10:33:34
    c++学生信息管理系统 引言 这是我写的第一篇博客,是关于一个小的c艹课程设计,其中还有许多不足的地方,例如我使用的是UTF-8编码,但输出中文还是会有乱码的情况;还有就是从文件读出和存入是无法控制格式,以及我...
  • 2. 添加学生信息功能 3. 学生姓名列表 4. 所有学生详细列表功能 5. 按姓名查找功能 6. 按年龄查找功能 7. 按姓别查找功能 8. 按身高查找功能 9. 删除学生信息功能 10. 退出功能 /* *1. 菜单功能 *2. ...
  • 学生信息管理系统(结构化程序)(C语言)

    千次阅读 多人点赞 2019-04-12 21:52:04
    学生信息管理系统(结构化程序)(C语言) 一、实验目的 明确结构化程序设计的基本结构。 2.通过对问题的分析,设计合理的结构化程序解决问题 二、实验内容 对学生信息管理系统,要求完成以下基本任务: 1.改写...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 45,707
精华内容 18,282
关键字:

学生信息管理系统的功能测试