c++ stl list实现简单的学生信息管理系统
问题描述:已知有20个学生记录(包括学号、姓名、成绩)的文件student.dat。要求编程序实现查询、排序、插入、删除诸功能。
系统的基本功能:
A.要求显示如下界面
****************************************
1--------------查询
2--------------排序
3--------------插入
4--------------删除
****************************************
通过选择1-4来确定要做哪一个操作。
B.若选1,则出现如下界面
****************************************
1.1----------按学号查询
1.2----------按姓名查询
1.3----------按成绩查询
****************************************
通过选择1.1-1.3来确定要做哪一个操作,其中:按学号查询用二分法实现;按姓名查询用顺序法实现;按成绩查询实现查询成绩小于m分的学生;找到该生将学生记录输出到屏幕,若查无此人,输出相关信息。
C.若选2,则按成绩从大到小排序,姓名,学号顺序也随之调整。
D.若选3,将一个新学生记录按学号顺序插入,并把结果保存到文件student.dat中。
E.若选4,删除指定学生的记录,并把结果保存到文件student.dat中。
F.以上各个功能均编写成子函数,由主函数调用实现。
c++代码如下:
#include <iostream>
#include <fstream>
#include <list>
#include <cmath>
#include <string.h>
#define MAX_STU 100//读入学生的最大数目
/*
*郑海波 blog.csdn.net/nuptboyzhb/
*email:zhb931706659@126.com
*/
using namespace std;
class Student
{
public:
char * name;
char *ID;
int grade;
Student()
{
name = new char[strlen("Anonymous-----") + 1];
ID = new char[strlen("NoIdInput------") + 1];
grade = 0;
}
Student(char * pName,char * pID, int pgrade)
:grade(pgrade)
{
name = new char[strlen(pName) + 1];
strcpy(name, pName);
ID = new char[strlen(pID) + 1];
strcpy(ID, pID);
}
Student(const Student& rhs)
:grade(rhs.grade)
{
name = new char[strlen(rhs.name) + 1];
strcpy(name, rhs.name);
ID = new char[strlen(rhs.ID) + 1];
strcpy(ID, rhs.ID);
}
Student& operator=(const Student& rhs)
{
name = new char[strlen(rhs.name) + 1];
strcpy(name, rhs.name);
ID = new char[strlen(rhs.ID) + 1];
strcpy(ID, rhs.ID);
grade = rhs.grade;
return *this;
}
// overload the == operator
// for sorting purposes, we consider that two Student objects are "equal"
// if they have the same grade
bool operator==(const Student& rhs) const
{
return (grade == rhs.grade) ? true : false;
}
// overload the < operator
// for sorting purposes, we consider that a Student object is "less than" another
// if it's grade is less than the other object's grade
bool operator<(const Student& rhs) const
{
return (grade < rhs.grade) ? true : false;
}
// overload the > operator
// for sorting purposes, we consider that a Student object is "greater than" another
// if it's grade is greater than the other object's grade
bool operator>(const Student& rhs) const
{
return (grade > rhs.grade) ? true : false;
}
// 显示学生的信息
void print()
{
cout << name <<" " <<ID << " " << grade << endl;
}
//构造函数
~Student()
{
delete []name;
delete []ID;
}
};
list<Student> lst;//学生链表,用于存放学生数据
void print(list<Student> lst, char * name)//输入链表中所有的学生
{
list<Student>::iterator it;
cout << name << ":" << endl;
for(it = lst.begin(); it != lst.end(); ++it)
it->print();
cout << endl;
}
void screenA()//显示屏幕操作A
{
cout<<"****************************************"<<endl;
cout<<" 1--------------查询"<<endl;
cout<<" 2--------------排序"<<endl;
cout<<" 3--------------插入"<<endl;
cout<<" 4--------------删除"<<endl;
cout<<" 5--------------显示"<<endl;
cout<<" 6--------------保存"<<endl;
cout<<" 7--------------清屏"<<endl;
cout<<"****************************************"<<endl;
}
void screenB()//显示屏幕查询
{
system("cls");
cout<<"****************************************"<<endl;
cout<<" 1----------按学号查询"<<endl;
cout<<" 2----------按姓名查询"<<endl;
cout<<" 3----------按成绩查询"<<endl;
cout<<" 4----------返回"<<endl;
cout<<"****************************************"<<endl;
}
void searchByID()//按学号查找
{
cout<<"-------请输入学号ID"<<endl;
char tID[12];
memset(tID,0,12);
cin>>tID;
bool flag=false;
list<Student>::iterator it;
for(it = lst.begin(); it != lst.end(); ++it)
{
if (strcmp(it->ID,tID)==0)
{
cout<<"----查找到,该学生信息如下:-----"<<endl;
it->print();
flag=true;
break;
}
}
if (flag==false)
{
cout<<"未找到!"<<endl;
}
}
void searchByName()//按名字查找
{
cout<<"-------请输入姓名:"<<endl;
char tname[12];
memset(tname,0,12);
cin>>tname;
bool flag=false;
list<Student>::iterator it;
for(it = lst.begin(); it != lst.end(); ++it)
{
if (strcmp(it->name,tname)==0)
{
cout<<"----查找到,该学生信息如下:-----"<<endl;
it->print();
flag=true;
break;
}
}
if (flag==false)
{
cout<<"未找到!"<<endl;
}
}
void searchByGrade()//按分数查找
{
cout<<"-------请输入分数:"<<endl;
int tgrade;
cin>>tgrade;
bool flag=false;
list<Student>::iterator it;
for(it = lst.begin(); it != lst.end(); ++it)
{
if (it->grade==tgrade)
{
cout<<"----查找到,该学生信息如下:-----"<<endl;
it->print();
flag=true;
break;
}
}
if (flag==false)
{
cout<<"未找到!"<<endl;
}
}
void sortByGrade()//按分数进行排序,由高到低
{
system("cls");
cout<<"-------按分数排序完毕,结果如下:"<<endl;
lst.sort( greater<Student>() );
list<Student>::iterator it;
for(it = lst.begin(); it != lst.end(); ++it)
{
it->print();
}
}
void insertStudent()//插入一个学生
{
system("cls");
cout<<"-------请输入学号ID"<<endl;
char tID[12];
memset(tID,0,12);
cin>>tID;
cout<<"-------请输入姓名:"<<endl;
char tname[12];
memset(tname,0,12);
cin>>tname;
cout<<"-------请输入分数:"<<endl;
int tgrade;
cin>>tgrade;
Student stu(tname,tID,tgrade);
lst.push_back(stu);
list<Student>::iterator it;
for(it = lst.begin(); it != lst.end(); ++it)
{
it->print();
}
}
void deleteStudent()//按要求删除一个学生
{
system("cls");
cout<<"-------请输入要删除学生的学号ID:"<<endl;
char tID[12];
memset(tID,0,12);
cin>>tID;
bool flag=false;
list<Student>::iterator it;
for(it = lst.begin(); it != lst.end(); ++it)
{
if (strcmp(it->ID,tID)==0)
{
cout<<"----查找到,该学生信息如下:-----"<<endl;
it->print();
lst.erase(it);
cout<<"删除完毕!"<<endl;
flag=true;
break;
}
}
if (flag==false)
{
cout<<"未找到!"<<endl;
}
}
void inputData()//从文件中读取数据
{
cout<<"正在从文件读入数据..."<<endl;
ifstream ifile("student.dat");
if(!ifile)
{
cout<<"student.dat cannot be opened!"<<endl;
return;
}
char ch;
int i;
for (i=0;i<MAX_STU;i++)//读取数目
{
string s_name,s_id,s_grade;
if(!ifile.get(ch))
{
cout<<"文件已经读完!"<<endl;
return;
}
while (ch!='#')//读取姓名
{
if (ch==' ')//跳过空格
{
ifile.get(ch);
continue;
}
s_name+=ch;
ifile.get(ch);
}
ifile.get(ch);
while (ch!='#')//读取学号
{
if (ch==' ')
{
ifile.get(ch);//跳过空格
continue;
}
s_id+=ch;
ifile.get(ch);
}
ifile.get(ch);
while(ch!='\n')//读取分数
{
if (ch==' ')
{
ifile.get(ch);
continue;
}
s_grade+=ch;
if(!ifile.get(ch))
{
cout<<"文件已经读完!"<<endl;
return;
}
}
Student temp;
strcpy(temp.name,s_name.c_str());
strcpy(temp.ID,s_id.c_str());
temp.grade=atoi(s_grade.c_str());
lst.push_back(temp);
}
ifile.close();
system("cls");
}
void SaveAsFile()
{
system("cls");
ofstream ofile("student.dat",ios::out);
if (!ofile)
{
cout<<"打开文件失败!"<<endl;
return;
}
list<Student>::iterator it;
for(it = lst.begin(); it != lst.end(); ++it)
{
ofile<<it->name<<"#"<<it->ID<<"#"<<it->grade<<"\n";
}
cout <<"保存完毕..."<< endl;
ofile.close();
return ;
}
int main()
{
inputData();//从文件中读入数据
char ch;
screenA();
while (cin>>ch)
{
switch(ch)
{
case '1':
screenB();
while (cin>>ch)
{
int flag=0;
switch(ch)
{
case '1':
searchByID();
break;
case '2':
searchByName();
break;
case '3':
searchByGrade();
break;
case '4':
flag=1;
break;
default:
flag=1;
break;
}
if (flag==1)
{
break;
}
}
break;
case '2'://排序
sortByGrade();
break;
case '3'://插入学生
insertStudent();
break;
case '4'://删除学生
deleteStudent();
break;
case '5'://显示当前信息
print(lst,"---------当前数据列表如下");
break;
case '6'://将数据保存到文件
SaveAsFile();
break;
case '7'://清屏
system("cls");
break;
default:
return 0;
}
screenA();
}
cout<<"系统退出"<<endl;
return 0;
}
student.dat内容如下:
张山 # B11010101 # 98
李四 # B11010101 # 67
王五 # B11010101 # 88
李华 # B11010101 # 76
李阳 # B11010101 # 55
张伟 # B11010101 # 87
王大为 # B11010101 # 89
李小名 # B11010101 # 92
张山一 # B11010101 # 98
李四一 # B11010101 # 67
王五一 # B11010101 # 88
李华一 # B11010101 # 76
李阳一 # B11010101 # 55
张伟一 # B11010101 # 87
王大二 # B11010101 # 89
李小登 # B11010101 # 92