学生信息管理系统,代码与设计流程详解——C++(Qt)
前言
本篇文章主要讲解了整个学生系统的设计流程和思路,基于C++和Qt图形界面。是大二上学期的C++课程设计,主要使用类和链表以及Qt的基础控件的使用,可能会存在一些漏洞,欢迎相互学习和指正。
0.部分功能界面展示
初始界面 导入界面 打开界面 查找界面 统计界面
1.学生类
class CStudent
{
public:
/*学生信息(数据域)*/
int ID; //学号
QString name; //名字
QString gender; //性别
int age; //年龄
QString college; //学院
float Math; //高数成绩
float English; //英语成绩
float Cpp; //C++成绩
CStudent *next; //指针域
CStudent(); //构造函数
//CStudent(string na,float math);
~CStudent(); //析构函数
QString Jud_Grade(float gr);
CStudent operator=(CStudent &s); //运算符重载
};
CStudent CStudent::operator=(CStudent &s)
{
CStudent s1;
s1.ID = s.ID;
s1.name = s.name;
s1.gender = s.gender;
s1.age = s.age;
s1.college = s.college;
s1.Math = s.Math;
s1.English = s.English;
s1.Cpp = s.Cpp;
return s1;
}
QString CStudent::Jud_Grade(float gr)
{
if (gr>=90.0&&gr= 80.0&&gr = 70.0&&gr = 60.0&&gr = 0&&gr
/*初始化结点*/
head = new CStudent;
if (!head)
{
cout
temp = p;
p = p->next;
delete temp;
}
delete head;
}
int CStudentlist::Stu_num()
{
CStudent *s = head;
int count = 0;
if (s->next == NULL) return 0;
else count = 1;
s = s->next; //指向首元结点
while (s->next != NULL)
{
count++;
s = s->next;
}
return count; //返回结点个数即学生个数
}
CStudent *CStudentlist::Stu_find(int i)
{
CStudent *s = head;
int j = 0;
while ((s->next != NULL) && (j
cout
s1 = s1->next;
}
if (!s2) exit(1); //申请失败则退出
else
{
s2 = stu; //此时用到运算符重载
s2->next = NULL;
s1->next = s2;
}
}
void CStudentlist::Stu_del(int i)
{
CStudent *s1 = Stu_find(i - 1); //找i-1结点
if ((s1 != NULL) && (s1->next != NULL))
{
CStudent *s2 = s1->next; //调整指针域
s1->next = s2->next;
delete s2;
}
else
cout
CStudent *s = head->next;
for (int i = 1;i
Q_OBJECT
public:
QtStu_System(QWidget *parent = Q_NULLPTR);
~QtStu_System();
void create_new(); //创建窗口
void widget_return(); //返回窗口
void file_open(); //文件打开
private:
Ui::QtStu_SystemClass *ui;
QtStu_list *ne_list;
};
然后继续使用设计器设计主界面
其实就是表格加按钮 初始界面代码extern CStudentlist Stu;
int a = 0;
QtStu_System::QtStu_System(QWidget *parent)
: QWidget(parent)
{
ui->setupUi(this);
setWindowTitle("Stu_System");
connect(ui->Button_close, &QPushButton::clicked, this, &QtStu_System::close); //关闭主窗口
ne_list = new QtStu_list;
connect(ui->Button_new, &QPushButton::clicked, this, &QtStu_System::create_new); //新建窗口
connect(ui->Button_open, &QPushButton::clicked, this,&QtStu_System::file_open);
connect(ne_list,&QtStu_list::re_signal,this, &QtStu_System::widget_return);
}
QtStu_System::~QtStu_System()
{
delete ne_list;
}
void QtStu_System::create_new()
{
int stu_num = Stu.Stu_num(); //得到学生数量
for (int i = 1;i
ne_list->hide(); //新建框窗口关闭
this->show(); //本窗口打开
}
关键就是在新建的时候,确保把链表中的学生全部删除,然后关闭本窗口,打开主界面。
4.打开文档导入学生
我的这个系统就两个创建的模式,一是新建,二就是导入提前写好的txt文档。图片见第0步相关代码void QtStu_System::file_open()
{
//CStudentlist Stu;
int stu_num=0; //学生数量
int id; //学号
QString na; //名字
QString ge; //性别
int ag; //年龄
QString co; //学院
float Ma; //高数成绩
float En; //英语成绩
float Cp; //C++成绩
QString path = QFileDialog::getOpenFileName(this, "save", "../", "BIN(*.bin)");//TXT(*.txt)||BIN(*.bin)
try
{
if (path.isEmpty() != false)
{
throw a;
}
//关联文件对象
QFile file(path);
bool isok = file.open(QIODevice::ReadOnly);
if (true == isok)
{
//创建数据流,和file文件关联
//往数据流中读数据,相当于往文件里读数据
QDataStream stream(&file); //创建二进制流
/*通过行读取统计学生个数*/
while (stream.atEnd() == 0)
{
stream >> id >> na >> ge >> ag >> co >> Ma >> En >> Cp;
qDebug()
int stu_num = 0;
stu_num = Stu.Stu_num(); //得到学生数量
qDebug()
int stu_num = 0; //学生数量
int id; //学号
QString na; //名字
QString ge; //性别
int ag; //年龄
QString co; //学院
float Ma; //高数成绩
float En; //英语成绩
float Cp; //C++成绩
QString path = QFileDialog::getOpenFileName(this, "save", "../", "TXT(*.txt)");//TXT(*.txt)||BIN(*.bin)
if (path.isEmpty() == false)
{
//关联文件对象
QFile file(path);
bool isok = file.open(QIODevice::ReadOnly);
if (true == isok)
{
//创建数据流,和file文件关联
//往数据流中读数据,相当于往文件里读数据
QTextStream stream(&file);
QTextCodec *codec = QTextCodec::codecForName("UTF-8"); //设置中文编码
stream.setCodec(codec);
//QDataStream stream(&file); //创建二进制流
/*通过行读取统计学生个数*/
while (stream.atEnd() == 0)
{
stream >> id >> na >> ge >> ag >> co >> Ma >> En >> Cp;
na = codec->fromUnicode(na);
ge = codec->fromUnicode(ge);
co = codec->fromUnicode(co);
qDebug()
QString d_name;
bool a =0;
int i = 0;
d_name = d.get_text();
//qDebug()
a = 1;
break;
}
}
if (a == 0)
{
e.show();
}
if (a)
{
Stu.Stu_del(i); //链表删除学生
Set_Text();
d.hide();
}
}
其实抛开图形界面,真的没有特别复杂。就是找到这个学生的名字,把他在学生的链表中删除,然后在更新界面即可。当然,找不到学生你也可以新创一个窗口e.show(),我这里就不展示了。
9.设计功能:查找
查找即查找学生,并且显示学生的一定信息。首先要设计查找学生的界面,图片在第0步有展示相关代码
void QtStu_find::Stu_find()
{
int F_id;
int i = 0;
int a = 0;
CStudent *s;
F_id = ui_Find->lineEdit->text().toInt();
for (i = 1;i
a = 1;
break;
}
}
if (a == 0)
{
e1.show();
}
if (a)
{
ui_Find->label_name->setText(s->name);
ui_Find->label_gender->setText(s->gender);
ui_Find->label_age->setText(QString::number(s->age));
ui_Find->label_co->setText(s->college);
ui_Find->label_ma->setText(QString::number(s->Math));
ui_Find->label_en->setText(QString::number(s->English));
ui_Find->label_cp->setText(QString::number(s->Cpp));
ui_Find->label_mag->setStyleSheet("color: red");
ui_Find->label_eng->setStyleSheet("color: red");
ui_Find->label_cpg->setStyleSheet("color: red");
ui_Find->label_mag->setText(s->Jud_Grade(s->Math));
ui_Find->label_eng->setText(s->Jud_Grade(s->English));
ui_Find->label_cpg->setText(s->Jud_Grade(s->Cpp));
if ((s->Math + s->English + s->Cpp) / 3 >= 80.0)
{
ui_Find->label_bad->hide();
ui_Find->label_good->show();
}
else
{
ui_Find->label_good->hide();
ui_Find->label_bad->show();
}
}
}
繁杂的主要是图形界面信息的设置,其实就是利用了链表的查找学生的函数,然后把学生的信息放到一个个框里面。学生等级设定的代码可以看看第1步。
10.设计功能:统计
首先利用图形设计器设计好窗口,窗口展示见第0步。相关代码void QtStu_count::Click_fen()
{
QBarSet *set1 = new QBarSet("数学");
QBarSet *set2 = new QBarSet("英语");
QBarSet *set3 = new QBarSet("C++");
*set1
for (i = 1;i
for (i = 1;i
for (i = 1;i
int i = 0;
int num = 0;
CStudent *s;
if (str == "Math")
{
for (i = 1;i
for (i = 1;i
for (i = 1;i |