基于QT(C++)實現(圖形界面)選課管理系統

選課管理系統

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, 那么分完之后自己的那一份應該存進另一個數組, 是加法如果是分拿到了別人給的糖果加起來一起的, 那么分完之后不是直…