yy多开器能开多少:C++课程设计--学生成绩管理系统,急!

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/30 15:37:42
学生成绩管理系统
** F1 --帮助 **
** F2 --输入数据并存入文件 **
** F3 --根据学号查询成绩 **
** F4 --根据姓名查询成绩 **
** F5 --输出文件内容 **
** F6 --统计及格和优秀人数 **
** ESC--退出系统 **
(2)功能
这个程序的主要功能是输入学生的学号、姓名对其进行存储,在存储后可以对学生的成绩按学号和姓名进行查寻。该系统具有存贮学生数据,按学号、姓名查询,列出学生成绩和统计功能。使用方法:系统输入数据后,将在当前目录中建立一个名为stu.dat文件,用于保存输入的数据。学号输入只能用数字输入,并且学号只能是10位。姓名输入符合中国人的姓名,只能用中文,且最长为5个汉字。

这个程序必须要体现oop,就象http://www.wendang.com/soft/10540.htm这个一样的,可我下不来。谁有能力的,或谁有那个文档的,给下啊,急!谢了啊!给五十,追加五十!!!!!!!!!就这两天!
算了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

1.主文件Source.cpp.内容如下:

#include <iostream.h>
#include <iomanip.h>
#include <string.h>
#include <fstream.h>
#include "Elective.h"

void login(); //登录函数
void main()
{
int choiceN;
SDatabase StuDB;
CDatabase CouDB;
EDatabase ElecDB;

login();
cout<<"\a ********************************************************"<<endl;
cout<<"*|*| 欢迎您使用成绩管理系统 |*|*"<<endl;
cout<<" ********************************************************\n"<<endl;
do{
cout << "请进入:\n\a1:学生资料管理 2:选修课程管理 3.成绩管理库 4.成绩管理 0:离开=>";
cin >> choiceN;
switch(choiceN)
{
case 1:
StuDB.studentdata();
break;
case 2:
CouDB.Coursedata();
break;
case 3:
ElecDB.Electivedata(StuDB,CouDB);
break;
case 4:
DoGrade(ElecDB);//调用求平均成绩,总成绩函数
break;
default:
break;
}
}while(choiceN!=0);
cout<<" **********************************************************"<<endl;
cout<<"*|*| 感谢使用成绩管理系统 |*|*"<<endl;
cout<<" **********************************************************\a"<<endl;
}
void login()
{
char psw[5];
do
{
cout<<" 请输入管理员密码:\a";
cin>>psw;
}while(strcmp(psw,"login"));
cout<<"\a";
}

2.学生类文件Student.h.内容如下:

#include <iostream.h>
#include <iomanip.h>
#include <string.h>
#include <fstream.h>

const int Maxr=100; //最多的学生
const int MaxC=6; //每位学生最多选修5门课程
class Student //学生类
{
int delflag; //删除标记,为0时未删除,为1时表示已删除。
int no; //学号
char name[10]; //学生姓名
int ElectiveC[MaxC]; //所选修课程
public:
Student() {
delflag=0;
for (int i=0;i<MaxC;i++)
ElectiveC[i]=0;
}
char *getname() { return name; } //获取姓名
int getno() { return no; } //获取学生编号
void setname(char na[]) //设置学生姓名
{
strcpy(name,na);
}
void addStudent(int n,char *na) //增加学生
{
no=n;
strcpy(name,na);
for (int i=0;i<MaxC;i++)
ElectiveC[i]=0;
}
int ADDElectiveC(int Cid) //选修操作
{
for (int i=0;i<MaxC;i++)
{
if (ElectiveC[i]==0)
{
ElectiveC[i]=Cid;
return 1;
}
}
if(i==MaxC) return 0;else return 1;
}
void disp() //输出学生信息
{
if(delflag!=1)
{
cout << setw(5) << no << setw(10) << name
<< " 选修课程:[";
for (int i=0;i<MaxC;i++)
if (ElectiveC[i]!=0)
cout << ElectiveC[i] << "|";
cout << "]" << endl;
}
}
void delCourse() //删除学生记录,delflag=1.
{
delflag=1;
}
};

class SDatabase //学生库类
{
int top; //学生记录指针
Student student[Maxr]; //学生记录
public:
SDatabase() //构造函数,将Student.txt读到read[]中
{
Student s;
top=-1;
fstream file("Student.txt",ios::in);
while (1)
{
file.read((char *)&s,sizeof(s));
if (!file) break;
top++;
student[top]=s;
}
file.close();
}
void clear() //删除所有学生信息
{
top=-1;
}
int addStudent(int n,char *na) //添加学生时先查找是否存在
{
Student *p=queryS(n);
if (p==NULL)
{
top++;
student[top].addStudent(n,na);
return 1;
}
cout<<"!***此学号已经存在***!"<<endl;
return 0;
}
Student *queryS(int studentid) //按学生号查找
{
for (int i=0;i<=top;i++)
if (student[i].getno()==studentid)
return &student[i];
return NULL;
}
void disp() //输出所有学生信息
{
cout << setw(5) <<"学号"<< setw(10) <<"姓名"
<< setw(10)<<"选修课程\n";
for (int i=0;i<=top;i++)
//if(student[i].name!="NULL")
student[i].disp();
}
void studentdata(); //学生库维护
void SDSave();
void SDRead();
~SDatabase() //析构函数,将read[]写入Student.txt文件中
{
fstream file("Student.txt",ios::out);
for (int i=0;i<=top;i++)
file.write((char *)&student[i],sizeof(student[i]));
file.close();
}
};
void SDatabase::studentdata()
{
int choice=1;
char sname[20];
int studentid;
Student *r;
while (choice!=0)
{
cout << "学生维护\a 1:新增 2:更改 3:删除 4:查找 5:显示 6:全删 0:退出 =>";
cin >> choice;
switch (choice)
{
case 1:
cout << " 输入学号:";
cin >> studentid;
cout << " 输入学生姓名:";
cin >> sname;
addStudent(studentid,sname);
break;
case 2:
cout << " 输入学号:";
cin >> studentid;
r=queryS(studentid);
if (r==NULL)
{
cout << " 该学生不存在" << endl;
break;
}
cout << " 输入新的姓名:";
cin >> sname;
r->setname(sname);
break;
case 3:
cout << " 输入学号:";
cin >> studentid;
r=queryS(studentid);
if (r==NULL)
{
cout << " 该学生不存在" << endl;
break;
}
r->delCourse();
break;
case 4:
cout << " 输入学生编号:";
cin >> studentid;
r=queryS(studentid);
if (r==NULL)
{
cout << " 该学生不存在" << endl;
break;
}
r->disp();
break;
case 5:
disp();
break;
case 6:
clear();
break;
}
}
}
void SDatabase::SDSave()//存储资料函数,将read[]写入Student.txt文件中
{
fstream file("Student.txt",ios::out);
for (int i=0;i<=top;i++)
file.write((char *)&student[i],sizeof(student[i]));
file.close();
}
void SDatabase::SDRead() //构造函数,将Student.txt读到read[]中
{
Student s;
top=-1;
fstream file("Student.txt",ios::in);
while (1)
{
file.read((char *)&s,sizeof(s));
if (!file) break;
top++;
student[top]=s;
}
file.close();
}

3.选修类文件Elective.h.内容如下:

#include <iostream.h>
#include <iomanip.h>
#include <string.h>
#include <fstream.h>
#include "Student.h"
#include "Course.h"

void DoGrade();
class Elective //________选修类
{
private:
int Snum; //学号
int Cnum; //课程号
float Grade; //成绩
public:
float getGrade(){return Grade;}
int getCno(){return Cnum;}
int getSno(){return Snum;}
Elective(){Grade=0;}
void SetElective(int Sn,int Cn,float g) //增加,修改成员函数
{
Snum=Sn;
Cnum=Cn;
Grade=g;
}
void delElctive()//如果全等于0则表示补删除。
{
Snum=0;
Cnum=0;
Grade=0;
}
void disp() //输出学生所选课程成绩
{
if(!(Snum==0&&Cnum==0&&Grade==0))
{
cout << setw(5) << Snum << setw(10) <<Cnum
<< setw(10)<<Grade;
cout <<endl;
}
}
};
/*++++++++++++++++++++++++++++++++++++++++++++++++++*/
class EDatabase //选修库类
{
int top; //选修类
Elective elective[100]; //链表结构选修库
public:
EDatabase() //构造函数,将Elective.txt读到read[]中
{
Elective s;
top=-1;
fstream file("Elective.txt",ios::in);
while (1)
{
file.read((char *)&s,sizeof(s));
if (!file) break;
top++;
elective[top]=s;
}
file.close();
}
void clear() //删除所有课程信息
{
top=-1;
}
int addElective(int n,int m,float g) //添加学生选修课程成绩时先查找是否存在
{
Elective *p=queryE(n,m);
if (p==NULL)
{
top++;
elective[top].SetElective(n,m,g);
return 1;
}
cout<<"!***此记录已经存在***!"<<endl;
return 0;
}
Elective *queryE(int Sid,int Cid) //按课程号查找
{
for (int i=0;i<=top;i++)
if((elective[i].getCno()==Cid)&&(elective[i].getSno()==Sid))
{
return &elective[i];}
return NULL;
}
float SqueryGrade(int sid) //按学号计算总成绩
{
float SumS=0;
for (int i=0;i<=top;i++)
if(elective[i].getSno()==sid)
SumS+=elective[i].getGrade();
return SumS;
}
float SAqueryGrade(int sid) //按学号计算平均成绩
{
float SumS=0;
int K=0;
for (int i=0;i<=top;i++)
if(elective[i].getSno()==sid)
{ SumS+=elective[i].getGrade();K+=1;}
return SumS/K;
}
float CqueryGrade(int cid) //按课程号计算总成绩
{
float SumS=0;
for (int i=0;i<=top;i++)
if(elective[i].getCno()==cid)
SumS=SumS+elective[i].getGrade();
return SumS;
}
float CAqueryGrade(int sid) //按课程号计算平均成绩
{
float SumS=0;
int K=0;
for (int i=0;i<=top;i++)
if(elective[i].getCno()==sid)
{ SumS+=elective[i].getGrade();K+=1;}
return SumS/K;
}
void disp() //输出所有学生信息
{
cout << setw(5) <<"学号"<< setw(10) <<"课程号"
<< setw(10)<<"成绩\n";
for (int i=0;i<=top;i++)
elective[i].disp();
}
void Electivedata(SDatabase SS,CDatabase CC); //学生成绩库维护
~EDatabase() //析构函数,将read[]写入Student.txt文件中
{
fstream file("Elective.txt",ios::out);
for (int i=0;i<=top;i++)
file.write((char *)&elective[i],sizeof(elective[i]));
file.close();
}
};

void EDatabase::Electivedata(SDatabase SS,CDatabase CC) //学生成绩库维护
{
int choice=1;
int courseid;
int studentid;
float fgrade;
Elective *r;
while (choice!=0)
{
cout << "\a成绩库维护 1:新增 2:更改 3:删除 4:查找 5:显示 0:退出 =>";
cin >> choice;
switch (choice)
{
case 1:
Student *pS;//在新增学生对象中加入选修课程
Course *pC;//在新增课程对象中加入选修课程的学生
int RC,RS;
cout << "\a 输入学号:";
cin >> studentid;
pS=SS.queryS(studentid);
cout << "\a 输入课程号:";
cin >> courseid;
pC=CC.queryC(courseid);
cout << "\a 输入成绩:";
cin >> fgrade;
RC=pS->ADDElectiveC(courseid);
pS->disp();
//SS.SDSave();
//SS.SDRead();
RS=pC->ADDElectiveS(studentid);
//CC.CDSave();
pC->disp();
r=queryE(studentid,courseid);
if(RC&&RS)
{if(queryE(studentid,courseid)!=NULL)
{cout<<"\a记录已经存在,若要修改请重新操作。\n";
break;}
addElective(studentid,courseid,fgrade);
}
else
cout<<"\a输入的课程号或学号的选修项已经超出最低限度。/n";
break;
case 2:
cout << "\a 输入学号:";
cin >> studentid;
cout << "\a 输入课程号:";
cin >> courseid;
r=queryE(studentid,courseid);
if (r==NULL)
{
cout << "\a 该学生成绩不存在" << endl;
break;
}
cout << "\a 输入新的成绩:";
cin >> fgrade;
r->SetElective(studentid,courseid,fgrade);
break;
case 3:
cout << "\a 输入学号:";
cin >> studentid;
cout << "\a 输入课程号:";
cin >> courseid;
r=queryE(studentid,courseid);
if (r==NULL)
{
cout << "\a 该记录不存在" << endl;
break;
}
r->delElctive();
break;
case 4:
cout << "\a 输入学生编号:";
cin >> studentid;
r=queryE(studentid,courseid);
if (r==NULL)
{
cout << "\a 该学生不存在" << endl;
break;
}
r->disp();
break;
case 5:
disp();
break;
default:
break;
}
}
}
void DoGrade(EDatabase EDB) //成绩处理。
{
int chN,sn;
do{
cout <<" 成绩统计\n \a 1:求学生总成绩\n 2:求学生平均成绩\n 3.求课程总成绩\n 4.求课程平均成绩\n 0:离开\n请选择操作=>";
cin >> chN;
switch(chN)
{
case 1:
cout<<"\a请输入学号:";
cin>>sn;
cout<<sn<<"\a号学生的总成绩为:"<<EDB.SqueryGrade(sn)<<endl;
break;
case 2:
cout<<"\a请输入学号:";
cin>>sn;
cout<<sn<<"\a号学生的平均成绩为:"<<EDB.SAqueryGrade(sn)<<endl;
break;
case 3:
cout<<"\a请输入课程号:";
cin>>sn;
cout<<sn<<"\a号课程的总成绩为:"<<EDB.CqueryGrade(sn)<<endl;
break;
case 4:
cout<<"\a请输入课程号:";
cin>>sn;
cout<<sn<<"\a号课程的平均成绩为:"<<EDB.CAqueryGrade(sn)<<endl;
break;
default:
break;
}
}while(chN!=0);
}

4.成绩类文件Course.h.内容如下:

#include <iostream.h>
#include <iomanip.h>
#include <string.h>
#include <fstream.h>

const int MaxCN=10; //最多的课程
const int MaxS=30; //每门课程最多被30位学生选修
class Course //课程类
{
int delflag; //删除标记,为0时未删除,为1时表示已删除。
int Cno; //课程号
char Cname[10]; //课程名
int SC[MaxS]; //所选修该课程的学生
public:
Course() {delflag=0;}
char *getCname() { return Cname; } //获取姓名
int getCno() { return Cno; } //获取学生编号
void setCname(char na[]) //设置学生姓名
{
strcpy(Cname,na);
}
void addCourse(int n,char *na) //增加学生
{
Cno=n;
strcpy(Cname,na);
for (int i=0;i<MaxS;i++)
SC[i]=0;
}
int ADDElectiveS(int studentid) //选修操作
{
for (int i=0;i<MaxS;i++)
{
if (SC[i]==0)
{
SC[i]=studentid;
return 1;
}
}
if(i==MaxC) return 0;else return 1;
}
void disp() //输出学生信息
{
if(delflag!=1)
{
cout << setw(5) << Cno << setw(10) << Cname
<< " 选修课程的学生:[";
for (int i=0;i<MaxS;i++)
if (SC[i]!=0)
cout << SC[i] << "|";
cout << "]" << endl;
}
}
void delCourse() //删除学生记录,delflag=1.
{
delflag=1;
}
};

class CDatabase //课程库类
{
int top; //课程记录指针
Course course[MaxCN]; //课程记录
public:
CDatabase() //构造函数,将Course.txt读到read[]中
{
Course s;
top=-1;
fstream file("Course.txt",ios::in);
while (1)
{
file.read((char *)&s,sizeof(s));
if (!file) break;
top++;
course[top]=s;
}
file.close();
}
void clear() //删除所有课程信息
{
top=-1;
}
int addCourse(int n,char *na) //添加课程时先查找是否存在
{
Course *p=queryC(n);
if (p==NULL)
{
top++;
course[top].addCourse(n,na);
return 1;
}
cout<<"!***此课程号已经存在***!"<<endl;
return 0;
}
Course *queryC(int Courseid) //按课程号查找
{
for (int i=0;i<=top;i++)
if (course[i].getCno()==Courseid)
return &course[i];
return NULL;
}
void disp() //输出所有课程信息
{
cout << setw(5) <<"课程号"<< setw(10) <<"课程名"
<< setw(10)<<"学生学号\n";
for (int i=0;i<=top;i++)
//if(student[i].name!="NULL")
course[i].disp();
}
void Coursedata(); //课程库维护
void CDSave();
~CDatabase() //析构函数,将read[]写入Course.txt文件中
{
fstream file("Course.txt",ios::out);
for (int i=0;i<=top;i++)
file.write((char *)&course[i],sizeof(course[i]));
file.close();
}
};
void CDatabase::Coursedata()
{
int choice=1;
char Cname[20];
int courseid;
Course *r;
while (choice!=0)
{
cout << "课程管理\a 1:新增 2:更改 3:删除 4:查找 5:显示 6:全删 0:退出 =>";
cin >> choice;
switch (choice)
{
case 1:
cout << " 输入课程号:";
cin >> courseid;
cout << " 输入课程名:";
cin >> Cname;
addCourse(courseid,Cname);
break;
case 2:
cout << " 输入课程号:";
cin >> courseid;
r=queryC(courseid);
if (r==NULL)
{
cout << " 该课程不存在" << endl;
break;
}
cout << " 输入新的课程名:";
cin >> Cname;
r->setCname(Cname);
break;
case 3:
cout << " 输入课程号:";
cin >> courseid;
r=queryC(courseid);
if (r==NULL)
{
cout << " 该课程不存在" << endl;
break;
}
r->delCourse();
break;
case 4:
cout << " 输入课程号:";
cin >> courseid;
r=queryC(courseid);
if (r==NULL)
{
cout << " 该课程不存在" << endl;
break;
}
r->disp();
break;
case 5:
disp();
break;
case 6:
clear();
break;
}
}
}
void CDatabase::CDSave()//存储资料函数,将read[]写入Course.txt文件中
{
fstream file("Course.txt",ios::out);
for (int i=0;i<=top;i++)
file.write((char *)&course[i],sizeof(course[i]));
file.close();
}