![]() |
#2
Jonny02012018-03-29 19:13
|

#include<iostream>
#include<string>
#include<vector>
#include<fstream>
#include<iomanip>
using namespace std;
struct Course//课程信息
{
long ID;
string name;
};
vector<Course>course;//课程数组
struct Student
{
string name;
long ID;
vector<Course>Syllabus;
bool isCouseSelect(long ID);
void Acourse();
void Dcourse();
void Show();
};
vector<Student>student;//学生数组
template<typename T>
void EnterNum(T &i) //个人习惯,用来输入数字还可以验错,就当cin>>看
{
cin >> i;
if (!cin) //输入失败,比如输入了字母
{
cout << "错误输入,请输入数字:";
cin.clear();
while (cin.get() != '\n');
cin >> i;
}
}
Course GetCourse(long ID) //通过ID获得一个课程,循环一遍就可以
{
for (size_t i = 0; i < course.size(); i++)
if (ID == course[i].ID)
return course[i];
throw 0; //没有找到就使用异常拋回,不懂异常处理的话可以直接先使用一个函数判断课程不存在,比如下面的isCourseHave函数
}
void CourseShow() //课程全部展示,循环
{
for (size_t i = 0; i < course.size(); i++)
cout << "#" << i << "课程编号:" << course[i].ID << " 名称:" << course[i].name << endl;
}
bool isCourseHave(long ID) //判断课程的存在,一样是循环
{
for (size_t i = 0; i < course.size(); i++)
if (course[i].ID == ID)
return true;
return false;
}
bool Student::isCouseSelect(long ID) //判断学生要选的课程是已经选上,循环查看一下保存学生选课信息的数组就可以
{
for (size_t i = 0; i < Syllabus.size(); i++)
if (Syllabus[i].ID == ID)
return true;
return false;
}
void Student::Acourse() //学生选课
{
long ID;
cout << "请输入课程ID:";
EnterNum(ID);
while (!isCourseHave(ID)) //判断课程是否存在了
{
cout << "没有该课程,请重新输入(0退出)\n";
EnterNum(ID);
if (!ID)
return;
}
if (!isCouseSelect(ID))
{
this->Syllabus.push_back(GetCourse(ID));
cout << "成功选课\n";
}
else
{
cout << "你已经选上本课程了\n";
}
}
void Student::Dcourse() //删除课程
{
long ID;
cout << "请输入课程ID:";
EnterNum(ID);
while (!isCourseHave(ID))
{
cout << "没有该课程,请重新输入(0退出)\n";
EnterNum(ID);
if (!ID)
break;
}
if (isCouseSelect(ID))
{
for (auto p = Syllabus.begin(); p != Syllabus.end();)
{
if (p->ID == ID)
{
p = Syllabus.erase(p);
break;
}
else
++p;
}
cout << "成功删除该课程\n";
}
else
{
cout << "你还没添加该课程\n";
}
}
void Student::Show() //展示一个学生的全部已选课信息
{
if (Syllabus.size() == 0)
{
cout << "无" << endl;
return;
}
for (size_t i = 0; i < Syllabus.size(); i++)
cout << " #" << i << "课程编号:" << Syllabus[i].ID << " 名称:" << Syllabus[i].name << endl;
}
Student& StudentSearch(long ID) //ID查找学生,没有拋回,同上面,不太懂的可以先用函数判断此学生是否已经添加到数组
{
for (size_t i = 0; i < student.size(); i++)
if (student[i].ID == ID)
return student[i];
throw 0;
}
void StudentShow() //展示所有学生的选课信息
{
for (size_t i = 0; i < student.size(); i++)
{
cout << "#" << i + 1 << ": ID:" << setw(3) << setfill('0') << student[i].ID << " 名字:" << student[i].name << endl
<< "此学生的选课信息:\n";
student[i].Show();
}
}
void AddCourse() //老师添加课程
{
while (1)
{
Course Tcourse;
cout << "请输入课程ID(0退出):";
EnterNum(Tcourse.ID);
if (!Tcourse.ID)
return;
if (isCourseHave(Tcourse.ID))
{
cout << "该课程已添加,请重新输入或者输入0退出\n";
continue;
}
cout << "请输入你要输入添加课程的名称:";
cin.get(); //cin之后使用getline,记得先使用cin.get(),不然getline会读取输入流保留回车,相当于你直接在getline输入回车
getline(cin, Tcourse.name);
cout << "确认定添加课程" << Tcourse.name << " ID:" << Tcourse.ID << "?(y or n)";
char verify = 'n';
while (1)
{
cin >> verify;
if (verify == 'y' || verify == 'Y')
{
course.push_back(Tcourse);
cout << "成功添加该课程\n";
break;
}
else if (verify == 'n' || verify == 'N')
break;
cout << "请输入y或n\n";
}
cout << "输入1继续添加\n";
int c;
EnterNum(c);
if (c != 1)
return;
}
}
void DeletetCurse() //老师删除课程
{
cout << "请输入课程ID:";
long ID;
EnterNum(ID);
if (isCourseHave(ID))
{
for (auto p = course.begin(); p != course.end();)
{
if (p->ID == ID)
{
p = course.erase(p);
break;
}
else
++p;
}
cout << "成功删除该课程\n";
}
else
{
cout << "你还没添加该课程\n";
}
}
void AddStudnt()//老师添加学生
{
while (1)
{
Student Tstudent;
cout << "请输入学生ID(0退出)\n";
EnterNum(Tstudent.ID);
if (!Tstudent.ID)
return;
try {
StudentSearch(Tstudent.ID);
cout << "该学生已添加,请重新输入或者输入0退出\n";
continue;
}
catch (...) {}
cout << "请输入学生姓名\n";
cin.get();
getline(cin, Tstudent.name);
cout << "确认定添加学生" << Tstudent.name << " ID:" << Tstudent.ID << "?(y or n)";
char verify = 'n';
while (1)
{
cin >> verify;
if (verify == 'y' || verify == 'Y')
{
student.push_back(Tstudent);
cout << "成功添加该学生\n";
break;
}
else if (verify == 'n' || verify == 'N')
break;
cout << "请输入y或n\n";
}
cout << "输入1继续添加\n";
int c;
EnterNum(c);
if (c != 1)
return;
}
}
void Open() //打开文件
{
ifstream Sin("student.txt"); //没有使用ios,因为涉及删除,所以我觉得使用最好是重新写入一遍学生的信息,就直接使用了最简单的方式
ifstream Cin("course.txt");
Student Tstudent;
Course Tcourse;
if ((!Sin) && (!Cin))
{
cerr << "所有数据读求失败,请重新尝试\n";
}
else if (!Sin)
{
cerr << "学生数据读求失败,请重新尝试\n";
}
else if (!Cin)
{
cerr << "课程数据读求失败,请重新尝试\n";
}
else
cout << "读取成功\n";
while (Cin>> Tcourse.name >> Tcourse.ID )
{
course.push_back(Tcourse);
}
while (Sin >> Tstudent.name>> Tstudent.ID)//我把学生信息和选课信息放一起了,格式是学生名字 学生ID 课程ID 课程ID。。。。。
{ //所以读取起来有点麻烦,先读取学生姓名和ID(名字不能是数字)
long CourseID;
while (Sin >> CourseID) //循环输入选课的ID,读到姓名哪里会退出循环,
{
try {
Tstudent.Syllabus.push_back(GetCourse(CourseID));
}
catch (...) {}
}
Sin.clear(); //清空输入流,之后才能正常读取姓名
student.push_back(Tstudent);
Tstudent.Syllabus.clear(); //清空临时数组,有兴趣可以试一试不清空会怎么样
}
Sin.close();
Cin.close();
}
void Save() //保存到文件
{
ofstream Sout("student.txt"); //ofstream不用ios在打开文件时会清空文件的内容
ofstream Cout("course.txt");
for (size_t i = 0; i < student.size(); i++)
{
Sout << student[i].name << " " << student[i].ID;
for (size_t k = 0; k < student[i].Syllabus.size(); k++)
Sout << " " << student[i].Syllabus[k].ID;
Sout << endl;
}
for (size_t i = 0; i < course.size(); i++)
Cout << course[i].name << " " << course[i].ID << endl;
cout << "保存成功\n";
}
void TeacherAct() //老师使用的系统
{
cout << "1 查看学生信息 2更该学生信息 3添加课程 4删除课程 5添加学生 6查看全部课程(0退出)\n";
int c;
EnterNum(c);
while (c)
{
if (c == 1)
{
cout << "1 查找学生 2 全部浏览 (0退出)\n";
int c2;
EnterNum(c2);
if (c2 == 1)
{
cout << "请输入学生ID(0退出)\n";
while (1)
{
long ID;
EnterNum(ID);
if (ID == 0)
break;
try {
cout << "学生ID:" << setw(3) << setfill('0') << ID << " 姓名:" << StudentSearch(ID).name << endl
<< "此学生的选课信息:\n";
StudentSearch(ID).Show();
}
catch (...) { cout << "没有该学生\n"; }
cout << "\n重新输入学生ID或者输入0退出\n";
}
}
if (c2 == 2)
StudentShow();
}
if (c == 2)
{
cout << "请输入学生ID(0退出)\n";
while (1)
{
long ID;
EnterNum(ID);
if (ID == 0)
break;
try {
StudentSearch(ID); //这相当于判断此ID的学生是否存在
cout << "1增添该学生课程 2删除该学生课程(0退出)\n";
int c2;
EnterNum(c2);
if (c2 == 1)
StudentSearch(ID).Acourse();
if (c2 == 2)
StudentSearch(ID).Dcourse();
if (!c2)
break;
}
catch (...) { cout << "没有该学生\n"; }
cout << "\n重新输入学生ID或者输入0退出\n";
}
}
if (c == 3)
AddCourse();
if (c == 4)
DeletetCurse();
if (c == 5)
AddStudnt();
if (c == 6)
CourseShow();
cout << "1 查看学生信息 2更该学生信息 3添加课程 4删除课程 5添加学生 6查看全部课程(0退出)\n";
EnterNum(c);
}
}
void StudentAct() //学生的操作
{
cout << "请输入ID:";
long ID;
EnterNum(ID);
char verify = 'n';
while (1)
{
try {
StudentSearch(ID).name;
cout << "请确认信息: 姓名:" << StudentSearch(ID).name << " ID:" << StudentSearch(ID).ID << "(y or n)\n";
cin >> verify;
if (verify == 'y' || verify == 'Y')
break;
else if (verify == 'n' || verify == 'N')
return;
}
catch (...) { cout << "没有该学生\n"; };
cout << "重新输入ID或者输入n退出\n";
}
Student &stu = StudentSearch(ID);
cout << "1添加课程 2删除课程 3查看已选课程 4查看全部课程(0退出)\n";
while (1)
{
int c;
EnterNum(c);
if (c == 1)
stu.Acourse();
if (c == 2)
stu.Dcourse();
if (c == 3)
stu.Show();
if (c == 4)
CourseShow();
if (c == 0)
break;
cout << "1添加课程 2删除课程 3查看已选课程 4查看全部课程(0退出)\n";
}
}
int main()
{
Open();
cout << "1 教师; 2 学生\n";
int c;
EnterNum(c);
if (c == 1)
TeacherAct();
if (c == 2)
StudentAct();
Save();
system("pause");
}