📄 xjgl.cpp
字号:
/*
course.dat-课程列表(只读)
student.dat-学生信息
*/
#include <fstream.h>
#include <iomanip.h>
#include <string.h>
#include <ctype.h>
class COURSE //课程类
{
private:
static int coursenum; //课程数量
static char (*coursename)[20]; //课程名称
public:
static void LoadCourse() //从文件COURSE.DAT装入课程信息
{
ifstream f("course.dat");
f>>coursenum;
coursename=new char[coursenum][20];
for(int i=0; i<coursenum; i++)
f>>coursename[i];
f.close();
}
friend class STUDENT;
friend class COLLEGE;
};
int COURSE::coursenum=0;
char (*COURSE::coursename)[20]=0;
class STUDENT //学生类
{
private:
char num[20]; //学号
char name[20]; //姓名
char sex; //性别
char cname[20]; //班级
float *grade; //成绩(动态数组)
float sum; //各科总分
STUDENT *next;
public:
STUDENT()
{
grade=new float[COURSE::coursenum];
next=0;
}
~STUDENT()
{
delete []grade;
}
void Input()
{
sum=0;
cout<<"学号:"; cin>>num; //输入学生一般信息
cout<<"姓名:"; cin>>name;
cout<<"性别:"; cin>>sex; sex=toupper(sex);
cout<<"班级:"; cin>>cname;
for(int i=0; i<COURSE::coursenum; i++) //输入学生各科成绩
{
cout<<COURSE::coursename[i]<<"成绩:"; cin>>grade[i];
sum+=grade[i]; //计算总分
}
}
void Input(ifstream &f)
{
f>>num;
f>>name;
f>>sex; sex=toupper(sex);
f>>cname;
for(int i=0; i<COURSE::coursenum; i++) //输出学生各科成绩,总分
{
f>>grade[i];
}
f>>sum;
}
static void OutputT()
{
cout<<setw(10)<<"学号"<<setw(20)<<"姓名"<<setw(5)<<"性别"<<setw(10)<<"班级";
for(int i=0; i<COURSE::coursenum; i++)
cout<<setw(7)<<COURSE::coursename[i];
cout<<setw(10)<<"总分"<<endl;
}
void Output()
{
cout<<setw(10)<<num; //输出学生一般信息
cout<<setw(20)<<name;
cout<<setw(5)<<sex;
cout<<setw(10)<<cname;
for(int i=0; i<COURSE::coursenum; i++) //输出学生各科成绩,总分
{
cout<<setw(7)<<grade[i];
}
cout<<setw(10)<<sum<<endl;
}
void Output(ofstream &f)
{
f<<setw(10)<<num; //输出学生一般信息
f<<setw(20)<<name;
f<<setw(5)<<sex;
f<<setw(10)<<cname;
for(int i=0; i<COURSE::coursenum; i++) //输出学生各科成绩,总分
{
f<<setw(7)<<grade[i];
}
f<<setw(10)<<sum<<endl;
}
friend class COLLEGE;
};
class COLLEGE //学校类
{
private:
STUDENT *SL; //学生链表
void Clear();
int Find(char* ID,STUDENT **p1,STUDENT **p2);
void COLLEGE::ValueS2ToS1(STUDENT &s1,STUDENT &s2);
public:
COLLEGE()
{
COURSE::LoadCourse(); //装入课程信息
SL=new STUDENT(); //创建学生链表表头结点
}
~COLLEGE()
{
STUDENT *p=SL; //删除学生链表各个结点
while(p)
{
SL=p->next;
delete p;
p=SL;
}
}
void Set(); //课程设置(增,删,改,存)
void Add(); //增加学生
void Delete(); //删除学生
void Modify(); //修改学生
void Query(); //查询学生信息(按姓名,学号)
void Print(); //输出所有学生信息
void Stat(); //统计课程平均成绩,课程合格率
void SumSort(); //按总分排名(高->低)
void NumSort(); //按学号排序(低->高)
void Save(); //学生数据存盘
void Load(); //装入学生数据
};
//增加学生
void COLLEGE::Add()
{
cout<<"\n** 增加学生信息 **\n";
STUDENT *p=new STUDENT; //创建1个新学生结点
STUDENT *p2=SL; //查找学生链表表尾结点
while(p2->next)p2=p2->next;
p2->next=p; //链接学生结点
p->Input(); //输入学生信息
}
//查找学生结点(返回1-找到,0-未找到.结点指针由p1返回,p2为前看指针)
int COLLEGE::Find(char *ID,STUDENT **p1,STUDENT **p2)
{
*p1=SL->next;
*p2=SL;
while(*p1)
{
if(strcmp((*p1)->num,ID)==0)
break; //找到
else
{
*p2=*p1; //继续查找
*p1=(*p1)->next;
}
}
return *p1?1:0;
}
//删除学生
void COLLEGE::Delete()
{
cout<<"\n** 删除学生 **\n";
char No[20];
STUDENT *p1,*p2;
cout<<"学号:"; cin>>No;
if(!Find(No,&p1,&p2))
{
cout<<"指定的学生没有找到!\n";
}
else
{
p2->next=p1->next; //连接
delete p1;
cout<<"正确删除!\n";
}
}
//修改学生
void COLLEGE::Modify()
{
cout<<"\n** 修改学生 **\n";
char No[20];
STUDENT *p1,*p2;
cout<<"学号:"; cin>>No;
if(!Find(No,&p1,&p2))
{
cout<<"指定的学生没有找到!\n";
}
else
{
p1->Output(); //输出原来的学生信息(做提示)
p1->Input(); //输入此学生信息(更新)
cout<<"修改完成!\n";
}
}
/*未完*/
/*承上*/
//查询学生信息
//按学号或姓名查找,如果找到显示该学生,如果未找到,也给出相应提示.
void COLLEGE::Query()
{
cout<<"\n** 查询学生 **\n";
STUDENT *p=SL->next;
char No[20];
char Name[20];
char ch;
do
{
cout<<"按学号查1,按姓名查2:"; cin>>ch;
}while(ch!='1'&&ch!='2');
int flag=0; //未找到0,找到1
if(ch=='1') //按学号查
{
cout<<"学号:"; cin>>No;
while(p)
if(strcmp(p->num,No)==0)
{
flag=1; break;
}
else
p=p->next;
}
else //按姓名查
{
cout<<"姓名:"; cin>>Name;
while(p)
if(strcmp(p->name,Name)==0)
{
flag=1; break;
}
else
p=p->next;
}
if(flag==1) //如果找到,显示此同学信息
{
p->OutputT();
p->Output();
}
else //否则给出未找到提出
cout<<"指定的学生没有找到!\n";
}
//输出所有学生信息
void COLLEGE::Print()
{
cout<<"\n** 输出学生信息 **\n";
STUDENT *p=SL->next;
STUDENT::OutputT(); //输出标题
while(p) //循环输出各位学生信息
{
p->Output();
p=p->next;
}
}
//学生数据存盘
void COLLEGE::Save()
{
ofstream f("student.dat");
STUDENT *p=SL->next;
while(p) //遍历学生链表
{
p->Output(f); //写入文件
p=p->next;
}
f.close();
cout<<"\n** 保存数据完成! **\n";
}
void COLLEGE::Clear()
{
STUDENT *p=SL->next;
while(p)
{
SL->next=p->next;
delete p;
p=SL->next;
}
}
//装入学生数据
void COLLEGE::Load()
{
Clear();
ifstream f("student.dat");
STUDENT *p=SL;
STUDENT *p2=new STUDENT;
p2->Input(f);
while(f)
{
p->next=p2;
p=p->next;
p2=new STUDENT;
p2->Input(f);
}
delete p2;
f.close();
}
//统计课程平均成绩,课程合格率
void COLLEGE::Stat()
{
float *sum=new float[COURSE::coursenum]; //各科平均成绩
float *pass=new float[COURSE::coursenum]; //各科合格人数,/n=>合格率
int n=0; //学生人数
for(int i=0; i<COURSE::coursenum; i++)
{
STUDENT *p=SL->next; n=0;
sum[i]=pass[i]=0;
while(p) //遍历学生链表
{
n++; //人数
sum[i]=sum[i]+p->grade[i]; //某科总分
if(p->grade[i]>=60)pass[i]++; //某科合格人数
p=p->next;
}
}
for(i=0; i<COURSE::coursenum; i++)
{
cout<<setprecision(4)<<setiosflags(ios::showpoint);
cout<<COURSE::coursename[i]<<"平均:"<<sum[i]/n<<",合格率:"<<pass[i]/n*100.<<"%"<<endl;
}
delete []sum;
delete []pass;
}
void COLLEGE::ValueS2ToS1(STUDENT &s1,STUDENT &s2)
{
strcpy(s1.num,s2.num); //学号
strcpy(s1.name,s2.name); //姓名
s1.sex=s2.sex; //性别
strcpy(s1.cname,s2.cname); //班级
for(int i=0; i<COURSE::coursenum; i++)
s1.grade[i]=s2.grade[i]; //成绩指针(动态数组)
s1.sum=s2.sum; //各科总分
}
//按总分排名(采用选择法排序),总分高->低
void COLLEGE::SumSort()
{
STUDENT *p1,*p2;
p1=SL->next;
while(p1)
{
p2=p1->next;
while(p2)
{
if(p2->sum>p1->sum)
{
STUDENT t;
ValueS2ToS1(t,*p1);
ValueS2ToS1(*p1,*p2);
ValueS2ToS1(*p2,t);
}
p2=p2->next;
}
p1=p1->next;
}
}
void COLLEGE::NumSort() //按学号排序(低->高)
{
STUDENT *p1,*p2;
p1=SL->next;
while(p1)
{
p2=p1->next;
while(p2)
{
if(strcmp(p2->num,p1->num)<0) //只要修改这里,其余同SumSort
{
STUDENT t;
ValueS2ToS1(t,*p1);
ValueS2ToS1(*p1,*p2);
ValueS2ToS1(*p2,t);
}
p2=p2->next;
}
p1=p1->next;
}
}
void main()
{
char ch;
COLLEGE c; //定义大学对象
cout.setf(ios::left);
//显示主菜单,接受选择,并分支调用大学类的相应功能的成员函数
do
{
cout<<"\n☆☆ 高校学籍管理系统 ☆☆\n";
cout<<"1-增加学生\n";
cout<<"2-删除学生\n";
cout<<"3-修改学生\n";
cout<<"4-查询学生\n";
cout<<"5-输出学生信息\n";
cout<<"6-综合统计(课程平均成绩,课程合格率)\n";
cout<<"7-总分排序\n";
cout<<"8-学号排序\n";
cout<<"S-数据存盘\n";
cout<<"L-数据装入\n";
cout<<"Q-退出\t请选择(1-8,SLQ):";
cin>>ch; ch=toupper(ch);
switch(ch)
{
case '1': c.Add(); break;
case '2': c.Delete();break;
case '3': c.Modify();break;
case '4': c.Query(); break;
case '5': c.Print(); break;
case '6': c.Stat(); break;
case '7': c.SumSort(); break;
case '8': c.NumSort(); break;
case 'S': c.Save(); break;
case 'L': c.Load(); break;
}
}while(ch!='Q');
}
3、2数据文件
1、course.dat:
3
C++
英语
高数
2、student.dat:
86101 chenkaijun M M8601 77 59 96 232
86102 zhaowei F M8601 55 85 77 217
86103 wubin M M8601 85 87 92 264
86104 shijun M M8601 58 90 85 233
86105 wangzhuguo M M8601 66 70 86 222
3、3运行结果参考
☆☆ 高校学籍管理系统 ☆☆
1-增加学生
2-删除学生
3-修改学生
4-查询学生
5-输出学生信息
6-综合统计(课程平均成绩,课程合格率
7-总分排序
8-学号排序
S-数据存盘
L-数据装入
Q-退出 请选择(1-8,SLQ):L
☆☆ 高校学籍管理系统 ☆☆
1-增加学生
2-删除学生
3-修改学生
4-查询学生
5-输出学生信息
6-综合统计(课程平均成绩,课程合格率
7-总分排序
8-学号排序
S-数据存盘
L-数据装入
Q-退出 请选择(1-8,SLQ):5
** 输出学生信息 **
学号 姓名 性别 班级 C++ 英语 高数 总分
86101 chenkaijun M M8601 77 59 96 232
86102 zhaowei F M8601 55 85 77 217
86103 wubin M M8601 85 87 92 264
86104 shijun M M8601 58 90 85 233
86105 wangzhuguo M M8601 66 70 86 222
☆☆ 高校学籍管理系统 ☆☆
1-增加学生
2-删除学生
3-修改学生
4-查询学生
5-输出学生信息
6-综合统计(课程平均成绩,课程合格率)
7-总分排序
8-学号排序
S-数据存盘
L-数据装入
Q-退出 请选择(1-8,SLQ):7
☆☆ 高校学籍管理系统 ☆☆
1-增加学生
2-删除学生
3-修改学生
4-查询学生
5-输出学生信息
6-综合统计(课程平均成绩,课程合格率)
7-总分排序
8-学号排序
S-数据存盘
L-数据装入
Q-退出 请选择(1-8,SLQ):5
** 输出学生信息 **
学号 姓名 性别 班级 C++ 英语 高数 总分
86103 wubin M M8601 85 87 92 264
86104 shijun M M8601 58 90 85 233
86101 chenkaijun M M8601 77 59 96 232
86105 wangzhuguo M M8601 66 70 86 222
86102 zhaowei F M8601 55 85 77 217
☆☆ 高校学籍管理系统 ☆☆
1-增加学生
2-删除学生
3-修改学生
4-查询学生
5-输出学生信息
6-综合统计(课程平均成绩,课程合格率)
7-总分排序
8-学号排序
S-数据存盘
L-数据装入
Q-退出 请选择(1-8,SLQ):q
Press any key to continun
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -