#include <iostream>
#include <sstream> //字符串转换类型
#include <list>
#include <string>
#include <vector>
#include <fstream> //登录,打印成绩
using namespace std;
class Student
{
private:
string m_strNO; //学号
string m_strName; //姓名
string m_strUniversity; //大学
int m_nTotal; //成绩
public:
Student()
{
m_strNO = "0";
m_strName = "0";
m_strUniversity = "0";
m_nTotal = 0;
}
Student(string strNO , string strName, string strUniversity, int nTotal) :
m_strNO(strNO), m_strName(strName),
m_strUniversity(strUniversity), m_nTotal(nTotal)
{
}
bool operator < (Student& s)
{
return m_strNO < s.GetNO();
}
bool operator == (Student& s)
{
return m_strNO == s.GetNO();
}
string GetNO() { return m_strNO; }
string GetName() { return m_strName; }
string GetUniversity() { return m_strUniversity; }
int GetTotal() { return m_nTotal; }
};
class Log
{
private:
int m_type; //学生登录或者老师登录
string m_strUser; //账号
string m_strPassword; //密码
public:
Log()
{
m_type = 0;
m_strUser = "0";
m_strPassword = "0";
}
Log(int type,string strUser, string strPassword) : m_type(type),
m_strUser(strUser), m_strPassword(strPassword){}
bool operator < (Log& s)
{
return m_strUser < s.GetUser();
}
bool operator == (Log& s)
{
return m_strUser == s.GetUser();
}
int GetType() { return m_type; }
string GetUser() { return m_strUser; }
string GetPassword() { return m_strPassword; }
};
ostream& operator << (ostream& os, Student& s)
{
os << s.GetNO() << "\t" << s.GetName() << "\t" << s.GetUniversity() << "\t" << s.GetTotal();
return os;
}
ostream& operator << (ostream& os, Log& s)
{
os << s.GetType() << "\t" << s.GetUser() << "\t" << s.GetPassword();
return os;
}
typedef list<Student> LISTSTUD;
typedef LISTSTUD::iterator iterator;
typedef vector<Log> VECTORLOG;
class StudManage
{
private:
VECTORLOG m_LogVector; //登录容器
LISTSTUD m_stlList; //学生链表
string strNO; //学号
string strName; //姓名
string strUniversity; //大学
int nTotal; //成绩
int type; //学生登录或者老师登录
string strUser; //账号
string strPassword; //密码
public:
void Log_init()
{
/*将文件的类型、账号和密码插入容器中*/
ifstream All_user;
All_user.open("Alluser.txt");
if (!All_user)
{
cout << "打开文件失败" << endl;
}
while (All_user >> type >> strUser >> strPassword)
{
const Log s(type, strUser, strPassword);
m_LogVector.push_back(s);
}
//for (VECTORLOG::iterator it = m_LogVector.begin(); it != m_LogVector.end(); it++)
//{
// cout << *it << endl;
//}//单元测试是否加入了登录的库
All_user.close();
}
bool Log_In(int type,string strUser,string strPassword)
{
/*从容器中查找是否有匹配的值*/
stringstream m_ctoi;
int m_1;
int m_2;
int m_3;
int m_4;
VECTORLOG::iterator it = m_LogVector.begin();
while (it != m_LogVector.end())
{
Log& s = *it;
m_ctoi << s.GetUser();
m_ctoi >> m_1;
m_ctoi.clear();
m_ctoi << strUser;
m_ctoi >> m_2;
m_ctoi.clear();
m_ctoi << s.GetPassword();
m_ctoi >> m_3;
m_ctoi.clear();
m_ctoi << strPassword;
m_ctoi >> m_4;
m_ctoi.clear();
if (type == s.GetType() && m_1 == m_2 && m_3 == m_4)
{
return true;
}
++it;
}
if (it == m_LogVector.end())
{
return false;
}
return true;
}
bool Add() //从 Allstudent表 中添加学生
{
ifstream All_student;
All_student.open("Allstudent.txt");
if (!All_student)
{
cout << "打开文件失败" << endl;
}
while (All_student >> strNO >> strName >> strUniversity >> nTotal)
{
const Student s(strNO, strName, strUniversity, nTotal);
m_stlList.push_back(s);
}
All_student.close();
return true;
}
bool Merge(StudManage& stud) // 如果有两张表可以进行合并
{
m_stlList.sort();
stud.m_stlList.sort();
//将两张表分别排序
m_stlList.merge(stud.m_stlList);//归并排序
m_stlList.unique();//去重
return true;
}
void Merge() //插入之后进行排序(去重)
{
fstream Merge_student;
Merge_student.open("Allstudent.txt", ios::in | ios::out | ios::trunc);
if (!Merge_student)
{
cout << "打开文件失败" << endl;
}
m_stlList.sort();//排序
m_stlList.unique();//去重
for (LISTSTUD::iterator it = m_stlList.begin(); it != m_stlList.end(); it++)
{
Merge_student << *it << endl;
}
Merge_student.close();
}
void Show_All() //显示学生(教师功能)
{
for (LISTSTUD::iterator it = m_stlList.begin(); it != m_stlList.end(); it++)
{
cout << *it << endl;
}
}
void Add_Student() //添加学生(教师功能)
{
fstream Add_student;
Add_student.open("Allstudent.txt", ios::in | ios::out | ios::trunc);
if (!Add_student)
{
cout << "打开文件失败!!" << endl;
}
cin>> strNO >> strName >> strUniversity >> nTotal;
const Student s(strNO,strName,strUniversity,nTotal);
m_stlList.push_back(s);
for (LISTSTUD::iterator it = m_stlList.begin(); it != m_stlList.end(); it++)
{
Add_student << *it << endl;
}
Add_student.close();
cout << "插入成功!" << endl;
}
void Delete_Student() //删除学生(教师功能)
{
string Delete_student_No;
/* 按学号删除 */
cin >> Delete_student_No;
stringstream m_ctoi;
bool bFind = false;
int m_1;
int m_2;
fstream Delete_stu;
Delete_stu.open("Allstudent.txt", ios::in | ios::out | ios::trunc);
if (!Delete_stu)
{
cout << "打开文件失败!!" << endl;
}
LISTSTUD::iterator it = m_stlList.begin();
while (it != m_stlList.end())
{
Student& s = *it;
m_ctoi << s.GetNO();
m_ctoi >> m_1;
m_ctoi.clear();
m_ctoi << Delete_student_No;
m_ctoi >> m_2;
m_ctoi.clear();
if (m_1 == m_2) // 字符串转换一下
{
bFind = true;
m_stlList.erase(it);
cout << " 已经成功删除! " << endl;
Delete_stu.close();
break;
}
++it;
if (it == m_stlList.end())
{
cout << " 对不起,没有要删除的同学信息 " << endl;
}
}
for (LISTSTUD::iterator it = m_stlList.begin(); it != m_stlList.end(); it++)
{
Delete_stu << *it << endl;
}
}
void Show_Student(string strNO) //学生查询个人成绩(学生功能)
{
stringstream m_ctoi;
bool bFind = false;
int m_1;
int m_2;
LISTSTUD::iterator it = m_stlList.begin();
while (it != m_stlList.end())
{
Student& s = *it;
m_ctoi << s.GetNO();
m_ctoi >> m_1;
m_ctoi.clear();
m_ctoi << strNO;
m_ctoi >> m_2;
m_ctoi.clear();
if (m_1 == m_2) // 字符串转换一下
{
bFind = true;
cout << *it << endl;
break;
}
++it;
}
if(it == m_stlList.end())
{
system("cls");
cout << " 没有这个同学 " << endl;
}
}
void Printf_Grade()//打印所有人的成绩(教师功能)
{
fstream printf_grade;
printf_grade.open("Allstudent.txt", ios::in | ios::out | ios::trunc);
if (!printf_grade)
{
cout << "打开文件失败!!" << endl;
}
for (LISTSTUD::iterator it = m_stlList.begin(); it != m_stlList.end(); it++)
{
printf_grade << *it << endl;
}
printf_grade.close();
cout << "打印成功!!" << endl;
}//打印成绩
};
int main()
{
stringstream ctoi;
stringstream itoc;
int Log_in = 0;
int Teacher_n = 0;
int Student_n = 0;
int Log_num = 0;
string Student_No;
string Log_Str_User;
string Log_Str_Password;
cout << "****************************************************" << endl;
cout << "|****************学校成绩管理系统******************|" << endl;
cout << "| |" << endl;
cout << "| 1.老师登录 2.学生登录 其他.退出 |" << endl;
cout << "| |" << endl;
cout << "| |" << endl;
cout << "| 请输出(1 或 2) : | "<< endl;
cout << "****************************************************" << endl;
/****************************创建原始表***********************************/
StudManage sm1;
sm1.Add();
sm1.Merge();
sm1.Log_init();
/***************************************************************************/
while (1) {
cin >> Log_in;
switch (Log_in)
{
case 1:
system("cls");
if(Log_num == 0)
{
for (Log_num = 1; Log_num < 4; Log_num++)
{
cout << "请输入第" << Log_num << "次密码(只能输入3次):"<< endl ;
cin >> Log_Str_User >> Log_Str_Password;
if (sm1.Log_In(Log_in, Log_Str_User, Log_Str_Password))
{
break;
}
}//(Log_num = 1; Log_num < 4; Log_num++)
if (Log_num > 3)
{
cout << "对不起输入超过限制,稍后重试!!" << endl;
system("pause");
return 0;
}
}//(Log_num == 0)
while (1) {
system("cls");
cout << "*************************学校成绩管理系统*************************" << endl;
cout << "| 欢迎教师登录 |" << endl;
cout << "|****************************************************************|" << endl;
cout << "|1.插入成绩 2.删除成绩 3.查询成绩 4.修改成绩 5.打印成绩 其他.退出|" << endl;
cout << "| |" << endl;
cout << "| |" << endl;
cout << "| 请输出(1 、2 、3、 4 或 5: ) : |" << endl;
cout << "******************************************************************" << endl;
cin >> Teacher_n;
switch (Teacher_n)
{
case 1:
system("cls");
cout << "*****************学校成绩管理系统***************" << endl;
cout << "************************************************" << endl;
cout << " 请输入学生的信息(学号,姓名,学校,总分) :" << endl;
sm1.Add_Student();
sm1.Merge();
Teacher_n = 0;
system("pause");
break;
case 2:
system("cls");
cout << "******************学校成绩管理系统**************" << endl;
cout << "************************************************" << endl;
cout << " 请输入要删除的学生(学号) :" << endl;
sm1.Delete_Student();
Teacher_n = 0;
system("pause");
break;
case 3:
system("cls");
cout << "****************学校成绩管理系统***************" << endl;
cout << "************************************************" << endl;
sm1.Show_All();
Teacher_n = 0;
system("pause");
break;
case 4:
break;
case 5:
system("cls");
sm1.Printf_Grade();
Teacher_n = 0;
system("pause");
break;
default:
system("cls");
Teacher_n = 0;
cout << "程序退出!!" << endl;
system("pause");
return 0;
}//while (1)
}
break; //case 1:
case 2:
system("cls");
if (Log_num == 0)
{
for (Log_num = 1; Log_num < 4; Log_num++)
{
cout << "请输入第" << Log_num << "次密码(只能输入3次):" << endl;
cin >> Log_Str_User >> Log_Str_Password;
if (sm1.Log_In(Log_in, Log_Str_User, Log_Str_Password))
{
break;
}
}//(Log_num = 1; Log_num < 4; Log_num++)
if (Log_num > 3)
{
cout << "对不起输入超过限制,稍后重试!!" << endl;
system("pause");
return 0;
}
}//(Log_num == 0)
while (1) {
system("cls");
cout << "*************************学校成绩管理系统***********************" << endl;
cout << "| |" << endl;
cout << "| 欢迎学生登录 |" << endl;
cout << "|**************************************************************|" << endl;
cout << "| |" << endl;
cout << "| 1.查询成绩 其他.退出 |" << endl;
cout << "| |" << endl;
cout << "| 请输出数字 1 : |" << endl;
cout << "****************************************************************" << endl;
cin >> Student_n;
switch (Student_n)
{
case 1:
cout << "请输入查询学号" << endl;
cin >> Student_No;
system("cls");
sm1.Show_Student(Student_No);
Student_n = 0;
system("pause");
break;
default:
Student_n = 0;
system("pause");
return 0;
}
}// while (1)
break; // case 2:
default:
cout << "程序退出!!" << endl;
system("pause");
return 0;
} // switch (n)
}//while (1)
cout << "程序退出!!" << endl;
system("pause");
return 0;
}
Allstudent.txt
1 1 1 1
10 hexin shan 100
2 2 2 2
3 3 3 3
5 5 5 5
6 6 6 6
7 7 77 7
8 8 8 88
Alluser.txt
1 1 1
2 2 2