C++学生选课管理系统

#include<iostream>
#include<ctype.h>
#include<string> //字符串操作的头文件
#include<iomanip> //I/O流控制头文件
#include<fstream> //流的头文件
#include<sstream> //流的头文件
using namespace std;
void menu() //主要菜单
{
cout<<endl;
cout<<" 学生选课系统 "<<endl;
cout<<" 1. 信息录入 "<<endl;
cout<<" 2. 信息浏览 "<<endl;
cout<<" 3. 选择课程 "<<endl;
cout<<" 4. 删除信息 "<<endl;
cout<<" 5. 修改信息 "<<endl;
cout<<" 6. 退出程序 "<<endl;
}
class student //学生类
{
public:
double xuehao; //学生学号
char name[20]; //学生姓名
char major[20]; //学生所学专业
char coursename[20]; //学生所选课程名

void set() //通过set()函数给学生类赋值
{
student stu; //定义类的对象stu
cout<<endl;
cout<<"请输入学生学号: ";
cin>>stu.xuehao;
cout<<"请输入学生姓名: ";
cin>>stu.name;
cout<<"请输入学生专业: ";
cin>>stu.major;
ofstream out("studentInfo.text",ios::app|ios::binary); //用于studentInfo.text的输出,并且文件以二进制方式操作和在文件尾部添加数据
out.write((char *)(&stu),sizeof(stu)); //对二进制文件(studentInfo.text)进行写操作
out.close();
menu();
}

void checkstudent() //查询学生信息
{
student stu;//用于临时保存学生信息的变量
cout<<"学生学号\t学生姓名\t所学专业"<<endl;
ifstream is("studentInfo.text",ios::binary);
while(!is.peek())
{
is.read((char *)(& stu),sizeof(stu)); //对二进制文件(学生.text)进行读操作
cout<<stu.xuehao<<"\t\t"<<stu.name<<"\t"<<stu.major<<"\t"<<endl;
}
is.close();
menu();
}
void cancleStudent() //删除学生信息
{
string xueHaoNum,line,xuehao;
ifstream fin("selectCourseResult.text"); //用于selectCourseResult.text文件的输入
fstream outfile("selectCourseResult.text",ios::trunc|ios::out); //用于selectCourseResult.text文件的输出,打开一个文件进行写操作和使同名文件被删除
cout<<endl;
cout<<"请输入您要删除学生的学号: ";
cin>>xueHaoNum;
while(!fin.eof())
{
getline(fin,line);
istringstream stream(line); //执行串流的输入操作
xueHaoNum = line.substr(0,line.find(" ",0));
if(xuehao != xueHaoNum)
outfile<<line<<endl;
}
outfile.close();
fin.close();
fstream f("selectCourseResult.text",ios::trunc|ios::out); //用于selectCourseResult.text文件的输出,打开一个文件进行写操作和使同名文件被删除
ifstream outf("selectCourseResult.text"); //用于selectCourseResult.text文件的输入
f<<outf.rdbuf();
outf.close();
f.close();
cout<<endl;
menu();
}
void changestudent() //修改学生信息
{
student stu;
int mark;
cout<<endl;
cout<<"请输入需要修改信息的学生学号 ";
double xuehao;
cin>>xuehao;
ifstream is("选课.text",ios::binary); //用于选课.text文件的输入
for(int i=0;!is.eof();i++)
{
is.seekg(48*i); //对输入文件定位,第一个参数是偏移量,第二个参数是基地址
is.read((char *)(&stu),sizeof(stu)); //对二进制文件(学生.text)进行读操作
if(stu.xuehao==xuehao)
{
cout<<"请输入要修改的学生姓名 ";
cin>>stu.name;
cout<<"请输入要修改的学生专业 ";
cin>>stu.major;
cout<<"请输入要修改的学生所选课程 ";
cin>>stu.coursename;
cout<<"修改完毕!"<<endl<<endl;
menu();
mark=48*i;
break;
}
}
is.close();
if(stu.xuehao!=xuehao)
{
cout<<"没有这个学生!"<<endl<<endl;
menu();
}
else
{
ofstream os("选课.text",ios::in|ios::binary); //用于选课.text的输出,并且文件进行读操作和二进制方式打开
os.seekp(mark);
os.write((char *)(&stu),sizeof(stu)); //对二进制文件(学生.text)进行写操作
os.close();
}
}
};
class course //课程类
{
public:
double coursenum; //课程编码
char coursename[20]; //课程名称
char coursemajor[20]; //课程适用专业
char coursetapy[10]; //课程类型
double xuefen; //课程学分
double xueshi; //课程学时
char courseteacher[10]; //课程主讲教师

void set() //通过set()函数给课程类赋值
{
course cus; //作为临时的课程信息保存

cout<<"请输入课程编码: ";
cin>>cus.coursenum;
cout<<"请输入课程名称: ";
cin>>cus.coursename;
cout<<"请输入适用专业: ";
cin>>cus.coursemajor;
cout<<"请输入课程类型: ";
cin>>cus.coursetapy;
cout<<"请输入课程学分: ";
cin>>cus.xuefen;
cout<<"请输入课程学时: ";
cin>>cus.xueshi;
cout<<"请输入主讲教师: ";
cin>>cus.courseteacher;

ofstream os("courses.text",ios::binary|ios::app); //将课程保存在“courses.txt”文件中
os.write((char *)(&cus),sizeof(cus)); //对二进制文件(课程.text)进行写操作
os.close(); //文件(课程.text)的关闭
menu();
}

void checkcourse() //浏览课程信息
{
cout<<endl;
ifstream is("courses.text",ios::binary); //用于课程.text文件的输入
cout<<"课程编码 课程名称 适用专业 课程类型 课程学分 课程学时 主讲教师"<<endl;
course cus;//用于临时保存课程信息
while(!is.peek()) //!is.peek()是检测文件结束
{
is.read((char*)(&cus),sizeof(cus)); //对二进制文件(courses.text)进行读操作
cout<<cus.coursenum<<"\t"<<cus.coursename<<"\t"<<cus.coursemajor<<"\t"
<<cus.coursetapy<<"\t"<<cus.xuefen<<"\t"<<cus.xueshi<<"\t"<<cus.courseteacher<<endl; //setw()是控制输入的宽度
}
is.close();
menu();
}

void canclecourse() //删除课程信息
{
string coursenum,line,course;
ifstream fin("courses.text"); //用于courses.text文件的输入
fstream outfile("courses.text",ios::trunc|ios::out); //用于courses.text文件的输出,打开一个文件进行写操作和使同名文件被删除
cout<<endl;
cout<<"请输入您要删除课程的编码: ";
cin>>coursenum;
while(!fin.eof() )
{
getline(fin,line);
istringstream stream(line); //执行串流的输入操作
coursenum = line.substr(0,line.find(" ",0));
if(course != coursenum)
outfile<<line<<endl;
}
outfile.close();
fin.close();
fstream f("courses.text",ios::trunc|ios::out); //用于courses.text文件的输出,打开一个文件进行写操作和使同名文件被删除
ifstream outf("courses.text"); //用于学courses.text文件的输入
f<<outf.rdbuf();
outf.close();
f.close();
cout<<endl;
menu();
}
void changecourse() //修改课程信息
{
course cus;
int mark;
cout<<endl;
cout<<"请输入要修改课程信息的编码 ";
double coursenum;
cin>>coursenum;
ifstream is("课程.text",ios::binary); //用于课程.text文件的输入
for(int i=0;!is.eof();i++)
{
is.seekg(28*i); //对输入文件定位,第一个参数是偏移量,第二个参数是基地址
is.read((char *)(& cus),sizeof(cus)); //对二进制文件(课程.text)进行读操作
if(cus.coursenum==coursenum)
{
cout<<"请输入要修改的课程名称 ";
cin>>cus.coursename;
cout<<"请输入要修改的适用专业 ";
cin>>cus.coursemajor;
cout<<"请输入要修改的课程类型 ";
cin>>cus.coursetapy;
cout<<"请输入要修改的课程学分 ";
cin>>cus.xuefen;
cout<<"请输入要修改的课程学时 ";
cin>>cus.xueshi;
cout<<"请输入要修改的主讲教师 ";
cin>>cus.courseteacher;
cout<<"修改完毕!"<<endl<<endl;
mark=28*i;
menu();
break;
}
}
is.close();
if(cus.coursenum!=coursenum)
{
cout<<"没有这门课程!"<<endl<<endl;
menu();
}
else
{
ofstream os("courses.text",ios::in|ios::binary); //用于课程.text的输出,并且文件进行读操作和二进制方式打开
os.seekp(mark);
os.write((char *)(& cus),sizeof(cus)); //对二进制文件(课程.text)进行写操作
os.close();
}
}
};

void selectCoures()
{
student stu;//用于保存将要选课的那名同学的信息
int countCoures=0;//用来统计该学生选了多少门课程
int countStudent=0;//用来统计学生的个数
loop:
cout<<endl<<"请输入你的学生学号: ";
double m_xuehao,m_coursenum;//利用学号和课程号分别找出哪位同学选了哪门课
cin>>m_xuehao;
ifstream is("studentInfo.text",ios::binary);
is.seekg(0,ios::beg);
while(!is.peek())
{
is.read((char *)(&stu),sizeof(stu)); //从“studentInfo.text”文件中一次读取学生的信息
if(m_xuehao == stu.xuehao)
{
loob:
countStudent++;
cout<<"请输入学号为"<<m_xuehao<<"的学生想要选择的课程编码(1001-9999): ";
cin>>m_coursenum;
ifstream inCourse("courses.text",ios::binary); //用于从"courses.text"文件中找出该同学想选择的课程信息
inCourse.seekg(0,ios::beg);
while(!inCourse.eof())
{//选课的核心代码
course cus;//用于此同学将要选择的课程信息
inCourse.read((char *)(&cus),sizeof(cus));
if(m_coursenum == cus.coursenum)
{//若找到那门课程则选它
countCoures++;
strcpy(stu.coursename,cus.coursename);
ofstream outStu("selectCourseResult.text",ios::binary|ios::app);//现将选课的同学信息放入选课结果的文件中
outStu.write((char *)(&stu),sizeof(stu));
outStu.close();
cout<<"学号为"<<m_xuehao<<"成功选了课程号为"<<m_coursenum<<"的课程!"<<endl;
}
if(countCoures>=6)
{
cout<<"同学:你选择的课程已经超过"<<countCoures-1<<"门了!"<<endl;
break;
}
}
if(countCoures == 0)
{
cout<<"没有这门课程,还要继续选择其他课程吗y/n?"<<endl;
char ch;
cin>>ch;
if(('y'==ch)||('Y'==ch))
goto loob;
else
break;
}
inCourse.close();
}
}
if(countStudent==0)
{
cout<<"没有这个学生,请重新输入需要选课的学生学号:"<<endl;
goto loop;
}
is.close();
menu();
}
void scanResult()
{//查询选课结果
student stu;//用于保存将要选课的那名同学的信息
//course cus;//用于此同学将要选择的课程信息
cout<<"学生学号\t学生姓名\t所学专业\t选课名称"<<endl;
ifstream is("selectCourseResult.text",ios::binary);
for(int i=0;!is.peek();i++)
{
is.read((char*)(&stu),sizeof(stu)); //对二进制文件(selectCourseResult.text)进行读操作
cout<<stu.xuehao<<"\t\t"<<stu.name<<"\t"<<stu.major<<"\t"<<stu.coursename<<endl;
}
is.close();
menu();
}


void set() //信息录入菜单
{
cout<<endl;
cout<<"�k�k�k�k�k�k1. 录入学生信息�k�k�k�k�k�k"<<endl;
cout<<"�k�k�k�k�k�k2. 录入课程信息�k�k�k�k�k�k"<<endl;
cout<<"�k�k�k�k�k�k3. 返回前面菜单�k�k�k�k�k�k"<<endl<<endl;
student stu;
course cus;
int choose;
cout<<"请输入选项序号: ";
cin>>choose;
switch(choose)
{
case 1: stu.set();break; //录入学生信息函数
case 2: cus.set();break; //录入课程信息函数
case 3: menu();break;
default: cout<<"没有这个选项,请在数字正常范围内输入,谢谢!"<<endl;set();break;
}
}
void check() //查询信息
{
cout<<endl;
cout<<"�k�k�k�k�k�k1. 查询学生信息�k�k�k�k�k�k"<<endl;
cout<<"�k�k�k�k�k�k2. 查询课程信息�k�k�k�k�k�k"<<endl;
cout<<"�k�k�k�k�k�k3. 查询学生选课结果信息�k�k�k�k�k�k"<<endl;
cout<<"�k�k�k�k�k�k4. 返回主要菜单�k�k�k�k�k�k"<<endl<<endl;
cout<<"请输入选项序号 ";
int choose;
cin>>choose;
student stu;
course cus;

switch(choose)
{
case 1: stu.checkstudent();break; //查询学生信息函数
case 2: cus.checkcourse();break; //查询课程信息函数
case 3: scanResult();break; //查询学生选课结果信息
case 4: menu();break;
}
}
void cancle() //删除信息
{
cout<<endl;
cout<<"�k�k�k�k�k�k1. 删除学生信息�k�k�k�k�k�k"<<endl;
cout<<"�k�k�k�k�k�k2. 删除课程信息�k�k�k�k�k�k"<<endl;
cout<<"�k�k�k�k�k�k3. 返回主要菜单�k�k�k�k�k�k"<<endl<<endl;
cout<<"请输入选项序号 ";
student stu;
course cus;
int choose;
cin>>choose;
switch(choose)
{
case 1: stu.cancleStudent();break; //删除学生信息函数
case 2: cus.canclecourse();break; //删除课程信息函数
case 3: menu();break;
default: cout<<"没有这个选项,请在数字正常范围内输入,谢谢!"<<endl;break;
}
}
void change() //修改信息
{
cout<<endl;
cout<<"�k�k�k�k�k�k1. 修改学生信息�k�k�k�k�k�k"<<endl;
cout<<"�k�k�k�k�k�k2. 修改课程信息�k�k�k�k�k�k"<<endl;
cout<<"�k�k�k�k�k�k3. 返回主要菜单�k�k�k�k�k�k"<<endl<<endl;
cout<<"请输入选项序号 ";
student stu;
course cus;
int choose;
cin>>choose;
switch(choose)
{
case 1: stu.changestudent();break; //修改学生信息函数
case 2: cus.changecourse();break; //修改课程信息函数
case 3: cout<<endl;menu();break;
default: cout<<"没有这个选项,请在数字正常范围内输入,谢谢!"<<endl;change();
}
}
int main() //主函数
{
system("color 4b");
menu();
do
{
cout<<endl<<"请输入所选择的菜单项序号: ";
int choose;
cin>>choose;
switch(choose)
{
case 1: set();break; //信息录入
case 2: check();break; //信息浏览
case 3: selectCoures();break; //选择课程
case 4: cancle();break; //删除信息
case 5: change();break; //修改信息
case 6: exit(1);
}
}while(1);
return 0;
}

本文出自 “Cpp编程” 博客,谢绝转载!

你可能感兴趣的:(C++,字符串,管理系统,选课系统)