1个回答
2014-01-18
展开全部
/*****************************************************
主要说明:学生档案管理
本程序采用面向对象技术结合,实现简单学生档案管理功能
(含学生基本信息管理、学生成绩管理、学生毕业管理)。
编制日期:2006年1月8日晚
编制人:陈
*****************************************************/
#include<iostream> //使用控制台流输入、输出
#include<fstream> //使用文件流输入、输出
#include<iomanip> //使用流格式控制输入、输出
#include<string> //使用串比较
using namespace std;
class personnel //人员类
{
protected:
int id;
char name[8];
int age;
char addr[20];
public:
virtual int getid()=0; //为判断从文件中找到的记录学号是否和输入的相等用
virtual char* getname()=0; //为判断从文件中找到的记录姓名是否和输入的相等用
virtual void input()=0;
virtual void output()=0;
virtual void output1()=0;
static int k;
personnel() //人员ID自动编号
{
id=k;
k++;
}
};
int personnel::k=1;
class course //课程类
{
int cid;
char cname[8];
public:
void input()
{
cout<<"输入课程编号:";
cin>>cid;
cout<<"输入课程名称:";
cin>>cname;
}
void output1()
{
cout<<"课程编号:"<<cid<<endl;
cout<<"课程名称:"<<cname<<endl;
}
};
class student:public personnel //学工处使用的学生基本档案
{
char specialty[10];
int grade;
public:
int getid() //为判断从文件中找到的记录学号是否和输入的相等用
{
return id;
}
char* getname() //为判断从文件中找到的记录姓名是否和输入的相等用
{
return name;
}
virtual void input()
{
cout<<"输入姓名(三个汉字以内):";
cin>>name;
cout<<"输入年龄:";
cin>>age;
cout<<"输入地址(9个汉字以内):";
cin>>addr;
cout<<"输入专业:";
cin>>specialty;
cout<<"输入年级:";
cin>>grade;
}
virtual void output() //显示花名册时用
{
cout<<"┃"<<setiosflags(ios::left)<<setw(6)<<id;
cout<<"┃"<<setiosflags(ios::left)<<setw(8)<<name;
cout<<"┃"<<setiosflags(ios::left)<<setw(6)<<age;
cout<<"┃"<<setiosflags(ios::left)<<setw(20)<<addr<<"┃"<<endl;
}
void output1() //显示简单的单个学生信息用
{
cout<<"学号:"<<id<<endl;
cout<<"姓名:"<<name<<endl;
cout<<"年龄:"<<age<<endl;
cout<<"地址:"<<addr<<endl;
cout<<"专业:"<<specialty<<endl;
cout<<"年级:"<<grade<<endl;
}
};
class student_base:public personnel //系使用的学生档案、含课程成绩
{
private:
course sc[10];
int result[10];
public:
int getid() //为判断从文件中找到的记录学号是否和输入的相等用
{
return id;
}
char* getname() //为判断从文件中找到的记录姓名是否和输入的相等用
{
return name;
}
virtual void input()
{
cout<<"输入姓名(三个汉字以内):";
cin>>name;
cout<<"输入年龄:";
cin>>age;
cout<<"输入地址(9个汉字以内):";
cin>>addr;
for (int i=0;i<10;i++)
{
sc[i].input();
cout<<"考试成绩:";
cin>>result[i];
}
}
virtual void output() //显示花名册时用
{
cout<<"┃"<<setiosflags(ios::left)<<setw(6)<<id;
cout<<"┃"<<setiosflags(ios::left)<<setw(8)<<name;
cout<<"┃"<<setiosflags(ios::left)<<setw(6)<<age;
cout<<"┃"<<setiosflags(ios::left)<<setw(20)<<addr<<"┃"<<endl;
}
void output1() //显示简单的单个学生信息用
{
cout<<"学号:"<<id<<endl;
cout<<"姓名:"<<name<<endl;
cout<<"年龄:"<<age<<endl;
cout<<"地址:"<<addr<<endl;
for (int i=0;i<10;i++)
{
sc[i].output1();
cout<<"考试成绩:"<<result[i]<<endl;
}
}
};
void InputStudent(personnel *per) //输入学生信息,并存入文件
{
ofstream ofile("student.dat",ios::app);
char ch; //用于接收控制是否继续的y/n
while(1==1) //死循环到break为止
{
cout<<"输入下一个学生信息?(y/n)";
cin>>ch;
if(ch=='n'||ch=='N') break;
per->input();
ofile.write((char*)per,sizeof(*per));
}
ofile.close();
}
void OutputStudent(personnel *per) //从文件读取学生信息,并显示花名册
{
ifstream ifile("student.dat");
/*显示表头*/
cout<<" 学生花名册"<<endl;
cout<<" =========="<<endl;
cout<<"┏━━━┳━━━━┳━━━┳━━━━━━━━━━┓"<<endl;
cout<<"┃ 学号 ┃ 姓名 ┃ 年龄 ┃ 地 址 ┃"<<endl;
/*显示记录*/
while(ifile.read((char*)per,sizeof(*per))) //循环到文件读完为止
{
cout<<"┣━━━╋━━━━╋━━━╋━━━━━━━━━━┫"<<endl;
per->output();
}
/*显示表尾*/
cout<<"┗━━━┻━━━━┻━━━┻━━━━━━━━━━┛"<<endl;
ifile.close();
}void modify(personnel *per,int st_id) //根据输入的学号,查找并修改学生记录
{
int k=0,flags=0; //k用于计找到信息时的记录位置,flags用于标示是否找到记录
fstream sfile("student.dat",ios::in|ios::out);
while(sfile.read((char*)per,sizeof(*per))) //循环到文件读完或break为止
{
k++;
if(per->getid()==st_id) //判断从文件中读取的记录的学号是否和输入的相同
{
flags=1;
cout<<endl;
cout<<"学号为"<<st_id<<"的学生的数据为:"<<endl;
per->output1();
cout<<"请重新输入该学生的信息:"<<endl<<endl;
per->input();
cout<<endl;
sfile.seekp((k-1)*sizeof(*per)+1,ios::beg); //k为当前显示记录的下一位置
sfile.write((char*)per,sizeof(*per));
break;
}
}
if(flags==0)cout<<"学号为"<<st_id<<"的学生不存在!"<<endl;
sfile.close();
}
void find(personnel *per,char name[8]) //根据输入的姓名,查找学生记录
{
int flags=0; //flags用于标示是否找到记录
ifstream ifile("student.dat");
while(ifile.read((char*)per,sizeof(*per))) //循环到文件读完或break为止
{
if(strcmp(per->getname(),name)==0) //判断从文件中读取的记录的姓名是否和输入的相同
{
flags=1;
cout<<endl;
cout<<"姓名为"<<name<<"的学生的数据为:"<<endl;
per->output1();
break;
}
}
if(flags==0)cout<<"姓名为"<<name<<"的学生不存在!"<<endl;
ifile.close();
}void student_1()
{
student_base *stu;
stu=new student_base;
char ch,name[8];
int flags=0;
int st_id;
while (flags==0) //每做完一项所选择的工作后,重复显示菜单,直到选择x为止
{
cout<<endl<<endl;
cout<<" 系学生档案管理"<<endl;
cout<<"=================="<<endl;
cout<<"a.输入学生档案信息"<<endl;
cout<<"b.修改学生档案信息"<<endl;
cout<<"c.查询学生档案信息"<<endl;
cout<<"d.显示学生花名册"<<endl;
cout<<"x.结束"<<endl<<endl;
cout<<"请输入选择(a,b,c,d,x):";
cin>>ch;
cout<<endl<<endl;
switch (ch)
{
case 'a':
InputStudent(stu);
break;
case 'b':
cout<<"请输入要修改的学生学号:";
cin>>st_id;
modify(stu,st_id);
break;
case 'c':
cout<<"请输入要查询的学生姓名:";
cin>>name;
find(stu,name);
break;
case 'd':
OutputStudent(stu);
break;
case 'x':
flags=1;
delete stu;
stu=NULL;
break;
default:
cout<<"选择错误,请重新选择!"<<endl;
}
}
}
void main()
{
student_1();
}
主要说明:学生档案管理
本程序采用面向对象技术结合,实现简单学生档案管理功能
(含学生基本信息管理、学生成绩管理、学生毕业管理)。
编制日期:2006年1月8日晚
编制人:陈
*****************************************************/
#include<iostream> //使用控制台流输入、输出
#include<fstream> //使用文件流输入、输出
#include<iomanip> //使用流格式控制输入、输出
#include<string> //使用串比较
using namespace std;
class personnel //人员类
{
protected:
int id;
char name[8];
int age;
char addr[20];
public:
virtual int getid()=0; //为判断从文件中找到的记录学号是否和输入的相等用
virtual char* getname()=0; //为判断从文件中找到的记录姓名是否和输入的相等用
virtual void input()=0;
virtual void output()=0;
virtual void output1()=0;
static int k;
personnel() //人员ID自动编号
{
id=k;
k++;
}
};
int personnel::k=1;
class course //课程类
{
int cid;
char cname[8];
public:
void input()
{
cout<<"输入课程编号:";
cin>>cid;
cout<<"输入课程名称:";
cin>>cname;
}
void output1()
{
cout<<"课程编号:"<<cid<<endl;
cout<<"课程名称:"<<cname<<endl;
}
};
class student:public personnel //学工处使用的学生基本档案
{
char specialty[10];
int grade;
public:
int getid() //为判断从文件中找到的记录学号是否和输入的相等用
{
return id;
}
char* getname() //为判断从文件中找到的记录姓名是否和输入的相等用
{
return name;
}
virtual void input()
{
cout<<"输入姓名(三个汉字以内):";
cin>>name;
cout<<"输入年龄:";
cin>>age;
cout<<"输入地址(9个汉字以内):";
cin>>addr;
cout<<"输入专业:";
cin>>specialty;
cout<<"输入年级:";
cin>>grade;
}
virtual void output() //显示花名册时用
{
cout<<"┃"<<setiosflags(ios::left)<<setw(6)<<id;
cout<<"┃"<<setiosflags(ios::left)<<setw(8)<<name;
cout<<"┃"<<setiosflags(ios::left)<<setw(6)<<age;
cout<<"┃"<<setiosflags(ios::left)<<setw(20)<<addr<<"┃"<<endl;
}
void output1() //显示简单的单个学生信息用
{
cout<<"学号:"<<id<<endl;
cout<<"姓名:"<<name<<endl;
cout<<"年龄:"<<age<<endl;
cout<<"地址:"<<addr<<endl;
cout<<"专业:"<<specialty<<endl;
cout<<"年级:"<<grade<<endl;
}
};
class student_base:public personnel //系使用的学生档案、含课程成绩
{
private:
course sc[10];
int result[10];
public:
int getid() //为判断从文件中找到的记录学号是否和输入的相等用
{
return id;
}
char* getname() //为判断从文件中找到的记录姓名是否和输入的相等用
{
return name;
}
virtual void input()
{
cout<<"输入姓名(三个汉字以内):";
cin>>name;
cout<<"输入年龄:";
cin>>age;
cout<<"输入地址(9个汉字以内):";
cin>>addr;
for (int i=0;i<10;i++)
{
sc[i].input();
cout<<"考试成绩:";
cin>>result[i];
}
}
virtual void output() //显示花名册时用
{
cout<<"┃"<<setiosflags(ios::left)<<setw(6)<<id;
cout<<"┃"<<setiosflags(ios::left)<<setw(8)<<name;
cout<<"┃"<<setiosflags(ios::left)<<setw(6)<<age;
cout<<"┃"<<setiosflags(ios::left)<<setw(20)<<addr<<"┃"<<endl;
}
void output1() //显示简单的单个学生信息用
{
cout<<"学号:"<<id<<endl;
cout<<"姓名:"<<name<<endl;
cout<<"年龄:"<<age<<endl;
cout<<"地址:"<<addr<<endl;
for (int i=0;i<10;i++)
{
sc[i].output1();
cout<<"考试成绩:"<<result[i]<<endl;
}
}
};
void InputStudent(personnel *per) //输入学生信息,并存入文件
{
ofstream ofile("student.dat",ios::app);
char ch; //用于接收控制是否继续的y/n
while(1==1) //死循环到break为止
{
cout<<"输入下一个学生信息?(y/n)";
cin>>ch;
if(ch=='n'||ch=='N') break;
per->input();
ofile.write((char*)per,sizeof(*per));
}
ofile.close();
}
void OutputStudent(personnel *per) //从文件读取学生信息,并显示花名册
{
ifstream ifile("student.dat");
/*显示表头*/
cout<<" 学生花名册"<<endl;
cout<<" =========="<<endl;
cout<<"┏━━━┳━━━━┳━━━┳━━━━━━━━━━┓"<<endl;
cout<<"┃ 学号 ┃ 姓名 ┃ 年龄 ┃ 地 址 ┃"<<endl;
/*显示记录*/
while(ifile.read((char*)per,sizeof(*per))) //循环到文件读完为止
{
cout<<"┣━━━╋━━━━╋━━━╋━━━━━━━━━━┫"<<endl;
per->output();
}
/*显示表尾*/
cout<<"┗━━━┻━━━━┻━━━┻━━━━━━━━━━┛"<<endl;
ifile.close();
}void modify(personnel *per,int st_id) //根据输入的学号,查找并修改学生记录
{
int k=0,flags=0; //k用于计找到信息时的记录位置,flags用于标示是否找到记录
fstream sfile("student.dat",ios::in|ios::out);
while(sfile.read((char*)per,sizeof(*per))) //循环到文件读完或break为止
{
k++;
if(per->getid()==st_id) //判断从文件中读取的记录的学号是否和输入的相同
{
flags=1;
cout<<endl;
cout<<"学号为"<<st_id<<"的学生的数据为:"<<endl;
per->output1();
cout<<"请重新输入该学生的信息:"<<endl<<endl;
per->input();
cout<<endl;
sfile.seekp((k-1)*sizeof(*per)+1,ios::beg); //k为当前显示记录的下一位置
sfile.write((char*)per,sizeof(*per));
break;
}
}
if(flags==0)cout<<"学号为"<<st_id<<"的学生不存在!"<<endl;
sfile.close();
}
void find(personnel *per,char name[8]) //根据输入的姓名,查找学生记录
{
int flags=0; //flags用于标示是否找到记录
ifstream ifile("student.dat");
while(ifile.read((char*)per,sizeof(*per))) //循环到文件读完或break为止
{
if(strcmp(per->getname(),name)==0) //判断从文件中读取的记录的姓名是否和输入的相同
{
flags=1;
cout<<endl;
cout<<"姓名为"<<name<<"的学生的数据为:"<<endl;
per->output1();
break;
}
}
if(flags==0)cout<<"姓名为"<<name<<"的学生不存在!"<<endl;
ifile.close();
}void student_1()
{
student_base *stu;
stu=new student_base;
char ch,name[8];
int flags=0;
int st_id;
while (flags==0) //每做完一项所选择的工作后,重复显示菜单,直到选择x为止
{
cout<<endl<<endl;
cout<<" 系学生档案管理"<<endl;
cout<<"=================="<<endl;
cout<<"a.输入学生档案信息"<<endl;
cout<<"b.修改学生档案信息"<<endl;
cout<<"c.查询学生档案信息"<<endl;
cout<<"d.显示学生花名册"<<endl;
cout<<"x.结束"<<endl<<endl;
cout<<"请输入选择(a,b,c,d,x):";
cin>>ch;
cout<<endl<<endl;
switch (ch)
{
case 'a':
InputStudent(stu);
break;
case 'b':
cout<<"请输入要修改的学生学号:";
cin>>st_id;
modify(stu,st_id);
break;
case 'c':
cout<<"请输入要查询的学生姓名:";
cin>>name;
find(stu,name);
break;
case 'd':
OutputStudent(stu);
break;
case 'x':
flags=1;
delete stu;
stu=NULL;
break;
default:
cout<<"选择错误,请重新选择!"<<endl;
}
}
}
void main()
{
student_1();
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询