选课管理系统

1  概述

1.1  课程设计目的和意义

根据课程大纲设定,面向对象课程设计的目的是:

(1)理解面向对象的基本思想和三大机制,掌握基于 C++ 语法的面向对象的基 本概念和开发模式,熟练运用面向对象思维模式对信息和通信领域的软件系统问题进 行建模(对应毕业要求指标点 1.2)。

(2)掌握面向对象的程序设计方法和技术,具备以面向对象程序设计模式对开 发需求进行分析、设计和调试的能力(对应毕业要求指标点 3.1)。

(3)熟练运用基于 C++ 的面向对象开发环境,为后续其他面向对象编程环境做 好铺垫,针对实际需求充分利用现有开发工具的优势和特点解决具体问题,具备对工 具的选择和应用的能力(对应毕业要求指标点 5.1)。

1.2  课程设计内容

大一已经过了一半,每次开学或者学期末时候,所有同学都要订下本学期或者下 一学期该学的课程内容,因此根据自己了解的场景,完成本学期课程设计:教务选课 系统,系统开发内容可以按照以下模式进行:

(1)参考学校教务网功能模拟开发选课子系统,要完成基本信息类和业务类的 封装(包括必要的构造函数析构函数和返回信息等成员)。编写相应的测试程序对类进 行测试。

(2)编写相应的管理类。管理功能包括对象的文件存储、对象的获取(构造)、 基本统计和分析等。编写相应的测试程序对管理类进行测试。

(3)可以将管理类的编写分阶段进行。从学生管理类、课程管理类,最后再编 写综合管理类。

(4)所有的处理尽可能地封装在类成员中。测试主函数和运行主函数尽量简 单。少用或不用主函数以外的外部函数。

(5)数据文件可以复制教务网上的数据文件或者建立对应的文本文件保存基本 信息类的对象内容,减少甚至杜绝使用 cin 和 cout,改用文件流操作数据。以便为后 续升级做准备。(调试时除外)

1.3  课程设计要求

课程设计要求每位同学独立完成具有一定完整性和实用性的面向对象程序。完整 体现面向对象三大机制(封装、继承、多态的)综合应用。//接口类,多态

(1)根据个人能力独立完成或分组完成。

(2)课程设计并非一天能够完成,需做好中间过程的保存和持续进行的工作。

2 系统需求设计

2.1  系统目标

实现教务系统选课模块的相关功能,具体如下:

(1)基本信息管理模块:基本信息(学生类、教师类、课程类)的增删查改以及在 界面中的显示、排序、查找

(2)选课模块:包含选课和退课两大功能(包含冲突检测)

(3)排课模块:教师提交课程、管理员添加课程

(4)实现数据以文件的形式读取和写入

(5)包含图形界面,界面友好

2.2  系统主要模块流程

2.2.1 学生选课、退课

2.2.2 教师提交课程、管理员审核

2.2.3 管理员相关功能

2.2.4 修改密码

2.3 系统类分析图

2.3.1 继承关系

(简略版)

由 management 基类派生出学生管理类、教师管理类、管理员管理类,这些管理类里 面都是纯虚函数,提供接口。管理员类、学生类、教师类分别由各自的管理类和 personInfo 类派生而来。管理类的方法在此实例化。下图为展开图。

(展开版)
2.3.2 其他类

前九个类是 qt 界面类。couseInfo(课程)类储存有课程的基本信息,并包含一些操作 方法。fileOperator(文件操作)类提供一些文件操作的方法,与管理类是组合关系。 modelSet(界面设置)类提供对 QStandardItemModel 对象的操作方法,包含排序和显 示等方法,与管理类是组合关系。

2.4 系统开发环境

系统开发软件:QT 5.7,采用了 QT Widget 框架完成界面设计及开发 文件模式:CSV

3   系统详细设计

3.1  系统主要功能

3.1.1 学生

(1)查看个人信息 通过点击按钮,表格中会显示学生的姓名、学号、年级、班级、专业、所选课程编号 等信息。

(2)查看已选课程、全校课程

通过点击按钮,表格中会显示已选课程/全校课程的选课代码、课程代码、课程名称、 教学班号、学分、性质、开课学院、教师、教师职称、时间、校区、最大容量、已选 人数等信息,且双击表头可进行排序(升/降序)。

(3)修改密码

输入新旧密码,点击确认,系统会将其与正确密码做比对,若不正确,则提示重新输 入,若正确,且长度大于六位,则用新密码替换旧密码。

(4)选课、退课 先在表格中点选相应课程,再点选相应按钮,选课(系统判断是否与已选课程冲突, 若冲突则提示选课冲突,若不是,则在已选课程中加入该课程),退课(提示是否退 课,若同意,则从已选课程中删除该课程)。

3.1.2 管理员

(1)查看全校学生、教师、课程信息 通过点击按钮,表格中会显示全校学生/教师/课程的详细信息,且双击表头可进行排 序(升/降序)。

(2)修改全校学生、教师、课程信息 先在表格中点选相应课程,再点选相应按钮,打开相应的修改窗口,加载选中的信 息,管理员对其进行修改,点击确认后,用修改后的信息替换原信息。

(3)添加全校学生、教师、课程信息 通过点击按钮,打开相应的窗口,管理员输入相关信息,点击确认后,在原有信息后 追加新信息。

(4)删除全校学生、教师、课程信息 先在表格中点选相应课程,再点选相应按钮,提示是否删除,若是则删除该信息,若 否,则不删除。

(5)处理教师开课需求 点击相应按钮,表格中显示相应的课程,若同意开课,则补充相应的课程代码、选课 编号、教学班号等,点击确定之后,将该课程添加到全校课程中。若不同意,则点击 拒绝请求,系统将删除相关的信息。若取消,则不做任何修改。

(6)修改密码 输入新旧密码,点击确认,系统会将其与正确密码做比对,若不正确,则提示重新输 入,若正确,且长度大于六位,则用新密码替换旧密码。

3.1.3 教师

(1)查看个人信息 通过点击按钮,表格中会显示教师的详细信息。

(2)查看所授课程

通过点击按钮,表格中会显示所授课程的选课代码、课程代码、课程名称、教学班 号、学分、性质、开课学院、教师、教师职称、时间、校区、最大容量、已选人数等 信息,且双击表头可进行排序(升/降序)。

(3)查看所授课程选课学生

先在表格中点选相应课程,再点选相应按钮,可以查看选择该课程的学生的详细信 息。

(4)提交课程 通过点击按钮,打开相应的窗口,教师输入相关信息,点击确认后,在待添加课程的 信息后追加新信息,供管理员审核。

(5)修改密码 输入新旧密码,点击确认,系统会将其与正确密码做比对,若不正确,则提示重新输 入,若正确,且长度大于六位,则用新密码替换旧密码。

3.2 系统设计中类图

管理类、学生管理类、学生类:继承关系 管理类、教师管理类、教师类:继承关系 管理类、管理员管理类、管理员类:继承关系 人信息类、学生类:继承关系 人信息类、教师类:继承关系 人信息类、管理员类:继承关系 管理员类、课程类:组合关系 管理员类、学生类:组合关系 管理员类、教师类:组合关系 教师类、学生类:组合关系 教师类、课程类:组合关系 学生类、课程类:组合关系

管理类、界面设置类:组合关系 管理类、文件操作类:组合关系 学生类、课程类:组合关系 教师类、课程类:组合关系 管理员类、课程类:组合关系

3.3 系统主要的数据结构及说明

3.3.1 学生类定义及说明
# ifndef INFOSTUDENT_H
# define INFOSTUDENT_H
# include <QString>
# include <QStringList>
# include <QStandardItemModel>
# include "infoperson.h"
# include "fileoperator.h"
# include "modelset.h"
# include "managementstudent.h"
# include "infocourse.h"
# include <QList>
# include <QDebug>
class studentInfo:public personInfo,public studentManagement
{
public:
//构造
studentInfo();;
//设置信息
void setInfo(QString name,QString id,QString grade,QString stuclass,QString college,QString major,QString password,QStringList course);
//加载相关信息
void loadAboutInfo();
//返回学院
QString getCollege() const;
//返回选课代码
QStringList getSelectedCourse() const;
//返回学生的基本信息
QStringList getAllInfo() const;
//派生类返回派生类对象指针
virtual studentInfo* next();//学生管理类实例化//添加课程选课代码到学生信息中
virtual void addCourse(QString id);
//移除学生信息中的选课代码
virtual void removeCourse(QString id);
//选课
virtual bool selectCourse(QString courseSelectId,QString courseName,QString courseTime);
//退课
virtual bool giveUpCourse(QString courseSelectId);
//查看所有课程
virtual void checkAllCourse(QStandardItemModel *model);
//查看我的课程
virtual void checkMyCourse(QStandardItemModel *model);
//查看我的信息
virtual void checkMyInfo(QStandardItemModel *model,int curRow) const;
//修改密码
virtual bool modifyPassword(QString oldPassword,QString newPassword);
//保存当前的信息到文件中
virtual void saveAllInfo();
//以选课编号匹配课程
virtual courseInfo& matchCourseWithId(const QString courseSelectId,QVector<courseInfo> &course);private:
QString stuGrade;//增加学生类年级信息QString stuClass;//增加学生类班级信息QString stuCollege;//增加学生类学院信息QString stuMajor;//增加学生类专业信息QString stuPassword;//增加学生类密码信息QStringList stuCourse;//增加学生类已选课程信息QVector<courseInfo> allCourse;QList<courseInfo> myCourse;};# endif // INFOSTUDENT_H
3.3.2 教师类定义及说明
# ifndef INFOTEACHER_H
# define INFOTEACHER_H# include <QString>
# include <QStringList>
# include <QVector>
# include <QList>
# include <QDebug>
# include "infoperson.h"
# include "managementteacher.h"
# include "infostudent.h"
# include "infocourse.h"
class teacherInfo:public personInfo,public teacherManagement
{
public:
teacherInfo();void setInfo(QString name,QString id,QString password,QString college,QString level,QStringList course);
//加载相关信息
void loadInfo();
//查看相应课程的学生
bool loadMyStudent(QString selectId);
//返回选课代码
QStringList getMyCourse();
//返回所有信息
QStringList getAllInfo() const;
//返回学院
QString getCollege();
//返回职称
QString getLevel();//查看我的学生
virtual void checkMyStudent(QStandardItemModel *model);
//查看我的课程
virtual void checkMyCourse(QStandardItemModel *model);
//修改密码
virtual bool modifyPassword(QString oldPassword,QString newPassword);
//查看我的信息
virtual void checkMyInfo(QStandardItemModel *model,int curRow) const;
//添加选课编号到我的信息中
virtual void addCourse(QString id);
//从我的信息中移除选课编号
virtual void removeCourse(QString id);
//提交课程
virtual void submitCourse(courseInfo &course);
//以选课编号匹配课程
virtual courseInfo& matchCourseWithId(const QString courseSelectId,QVector<courseInfo> &course);
//保存所有信息
virtual void saveAllInfo();private:
QString teaCollege;
QString teaLevel;
QString teaPassword;
QStringList teaCourse;
QVector<studentInfo> myStudent;
QVector<studentInfo> allStudent;
QVector<courseInfo> myCourse;
QVector<courseInfo> allCourse;
QList<courseInfo> waitToLoadCourse;};# endif // INFOTEACHER_H
3.3.3 课程类定义及说明
# ifndef INFOCOURSE_H
# define INFOCOURSE_H
# include <QString>
# include <QStringList>
# include <QStandardItemModel>
class courseInfo
{
public:
courseInfo();
//获取选课代码
QString getCourseSelectId() const;
//获得课程名称
QString getCourseName() const;
//获得课程时间
QString getCourseTime() const;
//设置课程信息
void setCourseInfo(QString courseSelectId,QString courseId,QString courseName,QString courseClass,QString courseCredit,QString courseCharacter,QString courseCollege,QString courseTeacherName,QString courseTeacherLevel,QString courseTime,QString courseAddress,QString courseMaxStudent,QString courseCurrentStudent);
//把课程显示到tableView中
void displayThisCourse(QStandardItemModel *model,int curRow) const;
//学生选课时,人数加一
void peoplePlusOne();
//学生退课时,人数减一
void peopleMinOne();
//获取课程信息,生成一个QStringList类型的数据
QStringList getAllInfo() const;
private:
QString courseSelectId;
QString courseId;
QString courseName;
QString courseClass;
QString courseCredit;
QString courseCharacter;
QString courseCollege;
QString courseTeacherName;
QString courseTeacherLevel;
QString courseTime;
QString courseAddress;
QString courseMaxStudent;
QString courseCurrentStudent;
};# endif // INFOCOURSE_H
3.3.4 管理员类定义及说明
# ifndef INFOADMIN_H
# define INFOADMIN_H
# include <QVector>
# include "infoperson.h"
# include "managementadmin.h"
# include "infostudent.h"
# include "infoteacher.h"
# include "infocourse.h"
class adminInfo:public personInfo,public adminManagement
{
public:
adminInfo();
//已实现
void setInfo(QString name,QString id,QString password);int whoAreYou(QString id);QList<courseInfo>& getWaitToLoadCourse();QStringList getAllInfo();
//实例化接口//把相关信息显示到表格
virtual void displayAllStudent(QStandardItemModel *model);virtual void displayAllTeacher(QStandardItemModel *model);virtual void displayAllCourse(QStandardItemModel *model);virtual void checkMyInfo(QStandardItemModel *model);virtual bool displayCourseWithId(const QString& id,QStandardItemModel *model);virtual bool displayCourseWithName(const QString& name,QStandardItemModel *model);virtual bool displayTeacherWithId(const QString& id,QStandardItemModel *model);virtual bool displayTeacherWithName(const QString& name,QStandardItemModel *model);virtual bool displayStudentWithId(const QString& id,QStandardItemModel *model);virtual bool displayStudentWithName(const QString& name,QStandardItemModel *model);virtual void displayWaitToLoadCourse(QStandardItemModel *model);//添加相关信息
virtual void addNewCourse(courseInfo& newCourse);virtual void addNewStudent(studentInfo& newStudent);virtual void addNewTeacher(teacherInfo& newTeacher);//修改密码
virtual bool modifyPassword(QString oldPassword,QString newPassword);//修改相关信息
virtual void modifyStudentInfo(studentInfo& info,QStringList newInfo);virtual void modifyCourseInfo(courseInfo& info,QStringList newInfo);virtual void modifyTeacherInfo(teacherInfo& info,QStringList newInfo);//删除相关信息
virtual void deleteStudentInfo(QString id);virtual void deleteTeacherInfo(QString id);virtual void deleteCourseInfo(QString id);//查找相关信息
virtual teacherInfo& findTeacherWithId(const QString& id);virtual teacherInfo& findTeacherWithName(const QString& name);virtual studentInfo& findStudentWithId(const QString& id);virtual studentInfo& findStudentWithName(const QString& name);virtual courseInfo& findCourseWithId(const QString &id);//保存文件
virtual void saveAllInfo();private:
QList<studentInfo> stuInfo;
QList<teacherInfo> teaInfo;
QList<courseInfo> couInfo;
QList<courseInfo> waitToLoadCourse;
QString adminPassword;};# endif // INFOADMIN_H
3.3.5 文件操作类定义及说明
# ifndef FILEOPERATOR_H
# define FILEOPERATOR_H
# include <QString>
# include <QStringList>class fileOperator
{
public:
fileOperator();
//读取信息文件
bool readFromInfoFile(QString address,QStringList& _line);
//写入信息文件_temp
bool writeInfoToFile(QString address,const QStringList& _line);
//替换文件
bool replaceFile(QString address1,QString address2);
//修改文件中与_line不同的条目
bool modifyFile(QString address,const QStringList& _line);
//在文件最后添加_line
bool appendToFile(QString address,const QStringList& _line);
};# endif // FILEOPERATOR_H
3.3.6 界面设置类定义及说明
# ifndef MODELSET_H
# define MODELSET_H# include <QStandardItemModel>
# include <QString>
# include <QStringList>class modelSet
{
public:
modelSet();
//设置课程表头
void setCourseTitle(QStandardItemModel *model);
//设置学生信息表头
void setStudentTitle(QStandardItemModel *model);
//设置教师信息表头
void setTeacherTitle(QStandardItemModel *model);
//设置课程条目
void setCourseItem(QStandardItemModel *model,const QStringList& _linesplit,const int& currow);
//设置学生条目
void setStudentItem(QStandardItemModel *model,const QStringList& _linesplit,const int& currow);
//设置老师条目
void setTeacherItem(QStandardItemModel *model,const QStringList& _linesplit,const int& currow);//以下为排序相关函数
void quickSort(int p, int q,int column,QStandardItemModel *model);void quickSort_1(int p, int q,int column,QStandardItemModel *model);void Swap(int p1,int p2,QStandardItemModel *model);int partition(int p, int q, int column,QStandardItemModel *model);
};# endif // MODELSET_H

3.4  继承机制实现

由 management 基类派生出 studentManagement 学生管理类、teacherManagement 教师 管理类、adminManagement 管理员管理类,这些管理类里面是纯虚函数,提供方法接 口,具体在管理员类、学生类、教师类中实现。adminInfo 管理员类、studentInfo 学生 类、teacherInfo 教师类分别由各自的管理类和 personInfo 类派生而来。具体见类图。

3.5  多态机制实现

学生管理类、教师管理类、管理员管理类之间可以形成多态。他们具有共同的特点--- 修改密码、储存信息到文件中等。因此利用纯虚函数,为学生类、教师类、管理员类 提供接口,形成多态。另外,本系统的采用接口与实现分离的设计模式,使用虚函数 等,也可形成多态。

3.6 主要采用的算法

3.6.1 排序算法

使用快速排序算法对 QStandardItemModel 类对象进行排序,具体如下:

void modelSet::Swap( int p1, int p2, QStandardItemModel *model )
{for ( int i = 0; i < model->columnCount(); i++ ){QStandardItem* t1 = NULL; QStandardItem* t2 = NULL; if ( model->item( p1, i ) != NULL )t1 = model->item( p1, i )->clone();if ( model->item( p2, i ) != NULL )t2 = model->item( p2, i )->clone();model->setItem( p1, i, t2 );model->setItem( p2, i, t1 );}
}int modelSet::partition( int p, int q, int column, QStandardItemModel *model )
{QString pivot = model->item( q, column )->text(); int i = p - 1;for ( int j = p; j <= q - 1; j++ ){if ( model->item( j, column )->text() <= pivot ){i++;Swap( j, i, model );}else if ( !(model->item( j, column )->text() >= pivot) ){i++;Swap( j, i, model );}}Swap( q, i + 1, model ); return(i + 1);
}/* 以下分别为升降序 */
void modelSet::quickSort( int p, int q, int column, QStandardItemModel *model )
{if ( p < q ){int r = partition( p, q, column, model ); quickSort( p, r - 1, column, model ); quickSort( r + 1, q, column, model );}
}void modelSet::quickSort_1( int p, int q, int column, QStandardItemModel *model )
{quickSort( p, q, column, model );for ( int i = 0; i < model->rowCount() / 2; i++ ){Swap( i, model->rowCount() - 1 - i, model );}
}
3.6.2 查找算法
(1)返回值为 bool 类型(用于界面类的查询)
void adminMenu::on_btn_confirm_clicked()
{QString edit = this->ui->edit_check->text();  int flag = this->ui->box_select->currentIndex();switch ( flag ){case 0:if ( !admInfo->displayStudentWithName( edit, model ) )QMessageBox::critical( this, "错误", "未找到!请检查!", "确认" );break; case 1:if ( !admInfo->displayStudentWithId( edit, model ) )QMessageBox::critical( this, "错误", "未找到!请检查!", "确认" );break; case 2:if ( !admInfo->displayTeacherWithName( edit, model ) )QMessageBox::critical( this, "错误", "未找到!请检查!", "确认" );break; case 3:if ( !admInfo->displayTeacherWithId( edit, model ) )QMessageBox::critical( this, "错误", "未找到!请检查!", "确认" );break; case 4:if ( !admInfo->displayCourseWithId( edit, model ) )QMessageBox::critical( this, "错误", "未找到!请检查!", "确认" );break; case 5:if ( !admInfo->displayCourseWithName( edit, model ) )QMessageBox::critical( this, "错误", "未找到!请检查!", "确认" );break;}
}bool adminInfo::displayCourseWithId( const QString &id, QStandardItemModel *model )
{int j = 0;for ( int i = 0; i < couInfo.length(); i++ ){if ( couInfo.at( i ).getCourseSelectId() == id ){couInfo.at( i ).displayThisCourse( model, j++ );}}return(j);
}bool adminInfo::displayCourseWithName( const QString &name, QStandardItemModel *model )
{int j = 0;for ( int i = 0; i < couInfo.length(); i++ ){if ( couInfo.at( i ).getCourseName() == name ){couInfo.at( i ).displayThisCourse( model, j++ );}}return(j);
}bool adminInfo::displayTeacherWithId( const QString &id, QStandardItemModel *model )
{int j = 0;for ( int i = 0; i < teaInfo.length(); i++ ){if ( teaInfo.at( i ).getId() == id ){teaInfo.at( i ).checkMyInfo( model, j++ );}}return(j);
}bool adminInfo::displayTeacherWithName( const QString &name, QStandardItemModel *model )
{int j = 0;for ( int i = 0; i < teaInfo.length(); i++ ){if ( teaInfo.at( i ).getName() == name ){teaInfo.at( i ).checkMyInfo( model, j++ );}}return(j);
}bool adminInfo::displayStudentWithId( const QString &id, QStandardItemModel *model )
{int j = 0;for ( int i = 0; i < stuInfo.length(); i++ ){if ( stuInfo.at( i ).getId() == id ){stuInfo.at( i ).checkMyInfo( model, j++ );}}return(j);
}bool adminInfo::displayStudentWithName( const QString &name, QStandardItemModel *model )
{int j = 0;for ( int i = 0; i < stuInfo.length(); i++ ){if ( stuInfo.at( i ).getName() == name ){stuInfo.at( i ).checkMyInfo( model, j++ );}}return(j);
}
(2)返回值为对象的引用(方便被其他函数调用)
teacherInfo &adminInfo::findTeacherWithId( const QString &id )
{for ( int i = 0; i < teaInfo.length(); i++ ){if ( teaInfo.at( i ).getId() == id ){return(teaInfo[i]);}}
}teacherInfo &adminInfo::findTeacherWithName( const QString &name )
{for ( int i = 0; i < teaInfo.length(); i++ ){if ( teaInfo.at( i ).getName() == name ){return(teaInfo[i]);}}
}studentInfo &adminInfo::findStudentWithId( const QString &id )
{for ( int i = 0; i < stuInfo.length(); i++ ){if ( stuInfo.at( i ).getId() == id ){return(stuInfo[i]);}}
}studentInfo &adminInfo::findStudentWithName( const QString &name )
{for ( int i = 0; i < stuInfo.length(); i++ ){if ( stuInfo.at( i ).getName() == name ){return(stuInfo[i]);}}
}courseInfo &adminInfo::findCourseWithId( const QString &id )
{for ( int i = 0; i < couInfo.length(); i++ ){if ( couInfo.at( i ).getCourseSelectId() == id ){return(couInfo[i]);}}
}
3.6.3 冲突检测算法
bool studentInfo: :selectCourse(QString courseSelectId, QString courseName, QString courseTime) {for (int i = 0; i < myCourse.length(); i++) {if (myCourse.at(i).getCourseSelectId() == courseSelectId || myCourse.at(i).getCourseTime() == cou rseTime || myCourse.at(i).getCourseName() == courseName) {return (false);}}matchCourseWithId(courseSelectId, allCourse).peoplePlusOne();addCourse(courseSelectId);myCourse.push_back(matchCourseWithId(courseSelectId, allCourse));return (true);
}

3.7 文件结构

3.7.1 courseInfo.csv 文件

课程文件的文件结构

选课代码 课程代码 课程名称 教学班号 学分 性质 开课学院 教师 教师职称 时间 校区 最大容量 已选人数

3.7.2 adminInfo.csv 文件

管理员文件的结构 用户名 账号 密码

3.7.3 stuInfo.csv 文件

学生文件的结构

姓名 学号 密码 年级 班级 学院 专业 所选课程选课代码

3.7.4 teacherInfo.csv 文件

教师文件的结构

姓名 工号 密码 学院 职称 所授课程选课代码

3.7.5 waitToLoadCourse.csv 文件

开课需求文件的结构

选课代码(空) 课程代码(空) 课程名称 教学班号(空) 学分 性质 开课学院 教师 教师职称 时间 校区 最大容量 已选人数

4 系统主要功能界面

4.1  登陆界面

4.1.1 主界面

程序的入口,提供三种角色选择(学生、教师、管理员),输入账号、密码,程序会将 其与文件中保存的账号和密码进行匹配,从而实现登陆。

若未选择角色,则会弹出以下提示:

若用户名或密码错误,则会弹出以下提示:

4.2  学生菜单

4.2.1 主界面

若选择学生角色,登陆成功后,会跳转到以下界面,通过点击按钮可实现相应功能。

4.2.2 查看个人信息

TableView 中显示该学生的信息

4.2.3 查看所有课程

4.2.4 查看已选课程

4.2.5 选课

若未选中课程,提示:

若不存在冲突,则将其添加到已选课程中,并提示:

若上课时间冲突或者已选择相同课程或者同名课程,则提示“选课冲突”:

4.2.6 退课

提示退课成功:

4.2.7 修改密码

若旧密码输入正确:

若旧密码输入错误,或新密码不足六位

4.2.8 退出系统

点击退出系统后,所有修改会保存在文件,窗口关闭

4.3  教师菜单

4.3.1 主界面

若选择教师角色,登陆成功后,会跳转到以下界面,通过点击按钮可实现相应功能。

4.3.2 查看个人信息

4.3.3 查看所授课程信息

4.3.4 查看选择该课程的学生

4.3.5 提交新的课程

4.3.6 修改密码

4.3.7 退出系统

点击退出系统后,所有修改会保存在文件,窗口关闭

4.4  管理员菜单

4.4.1 主界面

4.4.2 查看全校学生信息

4.4.3 查看全校课程信息

4.4.4 查看全校教师信息

4.4.5 查看老师开课需求

4.4.6 添加学生信息

4.4.7 添加课程信息

4.4.8 添加教师信息

4.4.9 修改学生信息

4.4.10 修改课程信息

4.4.11 修改教师信息

4.4.12 删除信息

4.4.13 查询信息

4.4.14 修改密码

4.4.15 退出系统

点击退出系统后,所有修改会保存在文件,窗口关闭

5 学习总结

本次的课程设计让我将课堂中学到的面向对象程序设计的思想运用到了实际的项 目中,并且学到了 Qt 界面编程的相关知识,了解了 MVC 设计模式、信号与槽机制, 提高了 debug 能力。 从最初拿到这份作业不知道如何下手,感觉对 Qt 一窍不通,差一点就选择了使用控制台的模式完成,但到在老师的指导下,我初步的掌握到了 Qt 编程的一些基本 思路和方法,再到通过网上查询的相关资料,阅读他人写的文章,寻找相关书籍中的 特定知识点等等方式让我对 Qt 不再胆怯,最终选择 Qt 完成了本次的作业。在这个过 程中,我的信息检索能力和自学能力得到了大大的提升。

这次的作业还让我切身体会到一个系统的设计与实现过程,在编写程序的过程中我走过很多弯路,不断试错,好歹纠正了过来。我认为编程中最重要的一点便是需要 有一个整体设计的大局观,不能只想着此时所编写的这一小块,要从各种方面进行综 合考虑,不能顾此失彼。

不要一开始就胆怯害怕,千里之行始于足下。当迈出了第一步之后,会发现问题 往往并没有你想象的那么难。学习编程时,要学会查文档、查资料、借鉴他人优秀的 思路,自学能力十分重要,要善于去课外扩充自己的知识,提高自己的技术,不能只局限于短短的课堂时间。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【阿里云-ACP-1】疑难题解析

1.弹性伸缩 AS 在企业中有广泛的应用场景,不仅适合业务量不断波动的应用程序,同时也适合业务量稳定的应用程序。以下关于弹性伸缩的使用说法正确的是( ) 选项内容 A 弹性伸缩可以用于云数据库 RDS 的自动扩容 B 弹性伸缩支持自动将 ECS 实例或 ECI 实例添加到 Memcache 实…

NLP:seqtoseq英译法案例

本文目录&#xff1a;一、案例概述二、数据集三、案例步骤&#xff08;一&#xff09;导入工具包和工具函数&#xff08;二&#xff09;数据预处理&#xff08;三&#xff09;构建数据源对象&#xff08;四&#xff09;构建数据迭代器&#xff08;五&#xff09;构建基于GRU的编…

docker的准备与部署

docker的重复使用bilibli 黑马视频 方便查看docker容器。设置格式通过官网dock查看格式命令 命令别名&#xff0c;简化输入

Java 大视界 -- Java 大数据在智能教育自适应学习路径规划与学习效果强化中的应用(362)

Java 大视界 -- Java 大数据在智能教育自适应学习路径规划与学习效果强化中的应用(362) 引言: 正文: 一、Java 构建的智能教育数据架构 1.1 多维度学习数据实时采集 1.2 知识图谱构建与知识点关联 二、Java 驱动的自适应学习路径规划 2.1 多模型融合的路径生成 2.2 学习效果…

2.1 为什么定义tensor数据结构?

PyTorch选择定义Tensors而非直接使用NumPy进行运算和数据处理&#xff0c;主要是因为Tensors在功能、性能和场景适配性上更贴合深度学习的需求。以下是关键原因分析&#xff1a; 1. 自动求导与计算图支持 核心差异&#xff1a;PyTorch的Tensors在运算时会自动构建计算图&#x…

Qt Quick 3D渲染

Qt Quick 3D是Qt框架中用于创建3D图形界面的强大模块&#xff0c;它提供了声明式的QML API&#xff0c;使得开发者无需深入底层图形API就能构建复杂的3D场景。本文将全面介绍Qt Quick 3D的核心概念和技术细节&#xff0c;包括3D场景坐标系统、场景环境设置、光照与材质系统、相…

笔试——Day17

文章目录第一题题目思路代码第二题题目&#xff1a;思路代码第三题题目&#xff1a;思路代码第一题 题目 小乐乐改数字 思路 模拟 当前位置为偶数时&#xff0c;改为0&#xff1b;否则改为1记得取出前导0&#xff1b;stoi()函数可以直接自动去除前导0 代码 第二题 题目&a…

【c#】完美解决部署IIS 报错 0x8007000d

1、错误页面&#xff1a;2、解决思路&#xff1a; 1、点击IIS站点&#xff0c;右键点击浏览到文件夹下&#xff0c;路径打开cmd&#xff0c;找到对应的站点的dll&#xff0c;运行失败会提示错误原因。需要安装某些dll2、选中站点&#xff0c;点击模块&#xff0c;检查模块AspNe…

Visual Studio 2010-.Net Framework 4.0项目-NPOI安装

在管理Nuget程序包中搜索NPOI&#xff0c;下载最新版会报错&#xff1a;使用程序包控制台输入&#xff1a;Install-Package NPOI -Version 2.5.1

Redis原理之分布式锁

上篇文章&#xff1a; Redis原理之缓存https://blog.csdn.net/sniper_fandc/article/details/149141968?fromshareblogdetail&sharetypeblogdetail&sharerId149141968&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link​​​​​​​ 目录 1 …

网络基础19:OSPF单区域原理实验

一、实验拓扑二、设备配置AR1 配置<AR1> system-view [AR1] interface GigabitEthernet0/0/0 [AR1-GigabitEthernet0/0/0] ip address 192.168.1.1 24 [AR1-GigabitEthernet0/0/0] quit[AR1] ospf 1 router-id 0.0.0.1 [AR1-ospf-1] area 0 [AR1-ospf-1-area-0.0.0.0] ne…

【实战推荐】小白也能上手的多端陪玩系统平台项目源码

在当今的游戏市场中&#xff0c;游戏陪玩服务已经成为了一个热门领域。无论是寻找高手带自己升级、学习游戏技巧&#xff0c;还是仅仅想找人一起玩耍&#xff0c;越来越多的玩家倾向于通过专业的陪玩平台找到合适的伙伴。对于想要进入这个市场的创业者和开发者来说&#xff0c;…

[hot 100 ]最长连续序列-Python3

需要时间复杂度为O(n)&#xff0c;如果采用暴力求解则为O(n^2)1.在遍历hash表的时候检查是否当前值为连续序列的最小值,如果是&#xff0c;则跳过此次循环,这样使得原本需要对每个值进行一次遍历变成了对每个值只访问一次:2.使用set()和普通for num in nums的区别&#xff1a;

[element-plus] el-table show-overflow-tooltip 没有显示省略号

<el-table-columnprop"col2"label"列2"width"70"show-overflow-tooltip/> </el-table-column>不知道为什么没有省略号 再给加个样式 <el-table-column prop"col2" label"列2" width"70" show-ove…

网络基础19--OSPF路由协议单区域

一. RIP的不足跳数评估非最优路径&#xff1a;RIP以跳数作为度量值&#xff0c;不考虑带宽&#xff0c;可能导致次优路径选择。网络规模限制&#xff1a;最大跳数为16&#xff0c;限制了网络规模。收敛速度慢&#xff1a;更新周期长&#xff08;默认30秒&#xff09;&#xff0…

SpringBoot 整合 Langchain4j 实现会话记忆存储深度解析

目录 一、前言 二、AI大模型会话记忆介绍 2.1 AI 大模型的会话记忆是什么 2.2 AI 大模型为什么需要会话记忆 2.3 AI 大模型会话记忆常用实现方案 2.4 LangChain4j 会话记忆介绍 2.4.1 LangChain4j 会话记忆介绍 2.4.2 LangChain4j 会话记忆类型 三、Langchain4j 会话记…

《R 矩阵》

《R 矩阵》 引言 在数学与统计学领域&#xff0c;矩阵是一种强大的工具&#xff0c;它广泛应用于各种科学研究和实际应用中。本文将深入探讨 R 矩阵的概念、特性及其在数据分析中的应用。 R 矩阵的定义与特性 1. 定义 R 矩阵&#xff0c;全称为“实对称矩阵”&#xff0c;是指一…

从java到vue3:第二天

文章目录前言一、setup1.定义2.作用3.响应式数据1.ref2.reactive3.ref与reactive的区别4.toRefs5.computed二、Watch1.监视ref&#xff1a;基本数据2.监视ref&#xff1a;对象数据3.监视reactive&#xff1a;对象数据。4.监视ref或reactive中某个属性5.监视多个属性总结前言 s…

基于 JmsClient 的高效消息通信架构设计与实现

1. 引言 1.1 消息通信在分布式系统中的作用 随着企业级应用的复杂性不断提升,传统的同步调用方式已难以满足高并发、低延迟、高可用等需求。消息通信机制通过异步解耦的方式,提升了系统的可扩展性和容错能力。Java Message Service(JMS)作为一种标准的消息中间件接口,广…

2025.7.24

这题写了好一会, 因为遇到一些问题分糖分的是原来的糖果还是拿到了别人给的糖果加起来一起的?如果是分原来的糖果之后那就要再另外那一个数组存, 数组初始为0, 那么分完之后自己的那一份应该存进另一个数组, 是加法如果是分拿到了别人给的糖果加起来一起的, 那么分完之后不是直…