一、项目的目的与要求
设计一个学生成绩管理系统。学生信息包括:学号、姓名、性别、年龄、班级等信息。小学生除了包括学生所有信息外,还包括英语、数学和语文成绩。中学生除了包括小学生所有信息外,还包括地理、历史成绩。大学生除了包括学生所有信息外,还包括专业、英语、程序设计和高等数学等课程。设计一程序能够对学生成绩进行管理,应用到继承、抽象类、虚函数、虚基类、多态和文件的输入/输出等内容。
二、工具/准备工作
应用知识:
1.STL容器的选择:链表方便删除,插入。
2.文件流的输入与输出。建立文件流和链表之间的输入输出操作。
3.首先简单功能确定,其次再在细节处考虑。
4.友元类:可以访问与之为友元关系的类的所有私有成员
5.虚函数:实现动态绑定避免造成重复基类。
6.常成员函数:防止间接改变数据成员
7.类型引用:传递变量的地址。
8.清屏操作:system(“pause”);
9.强制类型转换:static_cast:强制将一种数据类型转换成另一种数据类型。
C++集成开发环境:Visual Studio 2012
//完整成果报告在另一个博文里
# include <iostream>
# include <fstream>
# include <string.h>
#include <conio.h>//用getch();
using namespace std;
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌Student类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
class Student
{
friend class Studentmassage;
protected:
char type[15];//学生类型
char name[20];//姓名
char id[10];//学号
char sex[4];//性别
int age;//年龄
Student *Next;
public:
Student();
Student(char name[], char id[], char sex[], int age, char type[]);
~Student(){}
void ReadFile(istream & in);
void Input();
void Showstudents()const;
};
class Primary:virtual public Student {
friend class Pmassage;
protected:
int chinese;
int math;
int eng;
Primary *Next;
int prsum;
public:
Primary();
Primary(char name[], char id[], char sex[], int age, char type[], int chinese, int math, int eng);
~Primary(){}
void Input();
void ReadFile(istream & in);
void Show()const;
};
class High: virtual public Primary{
friend class Hmassage;
protected:
int history;
int geo;
int hgsum;
High * Next;
public:
void Input();
void ReadFile(istream & in);
void Show()const;
};
class College: virtual public Student
{
friend class Cmassage;
protected:
int Cnum; //C++课程得分
int Mnum; //高数得分
int Enum; //程序设计课程得分
int Eng; //英语得分
int sum;
College * Next;
public:
void Input();
void ReadFile(istream & in);
void Show()const;
};
#include "grade.h"
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌Student类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Student::Student()
{
strcpy(name," ");strcpy(id," ");strcpy(sex," ");age=18;strcpy(type," ");
}
Student::Student(char name[], char id[], char sex[], int age, char type[])
{
strcpy(name,name);strcpy(id,id);strcpy(sex,sex),age=age;strcpy(type,type);
}
void Student::ReadFile(istream & in)
{
in>>name>>id>>sex>>age>>type;
}
void Student::Input()
{
cout<<"\t\t请输入学生的学号:"; cin>>id;
cout<<"\t\t请输入学生的姓名:"; cin>>name;
cout<<"\t\t请输入学生的性别:"; cin>>sex;
cout<<"\t\t请输入学生的年龄:"; cin>>age;
cout<<"\t\t请输入学生的类型:"; cin>>type;
}
void Student::Showstudents()const{
int i=0;
if(i==0){
cout<<"姓名:"<<"\t学号:"<<"\t性别:"<<"\t年龄:"<<"\t学生类型"<<endl;
i++;}
cout<<name<<"\t"<<id<<"\t"<<sex<<"\t"<<age<<"\t"<<type<<endl;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌Primary类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Primary::Primary()
{
chinese=0;
math=0;
eng=0;
}
Primary::Primary(char name[], char id[], char sex[], int age, char type[], int chinese, int math, int eng)
:Student(name, id, sex, age, type)
{
chinese=chinese;math=math;eng=eng;
}
void Primary::Input()
{
cout<<"\t\t请输入学生的学号:"; cin>>id;
cout<<"\t\t请输入学生的姓名:"; cin>>name;
cout<<"\t\t请输入学生的性别:"; cin>>sex;
cout<<"\t\t请输入学生的年龄:"; cin>>age;
cout<<"\t\t请输入学生的语文的成绩:"; cin>>chinese;
cout<<"\t\t请输入学生的数学的成绩:"; cin>>math;
cout<<"\t\t请输入学生的英语的成绩:"; cin>>eng;
prsum=chinese+math+eng;
}
void Primary::ReadFile(istream & in)
{
in>>name>>id>>sex>>age>>chinese>>math>>eng>>prsum;
}
void Primary::Show()const
{
int i=0;
if(i==0){
cout<<"姓名:"<<"\t学号:"<<"\t性别:"<<"\t年龄:"<<"\t语文:"<<"\t数学:"
<<"\t英语:"<<"\t总成绩:"<<endl;i++;}
cout<<name<<"\t"<<id<<"\t"<<sex<<"\t"<<age<<"\t"<<chinese<<"\t"<<math<<"\t"<<eng<<"\t"<<prsum<<endl;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌High类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void High::Input()
{
cout<<"\t\t请输入学生的学号:"; cin>>id;
cout<<"\t\t请输入学生的姓名:"; cin>>name;
cout<<"\t\t请输入学生的性别:"; cin>>sex;
cout<<"\t\t请输入学生的年龄:"; cin>>age;
cout<<"\t\t请输入学生的语文的成绩:"; cin>>chinese;
cout<<"\t\t请输入学生的数学的成绩:"; cin>>math;
cout<<"\t\t请输入学生的英语的成绩:"; cin>>eng;
cout<<"\t\t请输入学生的地理的成绩:"; cin>>geo;
cout<<"\t\t请输入学生的历史的成绩:"; cin>>history;
hgsum=chinese+math+eng+geo+history;
}
void High::ReadFile(istream & in)
{
in>>name>>id>>sex>>age>>chinese>>math>>eng>>geo>>history>>hgsum;
}
void High::Show()const
{
cout<<"姓名:"<<"\t学号:"<<"\t性别:"<<"\t年龄:"<<"\t语文:"<<"\t数学:"
<<"\t英语:"<<"\t地理:"<<"\t历史:"<<"\t总成绩:"<<endl;
cout<<name<<"\t"<<id<<"\t"<<sex<<"\t"<<age<<"\t"<<chinese<<"\t"<<math
<<"\t"<<eng<<"\t"<<geo<<"\t"<<history<<"\t"<<hgsum<<endl;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌College类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void College::Input()
{
cout<<"\t\t请输入学生的学号:"; cin>>id;
cout<<"\t\t请输入学生的姓名:"; cin>>name;
cout<<"\t\t请输入学生的性别:"; cin>>sex;
cout<<"\t\t请输入学生的年龄:"; cin>>age;
cout<<"\t\t请输入C++课程的成绩:"; cin>>Cnum;
cout<<"\t\t请输入高数的成绩:"; cin>>Mnum;
cout<<"\t\t请输入程序设计课程的成绩:"; cin>>Enum;
cout<<"\t\t请输入学生的英语的成绩:"; cin>>Eng;
sum=Cnum+Mnum+Enum+Eng;
}
void College::ReadFile(istream & in)
{
in>>name>>id>>sex>>age>>Cnum>>Mnum>>Enum>>Eng>>sum;
}
void College::Show()const
{
cout<<"姓名:"<<"\t学号:"<<"\t性别:"<<"\t年龄:"<<"\tC++课程:"<<"\t高数:"
<<"\t程序设计课程:"<<"\t英语:"<<"\t总成绩:"<<endl;
cout<<name<<"\t"<<id<<"\t"<<sex<<"\t"<<age<<"\t"<<Cnum<<"\t"<<Mnum
<<"\t"<<Enum<<"\t"<<Eng<<"\t"<<sum<<endl;
}
# include <iostream>
# include <fstream>
# include <string.h>
#include <conio.h>//用getch();
#include "grade.h"
//﹌﹌﹌﹌﹌﹌﹌﹌﹌Studentmassage类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
class Studentmassage
{
public:
Studentmassage();
~Studentmassage();
void ShowMenu();
void Find();
void Save();
void ModifyItem();
void RemoveItem();
int ListCount();
void Display();
void AddItem();
Student *FindItem(char * name);
Student *FindID(char * id);
private:
Student * Head,* End;
ifstream in;
ofstream out;
};
class Pmassage
{
public:
Pmassage();
~Pmassage();
void ShowMenu();
void Find();
void Save();
void ModifyItem();
void RemoveItem();
int ListCount();
void Average();
void Display();
void AddItem();
Primary *FindItem(char * name);
Primary *FindID(char * id);
private:
Primary *P_Head,*P_End;
ifstream in;
ofstream out;
};
class Hmassage
{
public:
Hmassage();
~Hmassage();
void ShowMenu();
void Find();
void Save();
void ModifyItem();
void RemoveItem();
int ListCount();
void Average();
void Display();
void AddItem();
High *FindItem(char * name);
High *FindID(char * id);
private:
High *H_Head,*H_End;
ifstream in;
ofstream out;
};
class Cmassage
{
public:
Cmassage();
~Cmassage();
void ShowMenu();
void Find();
void Save();
void ModifyItem();
void RemoveItem();
int ListCount();
void Average();
void Display();
void AddItem();
College *FindItem(char * name);
College *FindID(char * id);
private:
College *C_Head,*C_End;
ifstream in;
ofstream out;
};
#include "system.h"
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌学生信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌构造函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Studentmassage::Studentmassage()
{
Head=new Student;
Head->Next=new Student;
End=Head->Next;
in.open("student.txt");
if(!in)
cout<<"这是一个新系统,无学生信息。请先输入。"<<endl;
else
{
while(!in.eof())
{
End->ReadFile(in);
if(End->name[0]=='\0')break;
End->Next=new Student;
End=End->Next;
}
in.close();
cout<<"\t\t读取学生信息成功!"<<endl;
}
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌析构函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Studentmassage::~Studentmassage()
{
Save();
for(Student * temp;Head->Next!=End;)
{
temp=Head->Next;
Head->Next=Head->Next->Next;
delete temp;
}
delete Head,End;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌展现信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Display()
{
for(Student * p=Head->Next;p!=End;p=p->Next)
p->Showstudents();
cout<<"输入任意字符!继续……";
getch();
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌添加人员﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::AddItem()
{
begin:
char id[15];Student *p;
cout<<"请创建一个id号:";cin>>id;
if(p=FindID(id))
{
cout<<"学号已存在,重新输入学生信息"<<endl;
cout<<"输入任意字符!继续……";
getch();
goto begin;
}
else
{
End->Input();
End->Next=new Student;
End=End->Next;
cout<<"添加成功!"<<endl;
cout<<"输入任意字符!继续……"<<endl;
getch();
}
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌姓名查找﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Student * Studentmassage::FindItem(char * name)
{
for(Student * p=Head;p->Next!=End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next->name,name))return p;
return NULL;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌学号查找﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Student * Studentmassage::FindID(char * id)
{
for(Student * p=Head;p->Next!=End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next->id,id))return p;
return NULL;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌菜单﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::ShowMenu() {
cout<<"********************************************************************************"<<endl;
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<<"----------------------- 0.安全退出系统 -----------------------"<<endl;
cout<<"\n\t\t\n\t\t请选择:";
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌查找函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Find()
{
char name[20] ,Id[10];
int x;
Student * p=NULL;
cout<<"\n\t\t*********************************\n";
cout<<"\t\t※ 1.按学生的姓名查找\n\t\t※ 2.按学生学号查找";
cout<<"\n\t\t*********************************\n请选择:";
cin>>x;
switch(x)
{
case 1:{cout<<"\t\t请输入要查找的学生的姓名:";cin>>name;
if(p=FindItem(name))
{
p->Next->Showstudents();
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到该姓名的学生!"<<'\n'<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}break;
case 2:
{
cout<<"\t\t请输入要查找的学生的学号:";cin>>Id;
if(p=FindID(Id))
{
p->Next->Showstudents();
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到该学好的学生!"<<'\n'<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}break;
}
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌修改信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::ModifyItem() //修改信息
{
char name[20];
Student * p=NULL;
cout<<"\t\t请输入要修改的人的姓名:";cin>>name;
if(p=FindItem(name))
{
cout<<"\t\t已找到学生的信息,请输入新的信息!"<<endl;
p->Next->Input();
cout<<"修改成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌删除信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::RemoveItem() // 删除信息
{
char name[20];
Student * p=NULL,*temp=NULL;
cout<<"\t\t请输入要删除的学生的姓名:"<<endl;cin>>name;
if(p=FindItem(name))
{
temp=p->Next;
p->Next=p->Next->Next;
delete temp;
cout<<"\t\t删除成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌统计人数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
int Studentmassage::ListCount()//统计当前链表的记录总数,返回一个整数
{
if(! Head)
return 0;
int n=0;
for(Student * p=Head->Next;p!=End;p=p->Next)
{
n++;
}
return n;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌保存函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Save()
{
out.open("student.txt");
for(Student *p=Head->Next;p!=End;p=p->Next)
out<<p->name<<"\t"<<p->id<<"\t"<<p->sex<<"\t"<<p->age<<"\t"<<p->type<<'\n';
out.close();
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌大学生信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Cmassage::Cmassage()
{
C_Head=new College;
C_Head->Next=new College;
C_End=C_Head->Next;
in.open("College.txt");
if(!in)
cout<<"这是一个新系统,无学生信息。请先输入。"<<endl;
else
{
while(!in.eof())
{
C_End->ReadFile(in);
if(C_End->name[0]=='\0')break;
C_End->Next=new College;
C_End=C_End->Next;
}
in.close();
cout<<"\t\t读取学生信息成功!"<<endl;
}
}
Cmassage::~Cmassage()
{
for(College * temp;C_Head->Next!=C_End;)
{
temp=C_Head->Next;
C_Head->Next=C_Head->Next->Next;
delete temp;
}
delete C_Head,C_End;
}
void Cmassage::ShowMenu()
{
cout<<"********************************************************************************"<<endl;
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<<"----------------------- 0.安全退出系统 -----------------------"<<endl;
cout<<"\n\t\t\n\t\t请选择:";
}
void Cmassage::Find()
{
char name[20] ,Id[10];
int x;
College * p=NULL;
cout<<"\n\t\t*********************************\n";
cout<<"\t\t※ 1.按学生的姓名查找\n\t\t※ 2.按学生学号查找";
cout<<"\n\t\t*********************************\n请选择:";
cin>>x;
switch(x)
{
case 1:{cout<<"\t\t请输入要查找的学生的姓名:";cin>>name;
if(p=FindItem(name))
{
p->Next->Show();
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到该姓名的学生!"<<'\n'<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}break;
case 2:
{
cout<<"\t\t请输入要查找的学生的学号:";cin>>Id;
if(p=FindID(Id))
{
p->Next->Show();
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到该学号的学生!"<<'\n'<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}break;
}
}
void Cmassage::Save()
{
out.open("College.txt");
for(College *p=C_Head->Next;p!=C_End;p=p->Next)
out<<p->name<<"\t"<<p->id<<"\t"<<p->sex<<"\t"<<p->age<<"\t"<<p->Cnum<<"\t"<<
p->Mnum<<"\t"<<p->Enum<<"\t"<<p->Eng<<"\t"<<p->sum<<endl;
out.close();
}
void Cmassage::ModifyItem()
{
char name[20];
College * p=NULL;
cout<<"\t\t请输入要修改的人的姓名:";cin>>name;
if(p=FindItem(name))
{
cout<<"\t\t已找到学生的信息,请输入新的信息!"<<endl;
p->Next->Input();
cout<<"修改成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}
void Cmassage::RemoveItem()
{
char name[20];
College * p=NULL,*temp=NULL;
cout<<"\t\t请输入要删除的学生的姓名:"<<endl;cin>>name;
if(p=FindItem(name))
{
temp=p->Next;
p->Next=p->Next->Next;
delete temp;
cout<<"\t\t删除成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}
int Cmassage::ListCount()
{
if(! C_Head)
return 0;
int n=0;
for(College * p=C_Head->Next;p!=C_End;p=p->Next)
{
n++;
}
return n;
}
void Cmassage::Average()
{
if(! C_Head)
return;
int n=0,i=0;
for(College * p=C_Head->Next;p!=C_End;p=p->Next)
{
n+=p->sum;i++;
}
double avg = static_cast<double>(n) / static_cast<double>(i);
cout<<"总体平均分:"<<avg<<endl;
cout<<"输入任意字符!继续……";
getch();
}
void Cmassage::Display()
{
for(College* p=C_Head->Next;p!=C_End;p=p->Next)
p->Show();
cout<<"输入任意字符!继续……";
getch();
}
void Cmassage::AddItem()
{
begin:
char id[15];College *p;
cout<<"请创建一个id号:";cin>>id;
if(p=FindID(id))
{
cout<<"学号已存在,重新输入学生信息"<<endl;
cout<<"输入任意字符!继续……";
getch();
goto begin;
}
else
{
C_End->Input();
C_End->Next=new College;
C_End=C_End->Next;
cout<<"添加成功!"<<endl;
cout<<"输入任意字符!继续……"<<endl;
getch();
}
}
College *Cmassage::FindItem(char * name)
{
for(College * p=C_Head;p->Next!=C_End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next->name,name))return p;
return NULL;
}
College *Cmassage::FindID(char * id)
{
for(College * p=C_Head;p->Next!=C_End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next->id,id))return p;
return NULL;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌中学生信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Hmassage::Hmassage()
{
H_Head=new High;
H_Head->Next=new High;
H_End=H_Head->Next;
in.open("High.txt");
if(!in)
cout<<"这是一个新系统,无学生信息。请先输入。"<<endl;
else
{
while(!in.eof())
{
H_End->ReadFile(in);
if(H_End->name[0]=='\0')break;
H_End->Next=new High;
H_End=H_End->Next;
}
in.close();
cout<<"\t\t读取学生信息成功!"<<endl;
}
}
Hmassage::~Hmassage()
{
for(High * temp;H_Head->Next!=H_End;)
{
temp=H_Head->Next;
H_Head->Next=H_Head->Next->Next;
delete temp;
}
delete H_Head,H_End;
}
void Hmassage::ShowMenu()
{
cout<<"********************************************************************************"<<endl;
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<<"----------------------- 0.安全退出系统 -----------------------"<<endl;
cout<<"\n\t\t\n\t\t请选择:";
}
void Hmassage::Find()
{char name[20] ,Id[10];
int x;
High * p=NULL;
cout<<"\n\t\t*********************************\n";
cout<<"\t\t※ 1.按学生的姓名查找\n\t\t※ 2.按学生学号查找";
cout<<"\n\t\t*********************************\n请选择:";
cin>>x;
switch(x)
{
case 1:{cout<<"\t\t请输入要查找的学生的姓名:";cin>>name;
if(p=FindItem(name))
{
p->Next->Show();
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到该姓名的学生!"<<'\n'<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}break;
case 2:
{
cout<<"\t\t请输入要查找的学生的学号:";cin>>Id;
if(p=FindID(Id))
{
p->Next->Show();
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到该学好的学生!"<<'\n'<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}break;
}
}
void Hmassage::Save()
{
out.open("High.txt");
for(High *p=H_Head->Next;p!=H_End;p=p->Next)
out<<p->name<<"\t"<<p->id<<"\t"<<p->sex<<"\t"<<p->age<<"\t"<<p->chinese<<"\t"<<p->math<<"\t"<<p->eng<<"\t"
<<p->geo<<"\t"<<p->history<<"\t"<<p->hgsum<<endl;
out.close();
}
void Hmassage::ModifyItem()
{
char name[20];
High * p=NULL;
cout<<"\t\t请输入要修改的人的姓名:";cin>>name;
if(p=FindItem(name))
{
cout<<"\t\t已找到学生的信息,请输入新的信息!"<<endl;
p->Next->Input();
cout<<"修改成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}
void Hmassage::RemoveItem()
{
char name[20];
High * p=NULL,*temp=NULL;
cout<<"\t\t请输入要删除的学生的姓名:"<<endl;cin>>name;
if(p=FindItem(name))
{
temp=p->Next;
p->Next=p->Next->Next;
delete temp;
cout<<"\t\t删除成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}
int Hmassage::ListCount()
{
if(! H_Head)
return 0;
int n=0;
for(High * p=H_Head->Next;p!=H_End;p=p->Next)
{
n++;
}
return n;
}
void Hmassage::Average()
{
if(! H_Head)
return;
int n=0,i=0;
for(High * p=H_Head->Next;p!=H_End;p=p->Next)
{
n+=p->hgsum;i++;
}
double avg = static_cast<double>(n) / static_cast<double>(i);
cout<<"总体平均分:"<<avg<<endl;
cout<<"输入任意字符!继续……";
getch();
}
void Hmassage::Display()
{
for(High* p=H_Head->Next;p!=H_End;p=p->Next)
p->Show();
cout<<"输入任意字符!继续……";
getch();
}
void Hmassage::AddItem()
{
begin:
char id[15];High *p;
cout<<"请创建一个id号:";cin>>id;
if(p=FindID(id))
{
cout<<"学号已存在,重新输入学生信息"<<endl;
cout<<"输入任意字符!继续……";
getch();
goto begin;
}
else
{
H_End->Input();
H_End->Next=new High;
H_End=H_End->Next;
cout<<"添加成功!"<<endl;
cout<<"输入任意字符!继续……"<<endl;
getch();
}
}
High *Hmassage::FindItem(char * name)
{
for(High * p=H_Head;p->Next!=H_End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next->name,name))return p;
return NULL;
}
High *Hmassage::FindID(char * id)
{
for(High * p=H_Head;p->Next!=H_End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next->id,id))return p;
return NULL;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌小学生信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Pmassage::Pmassage()
{
P_Head=new Primary;
P_Head->Next=new Primary;
P_End=P_Head->Next;
in.open("Primary.txt");
if(!in)
cout<<"这是一个新系统,无学生信息。请先输入。"<<endl;
else
{
while(!in.eof())
{
P_End->ReadFile(in);
if(P_End->name[0]=='\0')break;
P_End->Next=new Primary;
P_End=P_End->Next;
}
in.close();
cout<<"\t\t读取学生信息成功!"<<endl;
}
}
Pmassage::~Pmassage()
{
for(Primary * temp;P_Head->Next!=P_End;)
{
temp=P_Head->Next;
P_Head->Next=P_Head->Next->Next;
delete temp;
}
delete P_Head,P_End;
}
void Pmassage::ShowMenu()
{
cout<<"********************************************************************************"<<endl;
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<<"----------------------- 0.安全退出系统 -----------------------"<<endl;
cout<<"\n\t\t\n\t\t请选择:";
}
void Pmassage::Find()
{
char name[20] ,Id[10];
int x;
Primary * p=NULL;
cout<<"\n\t\t*********************************\n";
cout<<"\t\t※ 1.按学生的姓名查找\n\t\t※ 2.按学生学号查找";
cout<<"\n\t\t*********************************\n请选择:";
cin>>x;
switch(x)
{
case 1:{cout<<"\t\t请输入要查找的学生的姓名:";cin>>name;
if(p=FindItem(name))
{
p->Next->Show();
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到该姓名的学生!"<<'\n'<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}break;
case 2:
{
cout<<"\t\t请输入要查找的学生的学号:";cin>>Id;
if(p=FindID(Id))
{
p->Next->Show();
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到该学好的学生!"<<'\n'<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}break;
}
}
void Pmassage::Save()
{
out.open("Primary.txt");
for(Primary *p=P_Head->Next;p!=P_End;p=p->Next)
out<<p->name<<"\t"<<p->id<<"\t"<<p->sex<<"\t"<<p->age<<"\t"<<p->chinese<<"\t"<<p->math<<"\t"<<p->eng<<"\t"<<p->prsum<<endl;
out.close();
}
void Pmassage::ModifyItem()
{
char name[20];
Primary * p=NULL;
cout<<"\t\t请输入要修改的人的姓名:";cin>>name;
if(p=FindItem(name))
{
cout<<"\t\t已找到学生的信息,请输入新的信息!"<<endl;
p->Next->Input();
cout<<"修改成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}
void Pmassage::RemoveItem()
{
char name[20];
Primary * p=NULL,*temp=NULL;
cout<<"\t\t请输入要删除的学生的姓名:"<<endl;cin>>name;
if(p=FindItem(name))
{
temp=p->Next;
p->Next=p->Next->Next;
delete temp;
cout<<"\t\t删除成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}
int Pmassage::ListCount()
{
if(! P_Head)
return 0;
int n=0;
for(Primary * p=P_Head->Next;p!=P_End;p=p->Next)
{
n++;
}
return n;
}
void Pmassage::Average()
{
if(! P_Head)
return;
int n=0,i=0;
for(Primary * p=P_Head->Next;p!=P_End;p=p->Next)
{
n+=p->prsum;i++;
}
double avg = static_cast<double>(n) / static_cast<double>(i);
cout<<"总体平均分:"<<avg<<endl;
cout<<"输入任意字符!继续……";
getch();
}
void Pmassage::Display()
{
for(Primary* p=P_Head->Next;p!=P_End;p=p->Next)
p->Show();
cout<<"输入任意字符!继续……";
getch();
}
void Pmassage::AddItem()
{
begin:
char id[15];Primary *p;
cout<<"请创建一个id号:";cin>>id;
if(p=FindID(id))
{
cout<<"学号已存在,重新输入学生信息"<<endl;
cout<<"输入任意字符!继续……";
getch();
goto begin;
}
else
{
P_End->Input();
P_End->Next=new Primary;
P_End=P_End->Next;
cout<<"添加成功!"<<endl;
cout<<"输入任意字符!继续……"<<endl;
getch();
}
}
Primary *Pmassage::FindItem(char * name)
{
for(Primary * p=P_Head;p->Next!=P_End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next->name,name))
return p;
return NULL;
}
Primary *Pmassage::FindID(char * id){
for(Primary * p=P_Head;p->Next!=P_End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next->id,id))return p;
return NULL;
}
#include "system.h"
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌主函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
int main()
{
int y=3;
while(y!=0){
cout<<"\t\t----------------------------------------------------"<<endl;
for(int i=0;i<3;i++)
cout<<"\t\t----------------------------------------------------"<<endl;
cout<<"\t\t----------【 欢迎进入学生成绩管理系统 】----------"<<endl;
for(int i=0;i<3;i++)
cout<<"\t\t----------------------------------------------------"<<endl;
cout<<"\t\t----------------------------------------------------\n"<<endl;
char name[15],sct[10];
Studentmassage Grade;
cout<<endl;
cout<<"登陆账号:";cin>>name;
cout<<endl;
cout<<"登陆密码:";cin>>sct;
cout<<endl;
if(Grade.FindItem(name)!=NULL&&Grade.FindID(sct)!=NULL&&Grade.FindItem(name)==Grade.FindID(sct)){
y==0;
cout<<"按任意键开始……";
getch();
bool quit=false;
while(!quit)
{
system("cls");
Grade.ShowMenu();
int x;
cin>>x;
switch(x)
{
case 0:Grade.Save();quit=true;break;
case 1:Grade.AddItem();Grade.Save();break;
case 2:Grade.Display();Grade.Save();break;
case 3:Grade.Find();Grade.Save();break;
case 4:Grade.RemoveItem();Grade.Save();break;
case 5:Grade.ModifyItem();Grade.Save();break;
case 6:{cout<<"\t\t学生总人数:"<<Grade.ListCount()<<endl;
cout<<"输入任意字符!继续……";getch();break;}
case 7:{
int choice;
system("cls");
cout<<"\t\t----------------------------------------------------"<<endl;
cout<<"\t\t----------------------------------------------------"<<endl;
cout<<"\t\t[1--小学生],[2--中学生],[3--大学生]"<<endl;
cout<<"\t\t----------------------------------------------------"<<endl;
cout<<"\t\t----------------------------------------------------"<<endl;
cout<<"查询身份信息:"; cin>>choice;
cout<<endl;
cout<<"输入任意字符!继续……";
getch();
switch(choice)
{
case 1:{
bool stop=false;
while(!stop)
{
system("cls");
Pmassage stu;
stu.ShowMenu();
int j;
cin>>j;
switch(j)
{
case 0:stu.Save();stop=true;break;exit(0);
case 1:stu.AddItem();stu.Save();break;
case 2:stu.Display();stu.Save();break;
case 3:stu.Average();break;
case 4:stu.Find();stu.Save();break;
case 5:stu.RemoveItem();stu.Save();break;
case 6:stu.ModifyItem();stu.Save();break;
case 7:{cout<<"\t\t学生总人数:"<<stu.ListCount()<<endl;
cout<<"输入任意字符!继续……";getch();break;}
default:cout<<"此功能正在开发"<<endl;cout<<"输入任意字符!继续……";getch();break;
}
}
}
case 2:{
bool stop=false;
while(!stop)
{
system("cls");
Hmassage stu;
stu.ShowMenu();
int j;
cin>>j;
switch(j)
{
case 0:stu.Save();stop=true;break;exit(0);
case 1:stu.AddItem();stu.Save();break;
case 2:stu.Display();stu.Save();break;
case 3:stu.Average();break;
case 4:stu.Find();stu.Save();break;
case 5:stu.RemoveItem();stu.Save();break;
case 6:stu.ModifyItem();stu.Save();break;
case 7:{cout<<"\t\t学生总人数:"<<stu.ListCount()<<endl;
cout<<"输入任意字符!继续……";getch();break;}
default:cout<<"此功能正在开发"<<endl;cout<<"输入任意字符!继续……";getch();break;
}
}
}
case 3:{
bool stop=false;
while(!stop)
{
system("cls");
Cmassage stu;
stu.ShowMenu();
int j;
cin>>j;
switch(j)
{
case 0:stu.Save();stop=true;break;exit(0);
case 1:stu.AddItem();stu.Save();break;
case 2:stu.Display();stu.Save();break;
case 3:stu.Average();break;
case 4:stu.Find();stu.Save();break;
case 5:stu.RemoveItem();stu.Save();break;
case 6:stu.ModifyItem();stu.Save();break;
case 7:{cout<<"\t\t学生总人数:"<<stu.ListCount()<<endl;
cout<<"输入任意字符!继续……";getch();break;}
default:cout<<"此功能正在开发"<<endl;cout<<"输入任意字符!继续……";getch();break;
}
}
}
}
}
default:cout<<"此功能正在开发"<<endl;cout<<"输入任意字符!继续……";getch();break;
}
}
}
else
{
cout<<"登录信息错误,请重新确认信息!"<<endl;
--y;cout<<"输入任意字符!继续……";getch();system("cls");
}
if(y==0){exit(0);}
}
return 0;
}