2013年大一上学期的C++大作业 学生信息管理系统

main.cpp


#include <iostream>
#include <fstream>
#include <string>
#include "function.h"
using namespace std;

int main()
{
	prepare();
	secure();
	return 0;
}






student.h


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

class student
{
	private:
		student *last,*next;
		string name,NO,phone,address;
		double Chinese,math,English,num;
	public:
		student(string&,string&,string&,string&,double&,double&,double&);
		~student();
		void S_change();
		bool S_is_same(string&) const;
		student* S_last_point();
		student* S_next_point();
		void S_display();
		string S_name();
		string S_NO();
		string S_phone();
		string S_address();
		double S_Chinese();
		double S_math();
		double S_English();
		double S_num();
		void S_link(student*last=NULL,student*next=NULL);
};

struct stu
{
	string name9,NO9;
	double Chinese9,math9,English9,num9;
};

extern student *first,*end,*p,*p2;
extern void help();
extern bool a;

student::student(string& name2,string& NO2,string& phone2,string& address2,double& Chinese2,double& math2,double& English2)
{
	this->name=name2;
	this->NO=NO2;
	this->phone=phone2;
	this->address=address2;
	this->Chinese=Chinese2;
	this->math=math2;
	this->English=English2;
	this->num=Chinese2+math2+English2;
	this->last=NULL;
	this->next=NULL;
}

student::~student()
{
	if((this->next)!=NULL)
	{
		delete this->next;
	}
}

void student::S_link(student*last,student*next)
{
	this->last=last;
	this->next=next;
}

bool student::S_is_same(string& keyword2) const
{
	int i;
	if(('0'<=keyword2[0])&&(keyword2[0]<='9'))  // 学号匹配判断
	{
		if(this->NO.size()!=keyword2.size())
		{
			return false;
		}
		else
		{
			for(i=0;i<this->NO.size();i++)
			{
				if(this->NO[i]!=keyword2[i])
				{
					return false;
				}
			}
			return true;
		}
	}

	else  // 姓名匹配判断(先除去空格,再进行匹配判断,大小写可以进行判断)
	{
	
		string name3;
		for(i=0;i<this->name.size();i++)
		{
			if(this->name[i]!=' ')
			{
				name3+=this->name[i];
			}
			
		}

		string keyword3;

		for(i=0;i<keyword2.size();i++)
		{
			if(keyword2[i]!=' ')
			{
				keyword3+=keyword2[i];
			}
		}

		if(name3.size()!=keyword3.size())
		{
			return false;
		}
		else
		{

			for(i=0;i<name3.size();i++)
			{
				int different=abs(name3[i]-keyword3[i]);
				if(different!=0&&different!=abs('a'-'A'))
				{
					return false;
				}
			}
			return true;
		}
	}
}

student* student::S_last_point()
{
	return this->last;
}

student* student::S_next_point()
{
	return this->next;
}

void student::S_change()
{
	system("cls");
	cout << " 您要修改的学生信息为:" << endl;
	p->S_display();
	cout << "请选择您想要的功能 :" << endl
	     << "1. 修改学生姓名" << endl
	     << "2. 修改学生学号" << endl
		 << "3. 修改学生电话" << endl
		 << "4. 修改学生住址" << endl
		 << "5. 修改学生语文成绩" << endl
		 << "6. 修改学生数学成绩" << endl
		 << "7. 修改学生英语成绩" << endl;
	int select1;
	(cin >> select1).get();
	switch (select1)
	{
		case 1: cout << " 请输入学生姓名(姓名可以带空格,英文名字不区分大小写),按“两次回车”确定输入 :"<<endl ;
				getline(cin,this->name);
				cin.get();
			    break;
		case 2: cout << " 请输入学生学号 :" <<endl;
				(cin >> this->NO).get();
			    break;
		case 3: cout << " 请输入学生电话号码 :"<<endl;
				(cin >> this->phone).get();
			    break;
		case 4: cout << " 请输入学生家庭住址(家庭住址可以带空格), 按“两次回车”确定输入:"<<endl;
				getline(cin,this->address);
				cin.get();
			    break;
		case 5: cout << " 请输入学生语文成绩 :"<<endl;
				(cin >> this->Chinese).get(); 
			    break;
		case 6: cout << " 请输入学生数学成绩 :"<<endl;
				(cin >> this->math).get(); 
			    break;
		case 7: cout << " 请输入学生英语成绩 :"<<endl;
				(cin >> this->English).get();
			    break;
		default: cout << "输入有误,请按“回车键”后重新输入," << endl;
				 cin.get();
			     p->S_change();
	}
	if(select1>=5 && select1<=7)
	{
		this->num=this->Chinese+this->math+this->English;
	}
	cout << " 继续修改该学生信息请输入1,返回“功能选择页面”请输入0:"<<endl;
	(cin >> a).get();
	if(!a)
	{
		help();
	}
	else
	{
		p->S_change();
	}
}
void student::S_display()
{
	cout << endl;
	cout << "姓名:" << this->name << endl
		 << "学号:" << this->NO << endl
		 << "电话:" << this->phone << endl
		 << "住址:" << this->address << endl
		 << "语文成绩:" << this->Chinese << endl
		 << "数学成绩:" << this->math << endl
		 << "英语成绩:" << this->English << endl
         << "总分:" << this->num << endl;
	cout << endl;
}
string student::S_name()
{
	return this->name;
}

string student::S_NO()
{
	return this->NO;
}

string student::S_phone()
{
	return this->phone;
}

string student::S_address()
{
	return this->address;
}

double student::S_num()
{
	return this->num;
}

double student::S_Chinese()
{
	return this->Chinese;
}

double student::S_math()
{
	return this->math;
}

double student::S_English()
{
	return this->English;
}




function.h


#include <iostream>
#include <string>
#include <fstream>
#include "student.h"
using namespace std;

stu key,key1;
bool a,b=false;
int length=0;
string name1,NO1,phone1,address1,keyword,zhanghao,mima,zhanghao1="fyj",mima1="123";
double Chinese1,math1,English1;
student *first=NULL,*end=NULL,*p=NULL,*p2=NULL;
stu *pp=NULL;
ofstream fout("F:\\xinxi.txt",ios_base::out|ios_base::app);
ifstream fin("F:\\xinxi.txt");

void add();
void change();
void everage();
void sort();
void Chinese_sort(int,int);
void math_sort(int,int);
void English_sort(int,int);
void num_sort(int,int);
void deletes();
void display();
void save();
void find(string&);
void swap(stu&,stu&);

void prepare()
{
	string test;
	double now;
	for(;;)
	{
		getline(fin,test);
		if(test.size()==0)
		{
			break;
		}
		else
		{
			name1=test;
			getline(fin,NO1);
			getline(fin,phone1);
			getline(fin,address1);
			fin >> Chinese1 >> math1 >> English1 >> now;
			p=new student(name1,NO1,phone1,address1,Chinese1,math1,English1);
			if(first==NULL&&end==NULL)
			{
				first=p;
				end=p;
			}
			else
			{
				p->S_link(end,NULL);
				end->S_link(end->S_last_point(),p);
				end=p;
			}
		}
	}
}

void secure()
{
	int time=0;
	for(;time<3;)
	{
		system("cls");
		if(b)
		{
			break;
		}
		cout << "请您输入账号,按“两次回车”确定输入: " << endl;
		getline(cin,zhanghao);
		cin.get();
		cout << "请您输入密码,按“两次回车”确定输入: " << endl;
		getline(cin,mima);
		cin.get();
		if((zhanghao==zhanghao1)&&(mima==mima1))
		{
			cout << "登陆成功,请按回车键,进入主菜单" << endl;
			cin.get();
			help();
			break;
		}
		else
		{
			time++;
			cout << "登陆失败,请按回车键后重新输入" << endl;
			cin.get();
		}
	}
	if(time==3)
	{
		cout << "密码错误三次,登录失败!" << endl;
	}
}

void help()
{
	system("cls");
	cout << "欢迎使用学生信息管理系统" << endl
		 << "请选择您想要的功能 :" << endl
	     << "1. 新增学生信息" << endl
	     << "2. 修改学生信息" << endl
		 << "3. 计算班级平均分" << endl
		 << "4. 查询单科成绩排名情况" << endl
		 << "5. 删除学生信息" << endl
		 << "6. 打印学生信息表" << endl
		 << "7. 保存学生信息" << endl
	     << "8. 退出学生信息管理系统" << endl;
	int select;
	(cin >> select).get();
	switch (select)
	{
		case 1: add();
			    break;
		case 2: change(); 
			    break;
		case 3: everage(); 
			    break;
		case 4: sort();
			    break;
		case 5: deletes();
				break;
		case 6: display();
				break;
		case 7: save();
				break;
		case 8: cout << "欢迎下次继续使用学生信息管理系统" << endl;
				b=true;
			    break;
		default: cout << "输入有误,请按“回车键”后重新输入 " << endl;
				 cin.get();
			     help();
	}
}

void add()
{
	system("cls");
	cout << "您正在使用“添加学生信息”功能"<< endl;
	cout << " 请输入学生姓名(姓名可以带空格,英文名字不区分大小写,按“两次回车”确定输入 :"  << endl;
	getline(cin,name1);
	cin.get();
	cout << " 请输入学生学号 :"<<endl ;
	(cin >> NO1).get();
	cout << " 请输入学生电话号码 :"<<endl;
	(cin >> phone1).get();
	cout << " 请输入学生家庭住址(家庭住址可以带空格), 按“两次回车”确定输入:"<<endl;
	getline(cin,address1);
	cin.get();
	cout << " 请输入学生语文成绩 :"<<endl;
	(cin >> Chinese1).get();
	cout << " 请输入学生数学成绩 :"<<endl;
	(cin >> math1).get();
	cout << " 请输入学生英语成绩 :"<<endl;
	(cin >> English1).get();
	length++;
	p=new student(name1,NO1,phone1,address1,Chinese1,math1,English1);
	if(first==NULL&&end==NULL)
	{
		first=p;
		end=p;
		cout << "已创建第一个学生信息,按“回车”回到功能选择页面" << endl;
		cin.get();
		help();
	}
	else
	{
		p->S_link(end,NULL);
		end->S_link(end->S_last_point(),p);
		end=p;
		cout << "已添加学生信息,按“回车”回到功能选择页面" << endl;
		cin.get();
		help();
	}
}

void change()
{
	system("cls");
	cout << "您正在使用“修改学生信息”功能" <<endl <<endl;
	cout << " 请输入需要修改信息的学生的学号或姓名,按“两次回车”确定输入"<<endl;
	getline(cin,keyword);
	cin.get();
	find(keyword);
	cout << "请按“回车键”,进行该学生信息的修改。" << endl;
	cin.get();
	p->S_change();

}

void everage()
{
	system("cls");
	long double Chinese_average=0,math_average=0,English_average=0,score_average=0;
	for(p=first;p!=NULL;p=p->S_next_point())
	{
		Chinese_average+=p->S_Chinese();
		math_average+=p->S_math();
		English_average+=p->S_English();
		score_average+=p->S_num();
	}
	Chinese_average/=length;
	math_average/=length;
	English_average/=length;
	score_average/=length;
	cout << "语文平均分:" << Chinese_average << endl
		 << "数学平均分:" << math_average << endl
		 << "英语平均分:" << English_average << endl
		 << "总分平均分:" << score_average << endl
		 << endl << "按“回车”回到功能选择页面" <<endl;
	cin.get();
	help();
}

void sort()
{
	system("cls");
	int k=0;
	pp=new stu[length];
	p=first;
	for(int i=0;i<length;i++)
	{
		pp[i].name9=p->S_name();
		pp[i].NO9=p->S_NO();
		pp[i].Chinese9=p->S_Chinese();
		pp[i].math9=p->S_math();
		pp[i].English9=p->S_English();
		pp[i].num9=p->S_num();
		p=p->S_next_point();
	}
	cout << "请选择要查看排名的科目" << endl
		 << "1.语文" << endl
		 << "2.数学" << endl
		 << "3.英语" << endl
		 << "4.总分" << endl;
	int select;
	(cin >> select).get();
	switch(select)
	{
		case 1: Chinese_sort(0,length-1);
				cout << endl << "语文成绩排名为: " << endl;
				for(k=0;k<length;k++)
				{
					cout << endl << "第" << k+1 << "名: " 
						 << pp[k].name9 << endl
						 << "学号: " << pp[k].NO9 << endl
						 << "分数: " << pp[k].Chinese9 << endl;
				}
				break;
		case 2: math_sort(0,length-1);
				cout << endl << "数学成绩排名为: " << endl;
				for(k=0;k<length;k++)
				{
					cout << endl << "第" << k+1 << "名: "
						 << pp[k].name9 << endl
						 << "学号: " << pp[k].NO9 << endl
						 << "分数: " << pp[k].math9 << endl;
				}
				break;
		case 3: English_sort(0,length-1);
				cout << endl << "英语成绩排名为: " << endl;
				for(k=0;k<length;k++)
				{
					cout << endl << "第" << k+1 << "名: "
						 << pp[k].name9 << endl
						 << "学号: " << pp[k].NO9 << endl
						 << "分数: " << pp[k].English9 << endl;
				}
				break;
		case 4: num_sort(0,length-1);
				cout << endl << "总成绩排名为: " << endl;
				for(k=0;k<length;k++)
				{
					cout << endl << "第" << k+1 << "名: "
					     << pp[k].name9 << endl
						 << "学号: " << pp[k].NO9 << endl
						 << "分数: " << pp[k].num9 << endl;
				}
				break;
	}
	cout << endl << "按“回车”返回主界面" << endl;
	cin.get();
	help();
}

void Chinese_sort(int left,int right)
{
	if(left+1<right)
	{
		cout << "haha1" << endl;
		int mid=(left+right)/2;
		if(pp[left].Chinese9>pp[mid].Chinese9)
		swap(pp[left],pp[mid]);
		if(pp[left].Chinese9>pp[right].Chinese9)
		swap(pp[left],pp[right]);
		if(pp[mid].Chinese9>pp[right].Chinese9)
			swap(pp[mid],pp[right]);
		if(left+2<right)
		{
			key=pp[mid];
			swap(pp[mid],pp[right-1]);
			int i=left,j=right-1;
			for(;;)
			{
				while(pp[++i].Chinese9<key.Chinese9);
				while(pp[--j].Chinese9>key.Chinese9);
				if(i<j)
					swap(pp[i],pp[j]);
				else
					break;
			}
			swap(pp[i],pp[right-1]);
			Chinese_sort(left,i-1);
			Chinese_sort(i+1,right);
		}
		else;
	}
	else if((left<right)&&(pp[left].Chinese9<pp[right].Chinese9))
		swap(pp[left],pp[right]);
	else;
}

void math_sort(int left,int right)
{
	if(left+1<right)
	{
		int mid=(left+right)/2;
		if(pp[left].math9>pp[mid].math9)
		swap(pp[left],pp[mid]);
		if(pp[left].math9>pp[right].math9)
		swap(pp[left],pp[right]);
		if(pp[mid].math9>pp[right].math9)
			swap(pp[mid],pp[right]);
		if(left+2<right)
		{
			key=pp[mid];
			swap(pp[mid],pp[right-1]);
			int i=left,j=right-1;
			for(;;)
			{
				while(pp[++i].math9<key.math9);
				while(pp[--j].math9>key.math9);
				if(i<j)
					swap(pp[i],pp[j]);
				else
					break;
			}
			swap(pp[i],pp[right-1]);
			Chinese_sort(left,i-1);
			Chinese_sort(i+1,right);
		}
		else;
	}
	else if((left<right)&&(pp[left].math9<pp[right].math9))
		swap(pp[left],pp[right]);
	else;
}

void English_sort(int left,int right)
{
	if(left+1<right)
	{
		int mid=(left+right)/2;
		if(pp[left].English9>pp[mid].English9)
		swap(pp[left],pp[mid]);
		if(pp[left].English9>pp[right].English9)
		swap(pp[left],pp[right]);
		if(pp[mid].English9>pp[right].English9)
			swap(pp[mid],pp[right]);
		if(left+2<right)
		{
			key=pp[mid];
			swap(pp[mid],pp[right-1]);
			int i=left,j=right-1;
			for(;;)
			{
				while(pp[++i].English9<key.English9);
				while(pp[--j].English9>key.English9);
				if(i<j)
					swap(pp[i],pp[j]);
				else
					break;
			}
			swap(pp[i],pp[right-1]);
			Chinese_sort(left,i-1);
			Chinese_sort(i+1,right);
		}
		else;
	}
	else if((left<right)&&(pp[left].English9<pp[right].English9))
		swap(pp[left],pp[right]);
	else;
}

void num_sort(int left,int right)
{
	if(left+1<right)
	{
		int mid=(left+right)/2;
		if(pp[left].num9>pp[mid].num9)
		swap(pp[left],pp[mid]);
		if(pp[left].num9>pp[right].num9)
		swap(pp[left],pp[right]);
		if(pp[mid].num9>pp[right].num9)
			swap(pp[mid],pp[right]);
		if(left+2<right)
		{
			key=pp[mid];
			swap(pp[mid],pp[right-1]);
			int i=left,j=right-1;
			for(;;)
			{
				while(pp[++i].num9<key.num9);
				while(pp[--j].num9>key.num9);
				if(i<j)
					swap(pp[i],pp[j]);
				else
					break;
			}
			swap(pp[i],pp[right-1]);
			Chinese_sort(left,i-1);
			Chinese_sort(i+1,right);
		}
		else;
	}
	else if((left<right)&&(pp[left].num9<pp[right].num9))
		swap(pp[left],pp[right]);
	else;
}


void swap(stu& one,stu& other)
{
	key1=one;
	one=other;
	other=key1;
}

void save()
{
	system("cls");
	cout << "您正在使用“保存学生信息”功能" <<endl <<endl;
	cout << " 请输入需要修改信息的学生的学号或姓名,按“两次回车”确定输入"<<endl;
	getline(cin,keyword);
	cin.get();
	find(keyword);
	cout << "请按“回车键”,保存该学生信息的修改。" << endl;
	cin.get();
	fout << p->S_name() << endl
		 << p->S_NO() << endl
		 << p->S_phone() << endl
		 << p->S_address() << endl
		 << p->S_Chinese() << endl
		 << p->S_math() << endl
		 << p->S_English() << endl
		 << p->S_num() << endl;
	cout << "保存成功,按”回车键“返回主菜单" << endl;
	cin.get();
	help();
}

void display()
{
	system("cls");
	cout << "您正在使用“查询学生信息”功能" <<endl <<endl;
	cout << " 请输入需要修改信息的学生的学号或姓名,按“两次回车”确定输入"<<endl;
	getline(cin,keyword);
	cin.get();
	find(keyword);
	cout << endl << "按”回车键“返回主菜单" << endl;
	cin.get();
	help();
}

void deletes()
{
	system("cls");
	cout << "您正在使用“删除学生信息”功能" <<endl <<endl;
	cout << " 请输入需要修改信息的学生的学号或姓名,按“两次回车”确定输入"<<endl;
	getline(cin,keyword);
	cin.get();
	find(keyword);
	p2=p->S_last_point();
	p2->S_link(p2->S_last_point(),p->S_next_point());
	p2=p->S_next_point();
	p2->S_link(p->S_last_point(),p2->S_next_point());
	student* p3=p;
	p=NULL;
	p3->S_link(NULL,NULL);
	delete p3;
	cout << endl << "删除成功,按”回车键“返回主菜单" << endl;
	cin.get();
	help();
}

void find(string& keyword1)
{
	system("cls");
	for(p=first;!(p->S_is_same(keyword1))&&p!=NULL;p=p->S_next_point());
	if(p==NULL)
	{
		cout << endl << "找不到对应信息的学生,按“回车键”回到功能选择页面" << endl;
		cin.get();
		help();
	}
	else
	{
		cout << endl << " 您所查找的学生信息为:" << endl;
		p->S_display();
	}
}


  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值