#include "iostream"
#include "fstream"
#include "iomanip"
#include "string"
using namespace std;
bool equal(char *a,char *b,int n)//判断两个字符串是否一样
{
int temp=0;
for(int i=0;i<n;i++)
if(a[i]==b[i])
temp++;
if(temp==n)
return 1;
else
return 0;
}
int getline(int n)//求文件中信息的行数(既文件中学生的数量,课程的数量) n为5表示为求A.txt中的行数,n为7表示求B.txt中的行数
{
int count=0;
char temp[20];
char temp1[20];
for(int i=0;i<20;i++)
{
temp1[i]=0;
}
ifstream f1;
if(n==5)
{
f1.open("A.txt");
}
if(n==7)
{
f1.open("B.txt");
}
while(f1.get())
{
if(!equal(temp,temp1,20))
{
for(int i=0;i>temp;
count++;
}
else break;
}
f1.close();
return count/n;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct binfo//学生基本信息
{
char num[8],name[8],sex[8],flatnum[4],telenum[11];//学号,姓名,宿舍号,电话号码
};
struct sinfo//学生课程信息
{
char num[8],jectnum[8],jectname[20];//学号,课程编号,课程名称
double xuefen,usualscore,labscore,testscore,comscore,turexuefen;//学分,平时成绩,实验成绩,卷面成绩,综合成绩,实得学分
double subxufen,subscore;
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class studentb
{
friend ostream &operator;<>(istream &is;,studentb &st;);
public:
studentb();
void dele();//删除信息
void displayb1(ostream &os;);//查询基本信息
void displayb(ostream &os;);
void displaypart();
void inputb(istream &is;);
char* getnum();
char* getname();
private:
binfo b;//基本信息
};
void studentb::displaypart()
{
cout<<"学号:"<<b.num<<'\t'<<"姓名:"<<b.name<<endl;
}
studentb::studentb()
{
}
void studentb::displayb(ostream &os;)
{
os<<b.num<<'\t'<<b.name<<'\t'<<b.sex<<'\t'<<b.flatnum<<'\t'<<b.telenum<<endl;
}
void studentb::displayb1(ostream &os;)
{
os<<"学号:"<<b.num<<" "<<"姓名:"<<b.name<<" "<<"性别:"<<b.sex<<" "<<"宿舍号:"<<b.flatnum<<" "<<"电话号码:"<<b.telenum<>b.num>>b.name>>b.sex>>b.flatnum>>b.telenum;
}
/////////////////////////////////////////////////////////////////////////////////////////
class students
{
public:
students(){};
void inputs(istream &is;);
void displays();
void displays1();
void displays(ostream &os;);
void inputsubxuefen(double x);
void inputsubscore(double x);
char *getnum();
double getxuefen();
double getcomscore();
void cal();
private:
sinfo s;
};
void students::inputsubscore(double x)
{
s.subscore=x;
}
void students::inputsubxuefen(double x)
{
s.subxufen=x;
}
double students::getcomscore()
{
return s.comscore;
}
double students::getxuefen()
{
return s.turexuefen;
}
void students::cal()
{
if(s.labscore==-1)
s.comscore=s.usualscore*0.3+s.testscore*0.7;
else
s.comscore=s.usualscore*0.15+s.labscore*0.15+s.testscore*0.7;
if(s.comscore<60) s.turexuefen=0;
else s.turexuefen=s.xuefen;
}
char* students::getnum()
{
return s.num;
}
void students::inputs(istream &is;)
{ if(is==cin)
cout<<"请输入学号,课程编号,课程名称,学分,平时成绩,实验成绩,卷面成绩:"<>s.num>>s.jectnum>>s.jectname>>s.xuefen>>s.usualscore>>s.labscore>>s.testscore;
cal();
}
void students::displays1()
{
cout<<"学号:"<<s.num<<" "<<"课程编号:"<<s.jectnum<<'\t'<<"课程名称:"<<s.jectname<<'\t'<<"综合成绩:"<<s.comscore<<'\t'<<"实得学分:"<<s.turexuefen<<endl;
}
void students::displays()
{
cout<<"课程编号:"<<s.jectnum<<'\t'<<"课程名称:"<<s.jectname<<'\t'<<"综合成绩:"<<s.comscore<<'\t'<<"实得学分:"<<s.turexuefen<<endl;
}
void students::displays(ostream &os;)
{
os<<s.num<<'\t'<<s.jectnum<<'\t'<<s.jectname<<'\t'<<s.xuefen<<'\t'<<s.usualscore<<'\t'<<s.labscore<<'\t'<<s.testscore<<endl;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class allstudentb
{
public:
allstudentb(int n)
{
studentnum=n;
sptr=new studentb [studentnum];
ifstream f("A.txt");
for(int i=0;i<studentnum;i++)
sptr[i].inputb(f);
f.close();
}
~allstudentb(){delete [] sptr;}
void searchb(char *ch);//查询基本信息
void searchpart(char *ch);
void deleb(char *ch);//删除信息
void sort();//信息排序
private:
studentb *sptr;
int studentnum;
};
void allstudentb::deleb(char *ch)
{
int temp=strlen(ch);
ofstream f("A.txt");
for(int i=0;i<studentnum;i++)
{
if(!equal(ch,sptr[i].getnum(),temp)&&!equal(ch,sptr[i].getname(),temp))
sptr[i].displayb(f);
}
f.close();
}
void allstudentb::searchb(char *ch)
{
int temp=strlen(ch);
for(int i=0;i<studentnum;i++)
if(equal(ch,sptr[i].getnum(),temp)||equal(ch,sptr[i].getname(),temp))
sptr[i].displayb1(cout);
}
void allstudentb::searchpart(char *ch)
{
int temp=strlen(ch);
for(int i=0;i<studentnum;i++)
if(equal(ch,sptr[i].getnum(),temp)||equal(ch,sptr[i].getname(),temp))
sptr[i].displaypart();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class allstudents
{
public:
allstudents(int n){
num=n;
ifstream f("B.txt");
sptr=new students [n];
for(int i=0;i<n;i++)
sptr[i].inputs(f);
f.close();
}
~allstudents(){delete [] sptr;}
void searchs(char *ch);
void inputs();
void displays();
void deles(char *ch);
void sortxuefen(int n);
void sortcomscore(int n);
void print();//在屏幕上显示信息
private:
students *sptr;
int num;
};
void allstudents::print()
{
for(int i=0;i<num;i++)
sptr[i].displays1();
}
void allstudents::sortxuefen(int n)
{
students temp;
int i,j;
if(n==0)
{
for(i=1;i<num;i++)
for(j=0;j<num-i;j++)
if(sptr[j].getxuefen()<sptr[j+1].getxuefen())//降序
{
temp=sptr[j];
sptr[j]=sptr[j+1];
sptr[j+1]=temp;
}
}
else
{
for(i=1;i<num;i++)
for(j=0;jsptr[j+1].getxuefen())//升序
{
temp=sptr[j];
sptr[j]=sptr[j+1];
sptr[j+1]=temp;
}
}
displays();
}
void allstudents::sortcomscore(int n)
{
int i,j;
students temp;
if(n==0)
{
for(i=1;i<num;i++)
for(j=0;j<num-i;j++)
if(sptr[j].getcomscore()<sptr[j+1].getcomscore())//降序
{
temp=sptr[j];
sptr[j]=sptr[j+1];
sptr[j+1]=temp;
}
}
else
{
for(i=1;i<num;i++)
for(j=0;jsptr[j+1].getcomscore())//升序
{
temp=sptr[j];
sptr[j]=sptr[j+1];
sptr[j+1]=temp;
}
}
displays();
}
void allstudents::deles(char *ch)
{
int temp=strlen(ch);
ofstream f("B.txt");
for(int i=0;i<num;i++)
{
if(!equal(ch,sptr[i].getnum(),temp))
sptr[i].displays(f);
}
f.close();
}
void allstudents::searchs(char *ch)
{
int count=0;
double subxuefen=0;
double subscore=0;
int temp=strlen(ch);
for(int i=0;i<num;i++)
{
if(equal(ch,sptr[i].getnum(),temp))
{
sptr[i].displays();
count++;
subxuefen=subxuefen+sptr[i].getxuefen();
subscore=subscore+sptr[i].getcomscore();
}
sptr[i].inputsubscore(subscore);
sptr[i].inputsubxuefen(subxuefen);
}
cout<<"共修:"<<count<<"科 实得总学分为:"<<subxuefen<<endl;
}
void allstudents::inputs()
{
students *p=new students [num];
for(int i=0;i<num;i++)
p[i]=sptr[i];
delete []sptr;
num++;
sptr =new students [num];
for(int i=0;i<num-1;i++)
sptr[i]=p[i];
sptr[num-1].inputs(cin);
displays();
}
void allstudents::displays()
{
ofstream f("B.txt");
for(int i=0;i<num;i++)
sptr[i].displays(f);
f.close();
}
int main()
{
int m,n;
m=getline(5);//学生数
n=getline(7);
allstudentb stb(m);
allstudents sts(n);
int *score=new int[m];
int *xuefen=new int[m];
int x;
char ch[8];
while(1)
{
cout<<"\n\n\n"
<<"\t\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n"
<<"\t\t※ ※\n"
<<"\t\t※ 学生管理系统 ※\n"
<<"\t\t※ ※\n"
<<"\t\t※ 操作: ※\n"
<<"\t\t※ 1--查询学生基本信息 ※\n"
<<"\t\t※ 2--查询学生课程信息 ※\n"
<<"\t\t※ 3--录入学生课程信息 ※\n"
<<"\t\t※ 4--对学生信息进行排序 ※\n"
<<"\t\t※ 5--删除学生信息 ※\n"
<<"\t\t※ 6--退出 ※\n"
<<"\t\t※ ※\n"
<<"\t\t※ ※\n"
<<"\t\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n"<<endl;
cout<>x;
switch(x)
{
case 1:
{
if(m!=0)
{
cout<>ch;
cout<<endl;
cout<<endl;
stb.searchb(ch);
}
else
{
cout<<"无学生基本信息可查!请录入学生信息!!"<<endl;
}
cout<<endl;
cout<<endl;
}break;
case 2:
{
cout<>ch;
stb.searchpart(ch);//查询学号为ch的学生的基本信息
sts.searchs(ch);//查询学号为ch的学生的所有课程信息
}break;
case 3:
{
int temp1,count=0;
cout<>temp1;
while(count<temp1)
{
sts.inputs();
count++;
}
}break;
case 4:
{
cout<<endl;
cout<<endl;
cout<<"1--按学分排序"<<endl;
cout<<"2--按综合成绩排序"<<endl;
cout<>temp1;
if(temp1==1)
{
cout<<endl;
cout<<endl;
cout<<"输入0按降序排列"<<endl;
cout<<"输入1安升序排列"<<endl;
cout<>temp2;
sts.sortxuefen(temp2);
sts.print();
}
if(temp1==2)
{
cout<<endl;
cout<<endl;
cout<<"输入0按降序排列"<<endl;
cout<<"输入1安升序排列"<<endl;
cout<>temp2;
sts.sortcomscore(temp2);
sts.print();
}
}break;
case 5:
{
char num[8];
cout<>num;
stb.deleb(num);
sts.deles(num);
cout<<"学生信息已删除!"<<endl;
}break;
case 6:return 0;
default:break;
}
}
}