码迷,mamicode.com
首页 > 编程语言 > 详细

上个月C++课程设计做的一个《学生成绩管理和选课系统》

时间:2014-12-06 13:57:14      阅读:304      评论:0      收藏:0      [点我收藏+]

标签:des   blog   io   ar   os   使用   sp   for   on   

分享下代码。冗余的代码比较多。比较重要的部分有注释。

采用文件方式保存数据,需要先在D盘建立三个“表”,即是txt文件,分别是student.txt,teacher.txt,course.txt。

其中teacher.txt,中要预先存入一组数据,如下

教师id    姓名    密码	
1    大明	123123

然后编译运行程序,选择教师登录,用上面的id和密码登录就可以进行学生的增删改查操作了。

 

下面贴代码,功能就看main()函数的菜单吧,懒得详述了...

 

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

const int T_SUM = 128;					//教师容纳量
const int S_SUM = 1024;					//学生容纳量
const int C_SUM = 128;					//课程容纳量

class Teacher {
public:
	static int inputTeacher();			//从文件读入教师数据到对象数组
	static void outputTeacher();		//从对象数组输出教师数据到文件
	static void printHead();			//输出字段名
	static int teacherSum;				//储存实际教师人数
	void init(string tid, string tname, string tpassword);	//初始化教师信息
	bool login();						//登录功能
	void find();						//查询某个老师信息
	void addStudent();					//用于实例化一个学生类并调用学生类的init函数(增加学生信息)
	void delStudent();					//删除学生信息
	void setStudent();					//修改学生信息
	int findStudent();					//查询学生信息
	void setpassword();					//教师修改自己的密码
	void showMyInfo();					//供登录教师查看自己的信息
	void addCourse();					//增加课程信息
	void delCourse();					//删除课程信息
	void setCourse();					//修改课程信息
protected:
	string tid;							//教师id
	string tname;						//教师姓名
	string tpassword;					//教师登录密码
};

class Student {
public:
	friend class Teacher;				//友元类,使得学生类的保护成员能被教师类访问
	static int inputStudent();			//从文件读入学生数据到对象数组
	static void outputStudent();		//从对象数组输出学生数据到文件
	static void sortByASC();			//总成绩按升序排列
	static void sortByDESC();			//总成绩按降序排列
	static void sortBySid();			//总成绩按学号排列
	static void printHead();			//输出字段名
	static void display();				//显示所有学生信息
	static void selectFail();			//显示不及格的学生
	static int studentSum;				//储存实际学生
	void init(string sid, string sname, string spassword, double midScore , double finalScore);	//初始化(增加)学生信息
	bool login();						//登录功能
	void add();							//增加学生信息
	void del();							//删除学生信息
	void find();						//查询某个学生信息
	void setSid();						//修改学生id
	void setSname();					//修改学生姓名
	void setSpassword();				//修改学生密码
	void setMidScore();					//修改期中成绩
	void setFinalScore();				//修改期末成绩
	void showMyInfo();					//供登录学生查看自己的信息
	void chooseCourse();				//选修课程
	void delCourse();					//退选课程
protected:
	string sid;							//学生id
	string sname;						//学生姓名
	string spassword;					//学生登录密码
	double midScore;					//学生期中成绩
	double finalScore;					//学生期末成绩
	double sumScore;					//学生总分
	double aveScore;					//学生平均成绩
	string _course;						//选修课程名
};

class Course {
public:
	friend class Teacher;				//友元类,使得课程类的保护成员能被教师类访问
	friend class Student;				//友元类,使得课程类的保护成员能被学生类访问
	static int inputCourse();			//从文件读入课程数据到对象数组
	static void outputCourse();			//从对象数组输出课程数据到文件
	static void display();				//显示所有课程
	static void printHead();			//输出字段名
	static int courseSum;				//储存实际课程
	void init(string cid, string cname, int csum);	//初始化课程信息
	void add();							//添加课程
	void del();							//删除课程
	void setCid();						//修改课程号
	void setCname();					//修改课程名
	void setCsum();						//修改课程数
	void find();						//查询课程信息
protected:
	string cid;							//课程编号
	string cname;						//课程名
	int csum;							//课程剩余数
};


Teacher teacher[T_SUM];
int Teacher::teacherSum = inputTeacher();

Student student[S_SUM];
int Student::studentSum = inputStudent();

Course course[C_SUM];
int Course::courseSum = inputCourse();

//class of Teacher
int Teacher::inputTeacher() {
	int count = 0;
	string tid;	
	string tname;
	string tpassword;	

	ifstream fin;
	fin.open("D:\\teacher.txt");

	//没有文件就创建文件
	if(!fin) {
		outputTeacher();
		return 0;	//返回0个教师数
	}

	//过滤字段名
	string temp;
	fin >> temp;
	fin >> temp;
	fin >> temp;

	for(int i = 0; i < T_SUM; i++){
		fin >> tid; 
		fin >> tname;
		fin >> tpassword;
		if (fin.get() == EOF)
			break;
		teacher[i].init(tid, tname, tpassword);
		count++;
	}
	return count;
}

void Teacher::outputTeacher() {
	ofstream fout;
	fout.open("D:\\teacher.txt", ios::trunc|ios::in);
	if(!fout) {cout<<"写入数据失败!";return;}

	fout << "教师id" << "\t"
		<<	"姓名"	<< "\t"
		<<	"密码"	<< "\t";
	fout << endl; 

	for(int i = 0; i < teacherSum; i++){
		fout << teacher[i].tid << "\t"
			<< teacher[i].tname << "\t"
			<< teacher[i].tpassword << endl;
	}
	fout.close();
}

void Teacher::printHead() {
	cout << endl;
	cout << "教师id" << "\t"
		<<	"姓名"	<< "\t"
		<<	"密码"	<< "\t";
	cout << endl;
}

bool Teacher::login() {
	cout << endl;

	string tid;
	string tpassword;
	cout << "---登录界面---" << endl;
	cout << "请输入教师id:" ;
	cin >> tid;
	cout << "请输入密码: " ;
	cin >> tpassword;

	Teacher temp;
	for(int i = 0; i < teacherSum; i++) {
		temp = teacher[i];
		if(tid == temp.tid) {
			if(tpassword == temp.tpassword) {
				cout << endl;
				cout << "---登录成功:欢迎你" << temp.tname << "!---" <<endl;

				//登录成功后要用对象数组中存放的信息初始化当前对象
				init(teacher[i].tid, teacher[i].tname, teacher[i].tpassword);

				return true;
			} else {
				cout << endl;
				cout << "---登录失败:密码不正确!---" ;
				cout << endl;
				return false;
			}
		}
	}

	cout << endl;
	cout << "---登录失败:找不到该教师id!---" ;
	cout << endl;
	return false;
}

void Teacher::init(string tid, string tname, string tpassword) {
	this -> tid = tid;
	this -> tname = tname;
	this -> tpassword = tpassword;
}

void Teacher::addStudent() {
	Student temp;

	string sid;	
	string sname;
	string spassword = "123456";	//默认密码
	double midScore;	
	double finalScore;	

	cout << endl;

back:
	cout << "请输入学生学号:";
	cin >> sid;

	//学号不能重复的输入合法性检查
	for(int i = 0; i < Student::studentSum; i++) {
		if(sid == student[i].sid ) {
			cout<<endl
				<<"学号不能重复,请重新输入。"
				<<endl;
			goto back;
		}
	}

	cout << "请输入学生姓名:";
	cin >> sname;
	cout << "请输入学生期中成绩:";
	cin >> midScore;
	cout << "请输入学生期末成绩:";
	cin >> finalScore;

	temp.init(sid, sname, spassword, midScore, finalScore);
	temp.add();

	cout << endl;
	cout << "---添加学生信息成功!---";
	cout << endl;
}

int Teacher::findStudent() {
	Student temp;

	string sid;
	cout << endl;
	cout << "请输入要查找学生的学号:";
	cin >> sid;

	int i;
	for(i = 0; i < Student::studentSum; i++) {
		if(sid == student[i].sid) {
			temp.init(student[i].sid, student[i].sname, student[i].spassword, student[i].midScore, student[i].finalScore);
			cout << "---找到如下学生信息---";
			Student::printHead();
			temp.find();

			//返回找到的学生在对象数组中的位置
			return i;
		}
	}

	cout << endl;
	cout << "---找不到该学生!---";
	cout << endl;
	return -1;

}

void Teacher::delStudent() {
	Student temp;

	cout<<endl;
	cout<< "---请先查找要被删除的学生---";
	cout<<endl;

	string sid;
	cout << endl;
	cout << "请输入要查找学生的学号:";
	cin >> sid;

	for(int i = 0; i < Student::studentSum; i++) {
		if(sid == student[i].sid) {
			temp.init(student[i].sid, student[i].sname, student[i].spassword, student[i].midScore, student[i].finalScore);
			temp.del();
			return;
		}
	}

	cout << endl;
	cout << "---找不到该学生!---";
	cout << endl;
}

void Teacher::setStudent() {
	Student temp;

	int point = findStudent();
	cout << endl;

	temp = student[point];

	int flg;
	cout<<"┌───────────┐"<<endl
		<<"│   学生成绩管理系统   │"<<endl
		<<"│   修改学生信息菜单   │"<<endl
		<<"├───────────┤"<<endl
		<<"│   1.修改学生学号     │"<<endl
		<<"│   2.修改学生姓名     │"<<endl
		<<"│   3.修改学生密码     │"<<endl
		<<"│   4.修改期中成绩     │"<<endl
		<<"│   5.修改期末成绩     │"<<endl
		<<"│   6.返回上级菜单     │"<<endl
		<<"└───────────┘"<<endl;
	cout<<"请输入操作编号:";
	cin>>flg;
	switch (flg)
	{
	case(1):
		temp.setSid();break;
	case(2):
		temp.setSname();break;
	case(3):
		temp.setSpassword();break;
	case(4):
		temp.setMidScore();break;
	case(5):
		temp.setFinalScore();break;
	case(6):
		return;
	default:
		cout<<endl<<"───输入有误!───"<<endl<<endl;
		break;
	}
}

void Teacher::setpassword() {
	string tpassword;
	cout << endl;
	cout << "请输入新密码:";

	cin >> tpassword;
	this -> tpassword = tpassword;

	for(int i = 0; i < teacherSum; i++) {
		if(this -> tid == teacher[i].tid) {


			teacher[i].tpassword = tpassword;
			break;

		}
	}

	outputTeacher();
	inputTeacher();

	cout << "---密码修改成功!---" <<endl;
}

void Teacher::showMyInfo() {
	printHead();
	find();
}

void Teacher::find() {
	cout << tid << "\t"
		<< tname << "\t"
		<< tpassword << "\t";
	cout << endl;
}

void Teacher::addCourse() {
	Course temp;

	string cid;
	string cname;
	int csum;

	cout << endl;

back9:
	cout << "请输入课程号:";
	cin >> cid;

	//学号不能重复的输入合法性检查
	for(int i = 0; i < Course::courseSum; i++) {
		if(cid == course[i].cid ) {
			cout<< endl
				<< "---课程号不能重复,请重新输入!---"
				<< endl;
			goto back9;
		}
	}

	cout << "请输入课程名称:";
	cin >> cname;
	cout << "请输入课程数目:";
	cin >> csum; 

	temp.init(cid, cname, csum);
	temp.add();

	cout << endl;
	cout << "---添加课程信息成功!---";
	cout << endl;
}

void Teacher::delCourse() {
	Course temp;

	cout<<endl;
	cout<< "---请先查找要被删除的课程---";
	cout<<endl;

	string cid;
	cout << endl;
	cout << "请输入要查找的课程号:";
	cin >> cid;

	for(int i = 0; i < Course::courseSum; i++) {
		if(cid == course[i].cid) {
			temp.init(course[i].cid, course[i].cname, course[i].csum);
			temp.del();
			return;
		}
	}

	cout << endl;
	cout << "---找不到该课程!---";
	cout << endl;
}

void Teacher::setCourse() {
	Course temp;

	cout<<endl;
	cout<< "---请先查找要被修改的课程---";
	cout<<endl;

	string cid;
	cout << endl;
	cout << "请输入要查找的课程号:";
	cin >> cid;

	int point = -1;
	for(int i = 0; i < Course::courseSum; i++) {
		if(cid == course[i].cid) {
			temp = course[i];
			point = i;
		}
	}

	cout << "---找到以下课程---" << endl;
	temp.find();

	if(point == -1) {
		cout << endl;
		cout << "---找不到该课程!---";
		cout << endl;
		return;
	}

	int flg;
	cout<<"┌───────────┐"<<endl
		<<"│   学生成绩管理系统   │"<<endl
		<<"│     课程管理菜单     │"<<endl
		<<"├───────────┤"<<endl
		<<"│     1.修改课程号     │"<<endl
		<<"│     2.修改课程名     │"<<endl
		<<"│     3.修改课程数     │"<<endl
		<<"├───────────┤"<<endl
		<<"│    4.返回上级菜单    │"<<endl
		<<"└───────────┘"<<endl;
	cout<<"请输入操作编号:";
	cin>>flg;
	switch (flg)
	{
		case(1):
			temp.setCid();
			break;
		case(2):
			temp.setCname();
			break;
		case(3):
			temp.setCsum();
			break;
		case(4):
			return;
		default:
			cout<<endl<<"───输入有误!───"<<endl<<endl;
			break;
	}
}

//class of Student
int Student::inputStudent() {
	int count = 0;
	string sid;	
	string sname;	
	string spassword;	
	double midScore;	
	double finalScore;
	string _course;

	ifstream fin;
	fin.open("D:\\student.txt");

	//没有文件就创建文件
	if(!fin) {
		outputStudent();
		return 0;	//返回0个学生数
	}

	//过滤字段名
	string temp;
	fin >> temp; 
	fin >> temp;
	fin >> temp;
	fin >> temp;
	fin >> temp;
	fin >> temp;	
	fin >> temp;
	fin >> temp;

	for(int i = 0; i < S_SUM; i++){
		fin >> sid; 
		fin >> sname;
		fin >> spassword;
		fin >> midScore;
		fin >> finalScore;
		fin >> temp;	//总分和平均成绩让init函数去计算,这里读入temp为过滤掉
		fin >> temp;
		fin >> _course;
		if (fin.get() == EOF)
			break;
		student[i].init(sid, sname, spassword, midScore, finalScore);
		student[i]._course = _course;
		count++;
	}
	return count;
}

void Student::outputStudent() {
	ofstream fout;
	fout.open("D:\\student.txt", ios::trunc|ios::in);
	if(!fout) {cout<<"写入数据失败!";return;}

	fout << "学号" << "\t"
		<<	"姓名"	<< "\t"
		<<	"密码"	<< "\t"
		<<	"期中"	<< "\t"
		<<	"期末"	<< "\t"
		<<	"总分"	<< "\t"
		<<	"平均分"	<< "\t"
		<<	"选修课"	<< "\t";
	fout << endl;

	for(int i = 0; i < studentSum; i++){

		//只将未被标记删除的学生导入文件
		if( student[i].sid != "deleted") {
			fout << student[i].sid<< "\t\t"
				<< student[i].sname << "\t"
				<< student[i].spassword << "\t\t"
				<< student[i].midScore << "\t\t"
				<< student[i].finalScore << "\t\t"
				<< student[i].sumScore << "\t\t"
				<< student[i].aveScore << "\t\t"
				<< student[i]._course << endl;
		}
	}
	fout.close();
}

void Student::printHead() {
	cout << endl;
	cout << "学号" << "\t"
		<<	"姓名"	<< "\t"
		<<	"密码"	<< "\t"
		<<	"期中"	<< "\t"
		<<	"期末"	<< "\t"
		<<	"总分"	<< "\t"
		<<	"平均分"	<< "\t"
		<<	"选修课"	<< "\t";
	cout << endl;
}

void Student::init(string sid, string sname, string spassword, double midScore , double finalScore) {
	this -> sid = sid;
	this -> sname = sname;
	this -> spassword = spassword;
	this -> midScore = midScore;
	this -> finalScore = finalScore;

	//计算总分和平均分
	this -> sumScore = midScore + finalScore;
	this -> aveScore = sumScore / 2;

	//选课功能为后加,这样写有点不正确
	for(int i = 0; i < studentSum; i++) {
		if(this -> sid == student[i].sid) {
			_course = student[i]._course;
			return;
		}
	}

	_course = "无";
}

void Student::add() {
	student[studentSum].sid = sid;
	student[studentSum].sname = sname;
	student[studentSum].spassword = spassword;
	student[studentSum].midScore = midScore;
	student[studentSum].finalScore = finalScore;
	student[studentSum].sumScore = sumScore;
	student[studentSum].aveScore = aveScore;
	student[studentSum]._course = _course;

	Student::studentSum++;
	outputStudent();
}

void Student::del() {
	bool flg = false;
	string flg0;

	//先找到要被删除的学生在对象数组中的位置
	for(int i = 0; i < studentSum; i++) {
		if(sid == student[i].sid ) {
			//二次确认
			cout << endl;
			cout << "---你确定要删除学生:" << sid << "," << student[i].sname << "。---";
			cout << endl;
			cout << "---输入Y确定---";
			cout << endl;
			cin >> flg0;

			if(flg0 == "Y" || flg0 == "y") {

				//将被删除学生的sid标记为deleted
				student[i].sid = "deleted";

				//学生总数-1
				Student::studentSum--;	

				//使删除后的学生覆盖到对象数组中
				outputStudent();
				inputStudent();	
				flg = true;

				cout << endl;
				cout << "---删除学生信息成功!---";
				cout << endl;

				break;
			} else {
				break;
			}
		}
	}

	if(flg == false) {
		cout << endl;
		cout << "---删除学生信息失败!---";
		cout << endl;
	}

}

void Student::find() {
	cout << sid << "\t"
		<< sname << "\t"
		<< spassword << "\t"
		<< midScore << "\t"
		<< finalScore << "\t"
		<< sumScore << "\t"
		<< aveScore << "\t"
		<< _course;
	cout << endl;
}

void Student::sortByASC() {
	Student temp;

	//将对象数组student中的数据按总分升序排序
	for(int i = 0; i < studentSum - 1; i++){
		for(int j = i + 1; j < studentSum; j++){
			if( student[i].sumScore > student[j].sumScore){
				temp = student[i]; 
				student[i] = student[j]; 
				student[j] = temp;
			}
		}
	}

	//输出到文件保存
	outputStudent();
}

void Student::sortByDESC() {
	Student temp;

	//将对象数组student中的数据按总分降序排序
	for(int i = 0; i < studentSum - 1; i++){
		for(int j = i + 1; j < studentSum; j++){
			if( student[i].sumScore < student[j].sumScore){
				temp = student[i]; 
				student[i] = student[j]; 
				student[j] = temp;
			}
		}
	}

	//输出到文件保存
	outputStudent();
}

void Student::sortBySid() {
	Student temp;

	//将对象数组student中的数据按总分降序排序
	for(int i = 0; i < studentSum - 1; i++){
		for(int j = i + 1; j < studentSum; j++){
			if( student[i].sid > student[j].sid){
				temp = student[i]; 
				student[i] = student[j]; 
				student[j] = temp;
			}
		}
	}

	//输出到文件保存
	outputStudent();
}

void Student::display() {
	printHead();

	//遍历数组,赋值给temp,调用temp对象find()函数进行输出
	Student temp;
	for(int i = 0; i < studentSum; i++){
		temp = student[i];
		temp.find();
	}
}

void Student::selectFail() {
	printHead();

	//遍历数组,赋值给temp,调用temp对象find()函数进行输出
	Student temp;
	for(int i = 0; i < studentSum; i++){

		//期中,期末有一科不及格就筛选出来并输出
		if(student[i].midScore < 60 || student[i].finalScore < 60) {
			temp = student[i];
			temp.find();
		}
	}
}

void Student::setSid() {
	cout << endl;

	string sid;
	for(int i = 0; i < Student::studentSum; i++) {

		//注意this
		if(this -> sid == student[i].sid ) {
back0:
			cout << "请输入新的学号:";
			cin >> sid;

			//学号不能重复的输入合法性检查
			for(int i = 0; i < Student::studentSum; i++) {
				if(sid == student[i].sid ) {
					cout<< endl
						<< "---学号不能重复,请重新输入!---"
						<< endl;
					goto back0;
				}
			}

			student[i].sid = sid;
			break;
		}
	}

	outputStudent();
	inputStudent();

	cout << "---学号修改成功!---" <<endl;
}

void Student::setSname() {
	cout << endl;

	string sname;
	for(int i = 0; i < Student::studentSum; i++) {
		if(this -> sid == student[i].sid) {
			cout << "请输入新的姓名:";
			cin >> sname;

			student[i].sname = sname;
			break;
		}

	}

	outputStudent();
	inputStudent();

	cout << "---姓名修改成功!---" <<endl;
}

void Student::setSpassword() {
	cout << endl;

	string spassword;
	for(int i = 0; i < Student::studentSum; i++) {
		if(this -> sid == student[i].sid) {
back1:
			cout << "请输入新的密码:";
			cin >> spassword;

			//新密码不能为初始密码123456 且不能少于6位
			if(spassword == "123456" && spassword.length() < 6) {
				cout<<endl
					<<"密码过于简单,请重新输入!"
					<<endl
					<<endl;
				goto back1;

				//学生有权限更改自己的密码,要将当前对象的spassword也更改了
				this -> spassword = spassword;

				student[i].spassword = spassword;
				break;
			}
		}
	}

	outputStudent();
	inputStudent();

	cout << "---密码修改成功!---" <<endl;
}

void Student::setMidScore() {
	cout << endl;

	double midScore;
	for(int i = 0; i < Student::studentSum; i++) {
		if(this -> sid == student[i].sid) {

			cout << "请输入新的期中成绩:";
			cin >> midScore;

			student[i].midScore = midScore;
			break;

		}
	}

	outputStudent();
	inputStudent();

	cout << "---期中成绩修改成功!---" <<endl;
}

void Student::setFinalScore() {
	cout << endl;

	double finalScore;
	for(int i = 0; i < Student::studentSum; i++) {
		if(this -> sid == student[i].sid) {

			cout << "请输入新的期末成绩:";
			cin >> finalScore;

			student[i].finalScore = finalScore;
			break;

		}
	}

	outputStudent();
	inputStudent();

	cout << "---期末成绩修改成功!---" <<endl;
}

bool Student::login() {
	cout << endl;

	string sid;
	string spassword;
	cout << "---登录界面---" << endl;
	cout << "请输入学号:" ;
	cin >> sid;
	cout << "请输入密码(初始密码123456): " ;
	cin >> spassword;

	Student temp;
	for(int i = 0; i < studentSum; i++) {
		temp = student[i];
		if(sid == temp.sid) {
			if(spassword == temp.spassword) {
				
				//判断是否第一次登录,第一次登录需要改密码
				if(temp.spassword != "123456") {
					cout << endl;
					cout << "---登录成功:欢迎你" << temp.sname << "!---" <<endl;

					//登录成功后要用对象数组中存放的信息初始化当前对象
					init(student[i].sid, student[i].sname, student[i].spassword, student[i].midScore , student[i].finalScore);

					return true;
				} else {
					cout << endl;
					cout << "---登录成功:你是第一次登录,需要修改密码! ---" << endl;

					//登录成功后要用对象数组中存放的信息初始化当前对象
					init(student[i].sid, student[i].sname, student[i].spassword, student[i].midScore , student[i].finalScore);

					student[i].setSpassword();

					return true;
				}
			} else {
				cout << endl;
				cout << "---登录失败:密码不正确!---" ;
				return false;
			}
		}
	}

	cout << endl;
	cout << "---登录失败:找不到该学号,请联系管理员!---" ;
	cout << endl;
	return false;
}

void Student::showMyInfo() {
	printHead();
	find();
}

void Student::chooseCourse() {
	cout << endl;
	Course::display();
	cout << endl;

	Course temp;
	string cid;
	cout << "请选择要选修的课程号:" << endl;
	cin >> cid;

	for(int i = 0; i < Course::courseSum; i++) {
		if(cid == course[i].cid) {
			if(course[i].csum > 0 && _course == "无") {
				_course = course[i].cname;
				course[i].csum--;	//选修后,课程剩余量-1

				//保存数据
				for(int j = 0; j < Student::studentSum; j++)  {
					if(this -> sid == student[j].sid) {
						student[j]._course = course[i].cname;
						outputStudent();

						//记得保存course对象数组中的数据到文件!!
						Course::outputCourse();	
						break;
					}
				}

				cout << "---选修"<< course[i].cname << "成功!---";
				cout << endl;
				return;

			} else if(_course != "无") {
				cout << "---你已选修了" << _course << "课程,请退选后重试!---";
				cout << endl;
				return;
			} else {
				cout << "---该课程已满!---";
				cout << endl;
				return;
			}
		}
	}

	cout << "---找不到该课程!---";
	cout << endl;
}

void Student::delCourse() {
	cout << endl;

	string flg;
	cout << "---你确定要退选 " << _course << " 课程?输入Y确定。---" << endl;
	cin >> flg;

	if(flg == "Y" || flg == "y") {
		for(int i = 0; i < Course::courseSum; i++) {
			if(_course == course[i].cname) {
				course[i].csum++;	//退选后,课程剩余数+1

				_course = "无";

				//保存数据
				for(int j = 0; j < Student::studentSum; j++) {
					if(this -> sid == student[j].sid) {
						student[j]._course = _course;
						outputStudent();
						
						break;
					}
				} 
				//记得保存course对象数组中的数据到文件!!
				Course::outputCourse();	

				cout << "---退选"<< course[i].cname << "成功!---";
				cout << endl;
				return; 
			}
		}
	}

	cout << "---退选失败!---";
	cout << endl; 

}

//class of Course
int Course::inputCourse() {
	int count = 0;
	string cid;	
	string cname;
	int csum;

	ifstream fin;
	fin.open("D:\\course.txt");

	//没有文件就创建文件
	if(!fin) {
		outputCourse();
		return 0;	//返回0个课程数
	}

	//过滤字段名
	string temp;
	fin >> temp;
	fin >> temp;
	fin >> temp;

	for(int i = 0; i < C_SUM; i++){
		fin >> cid; 
		fin >> cname;
		fin >> csum;
		if (fin.get() == EOF)
			break;
		course[i].init(cid, cname, csum);
		count++;
	}

	return count;
}

void Course::outputCourse() {
	ofstream fout;

	fout.open("D:\\course.txt", ios::trunc|ios::in);
	if(!fout) {cout<<"写入数据失败!";return;}

	fout << "课程id" << "\t"
		<<	"课程名"	<< "\t"
		<<	"剩余数"	<< "\t";
	fout << endl; 

	for(int i = 0; i < courseSum; i++){

		//只将未被标记删除的课程导入文件
		if( course[i].cid != "deleted") {
			fout << course[i].cid << "\t"
				<< course[i].cname << "\t"
				<< course[i].csum << endl;
		}

	}
	fout.close();
}

void Course::init(string cid, string cname, int csum) {
	this -> cid = cid;
	this -> cname = cname;
	this -> csum = csum;
}

void Course::printHead() {
	cout << endl;
	cout << "课程id" << "\t"
		<<	"课程名"	<< "\t"
		<<	"剩余数"	<< "\t";
	cout << endl;
}

void Course::add() {
	course[courseSum].cid = cid;
	course[courseSum].cname = cname;
	course[courseSum].csum = csum;

	Course::courseSum++;
	outputCourse();
}

void Course::del() {
	bool flg = false;
	string flg0;

	//先找到要被删除的课程在对象数组中的位置
	for(int i = 0; i < courseSum; i++) {
		if(cid == course[i].cid ) {
			//二次确认
			cout << endl;
			cout << "---你确定要删除课程:" << cid << "," << course[i].cid << "。---";
			cout << endl;
			cout << "---输入Y确定---";
			cout << endl;
			cin >> flg0;

			if(flg0 == "Y" || flg0 == "y") {

				//将被删除课程的cid标记为deleted
				course[i].cid = "deleted";

				//课程总数-1
				Course::courseSum--;	

				//使删除后的课程覆盖到对象数组中
				outputCourse();
				inputCourse();	
				flg = true;

				cout << endl;
				cout << "---删除课程信息成功!---";
				cout << endl;

				break;
			} else {
				break;
			}
		}
	}

	if(flg == false) {
		cout << endl;
		cout << "---删除课程信息失败!---";
		cout << endl;
	}
}

void Course::find() {
	cout << cid << "\t"
		<< cname << "\t"
		<< csum << "\t";
	cout << endl;
}

void Course::setCid() {
	cout << endl;

	string cid;
	for(int i = 0; i < courseSum; i++) {

		//注意this
		if(this -> cid == course[i].cid) {
back1:
			cout << "请输入新的课程号:";
			cin >> cid;

			//学号不能重复的输入合法性检查
			for(int i = 0; i < Course::courseSum; i++) {
				if(cid == course[i].cid ) {
					cout<< endl
						<< "---课程号不能重复,请重新输入!---"
						<< endl;
					goto back1;
				}
			}

			course[i].cid = cid;
			break;
		}
	}

	outputCourse();
	inputCourse();

	cout << "---课程号修改成功!---" <<endl;

}

void Course::setCname() {
	cout << endl;

	string cname;
	for(int i = 0; i < courseSum; i++) {
		if(this -> cname == course[i].cname) {
			cout << "请输入新的课程号:";
			cin >> cname;

			course[i].cname = cname;
			break;
		}
	}

	outputCourse();
	inputCourse();

	cout << "---课程名修改成功!---" <<endl;
}

void Course::setCsum() {
	cout << endl;

	int csum;
	for(int i = 0; i < courseSum; i++) {
		if(this -> csum == course[i].csum) {
			cout << "请输入新的课程数:";
			cin >> csum;

			course[i].csum = csum;
			break;
		}
	}

	outputCourse();
	inputCourse();

	cout << "---课程数修改成功!---" <<endl;
}

void Course::display() {
	printHead();

	//遍历数组,赋值给temp,调用temp对象find()函数进行输出
	Course temp;
	for(int i = 0; i < courseSum; i++){
		temp = course[i];
		temp.find();
	} 
}

//主函数用来做界面显示和函数调用
void main() {
		/*
	Teacher t;
//	t.addStudent();
//	t.findStudent();
//	Student::login();
//	Teacher::printHead();
//	t.delStudent();
	t.setStudent();
	Student::display();
	Teacher::outputTeacher();
	Student::outputStudent();

	*/
//	Course::display();
	

	Student stu;
	Teacher tea;

//	tea.addCourse();
//	tea.setCourse();

	int flg;
	bool result;

	do{
menu0:
		cout<<"┌───────────┐"<<endl
			<<"│     学生成绩管理     │"<<endl
			<<"│      和选课系统      │"<<endl
			<<"│     选择登录类型     │"<<endl
			<<"├───────────┤"<<endl
			<<"│     1.学生登录       │"<<endl
			<<"│     2.教师登录       │"<<endl
			<<"├———————————┤"<<endl
			<<"│     3.退出系统       │"<<endl
			<<"└───────────┘"<<endl;
		cout<<"请输入操作编号:";
		cin>>flg;
		switch (flg)
		{
		case(1):
			system("cls");

			//判断登录是否成功
			result = false;
			result = stu.login();
			if(result) {goto menu1;}
			break;
		case(2):
			system("cls");

			//判断登录是否成功
			result = false;
			result = tea.login();
			if(result) {goto menu2;}
			break;
		case(3):
			cout<<endl;
			cout<<"┌───────────┐"<<endl
				<<"│      感谢使用!      │"<<endl
				<<"└───────────┘"<<endl;
			getchar();getchar();
			return;
		default:
			system("cls");
			cout<<endl<<"───输入有误,请重新输入!───"<<endl<<endl;
			goto menu0;
			break;
		}
	}while(1);

menu1:
	do{
		cout<<"┌───────────┐"<<endl
			<<"│     学生成绩管理     │"<<endl
			<<"│      和选课系统      │"<<endl
			<<"│    学生操作主菜单    │"<<endl
			<<"├───────────┤"<<endl
			<<"│   1.查询成绩和选课   │"<<endl
			<<"│      2.学生选课      │"<<endl
			<<"│      3.退选课程      │"<<endl
			<<"│      4.更改密码      │"<<endl
			<<"├———————————┤"<<endl
			<<"│      5.退出登录      │"<<endl
			<<"└───────────┘"<<endl;
		cout<<"请输入操作编号:";
		cin>>flg;
		switch (flg)
		{
		case(1):
			system("cls");
			stu.showMyInfo();
			break;
		case(2):
			system("cls");
			stu.chooseCourse();
			break;
		case(3):
			system("cls");
			stu.delCourse();
			break;
		case(4):
			system("cls");
			stu.setSpassword();
			break;
		case(5):
			system("cls");
			goto menu0;
			return;
		default:
			system("cls");
			cout<<endl<<"───输入有误,请重新输入!───"<<endl<<endl;
			goto menu1;
			break;
		}
	}while(1);

menu2:
	do{
		cout<<"┌───────────┐"<<endl
			<<"│     学生成绩管理     │"<<endl
			<<"│      和选课系统      │"<<endl
			<<"│    教师操作主菜单    │"<<endl
			<<"├───────────┤"<<endl
			<<"│      1.学生管理      │"<<endl
			<<"│      2.选课管理      │"<<endl
			<<"├———————————┤"<<endl
			<<"│    3.显示我的信息    │"<<endl
			<<"│      4.更改密码      │"<<endl
			<<"├———————————┤"<<endl
			<<"│      5.退出登录      │"<<endl
			<<"└───────────┘"<<endl;
		cout<<"请输入操作编号:";
		cin>>flg;
		switch (flg)
		{
		case(1):
			system("cls");
			goto menu21;
			break;
		case(2):
			system("cls");
			tea.setCourse();
			break;
		case(3):
			system("cls");
			tea.showMyInfo();
			break;
		case(4):
			system("cls");
			tea.setpassword();
			break;
		case(5):
			system("cls");
			goto menu0;
			break;
		default:
			system("cls");
			cout<<endl<<"───输入有误,请重新输入!───"<<endl<<endl;
			goto menu2;
			break;
		}
	}while(1);

menu21:
	do{
		cout<<"┌───────────┐"<<endl
			<<"│     学生成绩管理     │"<<endl
			<<"│      和选课系统      │"<<endl
			<<"│    教师操作主菜单    │"<<endl
			<<"│      /学生管理       │"<<endl
			<<"├───────────┤"<<endl
			<<"│    1.查询学生信息    │"<<endl
			<<"│    2.修改学生信息    │"<<endl
			<<"│    3.增加学生信息    │"<<endl
			<<"│    4.删除学生信息    │"<<endl
			<<"│  5.显示所有学生信息  │"<<endl
			<<"├———————————┤"<<endl
			<<"│      6.退出登录      │"<<endl
			<<"└───────────┘"<<endl;
		cout<<"请输入操作编号:";
		cin>>flg;
		switch (flg)
		{
		case(1):
			system("cls");
			tea.findStudent();
			break;
		case(2):
			system("cls");
			tea.setStudent();
			break;
		case(3):
			system("cls");
			tea.addStudent();
			break;
		case(4):
			system("cls");
			tea.delStudent();
			break;
		case(5):
			system("cls");
			Student::display();
			goto menu25;
			break;
		case(6):
			system("cls");
			goto menu0;
			break;
		default:
			system("cls");
			cout<<endl<<"───输入有误,请重新输入!───"<<endl<<endl;
			goto menu21;
			break;
		}
	}while(1);

menu25:
	do{
		cout<<"┌───────────┐"<<endl
			<<"│     学生成绩管理     │"<<endl
			<<"│      和选课系统      │"<<endl
			<<"│      /学生管理       │"<<endl
			<<"│   /查询学生信息菜单  │"<<endl
			<<"├───────────┤"<<endl
			<<"│    1.升序排列成绩    │"<<endl
			<<"│    2.降序排列成绩    │"<<endl
			<<"│    3.学号排列成绩    │"<<endl
			<<"│   4.列出不及格名单   │"<<endl
			<<"├———————————┤"<<endl
			<<"│    5.返回上级菜单    │"<<endl
			<<"└───────────┘"<<endl;
		cout<<"请输入操作编号:";
		cin>>flg;
		switch (flg)
		{
		case(1):
			system("cls");
			Student::sortByASC();
			Student::display();
			break;
		case(2):
			system("cls");
			Student::sortByDESC();
			Student::display();
			break;
		case(3):
			system("cls");
			Student::sortBySid();
			Student::display();
			break;
		case(4):
			system("cls");
			Student::selectFail();
			break;
		case(5):
			system("cls");
			goto menu2;
			return;
		default:
			system("cls");
			cout<<endl<<"───输入有误,请重新输入!───"<<endl<<endl;
			goto menu25;
			break;
		}
	}while(1);
}

  

 

上个月C++课程设计做的一个《学生成绩管理和选课系统》

标签:des   blog   io   ar   os   使用   sp   for   on   

原文地址:http://www.cnblogs.com/cyn8/p/4148133.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!