今天刚刚把这个程序做了出来 由于没有编译器 所以发上来 各位看一看
原题的程序很弱 如果一个学生同时学两门课程的话 就没有办法了 所以我把程序稍微改动了一下 增加了一些东西 支持多学生同时学多课程的类程序
不过里面还有些问题 我还没有搞清楚 我不明白学分是搞什么的? 既然每个学生的课程都有相应的成绩 那为什么还要用学分呢 所以在程序里 涉及到学分的 我都没有做 而且题里要求做的成员函数里也没有用到学分 我想应该对程序影响不大吧
课程类里的条件“课程有学分数”,“课程可以得到学分数,课程可以设置学分数”这里都涉及到学分 程序里都没有用到 所以我没有做 至于“课程可以设置学分数”我理解为给定成绩 这个我在课程类里写出了相应的成员函数 就是void Lession::sendscore(float x,Student& s)
对于学生类的一个条件“可以得到学生所学课程的平均成绩”,我理解为比如一个学生同时学数学和英语 那么学生所学课程的平均成绩就是数学成绩和英语成绩相加再做除法 以求出平均成绩 因为每个课程只有一个成绩 应该涉及不到一个课程里面的平均成绩吧 那样的话 岂不是成了[成绩除以一]了 对应的成员函数是 float Student::lessionAverage()
程序如下:
class Lession; //先声明课程类 在学生类里要用到 课程类的名字
class Student
{
int num; //学生实际学的门数 初始化为0
char name[20]; //学生的名字
Lession *head[5]; //这里的作用是为了在学生同时学很多课程的时候方便查找成绩用到的
//由于每个学生最多只能学5门课 所以定义了5个课程类的指针 以指向
//该生所学的课程类对象 在这里我原来是用动态链表来实现的 不过实
//现起来很不方便 而且要定义析构函数和拷贝构造函数 所以我就用了
//指针数组来完成操作了
public:
//构造函数 初始化所学课程门数 学生名字 和课程指针数组
Student(char *s="no name")
{
num=0;
givename(s);
for(int i=0;i<5;i++)head[i]=NULL;
}
//给定学生的名字
void givename(char *s)
{
cout<<"学生的名字是:"<<s<<endl;
strcpy(name,s);
name[sizeof(name)-1]='\0';
}
//得到学生的名字
char *showname(){ return name; }
//这个友元函数的作用是输出学生的成绩
friend float findscore(Student& t,Lession& s);
//得到指定课程的学生成绩,用到了上面的友元函数
float putscore(Lession& s){ return findscore(*this,s); }
//得到该生所有课程的平均成绩
float lessionAverage()
{
float n=0;
for(int i=0;i<num;i++)
{
int k=head[i]->numOfstudents; //用到了课程类指针 k的值为该课程的学生数
for(int j=0;j<k;j++)
if(!strcmp(name,head[i]->namelist[j]))break; //在学生名单中查找该生的位置
n+=head[i]->scoreOfstudents[j]; //算出各科成绩之和
}
return n/(float)num; //最终算出平均成绩
}
//给学生增加一门课(同时在该课程中增加一个学生)
void addlession(Lession& s) //参数s可以给学生增加不同的课程
{
int i,j;
for(i=0;i<s.numOfstudents;i++) //在该课程中查找学生名单
if(!strcmp(name,s.namelist[j]))break;
if(i==s.numOfstudents) //如果该生没学过此课程
{
if(num<5) //如果该生没学满5门课
{
if(s.numOfstudents<30) //如果该课程的学员未达到规定的30人
{
head[num++]=&s; //将此课程对象地址赋予head 方便以后查找
j=s.numOfstudents++;
strcpy(s.namelist[j],name); //将该生的名字写入课程学生名单
s.namelist[j][sizeof(name)-1]='\0';
s.scoreOfstudents[j]=0; //该生所学课程成绩初始化为0
}
else cout<<"该课程人数已满,请选择学习其他课程"<<endl;
}
else cout<<"该生已学五门课程,不能再学其他课程"<<endl;
}
else return;
}
}
//课程类定义
class Lession
{
int numOfstudents; //实际学生数
char namelist[30][20]; //实际学生名单
float scoreOfstudents[30]; //每个学生的成绩
int count; //虽然没用上 但还是定义了 学分数
public:
Lession(){ numOfstudents=0; } //构造函数 初始化实际学生数
//这个友元函数的作用是输出学生的成绩
friend float findscore(Student& t,Lession& s);
//由于学生类中增加一门课程的操作使用了课程类中的私有成员 所以定义成友元
friend void Student::addlession(Lession& s);
//给指定学生s 设置成绩x
void sendscore(float x,Student& s)
{
int i;
for(i=0;i<numOfstudents;i++)
if(!strcmp(namelist[i],s.name))break; //查找学生名单
if(i==numOfstudents)
cout<<"该生没有学习该课程,无法给定成绩"<<endl;
else scoreOfstudents[i]=x;
}
//课程得到班平均成绩
float average()
{
float n=0;
for(int i=0;i<numOfstudents;i++)
n+=scoreOfstudents[i];
return n/(float)numOfstudents;
}
//得到某个学生成绩
float putscore(Student& t){ return findscore(t,*this); }
}
//完成读取成绩实际操作的函数 在课程类和学生类中被声明为友元
float findscore(Student& t,Lession& s)
{
int i;
for(i=0;i<s.numOfstudents;i++)
if(!strcmp(t.name,s.namelist[i]))break;
if(i==s.numOfstudents)cout<<"该生没有学习该课程,无法取得成绩!"<<endl;
else return s.scoreOfstudents[i];
}
原题中还有一部分 上次我没有打出来 剩余的部分是:
现有数学课,张三学数学,成绩为3.1分,李四学数学,成绩为4.5分。求其平均成绩,求张三的数学成绩。
现有物理课,学时数为4,张三学物理,成绩为4分。求张三所学课程的平均成绩。
所做主程序如下:
//第一题
void main()
{
Student person("Zhang3"); //有一学生张三
Student other("Li4"); //有一学生李四
Lession math; //现有数学课
person.addlession(math); //张三学数学
other.addlession(math); //李四学数学
math.sendscore(3.1,person); //张三成绩3.1分
math.sendscore(4.5,other); //李四成绩4.5分
cout<<"数学班的平均成绩是:"
<<math.average()<<endl //班平均成绩
<<"张三的数学成绩是:"
<<person.putscore(math) //张三的数学成绩
<<endl;
}
//第二题
void main()
{
Lession wuli; //本人英语不好 物理只好用拼音代替了
Student person("Zhang3"); //有一学生张三
person.addlession(wuli); //张三学物理
wuli.sendscore(4,person); //成绩为4分
cout<<"张三所学课程的平均成绩是:"
<<person.lessionAverage() //张三所学课程的平均成绩
<<endl;
}
可以将上面两个主函数 混在一起 成为一个完整的程序
不知道 以上的程序算不算完整