现在的位置: 首页 > 综合 > 正文

c++ stl list实现简单的学生信息管理系统

2013年10月07日 ⁄ 综合 ⁄ 共 6664字 ⁄ 字号 评论关闭
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


抱歉!评论已关闭.