#include<iostream>
#include<string>
#include<fstream>
#include<iomanip>
using namespace std;
class Student //通过定义一个类来定义数据录入的函数
{
char name[20];
char number[20];
float maogai,modian,shudian,cpp,english,average,sum;
int tag;//删除标记:1为删除,0为未删
public:
Student()
{tag=0;};
Student ( char n[20], char num[20],float mao,float mo,float shu,float cj,float eng) ;
float getsum();//得到总分的函数
float getaver(); //得到平均分的函数
char *getname(){return name;}//得到姓名//*号不可删除
int gettag(){return tag;}//获取删除状态
void display()//显示学生信息
{
if(tag==0)//如果Tag==0,表示数据为未删除状态,进行显示,但数据只是被隐藏,而未被真正删除!
cout<<setw(12)<<name<<" "
<<setw(12)<<number
<<setw(12)<<maogai
<<setw(12)<<modian
<<setw(12)<<shudian
<<setw(12)<<cpp
<<setw(12)<<english
<<setw(12)<<getsum()
<<endl;
}
//将函数定义为友元函数,方便访问类中的成员
friend void Zfcx();
friend void Xmcx();
friend void Xhcx();
friend void Average();
friend void Unpassed();
void del(){tag=1;}//删除操作
void input(ifstream &is)
{
is>>name>>number>>maogai>>modian>>shudian>>cpp>>english;
}
void output(ofstream &os) //输出参数函数,作用把信息输出
{
os<<setw(12)<<name
<<setw(12)<<number
<<setw(12)<<maogai
<<setw(12)<<modian
<<setw(12)<<shudian
<<setw(12)<<cpp
<<setw(12)<<english
<<endl;//此处endl并非为真正的结束符,读取时会继续读取空白行
}
~Student(){};
};
Student::Student ( char n[20], char num[20],float mao,float mo,float shu,float cj,float eng )
{
strcpy(name,n); //得到姓名
strcpy(number,num); //得到学号
maogai=mao; //得到毛概成绩
modian=mo;//得到模电成绩
shudian=shu;//得到数电成绩
cpp=cj; //得到c++成绩
english=eng; //得到英语成绩
tag=0;//设为未删
}
float Student::getsum() //得到总分的函数
{
sum=cpp+english+maogai+modian+shudian;
return sum;
}
float Student::getaver() //得到平均分的函数
{
average=getsum()/5;
return average;
}
Student *s[32]; //类定义的指针将所录入的数据按类中的形式分别存储
int p=0; //全局变量,用于选择菜单时的输入
char w;//全局变量,用于在大项中选择是否继续操作
char c; //用于在小项中选择是否继续操作
int i=0; //全局变量,用于做每个录入数据的下标
int j=0;
int flag=0; //用于判断do-while语句
void get()//将文件f1.txt的数据读到数组中
{
Student *p;
ifstream is("f1.txt");
if(!is)
return;
while(!is.eof())//判断是否到达文件尾部,以防止出现文件读取错误。
{
p=new Student;
p->input(is);
if(is.eof())//判断是否为文件尾
break;//若为文件尾则跳出,避免将文件中的空白行读取进来
s[i]=p;
i++;
}
is.close();
}
void outfile()//将数组中的数据写入文件f1.txt
{
ofstream os("f1.txt");
for(j=0;j<i;j++)
{
if(!s[j]->gettag())//如果数据为未被删除状态,则将其存入文件中
s[j]->output(os);
}
}
void Input()
{
char name[20];
char number[20];
float maogai,modian,shudian,cpp,english;
fstream outfile,infile; //作一个文本文档在文件夹中用于显示所录入的数据
do{
cout<<"请输入姓名:"<<endl;
cin>>name;
cout<<"请输入学号:"<<endl;
cin>>number;
cout<<"请输入毛概成绩:"<<endl;
cin>>maogai;
cout<<"请输入模电成绩:"<<endl;
cin>>modian;
cout<<"请输入数电成绩:"<<endl;
cin>>shudian;
cout<<"请输入C++成绩:"<<endl;
cin>>cpp;
cout<<"请输入英语成绩:"<<endl;
cin>>english;
/*
outfile.open("f1.txt");
if(!outfile)
{ cout<<"f1.txt 打开错误!"<<endl;
return;
} */
s[i]=new Student(name, number,maogai,shudian,modian, cpp, english);
i++;
outfile.close();
cout<<"数据录入成功,想继续录入吗(y/n)"<<endl;
cin>>c;
flag=0;
do{
if(c!='y'&&c!='n')
{
cout<<"指令错误!请重新输入!"<<endl;
cin>>c;
}
else
flag=1;
}while(flag==0);
}while(c=='y'); //重复输入
}
void Delete()
{
char name[20];
do
{
int flag=0;
cout<<"请输入您要删除的学生的姓名:"<<endl;
cin>>name;
for(int j=0;j<i;j++)
{
if(strcmp(name,s[j]->getname())==0)
{
flag=1;
s[j]->del();//找到对应的学生进行删除操作,并跳出循环
cout<<"数据删除成功!"<<endl;
break;
}
}
if(flag==0)
cout<<"您要删除的学生不存在,请查证后再删除!"<<endl;
cout<<"请问是否继续删除?(y/n)"<<endl;
cin>>c;
do
{
if(c!='y'&&c!='n')
{
cout<<"指令错误!请重新输入!"<<endl;
cin>>c;
}
else
flag=1;
}while(flag==0);
}while(c=='y');
}
void Correct()
{
char name[20];
char nu[20];
float mao,mo,shu,cj,eng;
do
{
flag=0;
cout<<"请输入您要修改的学生的姓名:";
cin>>name;
for(int j=0;j<i;j++)
{
if(strcmp(name,s[j]->getname())==0)
{
flag=1;
break;
}
}
if(flag==1)
{
cout<<"请输入修改学生姓名:"<<endl;
cin>>name;
cout<<"请输入修改学生新学号:"<<endl;
cin>>nu;
cout<<"请输入修改学生毛概:"<<endl;
cin>>mao;
cout<<"请输入修改学生模电:"<<endl;
cin>>mo;
cout<<"请输入修改学生数电:"<<endl;
cin>>shu;
cout<<"请输入修改学生c++:"<<endl;
cin>>cj;
cout<<"请输入修改学生英语成绩:"<<endl;
cin>>eng;
cout<<endl;
s[j]=new Student(name,nu,mao,mo,shu,cj,eng);//将修改后的数据赋给该数组
j++;
}
if(flag==0)
cout<<"对不起,您要修改的学生不存在!请查证后输入!"<<endl;
cout<<"想继续修改吗(y/n)";
cin>>c;
flag=0;
do
{
if(c!='y'&&c!='n')
{
cout<<"指令错误!请重新输入!"<<endl;
cin>>c;
}
else
flag=1;
}while(flag==0);
}while(c=='y');
}
void Zfcx()
{
float SUM;
if(i==0)
{
cout<<"系统中没有输入数据,请先输入数据!"<<endl;
}
do
{
flag=0;
cout<<"请输入您要查询的学生的总成绩:"<<endl;
cin>>SUM;
for(int j=0;j<i;j++)
{
if(s[j]->getsum()==SUM)
{
flag=1;
cout<<"您要查询的学生是:"<<(*s[j]).name<<endl;
cout<<"该生的信息为:"<<endl;
cout<<" 学号:"<<(*s[j]).number
<<" 毛概分数:"<<(*s[j]).maogai
<<" 模电分数:"<<(*s[j]).modian
<<" 数电分数:"<<(*s[j]).shudian
<<" c++ 分数:"<<(*s[j]).cpp
<<" 英语分数:"<<(*s[j]).english
<<endl;
//此处可能有多个学生是相同总分,不用break跳出循环
}
}
if(flag==0)
cout<<"对不起!您要查询的学生不存在!"<<endl;
cout<<"是否继续查?(y/n):";
cin>>c;
do
{
if(c!='y'&&c!='n')
{
cout<<"指令错误!请重新输入!"<<endl;
cin>>c;
}
else
flag=1;
}while(flag==0);
}while(c=='y');
}
void Xmcx()
{
char n[20];
if(i==0)
{
cout<<"系统中没有输入数据,请先输入数据!"<<endl;
}
do
{
flag=0;
cout<<"请输入要查询的名字: "<<endl;
cin>>n;
for(int j=0;j<i;j++)
{
if(strcmp(n,(*s[j]).name)==0)
{
flag=1;
cout<<"您要查询的学生是:"<<(*s[j]).name<<endl;
cout<<"该生的信息是:学号:"<<(*s[j]).number
<<" 毛概分数:"<<(*s[j]).maogai
<<" 模电分数:"<<(*s[j]).modian
<<" 数电分数:"<<(*s[j]).shudian
<<" c++ 分数:"<<(*s[j]).cpp
<<" 英语分数:"<<(*s[j]).english
<<endl;
}
}
if(flag==0)
cout<<"对不起您要查询的学生不存在,请查证后再输入!"<<endl;
cout<<"您想继续查询吗?(y/n):";
cin>>c;
do
{
if(c!='y'&&c!='n')
{
cout<<"指令错误!请重新输入!"<<endl;
cin>>c;
}
else
flag=1;
}while(flag==0);
}while(c=='y');
}
void Xhcx()
{
char nu[20];
if(i==0)
{
cout<<"系统中没有输入数据,请先输入数据!"<<endl;
}
do
{
flag=0;
cout<<"请输入要查询的学号: "<<endl;
cin>>nu;
for(int j=0;j<i;j++)
{
if(strcmp(nu,(*s[j]).number)==0)
{
flag=1;
cout<<"您要查询的学生是:"<<(*s[j]).name<<endl;
cout<<"该生的信息是:学号:"<<(*s[j]).number
<<" 毛概分数:"<<(*s[j]).maogai
<<" 模电分数:"<<(*s[j]).modian
<<" 数电分数:"<<(*s[j]).shudian
<<" c++ 分数:"<<(*s[j]).cpp
<<" 英语分数:"<<(*s[j]).english
<<endl;
}
}
if(flag==0)
cout<<"对不起您要查询的学生不存在,请查证后再输入!"<<endl;
cout<<"您想继续查询吗?(y/n):";
cin>>c;
do
{
if(c!='y'&&c!='n')
{
cout<<"指令错误!请重新输入:"<<endl;
cin>>c;
}
else
flag=1;
}while(flag==0);
}while(c=='y');
}
void Print()
{
cout<<"所有学生数据如下:"<<endl;
cout<<setw(12)<<"姓名"<<" "
<<setw(12)<<"学号"
<<setw(12)<<"毛概成绩:"
<<setw(12)<<"模电成绩:"
<<setw(12)<<"数电成绩:"
<<setw(12)<<"C++ 成绩:"
<<setw(12)<<"英语成绩:"
<<setw(12)<<"总分成绩:"
<<endl;
for(j=0;j<i;j++)
{
s[j]->display();
}
}
void Average()
{
if(i==0)
{
cout<<"系统中没有输入数据,请先输入数据!"<<endl;
}
for(int m=0;m<i;m++)
{
cout<<(*s[m]).name<<" 学号:"
<<(*s[m]).number<<" 总分:"
<<(*s[m]).getsum()<<" 均分:"
<<(*s[m]).getaver()<<endl;
}
}
void Unpassed()
{
if(i==0)
{
cout<<"系统中没有输入数据,请先输入数据!"<<endl;
}
int m,n,o,p,q,j;
m=0;n=0;o=0;p=0;q=0;
for(j=0;j<i;j++)
{
if(s[j]->maogai<60) m++;
if(s[j]->modian<60) n++;
if(s[j]->shudian<60) o++;
if(s[j]->cpp<60) p++;
if(s[j]->english<60) q++;
}
cout<<"毛概不及格人数为:"<<m<<" "<<"不及格率为:"<<((float)m/j)*100<<"%"<<endl;
cout<<"模电不及格人数为:"<<n<<" "<<"不及格率为:"<<((float)n/j)*100<<"%"<<endl;
cout<<"数电不及格人数为:"<<o<<" "<<"不及格率为:"<<((float)o/j)*100<<"%"<<endl;
cout<<"c++ 不及格人数为:"<<p<<" "<<"不及格率为:"<<((float)p/j)*100<<"%"<<endl;
cout<<"英语不及格人数为:"<<q<<" "<<"不及格率为:"<<((float)q/j)*100<<"%"<<endl;
}
int main()
{
get();//将数据读入
cout<<"*****************************************************************************:"<<endl;
cout<<"*************************欢迎使用高校学籍管理系统!***************************:"<<endl;
cout<<"******** 1.录入学生信息 ********"<<endl;
cout<<"******** 2.删除学生信息 ********"<<endl;
cout<<"******** 3.修改学生信息 ********"<<endl;
cout<<"******** 4.按总成绩查询 ********"<<endl;
cout<<"******** 5.按姓名查询 ********"<<endl;
cout<<"******** 6.按学号查询 ********"<<endl;
cout<<"******** 7.查询学生总分和平均成绩 ********"<<endl;
cout<<"******** 8.各科不及格人数和不及格率 ********"<<endl;
cout<<"******** 9.输出所有学生数据 ********"<<endl;
cout<<"******** 10.退出程序 ********"<<endl;
do
{
cin>>p;
if(p>=1&&p<=11)
flag=1;
else
cout<<"输入错误,请重新输入!"<<endl;
}while(flag==0);
do
{
switch(p)
{
case 1:Input();break;
case 2:Delete();break;
case 3:Correct();break;
case 4:Zfcx();break;
case 5:Xmcx();break;
case 6:Xhcx();break;
case 7:Average();break;
case 8:Unpassed();break;
case 9:Print();break;
case 10:outfile();
cout<<"感谢您的使用!再见!"<<endl;
return 0;break;//退出时将数据进行保存
default :cout<<"输入错误,请重新输入!"<<endl;
}
cout<<" 您想继续进行其他操作吗?(y/n)";
do
{
cin>>w;
cout<<endl;
if(w!='y'&&w!='n')
cout<<" 指令错误!请重新输入!"<<endl;
else
flag=1;
}while(flag==0);
if(w=='y')
{
cout<<"*****************************************************************************:"<<endl;
cout<<"*************************欢迎使用高校学籍管理系统!***************************:"<<endl;
cout<<"******** 1.录入学生信息 ********"<<endl;
cout<<"******** 2.删除学生信息 ********"<<endl;
cout<<"******** 3.修改学生信息 ********"<<endl;
cout<<"******** 4.按总成绩查询 ********"<<endl;
cout<<"******** 5.按姓名查询 ********"<<endl;
cout<<"******** 6.按学号查询 ********"<<endl;
cout<<"******** 7.查询学生总分和平均成绩 ********"<<endl;
cout<<"******** 8.各科不及格人数和不及格率 ********"<<endl;
cout<<"******** 9.输出所有学生数据 ********"<<endl;
cout<<"******** 10.退出程序 ********"<<endl;
cin>>p;
}
if(w=='n')
outfile();//不继续进行其他操作则保存退出程序
}while(w=='y');
}