精华内容
下载资源
问答
  • 学生管理系统设计(数据库连接C#版)

    万次阅读 多人点赞 2017-12-02 21:02:52
    目录 一.课程设计说明 1 1.1项目概述 1 1.2设计任务和要求 1 1.3开发环境说明 1 二....2.1项目介绍 2 2.2数据需求分析 2 三.概念结构设计 3 ...3.2数据库设计 5 ...4.1学生信息管理系统 12 4.2学生信息查询 12

    目录
    一.课程设计说明 1
    1.1项目概述 1
    1.2设计任务和要求 1
    1.3开发环境说明 1
    二.需求分析阶段 1
    2.1项目介绍 2
    2.2数据需求分析 2
    三.概念结构设计 3
    3.1E-R图 4
    3.2数据库设计 5
    3.3数据字典 8
    四.用户界面设计 11
    4.1学生信息管理系统 12
    4.2学生信息查询 12
    4.3教师查询 12
    4.4管理员查询 12
    4.5专业负责人查询 13
    五.程序设计 14
    六.运行结果 28
    七.总结

    一.课程设计说明

    1.1项目概述:
    学生管理系统
    一所大学希望建立一个数据库以便对学生进行管理。当一个学生进入学校时,他就会选择一个专业。每个学生也会指定一个指导老师。每个专业每年由一些课程组成。组成专业的课程的最小和最大数目分别是6和8。一般情况下给一个学生三次机会来通过这门课程的考试。有些特殊的课程可以在一个或多个专业中存在。大学可以有几个部门,每个部门都有一个部门负责人,每个课程都会分配一定数量的员工(称为课程合作人)来负责课程的教学
    1.2设计任务与要求
    建立数据库,来完成对学生进行管理的目的,要求要按照题目设定,包括学生、教师、管理员的学生管理系统的设计与开发。

    1.3开发环境说明
    采用SQL SERVER和Visual Studio 来进行系统开发。
    二.功能需求分析阶段
    2.1项目介绍
    学生管理系统在学生方面,新生在校注册,注册时选择专业,从而学校分配指导教师完成在校学习的课程,学生也可通过学生管理系统查询个人信息,包括个人选修课信息,考试信息等。
    在教师方面,教师可以通过学生管理系统查询任教的课程信息,以及对学生的考试成绩的录入。
    在管理员方面,管理员可以通过管理员权限查询、增加、删除、修改所有信息。
    2.2数据需求分析

    这里写图片描述
    总结如下:
    这里写图片描述
    2.3数据处理与任务需求
    下面列出的是学生管理数据库应用应该支持的事务。

    (1) 数据应该能够支持下述维护事务。
    a) 创建和维护学校内学生的详细信息。
    b) 创建和维护学校内教师的详细信息。
    c) 创建和维护学校内课程的详细信息。
    (2) 数据应该能够支持下述查询事务
    a) 以报表形式列出学生的姓名,学号及其他详细信息
    b) 以报表形式列出专业的名称、专业号及其他详细信息
    c) 以报表形式列出课程的名称、课程号及其他详细信息
    d) 列出某一给定学生的课程及成绩
    e) 列出某一专业的课程信息
    三、概念结构设计
    3.1E-R图的分析和设计
    这里写图片描述

    3.2数据库逻辑设计
    ER图和关系模式的转化

    这里写图片描述

    3.3数据字典

    实体简介
    学生(学号,姓名,性别,出生日期,民族,所在专业编号,指导教师编号,电话号码,家庭地址,信息备注)
    课程(课程号,课程名,学分)
    专业(专业号,专业名,专业负责人号)
    教职工(教师号,姓名,性别,出生日期,民族,所在专业编号,职称,电话,家庭地址,信息备注)

    专业课设表(专业号、课程号)
    考试(课程号,学号,成绩,考试次数)
    用户(用户编号,用户密码,用户类别)
    (1) 学生表Student细节
    这里写图片描述

    (2) 4.2教师个人信息表TEACHER(教师号TNO,姓名TNAME,性别TSEX,出生日期TBIRTHDAY,名族TNATIVE,所在专业编号TDEPTNO,职称TPOSITION,电话STEL,家庭住址SADDRESS,备注信息SNOTE)
    这里写图片描述

    (3) 4.3专业表MAJOR(专业号MNO,专业名MNAME,专业负责人编号MTEACHER)
    这里写图片描述

    (4) 4.4课程表 COURSE(课程号CNO,课程名CNAME,学分CGRADE
    授课教师CTEACHER)
    这里写图片描述

    (5) 4.5成绩表SC(学生号SNO,课程号CNO,成绩SCGRADE)
    这里写图片描述

    (6) 4.6专业课设表MC(专业号MNO,课程号CNO)
    属性名 字段类型 长度 主键或外键 说明
    这里写图片描述

    (7) 4.7用户表YONGHU(用户编号YNO,用户密码YMIMA,用户类别LEIBIE)
    这里写图片描述

    四、用户界面设计

    4.1学生信息管理系统

    4.2学生信息查询

    4.3教师查询

    4.4管理员查询

    4.5专业负责人查询

    五、程序设计
    源代码

    FORM1//学生信息管理系统

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    
    namespace 学生管理系统
    {
    publicpartialclassForm1 : Form
        {
    SqlConnection conn = newSqlConnection("Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True");
    
    staticpublicstring sn, sub;
    public Form1()
            {
                InitializeComponent();
            }
    Form2 fr2 = newForm2(); Form3 fr3 = newForm3(); Form4 fr4 = newForm4(); Form5 fr5 = newForm5();
    
    
    privatevoid button1_Click_1(object sender, EventArgs e)
            {
    string str = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(str);
                conn.Open();
    if (textBox1.Text == "" || textBox2.Text == "")
    MessageBox.Show("请不要遗漏信息!");
    if (radioButton1.Checked)
                {
    string cstr = "select * from YONGHU where LEIBIE='管理员'and YNO='" + textBox1.Text.Trim() + "'and YMIMA='" + textBox2.Text.Trim() + "'";
    SqlCommand comm = newSqlCommand(cstr, conn);
    SqlDataReader dr = comm.ExecuteReader();
    if (dr.Read())
                    {
                        sn = textBox1.Text.Trim();
    Form4 fm = newForm4();
                        fm.Show();
                        fr4.Show(); this.Visible = false;
                    }
    else
                    {
    MessageBox.Show("输入有误,请重新输入!");
                        textBox1.Text = ""; textBox2.Text = "";
                    }
                }
    if (radioButton2.Checked)
                {
    string cstr = "select * from YONGHU where LEIBIE='教师'and YNO='" + textBox1.Text.Trim() + "'and YMIMA='" + textBox2.Text.Trim() + "'";
    SqlCommand comm = newSqlCommand(cstr, conn);
    SqlDataReader dr = comm.ExecuteReader();
    if (dr.Read())
                    { sn = textBox1.Text.Trim(); fr3.Show(); this.Visible = false; }
    else
                    {
    MessageBox.Show("输入有误,请重新输入!");
                        textBox1.Text = ""; textBox2.Text = "";
                    }
                }
    if (radioButton3.Checked)
                {
    string cstr = "select * from YONGHU where LEIBIE='学生'and YNO='" + textBox1.Text.Trim() + "'and YMIMA='" + textBox2.Text.Trim() + "'";
    SqlCommand comm = newSqlCommand(cstr, conn);
    SqlDataReader dr = comm.ExecuteReader();
    if (dr.Read())
                    { sn = textBox1.Text.Trim(); fr2.Show(); this.Visible = false; }
    else
                    {
    MessageBox.Show("输入有误,请重新输入!");
                        textBox1.Text = ""; textBox2.Text = "";
                    }
                }
    if (radioButton4.Checked)
                {
    string cstr = "select * from YONGHU where LEIBIE='专业负责人'and YNO='" + textBox1.Text.Trim() + "'and YMIMA='" + textBox2.Text.Trim() + "'";
    SqlCommand comm = newSqlCommand(cstr, conn);
    SqlDataReader dr = comm.ExecuteReader();
    if (dr.Read())
                    { sn = textBox1.Text.Trim(); fr5.Show(); this.Visible = false; }
    else
                    {
    MessageBox.Show("输入有误,请重新输入!");
                        textBox1.Text = ""; textBox2.Text = "";
                    }
                }
                conn.Close(); conn.Dispose();
            }
    
    
    
    privatevoid button2_Click_1(object sender, EventArgs e)
            {
    Application.Exit();
            }
    
    privatevoid radioButton4_CheckedChanged(object sender, EventArgs e)
            {
    string str = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(str);
                conn.Open();
    string cstr = "select * from YONGHU where LEIBIE='学生'and YNO='" + textBox1.Text.Trim() + "'and YMIMA='" + textBox2.Text.Trim() + "'";
    SqlCommand comm = newSqlCommand(cstr, conn);
    SqlDataReader dr = comm.ExecuteReader();
                {
    if (dr.Read())
                    {
                        sn = textBox1.Text.Trim();
                        fr2.Show();
    this.Visible = false;
                    }
    else
                    {
    MessageBox.Show("输入有误,请重新输入!");
                        textBox1.Text = ""; textBox2.Text = "";
                    }
                }
                conn.Close(); conn.Dispose();
            } 
    
    privatevoid radioButton3_CheckedChanged(object sender, EventArgs e)
            {    
    string str = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(str);
                conn.Open(); 
    string cstr = "select * from YONGHU where LEIBIE='教师'and YNO='" + textBox1.Text.Trim() + "'and YMIMA='" + textBox2.Text.Trim() + "'";
    SqlCommand comm = newSqlCommand(cstr, conn);
    SqlDataReader dr = comm.ExecuteReader();
                {
    if (dr.Read())
                    { sn = textBox1.Text.Trim(); 
                        fr3.Show(); 
    this.Visible = false; 
                    }
    else
                    {
    MessageBox.Show("输入有误,请重新输入!");
                        textBox1.Text = ""; textBox2.Text = "";
                    }
                }
                conn.Close(); conn.Dispose();
            }
    privatevoid radioButton2_CheckedChanged(object sender, EventArgs e)
            {
    string str = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(str);
                conn.Open(); 
    string cstr = "select * from YONGHU where LEIBIE='专业负责人'and YNO='" + textBox1.Text.Trim() + "'and YMIMA='" + textBox2.Text.Trim() + "'";
    SqlCommand comm = newSqlCommand(cstr, conn);
    SqlDataReader dr = comm.ExecuteReader();
    if (dr.Read())
                    { sn = textBox1.Text.Trim(); fr5.Show(); this.Visible = false; }
    else
                    {
    MessageBox.Show("输入有误,请重新输入!");
                        textBox1.Text = ""; textBox2.Text = "";
                    }
                    conn.Close(); 
                }
    
    privatevoid radioButton1_CheckedChanged(object sender, EventArgs e)
            {  
    string str = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(str);
                conn.Open(); 
    string cstr = "select * from YONGHU where LEIBIE='管理员'and YNO='" + textBox1.Text.Trim() + "'and YMIMA='" + textBox2.Text.Trim() + "'";
    SqlCommand comm = newSqlCommand(cstr, conn);
    
    SqlDataReader dr = comm.ExecuteReader();
    if (dr.Read())
                    { sn = textBox1.Text.Trim(); fr4.Show(); this.Visible = false; }
    else
                    {
    MessageBox.Show("输入有误,请重新输入!");
                        textBox1.Text = ""; textBox2.Text = "";
                    }
                    conn.Close(); 
            }
            }
    
        }

    FORM2//学生信息查询

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    
    namespace 学生管理系统
    {
    publicpartialclassForm2 : Form
        {
    public Form2()
            {
                InitializeComponent();
            }
    
    
    
    privatevoid button4_Click(object sender, EventArgs e)
            {
    SqlConnection conn = newSqlConnection();
                conn.ConnectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
                conn.Open();
    SqlCommand cmd = conn.CreateCommand();
    string ModifyString = "UPDATE  YONGHU SET YMIMA='" + textBox2.Text + "'," + "LEIBIE='" + textBox3.Text + "'where YNO='" + Form1.sn.Trim() + "'";
                cmd.CommandText = ModifyString;
                cmd.ExecuteNonQuery();
    MessageBox.Show("修改成功!");
            }
    
    privatevoid 查询成绩_Click(object sender, EventArgs e)
            {
    
    SqlDataAdapter adapter;
    DataTable table;
    string connectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(connectionString);
                conn.Open(); 
    if (Form1.sn.Trim() == "001")
                {
                    adapter = newSqlDataAdapter("select SC.SNO 学号,SC.CNO 课程号,SCGRADE1 成绩1,SCGRADE2 成绩2,SCGRADE3 成绩3  from SC WHERE SNO=001", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    if (Form1.sn.Trim() == "002")
                {
                    adapter = newSqlDataAdapter("select SC.SNO 学号,SC.CNO 课程号,SCGRADE1 成绩1,SCGRADE2 成绩2,SCGRADE3 成绩3  from SC WHERE SNO=002", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    if (Form1.sn.Trim() == "003")
                {
                    adapter = newSqlDataAdapter("select SC.SNO 学号,SC.CNO 课程号,SCGRADE1 成绩1,SCGRADE2 成绩2,SCGRADE3 成绩3  from SC WHERE SNO=003", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
            }
    
    privatevoid 查询个人信息_Click(object sender, EventArgs e)
            {
    SqlDataAdapter adapter;
    DataTable table;
    string connectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(connectionString);
                conn.Open();
    if (Form1.sn.Trim() == "001")
                {
                    adapter = newSqlDataAdapter("select STUDENTS.SNO 学号,SNAME 姓名,SSEX 性别,SBIRTHDAY 出生年份,SNATIVE 名族,STEL 电话,SADDRESS 家庭住址,SNOTE 备注信息 from STUDENTS WHERE   SNO=001",conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    if (Form1.sn.Trim() == "002")
                {
                    adapter = newSqlDataAdapter("select STUDENTS.SNO 学号,SNAME 姓名,SSEX 性别,SBIRTHDAY 出生年份,SNATIVE 名族,STEL 电话,SADDRESS 家庭住址,SNOTE 备注信息 from STUDENTS WHERE   SNO=002",conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    if (Form1.sn.Trim() == "003")
                {
                    adapter = newSqlDataAdapter("select STUDENTS.SNO 学号,SNAME 姓名,SSEX 性别,SBIRTHDAY 出生年份,SNATIVE 名族,STEL 电话,SADDRESS 家庭住址,SNOTE 备注信息 from STUDENTS WHERE   SNO=003",conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
            }
    
    privatevoid button3_Click(object sender, EventArgs e)
            {
    this.Close();
    Form1 f1 = newForm1();
                f1.Show();
            }
        }
    }
    FORM3  //教师查using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    
    namespace //学生管理系统
    {
    publicpartialclassForm3 : Form
        {
    public Form3()
            {
                InitializeComponent();
            }
    privatevoid Form3_Load(object sender, EventArgs e)
            {
                学号.Text = Form1.sn + "教师,欢迎使用本管理系统!";
    
    
            }
    
    
    
    privatevoid 学号_Click(object sender, EventArgs e)
            {
    
            }
    
    privatevoid button3_Click(object sender, EventArgs e)
            {
    DataTable table;
    SqlDataAdapter adapter;
    string connectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(connectionString);
                conn.Open();
    if (textBox1.Text == "001")
                {
                    adapter = newSqlDataAdapter("select SC.SNO 学号, SC.CNO 课程号,SCGRADE1 成绩1,SCGRADE2 成绩2,SCGRADE3 成绩3 from SC WHERE  SC.SNO=001 ", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    if (textBox1.Text == "002")
                {
                    adapter = newSqlDataAdapter("select * from SC WHERE  SC.SNO=002", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    if (textBox1.Text == "003")
                {
                    adapter = newSqlDataAdapter("select SC.SNO 学号, SC.CNO 课程号,SCGRADE1 成绩1,SCGRADE2 成绩2,SCGRADE3 成绩3 from SC WHERE  SC.SNO=003  ", conn); ;
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    
            }
    
    privatevoid button2_Click_1(object sender, EventArgs e)
            {
    Form1 f1 = newForm1();
                f1.Show();
    this.Close();
            }
    
    privatevoid button5_Click_1(object sender, EventArgs e)
            {
    SqlConnection conn = newSqlConnection();
                conn.ConnectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
                conn.Open();
    SqlCommand cmd = conn.CreateCommand();
    string ModifyString = "UPDATE  YONGHU SET YMIMA='" + textBox7.Text + "'," + "LEIBIE='" + textBox8.Text + "'where YNO='" + Form1.sn.Trim() + "'";
                cmd.CommandText = ModifyString;
                cmd.ExecuteNonQuery();
    MessageBox.Show("修改成功!");
            }
    
    privatevoid button1_Click_1(object sender, EventArgs e)
            {
    SqlDataAdapter adapter;
    DataTable table;
    string connectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(connectionString);
                conn.Open();
    if (Form1.sn.Trim() == "201")
                {
                    adapter = newSqlDataAdapter("select * from TC,TEACHER WHERE TEACHER.TNO=201 ", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    if (Form1.sn.Trim() == "202")
                {
                    adapter = newSqlDataAdapter("select * from TC,TEACHER WHERE TEACHER.TNO=202 ", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    if (Form1.sn.Trim() == "203")
                {
                    adapter = newSqlDataAdapter("select * from TC,TEACHER WHERE TEACHER.TNO=203 ", conn); ;
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    
    
            }
    
    privatevoid button4_Click_1(object sender, EventArgs e)
            {
    SqlConnection conn = newSqlConnection();
                conn.ConnectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
                conn.Open();
    SqlCommand cmd = conn.CreateCommand();
    string ModifyString = "UPDATE  SC SET SNO='" + textBox1.Text + "',CNO='" + textBox2.Text + "',SCGRADE1='" + textBox3.Text + "',SCGRADE2='" + textBox4.Text + "',SCGRADE3='" + textBox5.Text + "'where SNO='" + textBox1.Text + "'and CNO='" + textBox2.Text + "'";
                cmd.CommandText = ModifyString;
                cmd.ExecuteNonQuery();
    MessageBox.Show("修改成功!");
    
    
            }
    
    privatevoid Form3_Load_1(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox6_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox7_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox8_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox1_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox2_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox3_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox4_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox5_TextChanged(object sender, EventArgs e)
            {
    
            }
        }
        }
    
    

    M4 //管理员

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    
    namespace //学生管理系统
    {
    publicpartialclassForm4 : Form
        {
    public Form4()
            {
                InitializeComponent();
            }
    privatevoid Form4_Load(object sender, EventArgs e)
            {
                label1.Text = Form1.sn + "管理员,欢迎使用本管理系统!";
            }
    privatevoid label19_Click(object sender, EventArgs e)
            {
            }
    privatevoid button5_Click(object sender, EventArgs e)
            {
    Form1 f1 = newForm1();
                f1.Show();
    this.Close();
            }
    privatevoid button6_Click(object sender, EventArgs e)
            {
    SqlConnection conn = newSqlConnection();
                conn.ConnectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
                conn.Open();
    SqlCommand cmd = conn.CreateCommand();
    string ModifyString = "UPDATE  YONGHU SET YNO='" + textBox21.Text + "'," + "YMIMA='" + textBox22.Text + "'," + "LEIBIE='" + textBox23.Text + "'where YNO='" + Form1.sn.Trim() + "'";
                cmd.CommandText = ModifyString;
                cmd.ExecuteNonQuery();
    MessageBox.Show("修改成功!");
            }
    privatevoid button3_Click_1(object sender, EventArgs e)
            {
    SqlConnection conn = newSqlConnection();
                conn.ConnectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
                conn.Open();
    SqlCommand cmd = conn.CreateCommand();
    SqlCommand cmd1 = conn.CreateCommand();
    string AddString = "INSERT INTO STUDENTS  VALUES('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','" + textBox5.Text + "','" + textBox6.Text + "','" + textBox7.Text + "','" + textBox8.Text + "','" + textBox9.Text + "','" + textBox10.Text + "')";
    string AddString1 = "INSERT INTO YONGHU  VALUES('" + textBox1.Text + "','" + textBox1.Text + "','" + "学生" + "')";
                cmd.CommandText = AddString;
                cmd1.CommandText = AddString1;
                cmd.ExecuteNonQuery();
                cmd1.ExecuteNonQuery();
    MessageBox.Show("注册成功!");
                conn.Close();
            }
    
    privatevoid label10_Click(object sender, EventArgs e)
            {
    
            }
    
    privatevoid label8_Click(object sender, EventArgs e)
            {
    
            }
    
    privatevoid dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
    
            }
    
    privatevoid label1_Click(object sender, EventArgs e)
            {
    
            }
    
    privatevoid groupBox1_Enter(object sender, EventArgs e)
            {
    
            }
    
    privatevoid button1_Click_1(object sender, EventArgs e)
            {
    
    SqlDataAdapter adapter;
    DataTable table;
    string connectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(connectionString);
                conn.Open();
    if (textBox1.Text == "001")
                {
                    adapter = newSqlDataAdapter("select STUDENTS.SNO 学号,SNAME 姓名,SSEX 性别,SBIRTHDAY 出生年份,SNATIVE 名族,STEL 电话,SADDRESS 家庭住址,SNOTE 备注信息 from STUDENTS WHERE   SNO=001", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    if (textBox1.Text == "002")
                {
                    adapter = newSqlDataAdapter("select STUDENTS.SNO 学号,SNAME 姓名,SSEX 性别,SBIRTHDAY 出生年份,SNATIVE 名族,STEL 电话,SADDRESS 家庭住址,SNOTE 备注信息 from STUDENTS WHERE   SNO=002", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    if (textBox1.Text == "003")
                {
                    adapter = newSqlDataAdapter("select STUDENTS.SNO 学号,SNAME 姓名,SSEX 性别,SBIRTHDAY 出生年份,SNATIVE 名族,STEL 电话,SADDRESS 家庭住址,SNOTE 备注信息 from STUDENTS WHERE   SNO=003", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
            }
    
    privatevoid button2_Click_1(object sender, EventArgs e)
            {
    SqlDataAdapter adapter;
    DataTable table;
    string connectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(connectionString);
                conn.Open();
    
    if (textBox11.Text == "202")
                {
                    adapter = newSqlDataAdapter("select TNO 教师号,TNAME 教师名,TSEX 性别,TBIRTHDAY 出生年份,TNATIVE 名族,TPOSITION 职称,TTEL 电话,TADDRESS 家庭住址,TNOTE 备注信息 from TEACHER WHERE TNO=202", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    if (textBox11.Text == "203")
                {
                    adapter = newSqlDataAdapter("select TNO 教师号,TNAME 教师名,TSEX 性别,TBIRTHDAY 出生年份,TNATIVE 名族,TPOSITION 职称,TTEL 电话,TADDRESS 家庭住址,TNOTE 备注信息 from TEACHER WHERE  TNO=203", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
            }
    
    privatevoid textBox1_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox2_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox3_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox4_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox5_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox6_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox7_TextChanged(object sender, EventArgs e)
            {
    
            }
    privatevoid textBox8_TextChanged(object sender, EventArgs e)
            {
    
            }
    privatevoid textBox9_TextChanged(object sender, EventArgs e)
            {
    
           }
    privatevoid textBox10_TextChanged(object sender, EventArgs e)
            {
    
            }
    privatevoid button4_Click(object sender, EventArgs e)
            {
    SqlConnection conn = newSqlConnection();
                conn.ConnectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
                conn.Open();
    SqlCommand cmd = conn.CreateCommand();
    SqlCommand cmd1 = conn.CreateCommand();
    string AddString = "INSERT INTO TEACHER  VALUES('" + textBox11.Text + "','" + textBox12.Text + "','" + textBox13.Text + "','" + textBox14.Text + "','" + textBox15.Text + "','" + textBox16.Text + "','" + textBox17.Text + "','" + textBox18.Text + "','" + textBox19.Text + "','" + textBox20.Text + "')";
    string AddString1 = "INSERT INTO YONGHU  VALUES('" + textBox11.Text + "','" + textBox11.Text + "','" + "教师" + "')";
                cmd.CommandText = AddString;
                cmd1.CommandText = AddString1;
                cmd.ExecuteNonQuery();
                cmd1.ExecuteNonQuery();
    MessageBox.Show("注册成功!");
                conn.Close();
            }
    
    privatevoid textBox11_TextChanged(object sender, EventArgs e)
            {
    
            }
    privatevoid textBox12_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox13_TextChanged(object sender, EventArgs e)
            {
    
            }
    privatevoid textBox14_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox15_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox16_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox17_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox18_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox19_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox20_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid button5_Click_1(object sender, EventArgs e)
            {
    this.Close();
            }
    
    privatevoid button6_Click_1(object sender, EventArgs e)
            {
    SqlConnection conn = newSqlConnection();
                conn.ConnectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
                conn.Open();
    SqlCommand cmd = conn.CreateCommand();
    string ModifyString = "UPDATE  YONGHU SET YMIMA='" + textBox22.Text + "'," + "LEIBIE='" + textBox23.Text + "'where YNO='" + Form1.sn.Trim() + "'";
                cmd.CommandText = ModifyString;
                cmd.ExecuteNonQuery();
    MessageBox.Show("修改成功!");
            }
    
    privatevoid textBox22_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox23_TextChanged(object sender, EventArgs e)
            {
    
            }
        }
    }
    
    namespace 学生管理系统
    {
    publicpartialclassForm5 : Form
        {
    public Form5()
            {
                InitializeComponent();
            }
    
    
    privatevoid Form5_Load(object sender, EventArgs e)
            {
                label1.Text = Form1.sn + "专业负责人,欢迎使用本管理系统!";
            }
    
    privatevoid button5_Click(object sender, EventArgs e)
            {
    
            }
    
    privatevoid Form5_Load_1(object sender, EventArgs e)
            {
    
            }
    
    privatevoid label4_Click(object sender, EventArgs e)
            {
    
            }
    
    privatevoid groupBox1_Enter_1(object sender, EventArgs e)
            {
    
            }
    privatevoid button1_Click_1(object sender, EventArgs e)
            {
    
    SqlDataAdapter adapter;
    DataTable table;
    string connectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(connectionString);
                conn.Open();
    if (textBox4.Text == "401")
                {
                    adapter = newSqlDataAdapter("select * from COURSE WHERE CNO=401", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
            }
    
    privatevoid button6_Click(object sender, EventArgs e)
            {
    
    SqlConnection conn = newSqlConnection();
                conn.ConnectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
                conn.Open();
    SqlCommand cmd = conn.CreateCommand();
    string ModifyString = "UPDATE  YONGHU SET YMIMA='" + textBox2.Text + "'," + "LEIBIE='" + textBox3.Text + "'where YNO='" + Form1.sn.Trim() + "'";
                cmd.CommandText = ModifyString;
                cmd.ExecuteNonQuery();
    MessageBox.Show("修改成功!");
            }
    
    privatevoid button4_Click_1(object sender, EventArgs e)
            {
    this.Close();
    Form1 f1 = newForm1();
                f1.Show();
            }
    
    privatevoid textBox4_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid button2_Click_1(object sender, EventArgs e)
            {
    SqlDataAdapter adapter;
    DataTable table;
    string connectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(connectionString);
                conn.Open();
    if (textBox5.Text == "001")
                {
                    adapter = newSqlDataAdapter("select STUDENTS.SNO 学号,SNAME 姓名,SSEX 性别,SBIRTHDAY 出生年份,SNATIVE 名族,STEL 电话,SADDRESS 家庭住址,SNOTE 备注信息 from STUDENTS,TC,SC WHERE   STUDENTS.SNO=001 ", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
            }
    
    privatevoid button3_Click_1(object sender, EventArgs e)
            {
    SqlDataAdapter adapter;
    DataTable table;
    string connectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(connectionString);
                conn.Open();
    if (textBox6.Text == "401")
                {
                    adapter = newSqlDataAdapter("select TEACHER.TNO 教师号, TEACHER.TNAME 姓名,TEACHER.TSEX 性别,TEACHER.TBIRTHDAY 出生日期,TEACHER.TNATIVE 民族,TEACHER.TDEPTNO 所在专业编号,TEACHER.TPOSITION 职称, TEACHER.TTEL 电话,TEACHER.TADDRESS 家庭住址,TEACHER.TNOTE 备注信息 from TEACHER,TC WHERE  TC.CNO=401 ", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
            }
    privatevoid button1_Click(object sender, EventArgs e)
            {
    SqlDataAdapter adapter;
    DataTable table;
    string connectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(connectionString);
    if (textBox4 .Text  == "401")
                {
                    adapter = newSqlDataAdapter("select COURSE.CNO 课程号,COURSE.CNAME 课程名,CGRADE 学分,TC.TNO 教课教师号,TEACHER.TNAME 教课教师名  from TEACHER,TC,COURSE WHERE CNO=401", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    if (textBox4.Text == "402")
                {
                    adapter = newSqlDataAdapter("select COURSE.CNO 课程号,COURSE.CNAME 课程名,CGRADE 学分,TC.TNO 教课教师号,TEACHER.TNAME 教课教师名  from TEACHER,MC,COURSE WHERE CNO=402", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    if (textBox4.Text == "403")
                {
                    adapter = newSqlDataAdapter("select COURSE.CNO 课程号,COURSE.CNAME 课程名,CGRADE 学分,CTEACHER 教课教师号,TNAME 教课教师名  from TEACHER,MC,COURSE WHERE CNO=403", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
            }
    
    privatevoid textBox1_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox2_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox3_TextChanged(object sender, EventArgs e)
            {
    
            }
        }
    }
    FORM5//专业负责人查询
    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    
    namespace 学生管理系统
    {
    publicpartialclassForm5 : Form
        {
    public Form5()
            {
                InitializeComponent();
            }
    
    
    privatevoid Form5_Load(object sender, EventArgs e)
            {
                label1.Text = Form1.sn + "专业负责人,欢迎使用本管理系统!";
            }
    
    privatevoid button5_Click(object sender, EventArgs e)
            {
    
            }
    
    privatevoid Form5_Load_1(object sender, EventArgs e)
            {
    
            }
    
    privatevoid label4_Click(object sender, EventArgs e)
            {
    
            }
    
    privatevoid groupBox1_Enter_1(object sender, EventArgs e)
            {
    
            }
    privatevoid button1_Click_1(object sender, EventArgs e)
            {
    
    SqlDataAdapter adapter;
    DataTable table;
    string connectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(connectionString);
                conn.Open();
    if (textBox4.Text == "401")
                {
                    adapter = newSqlDataAdapter("select * from COURSE WHERE CNO=401", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
            }
    
    privatevoid button6_Click(object sender, EventArgs e)
            {
    
    SqlConnection conn = newSqlConnection();
                conn.ConnectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
                conn.Open();
    SqlCommand cmd = conn.CreateCommand();
    string ModifyString = "UPDATE  YONGHU SET YMIMA='" + textBox2.Text + "'," + "LEIBIE='" + textBox3.Text + "'where YNO='" + Form1.sn.Trim() + "'";
                cmd.CommandText = ModifyString;
                cmd.ExecuteNonQuery();
    MessageBox.Show("修改成功!");
            }
    
    privatevoid button4_Click_1(object sender, EventArgs e)
            {
    this.Close();
    Form1 f1 = newForm1();
                f1.Show();
            }
    
    privatevoid textBox4_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid button2_Click_1(object sender, EventArgs e)
            {
    SqlDataAdapter adapter;
    DataTable table;
    string connectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(connectionString);
                conn.Open();
    if (textBox5.Text == "001")
                {
                    adapter = newSqlDataAdapter("select STUDENTS.SNO 学号,SNAME 姓名,SSEX 性别,SBIRTHDAY 出生年份,SNATIVE 名族,STEL 电话,SADDRESS 家庭住址,SNOTE 备注信息 from STUDENTS,TC,SC WHERE   STUDENTS.SNO=001 ", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
            }
    
    privatevoid button3_Click_1(object sender, EventArgs e)
            {
    SqlDataAdapter adapter;
    DataTable table;
    string connectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(connectionString);
                conn.Open();
    if (textBox6.Text == "401")
                {
                    adapter = newSqlDataAdapter("select TEACHER.TNO 教师号, TEACHER.TNAME 姓名,TEACHER.TSEX 性别,TEACHER.TBIRTHDAY 出生日期,TEACHER.TNATIVE 民族,TEACHER.TDEPTNO 所在专业编号,TEACHER.TPOSITION 职称, TEACHER.TTEL 电话,TEACHER.TADDRESS 家庭住址,TEACHER.TNOTE 备注信息 from TEACHER,TC WHERE  TC.CNO=401 ", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
            }
    privatevoid button1_Click(object sender, EventArgs e)
            {
    SqlDataAdapter adapter;
    DataTable table;
    string connectionString = "Data Source=asus;Initial Catalog=xueshengguanli;Integrated Security=True";
    SqlConnection conn = newSqlConnection(connectionString);
    if (textBox4 .Text  == "401")
                {
                    adapter = newSqlDataAdapter("select COURSE.CNO 课程号,COURSE.CNAME 课程名,CGRADE 学分,TC.TNO 教课教师号,TEACHER.TNAME 教课教师名  from TEACHER,TC,COURSE WHERE CNO=401", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    if (textBox4.Text == "402")
                {
                    adapter = newSqlDataAdapter("select COURSE.CNO 课程号,COURSE.CNAME 课程名,CGRADE 学分,TC.TNO 教课教师号,TEACHER.TNAME 教课教师名  from TEACHER,MC,COURSE WHERE CNO=402", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
    if (textBox4.Text == "403")
                {
                    adapter = newSqlDataAdapter("select COURSE.CNO 课程号,COURSE.CNAME 课程名,CGRADE 学分,CTEACHER 教课教师号,TNAME 教课教师名  from TEACHER,MC,COURSE WHERE CNO=403", conn);
                    table = newDataTable();
                    adapter.Fill(table);
                    dataGridView1.DataSource = table;
                }
            }
    
    privatevoid textBox1_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox2_TextChanged(object sender, EventArgs e)
            {
    
            }
    
    privatevoid textBox3_TextChanged(object sender, EventArgs e)
            {
    
            }
        }
    }
    

    六、运行结果
    (一)学生管理管理窗口
    这里写图片描述
    (二)学生窗口
    (1)用户名002 密码002 学生
    预测结果 学生查询窗口打开
    实际结果

    这里写图片描述
    这里写图片描述
    (2)点击查询成绩
    预期结果 显示学号 课程号 成绩1 成绩2 成绩3
    实际结果
    这里写图片描述

    (3)点击查询个人成绩
    预期结果 显示学号,姓名,性别,出生日期,民族,所在专业编号,指导教师编号,电话号码,家庭地址,信息备注
    实际结果
    这里写图片描述

    (4)进行修改学生密码
    最初的密码
    这里写图片描述
    进行更改
    这里写图片描述
    预期结果 修改成功
    实际结果
    这里写图片描述
    这里写图片描述

    (5)输入的用户名和密码不符

    这里写图片描述
    预期结果 输入有误,请重新输入
    实际结果
    这里写图片描述
    (二)教师窗口
    (1)登录教师窗口
    这里写图片描述
    预期结果 进入教师窗口
    实际结果
    这里写图片描述
    (2)点击查询本人信息
    预期结果 显示教师号,姓名,性别,出生日期,民族,所在专业编号,职称,电话,家庭地址,信息备注
    实际结果

    (3)查询信息

    预期结果 显示学号 课程号 成绩1 成绩2 成绩3
    实际结果
    这里写图片描述

    (4)修改成绩

    这里写图片描述

    预期结果 修改成功
    实际结果
    这里写图片描述
    (5)修改教师密码

    原密码
    这里写图片描述
    进行修改

    预期结果 修改成功
    实际结果
    这里写图片描述
    这里写图片描述

    (6)用户名或密码不正确

    (三)管理员
    (1)管理员登录

    预期结果 进入管理员窗口
    实际结果

    (2)点击查询学生信息

    预期结果 显示 学号,姓名,性别,出生日期,民族,所在专业编号,指导教师编号,电话号码,家庭地址,信息备注
    实际结果

    (3)点击查询教师信息

    预期结果 显示教师号,教师名,性别,出生日期,民族,所在专业编号,职称,电话,家庭地址,信息备注
    实际结果

    (4)学生注册

    预期结果 注册成功
    实际结果

    (5)教师注册

    预期结果 注册成功
    实际结果

    (6)修改密码

    预期结果 注册成功
    实际结果

    (四)专业负责人
    (1)专业负责人登录

    预期结果 进入专业负责人窗口
    实际结果

    (2)点击查询本专业课程信息

    预期结果 显示CNO,CNAME,CGRADE
    实际结果

    (3)点击查询本专业学生信息

    预期结果 显示学号,姓名,性别,出生日期,民族,所在专业编号,指导教师编号,电话号码,家庭地址,信息备注
    实际结果

    (4)点击查询本专业教师信息

    预期结果 显示教课程号CNO=401的老师的教师号,教师名,性别,出生日期,民族,所在专业编号,职称,电话,家庭地址,信息备注
    实际结果

    (5)修改密码

    预期结果 修改成功
    实际结果

    七、总结
    7.1系统完成的主要功能
    学生信息管理系统的功能是收集学生的个人信息,以便向老师提供每个学生在校或毕业生学籍的情况,还可以让学生用自己的学号去查看自己在校期间的表现。学生信息管理系统的主要功能有:
    (1)、新生入学的学籍注册;
    (2)、专业与课程管理;
    (3)、教职工与课程管理;
    (4)、学生个人信息的查询;
    学生信息管理系统主要提供学生管理:包括编辑(学号,姓名,性别,生日,名族,所属部门,指导老师,家庭住址,备注信息等),用户登录(3种权限,一种是管理员可以做任何操作,一种是教师可以查看学生信息,修改学生成绩和修改本人密码,一种是学生只能查看本人信息和修改本人密码)。

    7.2遇到的问题及解决方案
    关于数据库和C#的窗口程序不会连接,根据网上相关资料查询,最终解决问题,代码中时常有一些小细节上的错误,每个成员都能参与其中仔细检查一遍又一遍。从一个登陆界面键入下一个信息界面时多番修改仍不能实现,通过老师和同学的帮助共同解决,查询信息时数据库的信息不能反馈到界面中,我们借鉴其他组成功实现的代码进行反复修改得以解决。

    7.3不足及展望

    学生注册和教师注册不能由学生和教师自己来完成,学生选专业不够灵活,实体部门在程序中未能体现出来,界面设计简单,操作麻烦,基础知识不扎实,所做系统较为简单,望以后的学习中能注重学习基本功,多以联系所有的实验和作业内容,增强动手能力,勤于思考。

    展开全文
  • 学生成绩管理系统设计》 二、实训目的 (1)掌握结构化程序设计的基本方法,基本掌握面向对象程序设计的基本思路和方法。 (2)掌握C++的基本概念和基础知识。 (3)通过训练能够读懂较为复杂的C++语言源程序...

    很多朋友私信要一份C语言学生成绩管理系统设计报告,提供一下获取方法吧

    扫描下方公号,发送 成绩系统 三个字,获取实训报告。

    后续也会把之前搜集到的优质管理系统相关资料分享出来,大家一起学习,下面是作者自己的一份实训报告,希望能帮助到大家

    一、课程设计题目

    《学生成绩管理系统设计》

    二、实训目的

    (1)掌握结构化程序设计的基本方法,基本掌握面向对象程序设计的基本思路和方法。

    (2)掌握C++的基本概念和基础知识。

    (3)通过训练能够读懂较为复杂的C++语言源程序并具备基本C++语言程序设计的能力。

    4)通过实训,培养自己编写、调试、分析程序的能力。

    5)培养自己独立解决问题,查找资料的能力。同学之间相互帮助,相互交流,相互合作的团队精神。

    6) 培养自己良好的学习兴趣,独立的编程风格。

    7) 通过实训检查自己学习上的不足,达到熟练掌握C++语言的基本知识和技能。

    三、课程设计报告内容

    3.1功能要求

    该系统运行在DOS环境下,人机界面为命令行文本界面。完成的任务是对若干人的成绩信息进行管理,且数据保存到文件中。

    实现的主要功能是:

    系统以菜单方式进行工作

    学生信息和成绩输入功能

    学生信息和成绩输出功能

    学生信息和成绩浏览功能

    查询学生信息及成绩功能

    修改学生信息及成绩功能

    学生成绩排序

    以稳健的形式进行保存

    3.2 设计环境

    所使用的语言采用标准C,开发工具可选用在DOS环境下的Turbo C

    3.3 数据结构

    本系统是对学生成绩的信息进行管理,学生成绩信息采用C的结构体数据类型描述,定义如下:

    struct students
    {
       int num;          //学号-整型//
       char name[8];    //姓名-字符型//
       char chinese;    //大学语文-字符型//
       char math;       //大学数学-字符型//
       char computer;   //计算机-字符型//
       char sum;        //总成绩-字符型//
       char ave;        //平均分-字符型//
    }

    3.4实现方法及主要算法分析

    (1)主界面的设计:主界面采用文本菜单的形式,各功能调用通过菜单进行选择。采用循环处理,以便执行完某项处理后,仍可选择其他项处理。在循环内先显示提示信息,然后读取用户输入,使用switch语句对用户的输入进行判断,分别调用相应的模块,当某模块结束后再次回到文本菜单,直到用户选择结束程序菜单,才退出循环,从而退出系统。

    (2) 外部文件的类型:文件采用的二进制的文件,对文件的读写采用顺序文件的方式,并使用fread和fwrite等函数对文件进行操作。

    (3)清屏函数:一般由上一级菜单屏幕进入下一级菜单屏幕或由下一级菜单屏幕返回上一级菜单屏幕都需要清除屏幕原来显示的内容。同时在调用程序的过程中,记录需要清屏的位置,然后修改代码,加入clrscr()函数清屏。

    (4)提示信息:一般的输入与输出需有相应的提示信息,以增加用户的交互性,增加输出的可读性,以帮助用户使用程序。

    3.5模块设计

    根据功能要求,本系统为五大主要模块,具体模块如表所示。

    学生信息成绩管理系统的模块

    3.6处理流程

    (1)学生成绩管理系统主界面模块

    2)成绩输入模块 和(3)成绩排序模块

    (4)删除记录

    (5)修改记录

    (6)查找信息

    四、结论

    学生成绩管理系统的编写,看似杂乱无头绪,实际上却并不如此。它的每一个功能都能分成模块,有句话说的好,大事化小,小事化了。C语言编程也正式如此,把一个大的程序分为若干相互独立的模块,这样使完成每一个模块的工作变得单纯而明确,这样不仅降低了难度还使得思路清晰,很容易编写出要做的程序,从而为设计一些较大的软件打下了良好的基础。

    分析问题:

    学生成绩管理系统的整体功能都包括、增加成员、删除成员、查看成员、修改成员、登陆口令五大板块,而查看有包括学号,姓名,大学语文成绩,大学数学成绩,计算机成绩,总成绩,平均分七个模块。

    1. 设计的数据对象包括整形:学号。字符型:姓名、3门课程成绩、总成绩、平均成绩。
    2. 数据结构线性数据结构,定义人数上限为1000.

    算法的设计:

    1. 自顶向下

      现有全局,在进行整体设计,然后再进行下层的设计,逐步实现精细化。采用这种方法能够做到胸有全局,能全盘考虑,不至于顾此失彼,头重脚轻。

    1. 逐步细化

       一步步地将上层的任务分解成较小的、易于实现的任务,知道可以很简单实现为止。

    编写源程序:

    1. 不求速度,但求质量!一步一个脚印,编写程序时候宁可速度慢些也要尽量保证质量,做到尽量不出错。
    2. 精力集中,全神贯注!写程序时候最忌讳三心二意,这样才能思路清晰保证质量。
    3. 保持一个良好的编程心态,不要被长长的代码吓到

    程序的编译与运行:

    1. 查找错误是一件让人闹心的事,但是要注重技巧,注意平时经验的积累。
    2. 程序编译成功不要满足现状,要积极测试程序的可用性,对功能不理想,存在缺点的地方,积极的改进,完善。

    五、结束语

    在实训过程中,使我良好的锻炼了自己,首先是兴趣方面,通过编写通讯录管理系统使我更加喜欢编程,使我从以前的迷茫状态中解脱出来,使我了解了编程的真正意义。我想这对我以后的人生有着很大的帮助。其次通过编写通讯录管理系统使我对写程序有了一定的思路,不像以前无从下手,使我理解了算法的意义,使我懂得了模块化思想的好处。

    通过一个星期的编写代码,使我对书本上的知识有了更深的理解,甚至有很多不懂的问题在这过程中自然而然的理解了。对期末考试更有了信心。在朱老师的悉心指导下,我对C语言有了更深刻的理解,对程序的算法,数据的定义,程序的改错等方面的能力有了很大提高,自身的注意力,耐心,和对编程的兴趣有了很大增长,使我获益匪浅。

    六、参考书目:

    [1]谭浩强,《C语言程序设计》,清华大学出版社

    附完整代码:

    #include<stdio.h>
    #include<string.h>    //比较字符串头文件//
    #include<stdlib.h>   //实时检测总数头文件//
    #define N 1000       //控制最大输入//
    int n=0;             //实时检测的总数n//
    
    /*定义结构体students*/																	       
    struct students
    {
       int num;          //学号-整型//
       char name[8];     //姓名-字符型//
       char chinese;     //大学语文-字符型//
       char math;        //大学数学-字符型//
       char computer;    //计算机-字符型//
       char sum;         //总成绩-字符型//
       char ave;        //平均分-字符型//
    }student[N],student1;     //student[N]是结构体数组student1是结构体的初始化//
    
      /*实时检测总数n*/
    void count()  
     {
    	FILE *fp;         //定义一个文件指针fp//
    	fp=fopen("students.txt","at+");     //以“追加”方式打开students文本文件//
    	if(fp==NULL)                        //判断文件是否为空//
    		printf("Cannot open file!");
        struct students stu1;                 
    	n=0;         //初始化//
    	while(1)
    	{
    	  if(feof(fp))  //检测文件是否结束//
    	  break;
          fread(&stu1,sizeof(struct students),1,fp);   //读取文件//
    	  n++;    //读取文件数//
        }
    	n--;           //关闭文件数//
    	fclose(fp);    //关闭文件//
     }
    
    /*菜单*/
    void main()
    {
    	int i;        //获取用户在菜单中的选择//     
    	while(i!=0)
    	{
    		system("cls");     //清屏//
    	printf("\t\t欢迎进入学生信息管理系统\n");
      printf("\t\t==============================\n");
    		printf("\t\t*请择操作                    *\n");
    		printf("\t\t*1输入学生信息               *\n");
    		printf("\t\t*2输出学生信息               *\n");
    		printf("\t\t*3修改学生信息               *\n");
    		printf("\t\t*4查询学生信息               *\n");
           printf("\t\t*5排序学生信息               *\n");
    		printf("\t\t*6退出                       *\n");
    	printf("\t\t==============================\n");
     scanf("%d",&i);
     system("cls");     //清屏// 
    		count();     //实时检测总数n//
    		switch(i)
    		{
    		 case 1:input();break;    //输入学生信息//	
    		 case 2:output();break; 	//输出学生信息//
    	     case 3:xiugai();output();break;    //修改学生信息//
            case 4:query();break;    //查询学生信息*/
            case 5:paixu();output();break;    //成绩排序//
    	default:
    		   printf("输入有错\n");     //错误纠正//  
    		}
    	}
    	   if(i==0)
    	     tuichu();        //退出系统//
    }
    
    
    /*成绩输入*/
    void input()   
    {
      int i=0;     //学生人数初始化//
      char c;
      FILE *fp;     //定义一个文件指针fp//
    	count();     //实时检测总数n//
    	fp=fopen("students.txt","at+");    //以“追加”方式打开students文本文件//
      do 
      {	
       printf("请输入学生的个人信息:\n");
         printf("\n请输入第%d学生的信息:\n",n+1);
         printf("请输入学生的学号:");
         scanf("%d",&student[i].num);
         printf("请输入学生的姓名:");
        scanf("%s",student[i].name);getchar();
        printf("请输入学生的大学语文成绩");
        scanf("%s",student[i].chinese);
        printf("请输入学生的大学数学成绩:");
        scanf("%d",&student[i].math);
        printf("请输入学生的计算机成绩:");
        scanf("%s",student[i].computer);
         getchar();
         student[i].sum=student[i].chinese+student[i].math+student[i].computer;
    		student[i].ave=student[i].sum/3;
    fwrite(&student[i],sizeof(struct students),1,fp);  //以方式将其写入students文本文件//
    	i++;     
    	n++;      
    	printf("\n\n\t\t\t\t是否继续输入(Y/N):");getchar();     //提示是否继续,从键盘  
                                                               获得一个字符//  
    scanf("%c",&c);  
      }
     while(c=='y'||c=='Y');
     fclose(fp);
    }
    
    /*成绩输出*/        
    void output()  
    {
      int i;
      char c;
      FILE *fp;      //定义一个文件指针fp//
      fp=fopen("students.txt","rt");    //以“读取的” 方式打开students文本文件//
      system("cls");     //清屏//
      getchar();
        
    printf("||------||-----||-----||-----||------||-------||-------||------||");
    	printf("|#学号-----姓名------大学语文------大学数学------计算机------总成绩
    -----平均分---#|\n");
      do{  
    	  for(i=0;i<n;i++)  
    	  { 
           fread(&student[i],sizeof(struct students),1,fp);  
           printf("%d",student[i].num);
            printf(" %d",student[i].name);
    	        printf("%d",student[i].chinese);
              printf(" %d ",student[i].math);
              printf("%d ",student[i].computer);
              printf("%d",student[i].sum);
              printf(" %d ",student[i].ave);
         
    	  }
    printf("|------||-----||------||-----||-----||-----||-----||------ |");
      	  printf("\n\n\t\t\t\t是否继续其它操作(Y/N):");     //提示是否继续//
    	      scanf("%c",&c);
    	  c=getchar();
    	}while(c=='y'||c=='Y');
         fclose(fp);      //关闭文件//
    }
    
    /*成绩修改*/
    void xiugai()  { 
      int i,tp,num1;
      char c; 
      FILE *fp;     //定义一个文件指针fp//
    
    lb:  
      printf("\n按学号修改\n\n");
      printf("请输入要修改的学生学号\n");
      scanf("%d",&num1);
    
     for(i=0;i<n;i++) 
     {
    	if(num1==student[i].num)
    	  { 
    		printf("要修改的学生信息为:\n");
            printf("学号\t姓名\t大学语文成绩\t大学数学成绩\t计算机成绩\t总成绩\t
    平均分\n");          
            printf(" %d ",student[i].num);
            printf(" %d ",student[i].name);
            printf(" %d ",student[i].chinese);
            printf(" %d ",student[i].math);
            printf(" %d ",student[i].computer);
            printf(" %d ",student[i].sum);
            printf(" %d ",student[i].ave);
            do {
    		    printf("请选择要修改项:\n");
                printf("1学号\n2姓名\n3大学语文成绩\n4大学数学成绩\n5总成绩\n6平
    均分\n");
                scanf("%d",&tp);
    	            switch(tp)
    			{
    	         case 1:
    				{	 printf("请输入学号:\n");
    		          scanf("%d",&student[i].num);
    		          goto la;
    				}	
    	  	      case 2:
    				{ printf("请输入姓名:\n");
    		          scanf("%s",student[i].name);
    		          goto la;
    				}	
    	  	      case 3:
    				{ printf("请输入大学语文成绩:\n");
    				  getchar();
    		          scanf("%c",&student[i].chinese);
    		         goto la;
    				}	
    	  	      case 4:
    				{ printf("请输入大学数学成绩:\n");
    		          scanf("%d",&student[i].math);
    		         goto la;		  
    				}	
    	  	      case 5:
    				{printf("请输入计算机成绩:\n");
    		          scanf("%s",student[i].computer);	
    		         goto la;
    				}	
    	  	     case 6:
    				{ printf("请输入总成绩:\n");
    		          scanf("%s",student[i].sum);
    		         goto la;
    				}	
    	  	     case 7:
    				{ printf("请输入平均分:\n");
    		          scanf("%s",student[i].ave);
    		         goto la;
    				}
    			}
    		}while (tp<8);		 
    la:	  printf("是否继续修改(y/n)\n");     //提示是否继续//
    	  getchar();
    	  scanf("%c",&c);
    	  if(c=='y'||c=='Y')  goto lb;
             }
      }
        fp=fopen("students.txt","w+");   //以“读写” 方式打开students文本文件//
    	  for(i=0; i<n;i++)
    	  fwrite(&student[i],sizeof(struct students),1,fp);  //以 方式将其写入students
                                                     文本文件//
     fclose(fp);    //关闭文件//
    }
    
    
    /*成绩查询*/
    void query()
    { int querymode;     //子菜单选择//
      int i,j=0,findnum;
      char findname[20];
      int findok,t=0;     //定义一个判断标志的整型变量findok//
      char findct;        //定义一个用于判断是否继续查找的字符变量findct//
      
       FILE *fp;         //定义一个文件指针fp//
       count();     //实时检测总数n//
       fp=fopen("students.txt","r");       //以“只读” 方式打开students文本文件//
       system("cls");     //清屏//
    
      /*查询菜单*/
      printf("\t\t信息查询");
      printf("\n\t1按姓名查询");
      printf("\n\t2按学号查询");
      printf("\n\t0返回上级菜单");
      printf("\n请输入您的操作:");
      scanf("%d",&querymode);
    
      /*查询操作*/
      switch(querymode)
      {case 1: 
        {     printf("请输入要查询学生的姓名:\n");
                getchar();
                scanf("%s",findname); 
                for(i=0;i<N;i++)
    		{
         fread(&student[i],sizeof(struct students),1,fp); //以方式将其读入students
                                                          文本文件//
       if(strcmp(student[i].name,findname)==0)        //比较字符串//
    			 { 
    			   j++;
    			   printf("\n查寻到的学生为:\n");
    			   if(j==1)
                              、
    printf("|------||-----||------||------||------||-------||------||-----|");    
    //仅在第一次显示//
    	printf("|#学号-----姓名------大学语文------大学数学------计算机------总成绩-
    ----平均分---#|\n");
              
    printf("%4d%d%d%d%d%d%d%d",student[i].num,student[i].name,
    student[i].chinese,student[i].math,student[i].sum,student[i].ave);
    			  }
    
    			}
    			if(j==0)
    			  printf("\n>>>查无此人!");
    
               //提示是否继续// 
                printf ("\n是否继续查找(Y/N)?");       
                getchar();
                getchar();}break;
      
        case 2:{ printf("请输入要查询学生的学号:");
                 scanf("%d",&findnum);
                 for(i=0;i<n;i++)
    			 {
                  fread(&student[i],sizeof(struct students),1,fp);        
    //以结构体students的方式从文件fp中读取,将其读入students文本文件,每次读入一个 
    学生的信息//
                  if(student[i].num==findnum)      //整型数字的比较// 
    			  {findok=1;break;}
    			  else findok=0;
    			 }
                  if(!findok)
    				printf("\n>>>查无此人!");
    			  else
    			  { printf("\n查寻到的学生为:\n") ;
    			    if(j==1)
                          printf("|-------||------||------||-------||-------||-------||-------||------|");   
     //仅在第一次显示//
     printf("|学号-----姓名------大学语文------大学数学------计算机------总成绩-----平均分---|\n");
     printf("%4d%d%d%d%d%d%d%d",student[i].num,student[i].name,
    student[i].chinese,student[i].math,student[i].sum,student[i].ave);
    			  }
    //提示是否继续//
          printf ("\n是否继续查找(Y/N)?");       
            getchar();
    			findct=getchar();     //从键盘输入一个判断字符,并将它赋值给字符变量
                                   findct,用于以下的if语句的判断 //
    			if(findct=='Y' || findct=='y')
    			  query();
    		  }
      }
      fclose(fp);    //关闭文件//
    }
    
    
    /*成绩排序*/
    void paixu()
    {
       int i, j;
         FILE *fp;       //定义一个文件指针fp//
       system("cls");      //清屏//
       count();       //实时检测总数n// 
       for(i=0;i<n-1;i++)
    	    for(j=0;j<n-1-i;j++)    //按学号对学生信息进行排序//
    		{
    		     if(student[j].num>student[j+1].num)   //整型数字的比较//
    			 {
    			     student1=student[j];
    			     student[j]=student[j+1];
    			     student[j+1]=student1;
    			 }
    		}
    	fp=fopen("students.txt","w+");  //以 “读写”方式打开students文本文件//
    	for(i=0;i<n;i++)
    	fwrite(&student[i],sizeof(struct students),1,fp);  //以结构体students的方式从
       文件fp中读取,将其写入students文本文件,每次写入一个学生的信息//
        fclose(fp);      //关闭文件//
    }
    
    /*退出系统*/
    void tuichu() 
    {
    	char c;
    	  system("cls");      //清屏//
        printf("\n\n\t\t谢谢使用\n\n\n");
        printf("\n\n\t\t制作人:李姣 渠莉 宝珠 朱佳 刘妍\n");
    	  getchar();
    	c=getchar();       //取用户输入,回显//    
    }

    需要实训报告的同学,请在下方留言,看到会一个个回复的。

    或者直接扫描下方公号,发送 成绩系统 三个字,获取下载源码

    如果失效了,再请直接私信或留言,欢迎大家一起探讨学习。

    相关文章推荐:

    1、 C语言学生成绩管理系统源代码 ★★★★★

    2、 C语言学籍管理系统源代码 ★★

    3、C语言学生成绩管理系统设计 《C语言程序设计》实训报告 ★★★

    展开全文
  • 学生成绩管理系统数据库设计--MySQL

    万次阅读 多人点赞 2020-06-18 13:02:04
    MySQL/SQL Server 数据库设计学生成绩管理系统设计大纲 1. 项目背景及需求分析 1.1 项目背景 1.2 需求分析 1.2.1 信息需求 1.2.2 功能需求 1.2.3 安全性与完整性需求 2. 概念结构设计 2.1 抽象出系统实体 2.2 ...

    MySQL 数据库设计-学生成绩管理系统

    设计大纲

    在这里插入图片描述

    更新时间:2020.6.23

    1. 项目背景及需求分析

    1.1 项目背景

    为了深刻的理解MySQL数据库,以学生成绩信息管理为例,设计一个简单、规范、高效的学生成绩信息管理系统数据库。

    1.2 需求分析

    1.2.1 信息需求

    对学校而言,学生成绩管理是管理工作中重要的一环,但是高校学生的成绩管理工作量大、繁杂,人工处理非常困难。因此,借助于强大计算机的处理能力,能够把人从繁重的成绩管理工作中解脱出来,并且更加准确、安全、清晰的管理环境。

    1.2.2 功能需求

    能够进行数据库的数据定义、数据操纵、数据控制等处理功能。具体功能应包括:可提供课程安排、课程成绩数据的添加、插入、删除、更新、查询,学生及教职工基本信息查询的功能。

    1.2.3 安全性与完整性要求

    对于学生成绩管理系统数据库来讲,由于其主要数据是学生成绩,只能由本人以及所教老师及教务处知道,因此做好数据安全性是重中之重。另外,要求所有在校学生的信息都要录入其中,并且要设计好个别情况。

    2. 概念结构设计

    概念结构设计是整个数据库设计的关键,它通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型。
    根据学生成绩信息管理数据库设计需求抽象出学生、教师、课程、成绩四个实体,对四个实体做简化处理,默认一门课程仅被一位老师讲授。因简化后关系结构比较简单,故省略了局部E-R图。对4个实体之间的关系进行分析如下:
    一位学生会被多位老师教导,一位老师会教导多位学生,所有学生与教师之间是多对多(m:n)的关系;
    一位学生可能会选修多门课程,一门课程会被多位学生选修,所以学生与课程之间是多对多(m:n)的关系;
    一位学生会有多项成绩(具体指某学生一门课程的分数),一项成绩仅被一位学生拥有,所以学生与成绩是一对多(1:n)的关系;
    一位教师会讲授多门课程,一门课程会被一位教师讲授,所以教师与课程的关系是一对多(1:n)的关系;
    一门课程拥有多项成绩,一项成绩仅被一门课程拥有,所以课程与成绩的关系是一对多(1:n)的关系;

    2.1 抽象出系统实体

    学生(学号、姓名、班级、性别、专业、出生日期、学分);
    老师(教师编号、姓名、学院);
    课程(课程编号、教师编号、课程名称、课程学分);
    成绩(学号、课程编号、分数);

    2.2 全局E-R图

    在这里插入图片描述

    3. 逻辑结构设计

    3.1 关系模式

    E-R图向关系模型转化要解决的问题是如何将实体型和实体间的联系转化为关系模式,如何确定这些关系模式的属性和码。
    设计学生成绩管理数据库,包括学生(students)、老师(teachers)、课程(courses)、成绩(scores)四个实体,其关系模式中对每个实体定义属性如下:

    students 表:学号(sid)、姓名(sname)、班级(sclass)、性别(sgender)、专业(smajor)、出生日期(sbirthday)、学分(credit_points),此为联系“students表”所对应的关系模式,学号为该关系的候选码,满足第三范式。

    teachers表:教师编号(tid)、姓名(tname)、学院(tschool),此为联系“teachers表”所对应的关系模式,教师编号为该关系的候选码,满足第三范式。

    courses表:课程编号(cid)、教师编号(tid)、课程名称(cname)、学分(credit_point),此为联系“courses表”所对应的关系模式,课程编号和教师编号为该关系的候选码,满足第三范式。

    scores表:学号(sid)、课程编号(cid)、分数(score),此为联系“scores表”所对应的关系模式,学号和课程编号为该关系的候选码,满足第三范式。

    3.2 函数依赖识别

    后续更新补充

    3.3 范式

    后续更新补充

    3.4 表结构

    数据库中包含4个表,即学生(students)、老师(teachers)、课程(courses)、成绩(scores)。

    students表的表结构
    在这里插入图片描述
    teachers表的表结构
    在这里插入图片描述
    courses表的表结构
    在这里插入图片描述
    scores表的表结构
    在这里插入图片描述

    4. 物理设计和实施

    4.1 数据库及表创建

    4.1.1 创建数据库

    -- 如果已有该数据库,则删除
    DROP DATABASE IF EXISTS StudentScore;
    
    -- 创建数据库
    CREATE DATABASE StudentScore CHARSET=UTF8;
    

    4.1.2 创建数据表

    -- 使用数据库
    USE StudentScore;
    
    -- 创建数据表
    -- table 1: students
    DROP TABLE IF EXISTS students;
    CREATE TABLE students(
    sid INT(20) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
    sname VARCHAR(20),
    sclass INT(10),
    sgender VARCHAR(10),
    smajor VARCHAR(20),
    sbirthday DATE,
    credit_points INT(5) -- 学生已修学分
    );
    
    -- table 2: teachers
    DROP TABLE IF EXISTS teachers;
    CREATE TABLE teachers(
    tid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
    tname VARCHAR(20),
    tschool VARCHAR(20)
    );
    
    -- table 3: courses
    DROP TABLE IF EXISTS courses;
    CREATE TABLE courses(
    cid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
    cname VARCHAR(20),
    credit_point INT(5), -- 课程学分
    tid INT(10) UNSIGNED NOT NULL,
    FOREIGN KEY(tid) REFERENCES teachers(tid)
    );
    
    -- table 4: scores
    DROP TABLE IF EXISTS scores;
    CREATE TABLE scores(
    sid INT(10) UNSIGNED NOT NULL,
    cid INT(10) UNSIGNED NOT NULL,
    score DECIMAL(5, 2),
    FOREIGN KEY(sid) REFERENCES students(sid),
    FOREIGN KEY(cid) REFERENCES courses(cid)
    );
    
    

    4.2 表数据增删改查测试

    4.2.1 MySQL基础知识点总结

    在这里插入图片描述

    4.2.2 精选MySQL练习题数据及解析

    点击查看
    4.2.2 精选MySQL练习题数据及答案解析

    4.2.2.1. 连接查询 - 4题

    1.1 查询同时选修了课程 1 和 课程 2 的学生的信息

    1.2 查询课程 1 比 课程 2 成绩高的学生的信息及课程分数

    1.3 查询课程 1 分数小于 60 的学生信息和课程分数,按分数降序排列

    1.4 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

    4.2.2.2. 子查询、连接查询 - 4题

    2.1 查询有成绩的学生信息

    2.2 查询学过 孙悟空 老师所授课程的学生信息

    2.3 查询至少有一门课与学号为 1 的同学所学相同的学生信息

    2.4 查询选修了课程 2 但是没有选修课程 1 的学生信息

    4.2.2.3. 聚合分组、连接查询 - 8题

    3.1 查询同名学生名单,并统计同名人数

    3.2 查询选修了 3 门课程的学生信息

    3.3 查询平均成绩大于等于 85 的所有学生的学号、姓名、平均成绩(保留2位小数)

    3.4 查询平均成绩大于等于 60 分的学生学号、姓名、平均成绩(保留2位小数)

    3.5 查询两门及以上课程分数小于60分的学生学号、姓名及平均成绩(保留2位小数)

    3.6 查询姓 赵 的同学的学生信息、总分,若没选课则总分显示为 0

    3.7 查询所有同学的学号、姓名、选课总数、总成绩,没选课的学生要求显示选课总数和总成绩为 0

    3.8 查询所有学生学号、姓名、选课名称、总成绩,按总成绩降序排序,没选课的学生显示总成绩为 0

    4.2.2.4. if 或 case 语句 - 2题

    4.1 若学号sid为学生座位编号,现开始对座位号调整,奇数号和偶数号对调,如1和2对调、3和4对调…等, 如果最后一位为奇数,则不调换座位,查询调换后的学生座位号(sid)、姓名,按sid排序

    4.2 查询各科成绩最高分、最低分和平均分: 以如下形式显示:课程id、课程名、选修人数、最高分、最低分、平均分、及格率、中等率、优良率、优秀率
    及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
    要求查询结果按人数降序排列,若人数相同,按课程号升序排列,平均分、及格率等保留2位小数

    4.2.2.5. 时间函数 - 6题

    5.1 查询 1990 年出生的学生信息

    5.2 查询各学生的年龄,分别按年份和按出生日期来算

    5.3 查询本周或下周过生日的学生

    5.4 查询本月或下月过生日的学生

    5.5 查询学生信息,要求:学号和年龄同时至少比一位学生的学号和年龄大

    5.6 查询连续相邻3年出生的学生中,学生性别相同的学生信息

    4.2.2.6.综合应用 - 12题

    6.1 查询和学号为 1 的同学学习的课程完全相同的其他同学的信息

    6.2 查询每科均及格的人的平均成绩:学号、姓名、平均成绩(保留2位小数)

    6.3 查询选修 张若尘 老师所授课程的学生中,该门课成绩最高的学生信息及成绩(成绩可能重复)

    6.4 查询各科成绩,按各科成绩进行排序,并显示排名 分数重复时保留名次空缺,即名次不连续

    6.5 查询各科成绩,按各科成绩进行排序,并显示排名 分数重复时不保留名次空缺,即名次连续

    6.6 查询学生 赵雷 的 变形 课程成绩的排名:学生信息,分数,排名 分数重复时不保留名次空缺,即名次连续

    6.7 查询课程 时空穿梭 成绩在第2-4名的学生,要求显示字段:学号、姓名、课程名、成绩 分数重复时不保留名次空缺,即名次连续

    6.8 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺,即名次连续

    6.9 查询学生的总成绩,并进行排名,总分重复时保留名次空缺,及名次不连续 排名名次不连续,不需要去重

    6.10 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 分别所占百分比 结果:保留2位小数

    6.11 查询各科成绩前三名的记录,按照课程编号和分数排序 分数重复时,重复分数按照一名算,即不保留名次空缺,及名次连续

    6.12 查询各科成绩的前两名,列出学生信息、课程名、分数,按照课程名、分数排序 分数重复时,重复分数按照一名算,即不保留名次空缺,及名次连续

    4.2.2.7 MySQL练习题数据及答案解析

    点击查看
    4.2.2 精选36道MySQL练习题数据及答案解析

    4.3 创建视图

    4.3.1 创建一个学生视图,要求显示学生学号、姓名、班级、性别、专业、各科成绩、平均分、总分

    DROP VIEW IF EXISTS v_students_info;
    
    CREATE VIEW v_students_info AS
    SELECT  stu.sid,
    		stu.sname,
    		stu.sclass,
    		stu.sgender,
    		stu.smajor,
    		sum(if(c.cname = "变形", sc.score, 0)) AS "变形",
    		sum(if(c.cname = "时空穿梭", sc.score, 0)) AS "时空穿梭",
    		sum(if(c.cname = "分解术", sc.score, 0)) AS "分解术",
    		sum(if(c.cname = "炼器", sc.score, 0)) AS "炼器",
    		sum(if(c.cname = "炼丹", sc.score, 0)) AS "炼丹",
    		sum(if(c.cname = "飞行", sc.score, 0)) AS "飞行",
    		round(ifnull(avg(sc.score), 0), 2) AS "平均分",
    		ifnull(sum(sc.score), 0) AS "总分"
    FROM 	students stu LEFT JOIN
    		scores sc ON stu.sid = sc.sid LEFT JOIN
    		courses c ON c.cid = sc.cid
    GROUP BY stu.sid;
    

    查看视图:
    在这里插入图片描述
    在这里插入图片描述

    4.4 创建函数

    4.4.1 创建一个通过学号sid获取学生信息的函数

    DROP FUNCTION IF EXISTS get_student_info_by_sid;
    
    DELIMITER //
    CREATE DEFINER = CURRENT_USER FUNCTION get_student_info_by_sid(id INT)
    RETURNS VARCHAR(300)
    DETERMINISTIC
    BEGIN
    RETURN (SELECT CONCAT('姓名: ', sname, ' , ', '性别: ', sgender, ' , ', '专业:', smajor)
    FROM students WHERE sid = id);
    END//
    DELIMITER ;
    -- 调用函数
    SELECT get_student_info_by_sid(8);
    

    调用函数结果:
    在这里插入图片描述
    其中DELIMITER 先定义结束符为 // , 然后又将结束符改为mysql默认的分号结束符。

    了解delimiter 关键字请点击:
    MySQL中 delimiter 关键字详解
    如果出现报错1418:

    Error Code : 1418 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)

    参考下面:
    MySQL ERROR 1418 的解决方法

    4.4.2 自定义函数 2:要求函数体中包含其中一种流程控制语句,要求输入学生学号sid、课程编号,显示学生姓名、课程名称、成绩是否及格(即成绩>=60)

    
    DROP FUNCTION IF EXISTS get_student_scores_by_id;
    
    DELIMITER //
    CREATE DEFINER = CURRENT_USER FUNCTION get_student_scores_by_id(sid INT, cid INT)
    RETURNS VARCHAR(300)
    DETERMINISTIC
    BEGIN
    	-- 多个变量要分开声明,否则会报错
    	DECLARE score INT;
    	DECLARE name VARCHAR(20);
    	DECLARE course_name VARCHAR(20);
    	SELECT sc.score INTO score
    	FROM scores AS sc
    	WHERE sc.sid = sid AND sc.cid = cid;
    	SELECT sname INTO name FROM students AS stu WHERE stu.sid = sid;
    	SELECT cname INTO course_name FROM courses AS co WHERE co.cid = cid;
    	IF score >= 60 THEN
    		RETURN CONCAT(name, '--', course_name, '--', '及格');
    	ELSEIF score > 0 AND score < 60 THEN
    		RETURN CONCAT(name, '--', course_name, '--', '不及格');
    	ELSE
    		RETURN '找不到该学生、课程或该学生没有选课!';
    	END IF;
    END//
    DELIMITER ;
    
    -- 调用函数
    SELECT get_student_scores_by_id(1, 2);
    
    

    调用函数结果:
    在这里插入图片描述

    4.5 创建存储过程

    4.5.1 学生每选修一门课,如果该门课程成绩达到60分及以上,则把该门课程学分加到学生学分里面,输出该学生姓名、学分

    DROP PROCEDURE IF EXISTS add_scores;
    
    DELIMITER //
    CREATE DEFINER = CURRENT_USER PROCEDURE add_scores(
    	IN stu_id INT, 
    	IN co_id INT, 
    	IN s_score INT,
    	OUT name VARCHAR(20),
    	OUT s_credit_point INT
    )
    DETERMINISTIC
    BEGIN
    -- 多个变量要分开声明,否则会报错
    DECLARE points INT;
    INSERT INTO scores (sid, cid, score)
    VALUES (stu_id, co_id, s_score);
    SELECT credit_point INTO points FROM courses WHERE cid = co_id;
    IF s_score >= 60 THEN
    	UPDATE students 
    	SET credit_points = credit_points + points
    	WHERE sid = stu_id;
    END IF;
    -- 注意:多个输出值一定要用多个SELECT来赋值,否则会报错
    SELECT sname INTO name FROM students WHERE sid = stu_id;
    SELECT credit_points INTO s_credit_point FROM students WHERE sid = stu_id;
    COMMIT;
    END//
    DELIMITER ;
    
    -- 测试调用存储过程
    SELECT * FROM students WHERE sid > 10;
    CALL add_scores(11, 2, 33, @name, @s_credit_point);
    SELECT @name, @s_credit_point;
    CALL add_scores(12, 2, 88, @name, @s_credit_point);
    SELECT @name, @s_credit_point;
    
    

    调用存储过程结果:
    在这里插入图片描述

    4.6 创建触发器

    4.6.1 创建一个更新学生学分的触发器,如果该学生分数>=60,则给该学生加上这门课的学分

    语法
    create trigger triggerName
    after/before insert/update/delete on 表名 for each row #这句话在mysql是固定的 begin
    sql语句;
    end;

    
    DROP TRIGGER IF EXISTS update_credit_point;
    
    DELIMITER //
    CREATE TRIGGER update_credit_point
    AFTER INSERT ON scores FOR EACH ROW
    BEGIN 
    	DECLARE points INT;
    	SELECT co.credit_point INTO points FROM courses AS co WHERE co.cid = new.cid;
    	IF new.score >= 60 THEN
    		UPDATE students SET credit_points = credit_points + points
    		WHERE sid = new.sid;
    	END IF;
    END//
    DELIMITER ;
    
    
    -- 测试数据
    SELECT * FROM students WHERE sid < 3;
    INSERT INTO scores VALUES
    (1, 4, 77),
    (2, 4, 55);
    SELECT * FROM students;
    

    测试结果:
    在这里插入图片描述
    终于写完啦!

    展开全文
  • MFC课程设计 --学生成绩管理系统

    万次阅读 多人点赞 2018-07-26 21:12:55
    MFC课程设计 ,C++课程设计 --学生成绩管理系统 ps:因为课设完成的过程大家都不太一样,以下的代码仅供学习一下在MFC下各个控件的用法,有问题欢迎留言讨论。     实验目的 使用MFC类库编制应用程序:按钮...

    MFC课程设计 ,C++课程设计 --学生成绩管理系统

    ps:因为课设完成的过程大家都不太一样,以下的代码仅供学习一下在MFC下各个控件的用法,有问题欢迎留言讨论。

     

     

    • 实验目的
    1. 使用MFC类库编制应用程序:按钮控件、静态控件及编辑框的应用。
    2. 了解MFC类的层次结构及主要类的用法,掌握使用MFC和向导来编写Windows应用程序。
    3. 熟悉Microsoft Visual Studio2013的开发环境。
    4. 掌握在Microsoft Visual Studio2013开发环境调试程序的方法。
    5. 掌握静态控件、按钮、流动条、编辑框、列表框、组合框和对话框的创建、消息发送和控件控制等内容。
    6. 对前面所学知识的总结,通过一个比较完整的应用程序的设计,将学过的知识连贯起来,掌握开发一个实际应用程序的步骤,同时学会使用开发工具实现界面友好的应用程序。并通过本实验,掌握如何运用面向对象技术对具体的应用系统进行分析和设计。

    二、实验内容

     

    本次c++课设的学生成绩管理系统是面向学生和教师的。该系统有三种身份账号,其中学生账号可以在里面查询自己的成绩,而教师账号可以添加,删除和修改学生的成绩,而管理员账号可以添加,删除和修改学生的成绩外,还能可以添加,删除和修改登录使用的账号。

    另外,用单文档设计的学生成绩分析图形绘制。并用该学生成绩管理系统调用该画图的exe文件,实现在该学生成绩管理系统中显示学生成绩的直方图和曲线图。

    登录界面:

     

     

    学生成绩管理界面:

    (1)、设计一个学生类Student,包括数据成员:姓名、学号、五门课程(高等数学,离散数学,C++课设,大学英语,大学体育)的成绩。

    (2)、创建一个基于对话框的MFC应用程序,程序窗口的标题上有你姓名、学号和应用程序名称。使用(1)的类,实现对学生信息和成绩的输入和管理。

    (3)、创建一个单文档的MFC应用程序,读取(2)中保存的文件中的学生成绩,分别用直方图和折线方式显示所有学生某课程的成绩分布图。

    (4)创建一个登录管理界面,学生可以用学生账号登录查看成绩,教师可以使用教师账号登录查看并添加,删除,修改学生的成绩。而管理员账号可以添加,删除和修改学生和老师的登录账号,老师和学生账号只能修改自身的登录密码。

    (5)创建一个学生成绩管理主界面,上面有list控件之间将存储在文件的学生信息显示在主界面上,另外还有查找控件,组合控件进行排序,添加,删除和修改控件。还有账号管理,重新登录和退出控件。

    (6)创建一个学生信息查找后显示的学生详细信息界面,拥有教师账号的用户可以通过对这个界面信息的修改,按下“修改保存”的控件进行信息的修改。

     

     

     

     

     

     

     

    (7)点击组合框排序,按确定键后,会通过list和文件的操作,进行对应的排序。可以进行的排序为:学号,高数成绩,离散成绩,c++课设成绩,英语成绩,体育成绩。排序后的内容会直接显示在学生成绩管理的主界面list中。

     

     

    (8)用单文档对学生成绩储存的文件进行操作,并进行直方图和折线图的绘画。在学生成绩管理住界面点击统计分析,可以直接调用该单文档exe.

     

     

    (8)创建一个重新登录界面,用户可以通过重新登录的方法进行该学生成绩管理系统用户的更换。该界面需要输入学号,旧密码,新密码,再次输入新密码才能修改该账号的密码。

    (9)创建一个登录账号管理界面,只有admin的管理员账号才能进行账号的添加,修改和删除。

    三实验设备

     

    Win7操作系统

    Microsoft Visual Studio2013

     

    四、实验要求

     

    1.  使用MFC类库编制应用程序:按钮控件、静态控件及编辑框的应用。

    2.  了解MFC类的层次结构及主要类的用法,掌握使用MFC和向导来编写Windows应用程序。

    3掌握静态控件、按钮、流动条、编辑框、列表框、组合框和对话框的创建、消息发送和控件控制等内容。

    4对前面所学知识的总结,通过一个比较完整的应用程序的设计,将学过的知识连贯起来,掌握开发一个实际应用程序的步骤,同时学会使用开发工具实现界面友好的应用程序。并通过本实验,掌握如何运用面向对象技术对具体的应用系统进行分析和设计。

     

    五、实验程序

    (1)登录界面

    LoginDlg.cpp的主要关键代码

              //在主界面调用之前在BOOL CMFC课设学生成绩管理系统App::InitInstance()

    中添加

    CLoginDlg dl;

             if (IDCANCEL == dl.DoModal())

                       return FALSE;

    功能是实现先调用登录窗口。

    void CLoginDlg::OnBnClickedOk()    //点击登录的响应函数
    {
    	if (CheckSuer())               //登录账号和密码的确定是否正确
    		CDialog::OnOK();	
    	else
    	{
    		AfxMessageBox("用户名或密码错误");   //密码错误则弹出窗口提示错误
    		SetDlgItemText(IDC_NAME, "");        //重置两个编辑框
    		SetDlgItemText(IDC_PASS, "");
    		this->SetFocus();
    	}
    }
    
    bool  CLoginDlg::CheckSuer()         //账户和密码确认
    {
    	CString szName, szPass;
    	GetDlgItemText(IDC_NAME, szName);
    	GetDlgItemText(IDC_PASS, szPass);
    	szName.MakeLower();
    	
    	if (szName == "admin"&&szPass == "123")    //是否为管理员账号
    	{
    		SUser u = { "admin", "123", 1 };
    		theApp.m_us = u;                    //将登录人员的信息记录在theApp中
    		return TRUE;
    
    	}
    	SUser u;
    	CFile file;
    	if (!file.Open("./user.dat", CFile::modeRead))
    	{
    		CreatUser();
    		if (!file.Open("./user.dat", CFile::modeRead))
    			return FALSE;
    	}
    	while (file.Read(&u, sizeof(u)))
    	{
    		if (szName == u.sName&&szPass == u.sPass)
    		{
    			theApp.m_us = u;
    			return TRUE;
    		}
    	}
    	return FALSE;
    }
    void CLoginDlg::CreatUser()          //如果不存在账号和密码存储的文件,则新建一个存储文件
    {
    	CFile file;
    	if (!file.Open("./user.dat", CFile::modeCreate | CFile::modeWrite))
    	{
    		AfxMessageBox("用户文件创建失败");
    		return;
    	}
    }
    

    (2)学生成绩管理主界面

    BEGIN_MESSAGE_MAP(CMFC课设学生成绩管理系统Dlg, CDialogEx)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_BN_CLICKED(IDC_ManagePower, &CMFC课设学生成绩管理系统Dlg::OnBnClickedManagepower)
    	ON_BN_CLICKED(IDC_AGAIN_LOGIN, &CMFC课设学生成绩管理系统Dlg::OnBnClickedAgainLogin)
    	ON_BN_CLICKED(IDC_STUDENT_ADD, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentAdd)
    	ON_BN_CLICKED(IDC_STUDENT_DEL, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentDel)
    	ON_BN_CLICKED(IDC_STUDENT_SEEK, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentSeek)
    	ON_BN_CLICKED(IDC_STUDENT_CHANGE, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentChange)
    	ON_BN_CLICKED(IDC_BUTTON8, &CMFC课设学生成绩管理系统Dlg::OnBnClickedButton8)
    	ON_BN_CLICKED(IDC_STUDENT_IDCANCEL, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentIdcancel)
    	ON_BN_CLICKED(IDC_STUDENT_DIALOG_OKSORT, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentDialogOksort)
    	ON_BN_CLICKED(IDC_PICTURE_ANALYSIS, &CMFC课设学生成绩管理系统Dlg::OnBnClickedPictureAnalysis)
    END_MESSAGE_MAP()
    
    
    // CMFC课设学生成绩管理系统Dlg 消息处理程序
    
    BOOL CMFC课设学生成绩管理系统Dlg::OnInitDialog()  //初始化窗口
    {
    	CDialogEx::OnInitDialog();
    	CString str = "1606100*** 卟咚君 学生成绩管理系统           用户:";    //在窗口左上角设置自己的姓名和学号(课设要求),以及本次显示登录的账号
    	str += theApp.m_us.sName;
    	SetWindowText(str);
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);     // 初始化(IDC_STUDENT_DIALOG)ListCtrl控件
    	pList->InsertColumn(0, "体育", 0, 80);    
    	pList->InsertColumn(0, "英语", 0, 80);
    	pList->InsertColumn(0, " c++", 0, 80);
    	pList->InsertColumn(0, "离散", 0, 80);
    	pList->InsertColumn(0, "高数", 0, 80);
    	pList->InsertColumn(0, "姓名", 0, 100);
    	pList->InsertColumn(0, "学号", 0, 100);
    	SortStudent(0);
    	ReadStudent(pList);
    	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_STUDENT_DIALOG_SORTLIST);   //设置(IDC_STUDENT_DIALOG)CComboBox控件
    	pComb->AddString("学号");   
    	pComb->AddString("高数");
    	pComb->AddString("离散");
    	pComb->AddString("c++");
    	pComb->AddString("英语");
    	pComb->AddString("体育");
    	pComb->SetCurSel(0);
    	CComboBox* pComb1 = (CComboBox*)GetDlgItem(IDC_STUDENT_DIALOG_SORTLIST);   //获得排列组合控件的信息
    	int nSel = pComb1->GetCurSel();
    	GetDlgItem(IDC_STUDENT_ADD)->EnableWindow(theApp.m_us.nPrior);     //对应相应的身份权限设置是否屏蔽添加权限
    	GetDlgItem(IDC_STUDENT_DEL)->EnableWindow(theApp.m_us.nPrior);     //对应相应的身份权限设置是否屏蔽删除权限
    	GetDlgItem(IDC_STUDENT_CHANGE)->EnableWindow(theApp.m_us.nPrior);   //对应相应的身份权限设置是否屏蔽修改权限
    	//pComb->SetItemHeight(25,25);
    	//GetDlgItem(IDC_ManagePass)->EnableWindow(theApp.m_us.nPrior);
    	//GetDlgItem(IDC_ManagePower)->EnableWindow(theApp.m_us.nPrior);
    
    	// 将“关于...”菜单项添加到系统菜单中。
    
    	// IDM_ABOUTBOX 必须在系统命令范围内。
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		BOOL bNameValid;
    		CString strAboutMenu;
    		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    		ASSERT(bNameValid);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
    	//  执行此操作
    	SetIcon(m_hIcon, TRUE);			// 设置大图标
    	SetIcon(m_hIcon, FALSE);		// 设置小图标
    
    	// TODO:  在此添加额外的初始化代码
    
    	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }
    
    void CMFC课设学生成绩管理系统Dlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialogEx::OnSysCommand(nID, lParam);
    	}
    }
    
    // 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。
    
    void CMFC课设学生成绩管理系统Dlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // 用于绘制的设备上下文
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// 使图标在工作区矩形中居中
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// 绘制图标
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialogEx::OnPaint();
    	}
    }
    
    //当用户拖动最小化窗口时系统调用此函数取得光标
    //显示。
    HCURSOR CMFC课设学生成绩管理系统Dlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedManagepower()    //“账号管理”控件响应函数,调用 CPower(管理权限)类的窗口
    {
    	CPower dl;
    	dl.DoModal();
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedAgainLogin()   //“重新登录”控件响应函数
    {
    	CDialog::OnCancel();                                    //关闭当前的学生成绩管理系统窗口
    	CLoginDlg dl;                                          //调用登录窗口
    	if (IDOK == dl.DoModal())                              //成功登录返回IDOK,在调用新的学生成绩管理系统窗口
    	{                                                      //登录退出则返回IDCANCEL
    		CMFC课设学生成绩管理系统Dlg dlg;
    		dlg.DoModal();
    	}
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentAdd()    //“添加”控件响应函数,调用IDD_StudentSpecificAddDlg添加窗口,添加学号和相应成绩信息
    {
    	CStudentSpecificAddDlg dl;
    	if (IDCANCEL == dl.DoModal())
    	{
    		CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);  //关闭IDD_StudentSpecificAddDlg添加窗口,读取储存学生成绩的文件刷新学生成绩管理系统窗口
    		CMFC课设学生成绩管理系统Dlg::ReadStudent(pList);
    		OnBnClickedStudentDialogOksort();
    	}
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::ReadStudent(CListCtrl* pList)    //读取储存学生成绩的文件,并加载在学生成绩管理系统窗口的CListCtrl中
    {
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		GreatStudentfile();
    		return;
    	}
    	pList->DeleteAllItems();
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		pList->InsertItem(i, u.sId);
    		pList->SetItemText(i, 1, u.sName);
    		pList->SetItemText(i, 2, u.sHigher_math);
    		pList->SetItemText(i, 3, u.sDiscrete_math);
    		pList->SetItemText(i, 4, u.sC_program);
    		pList->SetItemText(i, 5, u.sEnglish);
    		pList->SetItemText(i, 6, u.sSports);
    		i++;
    	}
    	file.Close();
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::GreatStudentfile()   //创建用户登录账号储存文件
    {
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeCreate | CFile::modeWrite))
    	{
    		AfxMessageBox("用户文件创建失败");
    		return;
    	}
    	file.Close();
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentDel()  // “删除”控件响应函数
    {
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);
    	Student ur;
    	int nSel = pList->GetSelectedCount();    //获取当前鼠标选择的学号数量
    	if (nSel < 1)
    	{
    		AfxMessageBox("请选择一个账户再删除!");
    		return;
    	}
    	int nSelText = pList->GetSelectionMark();   //获取当前鼠标选择的一个学号位置
    	pList->GetItemText(nSelText, 0, ur.sId, sizeof(ur.sId));
    	pList->DeleteItem(nSelText);   //删除当前鼠标选择的学号位置
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开!");
    		return;
    	}
    	CFile temporaryfile;
    	if (!temporaryfile.Open("./temporarystudentfile.dat", CFile::modeCreate|CFile::modeWrite| CFile::shareDenyNone))
    	{
    		GreatTemporaryStudentfile();
    		return;
    	}
    	Student u;
    	while (file.Read(&u, sizeof(u)) == sizeof(u)) //读取学生成绩储存文件,将未删除的学生信息写入临时文件temporaryfile中
    	{
    		if ((CString)u.sId == (CString)ur.sId)
    			continue;
    		temporaryfile.Write(&u, sizeof(u));
    	}
    	file.Close();
    	temporaryfile.Close();
    	if (!file.Open("./studentfile.dat", CFile::modeCreate|CFile::modeWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开!");
    		return;
    	}
    	if (!temporaryfile.Open("./temporarystudentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开!");
    		return;
    	}
    	while (temporaryfile.Read(&u, sizeof(u)) == sizeof(u))  //读取学生成绩储存文件,将临时文件temporarystudentfile.dat中学生信息写入真正存储学生信息的studentfile.dat中
    		file.Write(&u, sizeof(u));
    	CMFC课设学生成绩管理系统Dlg::ReadStudent(pList);  //更新学生成绩管理系统界面的信息
    	OnBnClickedStudentDialogOksort();
    	return;
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentSeek()   //“查找”控件对应的函数,查找学生的学号
    {
    	int nNum;
    	char str[20];
    	GetDlgItemText(IDC_STUDENT_DIALOG_ID, str, sizeof(str));  //获取编辑框的学号信息
    	if ((CString)str == "")
    	{
    		AfxMessageBox("请在学号框里输入学号!");
    		return;
    	}
    	nNum = Seek_Student(str);  //查询该学号是否存在
    	if (nNum == -1)
    	{
    		AfxMessageBox("该用户不存在!");
    	}
    	Student u;
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开!");
    		return;
    	}
    	while (file.Read(&u, sizeof(u)) == sizeof(u)) //查询该学号同学的详细信息
    	{
    		if ((CString)u.sId == (CString)str)
    		{
    			theApp.m_student = u;
    			file.Close();
    			CStudentSpecificSeekDlg dlg;  //将该学号同学的详细信息显示在详细信息窗口(IDD_STUDENT_SPECIFIC_DIALOG)
    			if (IDCANCEL == dlg.DoModal())
    			{
    				CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);  //更新学生成绩管理系统界面的信息
    				CMFC课设学生成绩管理系统Dlg::ReadStudent(pList);
    			}
    			return;
    		}
    	}
    	file.Close();
    }
    
    
    int CMFC课设学生成绩管理系统Dlg::Seek_Student(char *str)   //查询该同学是否存在学生成绩管理系统的CListCtrl中
    {
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);
    	int nCount = pList->GetItemCount();
    	int i = 0;
    	while (i < nCount)
    	{
    		if (pList->GetItemText(i, 0) == (CString)str)
    		{
    			return i;
    		}
    		i++;
    	}
    	return -1;
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentChange()  //"修改“控件响应的函数,修改学生的信息
    {
    	
    	OnBnClickedStudentSeek();                                  //调用查找函数,修改在查找函数中实现
    }
    
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedButton8()          //"退出”控件响应函数,退出学生成绩管理系统
    {
    	CDialog::OnCancel();
    }
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentIdcancel()
    {
    	CDialog::OnCancel();
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::GreatTemporaryStudentfile()    //创建临时存储学生信息的文件
    {
    	CFile file;
    	if (!file.Open("./temporarystudentfile.dat", CFile::modeCreate | CFile::modeWrite))
    	{
    		AfxMessageBox("用户文件创建失败");
    		return;
    	}
    	file.Close();
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentDialogOksort()  //排序"确定”控件响应函数,进行(学号,高数,离散,c++课设,英语,体育成绩)的排序
    {
    	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_STUDENT_DIALOG_SORTLIST);
    	int nSel = pComb->GetCurSel();
    	SortStudent(nSel);
    	
    }
    
    bool nsort_id(Student a, Student b)  //学号(ID)大小比较函数
    {
    	return _ttoi((CString)a.sId)<_ttoi((CString)b.sId);  //将char转换成CString,在转化成int
    }
    bool sort_higher_math(Student a, Student b)
    {
    	return _ttoi((CString)a.sHigher_math)>_ttoi((CString)b.sHigher_math);  //高数(Higher_math)大小比较函数
    }
    bool sort_discrete_math(Student a, Student b)
    {
    	return _ttoi((CString)a.sDiscrete_math) > _ttoi((CString)b.sDiscrete_math);  //离散(Discrete_math)大小比较函数
    }
    bool sort_c_program(Student a, Student b)
    {
    	return _ttoi((CString)a.sC_program) > _ttoi((CString)b.sC_program);   //c++(C_program)大小比较函数
    }
    bool sort_english(Student a, Student b)
    {
    	return _ttoi((CString)a.sEnglish) > _ttoi((CString)b.sEnglish); //英语(English)大小比较函数
    }
    bool sort_sports(Student a, Student b)
    {
    	return _ttoi((CString)a.sSports)> _ttoi((CString)b.sSports);   //英语(Sports)大小比较函数
    }
    void CMFC课设学生成绩管理系统Dlg::SortStudent(int nNum)    //对应排序对学生信息进行排序
    {
    	Student SomeStudent[1000];
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法排序!");
    		return;
    	}
    	int i = 0;
    	while (file.Read(&SomeStudent[i], sizeof(SomeStudent[i])) == sizeof(SomeStudent[i]))
    	{
    		i++;
    	}
    	file.Close();
    	int b = (CString)SomeStudent[0].sId < (CString)SomeStudent[1].sId;
    	if (nNum == 0)    //0是学号成绩排序
    		std::sort(SomeStudent, SomeStudent+i, nsort_id);  //排序是直接调用STL中的快排
    	if (nNum == 1)     //1是高数成绩排序
    		std::sort(SomeStudent, SomeStudent + i, sort_higher_math);
    	if (nNum == 2)    //2是离散成绩排序
    		std::sort(SomeStudent, SomeStudent + i, sort_discrete_math);
    	if (nNum == 3)    //3是C++课设成绩排序
    		std::sort(SomeStudent, SomeStudent + i, sort_c_program);
    	if (nNum == 4)    //4是英语成绩排序
    		std::sort(SomeStudent, SomeStudent + i, sort_english);
    	if (nNum == 5)    //5是体育成绩排序
    		std::sort(SomeStudent, SomeStudent + i, sort_sports);
    	if (!file.Open("./studentfile.dat", CFile::modeCreate | CFile::modeWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法排序!");
    		return;
    	}
    	int t = 0;
    	while (t<i)  //将排好序的信息写入学生成绩存储文件
    	{
    		file.Write(&SomeStudent[t], sizeof(SomeStudent[t]));
    		t++;
    	}
    	file.Close();
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);
    	CMFC课设学生成绩管理系统Dlg::ReadStudent(pList); //将排好序的学生信息更新到学生成绩管理系统的CListCtrl中
    
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedPictureAnalysis()  //"统计分析“控件响应的函数
    {
    	ShellExecute(NULL, "open", "E://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//MFCApplication1.exe", NULL, NULL, SW_SHOWNORMAL);
    	//用ShellExecute调用可以画直方图和折线图的exe文件
    }
    

    3)添加学生信息的窗口

    BEGIN_MESSAGE_MAP(CStudentSpecificAddDlg, CDialog)
    	ON_BN_CLICKED(IDC_STUDENG_SPECIFIC_ADD_SAVE, &CStudentSpecificAddDlg::OnBnClickedStudengSpecificAddSave)
    	ON_BN_CLICKED(IDC_STUDENG_SPECIFIC_ADD_INCANCE, &CStudentSpecificAddDlg::OnBnClickedStudengSpecificAddIncance)
    END_MESSAGE_MAP()
    
    
    // CStudentSpecificAddDlg 消息处理程序
    
    
    BOOL CStudentSpecificAddDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    	return TRUE;
    }
    
    
    void CStudentSpecificAddDlg::OnBnClickedStudengSpecificAddSave()  //"添加保存:控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	Student u;
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_ID, u.sId, sizeof(u.sId));  //将学号编辑框的内容写入u.sId
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_NAME, u.sName, sizeof(u.sName));  //将姓名编辑框的内容写入u.sName
    	if (IDC_STUDENG_SPECIFIC_ADD_MALE == GetCheckedRadioButton(IDC_STUDENG_SPECIFIC_ADD_MALE, IDC_STUDENG_SPECIFIC_ADD_FEMALE))
    		u.nSex = true;
    	else
    		u.nSex = false;
    	//IDC_STUDENG_SPECIFIC_ADD_MALE为“男”控件ID,IDC_STUDENG_SPECIFIC_ADD_FEMALE为“女'控件的ID
    	//用GetCheckedRadioButton函数获取RadioButton控件的信息,GetCheckedRadioButton(IDC_STUDENG_SPECIFIC_ADD_MALE, IDC_STUDENG_SPECIFIC_ADD_FEMALE)返回
    	//IDC_STUDENG_SPECIFIC_ADD_MALE则为男,否则为女
    
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_AGE, u.sAge, sizeof(u.sAge));  //将年龄编辑框的内容写入u.sAge
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_ADDRESS, u.sAddress, sizeof(u.sAddress));  //将地址编辑框的内容写入u.sAddress
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_HIGHERMATH, u.sHigher_math, sizeof(u.sHigher_math));  //将高数编辑框的内容写入u.sHigher_math
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_DISCRETEMATH, u.sDiscrete_math, sizeof(u.sDiscrete_math));  //将离散编辑框的内容写入u.sDiscrete_math
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_CPROGRAM, u.sC_program, sizeof(u.sC_program));  //将C++课设编辑框的内容写入u.sC_program
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_ENGLISH, u.sEnglish, sizeof(u.sEnglish));   //将英语编辑框的内容写入u.sEnglish
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_SPORTS, u.sSports, sizeof(u.sSports));   //将体育编辑框的内容写入u.sSports
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeReadWrite|CFile::shareDenyNone))
    	{
    		AfxMessageBox("添加失败,文件打不开!");
    		return ;
    	}
    	Student ur;
    	while (file.Read(&ur, sizeof(ur)))   //读取学生文件信息,看学号是否重复
    	{
    		if ((CString)ur.sId == (CString)u.sId)
    		{
    			AfxMessageBox("用户已存在!");
    			return;
    		}
    	}
    	file.SeekToEnd();   //将指针移到文件末尾
    	file.Write(&u, sizeof(u));  //在文件末尾写入新的学生信息
    	AfxMessageBox("添加保存成功!"); //提示保存成功
    	
    }
    
    
    void CStudentSpecificAddDlg::OnBnClickedStudengSpecificAddIncance()  //“退出”控件响应函数,退出添加窗口
    {
    	CDialog::OnCancel();
    	// TODO:  在此添加控件通知处理程序代码
    }
    

    4)查找和删除窗口

    BEGIN_MESSAGE_MAP(CStudentSpecificSeekDlg, CDialog)
    	ON_BN_CLICKED(IDOK, &CStudentSpecificSeekDlg::OnBnClickedOk)
    	ON_BN_CLICKED(IDC_STUDENG_SPECIFIC_CHANGE_SAVE, &CStudentSpecificSeekDlg::OnBnClickedStudengSpecificChangeSave)
    	ON_BN_CLICKED(IDC_STUDENG_SPECIFIC_IDCACEL, &CStudentSpecificSeekDlg::OnBnClickedStudengSpecificIdcacel)
    END_MESSAGE_MAP()
    
    
    // CStudentSpecificSeekDlg 消息处理程序
    
    
    BOOL CStudentSpecificSeekDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    	GetDlgItem(IDC_STUDENG_SPECIFIC_CHANGE_SAVE)->EnableWindow(theApp.m_us.nPrior); //获取账号的权限信息,是否屏蔽“删除”控件
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_ID,theApp.m_student.sId);  //设置显示的学生的学号
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_NAME, theApp.m_student.sName);  //设置显示的学生的姓名
    	if (theApp.m_student.nSex==1)
    	    CheckRadioButton(IDC_STUDENG_SPECIFIC_MALE, IDC_STUDENG_SPECIFIC_FEMALE, IDC_STUDENG_SPECIFIC_MALE);
    	else
    		CheckRadioButton(IDC_STUDENG_SPECIFIC_MALE, IDC_STUDENG_SPECIFIC_FEMALE, IDC_STUDENG_SPECIFIC_FEMALE);
    	//设置显示的学生的性别
    	//用CheckRadioButton设置RadioButton的显示
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_AGE, theApp.m_student.sAge); //设置显示的学生的年龄
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_ADDRESS, theApp.m_student.sAddress); //设置显示的学生的地址
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_HIGHERMATH, theApp.m_student.sHigher_math);//设置显示的学生的高数成绩
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_DISCRETEMATH, theApp.m_student.sDiscrete_math);//设置显示的学生的离散成绩
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_CPROGRAM, theApp.m_student.sC_program);//设置显示的学生的c++课设成绩
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_ENGLISH, theApp.m_student.sEnglish);//设置显示的学生的英语成绩
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_SPORTS, theApp.m_student.sSports);//设置显示的学生的体育成绩
    	return TRUE;
    }
    
    
    void CStudentSpecificSeekDlg::OnBnClickedOk()  //"退出“控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	CDialog::OnOK();
    }
    
    
    void CStudentSpecificSeekDlg::OnBnClickedStudengSpecificChangeSave() //"修改”控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	Student u;
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ID, u.sId, sizeof(u.sId));    //将新的信息写入u(Student)中
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_NAME, u.sName, sizeof(u.sName));
    
    	if (IDC_STUDENG_SPECIFIC_MALE == GetCheckedRadioButton(IDC_STUDENG_SPECIFIC_MALE, IDC_STUDENG_SPECIFIC_FEMALE))
    		u.nSex = true;
    	else
    		u.nSex = false;
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_AGE, u.sAge, sizeof(u.sAge));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADDRESS, u.sAddress, sizeof(u.sAddress));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_HIGHERMATH, u.sHigher_math, sizeof(u.sHigher_math));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_DISCRETEMATH, u.sDiscrete_math, sizeof(u.sDiscrete_math));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_CPROGRAM, u.sC_program, sizeof(u.sC_program));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ENGLISH, u.sEnglish, sizeof(u.sEnglish));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_SPORTS, u.sSports, sizeof(u.sSports));
    	CFile file;
    	//file.Open("./studentfile.dat", CFile::modeWrite | CFile::shareDenyNone);
    	if ((CString)u.sId != (CString)theApp.m_student.sId)
    	{
    		AfxMessageBox("请输入同一学号!");
    		SetDlgItemText(IDC_STUDENG_SPECIFIC_ID, theApp.m_student.sId);
    		return;
    	}
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		AfxMessageBox("修改失败,文件打不开!");
    		return;
    	}
    	int i = 0;
    	Student ur;
    	while (file.Read(&ur, sizeof(ur)))  //读取学生成绩储存文件,找到该学生信息储存的对应位置
    	{
    		if ((CString)theApp.m_student.sId == (CString)ur.sId)
    		{
    			break;
    		}
    		i++;
    	}
    	file.Close();
    	if (!file.Open("./studentfile.dat", CFile::modeWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("修改失败,文件打不开!");
    		return;
    	}
    	file.SeekToBegin(); // 重新设置file文件的写指针时期刚好在要修改的学生信息那里
    	file.Seek(i*sizeof(u), CFile::current);
    	file.Write(&u, sizeof(u));  //用新的信息对原来的信息进行覆盖,实现修改
    	AfxMessageBox("修改保存成功!");
    	file.Close();
    }
    
    
    void CStudentSpecificSeekDlg::OnBnClickedStudengSpecificIdcacel() // "退出“控件响应函数
    {
    	CDialog::OnCancel();
    	// TODO:  在此添加控件通知处理程序代码
    }
    

    (5)“账号管理”窗口

    BEGIN_MESSAGE_MAP(CPower, CDialog)
    	ON_BN_CLICKED(IDC_ManagePass, &CPower::OnBnClickedManagepass)
    	ON_BN_CLICKED(IDC_ChangePass, &CPower::OnBnClickedChangepass)
    	ON_BN_CLICKED(IDC_MANAGE_CHANGE_PASS, &CPower::OnBnClickedManageChangePass)
    	ON_BN_CLICKED(IDC_GENERAL_CHANGE_PASS, &CPower::OnBnClickedGeneralChangePass)
    	ON_BN_CLICKED(IDCANCEL, &CPower::OnBnClickedCancel)
    END_MESSAGE_MAP()
    
    
    // CPower 消息处理程序
    
    
    void CPower::OnBnClickedManagepass()  //“学号密码添加与删除”控件响应函数,调用管理员窗口,进行学号密码添加与删除
    {
    	// TODO:  在此添加控件通知处理程序代码
    	CManagePower dl;  
    	dl.DoModal();
    }
    
    
    void CPower::OnBnClickedChangepass()
    {
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    void CPower::OnBnClickedManageChangePass() //“学号密码添加与删除”控件响应函数,调用管理员(CManagePower)窗口,进行学号密码的修改
    {
    	CManagePower dl;
    	dl.DoModal();
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    void CPower::OnBnClickedGeneralChangePass() //“学号密码修改”控件响应函数,调用密码修改(CChangePass)窗口,学生和教师权限的账号可通过这个进行学号密码的修改
    {
    	CChangePass dl;
    	dl.DoModal();
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    BOOL CPower::OnInitDialog()  //账号管理窗口的初始化,根据用户的权限是否屏蔽“学号密码添加与删除”控件
    {
    	CDialog::OnInitDialog();
    	GetDlgItem(IDC_MANAGE_CHANGE_PASS)->EnableWindow((CString)theApp.m_us.sName=="admin");
    	return TRUE;
    }
    
    
    void CPower::OnBnClickedCancel() //“退出”控件响应函数,退出账号管理窗口
    {
    	// TODO:  在此添加控件通知处理程序代码
    	CDialog::OnCancel();
    }
    

    (6)学号密码修改窗口

    BEGIN_MESSAGE_MAP(CChangePass, CDialog)
    	ON_BN_CLICKED(IDC_OKCHANGE_PASS, &CChangePass::OnBnClickedOkchangePass)
    END_MESSAGE_MAP()
    
    
    // CChangePass 消息处理程序
    
    
    BOOL CChangePass::Check_ChangePass() //修改“确定”控件响应函数
    {
    	CString szName, szOrdedPass, szNewPassOne, szNewPasstwo; //获取要修改的学号和密码
    	GetDlgItemText(IDC_CHANGEPASS_NAME, szName);
    	GetDlgItemText(IDC_CHANGEPASS_ORDEDPASS, szOrdedPass);
    	GetDlgItemText(IDC_CHANGEPASS_NEWPASS_ONE, szNewPassOne);
    	GetDlgItemText(IDC_CHANGEPASS_NEWPASS_TWO, szNewPasstwo);
    	szName.MakeLower();
    	SUser u;
    	CFile file;
    	if (!file.Open("./user.dat", CFile::modeReadWrite))
    	{
    		return FALSE;
    	}
    	int i = 0;
    	while (file.Read(&u, sizeof(u)))   //两次输入新密码的确认
    	{
    		if (szName == (CString)u.sName&&szOrdedPass == (CString)u.sPass)
    		{
    			if (szNewPassOne != szNewPasstwo)
    			{
    				AfxMessageBox("新密码两次输入不正确!");
    				InitCCangePassDialog();
    			}
    			strcpy_s(u.sPass, szNewPassOne);
    			file.SeekToBegin();
    			file.Seek(i*sizeof(u), CFile::current);
    			file.Write(&u, sizeof(u));
    			AfxMessageBox("修改成功!");
    			InitCCangePassDialog();
    			return TRUE;
    		}
    		i++;
    	}
    	AfxMessageBox("该用户或旧密码不正确!");
    	InitCCangePassDialog();
    	return FALSE;
    }
    
    
    void CChangePass::OnBnClickedOkchangePass()  //修改“确定”控件响应函数
    {
    	Check_ChangePass();
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    void CChangePass::InitCCangePassDialog()  //重置学号密码修改窗口的编辑框
    {
    	SetDlgItemText(IDC_CHANGEPASS_NAME, "");
    	SetDlgItemText(IDC_CHANGEPASS_ORDEDPASS, "");
    	SetDlgItemText(IDC_CHANGEPASS_NEWPASS_ONE, "");
    	SetDlgItemText(IDC_CHANGEPASS_NEWPASS_TWO, "");
    	this->SetFocus();
    }
    (6)学号密码添加与删除窗口
    BEGIN_MESSAGE_MAP(CManagePower, CDialog)
    	ON_CBN_SELCHANGE(IDC_MANAGEPOWER_POWER, &CManagePower::OnCbnSelchangeManagepowerPower)
    	ON_EN_CHANGE(IDC_MANAGEPOWER_PASS, &CManagePower::OnEnChangeManagepowerPass)
    	ON_BN_CLICKED(IDC_ADD, &CManagePower::OnBnClickedAdd)
    	ON_BN_CLICKED(IDCANCEL, &CManagePower::OnBnClickedCancel)
    	ON_BN_CLICKED(IDC_DEL, &CManagePower::OnBnClickedDel)
    	ON_BN_CLICKED(IDC_CHANGE, &CManagePower::OnBnClickedChange)
    	ON_EN_CHANGE(IDC_MANAGEPOWER_NAME, &CManagePower::OnEnChangeManagepowerName)
    END_MESSAGE_MAP()
    
    
    // CManagePower 消息处理程序
    
    
    
    
    BOOL CManagePower::OnInitDialog() //学号密码添加与删除窗口的初始化
    {
    	CDialog::OnInitDialog();
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST);
    	pList->InsertColumn(0, "身份", 0, 100); //学号密码添加与删除窗口中CListCtrl(IDC_MANAGEPOWER_LIST)初始化
    	pList->InsertColumn(0, "密码", 0, 100);
    	pList->InsertColumn(0, "学号", 0, 100);
    	ReadUser(pList);
    	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_MANAGEPOWER_POWER);
    	pComb->AddString("学生");  学号密码添加与删除窗口中CComboBox(IDC_MANAGEPOWER_POWER)初始化
    	pComb->AddString("老师");
    	pComb->SetCurSel(0);
    	return TRUE;
    }
    
    
    void CManagePower::OnCbnSelchangeManagepowerPower()
    {
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    void CManagePower::OnEnChangeManagepowerPass()
    {
    	// TODO:  如果该控件是 RICHEDIT 控件,它将不
    	// 发送此通知,除非重写 CDialog::OnInitDialog()
    	// 函数并调用 CRichEditCtrl().SetEventMask(),
    	// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
    
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    void CManagePower::OnBnClickedAdd()  //"添加“控件响应函数,添加新的用户账号
    {
    	// TODO:  在此添加控件通知处理程序代码
    	SUser u;
    	GetDlgItemText(IDC_MANAGEPOWER_NAME, u.sName, sizeof(u.sName)); //获取账号编辑框的信息
    	strlwr(u.sName);    //u.sName大写转小写
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST); //获取密码编辑框的信息
    	int i = 0;
    	int nCount = pList->GetItemCount(); //获取权限的信息
    	while (i < nCount)
    	{
    		if (pList->GetItemText(i, 0) == u.sName)   //检验是否存在该用户
    		{
    			AfxMessageBox("用户已存在");
    			return;
    		}
    		i++;
    	}
    	pList->InsertItem(nCount, u.sName);  //将新用户的信息添加入列表
    	GetDlgItemText(IDC_MANAGEPOWER_PASS, u.sPass, sizeof(u.sPass));
    	pList->SetItemText(nCount, 1, u.sPass);
    	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_MANAGEPOWER_POWER);
    	int nSel = pComb->GetCurSel();
    	if (nSel)
    		pList->SetItemText(nCount, 2, "老师");
    	else
    		pList->SetItemText(nCount, 2, "学生");
    }
    
    void CManagePower::OnBnClickedCancel() //”退出“控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	OnDestroy();  //退出前进行保存
    	CDialog::OnCancel();
    }
    
    
    void CManagePower::OnDestroy()   //关闭学号密码添加与删除窗口,关闭之前先将列表的信息保存在账户信息文件中
    {
    	CDialog::OnDestroy();
    	CFile file;
    	if (!file.Open("./user.dat", CFile::modeCreate | CFile::modeWrite))
    	{
    		AfxMessageBox("保存文件时失败!");
    		return;
    	}
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST);
    	int i = 0;
    	int nCount = pList->GetItemCount();
    	SUser u;
    	while (i < nCount)
    	{
    		pList->GetItemText(i, 0, u.sName, sizeof(u.sName));
    		pList->GetItemText(i, 1, u.sPass, sizeof(u.sPass));
    		u.nPrior = pList->GetItemText(i, 2) == "老师";
    		file.Write(&u, sizeof(u));
    		i++;
    	}
    	file.Close();
    	AfxMessageBox("保存文件成功!");
    }
    
    
    
    
    
    void CManagePower::ReadUser(CListCtrl* pList)  //读取学生成绩存储文件,将其显示在学号密码添加与删除窗口CListCtrl中
    {
    	CFile file;
    	if (!file.Open("./user.dat", CFile::modeRead | CFile::shareDenyNone))
    		return;
    	pList->DeleteAllItems();
    	SUser u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		pList->InsertItem(i, u.sName);
    		pList->SetItemText(i, 1, u.sPass);
    		pList->SetItemText(i, 2, u.nPrior ? "老师" : "学生");
    		i++;
    	}
    	file.Close();
    }
    	
    	
    
    
    void CManagePower::OnBnClickedDel()  //”删除“控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST);
    	SUser u;
    	GetDlgItemText(IDC_MANAGEPOWER_NAME, u.sName, sizeof(u.sName));
    	strlwr(u.sName);
    	
    	int nSel = pList->GetSelectedCount(); //选择一个账户
    	if (nSel < 1&&u.sName=="")
    	{
    		AfxMessageBox("请选择一个账户再删除!");
    		return;
    	}
    	if (nSel < 1 && (CString)u.sName != "")
    	{
    		int i = 0;
    		int nCount = pList->GetItemCount();
    		SUser ur;
    		while (i < nCount)
    		{
    			pList->GetItemText(i, 0, ur.sName, sizeof(ur.sName));
    			pList->GetItemText(i, 1, ur.sPass, sizeof(ur.sPass));
    			ur.nPrior = pList->GetItemText(i, 2) == "老师";
    			if ((CString)u.sName == (CString)ur.sName)
    			{
    				pList->DeleteItem(i);
    				return;
    			}
    			i++;
    		}
    		AfxMessageBox("该账户不存在!");
    		return;
    	}
    	else
    	{
    		if (nSel >= 1 && (CString)u.sName == "")
    		{
    			int nSelText = pList->GetSelectionMark();
    			pList->DeleteItem(nSelText);
    		}
    		else
    		{
    			int nSelText = pList->GetSelectionMark();
    			SUser ur;
    			pList->GetItemText(nSelText, 0, ur.sName, sizeof(ur.sName));
    			if ((CString)ur.sName == (CString)u.sName)
    				pList->DeleteItem(nSelText);
    			else
    			{
    				AfxMessageBox("请选择同一个账户再删除!");
    				return;
    			}
    		}
    	}
    }
    
    
    void CManagePower::OnBnClickedChange() //"修改“控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST);//获取需要更改信息
    	SUser u;
    	GetDlgItemText(IDC_MANAGEPOWER_NAME, u.sName, sizeof(u.sName));
    	GetDlgItemText(IDC_MANAGEPOWER_PASS, u.sPass, sizeof(u.sPass));
    	strlwr(u.sName);
    	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_MANAGEPOWER_POWER);
    	u.nPrior = pComb->GetCurSel();
    	int nSel = pList->GetSelectedCount();
    	if (nSel < 1 && u.sName == "")
    	{
    		AfxMessageBox("请选择一个账户再!");
    		return;
    	}
    	if (nSel < 1 && (CString)u.sName != "")  //进行账户密码信息更改
    	{
    		int i = 0;
    		int nCount = pList->GetItemCount();
    		SUser ur;
    		while (i < nCount)
    		{
    			pList->GetItemText(i, 0, ur.sName, sizeof(ur.sName));
    			pList->GetItemText(i, 1, ur.sPass, sizeof(ur.sPass));
    			ur.nPrior = pList->GetItemText(i, 2) == "老师";
    			if ((CString)u.sName == (CString)ur.sName)
    			{
    				pList->DeleteItem(i);
    				pList->InsertItem(i, u.sName);
    				pList->SetItemText(i, 1, u.sPass);
    				pList->SetItemText(i, 2, u.nPrior ? "老师" : "学生");
    				return;
    			}
    			i++;
    		}
    		AfxMessageBox("该账户不存在!");
    		return;
    	}
    	else
    	{
    		if (nSel >= 1 && (CString)u.sName == "")
    		{
    			int nSelText = pList->GetSelectionMark();
    			SUser ur;
    			pList->GetItemText(nSelText, 0, ur.sName, sizeof(ur.sName));
    			pList->DeleteItem(nSelText);
    			pList->InsertItem(nSelText, ur.sName);
    			pList->SetItemText(nSelText, 1, u.sPass);
    			pList->SetItemText(nSelText, 2, u.nPrior ? "老师" : "学生");
    		}
    		else
    		{
    			int nSelText = pList->GetSelectionMark();
    			SUser ur;
    			pList->GetItemText(nSelText, 0, ur.sName, sizeof(u.sName));
    			if ((CString)ur.sName == (CString)u.sName)
    			{
    				pList->DeleteItem(nSelText);
    				pList->InsertItem(nSelText, ur.sName);
    				pList->SetItemText(nSelText, 1, u.sPass);
    				pList->SetItemText(nSelText, 2, u.nPrior ? "老师" : "学生");
    			}
    			else
    			{
    				AfxMessageBox("请选择同一个账户再删除!");
    				return;
    			}
    		}
    	}
    
    }
    

    (7)用单文档读取学生成绩文件,进行直方图和折线图的绘画

    void CMFCApplication1View::OnDraw(CDC* pDC)
    {
    	CMFCApplication1Doc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	if (!pDoc)
    		return;
    }
    
    // CMFCApplication1View 打印
    
    BOOL CMFCApplication1View::OnPreparePrinting(CPrintInfo* pInfo)
    {
    	// 默认准备
    	return DoPreparePrinting(pInfo);
    }
    
    void CMFCApplication1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    	// TODO:  添加额外的打印前进行的初始化过程
    }
    
    void CMFCApplication1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    	// TODO:  添加打印后进行的清理过程
    }
    
    
    // CMFCApplication1View 诊断
    
    #ifdef _DEBUG
    void CMFCApplication1View::AssertValid() const
    {
    	CView::AssertValid();
    }
    
    void CMFCApplication1View::Dump(CDumpContext& dc) const
    {
    	CView::Dump(dc);
    }
    
    CMFCApplication1Doc* CMFCApplication1View::GetDocument() const // 非调试版本是内联的
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCApplication1Doc)));
    	return (CMFCApplication1Doc*)m_pDocument;
    }
    #endif //_DEBUG
    
    
    // CMFCApplication1View 消息处理程序
    
    
    void CMFCApplication1View::DrawScore(CDC* pDC, int * fScore, int nNum) //画直方图函数
    {
    	// fScore是成绩数组指针,nNum是学生人数
    	int nScoreNum[] = { 0, 0, 0, 0, 0 };  // 各成绩段的人数的初 始值 
    	// 下面是用来统计各分数段的人数   
    	for (int i = 0; i < nNum; i++)
    	{
    		int nSeg = (int)(fScore[i]) / 10; // 取数的"十"位上的值   
    		if (nSeg < 6) nSeg = 5; // <60分    
    		if (nSeg == 10) nSeg = 9;// 当为100分,算为>90分数段   
    		nScoreNum[nSeg - 5] ++;   // 各分数段计数   
    	}
    	int nSegNum = sizeof(nScoreNum) / sizeof(int); // 计算有多少个分数段
    
    	// 求分数段上最大的人数 
    	int nNumMax = nScoreNum[0];
    	for (int i = 1; i < nSegNum; i++)
    	{
    		if (nNumMax < nScoreNum[i])
    			nNumMax = nScoreNum[i];
    	}
    	CRect rc;
    	GetClientRect(rc);
    	rc.DeflateRect(180, 40);      // 缩小矩形大小  
    	int nSegWidth = rc.Width() / nSegNum;   // 计算每段的宽度  
    	int nSegHeight = rc.Height() / nNumMax;   // 计算每段的单位高度  
    	COLORREF crSeg = RGB(0, 0, 192);  // 定义一个颜色变量   
    	CBrush brush1(HS_FDIAGONAL, crSeg);
    	CBrush brush2(HS_BDIAGONAL, crSeg);
    	CPen   pen(PS_INSIDEFRAME, 2, crSeg);
    	CBrush* oldBrush = pDC->SelectObject(&brush1);   // 将brush1选入设备环境   
    	CPen* oldPen = pDC->SelectObject(&pen);  // 将pen选 入设备环境  
    	CRect rcSeg(rc);
    	rcSeg.right = rcSeg.left + nSegWidth;   // 使每段的矩形宽度等于nSegWidth  
    	CString strSeg[] = { (CString)"<60", (CString)"60-70", (CString)"70-80", (CString)"80-90", (CString)">=90" };
    	CRect rcStr;
    	for (int i = 0; i<nSegNum; i++)
    	{  // 保证相邻的矩形填充样式不相同    
    		if (i % 2)
    			pDC->SelectObject(&brush2);
    		else
    			pDC->SelectObject(&brush1);
    		rcSeg.top = rcSeg.bottom - nScoreNum[i] * nSegHeight - 2;  // 计算每段矩形的高度   
    		pDC->Rectangle(rcSeg);
    		if (nScoreNum[i] > 0)
    		{
    			CString str;
    			str.Format((CString)"%d人", nScoreNum[i]);
    			pDC->DrawText(str, rcSeg, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    		}
    		rcStr = rcSeg;
    		rcStr.top = rcStr.bottom + 2;
    		rcStr.bottom += 20;
    		pDC->DrawText(strSeg[i], rcStr, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    		rcSeg.OffsetRect(nSegWidth, 0);  // 右移矩形   
    	}
    	pDC->SelectObject(oldBrush);  // 恢复原来的画刷属性   
    	pDC->SelectObject(oldPen);    // 恢复原来的画笔属性 
    
    	CDC* pControlDC = pDC;
    	pControlDC->SelectStockObject(BLACK_BRUSH);//设置画刷
    	CString str;
    	pControlDC->MoveTo(180, 40);  //画y轴
    	pControlDC->LineTo(180,380);
    	pControlDC->MoveTo(180, 380);//画x轴
    	pControlDC->LineTo(900, 380);
    }
    
    
    int CMFCApplication1View::OnCreate(LPCREATESTRUCT lpCreateStruct)// 创建各个成绩显示控件
    {
    	if (CView::OnCreate(lpCreateStruct) == -1)
    		return -1;
    	m_button1.Create((CString)"高等数学(直方)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(10, 10, 120, 40),            //按钮大小
    		this,                          //按钮父指针
    		IDC_HIGGER_MATH);                      //该按钮对应的ID号
    	m_button1.ShowWindow(SW_SHOWNORMAL);
    	m_button2.Create((CString)"离散数学(直方)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(10, 60,120, 90),            //按钮大小
    		this,                          //按钮父指针
    		IDC_DISCRETE_MATH);                      //该按钮对应的ID号
    	m_button2.ShowWindow(SW_SHOWNORMAL);
    	m_button3.Create((CString)"c+课设(直方)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(10, 110, 120, 140),            //按钮大小
    		this,                          //按钮父指针
    		IDC_C_PROGRAM);                      //该按钮对应的ID号
    	m_button3.ShowWindow(SW_SHOWNORMAL);
    	m_button4.Create((CString)"大学英语(直方)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(10, 160, 120, 190),            //按钮大小
    		this,                          //按钮父指针
    		IDC_ENGLISH);                      //该按钮对应的ID号
    	m_button4.ShowWindow(SW_SHOWNORMAL);
    	m_button5.Create((CString)"大学体育(直方)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(10, 210, 120, 240),            //按钮大小
    		this,                          //按钮父指针
    		IDC_SPORTS);                      //该按钮对应的ID号
    	m_button5.ShowWindow(SW_SHOWNORMAL);
    	// TODO:  在此添加您专用的创建代码
    
    	m_button6.Create((CString)"(折线)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(120, 10, 170, 40),            //按钮大小
    		this,                          //按钮父指针
    		IDC_HIGGER_MATH_LINE);                      //该按钮对应的ID号
    	m_button6.ShowWindow(SW_SHOWNORMAL);
    	m_button7.Create((CString)"(折线)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(120, 60, 170, 90),            //按钮大小
    		this,                          //按钮父指针
    		IDC_DISCRETE_MATH_LINE);                      //该按钮对应的ID号
    	m_button7.ShowWindow(SW_SHOWNORMAL);
    	m_button8.Create((CString)"(折线)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(120, 110, 170, 140),            //按钮大小
    		this,                          //按钮父指针
    		IDC_C_PROGRAM_LINE);                      //该按钮对应的ID号
    	m_button8.ShowWindow(SW_SHOWNORMAL);
    	m_button9.Create((CString)"(折线)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(120,160 , 170, 190),            //按钮大小
    		this,                          //按钮父指针
    		IDC_ENGLISH_LINE);                      //该按钮对应的ID号
    	m_button9.ShowWindow(SW_SHOWNORMAL);
    	m_button10.Create((CString)"(折线)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(120, 210, 170, 240),            //按钮大小
    		this,                          //按钮父指针
    		IDC_SPORTS_LINE);                      //该按钮对应的ID号
    	m_button10.ShowWindow(SW_SHOWNORMAL);
    	return 0;
    }
    void CMFCApplication1View::OnClickButton_higher_math_show() //高数成绩直方图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sHigher_math);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_discrete_math_show()  //离散成绩直方图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sDiscrete_math);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_c_program_show()  //C++成绩直方图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sC_program);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_english_show() //英语成绩直方图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sEnglish);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_sports_show()//体育成绩直方图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sSports);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::Drawlist(CDC* pDC, int* fScore, int nNum)//画折线图
    { 
    	// fScore是成绩数组指针,nNum是学生人数
    	int nScoreNum[] = { 0, 0, 0, 0, 0 };  // 各成绩段的人数的初 始值 
    	// 下面是用来统计各分数段的人数   
    	for (int i = 0; i < nNum; i++)
    	{
    		int nSeg = (int)(fScore[i]) / 10; // 取数的"十"位上的值   
    		if (nSeg < 6) nSeg = 5; // <60分    
    		if (nSeg == 10) nSeg = 9;// 当为100分,算为>90分数段   
    		nScoreNum[nSeg - 5] ++;   // 各分数段计数   
    	}
    	CDC* pControlDC = pDC;
    	pControlDC->SelectStockObject(BLACK_BRUSH);//设置画刷
    	CString str;
    	CString strSeg[] = { (CString)"<60", (CString)"60-70", (CString)"70-80", (CString)"80-90", (CString)">=90" };
    	pControlDC->MoveTo(180, 40);//画线的开始位置
    	pControlDC->LineTo(180, 380);
    	pControlDC->MoveTo(180, 380);//画线的开始位置
    	pControlDC->LineTo(900, 380);
    	pControlDC->MoveTo(180, 380);
    	for (int i = 0; i < 5; i++)
    	{
    		pControlDC->SetPixel(0, 290, RGB(0, 0, 255));  //设置点的位置及颜色
    		pControlDC->LineTo(i*140+220, 380 - (380*nScoreNum[i]/nNum));//换两点之间的线
    		str.Format("%d人", nScoreNum[i]);
    		pControlDC->TextOut(i * 140 + 220,380 - (380 * nScoreNum[i] / nNum)-20, str);//在线的上方输出文字
    		pControlDC->TextOut(i * 140 + 220, 390, strSeg[i]);
    	}
    }
    void CMFCApplication1View::OnClickButton_higher_math_listshow()//高数成绩折线图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sHigher_math);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	Drawlist(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_discrete_math_listshow()//离散成绩折线图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sDiscrete_math);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	Drawlist(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_c_program_listshow()//c++课设成绩折线图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sC_program);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	Drawlist(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_english_listshow()//英语成绩折线图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sEnglish);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	Drawlist(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_sports_listshow()//体育成绩折线图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sSports);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	Drawlist(GetDC(), m_Num, i);
    	file.Close();
    }
    

    六.实验中的问题和提高

    这个学生成绩管理系统中的安全措施并不完善,整个软件也没有加壳,以至于这个软件可以直接被脱壳并找出管理员的登录账号和密码,我目前的能力水平有限,还不能对软件进行加壳加密操作。

    这个学生成绩管理系统的用户界面还不是很好看,使用的方面和一般的登录界面还是有点违和感。

    七、总结心得

    (1)刚开始的课设制作的时候,出现了很多变量的设置,变量一多,就容易搞混,后来,我统一使用了微软标准命名法进行控件和窗口ID以及函数,类,变量的命名。这样在多个窗口的界面开发的过程中才不容易搞混。

    (2)在修改文件内容的时候,我想使用file.Seek(-sizeof(u),CFile:: current)进行写指针向前移动,但是出现了内存溢出的问题。我查不出问题出现在那里,后来使用了SeekToBegin()

    和file.Seek(i*sizeof(u),CFile:: current)才解决问题,可以在学生成绩的存储文件直接进行覆盖修改。

    (3)之前学会了GetDlgItemText()的用法,后来在MFC类库中查询到还有SetDlgItemText()的用法,可以直接在编辑框控件中提取信息,而不用设置变量。

    (4)在RadioButton控件的使用中,我不知道如何提取按键和设置按键的信息,后来在网上查到GetCheckedRadioButton(IDC,IDC)和CheckRadioButton(IDC,IDC,IDC)这两个函数才解决问题。

    (5)这个学生成绩管理系统的设置,比原本的实验要求高出了很多。我添加了登录管理系统在里面。这个学生管理系统即使面对教师的,也是面对学生的。学生可以快速查询自己的成绩,而教师还能添加,删除和修改学生的成绩,而学生和老师账户可以通过管理员账号添加,删除,和修改。

    (6)我在排序中重新定义了六种不同对象比较大小的方法,然后调用STL中的快排函数实行快排。与一般的冒泡之类的排序方法不同的是,快排是通过不断二分插入的方法进行排序的,时间复杂度为nlogn,大大节省了排序时间。

    (7)由于我是在一个单文档中通过按钮消息映射绘制五种直方图和五种折线图。在清空界面的时候,我调用了InvalidateRect(NULL)这个函数实行清空操作,但是却出现了连自己将要绘制的图形也清空了的现象,后来添加了UpdateWindow()这个函数才得以解决。

    (8)在运用单文档读取文件信息绘制直方图和折线图的时候,要细心修改自己设置的矩形和顶点的参数,以及移动时的参数,使得绘图界面美观整齐。

    (9)在学生管理系统中,我设置了统计分析这个控件,调用了ShellExecute这个函数,然后这个函数可以调用我画图的exe文件,因此,我可以在学生管理系统中直接显示学生成绩的直方图和折线图。

    (10)大总结:通过对学生成绩管理系统的可视化编程,了解了开发一个实际应用程序的步骤,同时学会使用开发工具实现界面友好的应用程序。通过本实验,掌握如何运用面向对象技术对具体的应用系统进行分析和设计。了解了MFC类的层次结构及主要类的用法,掌握使用MFC和向导来编写Windows应用程序。明白了控件是Windows图形用户界面的主要组成部分之一,掌握静态控件、按钮、流动条、编辑框、列表框、组合框和对话框的创建、消息发送和控件控制的基本用法。看着同学们不断的完成自己的课设,我还是坚持将这个学生成绩管理系统做的更好,通过加入登录和权限限制,让它不仅能服务与老师,同时也能运用于学生,并实行五门成绩的管理和统计绘图。在不断地网上查询资料和在类库中了解函数的方法,才终于完成了这个学生成绩管理系统。

     

     

     

     

     

     

     

     

     

    展开全文
  • Javaweb学生管理系统期末设计

    万次阅读 多人点赞 2019-06-14 21:18:11
    学生管理-描述文档 有需要参考的可以进入,项目下载地址。 一:功能描述 该项目实现了以下功能:  页面包括展示信息和管理信息两部分,并且实现了图片验证登录  通过连接数据库并执行SQL语句实现对数据库的增、...
  • Swing-学生管理系统之主页设计

    千次阅读 多人点赞 2018-06-02 20:14:43
    最近java课有一个大作业,是让写出来一个学生管理系统。做了一个图,大致就是下面的功能吧。 对Swing并不是很熟悉,一点点的来写,好多函数呀,都不能很好的运用。一点点查阅API,还有强大的互联网,总算是对...
  • JAVA学生成绩管理系统课程设计报告
  • javaweb学生管理系统的课程设计

    万次阅读 多人点赞 2016-07-22 08:47:33
    本人计划编写一个简单的学生管理系统,主要从两个身份来说——老师和学生,对于老师来说,带验证码的登录注册,对学生进行增删改查,以分页的形式展示学生的所有信息;对于学生来说,带验证码的登录注册,以及查询...
  • 基于java的学生信息管理系统设计报告
  • 学生管理系统总结

    千次阅读 热门讨论 2017-08-15 20:42:28
    学生管理系统是我接触的第一个系统!现在首先来说一下 我从开始前到进行中和结束后的经历和感受!  开始前,感觉很神奇,因为在日常生活中我们会接触到各种系统,但是可能从来没有想过他是怎么弄出来的。所以在...
  • 对于学生信息管理系,先让我们做个大概的宏观导图。   在这个系统中,大概分为两大块内容,一是对于系统管理、二是对于用户数据的管理。  系统管理中,主要涉及到的是用户名,及密码的管理,如:用户名、...
  • Web学生管理系统

    千次阅读 多人点赞 2019-10-03 23:51:34
    学生管理系统Web项目实现与总结 经过了两个阶段的学习与尝试,最终实现了Web端的学生管理系统。 为什么要说是两个阶段呢? 实际上在暑假学习Web的时候做了一个初版的学生管理系统,但是在最后一个传值 的过程中...
  • 【Python课程设计学生成绩管理系统

    万次阅读 多人点赞 2020-06-30 20:14:05
    【Python课程设计学生成绩管理系统1、需求分析2、功能设计与分析1、使用数据库对数据进行存取(1)使用PyMySQL模块操作数据库对数据进行存取(2)创建数据库school,创建数据表student_sore、teacher_login(3)...
  • C语言课程设计报告学生成绩管理系统
  • 员工学生管理系统小结

    千次阅读 2012-07-26 12:45:46
    学生员工管理系统 1、要求对学生和员工都要支持添加、修改、查询(按ID,全部查询,模糊...2、为了增加这个管理系统的灵活性,这里采用了分层的设计方法。  最底层的io层:  FileOperate类:主要负责把本地文件
  • 学生信息管理系统——总结

    千次阅读 热门讨论 2013-08-10 21:06:12
    总体任务是实现学生信息关系的系统化、科学化、规范化和自动化,其主要任务是用计算机对学生各种信息进行日常管理,如查询、修改、增加、删除,另外还考虑到学生选课,针对这些要求设计学生信息管理系统。...
  • 虽然目前存在一些高校学生管理系统,但是在处理学生信息方面相应慢,运作效率低,在学生管理事务繁杂的现代,处理学生信息需要更好更高效的系统来支撑。所以构建一个高效的比之前系统更完美的学生管理系统,是高校...
  • MySQL学生成绩管理系统设计实验报告

    千次阅读 多人点赞 2020-12-01 21:46:15
    主要介绍学生成绩管理系统项目开发的背景、目的、对象以及研究内容。 1.1项目背景 每个学校都需要在期末进行考试成绩的统计分析工作,而这些工作都必须在考试结束后一个星期的时间内完成。大量的成绩数据的统计工作...
  • php学生信息学生管理系统

    千次下载 热门讨论 2012-09-22 20:11:30
    本文就详细的设计了一个学生信息管理系统,把学生信息的一些相关的点名查询的详细信息囊括其中,尽量使整个管理系统层次鲜明,概括清楚。在阅读完本文后你将能够清楚的了解到一个学生信息管理系统的具体设计和实现...
  • c#实现简单学生信息管理系统

    万次阅读 多人点赞 2019-06-06 21:40:37
    登录、添加学生信息、修改学生信息、删除学生信息、查询学生信息 三、实现步骤 1、登陆界面功能实现 老规矩,先贴下主要代码: //构造方法 public Login() { InitializeComponent(); this.label3.Parent = ...
  • 学生信息管理系统总结

    千次阅读 热门讨论 2017-09-24 19:51:41
    学生托了好长时间,错误也是接连不断的出现,但是在错误中也收获了很多,敲完所有的窗体代码才开始改的错误。这样是很不好的,每个窗体之间都有联系,可以说是牵一发而动全身,一个窗体出现错误也导致其他窗体出现...
  • 我的学生信息管理系统总结

    千次阅读 2014-06-14 23:54:36
    我的学生信息管理系统总结
  • javaweb学生管理系统 第一次总结

    万次阅读 多人点赞 2017-10-19 18:28:34
    JavaWeb 学生管理系统 第一次总结
  • C++ 学生信息管理系统课程设计报告

    千次阅读 2020-06-13 11:22:27
    《面向对象课程设计》报告学生信息管理系统设计一、问题描述二、需求分析和概要设计三、功能模块描述和设计思路四、具体实现过程五、收获与展望 一、问题描述 学生信息管理系统设计 学生信息包括:学号,姓名,年龄...
  • C语言学生成绩信息管理系统课程设计报告

    万次阅读 多人点赞 2016-10-07 22:19:22
    学生成绩管理系统 主要功能: (1)能按学期、按班级完成对学生成绩的录入、 修改,删除 (2)能按班级统计学生的成绩,求学生的总分及 平均分,并能根据学生的平均成绩进行排序 (3)能查询学生...
  • 功能:学生管理系统设计,每个学生信息作为一条记录,包括姓名、学号、性别、出生年月、专业、班级、家庭地址、宿舍号码等。 系统要求实现以下功能: 1、输入功能:录入学生信息(包括学生学号、姓名、性别、出生...
  • 3 系统的需求分析与设计 7 3.1可行性分析 7 3.2需求分析 7 3.2.1系统总体概述 8 3.2.2功能性需求 8 3.2.3非功能性需求 9 3.2.4流程图设计 9 3.2.5系统ER图设计 10 3.3 数据库设计 11 3.3.1数据库设计的原则 11 3.3.3...
  • 题目:基于链表的学生信息管理系统 要求:   (1)插入节点:输入学生信息后,生成节点并插入链表中;   (2)删除节点:根据给定的学生姓名或学号删除该学生节点;   (3)查找节点:根据给定的学生姓名或学号...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,318
精华内容 19,327
关键字:

学生管理系统设计总结