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();
}
}