基于C#+SQL Server(WinForm)学生选课及成绩查询管理系统【100010027】

news2024/11/20 1:40:29

学生选课及成绩查询管理系统的设计与开发

1、项目背景

学生选课及成绩查询系统是一个学校不可缺少的部分,传统的人工管理档案的方式存在着很多的缺点,如:效率低、保密性差等,所以开发一套综合教务系统管理软件很有必要,它应该具有传统的手工管理所无法比拟的优点,如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大的提高学校的管理效率,有助于推进学校的信息化建设。

2、技术选型

C#的窗体程序开发

本系统未采用C#实现MDI——多文档窗口,因为考虑到C#的该技术与java类似,而暑期java实训时,曾用过类似的方法做过停车场管理系统,所以想为这次的系统注入一点新鲜的血液,所以本系统设计的主题采用了了C#的C#TreeView 实现。

Sql server数据库

3、需求分析

本系统包括两类用户:学生、管理员。管理员可以通过系统来添加管理员信息、修改管理员信息、添加学生信息、修改学生信息;开设课程、查询课程、录入成绩、统计成绩、修改成绩、修改个人密码等,而学生则可以通过系统来选择课程、查询课程、显示自己的课表、查询自己的成绩单、修改个人密码等等。

3.1系统实现的功能流程

在这里插入图片描述

具体的功能概述如下:

3.2管理员角色拥有的功能

管理员信息管理

添加管理员信息;

管理员可以添加其他的管理员信息。

修改管理员信息;

管理员可以删除其他的管理员信息。

学生信息管理

添加学生信息;

管理员可以添加学生信息,这些信息包括学生的学号,密码,年级,专业,出生日期等等。

修改学生信息;

管理员可以修改学生的信息;

课程管理

开设课程;

管理员可以录入课程信息,学生就可以浏览到这些课程信息,从而选课。

查询课程;

可以通过学期查询课程,或通过学期和课程结合的方式查询课程。

成绩管理

录入成绩;

管理员可以录入学生的成绩。

统计成绩;

管理员可以通过学期和课程信息来统计某门课的学生成绩,平均分、最高分、最低分以及可以通过成绩区间来查询某个学期某门课的学生的成绩信息。并且可以实现排序功能。

修改成绩;

管理员可以对成绩出错的学生的成绩进行修改。

修改个人密码;

管理员可以修改自己的密码。

3.3学生角色拥有的功能

课程管理

选择课程;

学生可以根据本学期管理员发布的课程来选课。

查询课程;

可以通过学期查询课程,或通过学期和课程结合的方式查询课程。

显示课表;

学生可以根据自己的选课情况来查询自己的课表。

成绩管理

我的成绩单;

学生可以根据学期来查询自己某个学期所有选修课程的成绩信息。

修改个人密码;

学生可以修改自己的密码。

4、数据库设计

4.1数据库关系图

在这里插入图片描述

4.2完成系统中数据表的结构设计

学生信息表
在这里插入图片描述

管理员信息表

在这里插入图片描述

课程表

在这里插入图片描述

课程细节表

在这里插入图片描述

选课表

在这里插入图片描述

5、界面设计

登录界面:
在这里插入图片描述

5.1管理员角色

管理员主界面:
在这里插入图片描述

管理员-------添加管理员界面:
在这里插入图片描述

管理员——修改管理员界面:
在这里插入图片描述

管理员——开设课程界面:
在这里插入图片描述

管理员——查询课程界面:
在这里插入图片描述

管理员——录入成绩界面:
在这里插入图片描述

管理员——统计成绩页面:
在这里插入图片描述

管理员——修改成绩界面:
在这里插入图片描述

管理员——添加学生信息界面:
在这里插入图片描述

管理员——修改学生信息界面:
在这里插入图片描述

管理员——修改密码界面:
在这里插入图片描述

5.2学生界面

学生登录主界面:
在这里插入图片描述

学生——选择课程界面:
在这里插入图片描述

学生——查询课程界面:
在这里插入图片描述

学生——显示课表界面:
在这里插入图片描述

学生——我的成绩单:
在这里插入图片描述

学生——密码修改界面:

在这里插入图片描述

6、关键技术的介绍

6.1使用treeview实现点击不同的选项,在右侧面板中显示不同的界面。

具体代码如下:

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
           switch (this.treeView1.SelectedNode.Text)
            {
              case"录入成绩":
                    Form2 f = new Form2();
                 f.TopLevel = false;
                 f.FormBorderStyle = FormBorderStyle.None;
                 f.WindowState = FormWindowState.Maximized;
                 panel2.Controls.Add(f);
                 f.Show();
                 break;
              case"我的成绩单":
                 searchgradeForm f1 = new searchgradeForm();
                 f1.TopLevel = false;
                 f1.FormBorderStyle = FormBorderStyle.None;
                 f1.WindowState = FormWindowState.Maximized;
                
                 panel2.Controls.Add(f1);
                 f1.Show();
                 break;
              case"统计成绩":
                 countForm f2 = new countForm();
                 f2.TopLevel = false;
                 f2.FormBorderStyle = FormBorderStyle.None;
                 f2.WindowState = FormWindowState.Maximized;
                
                 panel2.Controls.Add(f2);
                 f2.Show();
                 break;
              case"开设课程":
                 kaisheForm f3 = new kaisheForm();
                 f3.TopLevel = false;
                 f3.FormBorderStyle = FormBorderStyle.None;
                 f3.WindowState = FormWindowState.Maximized;
                
                 panel2.Controls.Add(f3);
                 f3.Show();
                 break;
              case"选择课程":
                 chooseForm f4 = new chooseForm();
                 f4.TopLevel = false;
                 f4.FormBorderStyle = FormBorderStyle.None;
                 f4.WindowState = FormWindowState.Maximized;
                 
                 panel2.Controls.Add(f4);
                 f4.Show();
                 break;
              case"查询课程":
                 searchclassForm f5 = new searchclassForm();
                 f5.TopLevel = false;
                 f5.FormBorderStyle = FormBorderStyle.None;
                 f5.WindowState = FormWindowState.Maximized;
                
                 panel2.Controls.Add(f5);
                 f5.Show();
                 break;
              case"添加管理员信息":
                 addmanForm f6 = new addmanForm();
                 f6.TopLevel = false;
                 f6.FormBorderStyle = FormBorderStyle.None;
                 f6.WindowState = FormWindowState.Maximized;
                
                 panel2.Controls.Add(f6);
                 f6.Show();
                 break;
              case"修改管理员信息":
                 modifymanForm f7 = new modifymanForm();
                 f7.TopLevel = false;
                 f7.FormBorderStyle = FormBorderStyle.None;
                 f7.WindowState = FormWindowState.Maximized;
                
                 panel2.Controls.Add(f7);
                 f7.Show();
                 break;
              case"添加教师信息":
                 addteacForm f8 = new addteacForm();
                 f8.TopLevel = false;
                 f8.FormBorderStyle = FormBorderStyle.None;
                 f8.WindowState = FormWindowState.Maximized;
                
                 panel2.Controls.Add(f8);
                 f8.Show();
                 break;
              case"修改教师信息":
                 modifyteacForm f9 = new modifyteacForm();
                 f9.TopLevel = false;
                 f9.FormBorderStyle = FormBorderStyle.None;
                 f9.WindowState = FormWindowState.Maximized;
                
                 panel2.Controls.Add(f9);
                 f9.Show();
                 break;
              case"添加学生信息":
                 addstuForm f10 = new addstuForm();
                 f10.TopLevel = false;
                 f10.FormBorderStyle = FormBorderStyle.None;
                 f10.WindowState = FormWindowState.Maximized;
                
                 panel2.Controls.Add(f10);
                 f10.Show();
                 break;
              case"修改学生信息":
                 modifystuForm f11 = new modifystuForm();
                 f11.TopLevel = false;
                 f11.FormBorderStyle = FormBorderStyle.None;
                 f11.WindowState = FormWindowState.Maximized;
                
                 panel2.Controls.Add(f11);
                 f11.Show();
                 break;
              case"关于":
                 aboutForm f12 = new aboutForm();
                 f12.TopLevel = false;
                 f12.FormBorderStyle = FormBorderStyle.None;
                 f12.WindowState = FormWindowState.Maximized;
                
                 panel2.Controls.Add(f12);
                 f12.Show();
                 break;
              case "退出系统":
                 Application.Exit();
                 break;
              case "显示课表":
                 showkebiaoForm f13 = new showkebiaoForm();
                 f13.TopLevel = false;
                 f13.FormBorderStyle = FormBorderStyle.None;
                 f13.WindowState = FormWindowState.Maximized;
                 panel2.Controls.Add(f13);
                 f13.Show();
                 break;

              case "修改密码":
                 modifymimaForm f14 = new modifymimaForm();
                 f14.TopLevel = false;
                 f14.FormBorderStyle = FormBorderStyle.None;
                 f14.WindowState = FormWindowState.Maximized;
                 panel2.Controls.Add(f14);
                 f14.Show();
                 break;
              case "修改成绩":
                 modifygradeFram f15 = new modifygradeFram();
                 f15.TopLevel = false;
                 f15.FormBorderStyle = FormBorderStyle.None;
                 f15.WindowState = FormWindowState.Maximized;
                 panel2.Controls.Add(f15);
                 f15.Show();
                 break;
             }
        }

6.2在其他的窗口得到在登录窗口输入的信息

实现方法:在loginFram中设置两个方法,在其他类中只需要引用loginFram的这些方法即可。具体实现如下:

public static  String getStudent()
        {
            String stuxuehao = "";
            stuxuehao = loginForm.name;
            return stuxuehao;
        }

public static String getRole()
        {
            String role1 = "";
            role1 = role;
            return role1;
        }

6.3管理员开设课程时,对于同一时间该教室有课的情况怎么做出异常处理。集体实现如下:

private void button1_Click(object sender, EventArgs e)
        {
            string teacher = textBoxteacher.Text;
            string classes =   textBoxclass.Text;
            string term =  comboBoxterm.SelectedItem.ToString();
            string flags = "1";
            SqlConnection conn = new SqlConnection(loginForm.connectionString);
            conn.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            //将开课信息插入到开课表里
            
            //MessageBox.Show("开设课程成功!");
            string sql = "";
            //得到上课的地点
            string didian = comboBoxdidian.SelectedItem.ToString();
            //checkedListBoxtime

            for (int i = 0; i < checkedListBoxtime.Items.Count; i++)
            {
                if (checkedListBoxtime.GetItemChecked(i))
                {
                   String time = checkedListBoxtime.GetItemText(checkedListBoxtime.Items[i]);
                    sql = "select * from sctime where sctime = '" + time + "'and location = '" + didian + "'";
                    SqlDataAdapter adp = new SqlDataAdapter(sql, conn);
                    DataSet ds = new DataSet();
                    adp.Fill(ds);
                    if (ds.Tables[0].Rows.Count > 0)
                    {
                        flags = "2";
                        MessageBox.Show("该时间该教室已经有课!");
                        break;
                    }
                    else
                    {
                        flags = "1";
                        break; 
                    }
                }
            }

            if (flags == "1")
            {
                sql = "insert into class (claname,term,teacher) values ('" + classes + "','" + term + "','" + teacher + "')";
                cmd.CommandText = sql;
                cmd.ExecuteNonQuery();



                for (int i = 0; i < checkedListBoxtime.Items.Count; i++)
                {
                    if (checkedListBoxtime.GetItemChecked(i))
                    {
                        string time = checkedListBoxtime.GetItemText(checkedListBoxtime.Items[i]);
                        //将开课表的id得到
                        sql = "select claid from class where claname = '" + classes + "' and term = '" + term + "' and teacher = '" + teacher + "'";
                        cmd.CommandText = sql;
                        String id1 = cmd.ExecuteScalar().ToString();
                        int id = 0;
                        int.TryParse(id1, out id);
                        sql = "insert into sctime values(" + id + ",'" + time + "','" + didian + "')";
                        cmd.CommandText = sql;
                        cmd.ExecuteNonQuery();
                    }
                }
                MessageBox.Show("开设课程成功!");
            }
   
            conn.Close();
        }

6.4学生选择课程时,对选择一门课程与已选择的课程出现上课时间冲突的情况的异常处理。集体实现如下:

private void button1_Click(object sender, EventArgs e)
        {
            string flags = "1";
            //得到stuid
            string stuxuehao = textBox1.Text;
            SqlConnection conn = new SqlConnection(loginForm.connectionString);
            conn.Open();
            string sql = "select stuid from student where stuxuehao = '" + stuxuehao + "'";
            SqlCommand cmd = new SqlCommand(sql, conn);
            String id1 = cmd.ExecuteScalar().ToString();
            
            int.TryParse(id1, out stuid);
            //得到课程的id
            int claid = 0;
            int.TryParse(textBoxid.Text, out claid);
            //查询你在该时间是否有课
            sql = "select sctime from sctime where claid =" + claid;
            SqlDataAdapter adp = new SqlDataAdapter(sql, conn);
            DataSet ds = new DataSet();
            adp.Fill(ds);
            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                DataRow dr = ds.Tables[0].Rows[i];
                string time = dr[0].ToString();//第一列
                sql = "select * from sc,sctime,class where class.claid = sc.claid and class.claid = sctime.claid and sctime = '" + time + "' and sc.stuid =" + stuid;
                SqlDataAdapter adp1 = new SqlDataAdapter(sql, conn);
                DataSet ds1 = new DataSet();
                adp1.Fill(ds1);
                if (ds1.Tables[0].Rows.Count > 0)
                {
                    flags = "2";
                    MessageBox.Show("课程上课时间冲突!");
                    break;
                }
            }
            if (flags == "1")
            {
                sql = "insert into sc(claid,stuid) values(" + claid + "," + stuid + ")";
                cmd.CommandText = sql;
                if (cmd.ExecuteNonQuery() > 0)
                {
                    MessageBox.Show("选课成功!");

                }

            }
            if (listBox1.Items.Count > 0)
            {//清空所有项
                listBox1.Items.Clear();
            }
            sql = "select class.claname  from sc,class where sc.claid = class.claid and stuid=" + stuid;
            SqlDataAdapter adp2 = new SqlDataAdapter(sql, conn);
            DataSet ds2 = new DataSet();
            adp2.Fill(ds2);
            foreach (DataRow row in ds2.Tables[0].Rows)
            {
                listBox1.Items.Add(row[0].ToString());
            }            
          conn.Close();
        }

7、系统测试

7.1怎么提高访问数据库的速度

改进方法:引入视图、触发器、函数、存储过程,优化表结构,建立索引。

8、完成情况总结

通过几周的努力,从前期的需求分析与架构设计到实际的编码阶段,我完成了学生选课及成绩管理系统的开发与设计。已经大致完成了主要的功能,不过还有一些亟待完善的方面,例如对数据的存储采用加密的措施,UI设计并不是很出色等等,这些问题都需要我再以后的时间里去慢慢弥补,还有刚开始,我对treeview并不熟悉,所以先建立了几个原型来测试,领会了treeview的使用方法后才切入正题进行开发。

在这开发的过程中,我收获很大,相比前几次的开发,我真正重视起测试在软件开发中的作用,在软件开发的后期,我专门建立一个bug列表,将出现的bug详细记录在列表中,并在软件调试的后期对照列表认真改进软件,考虑以后使用软件来做相关方面的管理。当然,我也遇到不少代码编写的问题,有时要花较长的时间来解决问题,这也是自己平时编写代码较少的原因。通过这次软件的开发,在编写代码上有了一定的提高,同时也知道了软件开发过程中需要注意的问题。比如,开发逻辑思维要清晰,不然可能会把问题想的复杂化。平时多和项目成员交流,这样你才能知道自己的想法有那些出入,利于软件的开发。

通过这次实验,使我对软件开发有了更深一步的了解。在软件开发中应注意的问题和考虑的问题都能较好的做到。

♻️ 资源

在这里插入图片描述

大小: 3.93MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87248117

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shell基础

获取命令结果$? 如果上一个命令是成功的则结果为0 否则为127 结果是 www.qfdu.com is down! EOF使用 sh 其实是bash的一个链接&#xff0c;本质上还是执行bash 然后脚本第一句表示使用什么执行器&#xff0c;如果写的是python但是你执行的时候不指定python会报错&#x…

Linux安装Mysql(图文解说详细版,安装包tar包版)

上次教大家用yum安装mysql https://blog.csdn.net/csdnerM/article/details/121095527&#xff0c; 结果还要小伙伴不知道tar包怎么安装&#xff0c;现在出个tar包安装的教程出来供大家参考 文章目录&#x1f3e2;1.官网下载tar包&#xff08;安装包&#xff09;&#x1f3e3;…

多个著名 Go 开源项目被放弃,做大开源不能用爱发电,更不能只靠自己!

大家好&#xff0c;我是煎鱼。相信关注我的许多同学都有接触 Go 语言的开发&#xff0c;甚至在企业中多有实践。那么你在日常开发中&#xff0c;势必会接触到 gorilla[1] 组织下的各个 Go 开源项目。如下图&#xff1a;gorilla/mux[2]&#xff1a;Star&#xff1a;17.9k。a pow…

VMWare复制CentOS虚拟机后无法联网

1. 现象描述 原来使用一个 CentOS 虚拟机&#xff0c;这里叫 CentOS_1。网络配置如下&#xff1a;VMWare软件设置 NAT 模式&#xff0c;虚拟机配置 DHCP 自动获取 IP &#xff0c;开机启动网络。可以正常联网 现在要重新配置一个虚拟机&#xff0c;环境同 CentOS_1。因此我直…

视频恢复软件哪个好用?推荐这几款恢复率高的软件

如果你意外删除了电脑保存的视频文件&#xff0c;无论是单击回收站“还原”还是通过电脑系统备份“还原”&#xff0c;它都无法恢复。如何解决这个问题&#xff1f;此时&#xff0c;你需要寻求文件删除恢复软件的帮助&#xff0c;推荐下面这几款恢复率高的视频恢复软件。如何操…

安卓讲课笔记6.3 使用SQLite数据库

文章目录零、本讲学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;SQLite数据库1、SQLite构成2、SQLite数据类型3、SQLite数据库特点&#xff08;二&#xff09;使用SQLiteDatabase类操作数据库1、创建安卓应用2、准备图片素材3、字符串资源文件4、主布局资源文件5…

0停机迁移Nacos?Java字节码技术来帮忙

摘要&#xff1a;本文介绍如何将Spring Cloud应用从开源Consul无缝迁移至华为云Nacos。本文分享自华为云社区《0停机迁移Nacos&#xff1f;Java字节码技术来帮忙》&#xff0c;作者&#xff1a;华为云PaaS服务小智。 1.市场迁移云环境痛点 市场微服务迁移云环境难主要有以下几…

[ MySQL ] 使用Navicat进行MySQL数据库备份 / 还原(Part 2:备份.sql文件方式)

本文主要讲解如何用Navicat&#xff08;Navicat Premium &#xff0c;或者Navicat for mysql&#xff09;进行MySQL备份和恢复数据库&#xff08;利用.sql文件的方式&#xff09;。 关于MySQL数据库备份&#xff0c;本博客内主要相关文章有&#xff1a; [ MySQL ] 使用Navica…

兔子来源中性粒细胞膜

兔子来源中性粒细胞膜 1.按组成元素分 构成细胞膜的成分有磷脂&#xff0c;糖蛋白&#xff0c;糖脂和蛋白质。 2.按组成结构分 磷脂双分子层是构成细胞膜的基本支架。细胞膜的主要成分是蛋白质和脂质&#xff0c;含有少量糖类。其中部分脂质和糖类结合形成糖脂&#xff0c;部分…

“你家娃为什么这么爱看书?”只用3招,孩子秒变小书迷

我儿子从幼儿园带回来一个消息&#xff0c;说班上所有的孩子都在老师那里订课外书。我儿子立即向老师解释说&#xff1a;我不需要买书。我妈妈给我买了很多书。我家里有很多书。我每天都读。家长群里有家长艾特问我的孩子为什么这么喜欢读书。为什么孩子们喜欢读书&#xff0c;…

作业12:第七章课后题

目录习题7-1 在小批量梯度下降中&#xff0c;试分析为什么学习率要和批量大小成正比习题7-2 在Adam算法中&#xff0c;说明指数加权平均的偏差修正的合理性习题7-9 证明在标准的随机梯度下降中&#xff0c;权重衰减正则化和L_{2}正则化的效果相同.并分析这一结论在动量法和Adam…

【Vue2+Element ui通用后台】左侧菜单实现

文章目录主体布局搭建左侧菜单搭建左侧菜单跳转主体布局搭建 我们在 Container 布局容器&#xff0c;找到有左侧、头部、和主体部分的布局&#xff0c;直接复制代码到 Main.vue 中&#xff1a; <template><div><el-container><el-aside width"200p…

「从零入门推荐系统」06:推荐系统召回算法介绍

作者 | gongyouliu编辑 | gongyouliu我们在前面几章中介绍了推荐系统的一些基本概念&#xff0c;从本章开始我们会进入推荐系统的核心章节&#xff0c;也就是关于推荐算法部分的介绍。我们在第五章「推荐系统业务流程与架构」中讲到推荐系统一般会分为召回和排序两个阶段&#…

ADI Blackfin DSP处理器-BF533的开发详解38:图像处理专题-Sobel 算子边缘检测(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了 Sobel 算子的图像边缘检测&#xff0c;代码运行时&#xff0c;会通过文件系统打开工程文件根目下" …/ImageView"…

Java集合和常见数据结构以及泛型

Java集合和常见数据结构以及泛型集合概述Collection集合的体系特点Collection集合常用APICollection集合的遍历方式方法一&#xff1a;迭代器方法二&#xff1a;foreach/增强for循环方法三&#xff1a;lambda表达式Collection集合存储自定义类型的对象常见数据结构数据结构概述…

PDF格式如何转成Excel?这篇文章教会你如何转换

不知道在日常的办公中&#xff0c;大家有没有碰到过这样一个问题&#xff1a;当领导给你发个PDF文件后&#xff0c;要求你尽快的将PDF文件中的表格数据进行修改&#xff0c;但当你把PDF转换成Excel格式后&#xff0c;发现转换后的文件排版格式错乱的。可是截止时间的压迫和乱七…

[附源码]Python计算机毕业设计大学生日常行为评分管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

Python输出文字改变颜色

# Python输出文字改变颜色的方法 一、使用注释性输出 &#xff08;一&#xff09;、基本语法 \033[显示方式; 前景色; 背景色m******\033[0m 显示方式、前景色、背景色都为可选参数&#xff0c;选择自己需要的即可&#xff0c;而且顺序可变非固定&#xff0c;但建议按照默认顺…

Openlayers 自定义投影坐标系数据转换以及在线转换工具

Openlayers 自定义投影坐标系数据转换以及在线转换工具OpenLayers 教程查看 EPSG 码和定义Openlayers 自定义投影坐标系数据转换以及在线转换工具在线示例OpenLayers 教程 工作中经常会遇到转换坐标的情况&#xff0c;一般都会写代码搞定&#xff0c;但是有时候只需要查看一下…

web前端期末大作业:基于HTML+CSS+JavaScript汽车租赁网站(47页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…